Files
InkNote/CHANGELOG.md
T
2026-08-17 11:46:28 +02:00

29 KiB

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 — 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).