Skip to content

Leon-Rud/scriptik

Repository files navigation

Scriptik

Scriptik

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.

macOS Windows License Whisper Apple Silicon CUDA


Why I Built This

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.

Scriptik demo

Features

  • 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

Getting Started

macOS

Requirements

  • macOS 14+ (Sonoma)
  • Python 3 (for Whisper)
  • ffmpeg (brew install ffmpeg)

Install

  1. Download Scriptik.app.zip from the latest release
  2. Unzip and move Scriptik.app to /Applications/
  3. Set up the Whisper transcription server:
git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
./scriptik-cli --setup

Then 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 install

This requires the full Xcode app (not just Command Line Tools) since the app uses SwiftUI and other macOS SDK frameworks.

Windows

Requirements

Install

One command sets up everything (Python/Whisper environment + app build):

git clone https://github.com/Leon-Rud/scriptik.git
cd scriptik
make install-windows

Or 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 build

Then 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.ps1

Output: Scriptik.Windows/publish/Scriptik.exe

Usage

  1. Launch Scriptik from /Applications or Spotlight - Settings opens automatically
  2. A floating circle appears - click it or press your global shortcut to start recording
  3. The circle shows a live waveform and elapsed time while recording
  4. Click again or press the shortcut to stop
  5. Text is automatically copied to clipboard and pasted into the active app

Right-click the circle for Settings, History, and Quit.

Using the Output

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.

Whisper Tips That Matter

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.

Configuration

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 events

Model Comparison

Speed 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.sh

CLI Commands

scriptik-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 help

Building from Source

macOS

Requires 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 bundle

The 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):

  1. Open Keychain Access
  2. Menu: Keychain Access > Certificate Assistant > Create a Certificate...
  3. Name: Scriptik Dev, Identity Type: Self Signed Root, Certificate Type: Code Signing
  4. Click Create, then rebuild

Windows

Requires .NET 8 SDK - download from dotnet.microsoft.com.

cd Scriptik.Windows
dotnet build              # Debug build
dotnet build -c Release   # Release build

To create a self-contained single-file executable:

powershell -ExecutionPolicy Bypass -File Scripts/build.ps1

Output: Scriptik.Windows/publish/Scriptik.exe

Troubleshooting

macOS

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

Windows

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

Contributing

Contributions are welcome! Whether it's bug fixes, new features, or documentation improvements - all help is appreciated.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

AI-assisted contributions are welcome, as long as they are well-tested and reviewed.

Uninstall

macOS

./uninstall.sh

Removes the CLI script, Quick Action, config, and Whisper environment. To remove the native app, delete Scriptik.app from Applications.

Windows

  1. Delete the Scriptik.Windows/publish/ folder (or wherever you placed the exe)
  2. Remove the Python environment: rmdir /s %LOCALAPPDATA%\scriptik
  3. Remove config and history: rmdir /s %USERPROFILE%\.config\scriptik
  4. If launch-at-login was enabled, it's automatically removed when the app is deleted

Support

Buy Me A Coffee

License

MIT

Author

Leon Rudnitsky - @Leon-Rud


Knowing the answer and saying it out loud aren't the same thing.

About

Voice-to-text for macOS & Windows - record, transcribe locally with Whisper, and paste anywhere. No cloud, no subscription.

Topics

Resources

License

Stars

9 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors