Ashira
A macOS notebook for a solo developer's project, one that knows what's happening in the code.
- status
- paused · as of
- period
- since Sep 2026
- platform
- macOS
- stack
- Swift, SwiftUI, SwiftData
- source
- private
identity
I was here before you opened me. While you worked, I kept the books: what changed, what shipped, where you stopped. I won't ask you to remember better. Leave me one line, and I'll give it back when you return, whether that's Monday or months from now. Your reasons are yours; I only make sure they're still here when you need them. Put the project down whenever you must. I'll be where you left it.
idea
Sariel waited to be opened. Ashira is already there. It came from a need, not a vision: my projects outgrew my head, and the tools for keeping track are made for teams. A notes app knows why, a git client knows the code, and nothing made for one person knows both. So I made the one place that does, and put the everyday part in the menu bar, beside whatever editor I'm using, because Sariel taught me that an app that waits to be opened waits forever. I use it every day.
adr
001The everyday part lives in the flow of work, not in a window
Sariel taught me this the hard way: an app that waits for you to open it waits forever. So in Ashira the everyday things don’t happen in the main window. They happen in a capsule in the menu bar, a few seconds and one shortcut away, beside whatever editor I’m using. The main window is where I go back to see the whole project. It’s not where the daily work has to start.
002AI only gets language tasks
A commit’s type and scope are worked out by code, not guessed by a model. If AI is turned on (it’s off by default), it can help describe what changed. It never writes why. A model guesses reasons convincingly and wrongly, and a wrong reason in a project’s memory is worse than none. What can be counted is counted by code; the reasons stay mine.
003A signal, never a lock
I can’t predict every mistake a user will make; Sariel proved that more than once. So Ashira doesn’t try to stop them. It warns, it points out what it sees, and it lets you take things back: a merge can be undone. But it never blocks you. Whether a warning matters right now is your call, not the app’s.
004A backup is the whole database, not an export field by field
Sariel’s backup was a JSON export that listed every field by hand. Every new field had to be added to it too, and a forgotten one would quietly go missing from the backup. In Ashira the backup is the whole database, so new data is in it without anyone remembering to add it. One decision, and a whole class of bugs is gone.
conclusions
Built on Sariel’s lessons
Almost every rule in Ashira comes from something that went wrong in Sariel: an app that waited to be opened, localization added too late, a backup that had to be kept in sync by hand. Ashira is what I did with those lessons, while they were still fresh.
Claude wrote much of the code, I set the rules
As with Sariel, a large part of the code was written with Claude, one piece at a time. Every decision about what Ashira is, and what it refuses to be, was mine.