* Data: Analysis ToolPak two-factor Anova (with and without replication) and z-Test Builds on the ToolPak of #320. data.analysisToolPak gains three tools: Anova: Two-Factor Without Replication (rows and columns as factors, the residual as the error term), Anova: Two-Factor With Replication (samples of rowsPerSample rows, with the interaction and within-cell terms) and z-Test: Two Sample for Means (known variances, normal tails and critical values from NORM.S.DIST and NORM.S.INV). Each has a form in the Data Analysis dialog. Tests check the reports against Montgomery's hardness-testing and battery-life examples. * Data: Analysis ToolPak Fourier Analysis data.analysisToolPak gains Fourier Analysis: the discrete Fourier transform or its inverse of one row or column of 2^k values (at most 4096), by an iterative radix-2 FFT. Input cells are read as IMREAL and IMAGINARY read them, so complex text such as 3+4i works, and the results are written as COMPLEX text. Tests check known transforms (1, 2, 3, 4; a sampled cosine), the inverse round trip and the input limits. * Data: Analysis ToolPak Random Number Generation and Sampling data.analysisToolPak gains the last two of Excel's 19 tools. Random Number Generation draws uniform, normal, Bernoulli, binomial, Poisson and discrete numbers, or writes a patterned sequence, in one or more columns; binomial and Poisson draws invert tables built from BINOM.DIST and POISSON.DIST. Sampling takes every period-th value or a random sample with replacement. Both use a seeded xoshiro256** generator: the same seed repeats the numbers, and a run without one reports the seed it chose. Output is capped at 1,000,000 numbers. * Data: Analysis ToolPak two-factor Anova without replication: Labels caption names the first column With Labels ticked, Anova: Two-Factor Without Replication takes the column names from the first row and the row names from the first cell of every data row. The form's caption read "Labels in first row", so a user with column headers but no row names who ticked it would lose the first data column. The caption now reads "Labels in first row and first column", and the command's params doc says the same. A dialog test checks the caption. * Data: Analysis ToolPak docs: timestamp lines and revision history for the 19 tools docs/gaps.md (§13) and docs/target-app-parity.md (what-if and analysis) gain their Last updated line and a revision-history row for the Analysis ToolPak reaching all 19 of Excel's tools. * Data: Analysis ToolPak new tools refuse options that are not numbers Random Number Generation (from, to, mean, standardDeviation, p, lambda, step, and the whole-number options) and z-Test (hypothesizedDifference) read their options with a default for anything that did not parse, so a form value typed as "0,3" or a typo quietly ran with the default. A blank or absent option still takes the default; any other value that is not a finite number is now an error naming the option. * Data: Analysis ToolPak refuses an Alpha that is not a number alpha() took any value that did not parse as the default 0.05, so a typed "0,01" ran z-Test, both two-factor Anovas (and the existing t-tests, F-Test and single-factor Anova, which share it) at the wrong significance level without a word. A blank or absent Alpha still means 0.05; any other value that is not a finite number is now an error. * Data: Analysis ToolPak Random Number Generation form hides the count for a patterned sequence A patterned sequence takes its length from From, To, step and the two repeat counts and ignores Number of Random Numbers, so a count typed there did nothing. The form shows the count only for the random distributions, and the patterned options carry a note that the repeats set how many values are written. * Data: Analysis ToolPak Random Seed caption says a blank seed draws a new sequence Random Number Generation and random Sampling labelled the seed "blank for none", but a blank seed makes the engine choose a new one, so each run draws different numbers. The caption now reads "blank for a new sequence". * Data: Analysis ToolPak form scrolls its options in a short window The Data Analysis window cannot be resized, and the patterned Random Number Generation form (seven distribution choices and five pattern fields, each label above its box) is taller than a 600-point window, so OK ended below the window's edge. The tool's options now sit in a vertical scroll area capped to the window's height less the title, output options and buttons, which always stay in view. * Data: Analysis ToolPak docs: Forecast Sheet is no longer listed as missing docs/target-app-parity.md's what-if and analysis row still listed Forecast Sheet as missing, while data.forecastSheet is in the catalog and docs/gaps.md §13 lists it as present. The row now lists it with the other analysis tools, and today's revision-history row says so. * Data: Analysis ToolPak seed applies only where numbers are drawn A patterned sequence and periodic sampling draw nothing, but the form showed the Random Seed field for both, and Random Number Generation read the seed for every distribution: a seed left in the form that was not a whole number refused a patterned run, and a valid one was reported as the seed used. The seed field now shows only for the random distributions and random sampling, and a patterned run neither reads nor reports a seed. * Data: Analysis ToolPak Fourier Analysis keeps small parts beside large ones The cleanup after the transform zeroed every part at or below 1e-13 of the largest output, so a one-value input such as 1e14 + 1i lost its imaginary part although a transform of one value performs no arithmetic, and a small harmonic beside a large DC term was lost the same way. The cutoff is now the rounding bound of the transform itself, 8 · ε · log2(N) · Σ(|re_n| + |im_n|), divided by N for the inverse (whose outputs are divided by N): it depends on the input and the number of butterfly stages, never on the largest output, and is zero for N = 1. An input sum that overflows disables the cleanup instead of zeroing everything. Two regression tests cover the one-value case and an eight-point round trip of 1e6 + 1e-7 cos(2πn/8). * Data: Analysis ToolPak binomial and Poisson tables grow with the distribution, not the trials Random Number Generation tabulated a binomial or Poisson distribution by evaluating BINOM.DIST or POISSON.DIST through worksheet-function dispatch for every outcome from 0 upward, so a million trials with p = 1 meant 1,000,001 calls and a table of as many entries. The table is now built from one value at the mode and the recurrence pmf(k + 1) = pmf(k) · (n − k)/(k + 1) · p/(1 − p) (λ/(k + 1) for Poisson), outward in both directions: the left tail ends where its terms vanish, the right tail once the cumulative probability reaches 1 within f64 resolution, so the table is as wide as the outcomes that matter (about 23,000 entries for Binomial(1,000,000, 0.5)). p = 0 and p = 1 are exact cases with one outcome. The trials limit and the draws are unchanged. Tests check the recurrence against BINOM.DIST and POISSON.DIST to 1e-12 relative, the table width at a million trials, and that the largest inputs complete in milliseconds with the right means. --------- Co-authored-by: FredApps <FredApps@users.noreply.github.com>
GridCraft
Spreadsheets and data; an open-source, high-performance modern spreadsheet application, built in pure Rust.
A fast, open-source, clean-room take on modern spreadsheet workflows. It runs natively on macOS,
Windows, Linux and BSD, and in the browser via WebAssembly.
By the ArtCraft team.
GridCraft on getartcraft.com · ArtCraft · All Crafting Apps
Quarterly Sales Dashboard: a table with a totals row, conditional formatting, sparklines and two live charts — built entirely from GridCraft commands (File → New → Sample).
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.
A look around · Why GridCraft · Quick start · For agents · Architecture · Roadmap · The Crafting Apps · License and credits
A look around
Why GridCraft
- Familiar. Ribbon, formula bar, Name Box, sheet tabs, keyboard shortcuts, fill handle, point-mode formula entry with coloured references, Format Cells, Paste Special, conditional formatting, tables, charts and more. Everything is right where you expect it.
- Compatible. XLSX is the native format: styles, themes, formulas (including dynamic arrays),
tables, conditional formats, validation, comments, hyperlinks, charts, pictures, sparklines,
pivot tables and print settings round-trip. CSV and TSV too.
Legacy 97-2003
.xlsworkbooks open with their values, formulas and number formats (formatting and objects not yet). XLSB worksheet data can be imported, using saved values instead of formulas. ODS worksheet data can be imported, using saved values instead of formulas. Static pictures can live inside cells, fitting their size and moving with the data. - Capable. A dependency-graph calculation engine with dynamic arrays and spilling, 500+ worksheet functions plus LET, LAMBDA, MAP, REDUCE, SCAN, BYROW, BYCOL and MAKEARRAY, structured table references, a comprehensive number-format language, sort and AutoFilter, Flash Fill, data validation, outlining and subtotals.
- Fast. Copy-on-write workbooks (undo snapshots are nearly free), incremental recalculation, and a virtualised grid that only lays out what's on screen.
- Agent-native. Every ribbon button, menu item, dialog, keystroke and mouse gesture is a command that agents can run over a JSON control channel, an MCP server, or the CLI.
- Everywhere. One Rust codebase for desktop and the web. No subscription, no licence server, no telemetry.
Quick start
cargo run --release -p gridcraft # desktop app
cargo run --release -p gridcraft -- --sample sales # open a sample (sales, budget, grades)
cargo run --release -p gridcraft -- book.xlsx # open a workbook
cargo run --release -p gridcraft -- --sample sales --control 7979 # + JSON control channel
cargo xtask ci # fmt, clippy, tests, assets, layering, wasm
Choose Español under View → Interface language for Spanish formula names, decimal commas, and semicolon arguments. Workbooks, clipboard exchange, and programmatic APIs retain canonical English syntax.
Web
cd apps/gridcraft-web && trunk build --release # → dist/web (serve it with any static server)
cd apps/gridcraft-web && trunk serve --release # http://127.0.0.1:8771 (?sample=sales opens a sample)
You need trunk and the wasm32-unknown-unknown target. Open uses the
browser's file picker (dropping files works too) and Save downloads the workbook.
Ribbon access keys
Press and release left Alt on Windows/Linux/BSD, or press F10 on any platform, then type a sequence below one key at a time. Keytips appear on the supported Home controls and menu items. On macOS, use F10 (Fn+F10 if required by your keyboard); Option remains available for entering accented characters.
| Sequence after Alt/F10 | Action |
|---|---|
H A L / H A C / H A R |
Align left / center / right |
H V S or legacy E S |
Open Paste Special |
H O I or legacy O C A |
AutoFit selected columns |
In Paste Special, T/V/F/C select formats/values/formulas/comments, and E toggles Transpose. Enter applies the selected options; Escape cancels the dialog. These letters also work with Alt held on Windows/Linux/BSD.
Escape backs out one keytip level; Alt/F10 again exits keytips. Clicking, scrolling, or switching windows cancels navigation. Access keys do not start while editing text or using another dialog. This is initial support for these Home and legacy paths; other ribbon commands and full mouse-free navigation remain to be implemented. Browsers or desktop environments may reserve Alt/F10 for their own menus.
Logs
The desktop app writes its log to standard error and to gridcraft.log in the logs folder
next to its settings: ~/.config/gridcraft/logs on Linux and BSD ($XDG_CONFIG_HOME/gridcraft/logs
when set), ~/Library/Application Support/GridCraft/logs on macOS and
%APPDATA%\GridCraft\logs on Windows. Each start moves the previous log to gridcraft.1.log and
that one to gridcraft.2.log, so the log of a run that crashed survives the next start; attach
them to a bug report. A log file stops growing at 16 MiB. By default GridCraft's own crates log
at info and everything else at warn; RUST_LOG replaces that with env_logger-style
directives, e.g. RUST_LOG=debug or RUST_LOG=warn,gridcraft_engine=debug (a trailing *
matches a prefix: gridcraft*=debug). Runs with GRIDCRAFT_NO_PREFS set (no saved settings)
log to standard error only.
For agents: MCP, CLI and the control channel
claude mcp add gridcraft -- gridcraft-cli mcp # headless MCP server
gridcraft-cli mcp --connect 7979 # MCP bridged to a running window
gridcraft-cli eval '=XLOOKUP("b",{"a","b"},{1,2})' # → 2
gridcraft-cli run --sample budget --cmd 'home.bold={"range":"B4:F4"}' --out budget.xlsx
gridcraft-cli cat budget.xlsx --range B4:F15 # aligned text table
gridcraft-cli commands --search chart # every command and its params
The MCP server offers tools such as read_range, write_range, set_cell, evaluate_formula,
format_range, insert_chart, create_table, sort_range, filter and execute_command
(which reaches every one of GridCraft's commands). The desktop app's control channel adds real
pointer and keyboard input, dialogs and screenshots. See docs/mcp.md,
docs/cli.md and docs/control-protocol.md.
Architecture
GridCraft 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 | core (addresses, values, errors, dates, input parsing) · numfmt (number format codes) |
| L1 | formula (lexer, parser, printer, reference adjustment) · functions (worksheet function library) |
| L2 | model (workbook, sheets, copy-on-write cells, styles, tables, charts…) · calc (dependency graph, evaluator, dynamic arrays) · xlsx (XLSX, CSV, plus XLSB and ODS data import) |
| L3 | chart (toolkit-free chart layout and rendering) |
| L5 | engine (session, commands, history, clipboard, fill, sort, filter, file I/O) |
| L6 | ui-egui (spreadsheet UI, control channel) · mcp (MCP server) |
| L7 | apps/gridcraft, apps/gridcraft-cli, apps/gridcraft-web |
- Contributor and agent rules (clean-room, asset policy, never-crash, quality gates):
AGENTS.md - Bundled assets: each one is listed with its licence in
ATTRIBUTION.md - Releases: signed macOS, Windows, Linux, BSD and web builds; see
docs/releasing.md
Roadmap
GridCraft is in alpha: the core workflow works end to end, but depth, fidelity and file
compatibility are still rough. It covers 89% of standard ribbon commands in our catalog
(docs/parity-checklist.md) and 513 standard worksheet functions
(docs/function-parity.md); this is a parity inventory, not a count of working implementations. Weighted by what spreadsheet users rely on, we
estimate it is about 50% ready for real work. Next up: XLSX fidelity on real-world files, very large
workbooks and multi-threaded recalc, chart depth, text in every script, and .xls import. Stage,
numbers and estimates are in ROADMAP.md; the ranked work list is docs/gaps.md.
Downloads
Download GridCraft 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) | gridcraft-<ver>-windows-x64.msi |
gridcraft-<ver>-windows-x64-portable.zip |
| arm64 (Snapdragon and other ARM PCs) | gridcraft-<ver>-windows-arm64.msi |
gridcraft-<ver>-windows-arm64-portable.zip |
| x86 (32-bit) | gridcraft-<ver>-windows-x86.msi |
gridcraft-<ver>-windows-x86-portable.zip |
Installers and executables are code-signed. The MSI installer offers an optional desktop shortcut (unchecked on a new installation).
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"
& .\gridcraft.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, and vulkan can
bring back a crash in some Intel UHD Graphics drivers (igvk64.dll, #120). The macOS, Linux and
web backend defaults are unchanged.
If the app is slow on an older Windows PC, or DirectX 12 can't start: when DirectX 12 finds no
graphics card with a driver for it, it only offers the Windows-provided software renderer, which draws every
frame on the processor. In that case GridCraft uses OpenGL instead, without setting anything; if
the first renderer fails to start, it tries the other one once. The log file records the choice
(lines starting with graphics:). WGPU_BACKEND still overrides it (and then nothing else is
tried), e.g. $env:WGPU_BACKEND = "gl" or "dx12".
DirectX 12 shaders are compiled with FXC, which is part of Windows, so no dxcompiler.dll or
dxil.dll is needed, and a copy another program put on PATH can no longer stop the app at start
("Parent device is lost", #339). $env:WGPU_DX12_COMPILER = "dxc" (or "auto") selects wgpu's DXC
handling again for troubleshooting.
macOS
| Build | File | Notes |
|---|---|---|
| App, universal (Apple silicon + Intel) | gridcraft-<ver>-macos-universal.dmg |
Signed and notarized |
| Command-line tool, universal | gridcraft-cli-<ver>-macos-universal.zip |
Signed and notarized |
Linux
| Format | x86_64 | aarch64 (ARM64) | Notes |
|---|---|---|---|
| AppImage | gridcraft-<ver>-linux-x86_64.AppImage |
gridcraft-<ver>-linux-aarch64.AppImage |
Runs anywhere; updates itself with AppImageUpdate (.zsync files) |
| Flatpak | gridcraft-<ver>-linux-x86_64.flatpak |
gridcraft-<ver>-linux-aarch64.flatpak |
Sandboxed; flatpak install --user <file> |
| Debian/Ubuntu | gridcraft-<ver>-linux-x86_64.deb |
gridcraft-<ver>-linux-aarch64.deb |
|
| Fedora/RHEL/openSUSE | gridcraft-<ver>-linux-x86_64.rpm |
gridcraft-<ver>-linux-aarch64.rpm |
|
| Tarball | gridcraft-<ver>-linux-x86_64.tar.gz |
gridcraft-<ver>-linux-aarch64.tar.gz |
Unpack anywhere |
FreeBSD
| Build | File |
|---|---|
| x86_64 | gridcraft-<ver>-freebsd-x86_64.tar.gz |
Web (WebAssembly)
| Build | File | Notes |
|---|---|---|
| Static site | gridcraft-web-<ver>.zip |
Runs in a modern browser; host it on any static server |
The Crafting Apps
GridCraft 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 | |
| FigCraft | Interface design and prototyping | GitHub | Website | |
| WordCraft | Word processing and documents | GitHub | Website | |
| SoundCraft | Audio recording and editing | GitHub | Website | |
| DeckCraft | Presentations and slide decks | GitHub | Website | |
| CADCraft | Computer-aided design | GitHub | Website | |
| GridCraft | Spreadsheets and data | GitHub | Website | |
| TextureCraft | 3D texture painting | GitHub | Website | |
| Craft Anything | See how any software works, then build your own | GitHub | Website | |
| SolidCraft | Parametric 3D CAD by Tangency Labs (community app) | GitHub |
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 · GridCraft
License and credits
GridCraft is dual-licensed under MIT or Apache-2.0, at your option. Copyright (c) 2026 ArtCraft Team and the GridCraft 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.
All UI icons are drawn in code and are original; the sample workbooks and every screenshot in this README were made with GridCraft itself. GridCraft bundles no fonts: it uses the fonts installed on your system.
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 GridCraft, under docs/brand/LICENSE-brand.txt.
Forks and modified versions must remove them.
Made by the ArtCraft team and community.





