diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 02e12cc..289dd87 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,13 +1,21 @@ name: Documentation -# The docs are built on every push so a broken build is caught immediately, but -# only published once GitHub Pages has been enabled for the repository. Until the -# owner decides to publish, this job builds and stops. +# Built on every push, and published from main. # -# And on pull requests, where the build is the only check there is: `mkdocs build -# --strict` fails on a link to a page that does not exist, and building only after -# the merge means finding that out on `main`. Nothing is published from a pull -# request — the `deploy` job below runs on a manual dispatch and nothing else. +# The publishing used to wait for a manual dispatch, with a note saying it would +# run "once Pages is enabled". Pages was enabled — and the condition was never +# changed, so the site was built forty times and published none of them. What it +# showed was a Verdande from before v0.43: /links/, /beacon/ and /notifications/ +# all answered 404, months after they were written. Nothing failed, because +# building *is* what the job was asked to do. +# +# The lesson is not about this line. It is that "publish later" needs something +# that fails when later arrives — a switch that is off and silent looks exactly +# like a switch that is on. +# +# Pull requests still build and never publish: `mkdocs build --strict` fails on a +# link to a page that does not exist, and building only after the merge means +# finding that out on `main`. on: push: branches: [main] @@ -54,9 +62,9 @@ jobs: deploy: needs: build runs-on: ubuntu-latest - # Only runs once Pages is enabled. Until then the build above still guards - # against a broken docs tree. - if: github.event_name == 'workflow_dispatch' + # From main, and by hand. Never from a pull request — a fork could otherwise + # publish over the site by opening one. + if: github.event_name != 'pull_request' environment: name: github-pages url: ${{ steps.deploy.outputs.page_url }} diff --git a/README.md b/README.md index 3bb4cdc..839318e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ Which is what a to-do list is. All six phases are built. See [What works today](#what-works-today) for what is tested and what is not. -Documentation: [`docs/`](docs/), built with Material for MkDocs. +Documentation: **** — the source is in +[`docs/`](docs/), built with Material for MkDocs and published from `main`. ## Why this exists @@ -43,6 +44,10 @@ and an MCP endpoint so Claude can work your task list directly. the text, which shares it with her and tells her. `#project` and `[[another note]]` are links, and a task shows the notes that mention it. A zip of Markdown goes in — Obsidian, Bear, or Apple Notes through the exporter in [`tools/`](tools/) — and comes back out the same shape. +- **Notes are sealed at rest.** Title and body are encrypted in the database under + a key in a file beside it — the title too, because a title beside a sealed body + leaves the beginning of every note in the open. A copy of the file is not a copy + of the notes. - **Drag where it means something.** Reorder a list or a board, file a project under a group, drop a task on another project, or drop it on another day. - **Sharing.** Owner, editor and viewer roles. There is no open registration: @@ -128,6 +133,17 @@ Apple Reminders, forward mail into it, and add it to Claude as a connector. | OpenAPI 3.1 spec, checked against the router | Done, tested | | End-to-end smoke tests (Playwright) | Done | | Documentation, landing page, licence | Done | +| Notes sealed at rest: title and body encrypted in the database | Done, tested | +| `@name` in a note shares it with that person, and tells them | Done, tested | +| Share a project with somebody who already has an account, by name | Done, tested | +| Invitations that have not been taken up stay visible, and can be withdrawn | Done, tested | +| Told when a project is shared with you — and able to leave it | Done, tested | +| Push from other programs: a webhook address per person | Done, tested | +| Today's plan as a card on **I dag**, not only as a notification | Done, tested | +| Search the settings, from the page or from ⌘K | Done, tested | +| Choose which browser a link opens in | Done, tested | +| Images in notes: open full size, copy to the clipboard | Done, tested | +| Install count: two values, once a day, one click to stop | Done, tested | **Not finished:** Web Push, the AI providers and the Google Calendar API calls are implemented against their specifications and have only ever been exercised there, diff --git a/docs/notes.md b/docs/notes.md index 89fe064..2cf66be 100644 --- a/docs/notes.md +++ b/docs/notes.md @@ -138,6 +138,14 @@ Search finds a word wherever it is: body. A word in the title is what the note is about; the same word once in a long body is a mention. +Two places to search from, and they now agree. The field above the list filters it +in place. **⌘K** searches everything at once — tasks, projects, notes and the +settings — and picking a note from it opens that note *with the rest of the matches +still in the list beside it*. It used to drop you on the ordinary list, so the +other results existed only in the popup you had just closed. The address carries +the search, which also means a search worth keeping can be bookmarked or sent to +somebody. + ## Putting notes away Two different things, and the difference matters: