I wanted to download all of my own meeting transcripts. At the time there was nowhere in Granola’s UI to do it, so I went through their MCP connection, the standard hook that lets outside tools pull data out of an app, and it rate limited me to five meeting transcripts a day. Five a day, of my own data. I didn’t even have that many meetings, maybe 20 or 30. Why would I wait a few days to download five at a time? It made me mad. It is my data, and I want to use my data how I want to use my data. The app that came out of that is MeetingVault (getmeetingvault.com), a Mac meeting recorder that keeps everything on your machine.
I had been using Granola for a handful of consulting meetings, and I already didn’t love that everything was going into their cloud. When I watched my own workflow, I noticed I never touched the notes feature. All I did was copy the transcript out and paste it into Claude, where it became context for that client, my to-dos, my strategy. The transcript was the thing I wanted, and the rest was in the way. Every platform starts out generous with your data, then as it matures it starts locking things up so you stick around. It is dangerous to keep your data in someone else’s safe when you have to ask them for the keys every time you want it. Getting rate limited on my own words was the small, silly thing that tipped me from I don’t love this to I am building my own. I should be more stingy about who gets my data, and local models were getting better, so the timing felt right.
The prototype, and the RAM wall
So I built a prototype. It used Whisper models, and it worked like Granola in that it sits on your computer, watches for a meeting to start in Zoom or Teams, and prompts you to record. Local first is a weird philosophy for me. As a product manager I have always built products to collect as much data as possible, and here I was doing the opposite. I didn’t hook it up to your calendar, because integrating with someone’s calendar means asking them for a lot of data I don’t want to be responsible for. I may still build it eventually, since it makes getting meeting names right much easier, but I left it out for now. The trade is real. With no usage data coming back I am flying blind, relying on people to actually tell me what is working, so I lean on the other product management fundamentals instead. I do user interviews, I watch how people work when they let me, and I make the smartest decisions I can with what I have. It is slower than reading a dashboard, but it is the trade I signed up for when I chose to keep everything on the user’s machine.
The bet underneath all of this is local models. They run about six months behind the frontier models, they are already pretty capable, and they get more capable and smaller every month. The catch is that they are still just a little too big to be useful on maybe 80% of people’s computers.
The first proof of concept was just this: can we record and transcribe locally. It turns out you need a fairly beefy amount of RAM. The accurate results needed the larger Whisper models, which run three to five gigs. The old version, v0.1, bundled its own AI stack right inside the app’s process. Transcription ran on WhisperKit, an open source speech-to-text engine that downloads anywhere from 500 megabytes to 3 gigabytes, and notes ran on a small open language model, Qwen 2.5 3B, through MLX, Apple’s framework for running models on the Mac. My build notes put it at roughly three gigabytes of model weights sitting resident inside the app, and the README required 8 gigabytes of RAM. I was testing on an old M1 with 16 gigabytes, and plenty of those Macs shipped with less, so sometimes memory was full and I had to kill apps to make room. My March architecture spec has Whisper Large taking 35 to 40 seconds to process every 30-second chunk on a 16-gigabyte Mac. I literally wrote, the model is too heavy for the hardware.
The dark factory
The build itself was stranger than the product. Back in March I tried something I called the dark factory, an attempt at a build harness that runs on local models and is orchestrated by Claude. The name comes from the Chinese factories so automated they don’t need humans on the floor, so they don’t bother turning on the lights. That was the goal, a build system that runs with the lights off. My Mac Studio ran an open coding model, qwen3-coder-30b, through LM Studio, a desktop app for running models locally, and Claude drove the loop. I got the first prototype standing up on March 3rd, 2026, in a single day, and the first commit reads, import latest MeetingVault build from dark factory workaround. It produced fifty-plus Swift files, about 15,000 lines, roughly six hours from that first commit to something that could record, transcribe, and take notes. It built a lot of the scaffolding. It was also not very good, and I ended up throwing a lot of it away. The harness itself never got there. The autonomous judge loop, where one model checks another’s work, hit context limits, so I bypassed it and built directly, which is the workaround in that commit message. At some point I had to choose between working on the factory and working on the app, and I chose the app. My first real attempt at coding with open source models locally was a bit of a debacle, and it is probably best saved for another day.
March was 167 commits, basically a war diary of fighting Whisper. Whisper hallucinates with silence and background noise, so I would get things dropped into a transcript that were never said, biblical passages, political and religious quotes, repetition loops. I remember reading one and thinking, I don’t remember us talking about that in that meeting. I built a three-layer defense just to contain the hallucinations. Between that and the RAM, I didn’t want to ship an app where I have to teach people how to manage local models. Those folks have open source options and will probably go that route. I wanted a clean Mac app that just works, so I stopped. From March 29th to June 9th there are zero commits, about ten weeks. I was spending too much time on it and was too far from done, so I abandoned ship.
WWDC, and the rebuild
The restart came from WWDC. Apple was making its announcements, and one of them was that developers could use Apple’s on-device models. A lot of what Apple does locally is transcription, which is exactly what I needed. Everything I had built to contain Whisper’s hallucinations went obsolete overnight. I ran a test to see whether the models already sitting on someone’s Mac could do a better job of transcription. Apple Intelligence is designed to be more efficient and it prioritizes memory to those models, and the test turned out great. This is also where the local bet started to pay off in public. When a company like Apple dedicates space in the OS for local models and holds them to its own performance standards, that is a big step toward the day this works for everyone and not just the people with a lot of RAM.
So the rebuild deleted the entire packaged stack. The migration commit just says, remove packaged AI stack, WhisperKit, MLX, Qwen. The notes capability went with it. I cut the app down to what it does best, transcripts and dictation, and nothing else. The new binary has zero WhisperKit references and fourteen for Apple’s SpeechAnalyzer, the transcription built into macOS itself. I measured it live at 25 megabytes of memory while idle, roughly a hundred times less than the app used to hold. The models moved out of my app and into the operating system. When it transcribes, macOS pages the model, about 1.5 to 2 gigabytes of unified memory, into shared system processes while it is working and reclaims it when it is done. None of that counts against my app, and the user never downloads anything, because the models ship with macOS.
The old app held three gigabytes of models. The new one runs at twenty-five megabytes.
The rebuild in June went nothing like March. A friend had shared a harness he built that can take a well defined spec a long way inside Claude Code without stopping to check in, and Anthropic had just released Fable to the public on June 9th, that same WWDC week. With those two, I rebuilt the app almost entirely from the ground up, and I had a much easier time getting it up and running. I decided to restart on June 9th and 10th, the rebuild ran June 10th to 12th, and then I spent about three weeks polishing. The paid launch was June 30th, 21 days after I decided to restart, at a founding price, though I should say plainly that the number of people actually paying so far is zero. My last Granola meeting was also June 30th. The tool that started all of this got retired the day its replacement started charging money. Now I am using her in most of my meetings. Her. I hear myself doing it.
On the recording itself, macOS was smoother than Whisper had been. You can’t just capture all the system audio and have it make sense, so I record the mic separately from the other person’s audio, in separate tracks. That gives you a transcript that is a me and a them. I purposefully didn’t build speaker diarization, the voice-print kind where the app labels who said what. When I started I didn’t know all the recording rules, so I did the research, and what I learned is that when two people are on a call the strictest state’s rules apply. I looked into all of them. Illinois treats voiceprints as protected biometric data with real statutory damages per violation, a civil matter rather than a criminal one, and that was enough for me to skip diarization. Me and Them is fine for now.
What it is actually for
What I keep learning is that people don’t really care how they record meetings, they care how they want to work on their computer afterward. The biggest use case I have seen is what I would call a local AI brain. Your meeting transcripts drop into a folder you designate, one folder per recurring meeting, with the date in the naming convention. You can have the transcript show up in any folder on your Mac in whatever format you want, .md tuned for Obsidian, HTML, JSON, plain text. It is a behind-the-scenes tool. You make sure it is recording, the transcript lands where you told it to, and the AI workflows you already built take over.
I watched one person point Claude Code at the folder and ask what they had committed to in a meeting, then build the to-do list from that. Another said, build everything I said I would build at this meeting, and Claude spun it up into Linear tickets on their board and started knocking them out. It even generated a prep document for the next meeting, listing what was built with links to each ticket. It took the whole workflow, did everything the AI could do, and flagged the parts that needed human judgment. That is my own favorite way to use it too. Once your data is sitting where you want it, in the format you want, the workflow is yours to build.
There is a dictation feature I said nothing about at launch, and it exists because a tester asked for it. One guy on Twitter said he would pay a lot of money for a product that combined Wispr Flow and Granola, bonus points if it were local, and he became one of my earliest testers. I was already handling mic permissions and local transcription, so adding dictation was not much more work. I am calling it Speak, and I one-shotted it with Fable. I am still cleaning up edges, like not wiping out whatever was already in your clipboard when you dictate into a field. People pay for Granola and Wispr Flow separately, and now it is both in one app, and I still have not really talked about it.
The part I am proudest of is the least visible. Transcripts show up in the folders you designate, but they can’t fall out of sync when you move things around. My app keeps its own files as the source of truth and gives every file a fingerprint. If you drag a transcript out of its folder mid-project, the app stops following it, but you can re-sync and it will put a fresh copy back in the designated folder. The other quiet piece is jargon. Out of the box it does not catch specialized words well, so I added a way for you to add the terms you care about. I am in tech, so I loaded it up with tech words, and someone from the legal world won’t have theirs yet. I will keep tuning that, maybe with a short questionnaire up front that generates a starting list for your field.
Where it actually is
I should be clear about where this actually is. I just launched it, and right now it is four people testing it and nobody paying. Some of them are testing because they are being nice, and they are perfectly happy with Granola for now, because they haven’t gone all in on the AI brain yet. That killed my main assumption. I thought people would care deeply about the local part, and most of them just care about convenience, and local is still a niche. On June 29th I measured my local transcripts at about 80% of Granola and Wispr quality, weak on jargon and with speakers limited to me versus them, and I shipped anyway, at a founding price, positioned on local and private rather than on accuracy. I built the thing I wanted first, and now I get to go find the people who were waiting for it.
Am I a hero? Nobody has said so yet. When they do, I’m not going to correct them.
— Joe