On uwsm/Hyprland the app runs in a systemd scope cgroup; a detached child is
swept away when the app quits, which killed the swap mid-flight on every
in-app update attempt. systemd-run gives the installer its own transient
unit that outlives the scope; detached spawn stays as the non-systemd
fallback.
- installer script now logs every step (wait, extract, flatten, swap, relaunch)
to a persistent log so a failed update is diagnosable after the fact
- flatten the electron-builder nested dir by adopting the dir itself; the old
'mv NEW/* ' glob missed dotfiles and could leave a half-moved tree (prime
suspect for the two in-app update failures)
- mkdir failure aborts with relaunch of the old app instead of falling through
Migration recovery backups no longer re-copy Folio-Backups (up to 21x bloat). bookChangedSince tracks visited dev:ino so a symlink loop in the book cannot wedge the main-process interval tick. Snapshot toggle check aligned to === false; drop dead home-shortening branch in Settings.
English spellcheck suggestions with Add-to-dictionary in the native context menu plus a Settings toggle. Typewriter caret-centering mode. OS file associations for .md/.txt and Open File wording. Updater: release URL surfaced, single progress listener, two-byte tarball check, installer wait guard. Search/installer test suites registered; chapter-list layout polish; ignore KDE .directory files.
Background autosave toggle plus whole-book snapshots (default <book>/Folio-Backups, configurable location, retention, interval) with a one-minute change check in the main process. New Settings modal (sidebar, Ctrl+, , File menu) exposes autosave, snapshots, folder picker, and Snapshot now.
Keyboard reorder (Alt+Up/Down) restores focus and scrolls the moved row into view so repeated moves keep working. Pointer drags autoscroll near the list edges and show drop position.
Markdown:
- File > Open Markdown File... and welcome-screen 'Open .md' import
one or more .md files as new books (named after first H1 or the
filename; originals never modified, collision-safe folder names).
- Book dirs and .md files passed on the command line or via desktop
file associations now open directly; single-instance lock forwards
second launches to the running window.
Updates:
- File > Check for Updates... and welcome-screen 'Update' button:
queries the Gitea releases API, one-click installs a newer release
into ~/.local/share/Folio via a detached swap script that waits for
app exit, keeps the old tree until the swap succeeds, and relaunches.
Download is gzip-verified and restricted to the trusted release host.
No root, no reinstall.
Tests: 19 new assertions in tests/run-update-import-test.mjs (wired
into npm test); full suite green, tsc clean.
- add autoExportDocx() in src/main/index.ts:590 to refresh full-book and per-chapter .docx on every save
- hook saveChapterDoc, saveChapter, create/rename/delete/duplicate/restore/reorder/setColor to auto-generate DOCX in book folder
- primary autosave remains native JSON (folio-doc) for fidelity, DOCX is derived export
- fixes duplicate title in God is Decentralized chapter (remove H2 duplicate, chrome title is canonical)
- Add 'Save As...' item to native File menu, right under Save
- New IPC event folio:save-as-requested routes through preload to renderer
- Wired in index.ts to call saveChapterAs with current chapter ID
- Add 'Save As' button next to Save in the chapter writing view
- Exports current chapter as Markdown to a user-chosen file location
- New IPC handler folio:saveChapterAs shows OS save dialog
- Set .folio-prose.ProseMirror line-height from 1.7 to 1.0 to fix
excessive spacing between paragraphs and blockquotes
- Add PDF/DOCX/ODT export dropdown to the chapter writing view header,
matching the Full Book view's export workflow
- Wire chapter export dropdown toggle, menu selection, and close-on-outside-click
- Show an Undo toast after deleting a book from Home; Undo restores the
folder from the system trash (XDG .trashinfo, URL-decoded path match).
- Chapter delete/cut now snapshots the chapter (title, color, content,
position) and offers Undo to restore it in place.
- Add reusable showUndoToast/hideUndoToast and #undoToast UI + styles;
expose restoreBook/restoreChapter over the preload bridge.
- Drop the now-redundant 'cannot be undone' confirm on chapter delete and
the inaccurate 'permanently removes' wording on book delete.
- Auto-select the first chapter when a book opens so the editor is no
longer left on the placeholder (was the main `all I see is the title`
symptom).
- Stop markdownToNative from emitting text nodes with empty content and
defensively strip them in setEditorDoc; ProseMirror rejects such nodes,
which made editor.commands.setContent silently empty the whole editor.
- Home screen: delete a book (sent to trash, recoverable) and create a new
book in a folder named after it under ~/Documents.
- Add self-test coverage for new book + delete.
- Configure AppImage (primary) + Debian .deb (secondary) into releases/.
- White Folio app icon, Office category, io.atitlan.folio appId, folio
executable; no file associations (none invented).
- Bundle tests/selftest-scenario.js so the packaged binary can be exercised
in place via FOLIO_SELF_TEST (inert during normal launches).
- Search: a 'Search' button in the sidebar footer (or Ctrl/Cmd+F) opens a
modal that scans every chapter, lists matches grouped by chapter with
highlighted snippets, and jumps to and scrolls the match on click. Includes
a 'Match case' toggle.
- Manual save: remove the per-keystroke auto-save; a chapter is only persisted
via the new Save button or Ctrl/Cmd+S. Switching chapters or closing the book
with unsaved edits now prompts to save first.
- Extend the packaged self-test to exercise both features.