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.
3.5 KiB
Getting started
Run it
You need Rust (1.96 or newer) and bun to build it. The result is one binary with the whole frontend inside, so the machine it runs on needs neither.
git clone https://github.com/narrrl/narl-workspace
cd narl-workspace
cp .env.example .env
Open .env and set three things:
WORKSPACE_USER: the name you log in with.WORKSPACE_PASSWORD: the password. The server will not start while it is stillchange-me.WORKSPACE_SECRET: 32 random characters that sign the login cookie. Make one withopenssl rand -base64 32.
Then build and start it:
make build
./target/release/narl-workspace
and open http://127.0.0.1:4242.
With Docker instead, docker compose up -d --build does the same; see
Deploying. Every other setting has a default that works on
your own machine. Configuration lists them all.
Log in
The workspace has one account, the one in .env. Wrong passwords are answered
more slowly each time. A browser that has logged in before is slowed only by
its own mistakes, so someone guessing from elsewhere cannot lock you out.
Find your way around
A new workspace has three spaces: diary, work and uni. The bar along
the top shows them as numbered pills. 1, 2 and 3 switch between them,
and Tab steps to the next one.
The screen has four parts:
- the bar, at the top: the spaces, where you are in the tree, how many cards are late or due today, and the clock;
- the list, on the left: what is in the folder you are in;
- the tiles, on the right: the documents and files you have open;
- the status line, at the bottom: the mode you are in, and what the last key or command did.
The rail of buttons on the right does the same as the keys, for a mouse.
The first ten minutes
- Press
2to go towork. - Press
o. A new document opens in the editor, in insert mode. Write something. - Press
Escto leave insert mode, then type:name Plans for the weekandEnterto give it a name. There is no need to save: the document is saved a couple of seconds after you stop typing.:wsaves at once anyway. - Type
:qto close it. It is in the list now, under today's date. - Press
O(capital). The command line opens with:mkdiralready typed; add a name and pressEnter.lorEnteron the folder goes into it, andhcomes back up. - Press
c, typetry the board, and pressEnter. That is a card in the inbox of this space's board. Pressbto see the board on the plan screen, beside the agenda and the calendar, andEscto go back to the documents.Sgoes to the plan and back;Ctrl-h/j/k/lwalk between the tiles. - Press
T. That is today's diary entry, started for you. - Press
?for the list of every key and command.h/lwalk its columns,/narrows it down, andEsccloses it.
On a phone the same things are buttons: the dock at the bottom has a new
document, a new folder, the board, today's entry, an upload and a search, and
the ⋯ on a row (or a long press on it) has what can be done to that row.
Over HTTPS the browser offers to install it as an app, which then sits in the
share sheet and puts what is shared on the scratchpad; see
On a phone.
Next
The guide goes through a whole day with the workspace and explains each part as it comes up.

