docs: the guide around four things and two screens, new screenshots, the plan closed
The guide opens with documents, cards, notes and diary entries, and the documents and plan screens, then walks the day with the scratchpad, the info sheet and cards linked both ways. The README and the wiki's home say the same in short, and show the scratchpad and the info sheet. The screenshot script drops its Alt keys and takes both. PLAN.md records the simplification's slices, what was left of its navigation fixes, and the backlog fitted to the model.
No files matched your search
@@ -1,15 +1,54 @@
|
|||||||
# Findings, possible bugs, and what comes next
|
# Findings, possible bugs, and what comes next
|
||||||
|
|
||||||
Written on 2026-10-21, after the seven slices of the feature plan had landed
|
## The simplification, done
|
||||||
(trash `8ffad63`, revisions `fc2be66`, links `a42f907`, capture tokens
|
|
||||||
`f629f5a`, diary `824f2bb`, recurring cards `6673298`, search in files
|
|
||||||
`909abf5`). That plan has fully landed, and git keeps it.
|
|
||||||
|
|
||||||
These came out of writing the wiki, taking the screenshots against a fresh
|
Written on 2026-10-22. The app had grown slice by slice to about 85 commands,
|
||||||
workspace, and probing the API on a throwaway server. All of them are fixed
|
60 browse keys and 11 overlays, with the same idea modelled two or three times:
|
||||||
now, except two limits of search noted at the end of the list.
|
text in three editors, files in two places, cards that pointed at a document
|
||||||
|
the document could not see, four inboxes, two layout systems, and keys
|
||||||
|
documented by hand in seven places. A plan in eleven slices made the same
|
||||||
|
features out of fewer things, one place for each, and one key grammar. Every
|
||||||
|
one has landed:
|
||||||
|
|
||||||
## Fixed
|
| | slice | commit |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| 0 | the audit's fixes: `Ctrl-P` keeps its query, `:today` by the server's day, card descriptions resolve links | `7f8a381` |
|
||||||
|
| 1 | one keymap table drives the dispatch, help, the footers, the rail and the wiki; a mode stack replaces the flags | `0eabcb2` |
|
||||||
|
| 2 | one `Sheet` component; the info sheet holds headings, versions, backlinks and sharing | `26b3c68` |
|
||||||
|
| 3 | the board, agenda, calendar and a card's back are tiles; the special workspace is gone | `5684614` |
|
||||||
|
| 4 | documents and cards linked both ways: `gc`, card verbs on the card in focus, cards in search | `b8b3641` |
|
||||||
|
| 5 | one editor for documents, descriptions and notes, all saving themselves | `ccc9102` |
|
||||||
|
| 6 | the scratchpad is the inbox, with three ways out and a search | `2233fa4` |
|
||||||
|
| 7 | a file belongs to a node; the media browser is gone | `d8e72c6` |
|
||||||
|
| 8 | `!` means force or everything only; merged commands; a settings sheet; two-level help | `7f8d625` |
|
||||||
|
| 9 | the store split into parts under one `Workspace` | `b110701` |
|
||||||
|
| 9b | fixes from daily use: `Ctrl-h/j/k/l` between tiles, `Ctrl-Q` from anywhere, the plan screen | `650fc40` |
|
||||||
|
| 10 | the docs: the guide around the four things, the README, new screenshots | this commit |
|
||||||
|
|
||||||
|
The model it leaves: a **document** is the thorough record, a **card** the
|
||||||
|
short actionable summary of work, a **note** a thought not sorted yet, and a
|
||||||
|
**diary entry** a document about a day. A file sits in a folder or belongs to
|
||||||
|
its document. The documents and the plan each have a screen, and the
|
||||||
|
scratchpad comes down over either.
|
||||||
|
|
||||||
|
### Left over from the plan, not started
|
||||||
|
|
||||||
|
These were in the plan's navigation fixes, outside the numbered slices:
|
||||||
|
|
||||||
|
- The list groups documents by day in every space; the plan had that only in
|
||||||
|
the diary, and folders first then by name elsewhere.
|
||||||
|
- `Ctrl-P` is full-text search across every space; the plan had it become a
|
||||||
|
jump to a node by its name and path, with `Tab` in `/` reaching every space.
|
||||||
|
- A card's notes are made in the space's root, not in the folder being
|
||||||
|
browsed.
|
||||||
|
- `o` does not offer the space's templates; `:new <template>` does.
|
||||||
|
|
||||||
|
## Fixed before, on 2026-10-21
|
||||||
|
|
||||||
|
After the seven slices of the feature plan (trash `8ffad63`, revisions
|
||||||
|
`fc2be66`, links `a42f907`, capture tokens `f629f5a`, diary `824f2bb`,
|
||||||
|
recurring cards `6673298`, search in files `909abf5`), writing the wiki, taking
|
||||||
|
the screenshots and probing the API turned these up:
|
||||||
|
|
||||||
| | finding | fix |
|
| | finding | fix |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
@@ -32,38 +71,24 @@ now, except two limits of search noted at the end of the list.
|
|||||||
- PDFs and office documents are not read for search. That needs a parser
|
- PDFs and office documents are not read for search. That needs a parser
|
||||||
crate, and waits until it is missed.
|
crate, and waits until it is missed.
|
||||||
|
|
||||||
## Docs and tooling, done in this pass
|
|
||||||
|
|
||||||
- An icon, `~/` and a block cursor, as the favicon, the touch icon, and the
|
|
||||||
mark in the bar, the login and the share page.
|
|
||||||
- A README that opens with the banner, the badges, screenshots and the
|
|
||||||
features grouped by what they are for.
|
|
||||||
- A wiki in `docs/wiki`: a getting-started page, a guide that walks through a
|
|
||||||
day, a page per part of the app, and three reference pages generated from the
|
|
||||||
code (`scripts/wiki.ts`).
|
|
||||||
- Screenshots in `docs/images`, taken by `scripts/screenshots.ts` against a
|
|
||||||
throwaway workspace, so they can be taken again when the UI changes.
|
|
||||||
- CI: `.github/workflows/ci.yml` runs the Rust checks, svelte-check and the
|
|
||||||
wiki check on every push. `.github/workflows/wiki.yml` publishes the wiki on
|
|
||||||
every push to `main`.
|
|
||||||
|
|
||||||
**Before the first wiki publish:** GitHub creates a wiki's repository only
|
**Before the first wiki publish:** GitHub creates a wiki's repository only
|
||||||
when its first page is saved, so save any page once in the repository's Wiki
|
when its first page is saved, so save any page once in the repository's Wiki
|
||||||
tab. The workflow replaces it on its first run.
|
tab. `.github/workflows/wiki.yml` replaces it on its first run.
|
||||||
|
|
||||||
## Next, unplanned
|
## Next, unplanned
|
||||||
|
|
||||||
Carried over from the last plan, still not started:
|
The backlog, fitted to the model rather than given new surfaces:
|
||||||
|
|
||||||
- Install the app on a phone (a PWA: manifest plus a service worker for the
|
- Install the app on a phone (a PWA: manifest plus a service worker for the
|
||||||
app shell, CSP `worker-src 'self'`), with a share target that posts into
|
app shell, CSP `worker-src 'self'`), with a share target that posts into
|
||||||
capture. The new icon is ready for the manifest.
|
capture as a note. The touch and desktop menus are already the same.
|
||||||
- Task lists: toggle `- [ ]` in the reader, and `:tasks` gathers the open ones
|
- Task lists: toggle `- [ ]` in the reader, and the open ones of a space as a
|
||||||
in a space.
|
section of the agenda rather than a `:tasks` command.
|
||||||
- A daily review in the agenda: yesterday's entry, what was finished this week,
|
- A daily review, also as a section of the agenda: yesterday's entry, what was
|
||||||
and cards in `doing` for more than 14 days.
|
finished this week, and cards in `doing` for more than 14 days.
|
||||||
- Marks: `ma` … `mz` per document, `'a` to jump. This clashes with `m` for
|
- Mail-in capture: IMAP polling of a plus-address onto the scratchpad.
|
||||||
picking nodes up, so choose the keys first.
|
|
||||||
- Mail-in capture: IMAP polling of a plus-address into the inbox.
|
|
||||||
|
|
||||||
Suggested next: the PWA, which the new icon makes cheap.
|
Dropped: marks (`ma` … `mz`). The info sheet's headings and the tiles cover
|
||||||
|
what they were for, and `m` stays picking nodes up.
|
||||||
|
|
||||||
|
Suggested next: the PWA.
|
||||||
@@ -24,13 +24,19 @@ Everything is also in the [wiki](https://github.com/narrrl/narl-workspace/wiki).
|
|||||||
|
|
||||||
## What it does
|
## What it does
|
||||||
|
|
||||||
|
Four things, each in one place: **documents**, the thorough record, in the tree
|
||||||
|
of a space; **cards**, the short actionable summary of work, on the board of a
|
||||||
|
space, usually about a document; **notes**, jotted in passing, on the
|
||||||
|
scratchpad until they become one of the others; and **diary entries**, one
|
||||||
|
document per day. A file sits in a folder or belongs to its document.
|
||||||
|
|
||||||
- **Write.** Markdown documents in spaces (`diary`, `work`, `uni`, …) with
|
- **Write.** Markdown documents in spaces (`diary`, `work`, `uni`, …) with
|
||||||
folders to any depth. Real vim keys on the desktop (CodeMirror 6), plain taps
|
folders to any depth. Real vim keys on the desktop (CodeMirror 6), plain taps
|
||||||
on a phone. Math by KaTeX, `$x^2$` and `$$…$$`, and ` ```typst ` blocks
|
on a phone. Math by KaTeX, `$x^2$` and `$$…$$`, and ` ```typst ` blocks
|
||||||
typeset by Typst on the server. `[[Title]]` links that are
|
typeset by Typst on the server. `[[Title]]` links that are
|
||||||
rewritten when what they point at is renamed or moved, and backlinks.
|
rewritten when what they point at is renamed or moved, and backlinks.
|
||||||
- **Plan.** A kanban board per space, cards with a checklist, labels and a
|
- **Plan.** A kanban board per space, cards with a checklist, labels and a
|
||||||
markdown description, due dates said the way you say them
|
markdown description, linked to their document both ways, due dates said the way you say them
|
||||||
(`fri`, `+3d`), cards that come back once done, and an agenda of what is late,
|
(`fri`, `+3d`), cards that come back once done, and an agenda of what is late,
|
||||||
due or in hand on every board.
|
due or in hand on every board.
|
||||||
- **Remember.** A diary with a calendar, templates, the entries from this day
|
- **Remember.** A diary with a calendar, templates, the entries from this day
|
||||||
@@ -38,16 +44,18 @@ Everything is also in the [wiki](https://github.com/narrrl/narl-workspace/wiki).
|
|||||||
- **Keep files.** PDFs, archives and recordings live in the tree beside the
|
- **Keep files.** PDFs, archives and recordings live in the tree beside the
|
||||||
notes about them, streamed to disk however large. PDFs, text, code, tables
|
notes about them, streamed to disk however large. PDFs, text, code, tables
|
||||||
and certificates open in place, and search reads the text files too.
|
and certificates open in place, and search reads the text files too.
|
||||||
- **Find.** Full-text search across a space or all of them (SQLite FTS5).
|
- **Find.** Full-text search across a space or all of them, documents, files,
|
||||||
|
cards and notes alike (SQLite FTS5).
|
||||||
- **Lose nothing.** Autosave that survives a dropped network, every earlier
|
- **Lose nothing.** Autosave that survives a dropped network, every earlier
|
||||||
version of a document as a diff, a trash with undo, an export that reads
|
version of a document as a diff, a trash with undo, an export that reads
|
||||||
without this app, and an import that takes it back.
|
without this app, and an import that takes it back.
|
||||||
- **Seal.** A vault: files sealed with AES-256-GCM under a password that is
|
- **Seal.** A vault: files sealed with AES-256-GCM under a password that is
|
||||||
never stored.
|
never stored.
|
||||||
- **Jot.** A scratchpad that drops down over whatever is on screen, for notes
|
- **Jot.** A scratchpad that drops down over whatever is on screen, even
|
||||||
taken in passing; one worth keeping becomes a document with one key.
|
mid-sentence, for notes taken in passing; one key makes a note a document, a
|
||||||
- **Capture.** A token per phone or script that puts a card in an inbox or a
|
card, or more of a document.
|
||||||
line in today's entry, and nothing else.
|
- **Capture.** A token per phone or script that puts a card in an inbox, a
|
||||||
|
note on the scratchpad or a line in today's entry, and nothing else.
|
||||||
- **Share.** Any document behind an unguessable, revocable read-only link.
|
- **Share.** Any document behind an unguessable, revocable read-only link.
|
||||||
- **Mount.** The whole workspace over SFTP, for an editor on another machine.
|
- **Mount.** The whole workspace over SFTP, for an editor on another machine.
|
||||||
- **Back up.** A mirror to Proton Drive, end-to-end encrypted, as a registered
|
- **Back up.** A mirror to Proton Drive, end-to-end encrypted, as a registered
|
||||||
@@ -61,6 +69,7 @@ Everything is also in the [wiki](https://github.com/narrrl/narl-workspace/wiki).
|
|||||||
|  |  |
|
|  |  |
|
||||||
|  |  |
|
|  |  |
|
||||||
|  |  |
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
@@ -129,7 +138,7 @@ it; in the document pane it is that document. In the browse pane:
|
|||||||
| `Ctrl-D` / `Ctrl-U` | half a page down / up the open document |
|
| `Ctrl-D` / `Ctrl-U` | half a page down / up the open document |
|
||||||
| `zl` / `zh`, `zL` / `zH` | scroll the table, code block or formula at the top of the view sideways, a little or by half its width |
|
| `zl` / `zh`, `zL` / `zH` | scroll the table, code block or formula at the top of the view sideways, a little or by half its width |
|
||||||
| `]]` / `[[` | the next / previous heading of the open document, in the editor too |
|
| `]]` / `[[` | the next / previous heading of the open document, in the editor too |
|
||||||
| `gi` | the info sheet: the open document's headings, earlier versions, backlinks, cards and the share link — `Tab` goes from one part to the next (`:info`); clicking the line under the title opens it too |
|
| `gi` | the info sheet: the open document's headings, earlier versions, backlinks, cards, files and the share link — `Tab` goes from one part to the next (`:info`); clicking the line under the title opens it too |
|
||||||
| `gO` | the info sheet at the headings — `j`/`k`, `Enter` jumps there (`:outline`) |
|
| `gO` | the info sheet at the headings — `j`/`k`, `Enter` jumps there (`:outline`) |
|
||||||
| `gx` | open the file under the cursor in a tab of its own |
|
| `gx` | open the file under the cursor in a tab of its own |
|
||||||
| `gh` | the info sheet at the earlier versions, as diffs — `j`/`k`, `Enter` brings one back (`:history`) |
|
| `gh` | the info sheet at the earlier versions, as diffs — `j`/`k`, `Enter` brings one back (`:history`) |
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 119 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 74 KiB |
@@ -1,19 +1,38 @@
|
|||||||
# The guide: a day with the workspace
|
# The guide: a day with the workspace
|
||||||
|
|
||||||
This page follows one ordinary day: the agenda in the morning, notes and cards
|
This page follows one ordinary day: the agenda in the morning, documents, notes
|
||||||
at work, a lecture in the afternoon, a thought on the way home, and the diary in
|
and cards at work, a lecture in the afternoon, a thought on the way home, and
|
||||||
the evening. Each part of the workspace is explained where it first comes up,
|
the diary in the evening. Each part of the workspace is explained where it first
|
||||||
with a link to the page that has the rest of it.
|
comes up, with a link to the page that has the rest of it.
|
||||||
|
|
||||||
The keys are the desktop's. On a phone, every one of these has a button; see
|
The keys are the desktop's. On a phone, every one of these has a button; see
|
||||||
[On a phone](#on-a-phone) at the end.
|
[On a phone](#on-a-phone) at the end.
|
||||||
|
|
||||||
|
## Four things, two screens
|
||||||
|
|
||||||
|
Everything you keep is one of four things:
|
||||||
|
|
||||||
|
| | what it is for | where it lives |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| **document** | the thorough record: a project, a runbook, lecture notes | the tree of a space, in folders |
|
||||||
|
| **card** | the short, actionable summary of work, with a due date and a checklist; it usually points at a document | the board of a space |
|
||||||
|
| **note** | a thought jotted down in passing, not sorted yet | the scratchpad, one for the whole workspace |
|
||||||
|
| **diary entry** | a document about one day | the diary space, by date |
|
||||||
|
|
||||||
|
A **file** — a PDF, an image, a log — is never on its own: it sits in a folder
|
||||||
|
beside the documents, or belongs to the one document it was put into.
|
||||||
|
|
||||||
|
They are shown on two screens. The **documents** screen has the list on the
|
||||||
|
left and the documents open in tiles beside it. The **plan** screen has the
|
||||||
|
board, the agenda and the calendar, and a card turned over. `S` goes from one to
|
||||||
|
the other, and each keeps what was on it. The scratchpad comes down over either.
|
||||||
|
|
||||||
## Morning: what needs you
|
## Morning: what needs you
|
||||||
|
|
||||||
The first time you open the workspace each day, the **agenda** opens by itself
|
The first time you open the workspace each day, the **agenda** opens by itself
|
||||||
when anything is late or due. Any other time, press `t`. It is on the plan
|
when anything is late or due. Any other time, press `t`. It is on the plan
|
||||||
screen, with the board and the calendar, in place of the documents; `S` goes
|
screen, with the board and the calendar; `Ctrl-h`/`j`/`k`/`l` walk between
|
||||||
there and back again, and `Ctrl-h`/`j`/`k`/`l` walk the tiles.
|
them.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -33,12 +52,12 @@ Walk it with `j` and `k`. On a card:
|
|||||||
- `Space` finishes it, where it stands;
|
- `Space` finishes it, where it stands;
|
||||||
- `D` gives it a due date: `fri`, `tm`, `+3d`, `10-31`;
|
- `D` gives it a due date: `fri`, `tm`, `+3d`, `10-31`;
|
||||||
- `H` and `L` move it to the list left or right on its board;
|
- `H` and `L` move it to the list left or right on its board;
|
||||||
- `Enter` goes to the card on its own board, in the tile beside.
|
- `Enter` goes to the card on its own board, turned over in the tile beside.
|
||||||
|
|
||||||
`Esc` closes the agenda's tile. The bar keeps showing the `late` and `today`
|
`q` goes back to the documents. The bar keeps showing the `late` and `today`
|
||||||
counts while either is above zero. More in [Boards and the agenda](Boards-and-Agenda.md).
|
counts while either is above zero. More in [Boards and the agenda](Boards-and-Agenda.md).
|
||||||
|
|
||||||
## At work: spaces, documents and tiles
|
## At work: documents
|
||||||
|
|
||||||
Press `2` for the `work` space. A **space** is one area of your life, with its
|
Press `2` for the `work` space. A **space** is one area of your life, with its
|
||||||
own folders, its own board and its own search. Make more with
|
own folders, its own board and its own search. Make more with
|
||||||
@@ -56,17 +75,17 @@ to it and press `L` instead: it opens in a **tile** of its own.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
`h` and `l` move between the tiles and back to the list, `Ctrl-h` and
|
`h` and `l` move between the tiles and back to the list, and `Ctrl-h` and
|
||||||
`Ctrl-l` from the editor too, `q` closes one, and `f` makes the focused one
|
`Ctrl-l` do the same from the editor. `q` closes a tile, and `f` makes the
|
||||||
fill the screen. Each space remembers
|
focused one fill the screen. Each space remembers its tiles, so switching away
|
||||||
its tiles, so switching away and back finds them as they were. More in
|
and back finds them as they were. More in
|
||||||
[Spaces and documents](Spaces-and-Documents.md).
|
[Spaces and documents](Spaces-and-Documents.md).
|
||||||
|
|
||||||
### Writing
|
### Writing
|
||||||
|
|
||||||
`i` edits the open document. The editor is CodeMirror with real vim keys:
|
`i` edits the open document. The editor is CodeMirror with real vim keys:
|
||||||
`ciw`, `dd`, visual mode, macros, `.` and the rest. What you write saves itself.
|
`ciw`, `dd`, visual mode, macros, `.` and the rest. `Esc` leaves insert mode,
|
||||||
`Esc` leaves insert mode, and `Esc` again or `:q` leaves the editor.
|
and `Esc` again or `:q` leaves the editor.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -79,16 +98,45 @@ to follow it.
|
|||||||
You do not need to save. Every keystroke goes to the browser's storage at
|
You do not need to save. Every keystroke goes to the browser's storage at
|
||||||
once, and to the server a couple of seconds after you stop typing. If the
|
once, and to the server a couple of seconds after you stop typing. If the
|
||||||
network is gone, the draft waits in the browser and is sent when it comes back.
|
network is gone, the draft waits in the browser and is sent when it comes back.
|
||||||
More in [Writing](Writing.md).
|
The same is true of a card's description and of a note: there is one editor,
|
||||||
|
and it works the same way everywhere. More in [Writing](Writing.md).
|
||||||
|
|
||||||
### Cards
|
### Everything about a document
|
||||||
|
|
||||||
|
`gi` opens the document's **info sheet**: its headings, its earlier versions,
|
||||||
|
the documents that link to it, the cards about it, its files, and whether it is
|
||||||
|
shared. `Tab` goes from one part to the next.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## At work: notes
|
||||||
|
|
||||||
|
Halfway through a paragraph a thought comes that belongs somewhere else.
|
||||||
|
`Ctrl-Q`, even in insert mode, brings the **scratchpad** down with the last
|
||||||
|
note open at its end. Write the thought, and `Ctrl-Q` again puts you back in
|
||||||
|
the document where you were, still writing. `:scratch <text>` takes a note from
|
||||||
|
the command line without the drawer.
|
||||||
|
|
||||||
|
`Q` brings the scratchpad down to sort it. Each note leaves in one of three
|
||||||
|
ways:
|
||||||
|
|
||||||
|
- `K` keeps it as a document, in the folder you are browsing;
|
||||||
|
- `C` makes it a card: the first line is the title, the rest the description;
|
||||||
|
- `A` puts it at the end of a document, picked by title.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The notes are found by `/` like everything else. More in
|
||||||
|
[Writing](Writing.md#the-scratchpad).
|
||||||
|
|
||||||
|
## At work: cards
|
||||||
|
|
||||||
In a meeting someone asks you to renew a certificate. Press `c`, type
|
In a meeting someone asks you to renew a certificate. Press `c`, type
|
||||||
`Renew the gateway certificate`, and `Enter`. The card is in this space's
|
`Renew the gateway certificate`, and `Enter`. The card is in this space's
|
||||||
inbox, and you have not left the document you were reading. Not a task? `Tab`
|
inbox, and you have not left what you were reading. When that was a document,
|
||||||
on the same line makes it a note on the scratchpad, and `Tab` again a timed line
|
the card is about it: it shows in the document's info sheet, and the
|
||||||
in today's diary entry. A note waits there until `K`, `C` or `A` turns it into a
|
document's meta line says what is due. `Tab` on the same line makes a note
|
||||||
document, a card, or more of a document.
|
instead, and `Tab` again a timed line in today's diary entry.
|
||||||
|
|
||||||
Press `b` to see the **board**, on the plan screen. A digit there shows the
|
Press `b` to see the **board**, on the plan screen. A digit there shows the
|
||||||
board of another space.
|
board of another space.
|
||||||
@@ -97,18 +145,24 @@ board of another space.
|
|||||||
|
|
||||||
The first list is the inbox and the last is done; the ones between are work in
|
The first list is the inbox and the last is done; the ones between are work in
|
||||||
hand. `h`/`l` move between lists and `j`/`k` between cards. `H`/`L` move a
|
hand. `h`/`l` move between lists and `j`/`k` between cards. `H`/`L` move a
|
||||||
card across, `Space` finishes it, and `D` sets its due date. `Enter` turns a
|
card across, `Space` finishes it, and `D` sets its due date. `:repeat weekly`
|
||||||
card over to its labels, description and checklist, in a tile beside, and
|
makes a card come back in the inbox each time it is finished.
|
||||||
`gf` opens its notes: a document made for the card the first time you ask,
|
|
||||||
opened among the documents, and `S` comes back to the board. `:repeat weekly` makes a
|
`Enter` turns a card over to its labels, description and checklist, in a tile
|
||||||
card come back in the inbox each time it is finished. `q` on the board goes
|
beside, and `q` turns it back. Keep the description short: the long version
|
||||||
back to the documents.
|
belongs in a document. `gf` opens the card's document, made the first time you
|
||||||
|
ask, among the documents; `S` comes back to the board.
|
||||||
|
|
||||||
|
The other way round works too. Reading a document, `gc` lists the cards about
|
||||||
|
it, and `:due`, `:label`, `Space`, `H` and `L` act on the one picked, without
|
||||||
|
going to the board.
|
||||||
|
|
||||||
### Finding things
|
### Finding things
|
||||||
|
|
||||||
`/` searches the space you are in, as you type. `Ctrl-P` searches every space.
|
`/` searches the space you are in, as you type, and `Ctrl-P` every space.
|
||||||
The search reads the documents and the text files in the tree: a log file is
|
The search reads the documents and the text files in the tree, then the cards
|
||||||
found by a line inside it, and the result shows the words around the match.
|
and the notes: a log file is found by a line inside it, and the result shows
|
||||||
|
the words around the match.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -123,9 +177,13 @@ LaTeX between dollar signs and drawn by KaTeX:
|
|||||||

|

|
||||||
|
|
||||||
The slides came as a PDF. Drop it onto the list, or `:upload`, and it is a
|
The slides came as a PDF. Drop it onto the list, or `:upload`, and it is a
|
||||||
file in the folder, beside the notes about it. `Enter` opens a PDF, an image, a
|
file in the folder, beside the notes about it. An image pasted into a document
|
||||||
video, a CSV table, a text or source file, or a certificate in place. Anything
|
while writing belongs to that document instead: it is in the document's info
|
||||||
else downloads with `:export`.
|
sheet, `za` folds it open under the document in the list, and it moves and goes
|
||||||
|
to the trash with it.
|
||||||
|
|
||||||
|
`Enter` opens a PDF, an image, a video, a CSV table, a text or source file, or
|
||||||
|
a certificate in place. Anything else downloads with `:export`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -137,7 +195,7 @@ never stored. See [The vault](Vault.md).
|
|||||||
|
|
||||||
A thought arrives when no tab is open. `:token add phone` makes a token. With
|
A thought arrives when no tab is open. `:token add phone` makes a token. With
|
||||||
it, an iPhone Shortcut, an Android HTTP Shortcut or a single `curl` puts a card
|
it, an iPhone Shortcut, an Android HTTP Shortcut or a single `curl` puts a card
|
||||||
in an inbox, or a line in today's diary entry:
|
in an inbox, a note on the scratchpad, or a line in today's diary entry:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -H "Authorization: Bearer nwc_…" -H 'content-type: application/json' \
|
curl -H "Authorization: Bearer nwc_…" -H 'content-type: application/json' \
|
||||||
@@ -151,10 +209,10 @@ The token can do this and nothing else. See [Capture](Capture.md).
|
|||||||
Press `T` for today's entry. If there is none yet it is started, from the
|
Press `T` for today's entry. If there is none yet it is started, from the
|
||||||
diary's `templates/day` document when there is one, and opens ready to write.
|
diary's `templates/day` document when there is one, and opens ready to write.
|
||||||
|
|
||||||
`C` shows the diary by month. A dot marks a day with an entry; `h`/`l`,
|
`C` shows the diary by month, on the plan screen. A dot marks a day with an
|
||||||
`j`/`k` and `H`/`L` move by day, week and month, and `Enter` opens the day,
|
entry; `h`/`l`, `j`/`k` and `H`/`L` move by day, week and month, and `Enter`
|
||||||
or starts an entry for it. In an entry, `[d` and `]d` step to the one before
|
opens the day among the documents, or starts an entry for it. In an entry, `[d`
|
||||||
and after.
|
and `]d` step to the one before and after.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ notes for work and for uni, a board per space, and the files that go with them.
|
|||||||
One user, one SQLite file, one binary. Everything is a key or a `:` command on
|
One user, one SQLite file, one binary. Everything is a key or a `:` command on
|
||||||
the desktop, and a button on the phone.
|
the desktop, and a button on the phone.
|
||||||
|
|
||||||
|
It keeps four things: **documents**, the thorough record; **cards**, the short
|
||||||
|
summary of work, usually about a document; **notes**, jotted in passing on the
|
||||||
|
scratchpad until they become one of the others; and **diary entries**. The
|
||||||
|
[guide](Guide.md#four-things-two-screens) says how they fit together.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Where to start
|
## Where to start
|
||||||
@@ -22,8 +27,8 @@ the desktop, and a button on the phone.
|
|||||||
| page | what it covers |
|
| page | what it covers |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [Spaces and documents](Spaces-and-Documents.md) | spaces, folders, the list, tiles, moving things |
|
| [Spaces and documents](Spaces-and-Documents.md) | spaces, folders, the list, tiles, moving things |
|
||||||
| [Writing](Writing.md) | the editor, vim, markdown, math, links between documents, templates |
|
| [Writing](Writing.md) | the editor, vim, the scratchpad, markdown, math, links between documents, templates |
|
||||||
| [Boards and the agenda](Boards-and-Agenda.md) | cards, due dates, cards that come back, the agenda |
|
| [Boards and the agenda](Boards-and-Agenda.md) | cards, due dates, cards that come back, the plan screen, the agenda |
|
||||||
| [The diary](Diary.md) | entries, today, the calendar, on this day |
|
| [The diary](Diary.md) | entries, today, the calendar, on this day |
|
||||||
| [Files and search](Files-and-Search.md) | uploads, what opens in place, full-text search |
|
| [Files and search](Files-and-Search.md) | uploads, what opens in place, full-text search |
|
||||||
| [Not losing things](Not-Losing-Things.md) | autosave, history, the trash, export and import |
|
| [Not losing things](Not-Losing-Things.md) | autosave, history, the trash, export and import |
|
||||||
@@ -47,3 +52,5 @@ the desktop, and a button on the phone.
|
|||||||
| The agenda: what is late, due, or in hand, on every board. | The diary by month. |
|
| The agenda: what is late, due, or in hand, on every board. | The diary by month. |
|
||||||
|  |  |
|
|  |  |
|
||||||
| A search finds the text inside files too. | Certificates and keys are read on the server. |
|
| A search finds the text inside files too. | Certificates and keys are read on the server. |
|
||||||
|
|  |  |
|
||||||
|
| The scratchpad, lowered over the documents. | The cards about a document, in its info sheet. |
|
||||||
@@ -68,9 +68,13 @@ linked to from anywhere behind the login.
|
|||||||
The line under the title says when it was written and last edited, how many
|
The line under the title says when it was written and last edited, how many
|
||||||
words it has, how many documents link to it, and whether it is public. Click it,
|
words it has, how many documents link to it, and whether it is public. Click it,
|
||||||
or press `gi`, for the info sheet: the document's headings, its earlier
|
or press `gi`, for the info sheet: the document's headings, its earlier
|
||||||
versions, the documents that link to it and its share link, one part at a time
|
versions, the documents that link to it, the cards about it, its files and its
|
||||||
— `Tab` goes to the next. `gO`, `gh` and `gb` open it at their own part. In the
|
share link, one part at a time — `Tab` goes to the next. `gO`, `gh`, `gb` and
|
||||||
reader:
|
`gc` open it at their own part.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
In the reader:
|
||||||
|
|
||||||
| key | what it does |
|
| key | what it does |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -63,8 +63,11 @@ desktop lowers its own; `Q`, `q` or `Esc` raises it again, and what was on
|
|||||||
screen is as it was. `Ctrl-Q` works from anywhere, the editor included: the
|
screen is as it was. `Ctrl-Q` works from anywhere, the editor included: the
|
||||||
scratchpad comes down with the last note being written, at its end, and
|
scratchpad comes down with the last note being written, at its end, and
|
||||||
`Ctrl-Q` again puts it away and goes back to the document, still writing where
|
`Ctrl-Q` again puts it away and goes back to the document, still writing where
|
||||||
it was left. Firefox quits on `Ctrl-Q`, so there it is `Q` only. Its notes have no name, no space and no folder: a note is
|
it was left. Firefox quits on `Ctrl-Q`, so there it is `Q` only. Its notes have no name,
|
||||||
a body and the time it was last touched, newest on top.
|
no space and no folder: a note is a body and the time it was last touched,
|
||||||
|
newest on top.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
| key | what it does |
|
| key | what it does |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -278,6 +278,13 @@ await doc(thesis.id, 'Outline', `## Chapters\n\n1. Introduction\n2. Related work
|
|||||||
const uniLists = (await api('GET', `/spaces/${uni}/board`)).lists as { id: number }[]
|
const uniLists = (await api('GET', `/spaces/${uni}/board`)).lists as { id: number }[]
|
||||||
await api('POST', `/lists/${uniLists[0].id}/cards`, { title: 'Hand in exercise sheet 4', due_at: at(2, 10) })
|
await api('POST', `/lists/${uniLists[0].id}/cards`, { title: 'Hand in exercise sheet 4', due_at: at(2, 10) })
|
||||||
|
|
||||||
|
// The scratchpad: what was jotted down in passing, waiting to be sorted.
|
||||||
|
for (const note of [
|
||||||
|
'tariffs-api added valid_from — ask whether it is a date or a timestamp',
|
||||||
|
'idea: show the run progress per source in the status page',
|
||||||
|
'# Dead-letter queue\nkeep failed jobs for 7 days, replay by hand',
|
||||||
|
]) await api('POST', '/scratch', { body: note })
|
||||||
|
|
||||||
// home
|
// home
|
||||||
await doc(home, 'Groceries', `- oat milk\n- coffee\n- lemons\n`)
|
await doc(home, 'Groceries', `- oat milk\n- coffee\n- lemons\n`)
|
||||||
await api('PUT', `/nodes/${home}`, { name: 'home', has_board: false })
|
await api('PUT', `/nodes/${home}`, { name: 'home', has_board: false })
|
||||||
@@ -339,15 +346,10 @@ const named: Record<string, { code: string; keyCode: number }> = {
|
|||||||
Tab: { code: 'Tab', keyCode: 9 },
|
Tab: { code: 'Tab', keyCode: 9 },
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Keys as typed: `gh`, `?`, `<Escape>` for a named one, `<A-h>` with Alt. */
|
/** Keys as typed: `gh`, `?`, `<Escape>` for a named one. */
|
||||||
async function keys(sequence: string, pause = 250) {
|
async function keys(sequence: string, pause = 250) {
|
||||||
for (const token of sequence.match(/<A-\w>|<\w+>|./g) ?? []) {
|
for (const token of sequence.match(/<\w+>|./g) ?? []) {
|
||||||
if (token.startsWith('<A-')) {
|
if (token.startsWith('<')) {
|
||||||
const key = token[3]
|
|
||||||
const params = { key, code: `Key${key.toUpperCase()}`, modifiers: 1 }
|
|
||||||
await send('Input.dispatchKeyEvent', { type: 'rawKeyDown', ...params })
|
|
||||||
await send('Input.dispatchKeyEvent', { type: 'keyUp', ...params })
|
|
||||||
} else if (token.startsWith('<')) {
|
|
||||||
const key = token.slice(1, -1)
|
const key = token.slice(1, -1)
|
||||||
const { code, keyCode } = named[key]
|
const { code, keyCode } = named[key]
|
||||||
const text = key === 'Enter' ? '\r' : undefined
|
const text = key === 'Enter' ? '\r' : undefined
|
||||||
@@ -393,7 +395,7 @@ await shot('document')
|
|||||||
await open('/n/work/projects')
|
await open('/n/work/projects')
|
||||||
await keys('jl')
|
await keys('jl')
|
||||||
await sleep(800)
|
await sleep(800)
|
||||||
await keys('<A-h>kL')
|
await keys('hkL')
|
||||||
await sleep(800)
|
await sleep(800)
|
||||||
await shot('tiles')
|
await shot('tiles')
|
||||||
|
|
||||||
@@ -402,6 +404,11 @@ await keys('gh', 400)
|
|||||||
await sleep(800)
|
await sleep(800)
|
||||||
await shot('history')
|
await shot('history')
|
||||||
|
|
||||||
|
await open('/n/work/projects/ingest-pipeline')
|
||||||
|
await keys('gc', 400)
|
||||||
|
await sleep(800)
|
||||||
|
await shot('info')
|
||||||
|
|
||||||
await open('/n/work/runbook')
|
await open('/n/work/runbook')
|
||||||
await keys('i')
|
await keys('i')
|
||||||
await sleep(500)
|
await sleep(500)
|
||||||
@@ -430,6 +437,12 @@ await sleep(800)
|
|||||||
await shot('calendar')
|
await shot('calendar')
|
||||||
await keys('<Escape>')
|
await keys('<Escape>')
|
||||||
|
|
||||||
|
await open('/n/work/runbook')
|
||||||
|
await keys('Q')
|
||||||
|
await sleep(800)
|
||||||
|
await shot('scratch')
|
||||||
|
await keys('<Escape>')
|
||||||
|
|
||||||
await open('/n/work')
|
await open('/n/work')
|
||||||
await keys('/')
|
await keys('/')
|
||||||
await send('Input.insertText', { text: 'tariffs' })
|
await send('Input.insertText', { text: 'tariffs' })
|
||||||
|
|||||||