Owner's guide
The backend
Every request the server answers and every job it runs while nobody is looking. This page is generated from the running code, so a missing entry is a defect, never an oversight.
What is hereFour things: the requests the server answers, the jobs it runs, where your data sits, and who else it talks to
All of it is read from the running code, so a missing entry is a defect rather than an oversight. If you only read one section, read the outside services — it is the only place that says what leaves this machine.
The APIEverything the app, your Claude and your scripts can ask this server for
Grouped by the part of the app it serves. The check column says a screen in the app makes that request. A row without one is served for scripts and operators. The one-line explanations are the code's own.
Two families are named for the store rather than the menu. documents serves the Notes tab and goals serves Goals. The Aug 2026 rename changed the words on screen and left every route, table and identifier as it was, so a bookmark from before it still resolves.
The journalWriting, reading back, search, recordings, and the device signals behind the morning sleep entry.
| Request | What it does | App |
|---|---|---|
GET /api/journal | A day's entries, in the order things happened. | ✓ |
POST /api/journal | Write an entry: a moment, a span, or a running time log. | ✓ |
GET /api/journal/active | The running time log, if one is running. | |
POST /api/journal/media | Store a recording or photograph; the key it returns is what an entry holds. | ✓ |
POST /api/journal/media/chunk | One piece of a long upload; the final piece assembles the file. | ✓ |
GET /api/journal/search | Find something written on any day, in the words or a transcript. | ✓ |
DELETE /api/journal/{entry_id} | Remove an entry. | ✓ |
GET /api/journal/{entry_id} | One entry by id, the way a change row names it (LC-221). | ✓ |
PUT /api/journal/{entry_id} | Edit what an entry says or where it is filed; words cannot be saved away to nothing. | ✓ |
PATCH /api/journal/{entry_id}/sleep | Say when you slept and woke. The recomputed entry keeps your numbers. | ✓ |
POST /api/journal/{entry_id}/stop | Close the running time log at this moment. | ✓ |
POST /api/journal/{entry_id}/tasks | Point an entry at tasks; the task takes over its area until unlinked. | ✓ |
PATCH /api/journal/{entry_id}/times | Move an entry in the day; an end before its start is refused. | ✓ |
POST /api/journal/{entry_id}/transcribe | Write up a recording that has no transcript yet, for an entry the job never saw. | ✓ |
POST /api/signal | Note a device signal: proof somebody was awake at a moment. |
TasksThe open list, check-off, deferral, your status words, and the chores that come back.
| Request | What it does | App |
|---|---|---|
GET /api/areas | Every area you have ever filed a task under, with open counts; empty ones stay. | ✓ |
GET /api/recurring | The chores that come back, and their cadences. | ✓ |
POST /api/recurring | Define something that comes back on a cadence. | ✓ |
POST /api/recurring/generate | Write today's recurring tasks now rather than waiting for the tick. | |
DELETE /api/recurring/{rid} | Stop a definition. The tasks it already made stay. | ✓ |
PATCH /api/recurring/{rid} | Change a recurring task's words, cadence, or whether it runs. | ✓ |
GET /api/task-statuses | Your status words in their categories, seeded on first read. | ✓ |
POST /api/task-statuses | Add a status of your own to one of the four categories. | ✓ |
DELETE /api/task-statuses/{status_id} | Remove a status; rows still wearing it move somewhere visible first. | ✓ |
PATCH /api/task-statuses/{status_id} | Rename, recolor or reorder a status; a rename reaches every task wearing it. | ✓ |
GET /api/task-types | The type words on your tasks, busiest first. | ✓ |
POST /api/tasks | Add a task. | ✓ |
GET /api/tasks/closed | Recently closed, newest first: the record, and the way back from a mis-tap. | ✓ |
GET /api/tasks/open | Everything still on your plate, in your order; deferred-today stays hidden. | ✓ |
POST /api/tasks/reorder | Put a task where he dragged it, section and all, and keep it there. | ✓ |
GET /api/tasks/search | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/tasks/search | ✓ |
DELETE /api/tasks/{task_id} | Remove a task. | ✓ |
GET /api/tasks/{task_id} | One task, whole. A goal id is refused — its page is the stream's. | ✓ |
PATCH /api/tasks/{task_id} | Edit a task's fields. | ✓ |
POST /api/tasks/{task_id}/defer | Hide a task for one date; it returns the next day unchanged. | ✓ |
GET /api/tasks/{task_id}/journal | What has been written against this task, newest first. | ✓ |
POST /api/tasks/{task_id}/keep | Adopt a task the assistant added. It stops being a suggestion and joins the list with everything else. | ✓ |
POST /api/tasks/{task_id}/promote | Make a task a goal, keeping its id and taking its subtasks with it. | ✓ |
PATCH /api/tasks/{task_id}/status | Move a task to one of your statuses; a word you do not use is refused. | ✓ |
GET /api/tasks/{task_id}/subtasks | The steps under a task, open and finished apart. | ✓ |
Life areasThe parts of your life things are filed under, in your words and colours.
| Request | What it does | App |
|---|---|---|
GET /api/life-areas | Your areas, in your order, with your words for each. | ✓ |
POST /api/life-areas | Name a new part of your life. | ✓ |
PUT /api/life-areas/order | UNDESCRIBED — add a sentence to PAGE_COPY for PUT /api/life-areas/order | ✓ |
PATCH /api/life-areas/{area_id} | Rename, recolor, or rewrite what an area is; a rename reaches everything filed under it. | ✓ |
The DayThe timeline, what changed, and the Google Calendar connection.
| Request | What it does | App |
|---|---|---|
GET /api/calendar/config | Whether a calendar is connected, and which ones are chosen. | ✓ |
GET /api/calendar/day/{date} | Everything on one day: appointments and dated tasks, on one timeline. | ✓ |
POST /api/calendar/events | Put an appointment on the calendar by hand. | |
DELETE /api/calendar/events/{event_id} | Take a hand-made appointment off the calendar, with its decisions. | |
PATCH /api/calendar/events/{event_id}/intent | Decide about one occurrence; each verb also moves the task and the log. | ✓ |
POST /api/calendar/placeholder-titles | Which calendar titles are placeholders rather than meetings, so they keep their block on the day and never become tasks. | |
GET /api/changes | A day's changes, or everything after a cursor. | ✓ |
GET /api/changes/latest | The newest change id, which is where a full export sets its cursor. | |
GET /api/changes/stream | Server-Sent Events: the backlog after `since`, then the log as it grows. | |
POST /api/gcal/sync | Pull a window of the connected calendar in, safely repeatable. | |
GET /api/google/auth-url | The Google sign-in link for this account, with a signed state. | ✓ |
GET /api/google/calendars | The calendars your Google account offers, and which sync today. | ✓ |
POST /api/google/calendars | Choose which calendars sync and their areas, then pull them in at once. | ✓ |
GET /api/google/callback | Where Google sends the browser back once you allow the calendar connection. | |
POST /api/google/disconnect | Forget the Google connection; the events already synced stay. | ✓ |
GET /api/google/status | Whether this instance can offer Google Calendar, and whether yours is connected. | ✓ |
NotesThe Notes tab's notes, the editor's stored bodies, and search inside them.
| Request | What it does | App |
|---|---|---|
GET /api/documents | The notes, newest first by the date each one shows. | ✓ |
POST /api/documents | Start a note. | ✓ |
GET /api/documents/search | Find a note by its title, its description, or the words inside it. | ✓ |
DELETE /api/documents/{doc_id} | Remove a note and its body; the journal entry pointing at it keeps its words. | ✓ |
GET /api/documents/{doc_id} | One live note; an archived one answers 404, which the app reads as shelved. | ✓ |
PATCH /api/documents/{doc_id} | Rename a note, refile it, or move it on or off the shelf. | ✓ |
POST /api/documents/{document_id}/promote | Make a note a goal, carrying its title, its area and its words. | ✓ |
GET /api/page-body/{entity_id} | The stored editor blocks, or the same body as markdown (LC-221). | ✓ |
PUT /api/page-body/{entity_id} | Save the whole body, as editor blocks or as markdown; words for search are derived from it. | ✓ |
GET /api/page-body/{entity_id}/history | Everything the History panel draws, including how fresh the trail is. | ✓ |
POST /api/page-body/{entity_id}/history | Seal what it says right now, on request. | ✓ |
GET /api/page-body/{entity_id}/history/{state_id} | One past state, for reading it without putting it back. | ✓ |
POST /api/page-body/{entity_id}/history/{state_id}/restore | Put a past state back. What is on screen now is sealed first, always. | ✓ |
GoalsThe streams you are working toward, with counts and movement computed from the work.
| Request | What it does | App |
|---|---|---|
GET /api/goals | Every goal, longest untouched first, with counts computed from the work. | ✓ |
GET /api/goals/{goal_id} | One goal, for its own page. | ✓ |
GET /api/goals/{goal_id}/documents | The writing filed under a goal, newest first. | ✓ |
GET /api/goals/{goal_id}/files | A goal's files, newest first, each with a fresh link. | ✓ |
POST /api/goals/{goal_id}/files | Keep a file beside a goal; the answer is the row, link and all. | ✓ |
DELETE /api/goals/{goal_id}/files/{file_id} | Take a file off a goal, bytes and all. | ✓ |
GET /api/goals/{goal_id}/journal | What has been written against this goal, newest first. | ✓ |
GET /api/goals/{goal_id}/links | What this goal points at and what points at it, in one list. | ✓ |
POST /api/goals/{goal_id}/links | Point this goal at another one, with words for what the arrow means. | ✓ |
GET /api/goals/{goal_id}/tasks | The work under a goal, open and finished apart. | ✓ |
POST /api/initiatives | Start a goal. | ✓ |
DELETE /api/initiatives/order | Forget the dragged order, so goals read by status, then longest untouched. | ✓ |
DELETE /api/initiatives/{goal_id} | Remove a goal; its tasks stay. | ✓ |
PATCH /api/initiatives/{goal_id} | Change a goal; renaming reaches the tasks that name it. | ✓ |
POST /api/initiatives/{goal_id}/reorder | Put a goal where he dragged it, section and all, and keep it there. | ✓ |
ChaptersThe stretches of days you lived under one name, and what covers a given day.
| Request | What it does | App |
|---|---|---|
GET /api/chapters | Every chapter, in reading order: running, then coming, then over. | ✓ |
POST /api/chapters | Name a chapter. A name is enough; dates can come later. | ✓ |
GET /api/chapters/highlighted | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/chapters/highlighted | ✓ |
GET /api/chapters/on/{date} | The chapters a given day falls inside. | |
DELETE /api/chapters/{chapter_id} | Remove a chapter. The days it covered keep everything written on them. | ✓ |
GET /api/chapters/{chapter_id} | One chapter, with its dates read in the account's own zone. | ✓ |
PATCH /api/chapters/{chapter_id} | Change a chapter's name, its span, where it sits, or how it is marked. | ✓ |
GET /api/chapters/{chapter_id}/documents | The live notes filed under this chapter, in the index's own order. | ✓ |
GET /api/chapters/{chapter_id}/journal | What has been written on this chapter, newest first. | ✓ |
POST /api/chapters/{chapter_id}/move | Move an event and everything inside it by a number of days, in one write. | ✓ |
GET /api/chapters/{chapter_id}/tasks | The work filed under this chapter, open and finished apart. | ✓ |
RemindersTimes you asked to be nudged at, including ones that repeat.
| Request | What it does | App |
|---|---|---|
GET /api/reminders | Your reminders, soonest first; active means still waiting on you. | ✓ |
POST /api/reminders | Set a nudge for a time, once or on a repeat. | ✓ |
DELETE /api/reminders/{reminder_id} | Remove a reminder entirely. | ✓ |
PATCH /api/reminders/{reminder_id} | Change a reminder's words, its time, or its repeat. | ✓ |
POST /api/reminders/{reminder_id}/ack | Deal with a reminder; a repeating one rolls to its next time. | ✓ |
POST /api/reminders/{reminder_id}/snooze | Push a reminder out by some minutes. | ✓ |
Your phonesWhich phones a reminder can ring, and the one-off test that proves it.
| Request | What it does | App |
|---|---|---|
GET /api/devices | Which phones this account can be reached on. The answer to "why did nothing arrive". | ✓ |
POST /api/devices | Say where a push notification can reach this account. | ✓ |
POST /api/devices/test | Send one push right now, so "does this reach my phone" has an answer. | ✓ |
DELETE /api/devices/{token} | Stop pushing to one phone. | ✓ |
Your accountWho you are to the app, every switch you can flip, the web login, and taking your data with you.
| Request | What it does | App |
|---|---|---|
GET /api/auth/claim | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/auth/claim | |
POST /api/auth/claim | Set the web login on an instance that has none yet. The second attempt is refused, so this stops being a way in the moment it is used. | |
POST /api/auth/signin | Trade your username and password for a token. The phone's way in, so an access token never has to move between devices. | |
GET /api/auth/status | Whether this account has set a web login yet, and how long its password has to be. | ✓ |
POST /api/auth/verify | Whether a username and password are this account's web login. | ✓ |
GET /api/export/archive | Every RECORD this account holds, as a zip. | ✓ |
POST /api/settings/ai | Turn AI on or off for this account. | ✓ |
POST /api/settings/ai-job | Turn one AI job on or off, and hand back the stored list. | ✓ |
POST /api/settings/ai-job-model | Choose which model one AI job runs on. Only the models that job declares are accepted. | ✓ |
POST /api/settings/ai-job-prompt | Edit the prompt one AI job runs with, or clear the edit to get the shipped one back. | ✓ |
POST /api/settings/assistant-acts-as-me | UNDESCRIBED — add a sentence to PAGE_COPY for POST /api/settings/assistant-acts-as-me | ✓ |
GET /api/settings/backup-status | When your data was last copied, and whether copies leave this machine. | ✓ |
POST /api/settings/bar | Put these apps in one bar, in this order. The phone's bottom row holds four and the wide window's top row holds twelve, and fewer is allowed. | ✓ |
POST /api/settings/device-zone | Say where this phone or laptop is, and adopt that timezone only if it moved. | ✓ |
POST /api/settings/home | Make one app, or the Apps page itself, the page the web and the phone open on. An app has to be switched on first. | ✓ |
POST /api/settings/login | Set this account's web login, replacing any it already had. | |
POST /api/settings/module | Switch one app on or off. An app switched off leaves the bar and stops being the home page in the same write. | ✓ |
POST /api/settings/password | Change this account's web password, proving the old one first. | ✓ |
GET /api/settings/phone-token | Whether a phone has ever been set up from here. | ✓ |
POST /api/settings/phone-token | A fresh token for a phone, minted from a laptop somebody is logged into. | ✓ |
POST /api/settings/service-key | Store your own key for an outside service. Once stored it is never read back out, so the settings page can only say whether one is set. | ✓ |
POST /api/settings/sleep | Say whether the morning sleep reading is taken at all. | ✓ |
GET /api/settings/sleep-area | Which area the morning reading files under, and what it is called now. | ✓ |
POST /api/settings/sleep-area | File the morning reading under one of your areas, or under none. | ✓ |
POST /api/settings/tasks-advanced | Turn the richer task tier on or off. | ✓ |
POST /api/settings/theme | Set some palette colours for this account, or take the shipped palette back. | ✓ |
POST /api/settings/timezone | Store the timezone every date resolves through. | ✓ |
GET /api/whoami | Who you are to the app, and every switch as it is stored. | ✓ |
RecordingsReading back a stored video, audio or photograph through an expiring link.
| Request | What it does | App |
|---|---|---|
GET /api/media/{key} | A recording, for a link that has not expired. |
Running the instanceHealth, provisioning, and the operator's manual controls.
| Request | What it does | App |
|---|---|---|
GET /api/accounts | Every account and every grant, the person-agent links among them. | ✓ |
GET /api/accounts/crossings | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/accounts/crossings | ✓ |
PUT /api/accounts/grants | Open one account to another, or change how; answers with the whole table. | ✓ |
DELETE /api/accounts/grants/{viewer_id}/{target_id} | Take a grant back; the viewer's next request into that account is refused. | ✓ |
POST /api/admin/area-filing/resweep | Ask the classifier again about every note and task it declined to file. | |
POST /api/admin/chapters/import | Bring an account's legacy chapters across, as often as anybody runs it. | |
GET /api/admin/crossings | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/admin/crossings | |
GET /api/admin/grants | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/admin/grants | |
PUT /api/admin/grants | UNDESCRIBED — add a sentence to PAGE_COPY for PUT /api/admin/grants | |
DELETE /api/admin/grants/{viewer_id}/{target_id} | UNDESCRIBED — add a sentence to PAGE_COPY for DELETE /api/admin/grants/{viewer_id}/{target_id} | |
POST /api/admin/jobs/{name}/run | Run one background job now, for every account. The operator's manual trigger. | |
POST /api/admin/provision | Make an account: a row, a partition, and a fresh token. | |
DELETE /api/admin/tenants/{uid} | Retire an account: it can no longer sign in, and its data is set aside, not deleted. | |
PATCH /api/admin/tenants/{uid} | Correct an account's name or email, when it was provisioned with the wrong one. | |
POST /api/admin/tenants/{uid}/change-log/clear | Empty one account's Changes lane, and say how many rows went. | |
GET /api/assistant/messages | The conversation so far, oldest first. | ✓ |
POST /api/assistant/messages | Say something; the answer comes back on this same request. | ✓ |
POST /api/assistant/messages/stream | UNDESCRIBED — add a sentence to PAGE_COPY for POST /api/assistant/messages/stream | ✓ |
GET /api/boards | Every board, the most recently changed first, without its drawing. | ✓ |
POST /api/boards | Start a board: a blank canvas, or a FigJam board shown from its share link. | ✓ |
DELETE /api/boards/{board_id} | Remove a board and its drawing. | ✓ |
GET /api/boards/{board_id} | One board with its drawing. | ✓ |
PATCH /api/boards/{board_id} | Give a board a new name; a blank one is Untitled board. | ✓ |
PUT /api/boards/{board_id}/scene | The drawing as it is now, whole. 413 when it is over the ceiling. | ✓ |
GET /api/build | The marker of the upload that is serving, or "unknown" for a build deploy.sh did not make. | |
POST /api/capture | One line typed or spoken, filed as a task or a journal entry, and the answer says which. With AI off it is always the journal. | ✓ |
GET /api/connector/sessions | The connections seen in the last `days`, newest first, with what each wrote. | ✓ |
DELETE /api/connector/sessions/{connection_id} | Disconnect one assistant: take back its key, and keep its calls on record. | ✓ |
GET /api/connector/sessions/{connection_id} | One connection and every call it made, oldest first. | ✓ |
GET /api/development | What the development board holds and which commit each tier last deployed, for the phone's Development screen. The web tier reads GitHub itself; the phone asks here. | ✓ |
GET /api/goal-kinds | Your kind words in your order, seeded on first read. | ✓ |
POST /api/goal-kinds | Add a kind of your own; it goes on the end of the list. | ✓ |
DELETE /api/goal-kinds/{kind_id} | Remove a kind; goals still wearing it move to a kind you name first. | ✓ |
PATCH /api/goal-kinds/{kind_id} | Rename, recolor or reorder a kind; a rename reaches every goal wearing it. | ✓ |
GET /api/goal-links | Every arrow at once, both ends named — the whole map in one read. | ✓ |
DELETE /api/goal-links/{link_id} | Rub out one arrow. Both goals stay. | ✓ |
PATCH /api/goal-links/{link_id} | Change what an arrow says; it keeps its direction and its ends. | ✓ |
GET /api/health | Liveness. The phone's recovery poll hits this with no session, so it takes no token. | |
GET /api/jobs | When each background job last finished, for this account. | |
GET /api/push | UNDESCRIBED — add a sentence to PAGE_COPY for GET /api/push | ✓ |
PUT /api/push/kinds/{kind} | Say whether one kind of news may interrupt this account. | ✓ |
POST /api/push/receipts | Ask Apple, through the relay, what happened to the pushes it took. | ✓ |
The background jobs12 jobs run on their own clocks, and each one is a switch
Your Claude can turn any of them off for this instance. A stopped job raises no error. Things simply stop appearing, so every run leaves a heartbeat — and a job crossing between working and failed sends one email each way, so a stop is news once, not a thousand times.
| Job | How often | What it does |
|---|---|---|
| reminders | every minute | fires the reminders whose moment has arrived |
| push_receipts | every 5 minutes | |
| recurring | every 15 minutes | writes today's recurring tasks, once |
| sleep | every 15 minutes | reads last night from the marks you left and writes the morning entry |
| calendar | every 15 minutes | pulls your Google Calendar into the day |
| classify | every 2 minutes | files a fresh capture into one of your life areas, marked as the classifier's choice |
| document_areas | every 5 minutes | files a note that has no life area, reading its name, kind, description and text |
| task_areas | every 2 minutes | gives a task under a stream that stream's area, then files what is left by reading the task's words |
| area_descriptions | every 2 minutes | |
| transcode | every 5 minutes | compresses new video recordings to web size, keeping the original until the swap is safe |
| backup | daily | takes a consistent copy of your data and hands it to offsite storage |
| body_consolidation | hourly | turns each note's raw save trail into versions where the writing really moved, and writes the line saying what changed |
Where a Claude connectsThe same backend answers claude.ai, through a door with a lock
These addresses are not in the table above because they are not the app's: they are the MCP surface a Claude connects to, serving the same nineteen tools over your same data. Without a signed-in token the door answers 401 and points at the OAuth flow. Signing in IS your web login, on this backend's own page.
| Address | What it is |
|---|---|
/.well-known/oauth-authorization-server | The metadata document naming the endpoints above, read first. |
/.well-known/oauth-protected-resource/mcp | Names which authorization server protects /mcp. |
/authorize | OAuth: where claude.ai sends the browser to ask permission. |
/mcp | The MCP endpoint itself: nineteen tools over your journal, tasks, notes, days and goals. Requires a bearer token. Without one it answers 401 with the pointer that starts the OAuth flow. |
/register | OAuth: where a client introduces itself before asking. |
/token | OAuth: exchanges a finished sign-in for an ordinary access token. |
Where your data isFour stores, and only one of them is yours
Your journal, tasks, notes, calendar and settings are rows in a single SQLite file that belongs to your account alone — not a shared table with your name in a column. Recordings sit beside it as plain files. The whole thing leaves with you through the export on the account page, as readable JSON plus a full SQL copy of the database.
| Store | What is in it | Where |
|---|---|---|
core.db | Everything you write and everything the app keeps for you: entries, tasks, notes, the day's calendar, your life areas, streams, reminders and settings. area_classifications, area_corrections, area_description_drafts, assistant_messages, boards, calendar_config, calendar_events, change_log, chapters, connector_calls, connector_sessions, device_signals, devices, document_area_classifications, document_area_corrections, documents, event_intents, gcal_sync_state, goal_files, goal_kinds, goal_links, google_tokens, job_heartbeats, journal_entries, journal_entry_tasks, journal_writeups, life_areas, media_posters, media_transcodes, page_bodies, page_body_raw_saves, page_body_versions, push_deliveries, push_preferences, recurring_task_instances, recurring_tasks, reminders, sleep_config, task_area_classifications, task_area_corrections, task_deferrals, task_statuses, tasks | one file per accountusers/{id}/core.db |
system.db | The accounts themselves — who exists, their login, and the tokens that let a device or a Claude connect. Everything you write is in the other file, never this one. account_crossings, account_grants, auth_tokens, oauth_clients, oauth_codes, oauth_txns, users, web_logins | one file for the instancesystem.db |
| Recordings | The video, audio and photographs attached to entries. Kept as ordinary files, not blobs in the database — a compressed copy for playback, and the original until that swap is known good. | on disk beside the databasesmedia/ |
| Offsite copy | The nightly backup and, where configured, the recordings. This is the only store that is not on the machine running the app. | a private Cloudflare R2 bucket see the outside services |
The outside servicesWhat leaves this machine, and who else is involved
Every one of these is optional, and the instance runs without all of them. Turning one on is a decision about trust, so the row says exactly what gets sent, what turns it on, and what you give up by leaving it off. This list is the whole of it — everything else the backend does stays on the machine.
| Service | What it does, and what we send | Turned on by |
|---|---|---|
| Anthropic
| Filing a captured entry into one of your life areas. The text of an unfiled entry and the names of your life areas, and that is the whole payload. Your other entries, your tasks and your account details stay here. Without it: Captures stay unfiled until you file them. Everything else works the same, and no other feature depends on this one. | a key in Settings → Integrations |
| ElevenLabs
| Turning a recording into a transcript. The recording itself, and nothing else. The transcript comes back here, and the write-up of it is a separate call to Anthropic that sends only the transcript. Without it: A recording is stored and plays, with no transcript and no write-up. It never leaves this machine, and nothing else changes. | a key in Settings → Integrations |
| Google Calendar
| Pulling your calendar onto the Day timeline. Requests to read your calendars and the events on them, on the calendar.readonly and calendar.events scopes. Your events come in. This instance writes back one thing only, your own answer to an invitation, and only when you press Cancel & Decline on a meeting. That sets your attendance to declined and changes nothing else. Google emails nobody about it. The write sets sendUpdates to none, so no invitation mail goes out. This instance never edits, moves or deletes anything in your calendar, and sends it none of your writing. Without it: The Day shows what you wrote and nothing from Google. The connect button says it is not configured. | GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URI |
| Cloudflare R2
| Offsite storage for recordings and for the nightly backup. Your recordings and photographs, and a copy of your database. Into a private bucket - the app hands out links that expire rather than making anything public. Without it: Recordings stay on this machine's disk, and the backup has nowhere offsite to go. The instance runs local-only, which is a supported way to run it and a real risk to accept. | R2_ACCOUNT_IDR2_API_TOKEN |
| Resend
| Emailing you when a background job breaks or recovers. Your alert address, and the name of the job plus its error. The contents of what you write stay here. Without it: A job can stop and nobody is told. The heartbeats still record it, so the jobs page shows the failure - but only if somebody looks. | a key in Settings → IntegrationsLIFEOPS_ALERT_EMAILLIFEOPS_ALERT_FROM |
| GitHub
| Reading the development board for the phone's Development page. A read of the open issues on the repositories named in the environment, with the read token. It sends nothing of yours. Without it: The phone's Development page says the instance has not been told where its repositories are, and draws no board; the last deploy of each tier still shows, since that comes from the tiers themselves. The web tier's own copy of the page reads GitHub with its own environment and is unaffected. | LIFEOPS_DEV_REPOSLIFEOPS_DEV_OWNER_LOGINLIFEOPS_DEV_GH_TOKEN |
| Expo push notifications
| Ringing your phone when a reminder comes due. The words of the reminder itself, and the push address of the phone it is going to. Expo relays it to Apple using the notification key that already belongs to this app's Apple team. The rest of your account stays on this machine. Without it: A reminder still fires and still shows in an open browser tab, but nothing reaches a phone in a pocket. This turns itself on when a phone registers and needs no key of its own. Set LIFEOPS_PUSH=0 to keep reminder text on this machine. | LIFEOPS_PUSH |