{
  "slug": "sports-team",
  "postSlug": "sports-team-photo-sharing",
  "title": "How to Share Sports Team and Tournament Photos With Parents",
  "postFile": "apps/web/src/lib/blog/content-sports-team.tsx",
  "postRev": "origin/main",
  "question": "How do I share sports team and tournament photos with parents?",
  "method": "primary-docs",
  "checkedAt": "2026-10-26",
  "what_was_checked": "For each of the seven routes a team can use, three questions: what a parent needs in order to open the photos, the largest single file the route accepts, and whether the route keeps the original file. Every published value is one sentence from the service's own help or developer page, read on 2026-10-26, or, for Viallo, a line in its source at origin/main. A cell the pages read do not answer is recorded as not stated, and a page that refused the fetch is recorded as not checked, never filled from memory.",
  "network": "This Mac exits in Germany. Pages were requested with an explicit en locale where the vendor supports one (support.google.com?hl=en, developers.facebook.com?locale=en_US, mbasic.facebook.com?locale=en_US); the Facebook Help Centre article answers in German without it and in English with it. No price appears in this dataset, so no currency or VAT question arises.",
  "tools": [
    {
      "name": "curl",
      "version": "8.7.1 (x86_64-apple-darwin26.0) libcurl/8.7.1"
    },
    {
      "name": "python3",
      "version": "3.9.6"
    },
    {
      "name": "git",
      "version": "2.54.0 (Apple Git-157)"
    },
    {
      "name": "pdftotext",
      "version": "26.03.0"
    }
  ],
  "inputs": [
    {
      "id": "facebook-group-privacy",
      "url": "https://mbasic.facebook.com/help/220336891328465?locale=en_US",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Meta Help Centre, differences between public and private groups. Answers 400 to a full Chrome user agent and 200 to a bare Mozilla/5.0, recorded per entry."
    },
    {
      "id": "facebook-graph-photo",
      "url": "https://developers.facebook.com/docs/graph-api/reference/page/photos/?locale=en_US",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Meta Graph API reference, Page photos: file ceiling and what publishing does to the file."
    },
    {
      "id": "gmail-attachments",
      "url": "https://support.google.com/mail/answer/6584?hl=en",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Google Gmail Help, send attachments with a message."
    },
    {
      "id": "google-photos-share",
      "url": "https://support.google.com/photos/answer/6280921?hl=en",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Google Photos Help, share or unshare an album, including the Collaborate setting."
    },
    {
      "id": "google-photos-backup-size",
      "url": "https://support.google.com/photos/answer/6193313?hl=en",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Google Photos Help, back up photos and videos: size a photo can be."
    },
    {
      "id": "google-photos-backup-quality",
      "url": "https://support.google.com/photos/answer/6220791?hl=en",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "Google Photos Help, backup quality: Original quality and Storage saver."
    },
    {
      "id": "whatsapp-help",
      "url": "https://faq.whatsapp.com/5913398998672934",
      "fetched": "2026-10-26",
      "http_status": 400,
      "note": "WhatsApp Help Center, refused every request: 400 to a browser user agent and to a bare one. faq.whatsapp.com renders client-side, its sitemap redirects to /error, and blog.whatsapp.com answers 200 with the page shell only and no article text. Nothing on the page was filled from memory."
    },
    {
      "id": "teamsnap-media",
      "url": "https://helpme.teamsnap.com/article/234-manage-photos-files-and-videos",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "TeamSnap Playbook, manage photos, files and videos in the Media tab."
    },
    {
      "id": "teamsnap-login",
      "url": "https://helpme.teamsnap.com/article/1507-troubleshooting-parent-or-player-login-access",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "TeamSnap Playbook, troubleshooting parent or player login access."
    },
    {
      "id": "sportsengine-gallery",
      "url": "https://intercom.help/SportsEngine/en/articles/6323220-how-to-add-a-photo-gallery-page-element",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "SportsEngine HQ, add a photo gallery page element: upload ceiling."
    },
    {
      "id": "sportsengine-collector",
      "url": "https://intercom.help/SportsEngine/en/articles/6341914-what-is-a-photo-collector-page",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "SportsEngine HQ, photo collector page. Read for viewer access; the page says only that the collector's privacy can be Public or Private, which does not answer what a parent needs."
    },
    {
      "id": "ecfr-part-312-current",
      "url": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-C/part-312",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "eCFR, 16 CFR Part 312 as the reader opens it. The post links this page; the version-pinned API URL below carries the same text and is the one the amendment date is quoted from."
    },
    {
      "id": "ecfr-part-312",
      "url": "https://www.ecfr.gov/api/versioner/v1/full/2026-01-01/title-16.xml?part=312",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "eCFR, 16 CFR Part 312 as in force on 2026-01-01, the definitions and the source line carrying the 2025 amendment. The endpoint refuses any request without Accept-Encoding compression."
    },
    {
      "id": "pecsa-photo-policy",
      "url": "https://cdn1.sportngin.com/attachments/document/a7db-3427035/250703_Photo_Policy_APPROVED.pdf",
      "fetched": "2026-10-26",
      "http_status": 200,
      "note": "PECSA Photo and Video Policy, board-approved 3 July 2025, 4 pages. A PDF: check.py converts it with pdftotext before searching."
    },
    {
      "id": "viallo-source",
      "url": "git:origin/main",
      "fetched": "2026-10-26",
      "http_status": null,
      "note": "Viallo's own source at origin/main, read with git show: the multipart limit, the public share controller, the profile-link album resolver, the share id generator, the share page metadata and the HEIC conversion."
    }
  ],
  "results": [
    {
      "option": "Facebook group",
      "property": "what_a_parent_needs_to_view",
      "value": "A Facebook account. Only current members can see what is shared in a private group.",
      "quote": "Only current members can see what's shared in the group and who the members are.",
      "url": "https://mbasic.facebook.com/help/220336891328465?locale=en_US",
      "ua": "Mozilla/5.0"
    },
    {
      "option": "Facebook group",
      "property": "largest_single_file",
      "value": "10 MB, the limit Meta gives for a photo published to a Page through its Graph API. It publishes no figure for a photo posted into a group.",
      "quote": "Files can not exceed 10MB.",
      "url": "https://developers.facebook.com/docs/graph-api/reference/page/photos/?locale=en_US",
      "ua": "Mozilla/5.0",
      "scope": "Documented for a Page photo through the Graph API; Meta publishes no group equivalent."
    },
    {
      "option": "Facebook group",
      "property": "keeps_the_original",
      "value": "No. Meta strips location metadata and resizes the image when it publishes it.",
      "quote": "Facebook strips all location metadata before publishing and resizes images to different dimensions to best support rendering in multiple sizes.",
      "url": "https://developers.facebook.com/docs/graph-api/reference/page/photos/?locale=en_US",
      "ua": "Mozilla/5.0",
      "scope": "Again the Graph API Page photo route. The post's earlier word 'compresses' is Meta's 'resizes'."
    },
    {
      "option": "Email (Gmail attachment)",
      "property": "what_a_parent_needs_to_view",
      "value": "An email address. Anything over the limit arrives as a Google Drive link instead of an attachment.",
      "quote": "Gmail automatically removes the attachment and adds it as a Google Drive link in the email.",
      "url": "https://support.google.com/mail/answer/6584?hl=en"
    },
    {
      "option": "Email (Gmail attachment)",
      "property": "largest_single_file",
      "value": "25 MB for a personal Gmail account; a Workspace administrator sets it for work and school accounts.",
      "quote": "For personal Gmail accounts, the limit is 25 MB.",
      "url": "https://support.google.com/mail/answer/6584?hl=en"
    },
    {
      "option": "Email (Gmail attachment)",
      "property": "keeps_the_original",
      "status": "not-checked",
      "reason": "The Gmail article covers the ceiling and the Drive fallback only; it says nothing about what happens to the bytes.",
      "value": "Not stated on the pages read."
    },
    {
      "option": "Google Photos shared album",
      "property": "what_a_parent_needs_to_view",
      "status": "not-checked",
      "reason": "No Google page read today says whether a signed-out viewer can open a link-shared album. The Collaborate sentence is about adding photos, not viewing, and is recorded as statement S4.",
      "value": "Not stated on the pages read."
    },
    {
      "option": "Google Photos shared album",
      "property": "largest_single_file",
      "value": "200 MB or 200 MP per photo.",
      "quote": "Photos up to 200 MB or 200 MP.",
      "url": "https://support.google.com/photos/answer/6193313?hl=en",
      "scope": "The ceiling for what Google Photos backs up; the same page gives 10 GB for a video."
    },
    {
      "option": "Google Photos shared album",
      "property": "keeps_the_original",
      "value": "Yes under Original quality. Storage saver compresses photos and resizes anything over 16 MP to 16 MP.",
      "quote": "Photos and videos are stored in the same resolution that you took them with no change to their quality.",
      "url": "https://support.google.com/photos/answer/6220791?hl=en",
      "scope": "This is the account's backup setting, not the album's setting; the Storage saver sentence on the same page is statement S5."
    },
    {
      "option": "WhatsApp group",
      "property": "what_a_parent_needs_to_view",
      "status": "not-checked",
      "reason": "The WhatsApp Help Center refused every fetch (HTTP 400, client-rendered shell, sitemap to /error). Recorded rather than filled from memory.",
      "value": "Not checked. The help centre serves no article text to a fetch."
    },
    {
      "option": "WhatsApp group",
      "property": "largest_single_file",
      "status": "not-checked",
      "reason": "Same refusal. No WhatsApp page was readable today, so no ceiling is recorded.",
      "value": "Not checked."
    },
    {
      "option": "WhatsApp group",
      "property": "keeps_the_original",
      "status": "not-checked",
      "reason": "Same refusal. The post says nothing about what WhatsApp does to a photo's size or quality.",
      "value": "Not checked."
    },
    {
      "option": "Viallo link album",
      "property": "what_a_parent_needs_to_view",
      "value": "The link alone. The share route has no login.",
      "source": "git",
      "path": "apps/api/src/sharing/sharing.controller.ts",
      "quote": "@ApiOperation({ summary: 'Access shared album by link (public)' })"
    },
    {
      "option": "Viallo link album",
      "property": "largest_single_file",
      "value": "500 MB per uploaded file.",
      "source": "git",
      "path": "apps/api/src/main.ts",
      "quote": "fileSize: 500 * 1024 * 1024,"
    },
    {
      "option": "Viallo link album",
      "property": "keeps_the_original",
      "value": "Yes for JPEG and PNG. HEIC and HEIF are converted to JPEG and the original is cleaned up.",
      "source": "git",
      "path": "apps/api/src/uploads/uploads.service.ts",
      "quote": "const finalStorageKey = storageKey.replace(/\\.heic$/i, '.jpg').replace(/\\.heif$/i, '.jpg');",
      "scope": "Only the heic and heif extensions are rewritten, so a JPEG or PNG keeps its storage key. The superseded original goes to the storage-cleanup queue through originalKeyToCleanup in apps/api/src/queues/processors/image-processing.processor.ts."
    },
    {
      "option": "TeamSnap",
      "property": "what_a_parent_needs_to_view",
      "value": "A TeamSnap login from an email that accepted an invitation to a profile on the team.",
      "quote": "Users can only view a team if they are logging in with an email address that has accepted an invitation to a profile that is assigned to that team.",
      "url": "https://helpme.teamsnap.com/article/1507-troubleshooting-parent-or-player-login-access"
    },
    {
      "option": "TeamSnap",
      "property": "largest_single_file",
      "value": "No byte ceiling published. It recommends images with no side longer than 1024 px.",
      "quote": "Recommended size 768x1024px (i.e. image width and length should not exceed 1024 pixels)",
      "url": "https://helpme.teamsnap.com/article/234-manage-photos-files-and-videos",
      "scope": "A recommendation in pixels, not a stated cap on bytes. The same article says the Media tab's storage space depends on the team's plan."
    },
    {
      "option": "TeamSnap",
      "property": "keeps_the_original",
      "status": "not-checked",
      "reason": "The 1024 px recommendation implies downscaling on the way in, but no sentence on the article says what TeamSnap stores or serves.",
      "value": "Not stated on the pages read."
    },
    {
      "option": "SportsEngine",
      "property": "what_a_parent_needs_to_view",
      "status": "not-checked",
      "reason": "The SportsEngine articles read cover editor permissions and page elements; neither says what a parent needs in order to open a team gallery.",
      "value": "Not stated on the pages read."
    },
    {
      "option": "SportsEngine",
      "property": "largest_single_file",
      "value": "Under 4 MB.",
      "quote": "NOTE: Uploads must be less than 4MB in size.",
      "url": "https://intercom.help/SportsEngine/en/articles/6323220-how-to-add-a-photo-gallery-page-element",
      "scope": "Stated for an upload into a Photo Gallery page element on a SportsEngine site, not for a mobile app."
    },
    {
      "option": "SportsEngine",
      "property": "keeps_the_original",
      "status": "not-checked",
      "reason": "The article gives the upload ceiling and the colour space, and nothing about what is stored or served afterwards.",
      "value": "Not stated on the pages read."
    }
  ],
  "statements": [
    {
      "id": "S1",
      "statement": "Meta resizes a published photo and strips its location metadata",
      "verdict": "supported",
      "quote": "Facebook strips all location metadata before publishing and resizes images to different dimensions to best support rendering in multiple sizes.",
      "url": "https://developers.facebook.com/docs/graph-api/reference/page/photos/?locale=en_US",
      "ua": "Mozilla/5.0"
    },
    {
      "id": "S2",
      "statement": "A club policy approved on 3 July 2025 forbids posting teammates' photos to social media or to a group chat with non-teammates without the player's parent or guardian consenting",
      "verdict": "supported",
      "quote": "No Public Sharing Without Consent: Photos or videos of teammates must not be posted on social media or shared in public forums (including group chats that include non-teammates) unless consent has been given by that player's parent or guardian",
      "url": "https://cdn1.sportngin.com/attachments/document/a7db-3427035/250703_Photo_Policy_APPROVED.pdf",
      "note": "PECSA Photo and Video Policy, board-approved 3 July 2025. A PDF; check.py converts it with pdftotext before searching. The page's date line reads 'Approved 03 July, 2025'."
    },
    {
      "id": "S3",
      "statement": "Google documents the Collaborate setting as open to anyone holding the album link",
      "verdict": "supported",
      "quote": "If \"Collaborate\" is turned on, anyone who has the link to your shared album can add photos.",
      "url": "https://support.google.com/photos/answer/6280921?hl=en"
    },
    {
      "id": "S4",
      "statement": "Google Photos Storage saver compresses photos and resizes anything over 16 MP to 16 MP",
      "verdict": "supported",
      "quote": "Photos are compressed to save space. If a photo is larger than 16 MP, it'll be resized to 16 MP.",
      "url": "https://support.google.com/photos/answer/6220791?hl=en"
    },
    {
      "id": "S5",
      "statement": "COPPA's rule defines a child as an individual under 13",
      "verdict": "supported",
      "quote": "Child means an individual under the age of 13.",
      "url": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-C/part-312"
    },
    {
      "id": "S6",
      "statement": "The rule already counts a photograph or video containing a child's image or voice as personal information",
      "verdict": "supported",
      "quote": "A photograph, video, or audio file where such file contains a child's image or voice",
      "url": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-C/part-312"
    },
    {
      "id": "S7",
      "statement": "The text as amended on 22 April 2025 also lists a biometric identifier such as a facial template as personal information",
      "verdict": "supported",
      "quote": "A biometric identifier that can be used for the automated or semi-automated recognition of an individual, such as fingerprints",
      "url": "https://www.ecfr.gov/current/title-16/chapter-I/subchapter-C/part-312"
    },
    {
      "id": "S8",
      "statement": "The amendment that added it was published on 22 April 2025",
      "verdict": "supported",
      "quote": "78 FR 4008, Jan. 17, 2013, as amended at 90 FR 16977, Apr. 22, 2025",
      "url": "https://www.ecfr.gov/api/versioner/v1/full/2026-01-01/title-16.xml?part=312",
      "note": "The eCFR source line. The Federal Register API returns publication_date 2025-04-22 for document 2025-05904; that was read today as a cross-check and is not a separate machine-checked quote."
    }
  ],
  "product": [
    {
      "id": "P1",
      "claim": "Every Viallo share link uses a long, unguessable address",
      "path": "apps/api/src/sharing/sharing.service.ts",
      "quote": "shareId: randomBytes(16).toString('hex'),"
    },
    {
      "id": "P2",
      "claim": "A Viallo share link does not turn up in search engines",
      "path": "apps/web/src/app/(public)/share/[shareId]/page.tsx",
      "quote": "robots: { index: false, follow: false },"
    },
    {
      "id": "P3",
      "claim": "A link can be revoked from its menu under Links to this album",
      "path": "packages/i18n/src/messages/en.json",
      "quote": "\"revoke\": \"Revoke\","
    },
    {
      "id": "P4",
      "claim": "A profile link with no album list shows every album the owner has, including one created later",
      "path": "apps/api/src/sharing/profile-link-albums.ts",
      "quote": "if (!albumIds) return ownerAlbums;"
    }
  ],
  "notes": [
    "Five of the seven routes publish a ceiling for a single file: Facebook 10 MB (Page photos), Gmail 25 MB, Google Photos 200 MB, SportsEngine under 4 MB and Viallo 500 MB. 500 divided by 4 is 125, which is the spread the post states.",
    "Only Viallo's share route is recorded as needing nothing from a viewer. Facebook and TeamSnap document the opposite; Google Photos, Gmail and SportsEngine leave the question open on the pages read; WhatsApp could not be read at all.",
    "WhatsApp is the one option with no readable source today: every cell stays not-checked and the post makes no claim about its quality or size.",
    "Facebook's ceiling and resize behaviour come from Meta's Graph API photo specification for Page uploads. Meta publishes no group equivalent, and the table says so rather than implying it measured group posts.",
    "The four cells marked not stated or not checked are printed as such in the post's table; nothing was inferred to fill them.",
    "The PECSA policy is one club's published rule, cited as an example of a club writing the rule down, not as evidence of how many clubs do."
  ]
}
