portfolio mason
Mason live

I only saw the castle. The mason knows every stone.

Mason is a Mac app that sits in the background and shows how I work across my AI apps. I vibe-code, and I kept finishing things I could not explain. Before I jump to the next project, it makes me look back at what I actually built.

role
Gustaf Garnow. Product, UX and visual design, and direction of the build, solo.
my part
Every call on what to keep and what to cut. AI coding agents wrote the code.
what
A native menu bar app for macOS, its landing page and docs, and a design system.
proof
I use it every day · open source, v0.4.0 · one user so far: me
when
2026 · live at mason.tools
built with
Claude Code
Codex
Grok
Swift
Node
ElevenLabs

What it shows me, in my own figures.0:36

the question

Someone asked how I built it. I said three trendy words.

what happenedclose

I got that question about a project of mine, Kammaren. I sat there and said about three trending words: deterministic, script and Vercel? A mason knows exactly how every stone was laid. I don’t. I only see the finished castle, or the cathedral nobody walks into.

The question: How did you build it? And my answer, in large type: Deterministic. Script. Vercel?
My whole answer. I had built it, and I could not say how.
so I built a mirror

So I built a Mac app that watches how I work. It stung.

what stungclose

It started as a hackathon entry: something that sits in the background while I jump between Claude, Cursor, Codex, Grok and a pile of bots, and holds up a mirror. It is called Mason. What stung was that I jumped between programs and tasks more or less all the time. Hyperactive. And then the hours: how many I had spent.

Mason on my own Mac: a small strip in the menu bar, and under it a panel with 81 per cent work, 18 social, 1 other, and the line: Finished answers waited 33 minutes for you, mostly while you were in Discord.
Mason on my own Mac. A strip in the menu bar, and my day under it.
the first night

It asked me a question. I typed: I donw know.

whyclose

The first version did what the brief asked: it stopped me in the middle of work and asked me to set a rule. I had just installed it. I did not know what boundary to set, and I did not want to. I wanted something smart, not one more input field with manual work in it.

The first night’s version: a purple card asks what should make the apprentice stop and ask. In the answer field I have typed: I donw know.
Built to a hackathon brief. The big figure under the card is the part that survived.
the island

There was room in the menu bar. So it lives there.

howclose

The first overlay hung over my own windows, and the app was in the way. I took a screenshot, drew a green box around the empty stretch between the menus and the notch, and wrote one line. Now the island lives inside the menu bar, grows left from the notch and covers nothing.

My menu bar with a green box drawn around the empty stretch between the app’s menus and the notch.
My menu bar. I drew the green box.
after the deadline

It did not reach the final. I kept building.

whyclose

The product was very useful to me personally. I probably have ADHD, and it was crystal clear that I need something that shows me my flow.

the button

I built a button that rewrites my AI’s rules. Then I took it out.

what happenedclose

Mason notices what I keep telling my agents and proposes it as a rule. The first version had a button that wrote the rule into their instruction files for me. I said: no button that does it for you. Now it shows the words the rule rests on and opens a prompt that is ready and not sent. The agent proposes, I press send. I cut other things the same way: Teach, which I could not explain, and a daily goal that lasted an hour.

Mason’s proposal card, on made-up data: You keep saying this, 8 times in 4 projects. Show me the diff before a large change. My own words under it, and buttons to give it to Claude Code, Codex or Cursor.
“No button that does it for you.” The agent proposes. I press send.
the log

161 prompts. One in three said: not that.

howclose

I read this case out of the logs of the build. Every brick is one prompt I wrote to my agents. Red is a prompt where I rejected what they had made. The two towers are the hackathon deadline and the launch. The agents wrote the code. My part was to say what was wrong.

  1. deadline

  2. day three

  3. launch

  • asked for
  • asked about
  • said: not that
  • “too much text”

too much text

“Too much text. Show only the simplest. Every screen has 1 to 3 seconds.”

One brick is one prompt I wrote. Step through them with the arrows.

what I kept saying

I said “too much text” eight times in eight days.

whyclose

Nobody wrote the rules of this product down first. They are what I kept repeating until it stuck: a screen gets one to three seconds. Mason does the same for anyone who uses it. It notices what you tell your agents again and again, and proposes it as a rule.

The ninth time was about the first draft of this page.

the wall

I fell in love with my own metaphor. Nobody understood the wall.

what happenedclose

The landing page was a castle, built brick by brick as you scrolled. I was proud of it. On my phone I wrote: I don’t even understand what is happening. And then: we are a bit too in love with this wall metaphor. What if you don’t get the wall? Now the page starts with the reader’s problem, and the name is in no headline.

Two phone screens. Left, the landing page on launch day: a castle of dark bricks and tally marks. Right, the page that is live: You jump between AI apps all day. See where it goes.
Launch day, on my phone. The castle went. One short wall stayed.
the claim

The page said nothing leaves your Mac. That was not true.

what happenedclose

I vibe-coded the landing page. An agent wrote “Local-first: nothing leaves your Mac”, it read perfectly, and I let it through. It was live for hours before I checked what the app really does: summaries go to your own AI by default, so something does leave. Nothing in the way I work would have caught it. Now the page says four things can leave, each with its own switch, and what the docs claim is tested against the code.

Left, the landing page on launch day with one line marked in red: Local-first: nothing leaves your Mac. Right, the live page now: Four things can leave your Mac. Each has its own switch.
The page I vibe-coded, and the fix. A privacy claim has to be true.
what it has not done

It shows me how I work. It has not taught me anything yet.

and nextclose

On day three I said it was only confirmation: the mirror showed me, but I did not feel that I learned anything. That is still the open question, and so far I am the only user. Next is five people who have never seen it, and a month of my own days to see whether a mirror changes anything.

in short

A mirror, not a manager.

  • Read in one to three seconds
  • Nothing to declare
  • The last step is yours
  • Local-first
  • Open source
  • Built with AI agents
github.com/Baltsar/mason