Fennick Docs Open Fennick

Using a notebook without Fennick

On your Mac, a notebook is one ordinary SQLite file. Any program that reads SQLite can open it, with or without Fennick.

Fennick never locks your notes away: the tables are named in words, the words you write are stored as they are, and Fennick doesn’t encrypt the file on your Mac. If FileVault (your Mac’s own disk encryption) is on, it keeps the file safe if the Mac is lost.

Where your notebook is

  • Your first notebook is My notebook.db, in the My notebook folder inside the Fennick Notebooks folder in your home folder. File › New Notebook… offers Fennick Notebooks first, and each notebook gets a folder of its own. File › Open Recent shows where each notebook really is.
  • A notebook made with File › New Notebook… is in the folder you picked, with the folder’s name: a notebook named Recipes is Recipes.db in the Recipes folder.
  • Pictures and files you add to a notebook are in the files folder beside it, each under its own name, so you can open them in Finder. A second file with the same name and different contents gets a number: Quote 2.pdf. A hidden list in that folder, .fennick-index, gives each file’s SHA-256; in Terminal, in that folder, shasum -a 256 -c .fennick-index checks every one.
  • File › Open Recent lists the notebooks you’ve opened on this Mac.

To rename a notebook, or move it somewhere else, use File › Rename Notebook… or File › Move Notebook… (also in the menu under the notebook’s name at the top of the sidebar). Its folder and its file change together, and its sync and connected agents keep working. Moved to another disk, it’s copied and checked first, and the old folder goes to the Trash.

In a browser, on a computer or a phone, the browser keeps your notebook where other programs can’t reach it. To take a copy out, use Export… in Settings › Import and export.

Open it in any SQLite tool

Open it read-only, so that looking can never change anything.

  • Terminal: sqlite3 -readonly ~/"Fennick Notebooks/My notebook/My notebook.db"
  • DB Browser for SQLite: File › Open Database Read Only…, then pick the file.
  • Python: sqlite3.connect("file:" + os.path.expanduser("~/Fennick Notebooks/My notebook/My notebook.db") + "?mode=ro", uri=True)
  • Your agent, such as Claude Code: tell it where the file is and that it may only read it. To let your agent change your notebook too, connect it.

What’s in it

Every notebook explains itself. This lists each table and what it holds, in words:

SELECT name, what FROM readme;

The tables can change between versions; export, an agent connection and the fennick command stay the same.

The ones you’ll use most:

  • nodes: every block, page, day page and tag. text is its words, parent is the page or block it sits under, rank sorts the blocks under one parent, day is a day page’s date, and trashed is when it went in the Trash.
  • tagged: which tag is on which block or page.
  • vals: the values of fields.
  • ss_log: every change, who made it and when.

Some questions to start from:

Your pages:

SELECT text FROM nodes
WHERE parent IS NULL AND kind IS NULL AND day IS NULL AND trashed IS NULL
ORDER BY text;

The blocks on a page, in order:

SELECT block.text FROM nodes block
JOIN nodes page ON block.parent = page.id
WHERE page.text = 'Garden plans' AND block.trashed IS NULL
ORDER BY block.rank;

A day’s blocks:

SELECT block.text FROM nodes block
JOIN nodes page ON block.parent = page.id
WHERE page.day = '2026-10-31' AND block.trashed IS NULL
ORDER BY block.rank;

Every block with a tag:

SELECT block.text FROM nodes block
JOIN tagged ON tagged.node = block.id
JOIN nodes tag ON tag.id = tagged.tag
WHERE tag.kind = 'tag' AND tag.text = 'idea' AND block.trashed IS NULL;

Blocks with a word in them:

SELECT text FROM nodes WHERE text LIKE '%tomato%' AND trashed IS NULL;

The latest changes:

SELECT at, actor, tbl, op FROM ss_log ORDER BY at DESC LIMIT 20;

A very long block is kept in more than one row: the rows after the first have cont_of set to the first. The readme says more.

While Fennick is open

  • On your Mac, other programs can read a notebook while Fennick has it open. They see everything saved up to that moment; read again to see newer changes.
  • Close the other program when you’re done. While it holds the file open, Fennick can’t tidy the file’s side files away.
  • When Fennick closes a notebook, it leaves one plain file with nothing needed beside it, so it opens read-only anywhere.
  • To copy a notebook while Fennick has it open, let SQLite make the copy, so it’s whole: sqlite3 -readonly ~/"Fennick Notebooks/My notebook/My notebook.db" ".backup 'Notebook copy.db'". Copying the file in the Finder while it’s open can leave out the latest changes.

Changing your notebook

Changes go through Fennick, so each one has its name in the Op Log, can be undone, and syncs to your other devices. There are two ways in:

A change made straight to the file with another program is refused: the program shows an error, and nothing in your notebook changes. Don’t change the file’s tables, or delete anything in its folder, with another program: Fennick might not be able to open it afterwards.

What leaves your Mac

If a Fennick update ever fails on your notebook, Fennick puts your notebook back as it was and sends us a short report so we can fix the update: the update step, the kind of check that failed, whether putting it back worked and how many changes it couldn't keep, the app's build, whether it's the Mac app or the browser, and a rough size (small, medium, large or huge). It has no name, account or id on it and nothing from your notebook, and it's sent even if you have no account. Nothing else about your notebook is ever sent to us without you asking. The app also asks fennick.app and GitHub for its own updates, and those requests carry nothing from your notebook. On a Mac, Settings › About › Check for updates turns those checks off.

If Fennick is ever gone

Your notebook stays yours and stays readable: everything above works with no Fennick at all. To change your notes with other programs too, make a copy of the file and take out the guards that refuse those changes. In Terminal:

  1. Make the copy: sqlite3 -readonly ~/"Fennick Notebooks/My notebook/My notebook.db" ".backup 'My notes.db'"
  2. Take out its guards: sqlite3 "My notes.db" "SELECT 'DROP TRIGGER \"' || name || '\";' FROM sqlite_master WHERE type = 'trigger';" | sqlite3 "My notes.db"

Now any SQLite program can change My notes.db, for example sqlite3 "My notes.db" "UPDATE nodes SET text = 'Garden plans, revised' WHERE text = 'Garden plans';". Your original file is as it was.

The copy is a plain database from then on. Fennick won’t open it, and it has no history, undo or sync. Do this only on a copy.