openvibers/openvibe.cam CHANGELOG.md
CHANGELOG.md
| 1 | # Changelog |
| 2 | |
| 3 | What changed in OpenVibe.Cam, newest first. |
| 4 | |
| 5 | ## 0.1.0 — 2026-10-28 |
| 6 | |
| 7 | The first version: the camera app, my cameras and revocable viewer grants, and the API Live's cam button calls. |
| 8 | |
| 9 | - **The camera app.** `/app` runs a live preview in the browser; the timer, the 3-shot burst, the grid and the |
| 10 | colour/light/softness filter are all on the device. The picture is posted as raw bytes to `POST /api/v1/photos`, |
| 11 | forwarded to OpenVibe.Pics with the person's own Network token, and recorded as a Pics slug, page link, direct |
| 12 | link, filter name and caption. No image bytes, no face template and no classification are stored here. |
| 13 | - **My cameras.** `cam_cameras` pairs a phone, a browser, a Pi or an IP camera. A Live stream id is read from |
| 14 | OpenVibe.Live's public API and must be on the owner's channel; the slot defaults to the stream's managed slot. |
| 15 | The owner can rename it, set the slot and status, and unpair it. `/my/cameras/:id` is the owner's page. |
| 16 | - **Viewer grants.** `cam_grants` names one canonical viewer and an expiry (7 days by default, 90 at most), with a |
| 17 | partial unique index for one unrevoked grant per camera and viewer. `@username` is resolved through |
| 18 | OpenVibe.Network with `identity.subject.resolve`; a subject id works without Network. A re-grant extends the row; |
| 19 | a revocation writes `revoked_at` and the wall checks it on every read, so the next request is refused. |
| 20 | - **The private wall.** `/w/:id` and `GET /api/v1/cameras/:id/wall` answer the owner and an active grantee, and 404 |
| 21 | to everyone else. Staff have no bypass. A grantee never sees the owner's note. An attached photo is unlisted and |
| 22 | appears on the wall; a photo without a camera is private. |
| 23 | - **The Live cam button.** `POST /api/v1/stills` reads OpenVibe.Media's public `GET /live/:slot/frame.jpg`, accepts |
| 24 | only a JPEG (never an offline SVG card or HTML), uploads it to OpenVibe.Pics as the viewer, records the still and |
| 25 | returns `share.text`, the exact line Live posts in the stream's chat. A still is unlisted by default and private |
| 26 | on request. |
| 27 | - **The service.** Network sign-in as OAuth client `cam` (PKCE S256, `cam_at`/`cam_rt`/`cam_oauth`), truthful |
| 28 | readiness, Prometheus metrics on loopback, discovery, deploy files, and server-rendered pages with stable `cm-` |
| 29 | ids. `public/css/cam.css` is a one-comment placeholder for the main session. |
| 30 | - **Account data.** Export and deletion cover cameras, grants given and received, photos and stills; a deleted |
| 31 | owner's camera and its grants go, a deleted viewer's grants go and the owner's camera stays. Pictures themselves |
| 32 | are OpenVibe.Pics' and are erased on the same Network event. |
| 33 | - **The first proof.** `scripts/seed-proof.js` pairs a test camera, grants a viewer, opens the wall, revokes the |
| 34 | grant and proves the next wall request is refused. |
| 35 | - **Tests.** Migration and constraints, pairing and stream ownership, grants and their refusals, the still path, |
| 36 | the photo upload, pages and cache headers, SSO, and account export/deletion, each in its own process on a |
| 37 | temporary PGlite database with a mock Network and a Media/Live/Pics fixture server. |
| 38 |