myspoti
Native Android client for Spotify, built with Jetpack Compose
Captih is the first speech-to-text tool that actually transcribes Tunisian darija. Drop a video or audio file, get a timestamped SRT, plain transcript, and JSON in minutes. Trained on 93 hours of real
MediaTypeScript · PLpgSQLGitHub @FARUKxKUNOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Subtitles and transcripts for Tunisian Arabic (Darija), powered by a fine-tuned Whisper model. Next.js, Supabase, Clerk, Modal.
Loading the full README.
Read the full README ↗Tunisian Darija is a spoken dialect that mixes Arabic with French and some English, often in the same sentence. General speech-to-text tools (YouTube auto-captions, Otter, Descript) are trained on Modern Standard Arabic or other dialects, and they produce unusable output for Tunisian speech. Tunisian creators, podcasters and journalists end up subtitling by hand.
Billing is pay-as-you-go: users buy minute packs in Tunisian dinars through a local payment provider, and minutes are refunded automatically if a transcription fails.
src/lib/gemini-cleanup.ts)src/app/api/transcribe/route.ts)src/app/api/webhooks/dhmad/route.ts)src/proxy.ts, next.config.ts)| Layer | Technology |
|---|---|
| App | Next.js 16 (App Router), React 19, TypeScript |
| Styling and motion | Tailwind CSS v4, GSAP, Lenis, React Three Fiber |
| Auth | Clerk (synced to the database through a signed webhook) |
| Database | Supabase Postgres with Row Level Security |
| Speech-to-text | FARUKxAUTO (fine-tuned Whisper large-v3) on Modal serverless GPUs |
| Post-processing | Gemini 2.5 Flash, constrained proofreading |
| Payments | Dhmad.tn (Tunisian escrow and checkout) |
| Analytics | PostHog (EU region) |
| Hosting | Vercel |
Browser ──upload──▶ /api/transcribe (Next.js on Vercel)
│ same-origin + rate limit + Clerk auth
│ size / MIME / magic-byte checks
│ reserve minutes (Supabase)
▼
Modal GPU endpoint ──▶ FARUKxAUTO ──▶ word-level timestamps
│
▼
reconcile billing ──▶ Gemini proofreading (1:1 guard)
│
▼
store job (Supabase) ──▶ result page: preview, re-chunk, edit, export SRT/TXT
The full request flow, data model, API reference and security model are in docs/ARCHITECTURE.md.
src/
app/ Pages and API routes (App Router)
api/ transcribe, jobs, credits, payments, webhooks
components/ Landing sections, dashboard widgets, auth, motion primitives
lib/ Domain logic: credits, jobs, captions, payments, rate limiting
proxy.ts Auth gating + nonce CSP (Next 16 "proxy", formerly middleware)
supabase/
migrations/ Database schema, RLS policies and SQL functions
docs/ Architecture notes and screenshots
The model and the data behind it are kept private:
The app calls the inference service over an authenticated HTTP endpoint configured through environment variables.
This is a production app wired to several hosted services, so a full local run needs your own accounts for Clerk, Supabase and (for transcription) a compatible inference endpoint.
npm install
cp .env.example .env.local # fill in your own keys
npm run dev # http://localhost:3000
Apply the SQL files in supabase/migrations/ to a fresh Supabase project (see supabase/README.md). Without the inference endpoint, the landing page, examples, auth and dashboard still run.
captih is live and in early use. Current limits and the next steps:
captih was built by two engineering students at ISI Mahdia, Tunisia.
| Role | Main contributions | |
|---|---|---|
| Farouk Battikh (@FARUKxKUN) | Product, front end, ML | Product and brand design, the full front end (landing, 3D logo, motion, dashboard, editor, result page), the FARUKxAUTO fine-tune and its inference service, billing reconciliation, payment checkout fixes, security hardening |
| Yassine Bouteraa (@yassinebouteraa) | Back end | Backend architecture: Clerk authentication and user sync, the Supabase schema, RLS and SQL functions, the credit and job systems, the Modal transcription integration, the Dhmad payment flow and webhook, PostHog analytics, Gemini cleanup and caption formatting |
Copyright (c) 2026 Farouk Battikh and Yassine Bouteraa. All rights reserved.
This source code is published for viewing and evaluation only. It is not open source: you may not copy, modify, distribute, or deploy it, in whole or in part, without written permission from the authors. See LICENSE.