Dhwani records a voice note in your browser, transcribes it on your computer and saves the result as a .txt file in a folder you choose. After an initial model download, speech recognition works without network access, and audio is discarded by default once the transcript is returned.
The project’s GitHub repository documents a deliberately small application: Python 3.12, FastAPI, vanilla JavaScript, one speech model and a file-based notes store. There is no notes database to export from later.
Its restrictions matter as much as its privacy features. Dhwani supports English, caps recordings at 25 seconds and processes one transcription at a time on the CPU. It is a local, single-user capture tool, with no cross-folder search. Those choices make it useful for short thoughts and dictated notes, but poorly suited to recording an uninterrupted meeting.
Setup Starts With Python and a Model Download
Dhwani is self-hosted software, so using it means running a Python application on the machine that will record and transcribe your notes. The repository includes a first-time setup script at scripts/setup.sh and separate setup, run and configuration instructions.
The documented architecture gives readers several useful checkpoints:
- Prepare the Python application. Dhwani’s stack uses Python 3.12. Follow the repository’s first-time setup instructions for its dependencies.
- Complete the initial downloads while online. Whistle’s engine and model are fetched and cached. Dhwani’s architecture places them under
~/.cache/cactus-needle. - Start the local server. The documented server address is
127.0.0.1:8000, with the notes interface at/app. - Register a destination folder. Notes are written into folders you select on the machine running the server.
The Whistle model card confirms that its engine and weights are fetched once and cached. Cactus Compute describes the model itself as a single 16.9 MB file; that figure is the model size, not the total installed application size or its memory requirement.
The initial download is an important boundary. “Offline transcription” describes what happens after the necessary files are available locally. It does not mean a fresh installation can obtain its dependencies and model without an internet connection.
The browser interface also has a separate external styling dependency, which needs attention if your goal is an entirely self-contained installation.
How a Recording Becomes an Editable Note
Dhwani captures microphone audio at 16 kHz, meaning 16,000 samples per second, and encodes it as a 16-bit mono WAV file. Recording stops when you click Stop or reach the 25-second cap.
The browser then sends that WAV to the Python server through POST /api/transcriptions. Because the server runs on the loopback address, this browser-to-server transfer stays on the same machine. Offline processing still uses a local HTTP connection; it simply avoids sending the recording to a remote transcription service.
Before transcription, the server checks the request’s Host and Origin, payload size and WAV format. Whistle receives the audio samples with English selected, returns text, and the application appends that text to the note editor. You can edit the result before choosing Save as.txt. The repository documents this sequence in its architecture and recording flow.
At the documented recording format, a full-length clip contains about 800,000 bytes of audio samples before the WAV header:
16,000 samples/second × 2 bytes/sample × 25 seconds
That is a small, bounded recording, but it is still processed after capture stops. Dhwani’s documented workflow is record, transcribe, edit and save. It is not a continuously updating live-caption interface.
Audio normally remains in memory through this process, moving from browser samples to WAV bytes and then server-side samples. The text is the durable output once you save it.
Dhwani’s Limits Are Narrower Than Whistle’s
Cactus Compute introduced Whistle on October 2, 2026. Its documented capabilities include seven languages, word timestamps and longer recordings processed through windows. Dhwani exposes a much smaller slice of that engine.

Whistle supports English, German, French, Spanish, Italian, Dutch and Polish. It can process up to 30 seconds in one pass and use windowing beyond that. Dhwani selects English and stops recordings at 25 seconds. These are application-level boundaries, so the underlying model’s broader capabilities should not be read as features available in Dhwani.
| Documented Dhwani limit | Practical consequence |
|---|---|
| English-only recognition | Whistle’s other supported languages are not available through the documented workflow. |
| 25-second recordings | Longer thoughts need multiple clips; uninterrupted meeting capture falls outside the design. |
| One CPU transcription at a time | The app cannot process simultaneous transcription jobs. |
| Local-only access | A browser on another computer or phone cannot use the default loopback-bound server. |
| No cross-folder search | Saving notes across several folders does not create a searchable, unified library. |
These limits come from Dhwani’s documentation. The single-job restriction belongs to Dhwani’s one-user, one-process design; it should not be treated as a universal concurrency restriction of the Whistle model.
I’d treat Dhwani as a dictation pad for short, deliberate captures. The ability to append a transcript to the note editor makes a longer written note possible through several recordings, but the 25-second boundary still interrupts continuous speech. For a task such as capturing one idea, that is manageable. For a lecture or interview, it changes the workflow substantially.
Plain Files Make Storage Portable, but Retrieval Is Manual
Dhwani saves each note as a .txt file in a registered folder. Existing files are not overwritten. Folder registrations are tracked separately in data/folders.json, and unregistering a folder leaves its files on disk, according to the repository’s storage and API documentation.
The division is straightforward:
- The folder registry tells Dhwani where it may save notes.
- The notes themselves remain ordinary text files.
- Removing a folder from Dhwani’s registry does not delete its contents.
Plain text is a useful choice here. A note remains readable in a basic editor, available to ordinary filesystem tools and easy to move without an application-specific export step. The no-overwrite behavior also protects an existing file from being silently replaced during a save.
The tradeoff is organization. Dhwani has no cross-folder search, so registering several destinations does not turn them into one searchable knowledge base. Finding an older note may mean navigating folders or using a separate text-search tool.
My view is that the file format is the stronger long-term feature than the absence of a database by itself. Portability comes from being able to open and reuse the output independently. It also means users need a sensible folder structure, and possibly another tool for retrieval.
Privacy Depends on Which Part You Mean
Dhwani documents several distinct privacy behaviors: local transcription, disabled Whistle usage events, limited audio retention and local file storage. Those features address different questions and should be evaluated separately.
Audio Is Discarded Unless Debug Capture Is Enabled
By default, audio is transcribed in memory and discarded after text is returned. The documented exception is debug mode: setting enables saving clips and transcripts to a debug folder. That option is off by default.
Frequently Asked Questions
3 questions
1Does Dhwani Save Audio Files by Default?
No. Audio is transcribed in memory and discarded by default. Setting VOICENOTES_DEBUG_CLIPS_DIR enables the documented exception, which saves debug clips and transcripts.





