678 lines
33 KiB
Markdown
678 lines
33 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`.
|
|
|
|
---
|
|
|
|
## 2026-08-17 — A chapter with an order of its own
|
|
|
|
**Images** — web `sha256:b7c9f8b7…`, server `sha256:a0fd140a…`
|
|
|
|
The server image changed: `sort_mode` on chapters.
|
|
|
|
**Added**
|
|
- **A chapter orders its own notes**, chosen in the same dialog as its name, mark
|
|
and colour — they are one decision about one thing. The notebook's setting
|
|
governs the notebook's own list; a chapter is a place someone made and filled,
|
|
so a reference chapter can stay alphabetical while the notebook around it stays
|
|
as it was arranged. It starts in the hand-made order, and a chapter put in one
|
|
of the others loses its lines and its handles exactly as the notebook does —
|
|
neither means anything against an order the app is choosing.
|
|
|
|
**Fixed**
|
|
- **A line still would not go under another line.** The comparator was only half
|
|
of it. The write was then thrown away by the "did anything change?" test, which
|
|
**sorted** the separators before comparing them — to ignore the other chapters'
|
|
lines riding along in the same field — and a sorted comparison cannot see a
|
|
sequence. Two lines in one gap carry the same position, so swapping them changes
|
|
nothing else. It compares this list's own lines, in order.
|
|
- **An open chapter swelled while rearranging.** The strips at the two ends of its
|
|
list stood open for the whole of the mode, adding half a finger of empty space
|
|
inside every chapter — which read as though the notes in it had grown. They are
|
|
thin now, and only there while something is actually being carried.
|
|
|
|
---
|
|
|
|
## 2026-08-17 — A chapter is a list too, and deleting stops moving things
|
|
|
|
**Images** — web `sha256:c1bcdcc4…`, server `sha256:6c9af404…`
|
|
|
|
No backend source changed this round; the server digest moved only because
|
|
`build.sh` builds both and a rebuild is not bit-identical.
|
|
|
|
**Fixed**
|
|
- **Deleting a note moved everything else.** A row leaving is the same problem as
|
|
a row arriving, in reverse: a line's position counts the rows above it, so a
|
|
note deleted above a line left the line counting rows that were no longer
|
|
there, and everything under it appeared to jump up past it. Every place a row
|
|
leaves a list now closes the gap — the bin, a move to another notebook or
|
|
chapter, and a chapter being removed. Coming back from the bin, or arriving by
|
|
a move, lands at the top like anything else arriving; an old position belongs
|
|
to an arrangement that has moved on.
|
|
- **A line could not be dragged under another line.** Two lines in the same gap
|
|
carry the same position, and the comparator said "a separator comes first"
|
|
without asking what the other one was — claiming both directions at once for
|
|
that case. A comparator that contradicts itself has no defined result, so the
|
|
sort returned them in whichever order it happened to walk, and the line sprang
|
|
back above every time. They keep the order they are written in now.
|
|
- **Removing a chapter is two moves, and only one was being made.** Its row
|
|
leaves the count, *and* the notes it held arrive in the notebook — at the top,
|
|
in the order they had inside it, since their old positions were numbered
|
|
against a list that no longer exists.
|
|
|
|
**Changed**
|
|
- **A chapter is always in the user's own order, and can be arranged like any
|
|
other list.** Its notes wear handles under the *same* switch as the list beside
|
|
them — two switches for two lists looked at together is one too many — and are
|
|
dragged among themselves, strips at both ends included. The two lists keep out
|
|
of each other's way by scope: a chapter unfolded under its row holds rows
|
|
inside a row of the notebook's list, so "the nearest row above the pointer"
|
|
cannot say which list a drag belongs to.
|
|
- **The sort menu is gone inside a chapter.** The mode belongs to the notebook
|
|
and governs the notebook's own list; a chapter is a place someone filled by
|
|
hand, and a menu there would offer a choice that cannot be honoured.
|
|
|
|
---
|
|
|
|
## 2026-08-17 — One direction to drop in, and a new note that stays on top
|
|
|
|
**Images** — web `sha256:b8bc284a…`, server `sha256:a66cc8eb…`
|
|
|
|
No backend source changed this round; the server digest moved only because
|
|
`build.sh` builds both and a rebuild is not bit-identical.
|
|
|
|
**Fixed**
|
|
- **Every new note pulled the arrangement apart.** A note was made with no
|
|
position at all and left to the tie-break, which put it near the top by age —
|
|
which is not the same thing. A separator's position counts the rows above it,
|
|
so a row appearing without a renumber left every line one row too high, and a
|
|
little more of the notebook's order came undone with each note. A new note is
|
|
now put at the very top and the list is renumbered to say so; every other row
|
|
keeps its place, lines included. Rows that had never been dragged stop sliding
|
|
about as they are edited, because they now carry a position of their own.
|
|
- **A chapter could only be dropped *into*, never dragged past.** Taking the
|
|
whole row as a place quietly took reordering away: a chapter could not be moved
|
|
among its neighbours, and nothing — note or line — could be put in the gap
|
|
under one. The **bottom edge of a chapter's header is that gap** now; the rest
|
|
of the row is still the chapter, and still lights up to say so.
|
|
- **A link showed the sheet of paper whatever it pointed at**, despite last
|
|
round's work. Two things: the `@` menu drew each note's own mark but dropped it
|
|
on the way into the link, and the refresh that keeps a link's label and mark
|
|
current ran once, while the editor was still empty — the note's content is
|
|
poured in afterwards, deliberately without an update event, so nothing ever
|
|
looked again. It now runs whenever the document changes.
|
|
- **The mark in the title bar sat above the line of the title.** Both boxes were
|
|
centred, which is not the same as being on one line: a title's box is taller
|
|
than its letters by the depth of a descender, so its capitals sit above the
|
|
middle while an emoji's picture fills its box. Measured, the mark was 2px high
|
|
and dipped below a line the title never crossed. They share a **baseline** now,
|
|
which needs no number.
|
|
- **The task list's box hung off the line it belonged to.** Centred in the full
|
|
line it was a 15px square against a 10px letter, its top level with the
|
|
capitals and its bottom 4px past the baseline. It is centred on the *letters*
|
|
and sized in em, so it stays the size of a capital at every type size.
|
|
|
|
**Changed**
|
|
- **A drop lands the row under the one it was released on, and only there.**
|
|
Dropping above a row and dropping below the row before it are the same move
|
|
described twice, so every gap could be aimed at from two sides — hard to aim
|
|
at, harder to read. There is now a strip **above the first row** as well as
|
|
below the last, because that is the one place a drop *under* something cannot
|
|
reach.
|
|
- ***Move to…* is divided under headings** — the notebook itself, *Chapters
|
|
here*, *Other notebooks* — instead of running two kinds of place together with
|
|
a rule between them. The headings are deliberately not shaped like entries: one
|
|
built like a menu row is a button that does nothing when pressed. Each row
|
|
carries the mark its chapter was given or the cover its notebook wears.
|
|
|
|
---
|
|
|
|
## 2026-08-17 — One dialog per thing, and rows dragged into a chapter
|
|
|
|
**Images** — web `sha256:18a68a2d…`, server `sha256:febc4b93…`
|
|
|
|
No backend source changed this round; the server digest moved only because
|
|
`build.sh` builds both and a rebuild is not bit-identical.
|
|
|
|
**Changed**
|
|
- **A separator has one *Edit*** instead of rename, colour and line as three
|
|
entries — and the dialog **draws the line as it will look**, with each of the
|
|
five shapes drawn beside its name. Choosing "dotted" from a list of words was a
|
|
guess. The preview is built from the very rules the list draws with; a sample
|
|
that can disagree with the result is worse than none. Renaming in the row
|
|
itself is gone with it.
|
|
- **A chapter likewise**: name, mark and colour in one dialog, the same one
|
|
whether it is being made or changed, with the row drawn at the top. Asked from
|
|
three menu entries, getting a new chapter to look right took three visits.
|
|
- **A row is put into a chapter by dragging it onto it.** The chapter lights up
|
|
and takes what is dropped, rather than growing a drop line above it — it is a
|
|
place, not a neighbour. Notes and separators both. The **"+ Separator" inside
|
|
a chapter is gone**: a line is drawn in the notebook and dragged in.
|
|
- **A link wears the mark of the note it points at**, in the text and in the
|
|
`@` menu, instead of the same sheet-of-paper glyph for everything.
|
|
|
|
**Fixed**
|
|
- **A task list's checkbox sat above the line it belonged to.** It was nudged
|
|
down by a fixed `0.35em`, measured once against one font at one size. It is
|
|
centred in a box exactly one line tall now, which holds at every size and for
|
|
tasks that wrap.
|
|
- **The title bar read as crooked.** The mark was a child of the header and got
|
|
the same spacing as the buttons at the far end, so it looked like a control
|
|
parked beside the title; and the box grew with its contents, so choosing an
|
|
emoji shifted the title sideways. Mark and name are one group in a fixed box.
|
|
|
|
---
|
|
|
|
## 2026-08-16 — Marks, lines, and a table that breaks
|
|
|
|
**Images** — web `sha256:1f9f5141…`, server `sha256:3b2f8b44…`
|
|
|
|
The server image changed: `icon` on notes and chapters, `icon_color` on notes,
|
|
colour and style on separators, and a fix to clearing a chapter's colour.
|
|
|
|
**Added**
|
|
- **A note and a chapter can wear a mark of their own** beside the name, chosen
|
|
from a short list searched by what a thing is *for* — "invoice", "house",
|
|
"travel" — rather than from the system emoji keyboard, which is a different
|
|
thing on every machine. The same glyph shows in the list and above the editor.
|
|
A note's mark takes a colour too.
|
|
- **A separator takes its own colour and one of five shapes** — solid, dashed,
|
|
dotted, double, thick. Three lines through one notebook read as the same line
|
|
repeated when they are all faint grey.
|
|
- **A chapter can be divided like the notebook it sits in.** Both places a
|
|
chapter is shown now draw it with one component, so it cannot be divisible in
|
|
the column and not in the unfolded block.
|
|
|
|
**Fixed**
|
|
- **A long table lay straight across the gap between two sheets**, with a row cut
|
|
in half — and a shorter one jumped to the next sheet whole, leaving the rest of
|
|
the first blank. Tables are broken **between their rows** now, which is where a
|
|
table breaks on paper. The spacer there is a `tr` with one borderless cell: a
|
|
`div` inside a `tbody` is not something the browser keeps.
|
|
- **A dialog closed in the middle of an edit** if a selection was dragged past
|
|
its edge. The click lands on the nearest common ancestor of press and release —
|
|
the backdrop — and every dialog read that as "clicked beside me". They now
|
|
remember where the press began. All ten of them.
|
|
- **A chapter's colour could not be cleared.** "None" sent null, and the update
|
|
rode on `COALESCE`, which reads null as "leave it alone".
|
|
- **Three entries in the table's right-click menu were still German.**
|
|
|
|
**Changed**
|
|
- **A table's header row is legible on the dark theme**: its own fill rather than
|
|
the general "slightly off the page" grey, and a rule under it.
|
|
- **Opening a notebook opens its first note**, on a wide screen. On a phone the
|
|
list is the screen, so opening a note there would hide the notebook.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — A notebook opens in its own order
|
|
|
|
**Images** — web `sha256:c077f0e0…`, server `sha256:c13af5d5…`
|
|
|
|
No backend source changed this round; the server digest moved only because
|
|
`build.sh` builds both and a rebuild is not bit-identical.
|
|
|
|
**Fixed**
|
|
- **Removing a chapter left you stuck in the confirmation.** Every destructive
|
|
action goes through one helper that takes the question down again; this one
|
|
set the dialog directly and bypassed it, so the chapter was removed and the
|
|
prompt stayed over the app with nothing but a reload to get out of. Closing is
|
|
now done where the dialog is rendered, so it happens whoever asked.
|
|
The suites had **checked the list straight through the overlay** — which is in
|
|
the DOM the whole time — and passed. Both now assert the question is gone.
|
|
- **The separator button appeared to do nothing** in any order but the hand-made
|
|
one, because that is the only order a line shows in. The button is now only
|
|
there in that order.
|
|
|
|
**Changed**
|
|
- **A notebook starts in the hand-made order.** That is where its own
|
|
arrangement lives — lines show, rows can be dragged into place. A notebook
|
|
nobody has arranged still reads newest-first, since untouched rows share
|
|
position 0. The views ("All Notes", "Starred", the bin) keep "last changed":
|
|
they are questions asked of every notebook at once and have nowhere to keep an
|
|
arrangement.
|
|
- **The separator is smaller and no wider than its name.** The label sat in a
|
|
fixed 132px slot — chosen so the row would not jump when renaming began — with
|
|
a short name floating in a gap it did not fill. It is sized to the name now,
|
|
between a floor and a ceiling, with less room above it and smaller type.
|
|
- **A chapter has one menu entry for its name and colour**, not two. The
|
|
"Colour" submenu sat beside "Rename" offering half of what the dialog already
|
|
does, and read as a different thing.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — A chapter you can see, in the colour you chose
|
|
|
|
**Images** — web `sha256:65799ecb…`, server `sha256:a51b96ad…`
|
|
|
|
No backend source changed this round. The server digest moved anyway because
|
|
`build.sh` builds both images and a rebuild is not bit-identical — the image is
|
|
the same code as `sha256:ed0b9970…`.
|
|
|
|
**Fixed**
|
|
- **A chapter did not show until the notebook had a note in it.** "Nothing here"
|
|
was asked of the notes alone, so a notebook whose only contents were chapters
|
|
showed the empty-list panel with the chapters hidden behind it — making a
|
|
chapter in a fresh notebook appeared to do nothing at all. It is now asked of
|
|
every row, and a notebook with chapters but no loose notes says so in one line
|
|
rather than looking like a list that failed to load.
|
|
|
|
**Changed**
|
|
- **A chapter's colour is chosen while it is being made**, in the same dialog as
|
|
its name. It is what tells one chapter from the next, and having to right-click
|
|
a fresh one to say which it is meant two visits for one decision. Renaming and
|
|
recolouring later are one entry in its menu, and one write.
|
|
- **The word *here* is gone.** The line along the top of the pane says which of
|
|
the two places you are in; saying it twice was noise.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — A filed note stays filed
|
|
|
|
**Images** — web `sha256:2041f103…`, server `sha256:ed0b9970…`
|
|
|
|
The server image changed: the bin now hands back a note's chapter with it.
|
|
|
|
**Fixed**
|
|
- **A note put into a chapter came back out of it by itself**, a few seconds
|
|
later. The server had filed it correctly the whole time; the sync that follows
|
|
rebuilds every local note from the server's answer, and the function doing
|
|
that never carried `chapter_id` — so each sync handed back a note belonging to
|
|
no chapter and the notebook's list took it in again. The bin's query left the
|
|
column out too, which would have unfiled anything restored from it.
|
|
- **A separator drawn in a notebook vanished when a chapter was opened.** "Which
|
|
chapter is open" and "which list is on screen" were one value. Opened beside or
|
|
below, the list still shows the notebook — but everything around it had
|
|
switched to the chapter, so the notebook's own separators were filtered away
|
|
and a drag among its rows was measured against the chapter's notes, found
|
|
nothing, and did nothing.
|
|
|
|
**Changed**
|
|
- **Rearranging is a mode now.** The handle button beside the sort menu switches
|
|
it on; until then no row shows its grip and none can be dragged, and it goes
|
|
off again by itself when the list is left. Six dots stood beside every title
|
|
all the time for something done rarely, and an ordinary press could carry a
|
|
row off.
|
|
- **Filing a note is back in the row's own menu** and the button that had
|
|
appeared in every row is gone, with the dialog behind it. It belongs with
|
|
starring, exporting and discarding — things done to a row, in one place.
|
|
- **Which place a new note lands in is now visible and yours to choose.** With a
|
|
chapter open beside or below, the notebook's list and the chapter are both on
|
|
screen: pressing in either makes it the one being worked in, marked with a line
|
|
along its top and the word *here*, and the + button names it. Before, a new
|
|
note went into the chapter however far away you had since clicked.
|
|
- **The account panel closes with Escape.** Only a click beside it did, which on
|
|
a panel that wide means aiming at a sliver of page.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Chapters as rows, in two views
|
|
|
|
**Images** — web `sha256:95657aaf…`, server `sha256:b4db0725…`
|
|
|
|
The server image changed: a `color` column on chapters, a reorder route, named
|
|
positions on the note reorder, and the new per-account setting.
|
|
|
|
**Added**
|
|
- **Two ways for a chapter to open**, chosen per account: its notes in a further
|
|
column beside the list, the way OneNote lays out its pages, or unfolded under
|
|
the chapter's own row. A phone has room for neither and fills the list, with a
|
|
way back.
|
|
- **A chapter can be given its own colour**, since the point of having them is
|
|
that they are different places.
|
|
|
|
**Changed**
|
|
- **Chapters sit at the same level as notes and separators** — same grip, same
|
|
drag, same place in a hand-made arrangement. Notes and chapters are numbered
|
|
from one counter now; separately, the two sequences could not be interleaved
|
|
and a chapter dragged between two notes would spring back. `POST
|
|
/notes/reorder` takes named positions beside the older list of ids, and
|
|
chapters have a reorder route of their own.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Moving in one press
|
|
|
|
**Images** — web `sha256:3700247c…`, server unchanged at `sha256:181d77be…`
|
|
|
|
**Added**
|
|
- **A move button on every note row.** Moving used to be a right-click into a
|
|
submenu — two steps before the list of places appeared, and on a phone a long
|
|
press followed by a flyout. One press now opens a dialog with the chapters of
|
|
this notebook and the other notebooks on one screen, marking where the note
|
|
is now.
|
|
|
|
**Changed**
|
|
- **The spare page in Draw mode reads as an offer**, not as a page. A second
|
|
sheet appeared the moment Draw was pressed, drawn as solid paper, while the
|
|
count still said "of 1" — which looks like the app inventing a page. It is a
|
|
dashed outline saying "Draw here to add a page", and it counts only once
|
|
something is on it.
|
|
- *+ Chapter* and *+ Separator* are the same shape. The new one had been built
|
|
without matching the old, and the old one's 19px target was one a finger
|
|
misses. Separator labels also match a chapter's name in size now.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Chapters
|
|
|
|
**Images** — web `sha256:790ff73a…`, server `sha256:181d77be…`
|
|
|
|
The server image changed: it takes a `chapters` table and a `chapter_id` column
|
|
on notes, both added on start.
|
|
|
|
**Added**
|
|
- **Chapters — folders inside a notebook.** A note is in one or in none; tapping
|
|
a chapter opens its own list, with a way back out. Removing a chapter never
|
|
removes what it held: the notes come back to the notebook, and the dialog says
|
|
so with the number affected. Separators now belong to the list they were drawn
|
|
in, so a line drawn in one chapter does not appear in another.
|
|
|
|
**Changed**
|
|
- **A notebook's design is its own.** A 45-degree stripe texture was baked into
|
|
every cover at 1.5% white — meant to be imperceptible, visibly banding on the
|
|
darker gradients, and a second pattern fighting the one actually chosen. And
|
|
the same pair of rings sat in the middle of every notebook. The mark belongs
|
|
to the design now, and the designs whose pattern already fills the face wear
|
|
none.
|
|
|
|
**Fixed**
|
|
- **A submenu was being clipped away on a wide screen.** The menu had been given
|
|
`overflow-y: auto`, which cuts off anything flying out sideways — so the list
|
|
of notebooks under *Move to…* was invisible and every click on it landed on
|
|
the note list behind. The side was also inverted: `right: 100%` places a panel
|
|
on the left.
|
|
- **A separator was effectively invisible on a phone** — a one-pixel hairline in
|
|
the border colour with faint grey text on near-black.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Two-part covers, and an app that can be installed
|
|
|
|
**Images** — web `sha256:1217b81b…`, server `sha256:3303d3dc…`
|
|
|
|
The server image changed: it takes a `cover_pattern` column, added on start.
|
|
|
|
**Changed**
|
|
- **A cover is now a colour and a pattern, chosen in turn**, rather than a list
|
|
with the combinations someone happened to write out. Every combination is
|
|
available, and each pattern is previewed over the colour in hand. Covers saved
|
|
during the day the patterns were one list are read back as the pair they were
|
|
drawn as, so nothing repaints itself.
|
|
|
|
**Fixed**
|
|
- **The install button never appeared, even over HTTPS.** Two causes, both in
|
|
this app rather than in anyone's configuration:
|
|
- `beforeinstallprompt` fires once, early — usually before React has mounted —
|
|
and is never fired again, so a listener added from inside a component simply
|
|
missed it. It is caught at the top of `index.html` now.
|
|
- The manifest is fetched **without credentials** unless the link says
|
|
otherwise. Behind a reverse proxy that authenticates in front of the app,
|
|
that request comes back as the proxy's login page and the browser reads it
|
|
as an invalid manifest — while the app itself works perfectly, because its
|
|
own requests carry the cookie. The link now says
|
|
`crossorigin="use-credentials"`.
|
|
- **The service worker could cache a proxy's login page as the application.**
|
|
Nothing checked that a response was the thing that had been asked for, so a
|
|
lapsed session could be stored as the app shell: it then "worked offline" by
|
|
showing a login screen it could never get past, curable only by clearing the
|
|
site's data by hand. Redirected and unsuccessful responses are no longer
|
|
cached, and the cache name is bumped so anything already stored under the old
|
|
rules is dropped.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Making the phone work
|
|
|
|
**Images** — web `sha256:5ea846f3…`, server unchanged at `sha256:06f94f43…`
|
|
|
|
**Fixed**
|
|
- **A note made offline lost everything written into it.** Its create reached
|
|
the server, the server named it something else, and every edit still queued
|
|
behind it went on addressing the name only that device knew — a 404, five
|
|
retries, then thrown away. The note arrived empty and untitled with no sign
|
|
anything had been lost. The queue is now repointed along with the database.
|
|
The same held for a notebook made offline.
|
|
- **The order of notes could not be changed on a phone.** The list used the
|
|
HTML5 drag API, which mobile browsers never fire from touch. It uses pointer
|
|
events now, and every row has a grip: pressing the row itself still scrolls,
|
|
and holding it still opens the menu.
|
|
- **"Move to…" opened off the side of the screen** and could not be opened at
|
|
all with a finger. It was pinned to the right of the menu and reacted only to
|
|
hover. It now opens on a tap, unfolds in place on a narrow screen, and flips
|
|
to the other side on a wide one when there is no room.
|
|
- The menu itself is placed by measuring rather than by assuming it is 220px
|
|
wide, so it can no longer hang off an edge; rows are tall enough to hit with a
|
|
thumb, and Escape closes it.
|
|
|
|
**Changed**
|
|
- **The install entry is always there.** It used to appear only when the browser
|
|
offered a prompt, so where installing was impossible there was nothing on
|
|
screen at all — no button, no reason. It now says which of the fixable causes
|
|
applies: served over plain HTTP, or a browser that wants to be asked through
|
|
its own menu.
|
|
|
|
---
|
|
|
|
## 2026-08-12 — Covers, the search box, and room to write in the margin
|
|
|
|
**Images** — web `sha256:c1222665…`, server `sha256:06f94f43…`
|
|
|
|
The server image changed: it sends the default number of versions with the
|
|
account, so the notebook dialog can name it instead of guessing.
|
|
|
|
**Added**
|
|
- **Patterned notebook covers** — ruled paper, graph paper, pinstripe, bands,
|
|
dots, cross-hatch, linen, washes, a ledger. Drawn entirely in CSS: no image
|
|
files, nothing to upload, crisp at any size, and they work offline like
|
|
everything else. Existing notebooks keep exactly the cover they had; the new
|
|
ones are appended, never inserted.
|
|
|
|
**Changed**
|
|
- **The search box in a notebook is simply there**, and the button that used to
|
|
open it is gone. A magnifying glass cost a click and having to remember that
|
|
searching was possible; the box is one line and says for itself what it does.
|
|
- **Margin notes are bigger** — the column went from 208px to 288px and a card
|
|
from three short lines to about five. Three lines is a caption, not a remark
|
|
on a passage, and the space beside the page was sitting mostly empty.
|
|
- The notebook dialog's cover grid scrolls, so the dialog cannot run past the
|
|
bottom of a laptop screen and take the *Create* button with it.
|
|
|
|
**Fixed**
|
|
- The notebook edit dialog was still part German — *"Versionen pro Notiz"*,
|
|
*"Vorgabe"* — and would not say what the server's default actually is. It now
|
|
names it (50), read from the server rather than written into the interface,
|
|
since `MAX_VERSIONS_PER_NOTE` can be changed and a hardcoded number would
|
|
quietly start lying.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — Margins and a stray placeholder
|
|
|
|
**Images** — web `sha256:3a181ff3…`, server unchanged at `sha256:0832ee2b…`
|
|
|
|
**Changed**
|
|
- **Narrower margins on the sheet** — the column went from about 73 characters
|
|
to about 80, leaving roughly 8% of the paper as margin either side instead of
|
|
117px of empty page down each edge.
|
|
|
|
**Fixed**
|
|
- **"Start writing..." was printed at the foot of every page with a break after
|
|
it.** The placeholder extension styles `[contenteditable]:empty::before`, and
|
|
the spacer holding a gap open is exactly that — empty, and not editable.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — Writing on paper
|
|
|
|
**Images** — web `sha256:b764a9d8…`, server unchanged at `sha256:0832ee2b…`
|
|
|
|
**Added**
|
|
- **You write on paper.** Each page is a sheet of its own, centred, with a gap
|
|
after it — the same way the PDF reader draws its pages. The sheet used to
|
|
appear only once you started drawing, which left the writing mode looking like
|
|
text floating in an empty pane, and made the space either side of the column
|
|
read as a void rather than as a margin.
|
|
- Text is broken against those sheets, so no paragraph is ever cut in half by a
|
|
gap. The breaks are decorations: nothing enters the document, reaches the
|
|
server, or appears in an export.
|
|
|
|
**Fixed**
|
|
- **A note with a drawing could not be typed in at all.** The box wrapping each
|
|
page's ink layer lay over the text and swallowed every click meant for it. The
|
|
canvas inside was already deaf to the pointer; its wrapper was not. Introduced
|
|
the same day, with per-page drawing.
|
|
|
|
---
|
|
|
|
## 2026-08-11 — Drawing on every page, and PDFs findable everywhere
|
|
|
|
**Images** — web `sha256:dc804f7b…`, server `sha256:0832ee2b…`
|
|
|
|
The server image changed this round: it takes a new column and two routes.
|
|
`docker compose pull && docker compose up -d` — the column is added on start.
|
|
|
|
**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).
|