Files
narl-workspace/docs/wiki/Capture.md
T
nvrl a27d5de9c7 phone app: installable, opens offline, takes the share sheet onto the scratchpad, back lets go of one thing
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.
2026-10-22 20:10:13 +02:00

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 by space, or else of the first space that has a board.
  • "to": "diary" adds - 14:05 call the bank to the end of today's entry, in WORKSPACE_TIMEZONE, and starts the entry from templates/day when 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 text set to the Provided Input, and to set to diary if 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.