Deferred from write-api (PR #29). The plan listed POST /api/people/:slug/avatar under People mutations but didn't ship it — multipart attachment handling needs server-side image processing + gitsheets setAttachment plumbing that wasn't in scope.
Per specs/api/people.md: max 5 MB, jpeg/png/webp, store at people/<slug>/avatar.jpg, with a 128×128 thumbnail.
Required pieces:
@fastify/multipart plugin (or equivalent) in the API skeleton
- Image-resize pipeline (sharp or similar) — size-cap 5MB, transcode to jpeg, write a 128×128 thumbnail
tx.public.openSheet('people').setAttachment(person, 'avatar.jpg', buffer) per gitsheets API
- Auth:
requireAuth('self | staff')
- The
Person.avatarKey field gets set to the attachment key on commit
Deferred from write-api (PR #29). The plan listed
POST /api/people/:slug/avatarunder People mutations but didn't ship it — multipart attachment handling needs server-side image processing + gitsheetssetAttachmentplumbing that wasn't in scope.Per
specs/api/people.md: max 5 MB, jpeg/png/webp, store atpeople/<slug>/avatar.jpg, with a 128×128 thumbnail.Required pieces:
@fastify/multipartplugin (or equivalent) in the API skeletontx.public.openSheet('people').setAttachment(person, 'avatar.jpg', buffer)per gitsheets APIrequireAuth('self | staff')Person.avatarKeyfield gets set to the attachment key on commit