__ __ __ _ __ _ __
/ / / /__ / /___| | / /____(_) /____
/ /_/ / _ \/ / __ \ | /| / / ___/ / __/ _ \
/ __ / __/ / /_/ / |/ |/ / / / / /_/ __/
/_/ /_/\___/_/\____/|__/|__/_/ /_/\__/\___/
The Tactical Blade for Prose. HeloWrite is a distraction-free, terminal-based writing environment built for speed, paranoia, and deep focus. It's not an "app"—it's a void.
One word at a time. No distractions, no detours.
HeloWrite is a digital typewriter with an infinite roll of paper and no "Format" menu to hide behind.
It has one job: help you scrape words out of your skull.
HeloWrite treats prose with the same rigor developers treat code, minus the steep learning curve. Terminal-native, standard keybinds, clean aesthetics.
Writing is hard. Focus is paramount. Everything else is secondary.
- Fast Startup: Near-instant on modern Python. No bloat, no delays.
- The Void: High-contrast, minimalist UI designed to stop flashlighting your retinas.
- Git-First Workflow: Don't just "sync"—stage, commit, and push your work only when it is worth keeping.
- Pure Focus: F11 toggles distraction-free mode. No icons, no ribbons, just you and the text.
- Dynamic Padding: Alt+Left/Right to tune your horizontal padding. Spare your eyes the long trek across the screen.
- File Explorer: Ctrl+O to toggle explorer. Enter to open files. Alt+Up/Down to navigate directory hierarchy.
- Git Sync (The Staging Area): Use Alt+G (Option+G on macOS) or the Command Palette (Ctrl+P) to push your current file changes. It stashes local changes, adds/commits the current file, and pushes—all without leaving the editor. Auto pull on startup if desired.
- Pomodoro Timer: Use Ctrl+T to launch a timer modal. Enter minutes, press Enter to start. When complete, a modal appears with success message.
- Typewriter Mode: Toggle with
Ctrl+Shift+T. When enabled, the cursor stays centered like an old-school typewriter.
Ships with built-in themes or follows your system theme.
Just curious? Run HeloWrite once without installing. UVX creates a temporary environment, runs the app, and cleans up after itself. Config is written to ~/.config/helowrite/.
uvx --from "git+https://github.com/burninc0de/helowrite.git" helowriteRequires UV (install with curl -LsSf https://astral.sh/uv/install.sh | sh).
Like what you see? Install with pipx to make helowrite available in every terminal as a permanent CLI command in an isolated environment. This is your daily driver install.
Install pipx first (if you do not already have it):
Arch Linux
sudo pacman -S python-pipxmacOS (Homebrew)
brew install pipxDebian/Ubuntu
sudo apt install pipxFedora
sudo dnf install pipxGeneric Fallback
python -m pip install --user pipx
python -m pipx ensurepathThen install HeloWrite:
pipx install "git+https://github.com/burninc0de/helowrite.git"This creates an isolated environment and exposes the helowrite command globally in your user PATH.
To upgrade to the latest version:
pipx upgrade helowriteTo uninstall:
pipx uninstall helowriteUse this if you want to hack on HeloWrite itself. We use a virtual environment so your system python stays untouched.
# Clone the void
git clone https://github.com/burninc0de/helowrite.git
cd helowrite
# Set up environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install & run
pip install -e .
helowrite Important: because this is a venv-local editable install, helowrite is available only while that venv is active.
Requirements: Python 3.8+
Important
HeloWrite is built for high-performance terminal environments that support modern input protocols.
- Verified: Ghostty, Kitty, Alacritty.
- Unsupported: macOS Terminal.app, Windows Console, and other legacy emulators.
Depending on your terminal or environment, some key combinations may get eaten by your terminal and/or OS. Make sure to customize your keybinds in keybindings.conf if something isn't working as expected.
- If you installed with
pip install -e .inside a venv, reactivate that venv in each new terminal. - If you installed with
pipxbut the command is still missing, ensure~/.local/binis on your PATH. - You can run
pipx ensurepath, then restart your shell.
If Alt+G/Alt+H/Alt+J reports a failure, details are logged to ~/.config/helowrite/git_sync_errors.log.
Run with hot reload during development:
python dev.py src/app.py [filename.txt]Or run without hot reload:
python src/app.py [filename.txt]-
Install development dependencies (includes
pytest-asyncio):pip install -e .[dev]
-
Run the full test suite:
pytest
-
Run specific interaction tests:
pytest tests/test_settings_interaction.py
HELOWRITE_CONFIG_DIR — Custom Config Path
Override the config directory (defaults to ~/.config/helowrite):
HELOWRITE_CONFIG_DIR=/path/to/config python src/app.pyHELOWRITE_TYPEWRITER_DEBUG — Typewriter Debug Logs
For debugging cursor positioning and centering logic in typewriter mode:
HELOWRITE_TYPEWRITER_DEBUG=1 python src/app.py
HELOWRITE_TYPEWRITER_DEBUG=1 python dev.py src/app.py # hot reloadLogs go to ~/.config/helowrite/typewriter_debug.log.
HELOWRITE_SYSTEM_THEME_FILE — System Theme Colors
Point to a custom colors file in TOML format (e.g. background, foreground, accent keys). Overrides the built-in search paths.
HELOWRITE_SYSTEM_THEME_FILE=/path/to/colors.toml python src/app.pyHELOWRITE_SYSTEM_THEME_NAME_FILE — Theme Display Name
Path to a file whose contents are used as the theme display name. Falls back to theme.name beside the colors file.
HELOWRITE_SYSTEM_THEME_NAME_FILE=/path/to/theme.name python src/app.pyHELOWRITE_RUN_PERF — Latency Profiling Tests
Run performance/latency profiling tests that are skipped by default:
HELOWRITE_RUN_PERF=1 pytest tests/test_typewriter_scroll_perf.pyCtrl+S- Save fileCtrl+Q- Quit applicationCtrl+O- Open file panel (toggle, auto-focuses for keyboard navigation)Ctrl+N- Create new fileCtrl+F- Find/Replace (toggle)Ctrl+P- Command paletteCtrl+T- Pomodoro timerCtrl+Shift+T- Toggle typewriter modeAlt+Left/Right- Decrease/Increase editor width (Option+Left/Right on macOS)Alt+Up/Down- Navigate directory up/down with history (Option+Up/Down on macOS)Alt+A- Select all text (Option+A on macOS)Alt+D- Create daily note (Option+D on macOS)Alt+I- Toggle insert newline on Enter (Option+I on macOS)Alt+G- Git push current file (Option+G on macOS, based on opened file's directory)Alt+H- Git pull current file (Option+H on macOS, based on opened file's directory)Alt+J- Git pull vault repository (Option+J on macOS, based on vault path in settings)F1- Show helpF3- Open settingsF5- Open recent filesF11- Toggle distraction-free modeF12- About dialogArrow keys- Navigate cursorHome/End- Jump to start/end of linePage Up/Down- Scroll by page
HeloWrite writes a user-editable keybindings file the first time it runs:
~/.config/helowrite/keybindings.confEach line uses the format action=key. Only one binding is supported per action.
You can customize any action by editing that file and restarting HeloWrite.
Example:
save=ctrl+s
quit=ctrl+q
toggle_distraction_free=f11
toggle_typewriter_mode=ctrl+shift+tUse Textual-style key names, e.g. ctrl+s, ctrl+shift+t, alt+enter, f1, alt+left.
If a line is malformed or a key is invalid, HeloWrite will ignore that binding and keep the default for the action.
HeloWrite supports a simple snippet engine via ~/.config/helowrite/snippets.conf.
Each snippet uses the format trigger=replacement:
# trigger=replacement
ddd=Archduke Maximilian of Habsburg-LorraineSnippets are expanded when the trigger is typed and followed by whitespace or punctuation. Trailing punctuation is preserved, so typing ddd. becomes:
Archduke Maximilian of Habsburg-Lorraine.
Supported placeholders:
%CURRENTTIME→ current time inHH:MM%%→ literal%
After editing snippets.conf, restart HeloWrite to load your changes.
HeloWrite is for prose. Journaling, drafts, essays, braindumps — the stuff you're scraping out of your skull, not typesetting. Syntax highlighting exists so raw markdown stays readable while you write, not so you can format as you go.
It is not a technical or academic writing tool. There's no support for math notation, chemistry formulas, citations, footnotes, tables, sub/superscript, or Pandoc-style rendering — and there won't be. That's a different job, for different software.
What we highlight, and why: enough to keep structure legible at a glance, nothing more.
| Element | Example |
|---|---|
| Headings | # H1 ## H2 ### H3 |
| Bold | **text** |
| Italic | *text* |
| Strikethrough | ~~text~~ |
| Inline code | `code` |
| Fenced code blocks | ``` ... ``` |
| Links | [title](url) |
| Images |  |
| Blockquotes | > text |
| Unordered lists | - item * item + item |
| Ordered lists | 1. item 1) item |
| Task lists | - [ ] todo - [x] done |
If you need real typesetting — LaTeX-style math, citations, footnotes, Pandoc's extended syntax — that tooling already exists and does it properly. Write your prose here, then hand it off.
HeloWrite is built using:
- Textual - Modern TUI framework for Python
- Rich - Beautiful terminal output and styling
- Python - Clean, readable, and maintainable code
Project Structure
helowrite/
├── dev.py # Development server with hot reload
├── src/ # Source code package
│ ├── __init__.py
│ ├── app.py # Main application module
│ ├── audio_playback.py # Audio playback for notifications
│ ├── audio/ # Sound assets
│ │ ├── bell.wav
│ │ ├── newline1.wav
│ │ ├── newline2.wav
│ │ ├── newline3.wav
│ │ ├── ratchet1.wav
│ │ ├── ratchet2.wav
│ │ └── ratchet3.wav
│ ├── config.py # Configuration management
│ ├── constants.py # Constants and help text
│ ├── css/ # Stylesheets
│ │ ├── __init__.py
│ │ ├── app.tcss
│ │ ├── screens.tcss
│ │ └── widgets.tcss
│ ├── git_sync.py # Git operations
│ ├── pomodoro.py # Pomodoro timer
│ ├── screens/ # UI screens and dialogs
│ │ ├── __init__.py
│ │ ├── about_screen.py
│ │ ├── help_screen.py
│ │ ├── pomodoro_timer_screen.py
│ │ ├── quit_confirm_screen.py
│ │ ├── recent_files_screen.py
│ │ ├── save_as_screen.py
│ │ ├── settings_screen.py
│ │ ├── timer_complete_screen.py
│ │ └── welcome_screen.py
│ ├── search.py # Find/replace functionality
│ ├── snippets.py # Snippet expansion engine
│ ├── styles.py # Style definitions
│ ├── themes.py # Theme management
│ ├── utils.py # Utility functions
│ └── widgets/ # Custom widgets
│ ├── __init__.py
│ ├── centered_editor.py
│ ├── editor.py
│ ├── file_open_panel.py
│ ├── find_bar.py
│ └── status_bar.py
├── tests/ # Test suite
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_app.py
│ ├── test_audio_playback.py
│ ├── test_config.py
│ ├── test_git_sync.py
│ ├── test_lint.py
│ ├── test_markdown_highlight_perf.py
│ ├── test_pomodoro.py
│ ├── test_search.py
│ ├── test_settings_interaction.py
│ ├── test_snippets.py
│ ├── test_themes.py
│ ├── test_typecheck.py
│ ├── test_typewriter_scroll_perf.py
│ ├── test_utils.py
│ └── test_widgets.py
├── command_palette_template.md
├── requirements.txt
├── pyproject.toml
├── pytest.ini
├── MANIFEST.in
├── .pre-commit-config.yaml
├── AGENTS.md
├── CONTRIBUTING.md
├── LICENSE
└── README.md
PRs welcome. See CONTRIBUTING.md.
- Typewriter mode inspired by gabinetenoturno's fork
- Pomodoro timer sound by nahmandub
- Typewriter sounds by Gate13
MIT
I fell in love with a machine. That's stupid. So just call me an idiot, and let's be done with it. - Karl "Helo" Agathon