Standalone transcription PWA with Web Speech API and local Whisper AI
  • TypeScript 85.5%
  • CSS 12%
  • Dockerfile 1.3%
  • HTML 1.2%
Find a file
Jeff Emmett b44526a217 fix(rmic): POST capture-event before PUT blob so it reconciles → transcribes
Blob-first left the capture stuck at INDEXED: the server reconciles on blob arrival by
looking for an existing INDEXED holon, which didn't exist yet. Capture-first creates it,
then the blob advances STORED→TRANSCRIBED. (Caught by the Playwright end-to-end smoke test.)
2026-05-30 17:32:21 +02:00
public/icons Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
runtipi Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
src fix(rmic): POST capture-event before PUT blob so it reconciles → transcribes 2026-05-30 17:32:21 +02:00
.dockerignore Add .dockerignore for optimized Docker builds 2026-02-21 17:49:11 -07:00
.gitignore Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
docker-compose.netcup.yml fix(deploy): healthcheck uses 127.0.0.1 (nginx is IPv4-only; localhost→::1 gave false unhealthy) 2026-05-29 18:20:48 +02:00
docker-compose.yml Add Docker healthcheck to docker-compose.yml 2026-02-21 17:49:20 -07:00
Dockerfile Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
index.html Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
nginx.conf Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
package-lock.json Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
package.json Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
README.md Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
tsconfig.json Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
tsconfig.node.json Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00
vite.config.ts Initial commit: Standalone transcription PWA 2026-01-02 10:37:07 +01:00

Transcribe

A standalone Progressive Web App (PWA) for voice transcription, extracted from canvas-website.

Features

  • Two Transcription Modes:

    • Web Speech API - Fast, real-time transcription using browser's built-in speech recognition (Chrome/Edge)
    • Local Whisper - Offline-capable transcription using Whisper AI model running entirely in the browser
  • PWA Support - Install on any device, works offline

  • Simple UI - Start/stop recording, copy/download transcripts

  • No Server Required - All processing happens in the browser

Quick Start

# Install dependencies
npm install

# Run development server
npm run dev

# Build for production
npm run build

Docker Deployment

# Build and run with Docker
docker compose up -d --build

# Or build manually
docker build -t transcribe-app .
docker run -p 3000:80 transcribe-app

Runtipi Deployment

Copy the contents of the runtipi/ folder to your Runtipi apps directory:

cp -r runtipi/* /path/to/runtipi/user-config/transcribe/

Or use the pre-built Docker image from GitHub Container Registry.

Browser Compatibility

Browser Web Speech API Whisper (Local)
Chrome Full Full
Edge Full Full
Safari Partial Full
Firefox No Full

Tech Stack

  • React 18 + TypeScript
  • Vite with PWA plugin
  • @xenova/transformers for local Whisper inference
  • Web Speech API for browser-native transcription

License

MIT