A manifest with a 192, a 512 and a maskable icon, and a hand-written service worker built beside the app by a small vite plugin: it keeps index.html, the logo, the entry with its imports and the latin fonts, keeps each hashed asset once fetched, asks the server for pages first and answers from the cache when it is down, and never touches /api. The CSP names worker-src and manifest-src. The share target posts to /share, which the worker catches: the text waits in a cache and becomes a scratchpad note once someone is logged in, with the drawer down on it. On a touch screen one guard entry in the history makes back let go of one thing at a time — a prompt, the line, a sheet, the drawer, the editor, a tile, then a folder up — and leave only at a space's root. The bar and the band grow by the safe-area insets. The login no longer says the server is unreachable once it answers again with the session gone.
2.9 KiB
Capture
A thought arrives when no tab is open. POST /api/capture writes it down from
anything that can send a request: a phone shortcut, a script, curl. It takes a
token in place of a login.
Tokens
:token add phone makes one, shows it once and copies it
:token the settings sheet's tokens, each with when it was last used — x there retires one
:token rm phone and that one captures nothing from the next request on
A token opens this one route and nothing else. It cannot read anything, not even the list of spaces. Only its SHA-256 is kept on the server, so it is shown once, when it is made. Wrong tokens slow down the way wrong passwords do, on a line of their own, so guessing at them does not hold up the login.
Sending
curl -H "Authorization: Bearer nwc_…" -H 'content-type: application/json' \
-d '{"text":"call the bank"}' https://your-host/api/capture
| field | meaning |
|---|---|
text |
what to write down; for a card, the first line is the title and the rest its notes |
to |
"card" (the default), "diary", "note" or "document" |
space |
for a card, the slug of the space whose inbox it goes in; for a document, the space its title is looked for in first |
document |
for "document", which one, as a link names it: Plan, [[Plan]] or /n/work/plan |
note |
the id of the scratch note the text came from; it is dropped once the text has landed |
"to": "card"puts a card in the inbox of the space named byspace, or else of the first space that has a board."to": "diary"adds- 14:05 call the bankto the end of today's entry, inWORKSPACE_TIMEZONE, and starts the entry fromtemplates/daywhen there is none yet."to": "note"puts it on the scratchpad, for when it is not clear yet where it belongs."to": "document"adds it as a paragraph at the end of a document. The text it replaces is kept in the document's history, as a save keeps it.
The answer says where it went: {"to":"card","id":7,"where":"work/backlog"}.
From a phone
iPhone: in Shortcuts, make a shortcut with Ask for Input, then Get Contents of URL:
- URL:
https://your-host/api/capture - Method:
POST - Headers:
Authorization=Bearer nwc_… - Request body: JSON, with
textset to the Provided Input, andtoset todiaryif that is where it should go.
Android: in HTTP Shortcuts, make a shortcut
with a text-input variable, method POST, the same header, and a JSON body
{"text": "{{input}}"}.
Either one can sit on the home screen, or behind the share sheet.
Android, without a token: install the workspace from Chrome (Install app, over HTTPS) and it is in the share sheet itself. What is shared to it — a link, some text, a title — becomes a note on the scratchpad, from the session the app is logged in with. See On a phone.