Aesthetic drawing in your terminal — smooth braille strokes, shape correction, palettes, symmetry.
Project description
monoline
Aesthetic drawing in your terminal — smooth braille strokes, tldraw-style shape correction, curated palettes, symmetry, and a dot grid.
Freehand drawing with live smoothing — hold Ctrl and a rough circle snaps to a perfect one; symmetry mirrors strokes as you draw.
Install
pip install monoline # or: pipx install monoline / uv tool install monoline
Quick start
monoline # start on a blank canvas
monoline drawing.mono.json # open (or create) a named drawing
Click and drag with the mouse to draw. Hold Ctrl while dragging to snap the
stroke to a line, circle, ellipse, or rectangle. Press ? any time for the
in-app cheat sheet, c to clear, q to quit.
Keymap
| Keys | Action |
|---|---|
| drag | draw |
| Ctrl+drag | snap to shape (line / circle / ellipse / rect) |
d / e |
pen / eraser |
1-9 |
pick color |
p / P |
next / previous palette |
s |
cycle symmetry (off → vertical → horizontal → radial4) |
g |
toggle dot grid |
u / Ctrl+Z |
undo |
r / Ctrl+Y |
redo |
| Ctrl+S | save |
x |
export (.txt = ANSI, .svg = SVG) |
i |
import image, video, or 3D model (path prompt) |
v |
paste image from clipboard |
| Shift+drag | rotate and move a loaded 3D model |
c |
clear the canvas (asks to confirm) |
? |
this help overlay (escape or ? to close) |
q |
quit (asks to confirm if there are unsaved changes) |
Import images and video
Drop any image or video file onto the terminal (or press i for a path prompt,
v to paste one from the clipboard, or run monoline photo.png /
monoline clip.mp4) and it becomes braille art you can draw over.
Still images are Floyd-Steinberg dithered with 24-bit color per cell; videos
and animated GIFs play back in braille in real time. A braille cell's eight
dots share one color, so chroma resolution is per-cell: that's the medium,
not a bug. Erasing over media hides its dots non-destructively; undo brings
the import back.
Supported video formats: MP4, WebM, MOV, AVI, MKV, M4V, and animated GIF.
On Linux, clipboard paste needs xclip (X11) or wl-clipboard (Wayland).
Import 3D models
Drop a 3D model onto the terminal (or press i and enter a path, or run
monoline model.obj) to open it in a braille viewport with a ground grid and
axes. The model renders as a shaded wireframe you can draw over.
Shift+drag with the mouse to rotate and move the model inside the viewport. Undo restores the previous pose or removes the import entirely.
Supported formats: OBJ, STL, GLB, GLTF, PLY, and OFF.
Drop an icosahedron (or any mesh), spin it with Shift+drag, then doodle over the wireframe — the ground grid shows the 3D viewport space.
Palettes
Cycle through with p / P, or set a default in the config file:
tokyonight(default)catppuccingruvboxnordpastelneonmono
Configuration
monoline reads a TOML config file on startup, creating it with defaults on first run:
- Linux:
~/.config/monoline/config.toml - macOS:
~/Library/Application Support/monoline/config.toml - Windows:
%LOCALAPPDATA%\monoline\monoline\config.toml
# monoline configuration
shape_correct = "ctrl" # ctrl | always | off
palette = "tokyonight" # see the palette list above
smoothing = 0.5 # 0.0 - 1.0
shape_correct— when Ctrl+drag snaps to a recognized shape."ctrl"(default) snaps only while Ctrl is held;"always"snaps every stroke without needing Ctrl (useful if your terminal swallows Ctrl+drag);"off"disables shape recognition entirely.palette— the color palette to load on startup. Overridden automatically when opening a saved file that recorded a different palette.smoothing— how much Chaikin smoothing/resampling is applied to freehand strokes, from0.0(raw mouse samples) to1.0(maximally smoothed).
File formats
.mono.json— monoline's native format: versioned JSON containing canvas size, background, palette, and every stroke. Fully reopenable and editable — this is what Ctrl+S saves..txt(ANSI) — a plain-text export with embedded truecolor ANSI escape codes.catit in any truecolor-capable terminal to see the drawing..svg— a vector export of the strokes, suitable for viewing in a browser or editing in a vector graphics tool.
Pick the format by the extension you type when exporting with x.
Terminal support
monoline draws with Unicode braille characters and needs mouse reporting, so your terminal matters:
- Windows: use Windows Terminal. The legacy
conhost.execonsole does not support the mouse reporting monoline needs for drawing. - Font: pick a braille-capable monospace font — Cascadia Code/Mono, any Nerd Font, or the default monospace font on macOS/Linux all work.
- Ctrl+drag not registering? Some terminal emulators swallow the Ctrl
modifier on mouse drags. If shape snapping never triggers, set
shape_correct = "always"(snap every stroke) or"off"(disable it) in your config file.
License
MIT
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 monoline-0.5.0.tar.gz.
File metadata
- Download URL: monoline-0.5.0.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49ce58edbe820365f0cf9602eea4ab9b3e4656c9f9735b4820ea1c6d407fd9a7
|
|
| MD5 |
1fdbe74b8ee7db21dea5bd1b84f2434d
|
|
| BLAKE2b-256 |
c210007ac21f404140902d51a65bdacfafec06fb647894bd9dbbf7a8a3e07cea
|
Provenance
The following attestation bundles were made for monoline-0.5.0.tar.gz:
Publisher:
release.yml on ByapakSigdel/monoline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
monoline-0.5.0.tar.gz -
Subject digest:
49ce58edbe820365f0cf9602eea4ab9b3e4656c9f9735b4820ea1c6d407fd9a7 - Sigstore transparency entry: 2162692511
- Sigstore integration time:
-
Permalink:
ByapakSigdel/monoline@c2e63f2643fdb4ccde546ede59945ee9fda008d5 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/ByapakSigdel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c2e63f2643fdb4ccde546ede59945ee9fda008d5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file monoline-0.5.0-py3-none-any.whl.
File metadata
- Download URL: monoline-0.5.0-py3-none-any.whl
- Upload date:
- Size: 33.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec2879ccaf98ae4a4d5fb33961de8ce23380053f9172eb6b64db259f9660776d
|
|
| MD5 |
d9aab5a117616eafb0fce866f14d48cf
|
|
| BLAKE2b-256 |
baef7ee723c978b731de34e11b6a2946790d428727d76a45734b8ebc15d0824f
|
Provenance
The following attestation bundles were made for monoline-0.5.0-py3-none-any.whl:
Publisher:
release.yml on ByapakSigdel/monoline
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
monoline-0.5.0-py3-none-any.whl -
Subject digest:
ec2879ccaf98ae4a4d5fb33961de8ce23380053f9172eb6b64db259f9660776d - Sigstore transparency entry: 2162692612
- Sigstore integration time:
-
Permalink:
ByapakSigdel/monoline@c2e63f2643fdb4ccde546ede59945ee9fda008d5 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/ByapakSigdel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c2e63f2643fdb4ccde546ede59945ee9fda008d5 -
Trigger Event:
push
-
Statement type: