Skip to content
andrew.dunn.dev

bairn

Source Site Releases

bairn copies a child’s photos and videos out of a Famly nursery feed into date-named folders on the household’s own disk. Each photo carries its context inside the file as EXIF and XMP: the post body, the educator who posted it, the children tagged, and the time it was taken with its timezone. Videos get an XMP sidecar beside them. A household that already runs Immich can have each file uploaded there too; the disk copy is always written first.

human-rate fetchwritesuploadsresume stateVENDORFamlyGraphQL, REST, CDNCLIbairnpaginate the feedfetch best resolutionembed metadatasave atomicallysingle static binarySTOREdiskcanonical, EXIF + XMPOPTIONALImmichself-hostedSTATEstate file$XDG_STATE_HOME/bairnCONTRACTsingle household • single account • single host • human-rate • no redistribution
Famly feed to local disk and Immich

A Progressive Vendor Stance for the Agent-Native Future tells how bairn started: a request to Famly support for a parent-side export, an answer that pointed at their API instead, and why that stance suits a world where people act through agents. jacobbunk/famly-fetch mapped Famly’s API first, in Python, and bairn’s REST calls follow that map.

bairn is one static Go binary. It signs in through Famly’s GraphQL Authenticate mutation, on a client genqlient generates from a curated schema, and reads the feed over REST. Each asset moves through phases (discovered, downloaded, saved, optionally uploaded, recorded) that are each their own Go type, so code that records an asset it never saved does not compile. Downloads rewrite the CDN’s size segment to the image’s original dimensions, and the XMP writer splices its segment in ahead of the image data, where readers look for it. Progress lives in a JSON state file held under an exclusive file lock, so a rerun skips finished work and a second concurrent run fails fast.

bairn serves one household on one account, reading what a parent’s phone already reads, under the conditions in NOTICE.md. For several accounts, notifications or writing back to Famly, the answer is Famly’s official API add-on.