SCRIBEGRABOpen the tool →

Obsidian voice notes, transcribed for free

Illustrated portrait of Sam RidderBy Sam Ridder — I build and run ScribeGrab on my own hardware, on my own. Who I am.

The Whisper plugins for Obsidian let you choose the server they talk to. Most people leave it on OpenAI and pay $0.006 for every minute they dictate. Change one field to ScribeGrab and the same plugin keeps working — on my graphics card, for nothing, without an API key.

The one field that matters

In the plugin's settings there is an API URL box, filled in with https://api.openai.com/v1/audio/transcriptions. Replace it with:

https://scribegrab.com/v1/audio/transcriptions

That's the whole setup. The endpoint speaks OpenAI's transcription API — same multipart form, same JSON back — so the plugin doesn't know or care that it isn't talking to OpenAI anymore.

Leave the API key box empty. There is no key to get and no account to make. If your plugin insists on something in that field, type any text: an Authorization header is accepted and thrown away.

Every setting, spelled out

Field names below are from nikdanilov's Whisper plugin, the popular one. Other plugins use the same words in a different order.

SettingWhat to put in it
Whisper API KeyLeave empty. Ignored if you fill it in anyway.
API URLhttps://scribegrab.com/v1/audio/transcriptions
ModelAnything — whisper-1 is fine. Every request runs Whisper large-v3, because that's the only model on the card.
LanguageEmpty for auto-detect (about 100 languages), or a code like en, nl, de. The word auto is understood too.
PromptAccepted and ignored. Vocabulary hints don't reach the model here.
TemperatureAccepted and ignored — the transcriber uses Whisper's own fallback ladder.
Response formatjson is what plugins expect. text, srt, vtt and verbose_json also work.

Check it in ten seconds

Before you trust it with a real recording, throw any audio file at it from a terminal:

curl https://scribegrab.com/v1/audio/transcriptions \
  -F [email protected] \
  -F model=whisper-1

{"text":"This is the first sentence of the memo."}

Add -F response_format=srt for time-coded subtitles, or verbose_json for a segment list with start and end times. The request stays open until the transcript exists, exactly like OpenAI's — a two-minute voice note usually comes back in a few seconds.

The limits, honestly

This is one person's computer, not a cloud region. Everything below is the same rule the website itself runs on, not a special API tier:

What happens to your recording

Your audio goes to a machine in my house, gets transcribed, and the uploaded file is deleted the moment the transcript exists. The transcript itself is wiped within 45 minutes. Nothing is kept, sold, or used to train anything, and your recording is never forwarded to OpenAI, Google or any other API — the whole point of this site is that it doesn't pay per minute either. Details in the privacy policy.

That said: it is still my machine. If a recording is confidential enough that a stranger's server is a problem, run Whisper locally instead — that advice costs me nothing and it's the right advice.

Not just Obsidian

Anything that lets you set an OpenAI base URL can use this: dictation launchers, shell scripts, a Makefile that subtitles your screen recordings. If your tool asks for a base URL rather than a full endpoint, give it https://scribegrab.com/v1 and it will append the rest itself.

ScribeGrab is not affiliated with OpenAI or Obsidian; "OpenAI-compatible" here means it accepts the same request and returns the same shape of answer.

Questions

Why is it free? What's the catch?

The cards are already bought and paid for, so your audio costs me electricity and nothing else. Ads on the website cover that. The catch is the queue and the missing uptime guarantee — that's it, and both are written above.

My plugin says "recording too short".

That's the plugin, before it ever reaches me: most of them refuse to send clips under a second. Talk for a few seconds longer.

I get "Could not read the media length" or "no audio track".

The first means the file is truncated or corrupt — nothing in it says how long it is, and I refuse anything I can't measure rather than let it chew on the card forever. Browser recordings that leave the length open (the usual .webm from a plugin) are fine: those get measured properly. The second means there is genuinely no sound in it, which happens with silent screen recordings.

Can I send a YouTube link instead of a file?

Not through this endpoint — OpenAI's API has no field for it. The website does: paste the link on the YouTube page.

Try it in the browser first →