- 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.
- Recolor the in-app glyph (Design B) to a solid white master and generate a
black variant; the desktop/app icon set (build/icons) is now the white
master at all sizes (verified bundled white in the AppImage/deb)
- In-app icon switches with the existing data-theme: black in Light mode
(visible on the light panel) and white in Dark mode (visible on the
near-black panel); the desktop/application icon stays white
- Export menu (PDF/DOCX/ODT) opens a workflow to export the entire book or
only selected chapters, with a canonical-order checklist + Select/Clear All
- Selected exports pass an ordered chapter list through the shared pipeline so
output follows book order (not click order); empty selection is rejected
- Filenames use a ' - Selected Chapters' suffix for partial exports
- PDF renders only the chosen chapters into the print container; DOCX/ODT build
from the selected chapters in order
- buildDocx/buildOdt now accept an explicit ordered chapter list, making that
list the single source of truth for export ordering (defaults to whole book)
- Emit real page breaks between chapters in DOCX, with none before the first
- Unify the DOCX/ODT handlers into one exportOffice pipeline (ODT still built
from the same DOCX via LibreOffice)
- Persist an app-wide zoom percentage (not per book) and apply it only to the
writing view (.editor-panes) so the sidebar/navigation stay fixed size
- Add a [-] [100%] [+] control to the chapter and Full Book headers, with a
click-to-reset level button
- Route Ctrl/Cmd+=, Ctrl/Cmd+-, and Ctrl/Cmd+0 to zoom in/out/reset,
intercepting the browser's native zoom
- Store an optional accent color on each ChapterEntry so it persists with the
chapter across switching, reordering, close/reopen, and restart
- Add a per-row color button that opens a palette popover (assign / change /
remove) and shows a small color dot in the sidebar, readable in Light/Dark
- Expose setChapterColor through the main/preload IPC bridge