The Story of How I, a Business Professional Who Has Inhabited the IT Industry for a Quarter Century, Built My Own App

The Story of How I, a Business Professional Who Has Inhabited the IT Industry for a Quarter Century, Built My Own App

I, a business professional who cannot write any code at all, created a minutes-taking app called "Gijiro" with Claude Code. About why I made everything work entirely within the Mac from recording to transcription and speaker identification, how I trained the speaker learning, why the specifications turned out this way, and the surprise and joy of discovering that anyone can now create a native app.
2026.08.30

This page has been translated by machine translation. View original

I'm Yoshizaki from the Growth Group of the Retail App Co-Creation Division.

The Retail App Co-Creation Division provides application development solutions to business companies.
Among them, the Growth Group I belong to supports many clients in shopping, restaurants, fashion brands, professional sports, and more — from initial app development through operations, maintenance, additional development, and business growth.

As a group manager, I oversee various projects of all sizes every day.
As a result, most of my day gets filled with internal and external meetings.
It's an incredibly difficult task to organize and process all of these in parallel and continuously with my outdated-spec brain resources.

That's when generative AI appeared.
What helps me most is Gemini's meeting minutes feature that integrates with Google Calendar.
By reviewing these, I can efficiently store the information, decisions, and next tasks from each moment into my brain.

However, there are meetings that slip through this minutes network.
Those are meetings on clients' Teams or Zoom, or in-person meetings at venues where no internet connection is provided.
The lack of meeting minutes in these situations had been a source of frustration.

When I complained about this to my supervisor, the response was: "You can do that on a Mac alone. You'd just need to ask some engineer though."
That made me snap and I started what you might call spinal-reflex-driven — no, AI-driven development.

And what was born from that is Gijiro, a macOS native app made with Claude Code.
It records audio, transcribes, identifies speakers, and even outputs meeting minutes in Markdown, all within the Mac without any external internet connection.

about_gijiro

Let me repeat: I cannot write code.
Back in middle school, I used to type out BASIC listings from the magazine "Beep Magazine" and play around getting them to run. That was the peak of my coding skills.
In my private life, I learned CGI from "Thoho's WWW Introduction," set up an internet bulletin board, built text sites with Homepage Builder, and launched blogs with Movable Type and WordPress — but that's where I stopped.
Now thanks to AI, I can do things like this.
Living a long life pays off.

I rapidly iterated through requirement changes morning and evening. (AI doesn't complain)
Not only using it myself but also having colleagues use it, I proceeded with fixes, refactoring, and additional feature development, and the version I have on hand has already reached 3.0.54.

So in this article, I won't write about the implementation details but rather why the specifications turned out the way they did.
It's a story about what I had first — "I want this kind of experience" — and what I chose to make it happen.

I Don't Want Client Information Sitting Somewhere I Don't Understand

We do client work.
What we discuss in meetings is the important information of clients entrusted to us.

There are many meeting minutes SaaS products in the world, and if you pay for them some are surprisingly convenient.
Acknowledging that as a premise, the state where the actual audio of a meeting is placed somewhere outside the company that I don't fully understand still doesn't sit right with me.
"It's convenient, but I can't use it in this meeting" — when that accumulates, you end up not using the tool at all.

So the first requirement I set for Gijiro was that it works without connecting to the internet.
Fortunately, today's Macs have the performance to do exactly that.
Transcription uses Whisper, and speaker identification also runs a dedicated model on the Neural Engine built into the Mac.
A one-time download takes a little time, but even a one-hour meeting finishes processing in a practical timeframe, and the audio file never goes out over the network.

historyindex

The Discovery That Ollama Is Pretty Good

Only the meeting minutes generation (summarization) requires an LLM, and here I made the engine selectable.
One option is the Claude API, but Gijiro's other selling point is Ollama.

settingsumm1

It started purely as a hobby — I found local LLMs interesting and was running them on my home PC for fun.
"Wait, for something at this level, could Ollama's Qwen handle it?" — that was the beginning.
Not that it matters, but Ollama has a cute logo.

And then there's that urgent reason I mentioned at the beginning.
Meeting rooms at clients' sites quite often have no internet environment.
These are exactly the places where I want to take meeting minutes, yet cloud-dependent tools stop working there.
If everything from recording to minutes generation could be completed entirely locally, that would be the ultimate solution...

And when I actually integrated it, Ollama was pretty good.
It doesn't quite reach the same quality as Claude, but it can produce a proper meeting minutes document with decisions and ToDos listed out just fine.
Offline, zero API costs, and decent quality — for those who haven't tried local LLMs, I highly recommend this use case.

However, on a scale of 100 points, it's about 45 points.
That's because raw transcription as-is still isn't practically usable.
You can't tell who said what, and proper nouns get wrong one after another.
There were two major walls to overcome to make it work as meeting minutes.

Knowing Who Said What

I believe this is what determines whether meeting minutes are usable, and it's where I experimented the most.

"Self" and "Other" Must Never Be Mixed Up

During online meetings, Gijiro saves the microphone (self) and the Mac's playback side (other) as separate tracks as well.

Speaker diarization is performed locally on the Mac.
But relying on this alone, people with similar voices get grouped as the same person, and it makes quite a few mistakes.
However, "my voice comes in from the microphone, the other person's voice comes in from the Mac's playback side" is not an AI inference — it is a fact confirmed by the recording pathway.

So for each utterance, I compare the volume of both sides — if the microphone side is louder it's "self," if the speaker side is louder it's "other," and that's determined conclusively.
Even if speaker diarization fails, at minimum the correct minutes with "self/other" remain.
It was more reliable to not have AI make this judgment.

Registering Voices Was Supposed to Output Names

I made it so that speaking for a few seconds in the settings screen and registering a name would save that person's voice characteristics.
In subsequent meetings, the same voice would automatically receive that name — I thought it was a great feature, but in practice you simply cannot ask someone "could you register your voice for a moment?"
Even with colleagues it's fine, but asking clients is not realistic, so the feature itself was correct but the operation wasn't, I concluded.

So I Made It Possible to Assign Names Afterward

What I built for that is a "Voice Library."
When a meeting is transcribed, unregistered voices automatically accumulate here.

washa

In the settings screen, a list of "Whose voice is this?" appears, and each can be played for a few seconds.

settinggen3

If you listen and recognize who it is, you can assign a name right there, and from that point on, that person will automatically be shown by name in subsequent meetings.
Without having to work hard in advance, accuracy improves on its own as you use it.
I thought I was getting pretty close, but it still wasn't enough.

In the End, Editing Directly on the Transcription Was the Fastest

This is the most recently added feature.
The Voice Library is convenient, but identifying someone just by listening to their voice is surprisingly difficult.
When you're reading the transcription you immediately think "ah, this is so-and-so," but when you're just played a few isolated seconds it's surprisingly hard to tell.
So I made it so you can click directly on the speaker name in the transcription screen to edit it.

  • Correcting a speaker name applies to all utterances in that meeting at once
  • Correcting to a real name connects that person's utterances and learns their voiceprint
  • In subsequent meetings, that voice is automatically assigned the name

I also added a feature to reassign speaker per utterance for cases where speaker diarization incorrectly merged two separate people into one.
Add one more speaker and assign only the relevant utterances to them.
The voiceprint is then relearned from the reassigned audio.
In other words, fixing labels while rereading the minutes directly becomes the learning data for next time.
As you keep fixing, it gets more accurate, so the correction work starts to feel a little enjoyable.

Company Names and Personal Names Almost Never Come Out Right

And that's the second wall.

Our Retail App Co-Creation Division is called "Prisor" internally.
Generic transcription tools consistently get department and product abbreviations wrong.
Our company has an enormous number of internal-specific terms, so without any help the minutes end up full of garbled proper nouns, and minutes with broken proper nouns make you not even want to read them again.

So I added a dictionary registration feature to Gijiro.
You register one term at a time in comma-separated format: "official spelling, alternate spelling, alternate spelling…"

settingsumm3

  • During transcription: Pass the registered official spellings as vocabulary hints to get correct recognition
  • When generating minutes: Pass the dictionary along with instructions to "correct any misspellings to these official spellings and unify notation"

I also made it so that the names of registered voice profiles are passed along with the dictionary.
Personal names are a treasure trove of mistranscription, so getting these right alone completely changes how pleasant the minutes are to read.

Made It Possible to Add Information Not Present in the Meeting

There is information that inevitably doesn't appear in the transcription.
The contents of materials shown via screen share, premises that weren't shared verbally, or tasks that came to mind during or after the meeting.

So I created a free memo field called a context note.
You can write in it during recording, and adding to it after transcription is complete or after minutes generation and regenerating improves the quality of the minutes.
If you write a URL, it goes and reads that content to use as material, so registering local or related repository folders means they get reflected.

The quality of meeting minutes is determined more by the information (context) you provide than by the AI's intelligence.
This was the thing I felt most strongly after building this.

I Keep Forgetting to Start and Stop Recording

Honestly, this was the most pressing issue.
The busier the day, the more likely I am to forget to press the record button.
And after finishing, I forget to stop it and end up with two hours of recording.
I've lost count of how many times this has happened...

So I added scheduled recording.
Register the day of the week, time, repeat pattern (daily, weekdays, weekly), and recording duration, and it automatically starts at the set time and stops at the specified duration.
This completely eliminated regular meetings from requiring any manual operation.

cueset

And as I used it, the specifications evolved.

Meetings run over.
This is simply unavoidable. It can't work without being able to extend.
So I made it possible to extend by clicking "+30 minutes" or similar from a notification.

Meetings are back-to-back.
While the previous meeting is running late, the scheduled time for the next meeting arrives.
So if the next scheduled time arrives during a recording, it gets queued up, and the moment the previous recording is stopped, the next recording automatically begins.

Building this reminded me of the scheduled recording on old VCRs.
When a professional baseball night game went into extra innings, the Friday Road Show would shift entirely and the recording of a movie you'd been looking forward to would cut out just before the climax — that was a tragic thing that used to happen (does this resonate with anyone?).
The "this is exactly it!" feeling when scheduled recording and EPG (Electronic Program Guide) came out and absorbed those problems — I carried that same feeling directly into this.

And on the Last Day of Summer Vacation, I Tried It with My Kids

I'm writing this article on exactly the last day of summer vacation.

As a fitting occasion, I launched Gijiro on a Mac with Wi-Fi turned off and did a "summer vacation reflection" interview with my eldest daughter in 9th grade and youngest daughter in 6th grade.
I set up a scheduled recording from 9:50 for 5 minutes in microphone-only (in-person meeting) mode and we gathered at the living room table.

In the context note, I wrote just two lines in advance:

The eldest daughter is in 9th grade, had a concert for her club activity (brass band) and has exams coming up
The youngest daughter is in 6th grade, takes cheer lessons and is practicing front walkovers

The recording was 3 minutes and 29 seconds.

logs

The transcription came out divided into "Father," "Eldest Daughter," and "Youngest Daughter" — but this didn't happen automatically.
The sisters' voices are so similar that speaker diarization barely worked.
The two were merged into a single speaker, and as it stood, whose utterance was whose was completely jumbled.

That's where the earlier "edit directly on the transcription" feature came in.
Reassigning a few lines to the youngest daughter triggers learning and the rest falls into place.
If this isn't fixed, the minutes content will also end up with "Eldest Daughter" and "Youngest Daughter" mixed together.
I ended up testing with family — probably the people in the world whose voices are most alike — but as a result the value of the manual correction feature became very clear.

summervacatoinresults

The summarization engine for the generated minutes was of course Ollama.
And at the end, this remained.

ToDo / Next Actions
☐ Discuss future study plans (Responsible: Father / Deadline: Start of second semester)

Father — meaning me — gained more homework...

Throughout this, the Mac never once connected to the internet.
Recording, transcription, speaker identification, and minutes generation — all of it finished entirely within this Mac.

Meeting minutes can be created even in a meeting room without internet — the original requirement was confirmed on the last day of summer vacation in the living room.
I never imagined I'd be doing this verification with my family.

In Closing

During the entire build, almost everything I got stuck on was the specifications, not the implementation.

How many minutes should automatic stop be set to?
How should it display when a speaker is unknown?
These are things AI can't answer no matter how much you ask.
Only I, who knows my own way of working, can decide.
Put another way, to the degree that AI took on "how to build it," the time I spent thinking about "what kind of experience I want" increased.

Gijiro is still a work in progress, a completely personal tool, and yet something that's actually usable in everyday meetings that I have right here at hand. (Ahh, this is fun.)

I want to tell my past self from the days of pasting "Under Construction" GIFs in Homepage Builder: "25 years later, you'll be self-building a macOS app that runs speech recognition."
Actually, the me from back then would do a little dance just from getting a single post on the bulletin board I'd set up.
And now I have a creature quietly running in the corner of a meeting room, churning out minutes.
You never know what life will bring.

"I have something I want to build — someone, please! Help!!"
This is a line I've been saying for the past quarter century.
And to make it worse, I couldn't just say it and leave it at that.
I talked colleagues into joining me and we even started a company together and failed.
I had passion, but I couldn't move my own hands.
To everyone I dragged into that back then — I'm truly sorry.
Now that same person is building apps on their own.
I haven't dragged anyone in, and I don't owe anyone an apology.
This feels like a quarter century's worth of something is finally being reclaimed.

Indeed, living a long life pays off.


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

Share this article

AI白書