FigCraft is a free, open-source interface design and prototyping application built in Rust. It aims to reproduce core design workflows found in Figma while providing a native desktop experience, local file storage, and support for offline work.
The application includes tools for creating layouts, reusable components, vector graphics, design systems, and interactive prototypes. It also supports developer handoff, multiple export formats, command-line automation, and integration with AI agents through the Model Context Protocol (MCP).
FigCraft is an ambitious alternative for UI designers and developers who want greater control over their design files without depending entirely on a cloud-based platform. However, it is still in alpha, and its developers estimate that it has reached approximately 49% of the functionality needed to replace Figma for real-world work. It is best treated as an actively developing alternative rather than a complete replacement.
Features
Interface Design and Auto Layout
FigCraft provides a canvas-based editor with a familiar interface featuring a toolbar, layers panel, design properties, and keyboard shortcuts.
Its auto-layout system supports horizontal and vertical layouts, wrapping, grid layouts, spacing, padding, alignment, and flexible sizing. Designers can combine nested frames, constraints, and layout grids to create responsive interface structures.
These tools are useful for building application screens, dashboards, landing pages, and reusable interface layouts without manually positioning every element.
Components and Design Systems
FigCraft supports reusable components, instances, variants, and component properties. Changes to a main component can propagate to its instances while preserving supported overrides.
The application also includes an asset panel for searching and inserting reusable components, along with a variables system supporting colors, numbers, strings, and Boolean values. Variables can have multiple modes, aliases, and scopes, making them useful for maintaining design systems and light or dark themes.
These capabilities provide a foundation for consistent UI development across larger projects.
Vector Graphics and Drawing Tools
The application includes vector editing tools that go beyond basic shapes. Users can draw paths, edit points and handles, create variable-width strokes, and combine overlapping shapes using Boolean operations.
Supported operations include union, subtraction, intersection, and exclusion. The editor also provides a shape builder, masks, gradients, adjustable corners, and editable vector geometry.
This makes FigCraft useful for designing icons, interface illustrations, diagrams, and other vector-based assets without requiring a separate drawing application for every task.
Colors, Effects, and Typography
FigCraft supports solid colors, linear and radial gradients, angular and diamond gradients, image fills, multiple strokes, blend modes, shadows, and blur effects.
Additional effects include noise, texture, glass-like treatments, and masks. Color handling supports sRGB and Display P3 profiles, with exported files tagged with their color profile.
The text editor supports mixed formatting within paragraphs, variable fonts, OpenType features, text styles, spacing controls, lists, and right-to-left text. These capabilities are useful for multilingual interfaces and more sophisticated typography.
Interactive Prototyping
FigCraft allows designers to connect frames and create interactive prototypes with triggers, actions, transitions, and back navigation.
Its interaction system also supports variables and conditional expressions, enabling more dynamic prototypes. A presentation view provides device frames and interaction hints, while a live preview helps designers test their work.
These features allow teams to explore interface behavior before implementing the final design in code.
Developer Handoff and Code Inspection
The application includes a developer-oriented inspection workflow with measurements, annotations, ready-for-development status, and frame comparisons.
Developers can inspect design properties and generate code representations in formats such as CSS, HTML, React, SwiftUI, and Jetpack Compose. Components can expose their properties as parameters in the generated code.
The output is intended to help bridge design and implementation, although generated code should be reviewed and adapted to the conventions and architecture of the target project.
AI Agent and CLI Automation
One of FigCraft's most distinctive features is its command-driven architecture. The same underlying command system powers the graphical interface, CLI, JSON control channel, and MCP server.
This enables scripts and compatible AI agents to create or modify designs, inspect documents, render files, and export assets without relying exclusively on manual interaction.
The command-line tools also support headless rendering and batch export, making the application potentially useful in automated design workflows and development pipelines.
Local Files and Offline Privacy
FigCraft stores projects as local .figcraft archives and can work without requiring an account. The project states that it does not use telemetry and does not contact a server until users share or join a file.
It supports importing and exporting common formats, including SVG, PNG, JPG, WebP, and PDF. Existing Figma .fig files can also be opened on a best-effort basis, although compatibility with real-world documents has not been fully validated.
For collaborative work, FigCraft offers preview-stage live sessions and an optional self-hosted server. These features are not equivalent to a mature cloud collaboration platform, and online sharing has important privacy limitations discussed below.
Download FigCraft v0.7.0 - Software Mirrors |
|---|
FigCraft v0.7.0 for Windowsfigcraft-0.7.0-windows-x86.msi | 65.5 MB figcraft-0.7.0-windows-x86-portable.zip | 81 MB figcraft-0.7.0-windows-x64.msi | 67 MB figcraft-0.7.0-windows-x64-portable.zip | 83.94 MB figcraft-0.7.0-windows-arm64.msi | 63.78 MB figcraft-0.7.0-windows-arm64-portable.zip | 81.13 MB |
FigCraft v0.7.0 for macOSfigcraft-cli-0.7.0-macos-universal.zip | 74.69 MB figcraft-0.7.0-macos-universal.dmg | 91.36 MB |
FigCraft v0.7.0 for Linuxfigcraft-server-0.7.0-linux-x86_64.tar.gz | 3.98 MB figcraft-server-0.7.0-linux-aarch64.tar.gz | 3.66 MB figcraft-0.7.0-linux-x86_64.tar.gz | 84.06 MB figcraft-0.7.0-linux-x86_64.rpm | 84.89 MB figcraft-0.7.0-linux-x86_64.flatpak | 58.99 MB figcraft-0.7.0-linux-x86_64.deb | 85.29 MB figcraft-0.7.0-linux-x86_64.AppImage.zsync | 277.37 kB figcraft-0.7.0-linux-x86_64.AppImage | 79.18 MB figcraft-0.7.0-linux-riscv64.tar.gz | 82.86 MB figcraft-0.7.0-linux-riscv64.rpm | 83.73 MB figcraft-0.7.0-linux-riscv64.deb | 83.97 MB figcraft-0.7.0-linux-aarch64.tar.gz | 81.44 MB figcraft-0.7.0-linux-aarch64.rpm | 82.88 MB figcraft-0.7.0-linux-aarch64.flatpak | 55.8 MB figcraft-0.7.0-linux-aarch64.deb | 83.4 MB figcraft-0.7.0-linux-aarch64.AppImage.zsync | 268.52 kB figcraft-0.7.0-linux-aarch64.AppImage | 76.65 MB |
FigCraft v0.7.0 for BSDfigcraft-0.7.0-freebsd-x86_64.tar.gz | 83.74 MB |
Others Download related to FigCraft v0.7.0figcraft-web-0.7.0.zip | 8.19 MB |
FigCraft v0.7.0 Source Code
FigCraft v0.7.0 Source code (zip)
FigCraft v0.7.0 Source code (tar.gz)
|
FigCraft v0.7.0 Release Notes: What's Changed- ci: add comfortable runtime limits to unbounded jobs by @skylartaylor in #397
- M7: home tests wait for the recent files reader instead of a fixed frame count (#351) by @Barzabel in #354
- Community batch 1: 22 reviewed fixes by @bflatastic in #507
- M7: follow system theme from the first frame by @VanTan666 in #262
- M7: a slice's export preview shows the page content under it by @ahmed-226 in #265
- M7: double-clicking a page in the Pages list no longer closes the app by @marcoarnulfo in #271
- fix(ui): gradient type icons that show their gradient (#256) by @Nael-Nathanael in #275
- fix(ui): disable alignment when the selection can't be aligned (#256) by @Nael-Nathanael in #276
- fix(pen): show the bezier handles while drawing (#256) by @Nael-Nathanael in #277
- fix(engine): Alt-drag copies snap to their original; Cmd+D repeats the step (#256) by @Nael-Nathanael in #283
- M1: a press on a corner handle resizes instead of picking the corner-radius handle by @marcoarnulfo in #293
- fix(desktop): Windows' first preferred language picks the UI language (#291) by @fede9234 in #294
- fix(server): keep each team library version in its own file (#206) by @MarekSpodBiedry in #302
- fix(pages): inherit the current page background when adding pages (M1) by @tylerjenningsw in #311
- fix(home): recent files notice files deleted while the home screen is open by @rcoenen in #318
- fix(home): keep a long path from drawing over the file name in Open files by @patlux in #324
- M1: SVG export keeps a nested frame's fill and stroke inside its parent's clip by @marcoarnulfo in #327
- M9: a compaction cut short closes the file instead of confirming lost edits (#183) by @Barzabel in #340
- M7: the Small caps sample in Type settings draws without a box by @StrajnarFilip in #355
- fix(engine): new text is readable on the frame it is drawn in (#362) by @vxMacDev in #372
- Copy and paste through the system clipboard in the browser by @mateusvillain in #375
- Outline stroke on every selected layer, not just the first by @Silvertree2010 in #386
- Keep corner resize cursors diagonal on wide and tall layers by @Silvertree2010 in #388
- Keep text selection highlight inside the box at the end of the text by @Silvertree2010 in #390
- Fix Send to back leaving layers above siblings across frames by @Silvertree2010 in #444
- Community batch 2: 20 reviewed fixes by @bflatastic in #510
- Add Japanese labels for templates, recent files, and editor controls by @haranishi in #288
- packaging: RPM declares the glibc 2.35 floor, so RHEL 9 refuses it by @tydude001 in #328
- collab: refuse sequence numbers a host cannot advance by @midasmatterhorn in #343
- doc: name counters stop at u64::MAX instead of overflowing by @midasmatterhorn in #344
- Replace every occurrence in edit.findReplace when replacement contains find by @Silvertree2010 in #358
- Reject negative or fractional index in effect.set, export.update and export.remove by @Silvertree2010 in #384
- M4: hanging punctuation test holds for fonts that kern with x offsets by @rcoenen in #471
- M1: Cmd+R rename test sends Ctrl+R only where Ctrl is the command key by @rcoenen in #472
- Refuse negative or fractional indexes in page.select and doc.switch by @Silvertree2010 in #475
- fix(engine): read the documented gradient shorthand on every route (#252) by @pcastro93 in #254
- fix(engine): roll back failed commands during interactions too by @notdezzi in #282
- fix(format): exclusive unique staging files for atomic save/export by @notdezzi in #284
- M1: open .figcraft files from Finder, Open With and the Dock on macOS by @marcoarnulfo in #290
- Count a recovery revision as copied only after its write succeeds by @Silvertree2010 in #297
- Keep the redo steps when a failed command batch rolls back (#196) by @MarekSpodBiedry in #301
- M1: creating a variable collection no longer closes the app (#224) by @Barzabel in #314
- M1: deeply nested layers don't run the layout out of stack (#210) by @Barzabel in #330
- M3: renaming a style folder no longer closes the app by @Barzabel in #337
- M1: cursor and double-click tests scan the system fonts themselves (#333) by @Barzabel in #339
- engine: long digit strings no longer overflow object.opacityKeys by @midasmatterhorn in #353
- Community batch 3: 20 reviewed PRs by @bflatastic in #529
- Avoid macOS file dialog reentrancy crashes by @justinjohn0306 in #253
- M9: Russian interface translation by @VanTan666 in #257
- M9: Turkish catalog (reviewed) by @yyamandevrim in #263
- M6: .fig import lays out the layers of resized instances by their constraints by @marcoarnulfo in #279
- Fix text edits rolling back prior document changes by @justinjohn0306 in #280
- fix(format): import explicit variable modes referenced by asset key by @notdezzi in #281
- Recovery: wait for the write in flight before an emergency save and before removing copies (#202) by @MarekSpodBiedry in #303
- engine: refuse page.move for node ids that are not pages by @midasmatterhorn in #310
- M0.9: answer control requests while the window is hidden (#269) by @AganzeFelicite in #313
- fix(recovery): keep the version history and branches in recovery copies (#185) by @vxMacDev in #331
- M0.9: every hidden window answers control requests, not only the main one (#269) by @patlux in #332
- M1: keep a recovery copy until this run has its own (#187) by @Barzabel in #336
- Set the native window identity to match the desktop entry by @IanHollow in #346
- Make edit.findReplace replace case-insensitive matches by @Silvertree2010 in #361
- i18n: Czech (cs) UI catalog (draft) by @Losminek in #469
- M7: find Unix user fonts under XDG_DATA_HOME by @IanHollow in #474
- M9: Indonesian draft catalog by @RevDonz in #477
- Text: colour emoji draw from their own colour tables (#268) by @fede9234 in #300
- Community batch 4: 11 reviewed PRs by @bflatastic in #530
- fix(ui): scroll a long pages list in its own area so the layers stay in view by @marcoarnulfo in #272
- M1: save files automatically (#296) by @AganzeFelicite in #305
- M1: leaving Design ends the pen path and goes back to Move by @marcoarnulfo in #308
- fix(vector): keep the canvas still when entering vector edit mode and picking a region by @rcoenen in #322
- M9: remove someone from a live session by @HaSh3003 in #338
- fix(ui): step through the font picker with Up and Down (#345) by @vxMacDev in #352
- fix(engine): drag with the Text tool to make a fixed-width text box (#360) by @vxMacDev in #363
- Variables export as a download in the browser by @mateusvillain in #368
- Let batch steps reference ids created by earlier steps by @edivanteixeira in #400
- M0.9: a control line that isn't JSON ends the connection by @bflatastic in #589
- Community batch 5: 59 reviewed PRs (#482 and up) by @bflatastic in #591
- Skip divider rows in Next page and Previous page by @Silvertree2010 in #517
- fix(ui): show error toasts raised by a slow frame for their full 3 s by @volkovskey in #518
- Keep a styled layer's fill variable through .fig round trips by @Silvertree2010 in #521
- Pen tool: a click's small wobble pulls out no handle by @seun-ipaye in #522
- Close a layer's colour picker when the selection changes by @Silvertree2010 in #523
- Keep a Rectangle in the smallest synthetic perf documents by @Silvertree2010 in #525
- Fix perf failing with 'no card' on small instance counts by @Silvertree2010 in #526
- Include empty outlines in no-op shapeBuilder.merge response by @Silvertree2010 in #527
- Don't record an undo step for an abandoned empty text box by @Silvertree2010 in #531
- Fix cross-axis arrows and drop slot on single-item wrapped lines by @Silvertree2010 in #533
- Report changed=false when list indentation is capped by @Silvertree2010 in #534
- Fix eraser missing brush crossings narrower than the sample spacing by @Silvertree2010 in #536
- fix(rest): keep a text hyperlink destination whole on import by @Hamza0101 in #539
- Keep character-range text styles when publishing and placing components by @Silvertree2010 in #542
- Refresh linked layers when a library update changes only a style by @Silvertree2010 in #545
- Point library style variable bindings at imported library variables by @Silvertree2010 in #547
- Keep frame min/max size in .fig export without an auto layout parent by @Silvertree2010 in #551
- Keep region loops in ring order when adding a point to a reversed edge by @Silvertree2010 in #556
- Keep Mixed line height when Enter is pressed without typing (#439) by @MarekSpodBiedry in #558
- Keep per-character text fills in SVG export (#429) by @MarekSpodBiedry in #559
- Keep the selected guide selected when an earlier guide is removed (#418) by @MarekSpodBiedry in #561
- Keep flows, prototype settings and guides when duplicating a page (#417) by @MarekSpodBiedry in #562
- Refuse to create a variable collection with a name that is already taken (#416) by @MarekSpodBiedry in #563
- Docs: FIG export guides no longer say variables and style links are omitted (#398) by @MarekSpodBiedry in #564
- Colour picker: record only the final colour of a drag in Recent colors (#395) by @MarekSpodBiedry in #565
- docs: document perf --instances in the CLI reference (#391) by @MarekSpodBiedry in #566
- fix(render): glass looks the same wherever a render cuts it, and samples once where it doesn't bend (#256) by @Nael-Nathanael in #576
- Colour names in hex fields (red → FF0000) by @mateusvillain in #577
- Fix typography spacing icon scrubbing by @VanTan666 in #579
- Fields select their text on focus by @mateusvillain in #583
- Cmd/Ctrl+= and - zoom the canvas only, not the whole interface by @marcoarnulfo in #584
- i18n: Swedish (sv) interface translation by @kler in #482
- Keep layer text and string defaults unchanged in rem code output by @Silvertree2010 in #485
- Make empty ranges link and unlink text styles on all characters by @Silvertree2010 in #486
- Fix paint bucket leaving a face filled when its region is duplicated by @Silvertree2010 in #488
- Leave missing vertices out of region point queries by @Silvertree2010 in #489
- Skip missing segments when starting a region loop walk by @Silvertree2010 in #490
- Brace variable names in expression text that would not read back by @Silvertree2010 in #491
- Keep hidden export roots from enlarging the exported image by @Silvertree2010 in #493
- Default CLI render and export to the first non-divider page by @Silvertree2010 in #494
- Keep the colour picker and open settings on their item after a removal by @Silvertree2010 in #496
- Fix variable.update scopes: null not resetting to all supported by @Silvertree2010 in #497
- Keep committed line height and letter spacing in the text style editor by @Silvertree2010 in #499
- Save the PDF from File > Export frames to PDF by @Silvertree2010 in #502
- Fix panic drawing a selected guide label in a zero-width canvas by @Silvertree2010 in #504
- Reveal the comment's page when opening it via ui.set commentOpen by @Silvertree2010 in #505
- Fix view jump when returning after a pan released over a panel by @Silvertree2010 in #506
- Drop the draw or marquee gesture a canvas double-click starts by @Silvertree2010 in #508
- Stop a guide drag released off the canvas from continuing on the next click by @Silvertree2010 in #509
- Draw layer blurs up to the documented 10,000 radius by @Silvertree2010 in #511
- Keep CMYK conversion inside PDF vector pattern tiles by @Silvertree2010 in #512
- Anti-alias rectangular frame clips on fractional device edges by @Silvertree2010 in #513
- fix(ui): a scrub is one undo step in the colour picker, prototype and Scale panels (#256) by @Nael-Nathanael in #514
- Keep nested frames out of the ready-for-dev list by @marcoarnulfo in #515
- Reject layer IDs as targets of page.rename, delete and setBackground by @Silvertree2010 in #516
- Cap startup operator problems at the latest 200 by @Silvertree2010 in #519
- Give case-colliding variant properties distinct data attributes by @Silvertree2010 in #483
- Fix MCP layer screenshots exceeding maxSize by @Silvertree2010 in #495
- Keep consecutive spaces in recent file accessible names by @Silvertree2010 in #503
- Community batch 5: #312's sturdier zoom-preview test; record four rebased heads by @bflatastic in #588
- M1: say why when the window can't open (#261) by @Barzabel in #306
- M1: drop shadows under a background blur (#255) by @Barzabel in #317
- M1: memory budgets for decoded images and a file's images (#203, #189) by @Barzabel in #326
- perf(canvas): refresh full-viewport previews during zoom (M8) by @tylerjenningsw in #312
- Community batch 6: 8 reviewed PRs by @bflatastic in #598
- perf(ui): look for CJK names in edits, not on every pan by @volkovskey in #478
- Merge text runs made identical by style updates by @Silvertree2010 in #487
- doc: runs of a file that reach past the text can't overflow a text edit by @midasmatterhorn in #528
- Keep cleared range hyperlinks through FIG export and import by @Silvertree2010 in #549
- Point duplicated page navigation at the copied frames by @Silvertree2010 in #554
- text: scripted text stores CRLF, CR, U+2028 and U+2029 as LF like the editor (#427) by @MarekSpodBiedry in #560
- M7: skip special files when scanning system fonts by @IanHollow in #568
- Community batch 7: Czech plurals and bounded canvas overscan by @bflatastic in #602
- i18n: Czech one/few/other plurals by @Losminek in #596
- Reduce blank strips while panning with bounded canvas overscan by @YarilaFox in #597
- Community batch 8: drop files anywhere, duplicate fill tests by @bflatastic in #606
- M1: a duplicate's fill stays its own (#586) by @Barzabel in #600
- Reject negative or fractional index in file.close by @Silvertree2010 in #608
- M7: drop files anywhere to open them by @Skyfuller1303 in #601
- Docs: roadmap rows for the community fixes from #478 up by @bflatastic in #605
- ci: delegate release, freebsd, windows-arm64, packaging-lint to craft-common-actions and add nix check by @dylanmtaylor in #176
- ci: standardize FreeBSD workflow on shared FreeBSD 15.1 action by @dylanmtaylor in #640
- M1: convert frames to sections and sections to frames (#719) by @bflatastic in #721
- Plugins: refuse file and network access through path params and collab by @bflatastic in #723
- M3: number variables in the text content picker (#629) by @bflatastic in #725
- Community batch 9: the .fig import series (11 PRs by @Skyfuller1303) by @bflatastic in #727
- M1: keep explicit instance identity and cached library components in .fig import by @Skyfuller1303 in #626
- M1: apply instance overrides by key and order, settle bound paints, keep stroke outline styles by @Skyfuller1303 in #627
- M1: let local text values and instance overrides win over a shared text style in .fig import by @Skyfuller1303 in #628
- M1: keep grid track sizes in .fig import by @Skyfuller1303 in #630
- M1: distinguish unresolved vector segment style metadata in .fig import by @Skyfuller1303 in #631
- M1: import editable text on a path from .fig files by @Skyfuller1303 in #632
- M1: import image adjustments from .fig files by @Skyfuller1303 in #635
- M1: import component slot content from .fig files by @Skyfuller1303 in #636
- M1: keep text decoration skip ink from .fig files by @Skyfuller1303 in #637
- M1: keep paragraph options from .fig files by @Skyfuller1303 in #638
- M1: import labels of straight connectors from .fig files by @Skyfuller1303 in #639
- Community batch 10: .fig import and file handling (12 PRs) by @bflatastic in #728
- fix(format): open large .fig files within budgets from the file's size by @volkovskey in #524
- fix(format): keep vertical trim on .fig import (#466) by @vxMacDev in #610
- M1: keep imported file bytes out of the command journal by @Skyfuller1303 in #612
- M1: keep per-point stroke joins on .fig import by @Skyfuller1303 in #617
- M1: show an import report after opening a file by @Skyfuller1303 in #620
- M1: paste layers copied in Figma by @JimKnoxx in #647
- M1: .fig import reads images carried in the message (image.dataBlob) by @th0mate in #656
- fix(format): numbered lists from .fig files keep their start number (#686) by @Nael-Nathanael in #695
- Cap stroke width in the outliner so huge weights don't panic by @Silvertree2010 in #697
- Skip layers with children in vector.offset by @Silvertree2010 in #711
- M1: save a copy as .fig by @Skyfuller1303 in #619
- M1: translate the vector style import notes by @Skyfuller1303 in #651
- Community batch 11: editor fixes and the Actions palette (9 PRs) by @bflatastic in #733
- M4: Flatten keeps open paths (#377) by @AganzeFelicite in #654
- M4: points dropped on a point merge (#401) by @AganzeFelicite in #657
- Live font preview on hover in font picker by @Ahmed5Emad in #666
- fix(engine): Shift-drag on a selected layer moves the selection (#498) by @Nael-Nathanael in #691
- fix(ui): Cmd/Ctrl+V pastes an image copied in another app (#663) by @Nael-Nathanael in #693
- Rework Actions Palette with Figma-style Panel and Improved UI by @Ahmed5Emad in #707
- fix(doc): thin strokes take a double-click a few pixels away (#646) by @itrejomx in #713
- fix(ui): Shift+Cmd/Ctrl+V pastes over the selection and Alt+Cmd/Ctrl+V pastes properties (#716) by @Nael-Nathanael in #717
- #710: Resources and Shift+I open the Assets panel by @justinjohn0306 in #718
- Community batch 12: engine checks, server limits, web join links, menus and more (13 PRs) by @bflatastic in #735
- M0.9: a script runs as one undo step and resolves $step, like command.batch by @phonedu in #673
- M9: a damaged generation field no longer drops a log's flushed edits (#408) by @Barzabel in #687
- Fix parameterized menu actions and language selection by @YarilaFox in #699
- feat(web): join a live session from ?join= in the page URL by @sushi-killer in #712
- i18n(sv): translate the command and menu labels and 19 new strings by @kler in #599
- Contributors: add Marco Arnulfo by @marcoarnulfo in #616
- Refuse edits that leave a layer with non-finite geometry by @Silvertree2010 in #625
- ci: switch to shared nix workflow from craft-common-actions by @dylanmtaylor in #633
- docs: correct README example plugin count (#392) by @Zaxaerith in #641
- Reject negative or fractional index in fill.set and stroke.set by @Silvertree2010 in #655
- Make the control server's connection-limit test pass on macOS by @Hamza0101 in #670
- M1: a param that names a layer says so when it isn't one by @phonedu in #675
- Refuse pages in edit.copy and edit.cut by @Silvertree2010 in #680
- fix(server): let message limits follow max_file_mb so files above 64 MiB publish and open by @sushi-killer in #705
- Community batch 13: colour picker, text strokes and selection, pages divider, variant reorder (8 PRs) by @bflatastic in #736
- fix(render): text strokes follow their alignment (#615) by @vxMacDev in #621
- M1: pop up colour picker when adding a fill or stroke (#404) by @krinry in #624
- M3: re-read a library file whose stamp is as recent as the read by @Skyfuller1303 in #652
- perf(render): work out paint bounds once per render by @volkovskey in #667
- fix(ui): drag the line between pages and layers to size the pages list by @volkovskey in #668
- Text: selection highlights after a line break start at the line's start, and the empty last line shows by @marcoarnulfo in #671
- Hold the duplicate step for a dragged and a nudged copy by @Hamza0101 in #672
- M3: drag variant properties to reorder them in the Properties section by @marcoarnulfo in #679
- UI: submenu hover fixes (stale state, safe triangle, hover delay) by @Jorrevdb in #729
- Docs: roadmap rows for the community fixes from #524 up by @bflatastic in #744
- M3: instance layers keep resizing overrides (#731); .fig/REST imports keep Hug (#732) by @bflatastic in #745
- M8: confine MCP file access with --automation-read-root/--automation-write-root (#715) by @bflatastic in #746
- M8: the control channel answers while the window is minimized (#720) by @bflatastic in #751
- Community batch 14: selection colors, spacing, presenter tab, Wayland controls and more (10 PRs) by @bflatastic in #753
- M7: test credits column sizing and horizontal scrolling by @IanHollow in #347
- M7: align native-density canvas textures to device pixels by @Skyfuller1303 in #359
- M1: adding auto layout to an existing frame keeps its size instead of hugging by @Ahmed5Emad in #369
- Add a dedicated presentation tab with device and scale controls by @YarilaFox in #537
- M3: add Selection colors for mixed selections by @VanTan666 in #575
- Restore window controls on Wayland without server decorations by @danielmigueltejedor in #592
- Add smart-selection spacing fields and canvas handles by @VanTan666 in #595
- node.set: refuse auto layout keys off frames, and font styles the family lacks by @edivanteixeira in #603
- M8: Keyboard shortcuts panel closes on the home screen (#548) by @MarekSpodBiedry in #749
- M7: use native macOS paste modifiers in tests by @VanTan666 in #750
- Docs: parity rows for the 2026-10-17 landings by @bflatastic in #756
- M7: translate the .fig import notes by @bflatastic in #761
- M1: IME composition in text layers (#747) by @bflatastic in #755
- Batch 15: .fig distributed alignment (#552), REST grid tracks, macOS CJK fonts, pen Esc by @bflatastic in #775
- Keep space-around and space-evenly alignment on FIG import by @Silvertree2010 in #552
- Open only web links and local libraries from a document by @skylartaylor in #777
- fix(ui): SVG and PDF export rows offer no size (#256) by @Nael-Nathanael in #768
- fix(ui): Rotation gets its own icon, not Corner radius's (#256) by @Nael-Nathanael in #769
New Contributors- @skylartaylor made their first contribution in #397
- @Barzabel made their first contribution in #354
- @VanTan666 made their first contribution in #262
- @ahmed-226 made their first contribution in #265
- @marcoarnulfo made their first contribution in #271
- @Nael-Nathanael made their first contribution in #275
- @MarekSpodBiedry made their first contribution in #302
- @tylerjenningsw made their first contribution in #311
- @patlux made their first contribution in #324
- @StrajnarFilip made their first contribution in #355
- @vxMacDev made their first contribution in #372
- @mateusvillain made their first contribution in #375
- @Silvertree2010 made their first contribution in #386
- @haranishi made their first contribution in #288
- @tydude001 made their first contribution in #328
- @midasmatterhorn made their first contribution in #343
- @pcastro93 made their first contribution in #254
- @notdezzi made their first contribution in #282
- @yyamandevrim made their first contribution in #263
- @AganzeFelicite made their first contribution in #313
- @IanHollow made their first contribution in #346
- @Losminek made their first contribution in #469
- @RevDonz made their first contribution in #477
- @HaSh3003 made their first contribution in #338
- @edivanteixeira made their first contribution in #400
- @volkovskey made their first contribution in #518
- @seun-ipaye made their first contribution in #522
- @Hamza0101 made their first contribution in #539
- @kler made their first contribution in #482
- @YarilaFox made their first contribution in #597
- @Skyfuller1303 made their first contribution in #601
- @dylanmtaylor made their first contribution in #176
- @JimKnoxx made their first contribution in #647
- @th0mate made their first contribution in #656
- @Ahmed5Emad made their first contribution in #666
- @itrejomx made their first contribution in #713
- @phonedu made their first contribution in #673
- @sushi-killer made their first contribution in #712
- @Zaxaerith made their first contribution in #641
- @krinry made their first contribution in #624
- @Jorrevdb made their first contribution in #729
- @danielmigueltejedor made their first contribution in #592
Full Changelog: v0.6.0...v0.7.0 |
Performance and Compatibility
FigCraft is built primarily in Rust and uses a native desktop interface rather than Electron or an embedded web view. Its document engine is designed to update only the parts of a design that change, which can reduce unnecessary work when editing complex documents.
The project also supports a WebAssembly build, making browser-based use possible. Desktop installers are provided for Windows, macOS, Linux, and FreeBSD, subject to the available release packages.
Its main limitation is maturity. The developers explicitly identify the application as alpha software. Although its core editor and many design features are implemented, the project has not been fully validated against real Figma documents. Importing .fig files is best-effort, and its plugin system uses WebAssembly plugins rather than Figma's native plugin ecosystem.
Live collaboration is also in preview. Users can share a document through the default collaboration server or a self-hosted server, but the project does not yet provide accounts, team management, or a complete cloud workspace.
Privacy also requires attention when sharing. Online sessions upload files to a server, and the shared documents are not end-to-end encrypted. Anyone with an edit link or code can modify the file. Sensitive projects should therefore remain local, use a trusted self-hosted server, or be shared only through a trusted local network.
System Requirements
The project does not publish a single minimum CPU, RAM, or GPU specification. Its documented technical requirements include:
Operating systems: Windows, macOS, Linux, and FreeBSD, depending on the available build.
Development toolchain: Rust and Cargo for building from source.
Web build: WebAssembly support, with Trunk used for the browser build.
Storage: Local disk space for the application, design files, and assets.
Fonts: System fonts can be used, while the project's separate craft-fonts repository provides additional bundled fonts.
Internet connection: Not required for normal offline design work, but needed for online collaboration and other network-dependent workflows.
The easiest installation method is to download an appropriate installer from the project's GitHub releases. Developers who prefer building from source should follow the repository's current setup instructions.
Pros and Cons
Pros
Free and open-source under the MIT or Apache-2.0 license.
Native application built in Rust without Electron.
Works offline without requiring an account.
Includes auto layout, components, variants, variables, and design-system tools.
Provides advanced vector editing and Boolean operations.
Supports interactive prototyping and developer handoff.
Exposes design operations through a CLI, JSON control channel, and MCP server.
Supports common image, vector, and document export formats.
Offers cross-platform desktop builds and a WebAssembly version.
Provides a foundation for local and self-hosted collaboration.
Cons
Still in alpha and not yet a complete replacement for Figma.
Figma document import is best-effort and has not been fully validated against real documents.
Does not support Figma's native plugin ecosystem.
Multiplayer collaboration remains a preview feature.
Lacks mature account, team, and cloud-workspace management.
Online sharing is not end-to-end encrypted.
Generated code requires review before production use.
Building from source requires familiarity with Rust and Cargo.
How to Install
Option 1: Download a Prebuilt Release
Visit the FigCraft GitHub repository.
Open the Releases section.
Download the installer or package appropriate for your operating system.
Install or extract the package according to its format.
Launch FigCraft and create a new design or open an existing .figcraft project.
Prebuilt releases are the most convenient option for users who want to try the application without setting up a development environment.
Option 2: Build from Source
Install Rust and Cargo first, then clone the repository:
git clone https://github.com/storytold/figcraft
cd figcraft
Start the desktop application in release mode:
cargo run --release -p figcraft
To start the collaboration server separately:
cargo run --release -p figcraft-server
To run the workspace test suite:
cargo test --workspace
The project also provides a CI command for formatting, linting, tests, layering checks, and asset validation:
cargo xtask ci
For additional fonts, clone the shared font repository alongside FigCraft:
git clone https://github.com/storytold/craft-fonts ../craft-fonts
Without the additional font repository, FigCraft can fall back to system fonts. Consult the project's documentation for platform-specific dependencies and further configuration.
Final Verdict
FigCraft is an ambitious open-source design application that combines many of the features expected from a modern UI design tool with the benefits of native software and local-first storage.
Its strongest advantages are its component system, vector editor, prototyping tools, and command-driven architecture. Support for CLI automation and MCP is particularly interesting for developers who want AI agents to generate or modify interface designs as part of their development workflow.
However, its alpha status is a significant consideration. Figma import compatibility, collaboration, and plugin support are not yet mature enough to assume a seamless transition from established design platforms. Users working on critical production projects should evaluate these limitations before adopting it as their primary tool.
FigCraft is a promising choice for developers, designers, and open-source enthusiasts who want a native, offline-capable interface design tool. It is worth testing for new projects and automated design workflows, but teams that depend on Figma's complete collaboration ecosystem should treat it as an emerging alternative rather than a direct replacement.
Post a Comment/Report Broken Link: