Skip to main content

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


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.5.tar.gz (27.7 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.5-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

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

Hashes for drawiterm-0.1.5.tar.gz
Algorithm Hash digest
SHA256 e5dee3af5e27b715ea2f933146f366fc58153e7af525a75cbe1ae77fd415b88d
MD5 cb6bed4367645c8f9ab870bf70465aae
BLAKE2b-256 de1abaef281fb488886dac60ee02dd38b71181f0610cb5b574ead6a3235528e9

See more details on using hashes here.

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

Hashes for drawiterm-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 9dd35d51d6d8a84d7d1cc52d9664c3769f0a82d7043eaf491a14d06a22cf0c95
MD5 f2d044b5f8368d2879e2822f0bfbb41a
BLAKE2b-256 ba51de31188ef6950c09edb03985085e45483df70508631ea8b8ff3a2280806c

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