The apps
Beside the browser: a desktop app, Snap for the diary and meetings, a browser extension that records journeys, in-app recorders for React web and Expo apps, and a bug-report widget. Each talks to the same server over the same authenticated API.
Desktop
The full web app in a native macOS window — the top bar and every module, boards with their chat and annotation islands — with nothing bundled locally, so it is always the version your deployment serves. It runs on macOS only — download it from vitrinka.ai/download (signed and notarized; vitrinka.ai/download/desktop/latest is the stable link to the current build) — and adds what a browser tab cannot:
vitrinka://deep links — a link likevitrinka://w/acme/boards/xopens or focuses the app on that board;vitrinka board openandvitrinka board edituse them.- ⌥⇧Space — summons the app from anywhere, or hides it again when it is in front.
- An instant editor — a file tree, PR-style diffs and Monaco tabs, opened by
vitrinka board edit, Finder's Open With, or a card's open-in-editor. - A menu-bar tray — the boards an agent is working on right now (live listener leases on this Mac), with open-work and open-question counts, and a few recent boards.
- Sign-in in-app — first-party, once; passkeys stay browser-only, so use your password here. GitHub and SSO sign-in open in your default browser, and that session stays there.
Snap and the diary
Each day has one personal board. Snap is the macOS menu-bar helper that gets moments onto it without leaving whatever you are doing. Download it from vitrinka.ai/download (the stable link is vitrinka.ai/download/snap/latest):
- Area and screen snaps — capture with
⌥⇧4/⌥⇧3, or assign the native screenshot shortcuts. The images arrive on today's board. - Clipboard, drops and notes —
⌥⇧Csnaps the clipboard (an image becomes media, a list becomes a checklist), files and links can be dropped onto the ✦, and the toast after a snap takes a one-line note. - Voice notes — hold
⌥⇧Mand talk. The note is transcribed on your Mac and staged for you to correct before it is sent. - Meetings — record the mic and the call's audio from the HUB or the ✦ menu. Captions run on the Mac, or the server transcribes when your organization has server transcription on. A meeting lands on today's board and can be promoted to a task carrying its audio, transcript and notes — meetings.
- Send to Vitrinka — the macOS Services menu sends selected text, files or images the same way as a drop.
- Outbox — captures are written to disk before upload. Pending items wait for a connection, and the server deduplicates repeated upload attempts.
- The HUB (
⌥⇧V) — today's diary state, the Outbox, and the capture actions. - The recorder's keys stay free —
⌥⇧A,⌥⇧N,⌥⇧Pand⌥⇧Sbelong to the browser recorder, so Snap never binds them.
The server keeps the day board arranged and rolls days up into weekly, monthly and yearly views.
The browser extension
The journey recorder for Chromium browsers: screenshots, clicks, API calls with full bodies, console errors, an rrweb DOM stream and quick notes, projected live onto a journey board. It is installed and kept current by the CLI:
vitrinka setup extension setup # unpack the release and register the update host
vitrinka setup extension update # swap to the newest release; the extension reloads itself
vitrinka doctor # report every link in the update chainvitrinka setup offers the same setup. Recording, redaction and what a session becomes: the browser recorder.
The in-app web recorder
@vitrinka/web mounts the same journey recorder inside a React web app, with no extension, so testers on phones and desktops record from a dev or preview build. The server refuses it on a production domain unless that domain's rule opts in. Wiring it in: the web recorder.
The Expo recorder
@vitrinka/expo records journeys inside an Expo / React Native app — the same session shape the browser extension produces, so the boards, the digest and the fixing loop are identical. Wiring it in: the Expo recorder.
The bug-report widget
A report button inside your own app, served by your deployment as one script tag: the person reporting sends a masked screenshot, the console tail and failed requests without ever seeing vitrinka, and the report waits in quarantine until an admin approves it — the bug-report widget.
Captured data is sent to the server you configure. The desktop uses its sign-in session, and Snap shares the CLI's sign-in. A recorder is linked by approving a code in your browser (Link a device in the account menu, or Link this browser in the extension) and receives a recorder token that can create sessions and append to the ones it started itself, and reads back nothing but their status — never a session another credential started. Unattended builds use a recorder key an admin mints for one project; the extension also accepts a personal token for someone who records into several workspaces. Installation and updates use their configured release services.