Repository navigation
v0.4.0
The release that made the editor usable for a real article rather than a plain one: tables,
attachments, cover images, site-defined blocks, and a firm answer to what happens to HTML the
editor doesn't understand. Everything an article file contains now survives a round trip
byte for byte.
Writing
- Tables, created in the editor and written to the file as clean GFM — padded to the column
width, CJK counted as two cells wide, no in empty cells. A table typed by hand is
reformatted once and then left alone. - HTML tables, for the cases GFM cannot hold: merged cells, and a switch between the two
spellings. Only whereconfig.jsonasks for it, so an ordinary table keeps an ordinary toolbar. - Attachments: a PDF or any other file goes up as it is, under its own name, and is linked
from the body. Same path as images, so saving, conflicts and draft recovery were unchanged. - Cover image, uploaded, cropped, replaced or removed from the article's own panel — and it
can reuse a picture already in the body instead of uploading a second copy. - Code blocks and inline code, with the escaping rules stopping at the backtick.
- Pasted markup is treated as markup rather than as text.
HTML in an article
- Nothing unrecognised is dropped any more. A
<div>, a comment or a component the site
expands itself becomes an editable source box and is written back exactly as it was found. - Blocks the site defines itself: name a tag in
config.jsonand the editor edits it as a
small form — a card of fields, a table, or its own source. An element is claimed by its tag,
the attributes it must carry, and optionally what one of them starts with, so one kind of
<iframe>can be a video block without every iframe becoming one. Attributes the definition
never mentioned are kept and editable, folded away. - The file's own spelling is kept:
<iframe></iframe>is not rewritten as<iframe />, and
bare attributes such asallowfullscreenare not dropped. - A tag that is never closed is marked where it stands — in the box or in the sentence — and
saving says which tag and on which line before it goes out. One unclosed<div>wraps the rest
of the page it lands on, and Markdown cannot see that on its own. - Elements written across a blank line — a notice with two paragraphs in it — are read back as
the one element they are.
Around the editor
- The list loads in two steps: which files there are, then their text in batches, newest
first, so it appears without waiting for the last article. The text is cached in the browser
under git's own hash of it, so opening the editor again downloads only what changed. - Nothing in progress is lost: unsaved work, images included, is kept as you type and offered
back after a crash, a closed tab or a reload. - A reload comes back to the article that was open, and its address can be shared.
- Boxes can be left with the keyboard: Enter steps in, Escape steps out, Backspace takes an
empty one away, and dragging one moves that one thing and nothing else. - Dark mode, a favicon, and tags are no longer required.
Configuration, security, project
config.jsonis checked at startup and says everything that is wrong with it at once,
against a schema that editors can use for completion.- A Content-Security-Policy for the editor, with CI keeping the policy in the README and the
policy the tests run under from drifting apart. - Browser tests: the built editor driven in a real Chrome against an in-memory GitHub, so the
interface that gets clicked is the one that makes the commit. app.jssplit into modules by responsibility, ESLint added, and the cropper loaded on demand
(first load 207KB → 194KB gzipped).- A site of its own at simple-git-cms.azq1994.com, with a demo that runs the real editor
against a service worker standing in for GitHub, and three site templates the preview can switch
between. - Node 22 or newer to build and test the editor; CI runs the oldest supported line and the
newest (22 and 26). Node 20 reached its end of life in April 2026.