尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Drop a recording, get what was said. Transcription on whisper.cpp, billed by the minute; web, API, CLI, TUI and MCP.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Drop a recording, get what was said.
typeheard transcribes the audio and video people already have (interviews, lectures, podcasts, voice memos) with whisper.cpp on our own hardware, and bills by the minute of audio instead of by the month.
Built because people keep asking Reddit for "an Otter.ai alternative for files I already have" and "transcription software for my thesis interviews".
curl -fsSL https://typeheard.pwa.pit.world/install.sh | sh # installs the typeheard CLI
typeheard interview.m4a # prints the text
typeheard talk.mp4 --format srt --out talk.srt
typeheard login # API key for whole files
typeheard tui
No install: npx -y @profullstack/typeheard interview.m4a (Node 22.6+).
curl -F [email protected] -H "Authorization: Bearer $TYPEHEARD_API_KEY" https://typeheard.pwa.pit.world/api/v1/transcripts
curl https://typeheard.pwa.pit.world/api/v1/transcripts/<id>/txt # also md, srt, vtt, json
MCP: npx -y @profullstack/typeheard-mcp with TYPEHEARD_API_KEY set. Its tools are
transcribe_file, get_transcript and list_transcripts.
apps/web | Bun + Hono: pages, API, magic-link + passkey auth, CoinPay top-ups, x402 |
packages/transcribe | ffmpeg + whisper.cpp via @profullstack/media2markdown-core; the formats |
packages/db | Postgres. transcripts is also the job queue (for update skip locked) |
packages/cli | @profullstack/typeheard: CLI, hqtui TUI, and the API client |
packages/mcp | @profullstack/typeheard-mcp: stdio MCP server |
packages/auth, payments, notify, config | shared with bg0ne.com |
A job is a row. The upload is written to DATA_DIR, the row is queued, and a worker
claims it, transcribes it and stores the segments. The upload is deleted as soon as the
words are out. Jobs survive a restart. A failure refunds the minutes it was charged.
TH-XXXX-XXXX-XXXX-XXXX, from @profullstack/redeem-credits, stored only as
hashes) add transcription minutes to credit_ledger, once per account per code. Redeem on
/account ("Have a code?"), POST /api/v1/credits/redeem, typeheard redeem <code> or the MCP
tool redeem_code. Mint on the box:
docker exec typeheardcom-app-1 bun apps/web/src/admin/codes.js mint --minutes 300 --label "for Ada"
(list, revoke <id>, reconcile <user id>, quota <user id> <total>).@profullstack/affiliates): three single-use links per account at /invites, each
/i/<code> for 30 days. The code rides the emailed sign-in link, and pays INVITE_BONUS_MINUTES
(default 30) to both people only when that link creates the account, the two are not one mailbox,
the new address is not a throwaway one, the inviter's account is a day old
(INVITE_MIN_INVITER_AGE_HOURS) and the inviter has had fewer than 10 bonuses in 30 days.?ref= links are first touch, kept in the referral_code cookie and recorded in
aff_attributions when the link creates an account.docker compose up # Postgres + the app on :3000, payments off, everything free
Or bun install && DATABASE_URL=... bun run dev, with ffmpeg and whisper-cli plus a
ggml model where media2markdown-core looks ($XDG_DATA_HOME/media2markdown/).
| Variable | |
|---|---|
DATABASE_URL | required |
SITE_URL | public origin; the passkey rpID comes from it |
WHISPER_MODEL | path to a ggml model; the image bakes ggml-base.bin (multilingual) |
CONCURRENCY | transcriptions at once (default 1) |
PREVIEW_SECONDS | free preview length (default 180) |
RESEND_API_KEY, MAIL_FROM | sign-in mail |
COINPAY_API_KEY, COINPAY_BUSINESS_ID, COINPAY_WEBHOOK_SECRET | top-ups |
X402_ENABLED, X402_PAY_TO, COINPAY_X402_KEY | per-call payment for agents |
Secrets live in the logicsrc vault (typeheardcom--prod), not in a .env.
DATABASE_URL=postgres://... bun test
MIT.