Excalidraw-style system design sketching tool for the terminal
Project description
drawiterm
Excalidraw-style system design sketching tool for the terminal
Draw boxes, arrows, and labels directly in your terminal using keyboard and mouse. Diagrams are saved as plain JSON files. Works over SSH — no graphics extensions, no browser, no GUI framework required.
╭──────────╮ ╭──────────╮ ╭──────────╮
│ API │───────►│ Cache │───────►│ DB │
╰──────────╯ ╰──────────╯ ╰──────────╯
Requirements
- Python 3.12+
- Any ANSI/VT100-compatible terminal (xterm, kitty, alacritty, tmux, etc.)
Installation
With Nix
nix run github:dmille56/drawiterm
Or enter a dev shell:
nix develop
With pipx (recommended)
pipx install drawiterm
With pip
pip install drawiterm
Usage
drawiterm # new blank diagram
drawiterm mydiagram.drawiterm # open existing file
Tools
| Key | Tool |
|---|---|
s / Escape |
Select |
r |
Rectangle |
e |
Ellipse |
d |
Diamond |
a |
Arrow |
l |
Line |
t |
Text |
Arrows and Lines are orthogonal by default; use Shift+Tab to toggle to straight.
Key Bindings
| Key | Action |
|---|---|
Ctrl+S |
Save |
Ctrl+O |
Open file |
Ctrl+Z |
Undo |
Ctrl+Y / Ctrl+Shift+Z |
Redo |
Ctrl+A |
Select all |
Ctrl+D |
Duplicate selection |
Delete / Backspace |
Delete selected elements |
| Arrow keys | Nudge selected elements |
Tab |
Next tool |
Shift+Tab |
Toggle arrow/line style (straight/orthogonal) |
Ctrl+Arrow |
Pan canvas |
Ctrl+Left-drag |
Pan canvas |
Ctrl+Q |
Quit |
Double-click an element to edit its label. Press Escape to commit the edit.
File Format
Diagrams are saved as .drawiterm JSON files — human-readable and version-control friendly.
Development
direnv allow # activate Nix shell (sets PYTHONPATH=src automatically)
# or manually:
nix develop
export PYTHONPATH=src
python -m drawiterm # run from source
ruff check src/ # lint
ruff format src/ # format
pytest # tests
See SPEC.md for the full requirements specification.
Release process
- Bump the version in pyproject.toml and nix/drawiterm.nix (no leading "v" in the file values).
- Commit, then tag and push (tag must be v and match pyproject.toml):
git tag -a "v0.1.0b1" -m "v0.1.0b1"
git push origin v0.1.0b1
The GitHub Actions "Release" workflow will lint, test, build, and create a GitHub Release. If you add a repository secret PYPI_API_TOKEN (from PyPI), it will also publish to PyPI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drawiterm-0.1.5.tar.gz.
File metadata
- Download URL: drawiterm-0.1.5.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5dee3af5e27b715ea2f933146f366fc58153e7af525a75cbe1ae77fd415b88d
|
|
| MD5 |
cb6bed4367645c8f9ab870bf70465aae
|
|
| BLAKE2b-256 |
de1abaef281fb488886dac60ee02dd38b71181f0610cb5b574ead6a3235528e9
|
File details
Details for the file drawiterm-0.1.5-py3-none-any.whl.
File metadata
- Download URL: drawiterm-0.1.5-py3-none-any.whl
- Upload date:
- Size: 29.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9dd35d51d6d8a84d7d1cc52d9664c3769f0a82d7043eaf491a14d06a22cf0c95
|
|
| MD5 |
f2d044b5f8368d2879e2822f0bfbb41a
|
|
| BLAKE2b-256 |
ba51de31188ef6950c09edb03985085e45483df70508631ea8b8ff3a2280806c
|