Double-tap Control, speak, and the Tamil lands in the app you're in.
Mozhi · மொழி · Tamil voice typing
பேசுங்க. எழுத்தாகும். Speak Tamil. It types, in any app.
Mozhi is an open-source desktop app I designed and built for Tamil speakers. Double-tap Control, speak Tamil, Tanglish or English, and it types into whatever app you're in: Slack, WhatsApp, Gmail, Notes, VS Code. Whisper runs on your own computer, so your voice never leaves it.
Scope
Product & interaction design
Rust + Tauri desktop app
Brand system & landing site
Open-source release
Role
Designer & builder, solo
Pair
Claude Code, on every commit
Timeline
Oct – Nov 2026
Beta 1 on 29 Oct
v0.3.1 on 1 Nov
Outcome
macOS & Windows, v0.3.1
Open source, Apache-2.0
Kamaldesigner & builder, soloHi, I'm Kamal 👋
Contents
The Process.
Seven chapters, from one line in a README to a third version anyone can install. Read it the way it happened, or jump straight to a part.
One sentence in the README set the whole brief, and every decision after it had to answer to all four of its parts.
Spark · The brief
A tool for the language you think in.
Tamil speakers, writing by voice, in Tamil, on their own machines. Each phrase rules something out: an English-first dictation tool, a cloud service, an account, a subscription.
From the README
Tamil speakers should be able to write by voice in their own language, on their own computer.
No account. No cloud. No telemetry. Free, Apache-2.0, and அன்னைத் தமிழுக்கு, for Mother Tamil.
Spark · How Tamil is written
Write the way people speak.
On WhatsApp, Tamil is often typed in Latin letters. At work it slides into English halfway through a sentence. Mozhi treats all of it as real writing, not as mistakes to correct.
Tanglish is a writing mode
“Tamil, in the Latin letters you already type on WhatsApp.” Mozhi's transliteration follows chat habits, zh for ழ, tr for ற்ற, long vowels doubled, instead of an academic standard nobody types.
Naalaikku meeting-a pathu manikku vechukkalaamaa?
The register is spoken
The interface is written the way people talk. The contributor guide says it plainly: use the word people say aloud, not a formal coinage.
மைக்ரோஃபோன்microphone, as people say itஒலிவாங்கி உள்ளீட்டுச் சாதனம்a coinage nobody says aloud
02 / 07What makes it hard
Problemசிக்கல்
Three things break Tamil dictation: English inside Tamil, words the model invents, and text pasted somewhere it doesn't belong.
Problem · Two languages, one line
English words live inside Tamil sentences.
Say this to a speech model and it can go wrong two ways: meeting comes back as மீட்டிங், or the whole line is heard as English. Both are wrong for someone who said it in Tamil.
நாளைக்குmeeting-அபத்துமணிக்குவெச்சுக்கலாமா?
“Shall we keep tomorrow's meeting at ten?”
The prompt shows both kinds of mixingso English words stay in Latin letters instead of being spelled out in Tamil.
Language ID leans to TamilA Tanglish sentence full of English words must still decode as Tamil.
Auto decides per sentencefrom about 1.5 s of audio, and asks again at about 8 s if the first answer was unsure.
Polish puts English backமீட்டிங் → meeting, when the Tamil script swallowed an English word.
Problem · Words nobody said
The model hears things in a quiet room.
Whisper learned from YouTube subtitles, so in silence it sometimes types a sign-off nobody said. Mozhi trims the silence first with a voice detector, “the single best defence” in the code's own words, then strips the phrases it knows Whisper invents, in English and in Tamil.
Silero VADtrims the silenceclean.rsdrops the invented lines and repeat loops
What gets typedபத்து மணிக்கு meeting
Problem · The wrong window
Never paste into the wrong place.
A dictation tool types into other people's apps. One message pasted into the wrong chat and nobody trusts it again. That line from the contributor guide became four rules.
01
Name the app first
Before anything is pasted, the pill says where it's going: இதில் எழுதும் Typing into Slack › Message #general. Switch apps mid-sentence and it follows you.
02
Never take focus
The pill is a non-activating panel. Your app keeps the cursor the whole time, so the text lands exactly where you left it.
03
Listen only for the trigger
It never records your typing. The key hook watches for the double-tap, plus Enter and Esc only while the pill is open.
04
Give the clipboard back
Mozhi snapshots your clipboard, pastes, and puts it back 350 ms later, unless something else wrote to it meanwhile.
03 / 07How it works
Systemஅமைப்பு
A Rust core, two small web views and Whisper, all on the same computer as your voice.
System · The dictation loop
From two taps to typed text.
Tauri 2 with a Rust core runs the state machine, the microphone, the models and the paste. The pill and the settings are plain TypeScript. Nothing in the loop needs the internet.
⌃⌃Remember the app and field you're in
MicOpens in about 10–40 ms
16 kHzRing buffer, resampled to mono
PreviewRe-reads the last 25 s every ~700 ms
VADSilero trims the silence
Whisperwhisper.cpp, Metal GPU on a Mac
CleanInvented lines out, Tanglish spelled
PolishOptional, local, 6 s or the raw text
PasteInto the app you're in now
⌃⌃ Remember the app and field you're in
13%Tamil character error rate with a fresh Whisper state for each pass
48%the same audio when the state was reused between passes: a bug found and fixed
0network calls in the loop; only model downloads you start, and your own local polish
System · The double-tap
Only a clean double-tap counts.
Control is the key you hold for everything else, so Ctrl+C must never start Mozhi. A tap is a press and release of the trigger on its own, under 260 ms, and the second must come within 380 ms. Try it.
Tap control on your keyboard twice, or tap this key.
00.5 s1 s
Waiting for two taps
Or try a mistake:
System · Eight models
Fast or precise? You choose.
From a 60 MB base to a 1.6 GB full-precision turbo, including two Tamil fine-tunes. Since v0.2.0 Mozhi starts with Tamil Small, a Whisper fine-tune from IIT Madras SPRING Lab. Only one model stays in memory at a time, and every download is checked against its SHA-256.
IIT Madras SPRING LabDefault · v0.2.0Tamil Small · fine-tuned264 MBSpeedதமிழ்
Tamil only
vasista22Tamil Medium · fine-tuned1.53 GBSpeedதமிழ்
Tamil only
Whisper · full precisionLarge v3 Turbo1.62 GBSpeedதமிழ்
WhisperLarge v3 · Q51.08 GBSpeedதமிழ்
WhisperMedium · Q5539 MBSpeedதமிழ்
WhisperSmall · Q5190 MBSpeedதமிழ்
WhisperBase · Q560 MBSpeedதமிழ்
English, in practice
The trade-off is real: the Tamil fine-tunes are the most accurate for Tamil, but they write English words in Tamil script. Bring your own: drop a ggml .bin into the models folder and it appears in the list.
System · Polish, guarded
A clean-up filter, not an assistant.
Polish is off by default. Switch it on and a small model on your machine, through Ollama, tidies punctuation and keeps English words in English. Its prompt opens with “You are a dictation clean-up filter, not an assistant.” And when it misbehaves, Mozhi throws its answer away.
What you saidநாளைக்கு காலையில meeting இருக்கு
Sure! Here is the cleaned text: நாளைக்கு காலையில meeting இருக்கு.Rejected · adds a preamble
நாளைக்கு காலையில meeting இருக்கு. (Tomorrow morning there is a meeting.)Rejected · adds a line you didn't say
நாளைக்கு காலையில meeting இருக்கு.Kept · same words, a full stop
An answer is also thrown out if it is shorter than half or longer than 1.6 times what you said. If polish takes more than 6 s, or Ollama isn't running, the raw transcript is pasted instead. The answers above are illustrative; the rules are the ones in the code.
04 / 07What you see and touch
Designவடிவமைப்பு
One floating pill, seven marks that move with your voice, and a settings app that speaks Tamil first.
Design · The pill
Everything happens in one small card.
It floats at the bottom of the screen, above whatever you're writing in, and never steals the cursor. This is the real component, running here: the same markup, the same voice indicator, the same Tamil.
இதில் எழுதும்SlackMessage #generalAutoபேசுங்கள்: தமிழ், Tanglish, English…⌃⌃↵இடescரத்து✕இடு
01இதில் எழுதும் Typing into: the app and the field, always named first
02The mode chip cycles Auto, தமிழ், Tanglish, English
03The voice well: three dots that breathe, listen and write
04⌃⌃ or ↵ inserts, esc throws it away
05இடு Insert, the one gold button
06Edit in the pill: since v0.2.0 a click stops to fix a word; since v0.3.0 Mozhi keeps listening while you fix, and Enter inserts into the app you started in
Design · Three dots that listen
The dots are the only thing that moves.
The logo's three dots are the voice indicator. Seven marks morph between five states, and any state can interrupt any other because every mark eases toward its target each frame. Pick a state.
தயார்ready, double-tap ⌃⌃
With reduced motion the marks hold still and the colour and label carry the state.
Design · Three ways to write
One voice, three ways to write it.
You say one sentence. Mozhi writes it in Tamil script, in Tanglish or in English. Auto, the default, picks Tamil or English for each sentence.
You say“நாளைக்கு meeting-அ பத்து மணிக்கு வெச்சுக்கலாமா?”
நாளைக்கு மீட்டிங்கை பத்து மணிக்கு வெச்சுக்கலாமா?Tamil script. Turn on local polish and English words stay English: meeting-அ.whisper language: ta
Naalaikku meeting-a pathu manikku vechukkalaamaa?Tamil, in the Latin letters you already type on WhatsApp.whisper language: ta → chat-style transliteration
Can we keep tomorrow's meeting at ten?Say it in English, get English.whisper language: en
Design · Tamil leads
Tamil leads, English supports.
The settings app opens in Tamil, with every heading in Tamil and its English beside it. Models are postage stamps with speed and Tamil-accuracy meters. History is a stack of palm-leaf receipts that never leaves your computer.
முகப்புHome
மாதிரிகள்Models
எழுத்துWriting
விசைShortcut
வரலாறுHistory
அனுமதிகள்Permissions
பற்றிAbout
Onboarding opens with வணக்கம்! and takes four steps: hello, permissions, a model download, and a first try. Error messages say what happened and where, Slack-இல் ஒட்டப்பட்டது, never a vague “something went wrong”.
05 / 07How it looks
Brandஅடையாளம்
“Every word starts as a dot.” The brand book opens with that line, and everything else is drawn from Tamil Nadu, around 1000 CE.
Brand · ஃ, the mark
ஃ, a letter only Tamil has.
Āytham is three dots in a triangle. It became the logo, the app icon and the voice indicator, and it means three things at once.
The bottom dots sit a little low, so the triangle reads as centred. Never rotate it, add a fourth dot or outline the dots.
Āythamஆய்தம்
A letter no other script has, with a sound of its own.
The Muvendarமூவேந்தர்
Chera, Chola and Pandya, the three crowned kings who carried Tamil for two thousand years.
Pulliபுள்ளி
Every kolam starts as a grid of dots on the doorstep at dawn.
Brand · Colour
Colours you'd find at home or in a temple.
Every colour has a Tamil name for something real. “Red is the ground, turmeric is the voice, palm-leaf cream is where text is read.” Tap a swatch to copy it.
Paper 45Kumkum 30Mai 15Manjal 10
Brand · Type
ழ takes the accent.
The wordmark is Anek Tamil at its heaviest and narrowest, “condensed like a Manjapai print”, the cloth shopping bag every Tamil home has. One letter gets the turmeric: ழ, the sound only Tamil has.
மொழி
அனெக் தமிழ்Anek Tamil · 800 at width 75 for display, 100 for the interface
திரோ தமிழ்Tiro Tamil · quotations and the Thirukkural
JetBrains MonoReceipts, labels and data
Brand · Motifs
Drawn by a script, from a thousand years ago.
The patterns aren't stock. A small Python script generates every one as SVG, the same output every time: a sikku kolam traced as one unbroken line, the Thanjavur temple on a pixel grid, and the ring of fire around Nataraja.
Sikku kolamசிக்கு கோலம்One line that never lifts, woven around a grid of dots.
Thanjavur, 1010 CEதஞ்சைRajaraja Chola's temple, a thousand years later, in pixels.PrabhaபிரபைNataraja's ring of fire, the ring that turns while Mozhi writes.
06 / 07Getting it out
Shipவெளியீடு
A landing page that reads Tamil first, a privacy policy you can read in ten seconds, and a beta for two operating systems, in public.
Ship · The site
A landing page in two scripts.
Every heading is Tamil first with English underneath, from பேசுங்க. எழுத்தாகும். down to a bilingual FAQ. Scroll the page inside the window, or open it.
“Privacy is the product,” says the contributor guide. So the promise is printed like a copper-plate charter, செப்பேடு No. 1010, with every line you'd want to check and a total of ₹0.
0 bytesof your voice uploaded, ever
Offlineafter the one model download you choose
2 callsare all the app may make: model downloads you start, and your own local polish
Localhistory lives only on this computer, with a Clear all
Ship · Launch day
Twenty-nine October, in twelve commits.
The public history covers one day. Most of the app was built before it starts: it landed as a single commit of 116 files. What the day shows is the release, mistakes included.
Landing page, first commit3b4eded
Ignore the Vercel linkf1eb674
Landing reworked, the maker creditedf7954e4
Portrait caption on one line4d6030a
Desktop app, brand system and docs: 116 filesb5e7174
The new voice pill, open at login, release buildsf866fdc
Fix: Metal links with newer Xcodeb54bbeb
Site points downloads at the beta6824cb8
README rebuilt with recorded demos33a193e
v0.2.0: edit in the pill, Tamil model by defaultd846a98
Ship · The betas
Small, unsigned and honest about it.
Beta 1 shipped at 13:39. The installers are tiny because the speech models aren't inside them; you choose one after install. They aren't signed yet, and the site says so instead of hoping you won't notice. v0.2.0 was tagged the same afternoon.
4.5 MB.dmgmacOS 12+, Apple Silicon. Ad-hoc signed, not notarised: right-click, then Open.
5.3 MB-setup.exeWindows 10 and 11, x64. Not code-signed: More info, then Run anyway.
6.6 MB.msiWindows 10 and 11, x64, for managed installs.
v0.2.0tagged 14:44Edit in the pill: click the text to stop and fix it, Enter pastes. Tamil Small becomes the default model.
Ship · Version three
மூன்றாம் பதிப்பு. மூன்று புதுமைகள். Version three, three new things.
v0.3.0 shipped on 1 November, three days after Beta 1. Two of its three changes remove a moment where you had to start over: stopping to fix a word, and losing a recording to an error. v0.3.1 followed the same day with two fixes.
SSlack#general
நாளைக்கு பத்து மணிக்கு meeting வெச்சுக்கலாம்.
கேட்கிறேன் listening…
பேசும்போதே திருத்துங்கள்
Edit while you speak
Click into the text while Mozhi is still listening. Fix a name, add a line: every phrase you say next goes in where your cursor is, and the words it is still hearing show on a live line underneath. ↵ inserts, ⇧↵ adds a line, esc cancels.
⌕இதயம்
❤️ 💛 🧡 💚 💙 💜 🤍 💕
🙏 😊 😂 ❤️ 👍 🔥 🎉 🪔 🍛 ☕
“இதயம் எமோஜி”→ ❤️
பேச்சிலேயே எமோஜி
Emoji, without leaving the pill
A 😊 button opens a picker with an everyday row, your recent picks and every emoji by group. Search in English, Tamil or Tanglish: heart, இதயம், sirippu, sapadu, vanakkam. Or just say it: “heart emoji”, “இதயம் எமோஜி”.
Couldn't transcribe
உங்க பதிவு பத்திரமா இருக்கு.
Your recording is safe.
Try againCopy textReport
பிழை வந்தாலும் சொற்கள் தொலையாது
Errors that keep your words
If a transcription fails, the recording is kept. Try again shows the new result for you to check before it goes in, Copy text saves what you have, and Report opens a GitHub issue with your version and the error, never anything you dictated.
v0.3.1two fixes, same day
A phrase could go missing. If the pill was still loading when the first phrase was committed, that phrase could be dropped. Phrases are now numbered: the pill notices a gap and resyncs, and never accepts a draft that skipped one.
“Mozhi quit unexpectedly” on quit. The speech engine aborted while shutting down because the model was still loaded. The model is now released before Mozhi exits.
One sentence of brief, a tool that keeps your voice at home, and a small offering to the language I think in.
Reflection · Results
Beta 1 is out
0bytes of your voice uploaded, ever
2taps of Control to start, and two to insert
4.5MBthe macOS download, models chosen after install
8speech models, two of them Tamil fine-tunes
Speak Tamil, Tanglish or English. It types, on your own computer.
Reflection · Lessons
What I'd tell the next person building one.
Most of the hard parts weren't the model. They were respect: for how people talk, where their text goes and who hears them.
01
Design for how people talk
Tanglish and English words are part of Tamil today. Treating them as errors would have made a tool for nobody.
02
Trust is a paste in the right place
Name the target, never take focus, give the clipboard back. Four small rules carry more weight than accuracy.
03
Guard the model's imagination
Trim the silence, strip the invented lines, and let polish fail back to the raw words instead of improvising.
04
Let the culture draw the brand
ஃ, the kolam and the temple came from the language itself, generated by a script, not borrowed from a stock set.
05
Ship honestly
“Coming soon” until the beta was real, unsigned builds labelled as unsigned, and a failed build fixed in the open.
Reflection · What's next
Where it goes from here.
Straight from the site's call for contributors. Nothing here is promised by a date.
Sharper TanglishBetter spelling rules, so the Latin letters look like what people already type.
District by districtTesting with Madurai, Kongu, Jaffna and Malaysian Tamil, where accuracy still varies.
Tamil models, measuredConverting and benchmarking Tamil fine-tunes, then a Linux port and signed builds.
Reflection
Final thoughts before we leave.
அன்னைத் தமிழுக்கு ஒரு சிறு காணிக்கை. A small offering to Mother Tamil.
Mozhi is free, open source and has no account and no cloud. It exists so that Tamil can be spoken to a computer and written back without leaving the room it was spoken in.
Tamil belongs to everyone who speaks it, and so does this tool. Fork it, fix it, teach it your district's way of talking.