* DIMANGULAR: accept polyline segments (fixes #10) Picking a side of a rectangle or a PLINE segment was rejected with "Select a line or an arc." because only LINE and ARC entities were accepted. The picked object is now resolved to the segment under the cursor: straight polyline segments work like lines and arc segments like arcs. * Redraw edits made while a command is still running (fixes #4) LINE and PLINE add geometry on every point, but the canvas only rebuilt its display list when the drawing revision or the document pointer changed. The revision was bumped when a command finished, and the pointer changed only on the first copy-on-write edit, so only the first segment appeared until the command ended. Session::feed now bumps the revision after each input once the running command has changed the drawing. * Fix #14: include DWG in the Open drawing filter * Blocks window: click a block to insert it (#8) Each block name in the Blocks window is now a button. Clicking it starts INSERT with that block already chosen, so the command line asks for the insertion point. * SCALE: Reference option (#17) SCALE > Reference printed "not available yet". It now asks for the reference length (typed, or two points) and the new length (typed, or a point measured from the base point), and scales by new / reference. Zero, negative or non-finite lengths are rejected and asked again. * Print and Ctrl+P ask where to save the PDF (#5) PLOT/EXPORTPDF started from the menu, the toolbar, Ctrl+P or the command line had no path, so the PDF was built in memory and dropped. They now open the save dialog (PDF filter first) and write the file there. JSON calls from scripts, the control channel and MCP still never open a dialog. Ctrl+P was shown in the menu but not bound; it is now. * Scripts: split a line at keyword prompts so POLYGON 6 200,20 I 15 works (#43) * Layer Properties Manager: stop the window growing every frame (fixes #29) The vertical separator between the filter tree and the table takes all the height it is offered, and a resizable window offers its previous height, so the window grew 30px per frame until it filled the screen. Cap the row at the table's fixed height. Regression test runs the dialog headless for 30 frames and checks the height stays put. Co-Authored-By: Claude Opus 5.5 <[email protected]> * ui.render: fit the drawing and return pngBase64 like the headless render (#49, #50) * Linux: default to XWayland for file drag-and-drop on Wayland desktops * Fonts: per-character fallback, FONTALT and .ttc for CJK text in SHX styles (#130) CJK text in a style that uses an SHX font (romans.shx + chineset.shx big font) drew every ideograph as an empty box: the SHX name resolves to our stroke font, which has no CJK glyphs, and the font scan skipped .ttc collections, where most CJK system fonts live. - Per-character fallback: a character the text's font lacks (stroke font or TrueType) is drawn from an installed font that has it, checked by cmap. Wide-coverage fonts go first (Noto Sans CJK, Source Han, WenQuanYi, Droid Sans Fallback, PingFang, Microsoft JhengHei/YaHei, MS Gothic, ...), regular weights before others. Fallback glyphs are sized like TrueType text (cap height = text height). Lookups are cached; the search is bounded (24 files, 160 MiB, 256 faces per character, files over 96 MiB never read) and skips spaces, controls and private-use code points. No fallback: the box as before. - FONTALT (sysvar, seeded from CADCRAFT_FONTALT): font used for a style font that can't be found (an SHX file, a missing TTF). Empty = our stroke font. - FONTFALLBACK (sysvar, seeded from CADCRAFT_FONTFALLBACK): fonts tried first for missing characters, e.g. "Noto Sans CJK TC". - .ttc/.otc are scanned; TextFont::Outline carries a ttf::Face (bytes + face index). Fonts are also found by family name among files with a similar stem, so "Noto Sans CJK TC" picks face 3 of NotoSansCJK-Regular.ttc. - Cap height falls back to the height of "H" when OS/2 has none (DejaVu Sans), which fixes ttf_tests::system_font_outlines_when_available and render's truetype_text_is_filled_or_outlined on machines without Arial. - README: a Fonts section for the two settings; ROADMAP M4 note. Native SHX / big-font rendering stays on the roadmap (M4). Co-Authored-By: Claude Opus 5.5 <[email protected]> * Fonts: cap the total bytes of system font files loaded from disk A drawing naming many text styles could otherwise load every installed font into memory through family-name lookups. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Pan with a two-finger trackpad swipe; keep wheel and pinch zoom Trackpad two-finger swipes arrive as scroll events, and the canvas turned every scroll into a zoom, so trackpad users had no realtime pan (middle-drag needs a middle button). Scroll now follows the device: precise point deltas (trackpad, Magic Mouse) pan the view by x and y; notched line deltas (mouse wheel) zoom about the cursor as before. Pinch and Cmd+scroll still zoom through zoom_delta, and middle-drag still pans. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_019uMCkRAB8DMd8MEmoY9Vyr * Add Tru10 to contributors/people.toml Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_019uMCkRAB8DMd8MEmoY9Vyr * Trackpad pan: only on macOS, where point deltas mean a trackpad Browsers and Wayland smooth-scroll mice report ordinary wheels in points too, so the wheel keeps zooming there. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Keep arc-length dimensions as arc-length through DXF save and reopen (#100) * PLINE: Halfwidth is centre-to-edge, and Width answers taper the next segment (fixes #83, #104) Interactive PLINE kept one width value: Halfwidth answers were stored as the total width, and the ending-width answer overwrote the starting one, so a taper became a constant width. The next segment's starting and ending widths are now tracked separately, Halfwidth answers are doubled, and each new segment (including the closing one) gets its widths on its first vertex; later segments are uniform at the ending width, as in AutoCAD. Uniform polylines are still stored as const_width, so their DXF output is unchanged. Fixes #83. Fixes #104. * Arc-length dimensions: write a standard aligned record plus CADCraft xdata DXF has no arc-length DIMENSION type, so write type 1 and mark the kind and arc centre in CADCRAFT xdata (like ASSOC). Other programs read an aligned dimension; CADCraft restores the arc length, through DXF and DWG. Co-Authored-By: Claude Opus 5.5 <[email protected]> * Desktop: write log records to standard error and a rotating log file The desktop app installed no logger, so every log::warn!/log::error!/ log::info! in the workspace was discarded: a broken app icon, the GPU canvas set-up, the engine's command-line echo at debug level. A launch from a desktop menu has no terminal either, so there was nothing to attach to a bug report. apps/cadcraft/src/logging.rs (no new dependency): - standard error plus <settings dir>/logs/cadcraft.log; each launch rotates the previous log to cadcraft.1.log and .2.log, so the log of a run that crashed survives the next start; the file is capped at 16 MiB - records logged before the settings directory is known are buffered (bounded) and written once the file is attached - default levels: info for cadcraft*, warn for everything else; RUST_LOG replaces them with env_logger-style directives - never panics: an unusable directory or a failed write leaves standard error as the only sink; a poisoned lock is tolerated CADCraft had no per-user directory yet. config_dir in main.rs adds one: CADCRAFT_CONFIG_DIR, else $XDG_CONFIG_HOME/cadcraft or ~/.config/cadcraft (Linux, BSDs), ~/Library/Application Support/CADCraft (macOS), %APPDATA%\CADCraft (Windows). The logger is installed first in main and the file is opened after argument parsing (--version leaves no file). The control server's eprintln!s now go through the logger. A --control or CADCRAFT_CONTROL_PORT value that is not a port is now logged instead of silently leaving the control channel off. Documented in README.md (Quick start > Logs). --------- Co-authored-by: SBaksa <[email protected]> Co-authored-by: DWAA1660 <[email protected]> Co-authored-by: lloyd <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]> Co-authored-by: Dylan M. Taylor <[email protected]> Co-authored-by: vangel76 <[email protected]> Co-authored-by: Brandon Thomas <[email protected]> Co-authored-by: Tru10 <[email protected]> Co-authored-by: Gert Pellin <[email protected]>
CADCraft
Computer-aided design and drafting; an open-source, clean-room reimplementation of Autodesk AutoCAD, rebuilt in pure Rust.
A fast, open-source take on the AutoCAD workflow: the command line, object snaps, layers,
dimensions, hatches, blocks and DXF drawings you already know. It runs natively on macOS,
Windows, Linux and FreeBSD, and in the browser via WebAssembly.
By the ArtCraft team.
CADCraft on getartcraft.com · ArtCraft · All Crafting Apps
Apartment plan (examples/apartment.dxf): walls with pick-point hatching, TrueType MTEXT room labels, a TABLE, a multileader and architectural dimensions — built entirely from CADCraft commands.
Note
ArtCraft is a community of artists from all walks of life. Painters, photographers, filmmakers, illustrators, designers, animators, hobbyists, and people who picked up a pencil last week. If you make things, you're one of us. Come say hi on Discord.
Screenshots · Why CADCraft · What works today · Quick start · Agents, MCP and the CLI · Architecture · Roadmap · Downloads · The Crafting Apps · License and credits
Screenshots
Why CADCraft
- The workflow you know. Type
L, click two points, type@5<45, press Enter. The command line, prompts with clickable[Keywords], AutoComplete, object snaps, polar tracking, ortho, direct distance entry, window and crossing selection, grips, and right-click-to-repeat behave the way decades of drafting habit expect. - Open files. DXF is read and written natively (ASCII and binary, R12 through 2018), and DWG files (R13 through 2018) open and save through the open-source acadrust library. Export to SVG and PNG today.
- Fast and native. Pure Rust and egui, no Electron, no web view. One binary on macOS (universal), Windows, Linux and FreeBSD, plus a WebAssembly build for the browser.
- Built for agents. Every menu item, tool and prompt is a command. Agents can type at the command line exactly like a person, call any command with JSON, inspect the drawing to verify their work, and render it — over MCP, a JSON control channel, or the CLI.
- Free. MIT OR Apache-2.0, with no account and no subscription.
What works today
CADCraft is in early, fast development. Honest status (see ROADMAP.md for parity numbers):
| Area | Status |
|---|---|
| Drawing area | Model space with adaptive grid, axes, pan/zoom (wheel, middle-drag, pinch), crosshair cursor with pickbox, UCS icon, ViewCube, viewport label |
| Command line | Prompts with keywords, history, AutoComplete, aliases, @dx,dy, @d<a, #x,y, direct distance entry, Enter/space/right-click to repeat, transparent commands, .scr-style scripts |
| Draw | LINE, PLINE (arcs, widths), CIRCLE (center/radius/diameter, 2P, 3P), ARC, RECTANG (fillet/chamfer), POLYGON, ELLIPSE (+arcs), SPLINE, POINT, XLINE, RAY, DONUT, TEXT, MTEXT |
| Modify | ERASE, MOVE, COPY, ROTATE, SCALE, MIRROR, STRETCH, OFFSET, TRIM, EXTEND, FILLET, CHAMFER, BREAK, JOIN, EXPLODE, rectangular/polar ARRAY, draw order, OVERKILL |
| Precision | Object snaps (endpoint, midpoint, center, geometric center, node, quadrant, intersection, insertion, perpendicular, tangent, nearest; deferred tangent/perpendicular for the first point of a line, e.g. belt lines tangent to two circles), polar tracking, ortho, grid snap |
| Layers & properties | Layers palette and Layer Properties Manager (on/off, freeze, lock, plot, colour, linetype), layer tools (isolate, freeze, off, lock, match, previous), Properties palette with per-object editing, linetypes, lineweights, colour index and true colour |
| Annotation | All DIM* commands with full DIMSTYLE variables, overrides and every arrowhead, associative dimensions that follow geometry, MLEADER, TABLE, TrueType fonts (.ttf, .otf, .ttc collections), MTEXT formatting codes (fonts, heights, colours, stacked fractions), our own single-stroke drafting font |
| Hatch & blocks | Pick-point hatch boundaries with islands, pattern, solid and gradient fills from our own pattern library, BLOCK/INSERT, attributes and nested blocks |
| Files | DXF read/write (R12–2018, including dimension styles, associativity, tables and constraints), DWG read/write (R13–2018, via the acadrust library), PDF plotting, SVG and PNG export |
| Layouts & plotting | Paper-space layouts, viewports (scale, lock, per-viewport layer freeze), MSPACE/PSPACE through viewports, page setups, PLOT and EXPORTPDF |
| Parametric | Geometric and dimensional constraints, AUTOCONSTRAIN, PARAMETERS with expressions, conflict detection; constraints re-solve after every edit |
| Grips | Hot grips with Space to cycle Stretch, Move, Rotate, Scale and Mirror |
| Automation | MCP server, JSON control channel, cadcraft-cli (info, convert, run, commands, mcp) |
Quick start
git clone https://github.com/storytold/cadcraft
cd cadcraft
cargo run --release -p cadcraft -- --sample # opens the sample drawing
Then try typing at the command line:
line 0,0 @10,0 @0,5 c a closed triangle
circle 5,2 1 a circle
offset 0.25 then pick the circle and a side
zoom e zoom to extents
The web build: cd apps/cadcraft-web && trunk serve (needs trunk).
Fonts
CADCraft never ships fonts; it uses the TrueType/OpenType fonts installed on your system. SHX
fonts (including big fonts such as chineset.shx) aren't read yet: text in an SHX style is drawn
with our own stroke font, and any character a text's font lacks (CJK, for example) is drawn from
an installed font that has it, preferring wide-coverage fonts such as Noto Sans CJK, Source Han
Sans, WenQuanYi, PingFang or Microsoft JhengHei. Two settings, set with SETVAR or (for every
run) an environment variable, steer this:
| Variable | Environment | Meaning |
|---|---|---|
FONTALT |
CADCRAFT_FONTALT |
Font used instead of a text style font that can't be found (an SHX file, a missing TTF), by file or family name, e.g. Noto Sans CJK TC. Empty (default) = our stroke font. |
FONTFALLBACK |
CADCRAFT_FONTFALLBACK |
Fonts tried first for characters a text's font lacks, comma-separated, e.g. Noto Sans CJK TC, msjh.ttc. |
. clears either one.
Logs
The desktop app writes its log records to standard error and to logs/cadcraft.log in the
settings directory (Linux and the BSDs ~/.config/cadcraft/logs/, or
$XDG_CONFIG_HOME/cadcraft/logs/; macOS ~/Library/Application Support/CADCraft/logs/; Windows
%APPDATA%\CADCraft\logs\; or under CADCRAFT_CONFIG_DIR). A start from a desktop menu or the
Dock has no terminal, so this file is what to attach to a bug report. Each launch moves the
previous log to cadcraft.1.log (and that one to cadcraft.2.log), so the log of a run that
crashed survives the next start. The file stops growing at 16 MiB. --version writes no file.
| Variable | Effect |
|---|---|
CADCRAFT_CONFIG_DIR |
Use this directory instead of the platform settings directory (the log goes to its logs/) |
RUST_LOG |
Log levels for standard error and the log file. Default: info for CADCraft's own crates, warn for everything else. env_logger-style directives replace that, e.g. RUST_LOG=debug, RUST_LOG=warn,cadcraft_io=trace or RUST_LOG=info,wgpu_core=warn; a directive ending in * covers every target starting with it (cadcraft*=debug). cadcraft_engine=debug also logs every command-line message. |
The logger is apps/cadcraft/src/logging.rs; the web build logs to the browser console instead.
Drive it from agents, MCP and the CLI
# MCP server on stdio, headless:
cadcraft-cli mcp
# …or bridged to the running app (start it with --control 7979):
cadcraft-cli mcp --connect 127.0.0.1:7979
# One-shot headless runs:
cadcraft-cli run --sample --script 'CIRCLE 22,3 1\n' --save out.dxf --export out.png
cadcraft-cli info drawing.dxf
cadcraft-cli convert drawing.dxf drawing.svg
# Frame part of the drawing (model space, drawing units, lower-left corner first):
cadcraft-cli convert drawing.dwg detail.png --window 0,0,20000,15000
cadcraft-cli run drawing.dwg --cmd 'zoom {"mode":"window","p1":[0,0],"p2":[20000,15000]}' --export detail.png
cadcraft-cli run drawing.dwg --cmd 'select {"window":[[0,0],[20000,15000]]}' --cmd 'zoom {"mode":"object"}' --export sel.png
How image exports (PNG 2400×1600, SVG, PDF) are framed: convert fits the model-space extents.
run --export shows the current view when the script or commands changed it (zoom, pan,
view.set, …) and otherwise fits the extents too. --window x0,y0,x1,y1 shows exactly that
rectangle, centred and scaled without distortion; --view extents or --view current forces
either framing. To frame a selection set, zoom {"mode":"object"} after selecting.
MCP tools include command_line (type at the prompt), execute (any command with JSON),
inspect_drawing, query_entities, render (returns a PNG) and, when connected to the app,
screenshot and ui_click. The desktop app's JSON control channel is documented in
docs/control-protocol.md.
Architecture
geom ─┐ f64 geometry: arcs, bulges, splines, intersections, offsets
dxf │ (standalone) DXF tag reader/writer
color ┤ colour index, true colour
doc ┤ drawing database, copy-on-write entity store (cheap undo)
fonts ┤ render stroke font + TEXT/MTEXT layout │ display lists, linetypes, hatches, dims, CPU raster
io ┤ DXF mapping, SVG/PNG export
engine┤ sessions, commands, command line + prompts, snaps, selection, undo
ui-egui · mcp the swappable egui front end · MCP server
apps: cadcraft · cadcraft-cli · cadcraft-web
Nothing below ui-egui knows about egui, so the front end can be replaced. cargo xtask ci
checks formatting, clippy, tests, asset attribution, the crate layering and the wasm build.
Roadmap
See ROADMAP.md for milestones, measured parity and the estimate of remaining work.
Downloads
Download CADCraft from GitHub: the latest release has every build listed below, and all releases has earlier versions and their notes. <ver> in the file names is the version number, and SHA256SUMS.txt lists a checksum for every file.
Windows
| Build | Installer | Portable |
|---|---|---|
| x64 (64-bit Intel/AMD) | cadcraft-<ver>-windows-x64.msi |
cadcraft-<ver>-windows-x64-portable.zip |
| arm64 (Snapdragon and other ARM PCs) | cadcraft-<ver>-windows-arm64.msi |
cadcraft-<ver>-windows-arm64-portable.zip |
| x86 (32-bit) | cadcraft-<ver>-windows-x86.msi |
cadcraft-<ver>-windows-x86-portable.zip |
Installers and executables are code-signed.
The installer adds CADCraft to the Start menu and asks whether to add a desktop shortcut too (unticked by default). For a silent install with the desktop shortcut: msiexec /i cadcraft-<ver>-windows-x64.msi /qn DESKTOPSHORTCUT=1.
If the app doesn't open on Windows: the desktop app initializes only DirectX 12 by default.
Letting wgpu also create an OpenGL instance can crash some graphics drivers (AMD's
atio6axx.dll) before the window appears, so the app would flash in Task Manager and quit.
WGPU_BACKEND overrides the default for troubleshooting (for example dx12 or vulkan). In
PowerShell, from the folder containing the executable:
$env:WGPU_BACKEND = "vulkan"
& .\cadcraft.exe
Remove-Item Env:WGPU_BACKEND # restore the default for later launches
An explicit gl override can bring the driver crash back on affected systems. The macOS, Linux
and web backend defaults are unchanged.
macOS
| Build | File | Notes |
|---|---|---|
| App, universal (Apple silicon + Intel) | cadcraft-<ver>-macos-universal.dmg |
Signed and notarized |
| Command-line tool, universal | cadcraft-cli-<ver>-macos-universal.zip |
Signed and notarized |
Linux
| Format | x86_64 | aarch64 (ARM64) | Notes |
|---|---|---|---|
| AppImage | cadcraft-<ver>-linux-x86_64.AppImage |
cadcraft-<ver>-linux-aarch64.AppImage |
Runs anywhere; updates itself with AppImageUpdate (.zsync files) |
| Flatpak | cadcraft-<ver>-linux-x86_64.flatpak |
cadcraft-<ver>-linux-aarch64.flatpak |
Sandboxed; flatpak install --user <file> |
| Debian/Ubuntu | cadcraft-<ver>-linux-x86_64.deb |
cadcraft-<ver>-linux-aarch64.deb |
|
| Fedora/RHEL/openSUSE | cadcraft-<ver>-linux-x86_64.rpm |
cadcraft-<ver>-linux-aarch64.rpm |
|
| Tarball | cadcraft-<ver>-linux-x86_64.tar.gz |
cadcraft-<ver>-linux-aarch64.tar.gz |
Unpack anywhere |
FreeBSD
| Build | File |
|---|---|
| x86_64 | cadcraft-<ver>-freebsd-x86_64.tar.gz |
Web (WebAssembly)
| Build | File | Notes |
|---|---|---|
| Static site | cadcraft-web-<ver>.zip |
Runs in a modern browser; host it on any static server |
The Crafting Apps
CADCraft is one of the Crafting Apps: free, open-source creative tools from the ArtCraft team, each written from scratch in Rust and each able to stand on its own.
| App | What it's for | Code | Learn more | |
|---|---|---|---|---|
| PhotoCraft | Image editing: layers, masks, type and real PSD files | GitHub | Website | |
| VectorCraft | Vector illustration | GitHub | Website | |
| FilmCraft | Video editing, color and sound | GitHub | Website | |
| LightCraft | Photo library and raw development | GitHub | Website | |
| PdfCraft | Reading, organizing and protecting PDFs | GitHub | Website | |
| EffectCraft | Motion graphics and visual effects | GitHub | Website | |
| DesignCraft | Page layout and publishing | GitHub | Website | |
| CADCraft | Computer-aided design and drafting · you are here | GitHub | Website |
And ArtCraft itself, our AI image and video studio for artists who want real control.
Come make things with us
Our Discord is where artists of every kind hang out: people who paint, shoot, draw, cut film, set type, and people still figuring out what they like to make. Share what you're working on, ask for help, tell us what's broken, or tell us what you wish these tools could do. Whatever your medium and however long you've been at it, you're welcome here.
discord.gg/artcraft · getartcraft.com · The Crafting Apps · CADCraft
License and credits
CADCraft is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the CADCraft contributors. Required notices are in NOTICE.
Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in ATTRIBUTION.md.
CADCraft's icons, its single-stroke drafting font, its hatch patterns and its linetypes are all original work, drawn or defined in code. The sample drawings are generated in code too.
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the
ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as
part of this repository and CADCraft, under docs/brand/LICENSE-brand.txt.
Forks and modified versions must remove them.
Autodesk, AutoCAD and DWG are trademarks or registered trademarks of Autodesk, Inc. in the United States and/or other countries. CADCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Autodesk, Inc.; these names are used only to describe the workflows and file formats it is compatible with.
Made by the ArtCraft team and community.

