Voice-to-text for macOS & Windows - record, transcribe locally with Whisper, and paste anywhere.
Timestamps, pause detection, and auto-paste. No cloud, no subscription, no data leaves your machine.
I get stressed in technical interviews - I rush answers, skip important points, and only realize afterward that I knew the solution.
So I built a tool that records me, transcribes everything locally with timestamps, and flags every pause. The first time I saw [pause 4.2s] where I thought I'd paused for one second, it changed how I prepared.
Scriptik started as a personal interview prep tool and grew into a general-purpose voice-to-text app. It runs 100% locally - no audio ever leaves your machine.
- Cross-platform - native apps for macOS (Swift/SwiftUI) and Windows (C#/WPF)
- Menu bar / system tray - lives in the menu bar (macOS) or system tray (Windows) with a floating circle indicator
- Global hotkey - toggle recording from any app
- 100% local - no audio leaves your machine, ever
- Persistent Whisper server - model stays loaded in memory, no cold start
- Timestamps & pause detection - see exactly when you paused and for how long
- Live waveform - floating circle shows waveform while recording, wave bars while transcribing
- mlx-whisper acceleration - 5-10x faster on Apple Silicon (macOS)
- CUDA acceleration - GPU-accelerated transcription on NVIDIA GPUs (Windows)
- Auto-paste - transcription is copied to clipboard and pasted into the previously active app
- Multi-language - auto-detects English, Hebrew, and more
- Transcription history - searchable history of past transcriptions
- Sound feedback - optional audio cues for recording start, stop, and cancel
- Configurable - model, language, prompts, pause thresholds, and more
- macOS 14+ (Sonoma)
- Python 3 (for Whisper)
- ffmpeg (
brew install ffmpeg)
- Download
Scriptik.app.zipfrom the latest release - Unzip and move
Scriptik.appto/Applications/ - Set up the Whisper transcription server:
git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
./scriptik-cli --setupThen launch Scriptik from Applications or Spotlight.
Permissions: On first launch, Scriptik opens a setup screen that walks you through granting Microphone and Accessibility permissions. Once both are granted, the full settings unlock automatically.
Build from source (requires Xcode)
If you want to build the native app yourself instead of downloading the release:
git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
./scriptik-cli --setup
make installThis requires the full Xcode app (not just Command Line Tools) since the app uses SwiftUI and other macOS SDK frameworks.
- Windows 10+
- Python 3.10+ (python.org or
winget install Python.Python.3.11) - ffmpeg (
winget install Gyan.FFmpeg) - .NET 8 SDK (dotnet.microsoft.com)
One command sets up everything (Python/Whisper environment + app build):
git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
make install-windowsOr step by step:
# 1. Set up Python + Whisper (auto-detects NVIDIA GPU for CUDA)
cd Scriptik.Windows
powershell -ExecutionPolicy Bypass -File Scripts/setup.ps1
# 2. Build the app
dotnet buildThen run Scriptik.Windows\bin\Debug\net8.0-windows\Scriptik.exe.
First launch: If the Python environment isn't set up yet, Scriptik will prompt you to run the setup automatically.
Build a standalone .exe
To create a self-contained single-file executable that doesn't require .NET installed:
cd Scriptik.Windows
powershell -ExecutionPolicy Bypass -File Scripts/build.ps1Output: Scriptik.Windows/publish/Scriptik.exe
- Launch Scriptik from /Applications or Spotlight - Settings opens automatically
- A floating circle appears - click it or press your global shortcut to start recording
- The circle shows a live waveform and elapsed time while recording
- Click again or press the shortcut to stop
- Text is automatically copied to clipboard and pasted into the active app
Right-click the circle for Settings, History, and Quit.
Scriptik gives you a timestamped transcript like this:
[0.0s --> 2.3s] So the way I'd approach this system design problem...
[2.3s --> 4.1s] is to start with the requirements.
[pause 3.8s]
[7.9s --> 12.1s] We need to handle about ten thousand requests per second...
The real power is feeding this to an LLM for feedback. Here's a sample prompt:
I'm practicing for a technical interview. Here's the transcript with timestamps and pause markers. The job description is [paste JD]. My background is [paste CV/resume].
Analyze my responses: Where did I hesitate too long? Where was I unclear? What technical points did I miss? Give me specific, honest feedback and suggest how I could improve each answer.
This workflow - record, transcribe, analyze - is what makes pause detection and timestamps actually useful. You can see exactly where you struggled, not just what you said.
These settings are baked into Scriptik, but worth understanding if you're working with Whisper yourself:
condition_on_previous_text=False - By default, Whisper uses its own previous output as context for the next chunk. This causes hallucination cascading: one bad transcription snowballs into gibberish. Turning this off makes each segment independent and dramatically more reliable.
no_speech_threshold=0.05 - The default (0.6) aggressively skips segments it thinks are silence, which often cuts real speech. Lowering it to 0.05 means Whisper transcribes almost everything and lets the pause detection logic handle silence properly.
initial_prompt - Feed Whisper domain-specific words it might mishear. If you're interviewing for a backend role, set it to something like "Docker, Kubernetes, PostgreSQL, FastAPI, Redis". Whisper uses this as a spelling/context hint and gets technical terms right far more often.
Edit ~/.config/scriptik/config (shared between app and CLI):
WHISPER_MODEL="medium" # tiny, base, small, medium, large
PAUSE_THRESHOLD="1.5" # Seconds of silence before [pause]
INITIAL_PROMPT="Docker, FastAPI, PostgreSQL, React" # Hint words
AUTO_PASTE="true" # Auto-paste into active app
LANGUAGE="auto" # auto, en, he, ...
SHOW_FLOATING_CIRCLE="true" # Show/hide floating circle button
ENABLE_SOUND_FEEDBACK="true" # Audio cues for recording eventsSpeed estimates for ~10s recording (persistent server, no cold start):
| Model | Size | Apple Silicon | NVIDIA GPU | CPU only | Accuracy |
|---|---|---|---|---|---|
tiny |
75MB | ~0.5s | ~1s | ~1.5s | Basic |
base |
140MB | ~1s | ~2s | ~3s | Good |
small |
500MB | ~2s | ~5s | ~10s | Great |
medium |
1.5GB | ~4s | ~10s | ~25s | Excellent |
large |
3GB | ~8s | ~20s | ~50s | Best |
CLI-only alternative
If you prefer a command-line tool without the native app:
git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
./install.shscriptik-cli # Toggle recording on/off
scriptik-cli --setup # Install Whisper and create config
scriptik-cli --status # Check if currently recording
scriptik-cli --log # View recent log entries
scriptik-cli --help # Show helpRequires Xcode (not just Command Line Tools) - the app uses SwiftUI, AppKit, and other macOS SDK frameworks that are only available in the full Xcode installation.
cd Scriptik
swift build # Debug build
swift build -c release # Release build
bash scripts/bundle.sh # Create .app bundleThe app bundle is output to Scriptik/build/Scriptik.app.
Optional: Stable code signing - Without a signing certificate, the app uses ad-hoc signing and macOS will ask you to re-grant Accessibility permission after each rebuild. To avoid this (one-time setup):
- Open Keychain Access
- Menu: Keychain Access > Certificate Assistant > Create a Certificate...
- Name:
Scriptik Dev, Identity Type: Self Signed Root, Certificate Type: Code Signing - Click Create, then rebuild
Requires .NET 8 SDK - download from dotnet.microsoft.com.
cd Scriptik.Windows
dotnet build # Debug build
dotnet build -c Release # Release buildTo create a self-contained single-file executable:
powershell -ExecutionPolicy Bypass -File Scripts/build.ps1Output: Scriptik.Windows/publish/Scriptik.exe
| Problem | Solution |
|---|---|
| Microphone not working | Open Settings > Permissions, click Open Settings next to Microphone |
| Auto-paste not working | Open Settings > Permissions, click Open Settings next to Accessibility |
| Permissions keep resetting | Create a "Scriptik Dev" signing certificate (see Building from Source) |
| Empty/wrong transcription | Try a larger model in Settings, add context words to initial prompt |
| Global shortcut not working | Open Settings and re-set your preferred key combination |
| Problem | Solution |
|---|---|
| "Python not found" on launch | Run make setup-windows or powershell -File Scriptik.Windows/Scripts/setup.ps1 |
| No microphone detected | Open Settings > Status tab, click Open Sound Settings |
| Transcription server not running | Check Settings > Status tab; ensure Python/Whisper is installed |
| Empty/wrong transcription | Try a larger model in Settings, add context words to initial prompt |
| Global shortcut not working | Open Settings > Shortcut tab and re-set your preferred key combination |
| Slow transcription | Install NVIDIA CUDA drivers; re-run setup.ps1 to get GPU-accelerated PyTorch |
Contributions are welcome! Whether it's bug fixes, new features, or documentation improvements - all help is appreciated.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
AI-assisted contributions are welcome, as long as they are well-tested and reviewed.
./uninstall.shRemoves the CLI script, Quick Action, config, and Whisper environment. To remove the native app, delete Scriptik.app from Applications.
- Delete the
Scriptik.Windows/publish/folder (or wherever you placed the exe) - Remove the Python environment:
rmdir /s %LOCALAPPDATA%\scriptik - Remove config and history:
rmdir /s %USERPROFILE%\.config\scriptik - If launch-at-login was enabled, it's automatically removed when the app is deleted
Leon Rudnitsky - @Leon-Rud
Knowing the answer and saying it out loud aren't the same thing.
