I built much software that runs near my Mac: containers, workers, dashboards, and small servers in a closet. This summer I built a program that runs on the Mac. Its name is jot. It is a scratch-notes app. It is my first real native Mac app, and it lives in the menu bar. I use it more times each day than all the other software that I made.
The app exists because of a small wound. I love Ghostty. I work in that terminal all day. But text that you copy out of a terminal comes out damaged. A selection stops in the middle of a line. Three unknown spaces attach to the front of the text. Line breaks land where the window edge was. Nobody knows where the spaces come from.
I wrote my thoughts in the terminal, because my hands were already there. Then I pasted damaged text into other places and repaired it by hand. A better terminal was not the fix. The fix was a real text view that feels like the terminal. It must open with one keystroke. Copy and paste must behave in it.
One keystroke is the full app
Press ⌘⇧N in any application: in an email, in the terminal, anywhere. A blank plain-text note opens. Type the text or paste the text. Copy it back out. Press ⌘W. The note is gone. That is the full product.
The design makes one bet: notes are temporary by default. Most of my notes are small. Examples: a phone number that I will dial, a paragraph that I move around before an email, the output of a command that I read one time. If the app makes me name and file each note, the result is four hundred old files with the name “Untitled.”
So jot. discards notes by default, with a quiet safety net. When I close a note without a save, the app puts the text in a hidden trash folder. The folder keeps the last twenty notes. There is no confirmation dialog. In two months, the net saved me approximately three times. That is the correct number: the net exists, and I never think about it.
Some notes must live. One key saves the note to a plain-text folder in iCloud. A different key sends the note into my notes vault as Markdown, and the rest of my system picks it up there. The first save locks the destination. I decide one time per note, and then never again.
Everything in my life grows a command line at some point. So there is a jot CLI. I can pipe the output of a command into a fresh note, and I do not scroll through terminal history. That is the correct middle point between print and blind copy.
The app wears the clothes of my terminal
The part that I like most is the part that nobody requested. jot. honors Ghostty, the terminal that I live in. It does not copy a screenshot. At launch, jot. reads my real Ghostty config: the font, the size, the padding, and the theme name. Then it finds the theme file in the Ghostty bundle and gets the real colors. When I change my terminal theme and restart jot., the notes change with it.
The keybindings are also copies: splits, tabs, and the same ⌘W behavior. That key closes the focused pane first, then the tab, then the window. My scratch pad drives like my terminal, because my hands already know that layout. To retrain hands is the most expensive UI change that there is.
480 lines and no Xcode
Native Mac development surprised me: only a small quantity of it was necessary. jot. is one Swift file, open source. It has approximately 480 lines. A shell script compiles it with swiftc. There is no Xcode project, no dependency, and no framework of the month.
AppKit made windows, tabs, and text views before I had opinions about software, and it shows. Most of my 480 lines are preferences and keybindings, not plumbing. The global hotkey was also cheap: the old Carbon API registers it without Accessibility permissions. The cost: the hotkey shadows ⌘⇧N in all applications, and that includes the new-incognito shortcut in Chrome. I accepted that trade in approximately four seconds.
For six weeks, the app had no face. It had no icon and no menu bar item. Only the hotkey opened it. I had to tell each person who watched that the app was invisible on purpose.
In July, the app grew up. A menu bar icon now opens a note on a click. There is also a small trick that I like: the app changes its activation policy at runtime. It appears in ⌘-Tab and the Dock only while a note is open. An empty scratch-notes app has no business in your app switcher.
The lessons were the unattractive type. Three separate bundle fields must agree before the Finder believes the name of an app. And when you restart a launchd-managed app the wrong way, the app runs two times and fights itself for the hotkey. Now I know.
The app joins the family
The name jot. comes from the family of little apps that my household runs: a lowercase word, then a period. But jot. is the different sibling on purpose. The other apps wear the paper-white palette of the family. jot. wears the clothes of my terminal. It is not a destination that you visit. It is a piece of the terminal that escaped, and it floats over all the other windows.
The rule of the family: identity gets one channel. The channel of jot. is that it looks like the place where I already live.
For years, I thought that a real Mac app meant an Xcode project, a designer, and much ceremony. I do not sit still for ceremony. A real Mac app meant one file and one keystroke. My hands reach for it before I finish the thought.