Local-first drawing tool
Project description
draw
Local-first, sketch-style drawing tool. Excalidraw-inspired, built on Rust with a vanilla JS frontend.
Single binary. No cloud. Your drawings live in ~/.config/draw/drawings/.
Features
- 9 tools: Select, Rectangle, Ellipse, Diamond, Line, Arrow, Pen (freedraw), Text, Eraser
- Sketch-style fills: hachure (diagonal lines), cross-hatch, solid, none
- Full interactions: drag, resize, multi-select, rubber band, pan (scroll/space+drag), zoom (ctrl+scroll)
- Undo/redo: all operations, including batched multi-element changes
- Copy/paste/duplicate with proper ID remapping
- Z-ordering: bring to front/back/forward/backward
- Styles: stroke color/width/dash, fill color/pattern/density, opacity, font
- Export: SVG and PNG
- Document management: auto-save, dirty indicator, rename, list
- Desktop app: native window via webview (same UI, no browser needed)
- Python bindings:
import dkdc_draw - Keyboard-driven: full shortcut set,
?for help overlay
Install
From source (Rust)
cargo install dkdc-draw --features webapp
From source (Python)
uv tool install dkdc-draw
Development
bin/setup # install dependencies
bin/install # build and install CLI
Usage
draw --webapp # launch web UI
draw --app # launch desktop app
draw new [name] # create new drawing
draw open <file> # open .draw.json file
draw list # list saved drawings
draw export-svg <file> [-o output.svg]
draw export-png <file> [-o output.png] [--scale 2.0]
Python
import dkdc_draw
doc = dkdc_draw.new_document("sketch")
dkdc_draw.save_document(doc, "sketch.draw.json")
svg = dkdc_draw.export_svg(doc)
Keyboard shortcuts
| Key | Action |
|---|---|
| V | Select |
| R | Rectangle |
| O | Ellipse |
| D | Diamond |
| L | Line |
| A | Arrow |
| P | Pen (freedraw) |
| T | Text |
| E | Eraser |
| G | Toggle grid snap |
| ? | Help overlay |
| Ctrl+Z | Undo |
| Ctrl+Shift+Z | Redo |
| Ctrl+S | Save |
| Ctrl+A | Select all |
| Ctrl+D | Duplicate |
| Delete | Delete selected |
| ] / [ | Bring to front / Send to back |
Architecture
crates/
draw-core/ Document model, serialization, SVG/PNG export, tiny-skia renderer
draw-cli/ CLI binary (clap)
draw-webapp/ Axum web server (port 1213) + embedded vanilla JS frontend
draw-app/ Desktop app (wry webview)
draw-wasm/ WASM bindings for the renderer
draw-py/ PyO3 Python bindings
Development
bin/build # build all (Rust + Python)
bin/check # run all checks (format, lint, test)
bin/format # format all code
bin/test # run all tests
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 Distributions
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 dkdc_draw-0.2.1.tar.gz.
File metadata
- Download URL: dkdc_draw-0.2.1.tar.gz
- Upload date:
- Size: 332.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52276aacbfaa856d9b3af3cd68aa2388a75dffa79ef20426d5426e5caa3053a8
|
|
| MD5 |
694e8f41791d5d0cb4f6de20cf22eb7b
|
|
| BLAKE2b-256 |
d9b5eb53b2d425205865e99c1e252aa91b33a36f78fdd7f4f6dcccedeb98f1f2
|
Provenance
The following attestation bundles were made for dkdc_draw-0.2.1.tar.gz:
Publisher:
release-python.yml on dkdc-io/draw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dkdc_draw-0.2.1.tar.gz -
Subject digest:
52276aacbfaa856d9b3af3cd68aa2388a75dffa79ef20426d5426e5caa3053a8 - Sigstore transparency entry: 1247527276
- Sigstore integration time:
-
Permalink:
dkdc-io/draw@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dkdc-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 81.0 MB
- Tags: CPython 3.11+, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26985717ab343b0d92b7b4cc8b31a53feae5bbc097da92259e53ebc03cae2e02
|
|
| MD5 |
fef36d245b3e0d92ba578ff7c392c6b0
|
|
| BLAKE2b-256 |
9479031b089983ac984d1537ed9e79dd543496a406e763137f96799a9ebc11c0
|
Provenance
The following attestation bundles were made for dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_x86_64.whl:
Publisher:
release-python.yml on dkdc-io/draw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_x86_64.whl -
Subject digest:
26985717ab343b0d92b7b4cc8b31a53feae5bbc097da92259e53ebc03cae2e02 - Sigstore transparency entry: 1247527519
- Sigstore integration time:
-
Permalink:
dkdc-io/draw@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dkdc-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 80.2 MB
- Tags: CPython 3.11+, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f2712b05d922c801d8290cec26e10c77ef8b7c6ab15cb5c6cf6c410fd407d18d
|
|
| MD5 |
3dd6c51db70ee6bff6ddbdd14d4cfda2
|
|
| BLAKE2b-256 |
c599b3919dc7cf6dbe6e0131a3717c31dcc34e7b3699f0d5eea9633a2812682a
|
Provenance
The following attestation bundles were made for dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_aarch64.whl:
Publisher:
release-python.yml on dkdc-io/draw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dkdc_draw-0.2.1-cp311-abi3-manylinux_2_39_aarch64.whl -
Subject digest:
f2712b05d922c801d8290cec26e10c77ef8b7c6ab15cb5c6cf6c410fd407d18d - Sigstore transparency entry: 1247527401
- Sigstore integration time:
-
Permalink:
dkdc-io/draw@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dkdc-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file dkdc_draw-0.2.1-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: dkdc_draw-0.2.1-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.4 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c86bd8250c68fd38006d8a4d9a1ac83330f089ccf5158ba32402f8558cb2e388
|
|
| MD5 |
051d628d206f85d0b858703e49ab7dfa
|
|
| BLAKE2b-256 |
aea719c6ebc8867c63cd4125bba21414bc6aeee3ca8d3ce61d83e282a595d7e4
|
Provenance
The following attestation bundles were made for dkdc_draw-0.2.1-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
release-python.yml on dkdc-io/draw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dkdc_draw-0.2.1-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
c86bd8250c68fd38006d8a4d9a1ac83330f089ccf5158ba32402f8558cb2e388 - Sigstore transparency entry: 1247527350
- Sigstore integration time:
-
Permalink:
dkdc-io/draw@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dkdc-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Trigger Event:
push
-
Statement type:
File details
Details for the file dkdc_draw-0.2.1-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: dkdc_draw-0.2.1-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.5 MB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c4d9039c12f793ab5739752025df7bd633268408afdf1489fea445d37210576
|
|
| MD5 |
84871c801d3201507164807a833eeae8
|
|
| BLAKE2b-256 |
33bf36914376252fe7dd34c91f3500c0abc3295456ff26115b332ea5bbbfd8eb
|
Provenance
The following attestation bundles were made for dkdc_draw-0.2.1-cp311-abi3-macosx_10_12_x86_64.whl:
Publisher:
release-python.yml on dkdc-io/draw
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dkdc_draw-0.2.1-cp311-abi3-macosx_10_12_x86_64.whl -
Subject digest:
2c4d9039c12f793ab5739752025df7bd633268408afdf1489fea445d37210576 - Sigstore transparency entry: 1247527452
- Sigstore integration time:
-
Permalink:
dkdc-io/draw@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dkdc-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@359d8dc666ef51974ad8c62ee6437d5bcb1fd5ee -
Trigger Event:
push
-
Statement type: