@sisyphuseditor/sisyphus
v0.2.0
Published
A local-first, append-only writing surface.
Readme
Sisyphus
A local-only, append-only document prototype. Pages grow by adding immutable rich-text blocks; favorites are also recorded as immutable events.
Install it
Requires Node.js 22.12 or newer.
Install Sisyphus as a permanent command:
npm install --global @sisyphusvault/sisyphus
sisyphusOr launch it without a permanent global install:
npx @sisyphusvault/sisyphusElectron downloads the runtime for the current Linux, Windows, or macOS system during installation or first launch. The SQLite database is stored in Electron's per-user application data directory as sisyphus.sqlite.
Develop it
npm install
npm run devShape of the app
The renderer is an isolated React + Tiptap surface. A narrow, typed preload bridge is the only way it can ask the Electron main process to read or append SQLite data; Node integration stays disabled and the renderer stays sandboxed.
The database has five append-only records:
pagesowns page identity and creation time.blocksstores the special page-title block at sequence0, followed by immutable text blocks.amendmentslinks an immutable source block to a later replacement block without changing either one.favorite_eventsstores every favorite/unfavorite choice as a new event instead of updating a block.page_deletion_eventshides a page through an immutable event while preserving its page and block records.
SQLite triggers reject UPDATE and DELETE on all five. An insert trigger adds block title/body text to an external-content FTS5 index.
Bounded rendering
Opening a page fetches its title plus the latest 24 text blocks. Jumping to a title, day, favorite, or search hit fetches 10 blocks on either side of that anchor. “Load earlier/newer” shifts the bounded window without accumulating the whole page in the DOM. The append composer appears only when the window reaches the newest block, preserving top-to-bottom chronology.
Tiptap is used instead of CodeMirror because the body is a structured rich-text document rather than source code. JSON is stored as the canonical body; plain text is derived in the main process for FTS5.
Verify it
npm test
npm run buildFirst-slice boundaries
- Rich text includes links, lists, quotes, tables, images by URL, and code blocks.
- Existing blocks and page titles cannot be edited. A text block can be superseded by a linked, later amendment, and its body can be copied as Markdown. Pages can be hidden through an append-only deletion event.
- Opening a page loads the title plus the newest 24 blocks. Anchor jumps load a bounded window around the target.
- Search uses SQLite FTS5 with prefix matching, title weighting, and snippets across one page or all pages.
- Favorites are listed across visible pages and can be filtered to the current page in the sidebar.
- File attachment import, export, backups, native installers/signing, and collaboration are intentionally not part of this prototype.
