A terminal-aesthetic ASCII art editor built with Rust, egui and eframe.
| Category | Details |
|---|---|
| Tools | Brush, Eraser, Flood Fill, Rectangle, Ellipse, Line, Border Box, Selection |
| Layers | Add / Remove / Duplicate / Merge Down / Reorder / Rename / Lock / Hide |
| History | 100-step Undo / Redo (Ctrl+Z / Ctrl+Y) |
| Characters | 18 built-in palettes (Lines, Blocks, Math, Greek, Arrows, Nerd icons, …) + search |
| Colors | Full RGBA picker, primary & secondary color slots, 16 quick-presets |
| Export | Native .vc format (JSON), plain text .txt, and rendered PNG |
| Canvas | Infinite pan, smooth zoom (0.15× – 8×), optional grid |
Download the latest release for your platform from the Releases page.
Requirements: Rust 1.75+ and Cargo.
git clone https://github.com/your-username/void-canvas
cd void-canvas
cargo build --release
./target/release/void-canvas # Linux / macOS
./target/release/void-canvas.exe # Windows| Shortcut | Action |
|---|---|
Ctrl+N |
New document |
Ctrl+O |
Open .vc file |
Ctrl+S |
Save / Save as… |
| Shortcut | Action |
|---|---|
Ctrl+Z |
Undo |
Ctrl+Y |
Redo |
Ctrl+C |
Copy selection Not working, and I don't know why |
Ctrl+X |
Cut selection Not working, and I don't know why |
Ctrl+V |
Paste at cursor Not working, and I don't know why |
Delete |
Delete selection |
Escape |
Deselect |
X |
Swap primary ↔ secondary |
| Key | Tool |
|---|---|
B |
Brush |
E |
Eraser |
F |
Flood Fill |
R |
Rectangle |
O |
Ellipse |
L |
Line |
D |
Border Box |
S |
Select |
+ / - |
Brush size up / down |
| Input | Action |
|---|---|
| Scroll | Pan |
Ctrl + Scroll |
Zoom |
| Middle-click drag | Pan |
.vc files are plain JSON — human-readable and version-control friendly.
Every layer, its cells, and their RGBA colours are stored verbatim.
{
"width": 80,
"height": 40,
"layers": [ { "name": "Background", "visible": true, "locked": false, … } ],
"active_layer": 0
}File → Export PNG… renders the composited canvas at 10 × 18 px per cell using the bundled FiraCode font.
Background and foreground RGBA colours are preserved exactly.
src/
├── main.rs Entry point, window setup, font loading
├── app.rs Main editor state & event loop
├── document/
│ ├── cell.rs Cell & Color types
│ ├── layer.rs Layer (grid of cells)
│ └── document.rs Document (layers stack, composite, I/O)
├── history/
│ ├── commands.rs Command enum
│ └── mod.rs Undo / Redo stack
├── tools/
│ ├── brush.rs Brush tool
│ ├── eraser.rs Eraser tool
│ ├── fill.rs Flood-fill tool
│ ├── shapes.rs Rectangle, Ellipse, Line tools
│ ├── border.rs Border-box tool
│ └── selection.rs Rectangular selection + move / copy / paste
└── ui/
├── canvas.rs Canvas rendering & input
├── char_palette.rs Character palette panel
├── layer_panel.rs Layers panel
└── panels.rs Color & Tool Options panels
| Crate | Purpose |
|---|---|
| egui | Immediate-mode GUI |
| eframe | Native window / app shell |
| serde + serde_json | Serialisation |
| rfd | Native file dialogs |
| image | PNG encoding |
| ab_glyph | Font rasterisation for PNG export |
Modified MIT — see LICENSE.
