A PDF was searchable on a device once that device had opened it, because the extracted text lived in that browser's IndexedDB and nowhere else. So a document imported on the desktop was invisible to a search on the phone — which is exactly the case that matters for filing invoices, since those are imported and then never opened again. The reading still never happens on the server. It has no PDF library and is not getting one: the bytes arrive encrypted and are stored that way. The device that imports the file reads it there and then, and the result is stored beside the file in attachments.text_index, encrypted at rest like everything else and opaque to the server. Every other device asks for it after login and can then find a document it has never downloaded. Not storing it was the earlier decision, on the reasoning that text derivable from bytes the server already holds should not be kept twice. True, and useless. A few hundred kilobytes against a file measured in megabytes is a trade worth making. A `null` answer is not an error — it means nobody has read this file yet. Documents extracted before this existed are sent up the next time they are opened. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
152 lines
6.1 KiB
Markdown
152 lines
6.1 KiB
Markdown
# Changelog
|
|
|
|
What changed, newest first. One entry per round that went out as an image, with
|
|
the digests, so it stays possible to tell what is actually running on the server.
|
|
|
|
Digests are recorded from the registry (`docker buildx imagetools inspect`),
|
|
not from the output of `docker push`.
|
|
|
|
---
|
|
|
|
## Unreleased
|
|
|
|
**Added**
|
|
- **A PDF is searchable on every device, not only on the one that opened it.**
|
|
The device that imports the file reads it there and then — the server still has
|
|
no PDF library and never opens one — and the extracted text is stored beside
|
|
the file, encrypted, so every other device can find the document without ever
|
|
downloading it. This is what makes an archive of scanned invoices work: they
|
|
are filed and then never opened, so waiting for someone to open one meant
|
|
waiting forever.
|
|
- **A drawing runs over as many pages as the note has.** The ink used to be stuck
|
|
on page one while the writing carried on without it. Pages are numbered the way
|
|
the PDF reader numbers them, and there is always one blank page past the end to
|
|
start a new one on. The bin clears the page being looked at; undo still works on
|
|
the drawing as a whole.
|
|
- A drawing that lives entirely on page one is still stored in the old shape, so
|
|
an ordinary note is written exactly as it always was and an older client still
|
|
shows it.
|
|
|
|
**Fixed**
|
|
- **A drawing exported in a ZIP was lost on re-import.** The exporter has written
|
|
`drawings/<note>.png` since the interface was put into English; the importer
|
|
was still looking for `zeichnungen/<note>.png` and found nothing. Both names
|
|
are read now, and so are the further pages of a drawing.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — The writing column
|
|
|
|
**Images** — web `sha256:ed11f034…`, server unchanged at `sha256:1648498f…`
|
|
|
|
**Changed**
|
|
- The note column is centred again. It had been pinned to the left margin so the
|
|
start of every line would always be in the same place; on a wide window that
|
|
left the whole right half of the pane as one dead block.
|
|
- A page surface was drawn behind the text to give that block a meaning, and
|
|
reverted the same day: it made the sheet sit hard against the left edge, which
|
|
was worse than the problem it solved.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — Pages, typefaces, alignment
|
|
|
|
**Images** — web `sha256:3b040d99…`, server `sha256:1648498f…`
|
|
|
|
**Added**
|
|
- **Page count while writing.** The toolbar says *Page 2 of 4*, in the same words
|
|
the PDF reader uses. Pages are counted, never stored: the note stays one
|
|
document, and a test asserts no page ever reaches the stored body.
|
|
- **The typeface is a per-account setting** — serif, sans or mono, chosen under
|
|
Account → Profile. On the account rather than in the browser, so it follows you
|
|
to the phone.
|
|
- **Text alignment**, with its own TipTap extension rather than the official one,
|
|
so the schema stays in files this project owns. Left is the default and is
|
|
never written into the document. In Markdown, non-left blocks travel as
|
|
`<div align="…">` — the one form most readers still honour — and the importer
|
|
reads it back onto the paragraphs.
|
|
|
|
**Fixed**
|
|
- The Markdown exporter did not put a blank line between top-level blocks, so
|
|
consecutive paragraphs ran together in other readers.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — English throughout, and the PDF toolbar
|
|
|
|
**Added**
|
|
- **Search inside a notebook**, from the note list. The sidebar's global search
|
|
was removed: searching from inside a notebook should mean searching *that*
|
|
notebook.
|
|
- **New note / Upload PDF / Import Markdown** all live under the one `+` button.
|
|
|
|
**Changed**
|
|
- The interface is English throughout. It had drifted into two languages.
|
|
- The two visibility switches — drawing and margin notes — sit together at the
|
|
far right of the PDF toolbar, because they mean the same kind of thing.
|
|
- The drawing tools appear next to the *Draw* button, not past everything else.
|
|
- A separator is renamed and removed by right-click, with a confirmation for the
|
|
removal.
|
|
|
|
**Fixed**
|
|
- Hiding the drawing also hid the margin notes. Each switch now hides only its
|
|
own thing.
|
|
|
|
---
|
|
|
|
## 2026-08-10 — Notes on passages
|
|
|
|
**Added**
|
|
- **Pinned notes in a PDF.** A remark can be attached to a passage, and is shown
|
|
in the margin beside the page — not written on top of it. On a phone, where
|
|
there is no margin, the same notes open as a bottom sheet.
|
|
- **Margin notes can be linked from the notes panel**, so a pinned remark can be
|
|
written about at length and still lead back to the passage it came from.
|
|
|
|
**Fixed**
|
|
- A grey drag indicator stayed visible in the note list after a drag. It was a
|
|
`borderTop` sitting beside a `border` shorthand in one style object.
|
|
- The server stored an overlay holding only pinned notes as `NULL`, throwing
|
|
every one of them away, because it counted strokes and nothing else.
|
|
|
|
---
|
|
|
|
## 2026-08-09 — Arranging a notebook
|
|
|
|
**Added**
|
|
- **Sorting per notebook**, remembered on the notebook itself, including an
|
|
arrangement made by hand — which comes back intact after filtering.
|
|
- **Separators** to group notes inside a hand-made arrangement.
|
|
- **Markdown import**, single files or a ZIP this app exported.
|
|
- **Moving notes between notebooks.**
|
|
|
|
**Fixed**
|
|
- Switching to Draw shrank the page from 733px to 460px. The editor was a flex
|
|
item at the default `flex: 0 1 auto`, so it was only as wide as its widest row
|
|
— the toolbar, which loses a dozen buttons in Draw.
|
|
|
|
---
|
|
|
|
## 2026-08-08 — PDFs
|
|
|
|
**Added**
|
|
- Import a PDF, read it, select its text, draw on each page, and export it with
|
|
the drawings written in.
|
|
- Notes written beside a PDF.
|
|
- Uploaded files are encrypted at rest, like note bodies already were, and stored
|
|
as deduplicated, content-addressed attachments.
|
|
- Unused attachments are freed; versions are kept by count rather than by age.
|
|
- Export as Markdown or PDF; the browser suites moved into the repository.
|
|
|
|
**Changed**
|
|
- Vector clocks were never read. Replaced with a conflict check that works.
|
|
- Public sign-up removed — an administrator creates the accounts.
|
|
|
|
---
|
|
|
|
## Earlier
|
|
|
|
TipTap editor, version history, full-text search and attachments (2026-08-07);
|
|
drawing sync with WebP/JPEG support (2026-06-21); the first syncing alpha and PWA
|
|
(2026-02-18).
|