Skip to main content

Excalidraw-style system design sketching tool for the terminal

Project description

CI Release

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    │
╰──────────╯        ╰──────────╯        ╰──────────╯

Demo

Animation

Requirements

  • Python 3.12+
  • Any ANSI/VT100-compatible terminal (xterm, kitty, alacritty, tmux, etc.)

Installation

With pipx (recommended)

pipx install drawiterm

With Nix

nix run github:dmille56/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
p Draw (freehand)
x Eraser
t Text

Arrows and Lines are orthogonal by default; use Shift+Tab to toggle to straight. Use Draw (p) to sketch freehand paths by clicking and dragging. When tool lock is OFF, the app switches back to Select after using a tool; press Ctrl+L to toggle tool lock.

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+L Toggle tool lock (keep active tool after use)
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

Setup lorri (and use it)

lorri init
direnv allow        # activate Nix shell (sets PYTHONPATH=src automatically)

--or-- Manually use nix development shell:

nix develop
export PYTHONPATH=src

Install pre-commit hooks (so that it runs ruff everytime when you commit to fix issues)

pre-commit install

Commands

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

Automatically

python scripts/bump_version.py

--or-- Manually

  • 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

Other

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drawiterm-0.1.7.tar.gz (35.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

drawiterm-0.1.7-py3-none-any.whl (34.3 kB view details)

Uploaded Python 3

File details

Details for the file drawiterm-0.1.7.tar.gz.

File metadata

  • Download URL: drawiterm-0.1.7.tar.gz
  • Upload date:
  • Size: 35.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for drawiterm-0.1.7.tar.gz
Algorithm Hash digest
SHA256 237360272d0c28208c5f505451c038de983b667c46ad8097cf9d5617a16886b4
MD5 4754ab80710cad7c86da90587e4e3f5b
BLAKE2b-256 05b9db3ed2d3bb3f32dcc875daac7ef3d0038d22d402560aa61b628904d3791f

See more details on using hashes here.

File details

Details for the file drawiterm-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: drawiterm-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 34.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for drawiterm-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 f4fe204dcd215fd1fb4be4a2091a9498f1f4317049ced1a4b4f5319f5cc529ef
MD5 472a9d439ad2fb535b884915617ab815
BLAKE2b-256 b0427358a8b184b76f90681171a9c538f591afc8cacd1187dc4dc5837256532a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page