---
title: "Three small internal tools: two transcribers and a scraper panel"
description: "Alongside MoneyMama, I've been building small tools for the team with Claude Code. Two transcribe audio locally using Whisper, and another brings our scrapers into one place."
url: "https://rayson.me/writing/three-internal-tools/"
category: "Projects"
author: "Janarayson"
published: 2026-09-29
---

Not everything I've built this year has been for the MoneyMama app. There are also a few small tools I've made for the team, mostly to get rid of repetitive work that was taking up more time than it should.

With Claude Code, these are the sort of things I can now put together in a day or two. Nothing particularly ambitious, just tools that do one job and do it the way we need.

Three of them are worth mentioning: two transcribers and a panel for running our scrapers. All three run locally on a Mac rather than on a cloud server.

## YouTube Transcriber

The first one started with a fairly simple need. Mr Money TV's blog posts are written from the episode transcripts, and I needed a way to turn those episodes into text.

There are plenty of transcription services available, but I didn't see much reason to pay for one or use API tokens when my Mac could do the work itself.

So I built a YouTube Transcriber.

You paste a YouTube URL, and the app downloads the audio and transcribes it using Whisper. The text appears as it's being processed, and you can choose whether to include timestamps, copy the result, save it or look through previous transcripts.

It uses `whisper.cpp` with Apple's Metal acceleration and the large-v3-turbo model. The tools it needs, including yt-dlp and ffmpeg, are bundled with the app, so nobody has to install or configure them separately.

The first time you run it, it downloads the 1.6 GB Whisper model. After that, the transcription itself happens locally, without sending the audio to a service.

I originally built it for myself, but the rest of the team now uses it too.

<Figure
  src={youtubeTranscriber}
  alt="The YouTube Transcriber showing a loaded Mr Money TV episode and a completed transcription with timestamps"
  caption="A Mr Money TV episode ready to transcribe, and the finished transcript with timestamps."
  wide
/>

I've made a couple of additions since.

One is a command-line version that runs without opening the app. That lets scripts and AI agents use the same transcription process and get the result back as JSON.

The other came from YouTube itself. YouTube keeps changing how videos are delivered, and those changes sometimes break the version of yt-dlp bundled with the app.

Rather than release a new version of the whole app whenever that happens, it now checks for an updated yt-dlp once a day and installs it when needed.

## Audio Transcriber

The second app does something similar, but takes an audio or video file instead of a YouTube link.

You drop a file into the window, and it transcribes the audio locally. Nothing gets uploaded to a server.

I built this one for two reasons. I was curious whether Claude Code could build a proper native Mac app when I had no experience developing one, and I wanted something much smaller than an Electron app.

So instead of Electron, which I'd used for the YouTube Transcriber, I asked Claude to build it in SwiftUI.

It took a day.

One immediate difference was the app size. The Electron-based YouTube Transcriber takes up more than 400 MB on disk before downloading the model. The native Audio Transcriber is only about 50 MB.

It can also reuse the Whisper model from YouTube Transcriber if that's already installed, so the team doesn't have to download another copy.

<Figure
  src={audioTranscriber}
  alt="The native Audio Transcriber showing a file being processed and the finished transcript with speaker labels and timestamps"
  caption="The Audio Transcriber processing a file, and the completed transcript with a speaker label."
  wide
/>

A week later, the content team asked for speaker labels and start-to-end timestamps, which would make the transcripts more useful for the video editors.

I added those too, although that work deserves its own article.

The app is signed and notarised through Apple, so the team can install and open it without having to work around macOS Gatekeeper. We already have an Apple Developer account for MoneyMama, so I might as well use it.

## Scraper Operator

The third tool is a little different.

At FinLit, we run several scrapers to collect data for our analytics. They cover things like Instagram profiles and posts, Reddit discussions and a Bursa Malaysia screener.

Each scraper originally lived in its own repository. Two had small control panels, while the others had to be run from the terminal, sometimes with separate commands for scraping and importing.

That was manageable when we only had a few. But as more scrapers were added, keeping track of how to run each one became a hassle.

In July, I brought them together under one interface called Scraper Operator.

It's a small Hono server with a React dashboard. The server discovers scrapers from their folders, launches them as child processes and streams their logs to the dashboard using server-sent events.

Adding another scraper doesn't require building a new interface. I just put it in a folder with a configuration file, and the panel generates the controls it needs.

I also kept scraping and importing as separate steps. After collecting the data, I can preview what would change before anything gets written to the database.

<Figure
  src={scraperOperator}
  alt="The Scraper Operator dashboard showing registered scrapers, target databases and recent runs"
  caption="Scraper Operator, with the available scrapers and their recent runs."
  wide
/>

Unlike the other two tools, this one could technically run on a server. But several of our data sources block requests from datacentre IP addresses, and I didn't want to spend time dealing with proxies and blocked connections for something I'm currently the only person using.

So it runs on my Mac.

There's a small Electron launcher that starts the server and sits in the menu bar. I can open the dashboard like any other Mac app without having to start everything manually from the terminal.

None of these tools is particularly complicated, and that's what I like about them.

A few years ago, I probably wouldn't have bothered building them. Now, spending a day or two with Claude Code is often easier than continuing to put up with the chore.
