Kipferl 0.6: Rust-powered Python CLIs, baked smaller
Our first stable release as Kipferl keeps the pleasant Python-style workflow, moves the foundation to Rust, and ships tree-shaken standalone applications from 1.4 MB—with no Python, Rust, libc, or musl installation on the target machine.
A new name and a steadier foundation
Kipferl is the new name for μcharm/ucharm. The pastry name gives a small nod to Bun and fits the product: Kipferl bakes a focused Python-style CLI into one portable executable. The repository, command, packages, documentation, and public home now share the same spelling.
Version 0.6 also replaces the project's Zig implementation with stable Rust around the same embedded PocketPy runtime. This was a maintenance decision, not a rejection of Zig's ability to make fast software. Cargo, Rust's stable language contract, explicit VM ownership, and a larger maintained library ecosystem let us spend more time on the developer experience and less on infrastructure.
The migration was incremental and compatibility-gated. The application format remains MCHARM01, existing binaries keep running, and the temporary ucharm command, imports, environment variables, and download aliases make the transition deliberate rather than abrupt. Read the full migration retrospective for the why, how, outcome, and tradeoffs.
A tighter development loop
kipferl dev runs immediately, watches source, config, and template files through native filesystem events, debounces editor bursts, and restores the terminal between restarts. Ratatui and Crossterm now power interactive select and multiselect prompts in a scrollback-preserving inline viewport.
$ kipferl dev app.py
$ kipferl build app.py -o app
$ ./app
Useful batteries, with honest boundaries
Common configuration workflows cover JSON, YAML 1.2, TOML, KDL 2.0, XML, CSV, and INI/CFG. The CLI-focused runtime also includes SQLite, HTTPS, filesystem and process APIs, regex, archives, crypto, dates, logging, and more than 50 targeted modules. Maintained Rust crates back the parts where they improve correctness and ownership: Ratatui/Crossterm, Ureq/Rustls, Rusqlite with bundled SQLite, and focused parsers and archive libraries.
Kipferl is intentionally not CPython with pip in a smaller box. It supports familiar Python syntax and a curated library surface for command-line applications; C extensions and arbitrary pip packages are outside that contract. The published compatibility report makes those boundaries inspectable rather than implied.
Tree shaking without a user toolchain
A normal build conservatively analyzes imports and selects one of two prebuilt Rust runtime profiles. Common scripts use core; SQLite, HTTPS, interactive input, YAML/TOML/KDL, regex, crypto, archives, dynamic imports, and other optional capabilities select full.--full-runtime is an explicit escape hatch, and neither path needs a local compiler or linker.
| Apple Silicon app | Bytes | Median startup |
|---|---|---|
| Core, selected by default | 1,450,837 | 7.679 ms |
| Full compatibility | 4,817,925 | 8.480 ms |
Measured with the checked-in 2,000-run benchmark on an Apple M4 Max running macOS 15.6. The source, commands, distributions, and raw outputs are in the reproducible benchmark report.
The 69.9% reduction comes from Cargo features removing complete optional dependency trees—not from dropping error handling or making users install Rust. The tree-shaking deep dive explains the design and conservative fallbacks.
Published CLI artifacts
These are the exact GitHub release assets verified after publication. Every binary has an adjacent SHA-256 file; both Linux CLIs are statically linked and require no system libc or musl runtime.
Install or upgrade
brew install niklas-heer/tap/kipferl
kipferl --versionAlready using Kipferl from this tap? Run brew upgrade kipferl. If the old μcharm 0.5 formula is installed, replace it once:
brew uninstall --force ucharm
brew install niklas-heer/tap/kipferlKipferl 0.6 still installs ucharm as a deprecated alias for this transition release. Direct downloads and checksum commands are in the installation guide.
What the release gate proved
The final tag passed 1,669/1,669 available compatibility checks and all 19 Vision checks. CI rebuilt the declared PocketPy patch series from pristine upstream, built and ran a standalone app on four native targets, checked every checksum, and proved that the Linux CLI, runtime, and loader have no dynamic interpreter. We repeated checksum, core/full build, execution, and Homebrew tests against the public release—not just the pre-tag workspace.
Rust made the complete runtime larger than the old minimal Zig foundation, particularly after adding maintained HTTPS, SQLite, Ratatui, archives, and configuration parsers. Profile-based tree shaking lets ordinary apps stop paying that cost while preserving the higher-quality libraries when their capabilities are used. That is the 0.6 tradeoff: optimize developer experience and maintenance first, then make the resulting cost selective and measurable.