尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Subtitles and transcripts for Tunisian Arabic (Darija), powered by a fine-tuned Whisper model. Next.js, Supabase, Clerk, Modal.
翻譯準備中
正在載入完整 README。
檢視完整 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.