* Desktop: write log records to standard error and a rotating log file The desktop app installed no logger, so every log::warn!/log::error! in the workspace was discarded: the crash guard's panic report, a failed crash-recovery save, font folders that can't be read. A launch from a desktop menu has no terminal either, so there was nothing to attach to a bug report. apps/designcraft/src/logging.rs (no new dependency): - standard error plus <settings dir>/logs/designcraft.log (beside ui.json and prefs.json); each launch rotates the previous log to designcraft.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 designcraft*, 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 The logger is installed first in main (before the engine's panic hook) and the file is opened after argument parsing (--version leaves no file). The settings directory moves out of prefs_path into config_dir. A --control or DESIGNCRAFT_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). * Desktop: no eprintln! on the log and panic paths eprintln! panics when standard error is a broken pipe (a GUI launch on Windows), and a panic inside the panic hook aborts. The "no log file" message goes through log::warn! (standard error only by then); the panic hook's fallback writes to standard error with write_fmt and ignores the error. Same fix as storytold/vectorcraft#465.
17 KiB
DesignCraft
Page layout and publishing; an open-source, clean-room reimplementation of Adobe InDesign, rebuilt in pure Rust.
A fast, open-source, clean-room take on the Adobe InDesign workflow. It runs natively on macOS,
Windows and Linux, and in the browser via WebAssembly.
By the ArtCraft team.
DesignCraft on getartcraft.com · ArtCraft · All Crafting Apps
Quarterly, Spring Issue: threaded three-column body text, a wrapped pull quote and parent-page folios, all set by DesignCraft's own paragraph composer.
Note
ArtCraft is a community of artists from all walks of life. Digital, generative, music, games — if you make things, you're one of us. Come say hi on Discord.
The sample magazine · Why DesignCraft · Quick start · Web · Architecture · Downloads · The Crafting Apps · License and credits
The sample magazine
Every page below was laid out by DesignCraft from code (crates/engine/src/sample.rs) and exported
by its own renderer. Try it yourself with File → New → Sample Document, or start the app with
--sample.
Why DesignCraft
- Familiar. InDesign's layout, tools, menus, panels and shortcuts: spreads and parent pages, frames and threaded stories, the Control panel, paragraph and character styles, swatches, text wrap and more. If you know InDesign, you already know how to use it.
- Beautiful type. A Knuth–Plass paragraph composer (plus single-line), dictionary hyphenation (the public-domain Moby word list plus our own trained patterns), word, letter and glyph-scaling justification, keeps, optical margin alignment, columns, baseline grid, tabs, rules and shading. Line breaks are identical on screen and in PDF.
- Fast. Multithreaded SIMD rendering (vello_cpu), copy-on-write documents with O(1) undo snapshots, and cached composition.
- Open. A documented native format, IDML import and export, and PNG, PDF (PDF/X-4, PDF/A-2b) and EPUB export. No subscription, no licence server, no telemetry.
- Agent-native. Every menu item, tool gesture, panel control and dialog can be driven over a
JSON control channel and an MCP server, so Claude and other agents can lay out and edit
documents like a designer. See
docs/control-protocol.mdanddocs/mcp.md. - Everywhere. One Rust codebase for desktop and the web.
Quick start
cargo run --release -p designcraft # desktop app (start screen)
cargo run --release -p designcraft -- --sample # open the sample magazine
cargo run --release -p designcraft -- --sample --control 7979 # + JSON control channel
cargo run --release -p designcraft-cli -- run --sample --all-pages out/ # headless: render every page to PNG
cargo run --release -p designcraft-cli -- commands # list every command
cargo xtask ci # fmt, clippy, tests, assets, layering, wasm
Japanese text (UI and documents) uses fonts from
storytold/craft-fonts, an optional build input (font
files are never committed here; see craftrules
standards/fonts.md):
git clone https://github.com/storytold/craft-fonts ../craft-fonts
CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo run --release -p designcraft # absolute path
Without it, Japanese falls back to the system's fonts (none on the web). Release builds always include it.
To drive a running app, send JSON lines to 127.0.0.1:7979. The protocol is described in
docs/control-protocol.md.
Logs
The desktop app writes its log records to standard error and to logs/designcraft.log in the
settings directory, beside ui.json and prefs.json (Linux ~/.config/designcraft/logs/, or
$XDG_CONFIG_HOME/designcraft/logs/; macOS ~/Library/Application Support/DesignCraft/logs/;
Windows %APPDATA%\DesignCraft\logs\). A start launched from a desktop menu or the Dock has no
terminal, so this file is what to attach to a bug report: the crash guard's panic report and a
failed crash-recovery save land there. Each launch moves the previous log to designcraft.1.log
(and that one to designcraft.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 |
|---|---|
RUST_LOG |
Log levels for standard error and the log file. Default: info for DesignCraft's own crates, warn for everything else. env_logger-style directives replace that, e.g. RUST_LOG=debug, RUST_LOG=warn,designcraft_render=trace or RUST_LOG=info,wgpu_core=warn; a directive ending in * covers every target starting with it (designcraft*=debug). |
The logger is apps/designcraft/src/logging.rs; the web build logs to the browser console instead.
Web
cd apps/designcraft-web && trunk build --release # → dist/web (serve it with any static server)
cd apps/designcraft-web && trunk serve --release # http://127.0.0.1:8767
You need trunk and the wasm32-unknown-unknown target. The same app runs
through eframe's web runner on WebGPU, falling back to WebGL2 (?webgl forces it; ?sample opens
the sample magazine). Open and Place use the browser's file picker, and dropping files works too.
Save and Export download the file. The web build has no control channel.
Architecture
DesignCraft is an engine-first Cargo workspace with enforced layering (cargo xtask layers). The
egui frontend is a separate crate, so the UI can be swapped without touching the engine.
| Layer | Crates |
|---|---|
| L0 | geom (paths, units & measurement parsing, corner options) · color (CMYK/RGB/Lab, swatches, tints, gradients) |
| L1 | doc (spreads, pages, parents, layers, frames, stories, styles) · fonts (font DB, shaping, outlines) |
| L2 | compose (the text engine) |
| L3 | render (vello_cpu) |
| L4 | tools (pointer events → commands + overlays) |
| L5 | engine (session, history, command registry) |
| L6 | ui-egui (InDesign-style UI, control channel) |
| L7 | apps/designcraft, apps/designcraft-cli, apps/designcraft-web |
- Status and milestones: ROADMAP.md
- Contributor and agent rules (clean-room, asset policy, quality gates):
AGENTS.md - Bundled assets: every one is listed with its licence in
ASSETS.md - App icon and colour: a calico cat in a polka-dot scarf on DesignCraft green
#7bb51c; seeassets/app-icon/
Downloads
New to DesignCraft? Download it from the DesignCraft page on getartcraft.com. That's the easiest way to install it.
Want a specific build or format? On 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) | designcraft-<ver>-windows-x64.msi |
designcraft-<ver>-windows-x64-portable.zip |
| arm64 (Snapdragon and other ARM PCs) | designcraft-<ver>-windows-arm64.msi |
designcraft-<ver>-windows-arm64-portable.zip |
| x86 (32-bit) | designcraft-<ver>-windows-x86.msi |
designcraft-<ver>-windows-x86-portable.zip |
Installers and executables are code-signed.
macOS
| Build | File | Notes |
|---|---|---|
| App, universal (Apple silicon + Intel) | designcraft-<ver>-macos-universal.dmg |
Signed and notarized |
| Command-line tool, universal | designcraft-cli-<ver>-macos-universal.zip |
Signed and notarized |
Linux
| Format | x86_64 | aarch64 (ARM64) | Notes |
|---|---|---|---|
| AppImage | designcraft-<ver>-linux-x86_64.AppImage |
designcraft-<ver>-linux-aarch64.AppImage |
Runs anywhere; updates itself with AppImageUpdate (.zsync files) |
| Flatpak | designcraft-<ver>-linux-x86_64.flatpak |
designcraft-<ver>-linux-aarch64.flatpak |
Sandboxed; flatpak install --user <file> |
| Debian/Ubuntu | designcraft-<ver>-linux-x86_64.deb |
designcraft-<ver>-linux-aarch64.deb |
|
| Fedora/RHEL/openSUSE | designcraft-<ver>-linux-x86_64.rpm |
designcraft-<ver>-linux-aarch64.rpm |
|
| Tarball | designcraft-<ver>-linux-x86_64.tar.gz |
designcraft-<ver>-linux-aarch64.tar.gz |
Unpack anywhere |
FreeBSD
| Build | File |
|---|---|
| x86_64 | designcraft-<ver>-freebsd-x86_64.tar.gz |
Web (WebAssembly)
| Build | File | Notes |
|---|---|---|
| Static site | designcraft-web-<ver>.zip |
Runs in a modern browser; host it on any static server |
The Crafting Apps
DesignCraft 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 · 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 · DesignCraft
License and credits
DesignCraft is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the DesignCraft 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 ASSETS.md.
The bundled fonts, and the craft-fonts fonts embedded by release builds, are under the SIL Open Font License; all UI icons are drawn in code and are original.
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 DesignCraft, under docs/brand/LICENSE-brand.txt.
Forks and modified versions must remove them.
Adobe, Photoshop, Illustrator, Premiere Pro, Lightroom, Acrobat, After Effects and InDesign are trademarks or registered trademarks of Adobe Inc. in the United States and/or other countries. DesignCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Adobe Inc.; these names are used only to describe the workflows it is compatible with.
Made by the ArtCraft team and community.



