Releases: josteng/Heft
Release list
Heft 0.6.1
Pasted tasks keep their tick, Cancel in the save conflict alert means cancel, and the Recent list and formatting bar behave better.
Changed
- When a note was removed outside Heft while you were editing it, the alert offers Discard My Changes, which closes the note.
Fixed
- A
- - -rule stays a rule when the caret moves onto its line, instead of turning into a bullet. - Pasting a task onto a task line leaves one checkbox, the pasted one, so a ticked task stays ticked.
- Cancel in the save conflict alert closes it for good; saving is still paused, and ⌘S (Save) asks again.
- Filtering the Recent list starts it at the top instead of where it was scrolled.
- The pointer is an arrow over the formatting bar, including between its buttons.
- The formatting bar no longer shows under the right-click menu.
Heft 0.6.0
The editor catches your spelling and grammar as you type, the Recent list reads like your notes instead of a folder listing, Siri can write into the vault, and a note can be dragged out of every list in Heft.
Added
- Spelling and grammar are checked as you write. Code, maths, frontmatter, tags and a link's destination are left alone. Three switches in Settings → Typing: Check Spelling, Check Grammar With Spelling, and Correct Spelling Automatically.
heft spell <vault> [note]reports the same misspellings and grammar notes to an agent, with--no-grammar,--limitand--json.- The Recent list shows what is in each note: its date, first line and folder, grouped under Today, Yesterday, Previous 7 Days and by month. Order it by last edit or by last opening, in the list's own menu or in Settings, and keep the compact rows if you prefer them.
- Siri can create notes, add to them, find them and open them, today's daily note included.
- Right-clicking a note or folder offers Ask Siri about that one, rather than about whatever is on screen (macOS 27).
- Notes drag out of every list — Recent, tags, search results, ⌘O (Quick Open) and ⌘P (Command Palette) — and the window's title bar carries the open note, so it drags into the Finder or a terminal.
- The folder name in the title bar drags out as the window's root folder, for dropping into an agent's prompt or a terminal.
- That folder menu lists the folders you focused on lately, so switching between a few takes one click, and it gains Copy Absolute Path and Reveal in Finder.
- ⌘O takes a path as well as a name, vault-relative or absolute, quoted, escaped or a
file://URL, and puts the note it names first. - ⌘P reaches the rest of the app: Quick Open, vault search, Find in note, the six formatting commands, new note, new vault, save, Settings and agent access.
- Clicking a picture in a presentation shows it across the screen, scaled up to fill it, and the next key or click puts it away.
- Filtering the file tree finds folders, and clicking one opens the tree down to it.
- Show the Entire Vault is in the file tree's own menu, where a focused window undoes its focus.
Changed
- ⌘O lists the focused folder's notes, with the same toggle for the whole vault that ⌘⇧F (Search the Vault) has. A pasted path ignores the scope.
- Presentations scale inline code, maths and the bars beside headings with the rest of the slide.
- Go to Path is gone: ⌘O does its job, and shows the match before you commit to it.
- Set Up Agent Access is disabled while the vault's guides are current, in the File menu and the palette alike.
- The history keeps 100 openings instead of 40, and the ones from before Heft recorded times sit under Earlier.
Fixed
- An embedded picture redraws when you export the file again, instead of keeping the version from when the note was opened.
- The presentation progress bar moves smoothly, including while ← and → are held down, and slides change at once when the arrows come faster than the fade.
- Siri's rewrite stays out of a note you open while it is working, and is no longer animated over it.
- A name you are renaming shows its cursor and selection, instead of losing them in the row's highlight.
- The Tags list names the folder it looked in when a focused window has no tags, rather than saying the vault has none.
- The folder menu in the title bar stays beside the traffic lights when the sidebar is narrow, instead of dropping into the overflow menu and letting the sidebar button slide across.
- The sidebar's filter field stays the same width in Files, Recent and Tags.
Heft 0.5.0
Links reach into a note, the chrome settles into Liquid Glass, and the editing surface loses a run of long-standing rough edges.
Added
- A link can name a section.
[[Note#Heading]]opens the note and lands on that heading,[[Note#^block]]on a single line, and[[#Heading]]jumps inside the note already open. Capitalisation need not match, and a heading that no longer exists opens the note rather than refusing.
Changed
- The sidebar header, the completion menu and the window chrome are drawn in Liquid Glass, and the plain chrome controls light under the pointer.
- Quick Open, the command palette and vault search are translucent, so the note stays visible behind them.
- The sidebar switch is a real segmented control again, drawn as tabs in a capsule and kept neutral instead of taking the accent colour.
- Quick Open and the command palette are one size. Vault search stays larger.
- The proposal and review banners are set in from the window's edges.
Fixed
- A note longer than the window opens with its first line visible, not scrolled up behind the toolbar.
- Extra spaces after a list marker move the text, not the bullet. Typing one used to drag the bullet left and leave the text where it stood.
- Tab and Shift-Tab move a list item one level without rewriting the rest of its indentation, and undoing that puts the caret back where it was.
- A
---rule written under an HTML comment stays a rule instead of turning the comment into a heading. - Each window's editor keeps its own styling, so a second window no longer disturbs the first.
- The sidebar highlights the note that is open, wherever you opened it from, and Reveal in Sidebar draws its highlight again.
- Arrow keys scroll the command palette, which they never did, and elsewhere the list moves only once the selection reaches the edge.
Heft 0.4.1
Ready for macOS 27: the fixes it needed, and some Liquid Glass so Heft feels at home.
Changed
- The formatting bar that appears when selecting text is drawn in Liquid Glass, matching macOS 26 and 27.
- The formatting bar also appears in Vim Visual and Visual Line mode. Settings ▸ Vim ▸ Show the formatting bar in Visual mode turns it off.
Fixed
On macOS 27:
- The All Notes menu above the sidebar shows its name again instead of just an arrow.
- Menus in Settings are no longer tinted with the accent colour.
And everywhere:
- The formatting bar stays in view when a selection starts above the top of the window.
- Bold, italic, strikethrough and highlight across list items, tasks, quotes and headings wrap the words, not the markers.
- After formatting in Vim Visual mode, from the bar or with ⌘B, the next command acts on the formatted words.
Heft 0.4.0
The command line learns new tricks and better manners, and a proposal points at the words that moved.
Added
- A proposal marks which words moved, not only which lines. A word edited in place is marked at the letter that changed, a word replaced outright is marked whole, and two lines with too little in common are left alone rather than painted end to end.
heft capture <vault> "text"adds one timestamped line to the inbox note, or to today's daily log with--daily. It is the one thing an agent writes straight into a note instead of proposing, because adding a line cannot disturb what is already there. The same write Spotlight capture has always made.- Settings ▸ Capture ▸ Review agent captures turns those captures into proposals, so nothing an agent does reaches a note until you accept it. Off by default, and it governs the command line only: your own captures from Spotlight and Shortcuts always land straight in.
heft read --lines N-M, for a note too long to pull whole.heft find --filesanswers which notes matched and how often, rather than which lines.--jsononfind,files,outline,links,backlinksandtags, because a path can hold a quote and a column cannot say so.heft version, which also answers to--versionand-v.
Changed
Four commands stop doing what they used to. Each wrote without review, and each now names what to use instead.
heft renameneeds--now. It repoints every link to the old name the moment it runs, andheft propose <vault> <path> --move <new>was already the reviewed form of the same thing.heft exportrefuses when the output file already exists, unless you pass--force. The path is arbitrary and outside the vault, so a mistyped one used to overwrite whatever was there.heft proposerefuses a whole body for a note that was never read, as it already did for one that changed since. Read it first, or send anchored edits with--replace. A note that is new or empty still needs no read.heft dailyrefuses a date it cannot read instead of writing today's note. A shell variable that did not expand used to leave a templated note on a day nobody asked about.
Fixed
heft findsaid nothing when it stopped at 40 matches, so a cut list read as the whole answer. It now says how many it withheld, and takes--limit.- Every verb resolves a note's name the same way.
heft outlinerejectedFolder/Notewhereheft readtook it, and neither said which spelling it wanted. heft exporttakes its flags in any position. Written before the output path, a flag became the output path.heft fileslists attachments as well as notes, which it always did and never said.--notesnarrows it to Markdown.
Heft 0.3.1
A way to create a vault from scratch, and fixes to typing, tables and the file tree.
Added
- File ▸ New Vault creates a new vault: a folder with one
Start Herenote in it, opened on that note. The welcome screen offers it too.
Fixed
- Promoting
*word*to**bold**by hand works, and so does demoting it back. A marker typed in front of one already there is inserted rather than stepped over, a marker typed after a closing one no longer leaves three, and backspace between two markers takes one rather than both. - A space typed at the end of a table cell stays where you typed it, and the caret follows it.
- Two clicks in a table cell take the word, three take the cell.
- Opening a folder no longer takes the highlight off the note you are editing. The folder carries a fainter tint instead, marking it as what ⌘C, ⌘V and ⌘⌫ would act on, and that goes out as soon as the keyboard goes back to the note.
- The caret on a blank line stands where the first character will land, at the height of the font. It used to sit above that point, and to draw heading-tall on the empty line under a heading.
- ⌘L (Toggle Checkbox) no longer lags behind the keys when it is held down.
Under the hood
- The test suite no longer fails at random on a busy machine. Two waits measured a wall clock, which a loaded machine can spend without ever giving the test its turn; they count attempts instead.
Heft 0.3.0
The file tree grows up, and a capture stops disturbing the app.
Added
- Copy, paste and duplicate in the file tree, through the general pasteboard, so a file moves between Heft and the Finder either way. Dragging a file in from the Finder copies it into the vault.
- Select several rows in the file tree: command-click to add, shift-click for a range. Copy, paste, drag and Move to Trash act on the whole selection, and trashing several asks once rather than once each.
- ⌘Z undoes the last move, rename, paste or delete in the tree. Undoing a paste puts the copies in the Trash rather than deleting them. With the caret in a note, ⌘Z still undoes typing.
- ⌘⌫ moves the clicked row to the Trash, asking what the menu asks.
- ⌘L ticks and unticks checkboxes, matching Obsidian's "Toggle checkbox status": a plain line gains an empty box, an empty box is ticked, a ticked one is cleared. The caret stays where it was.
- The command palette offers what a row's right-click menu offers, acting on the note in front: both paths, the wikilink, Reveal in Finder, Rename, Duplicate, Move to and Move to Trash. Copying a note's absolute path no longer means finding its row first.
- Reference links render, all four CommonMark forms. A bracketed aside with no matching definition stays prose.
- Settings ▸ Capture: whether a captured line starts with the time it arrived.
- Settings ▸ Typing: whether pasting a copied "- item" onto an existing bullet drops the pasted marker.
- A caution when an agent's proposed move would take a daily note out of its folder, said in the review sheet and by
heft propose --move.
Changed
- Captures from Spotlight and Shortcuts run in an extension of their own. A background intent declared in the app runs in the app, and macOS brings the app forward to run it, so a minimised Heft came out of the Dock every time a line was filed into it. Now nothing enters the app, and it need not be running.
- A palette command that cannot run right now sinks below the ones that can, so the first row is always runnable. It stays visible and dimmed rather than disappearing.
- Every menu Heft draws carries symbols and its keyboard hints, in the macOS 26 style.
- A note keeps its quick-open rank when renamed or moved, whether in the app, by
heft rename, or by an accepted proposal. The rank used to stay at the old path, so a moved note started from nothing and whatever was created there next inherited it. - Dragging a daily note out of its folder asks first. The folder is what makes it a daily note, so moving it quietly turns it into an ordinary one.
Fixed
- ⌘V now pastes files copied in the tree. The Edit menu disables Paste when the pasteboard holds only files, and a disabled menu item swallows its own shortcut.
- Copying from a row's context menu and then pressing ⌘V now pastes, instead of doing nothing.
- Pasting a copied list item onto a line that is already a bullet no longer writes
- - milk. - The upgrade instructions say
brew updatefirst: Homebrew refreshes taps once a day on its own, so a release made the same day was invisible tobrew upgrade.
Under the hood
- Four targets.
HeftCaptureis an App Intents extension, sandboxed because macOS launches no extension that is not, and silently refuses one that is not. - The sidebar's selection, the palette's ordering, the checkbox cycle and the undo routing are values with no window in them, so each is checked directly rather than through a running app.
Heft 0.2.0
Polish after the first release, from a day of clicking through the app.
Added
- Settings ▸ Capture: which vault a capture made from Spotlight goes to when you have more than one, the one opened last or always the same; and which note in a vault is the inbox, per vault. The "Capture to Inbox" and "Open Inbox" shortcuts follow both, a missing folder is created on the first capture, and the pane carries the daily-log marker with a Copy button.
- Settings ▸ Startup: which vault a start with nothing to restore opens, the one opened last or always the same.
- Open Inbox, in the File menu and the palette next to today's note. It creates the inbox note when the vault has none.
heft confignames today's note by the vault's own rule and says whether it exists, so an agent asked to add to it neither applies the date format itself nor creates it by asking.heft propose --moveaccepts a move into a path that another pending move vacates, so a numbered series can be shifted in one round; the review centre applies it only once the path is free. And a proposal can create a note at a path that was read and then moved away.
Changed
- Every settings pane is laid out the same way, as System Settings does it: controls in a card, what each does under its name, group titles above. Appearance and Typing were rebuilt, the Typing pane stops at 760 points and scrolls instead of taking the window to the screen's edge, and the labels say what they mean, with color spelled one way.
- Vim mode starts off, everywhere, until you switch it on in Settings or with the new "Toggle Vim mode" command in the palette (⌘P). It used to follow the vault's Obsidian setting silently, which switched modal editing on without a word on a fresh Mac.
- The offer to set a vault up for agents moved from a banner over the note into the review centre at the top of the sidebar, where it fits any window width, with a question mark that explains what gets written and how to start an agent there.
Removed
- The in-app Capture to Inbox sheet (⇧⌘I). Heft's "Capture to Inbox" shortcut does the same from Spotlight, anywhere, Heft included, so the app keeps one path.
Fixed
- A vault without agent instructions no longer opens a window taller than the screen that cannot be shrunk until Not Now is clicked.
- Set Up now refreshes the sidebar, so CLAUDE.md and AGENTS.md appear as soon as they are written.
- A new empty note no longer starts with a widget left over from the note before it.
- A note just named in the sidebar takes the caret, so you can write right away.
- Two tags side by side no longer touch.
- The new-note button beside the filter field has the same fill as the field.
Under the hood
- The test suite runs in 41 seconds instead of 97: the Neovim oracle asks a batch of cases per process, at background priority so the timing checks keep their cores.
Heft 0.1.0
The first release of Heft: a native Mac app for Markdown notes that stay plain files in a folder you own, with a heft command built for the coding agent you already use.
Install
brew install --cask josteng/tap/heftRequires macOS 26 on Apple Silicon. The app is signed and notarised.
What is in it
- One editing surface: the Markdown stays in the file, the markup hides until the caret reaches it.
- Callouts, tables, task lists, LaTeX, syntax-highlighted code, wikilinks and backlinks, tags, daily notes, capture from Spotlight, PDF export.
- A Vim mode.
- The
heftcommand: a resolved index of the vault to read from, and proposals an agent submits for you to review and accept change by change.heft helplists every verb. - Opens an Obsidian vault unmodified, including its
.obsidian/settings.
Known gaps
No iOS app yet, and no plugin system. See the README for the rest.