* Evaluate spline basis functions on the stack `basis()` allocated three Vecs for every evaluated point, and a large drawing evaluates millions of points while computing its extents on open: `basis` was 10% and `calloc` 6% of `cadcraft-cli info` on the 1.1 M-entity drawing of #1076. `eval` now works in fixed arrays up to degree 10 (the cap of the DXF reader and the SPLINE command) and falls back to the heap above it. Results are bit-identical to the old code, which the test keeps as its reference. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Validate a spline once per tessellation `tessellate` called `eval` for every sample, and `eval` re-ran `is_valid` (a walk over the whole knot vector) and `domain()` each time, so a spline with many control points cost O(knots) per point. Validate and read the domain once, then evaluate the samples with the checked variant. Part of the open time of large drawings (#1076). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Size spline bounds sampling relative to the spline `Spline::bounds` tessellated at an absolute tolerance of 1e-3, so every spline of a drawing in millimetres hit the 4000-point cap: the extents computed on open evaluated 12 M points for the 3072 five-point cubics of the 1.1 M-entity drawing of #1076, a third of its open time in the CLI and the GUI alike. Sample at 1e-3 of the spline's own control-box diagonal instead, with at least four samples per knot span, straight into the box without an intermediate Vec. The box of a typical spline now takes a few hundred evaluations and stays within 1e-3 of the spline's size of the finely sampled one (3.4e-4 at worst over the test set); a degree-1 spline gets its exact control box. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Give a spline with a non-finite control point its control box `Bounds2::from_points` skips a non-finite point, so the control box and its diagonal were finite while a NaN or infinite control point poisoned every sample (`c * 0.0` is still NaN): `bounds` returned the empty box instead of the box of the finite control points that the other degenerate cases get. Check the control points before sampling. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Size spline bounds sampling by a dimensionless ratio `bounds` passed `diag * 1e-3` to `sample_count`, whose absolute floor of 1e-9 on the tolerance made the count absolute again for a spline with a diagonal under 1e-6: at a scale of 1e-12 every spline got the minimum eight segments per degree whatever its shape, and an extreme between two samples exceeded the 1e-3 margin the box promises. Derive the count from the ratio of control-polygon length to tolerance in a helper that `tessellate` (with its floor, unchanged) and `bounds` (with the ratio to the diagonal) share, so a scaled copy of a spline samples exactly like the original. The scale test now also runs at 1e-9 and 1e-12. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Sample spline bounds over every knot span `bounds` sampled one uniform grid over the parameter domain; the four-per-span floor only raised the count. A narrow non-empty knot span (a degree-2 peak supported on 0.5003..0.5004, say) fell between grid points, at any count up to the cap, so the box missed part of the curve and zoom extents clipped it. Spread the samples over the non-empty knot spans in proportion to their length with a floor of four per span, ends included, still folded straight into the box. The cap holds over all spans: the floor drops to two or three when four would exceed it, and a spline with more spans than two each allow falls back to the grid. A typical spline evaluates as many points as before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Hold a narrow knot span to eight samples, and say what that buys The doc said the box falls short of an extreme by far under 1% of the spline's size, which holds where the budget sets the count but not in a span held to the floor: four segments across a degree-2 piece can miss an off-grid peak by about 3% of the control box. Eight segments bring that under 1%, and the comment now says both figures. A test puts the peak between the grid's samples and checks the margin; four segments would miss it by more. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Give a spline with more spans than the cap samples its control box Past two thousand knot spans the grid of the cap's four thousand samples can step over a narrow span and leave its extreme out of the box, which selection uses as a pre-filter. The control box contains the curve whenever no weight is negative (the convex hull property), so such a spline gets that box, conservative rather than sampled; only a negative weight, which voids the property, keeps the grid. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Keep the degree-1 shortcut for positive weights A degree-1 spline is its control polygon only under the convex hull property, which a negative weight voids: with control (1, 0), (2, 0) and weights 1, -0.5 the curve passes (4, 0), outside the control box that bounds() returned for every degree-1 spline. The shortcut, like the many-spans one, now needs every weight positive; otherwise the spline is sampled like any other. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Sample a degenerate spline whose weights are not positive Coincident control points with zero weights evaluate to the origin, not to the point they sit on: eval() leaves the unnormalised sum alone when the weights sum to nothing. The zero-diagonal shortcut returned that point's box all the same. Like the degree-1 and many-spans shortcuts, it now needs positive weights; otherwise the curve is sampled, and the box holds what eval() gives. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Brandon Thomas <echelon@gmail.com>
CADCraft
Computer-aided design and drafting; an open-source, modern 2D and 3D CAD application, built in pure Rust.
A fast, open-source CAD 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 (R12–2018, ASCII and binary) and write (R2000), including dimension styles, associativity, tables and constraints; DWG read (via the acadrust library) and write (R2000); PDF plotting, SVG and PNG export. Entities CADCraft doesn't model yet are not kept on save: see file-format parity |
| 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 |
| Interface languages | English, Ukrainian (Українська), Brazilian Portuguese (Português (Brasil)), German (Deutsch), Spanish (Español), Czech (Čeština), Russian (Русский), French (Français), Simplified Chinese (简体中文, with an installed CJK font), Italian (Italiano), Korean (한국어, with an installed Hangul font), Swedish (Svenska), Arabic (العربية, with an installed Arabic font), Hungarian (Magyar) and Turkish (Türkçe), live switching and a remembered Auto/system-language choice; details |
| Automation | MCP server, JSON control channel, cadcraft-cli (info, convert, run, commands, mcp) |
Quick start
Desktop and web UI builds require Rust 1.95 or later. The core workspace's declared minimum remains Rust 1.90.
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 has no fonts in its repository; it uses the TrueType/OpenType fonts installed on your
system. Builds made with the optional craft-fonts
input (CRAFT_FONTS_DIR=<absolute path to a checkout> cargo build --release) also embed its
fonts: BIZ UDPGothic, BIZ UDMincho and Shippori Mincho (Japanese) and Noto Sans Arabic (the web
build, which has no system fonts, only BIZ UDPGothic Regular and Noto Sans Arabic). A text style
can use them by family name, and they draw characters a text's font lacks when no installed
wide-coverage CJK font has them. Without CRAFT_FONTS_DIR nothing is embedded. 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.
Your own fonts. Any .ttf, .otf or .ttc font works: install it in the system font folder
(Windows C:\Windows\Fonts or per-user fonts, macOS /Library/Fonts or ~/Library/Fonts,
Linux and the BSDs /usr/share/fonts, /usr/local/share/fonts, ~/.local/share/fonts or
~/.fonts) and name it in a text style (STYLE, or style {"name":"FA","font":"Vazirmatn"})
by file name (Vazirmatn-Regular.ttf) or family name (Vazirmatn), or inline in MTEXT with
\fVazirmatn;. Restart CADCraft after installing a font: the font folders are scanned once.
Right-to-left text (Persian, Arabic, Urdu, Hebrew). TEXT and MTEXT lines are laid out with the
Unicode Bidirectional Algorithm (the paragraph direction comes from its first letter, so numbers
and Latin words inside Persian text keep their own order), and Arabic-script text is shaped with
OpenType (contextual letter forms, lam-alef and other ligatures, ZWNJ / ZWJ, mark positioning).
Justification (left, centre, right, MTEXT attachment and wrapping) still refers to the text's box.
Our stroke font has no Arabic letters, so Persian in a stroke-font style is drawn from an
installed font that has them: Vazirmatn, Noto Naskh Arabic, Noto Sans Arabic, Segoe UI, Tahoma,
Arial and DejaVu Sans are looked for first. To choose the font, install a free Persian font such
as Vazirmatn (SIL Open Font License) and either use it
in the text style or set FONTFALLBACK (CADCRAFT_FONTFALLBACK="Vazirmatn"). Formatting changes
inside a word (an MTEXT colour change in the middle of a Persian word) break the joining at that
point.
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.
To run LISP routines, scripts and alias files, or to drive CADCraft from your own programs, see docs/customization.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.
Drafting and layer-palette icon buttons use the pinned craft-ui button component for interaction,
accessible labels and keyboard focus. CADCraft keeps its multicolor icon painter, dark palette,
disabled tint and tool commands. The native host saves workspace visibility and toolset choices
atomically; CADCRAFT_CONFIG_DIR selects an isolated profile. Compact toolbar groups move into a
More menu, and status readouts truncate with a full-value tooltip before they reach layout tabs.
Painted toolbar and tab controls
have accessible labels and visible keyboard focus. Property controls remain application-specific.
Accessibility
System cursor
Over the drawing area CADCraft hides the system cursor and draws its own crosshair. Tools that follow the system cursor (Windows Magnifier set to follow or centre the mouse pointer, other screen magnifiers, screen recorders, remote desktops) lose track of it there. Turn on View ▸ Accessibility ▸ Show System Cursor to keep a small system crosshair visible at the centre of the drawn one, or start CADCraft with the environment variable CADCRAFT_SYSTEM_CURSOR=1 (on Windows, set it once with setx CADCRAFT_SYSTEM_CURSOR 1 and start CADCraft again). Agents can switch it with the control channel: ui.set {"systemCursor": true}.
Animation effects
CADCraft follows the operating system's animation setting. When the system is set to show no animations, dialogs, menus and tooltips appear at once instead of fading in, collapsing sections and scroll bars change at once, and the mouse wheel scrolls lists a whole step at a time instead of gliding. Zooming the drawing with the wheel always moves a whole step; with Ctrl held (a touchpad pinch, on Windows) it glides to the new zoom only while animation effects show.
| System | Where the setting is |
|---|---|
| Windows | Settings ▸ Accessibility ▸ Visual effects ▸ Animation effects |
| macOS | System Settings ▸ Accessibility ▸ Reduce motion |
| Linux, BSD | the desktop's reduced-motion (or animations) setting, read through the XDG Desktop Portal |
| Web | the browser's prefers-reduced-motion |
A change to the system setting is picked up while CADCraft runs, within a few seconds. To choose for CADCraft alone, use View ▸ Accessibility ▸ Animation Effects: Use System Setting (the default), On or Off. Options ▸ Display has the same choice. Agents can set it with the control channel: ui.set {"animations": "off"} ("system", "on" or "off"), and ui.inspect reports whether animations show (animations).
Drafting feedback is not an animation effect and stays as it is: rubber bands and previews, snap markers, the pause that acquires an object snap tracking point, the text cursor's blink, the spinner shown while a drawing opens, and pan and zoom, which follow the pointer and the wheel directly.
Roadmap
See ROADMAP.md for the stage, measured parity and the estimate of remaining work, and docs/gaps.md for everything still missing.
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.
Warning
Download official CADCraft builds from the storytold/cadcraft releases. Verify that the repository owner is
storytold. Before you run a download, check that its checksum matches the line for that file in the release'sSHA256SUMS.txt:shasum -a 256 cadcraft-<ver>-macos-universal.dmg # macOS (on Linux: sha256sum FILE) Get-FileHash .\cadcraft-<ver>-windows-x64.msi # Windows PowerShell
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 |
RISC-V (riscv64): cadcraft-<ver>-linux-riscv64.tar.gz, cross-compiled; needs glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+).
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.
Made by the ArtCraft team and community.
Tool Sets, Layers, and Properties can be regrouped, split, floated within the app window, closed, and reopened. The drawing canvas stays visible and cannot be closed or turned into a tab. Drag a panel header to a target edge or another header. Its context menu offers Float panel, Move to group, and Close panel. Existing panel toggles reopen panels at their saved location; Reset Panel Layout restores the app layout. Floating panels remain inside the current app window.

