@QingQ77: A terminal installer written in Rust + ratatui with Ukrainian/English bilingual interface, specifically for installing Artix Linux with dinit, and can also enter system recovery mode. https://github.com/YellowHearth1/artix-…
Summary
A terminal installer written in Rust + ratatui with a Ukrainian/English bilingual interface, dedicated to system installation of Artix Linux with dinit. Supports LUKS encryption, Btrfs snapshots, EFISTUB booting, and other features.
View Cached Full Text
Cached at: 07/11/26, 09:29 PM
A terminal installer written in Rust + ratatui, with a Ukrainian/English bilingual interface, specifically for installing Artix Linux with dinit, and also capable of entering system recovery mode. https://github.com/YellowHearth1/artix-tui-installer…
YellowHearth1/artix-tui-installer
Source: https://github.com/YellowHearth1/artix-tui-installer
🐧 Artix TUI Installer
Bilingual (Ukrainian / English) terminal installer for a custom Artix Linux (https://artixlinux.org) build using the dinit init system (https://davmac.org/projects/dinit/).
Written in Rust with ratatui (https://ratatui.rs) and styled like a modern graphical installer: left step panel, rounded panels, Artix-blue accent, segmented switches, and a live scrolling installation log.
Language: Rust (https://www.rust-lang.org/)
TUI: ratatui (https://ratatui.rs)
Init: dinit (https://davmac.org/projects/dinit/)
🇬🇧 English version → README.en.md
🤖 Code Authorship
All code in this project was written by Claude (https://claude.ai) — an AI model from Anthropic (https://www.anthropic.com). Architecture, iterative debugging, and implementation are entirely generated by Claude in dialogue. The design vision, testing on real hardware and virtual machines, and Artix/dinit-specific decisions belong to the project author.
✨ Features
- 🌐 Bilingual interface — Ukrainian and English, selectable on the first screen.
- ⚙️ Native dinit — configures a user instance of dinit specifically for this init system, without any systemd assumptions:
- turnstile for
seatd(custom PAM module, no elogind required); - userspawn for
elogind(standard Artix variant); - session manager
seatd/elogindand user services for PipeWire.
- turnstile for
- 📦 Interactive package installation — packages are installed via
pacmanunder a pseudoterminal, so you choose providers (GPU/Vulkan drivers, multimedia backends, etc.) rather than silently taking the first. Packages with the same name from different repositories are automatically taken from Artix;[Y/n]prompts are confirmed. - 🔒 LUKS disk encryption —
rootonly, full encryption with encrypted/booton UEFI, or USB key (keyfile allows entering the password only once). - 🥾 Bootloader selection — GRUB, rEFInd, Limine, or EFISTUB; for GRUB —
os-proberdetects other OSes. Configured before partitioning additional disks. - 📦 EFISTUB (bootloader-less booting) — UEFI firmware loads the kernel directly, without an intermediate bootloader (Artix kernels are already built as EFI stubs,
CONFIG_EFI_STUB=y). Initramfs and parameters are passed viaefibootmgrentry. Requires no additional packages or systemd — unlike UKI, which needssystemd-stub. UEFI only; incompatible with encrypted/boot. Supports rollback — kernel, initramfs, and parameters remain separate files, so the installer registers additional UEFI entries for rollback and rescue (selectable from firmware boot menu). This is the foundation for future Secure Boot. - 🗄️ Additional disks — mount other disks or partitions (to home,
/mnt, or a custom path), optionally format or encrypt each. Encrypted additional disks are unlocked automatically during boot (key on encrypted root, dinit service), regardless of root unlock method. - 💾 Filesystem choice — ext4, btrfs, xfs, f2fs, jfs, ext3, ext2.
- 🌳 Btrfs with snapshots and rollback — subvolumes @/@home/@snapshots/@log/@cache, auto-snapshots around every pacman action (snapper + snap-pac) and artix-rollback rollback on any bootloader (GRUB/rEFInd/Limine — as a separate graphical menu item, EFISTUB — as a separate entry in the firmware boot menu).
- 🖥️ Desktop environment selection — KDE Plasma, LXQt, Pinnacle (Wayland compositor in AwesomeWM style), XFCE, Cinnamon, MATE, LXDE, or none.
- 🎮 GPU drivers — NVIDIA (open-dkms), NVIDIA 580xx (legacy), nouveau, AMD, Intel; nouveau is automatically blocked when proprietary driver is selected.
- 🛟 System recovery mode — mounts an existing installation (with LUKS decryption if needed), detects the bootloader, and opens a chroot shell for repair.
- 🔁 AUR support —
paruis built from source (to always match the system’slibalpm), then installs selected AUR packages. - 🧩 Automatic dinit service enabling — any installed package
*-dinitgets its service enabled automatically, whether from repositories or AUR. - 📜 System logging out of the box —
syslog-ngcollects all logs in/var/log, andlogrotate(viacronie) keeps them for one week, deletes older ones, and rotates immediately if a file exceeds 5 GB. User services log to a buffer, sodinitctl catlogworks for them right away. - 🔥 Ready firewall — built-in nftables config opens ports for KDE Connect, LocalSend, Sunshine, RustDesk, Steam Remote Play, Syncthing, and SSH.
- 🎨 Built-in configs — kitty (Catppuccin Mocha), starship prompt, fastfetch, and for Pinnacle also waybar and wofi; no external files needed.
- 🕹️ Game-ready — raises open file limit (
nofile) for Wine/Proton fsync, and optionally auto-configuresauto-cpufreq. - 🧳 Self-contained — required host tools (artools, gptfdisk, cryptsetup, etc.) are installed automatically, so the installer works even from the official Artix ISO, not just a custom image.
- 🏷️ Customizable hostname and UEFI boot entry name.
- 🚦 Cautious start — disk partitioning begins only after explicit confirmation on the “Review & Install” screen, and required host tools (git, gptfdisk, dosfstools, parted, etc.) are downloaded in the background immediately after network connection.
- ⚠️ Warnings before partitioning — on the disk selection screen, the installer unobtrusively warns (without blocking selection) if: the selected disk is the boot media from which the installer itself is running (detected by the live image’s iso9660 filesystem); the disk is smaller than 20 GiB (base system fits, but may be tight for a full environment); or the selected UEFI/BIOS mode does not match the actual boot mode of the computer (which would produce an unbootable system). Each warning is a full, clear sentence in a separate scrollable window (
wkey on the disk list); you can always proceed if you are aware. - 🧨 Disk erase confirmation — the final step before formatting: a separate window directly shows which disk (path, model, size) and which existing partitions will be irreversibly destroyed, and requires explicit Enter. Formatting never starts without this second confirmation — accidentally wiping the wrong disk is much harder.
- 🪞 Fast and resilient mirrors — the 5 closest countries (based on your timezone) are ranked by actual speed and placed at the top; all other world mirrors remain active below, from closest to farthest — none are commented out or discarded. So if a fast mirror goes down during download, pacman simply falls back to the next (up to Artix’s main server) without interrupting installation. Russian mirrors are completely excluded. Plus optional Chaotic-AUR with prebuilt AUR binaries.
- 📊 Live progress — live installation log with scrolling (PgUp/PgDn, Home/End); after an error, you can rerun without losing your selections.
- 🏁 Three final options — reboot, shutdown, or immediately chroot into the new system; partitions are safely unmounted in all cases.
- 📀 Builds as a live ISO image via artools (
buildiso).
👁️ Appearance
Live “Disk & Partitions” screen
Screenshot from a graphical terminal; in plain TTY colors are simpler (see note in “Screenshots” section).
Schematically, each screen is arranged like this:
┌───────────┬──────────────────────────────────────────────┐
│ ◆ 01 │ 09 · Disk & Partitions │
│ ● 02 │ ┌────────────────────────────────────────┐ │
│ ● ... │ │ Mode ● UEFI ○ BIOS │ │
│ ◆ 09 │ │ Disk: /dev/sda 256G │ │
│ ○ 10 │ │ Add SWAP? [yes] [ 4 GiB ] │ │
│ ○ ... │ │ Filesystem ‹ ext4 › btrfs xfs │ │
│ │ │ ◂ Back Next ▸ │ │
│ │ └────────────────────────────────────────┘ │
│ ├──────────────────────────────────────────────┤
│ │ ↑/↓ move · ←/→ change · Enter next │
└───────────┴──────────────────────────────────────────────┘
The left panel shows only step numbers (the active one has a spinning diamond); the full step name is in the panel header.
⌨️ Controls
| Keys | Action |
|---|---|
| ↑ / ↓ | navigate lists and fields |
| Enter | select / next |
| Esc or Shift+Tab | back; Esc also closes modal windows |
| ↑ on top item | exit to previous screen |
| Space | toggle item / switch |
| ← / → | change value: filesystem, SWAP size, account mode, session |
| Text input | filter lists, search packages, edit fields |
| Tab | next field on “Accounts” screen |
| o | filesystem options (Disk & Partitions screen) |
| w / s | scroll description in FS options modal |
| PgUp / PgDn · Home / End | quick scroll long lists and install log |
| q | exit installer (blocked during installation) |
| Ctrl+C | emergency exit |
Contextual hints for the active screen are always shown in the bottom bar.
🔨 Building
cd installer
cargo build --release
# → target/release/artix-installer
Read-only steps (timezone, keyboard, Wi-Fi, package search, disk list) degrade gracefully when their tools are unavailable outside the target system. Actual installation (partitioning, basestrap, chroot) requires root and a real target, so test in a virtual machine.
🚀 Running on Official Artix
The installer doesn’t have to run from a custom image — it can be launched simply from any official Artix ISO: whether from the console “base” image or from a community image with a desktop and graphical installer (Calamares) — just open a terminal and run this TUI instead of Calamares. Any host tools it needs (artools, gptfdisk, cryptsetup, etc.) are self-provisioned during runtime.
Prebuilt Binary (easiest)
Download the compiled installer from the releases page (https://github.com/YellowHearth1/artix-tui-installer) and run as root:
curl -LO https://github.com/YellowHearth1/artix-tui-installer/releases/download/artix-tui-installer/artix-installer
chmod +x artix-installer
sudo ./artix-installer
Building from Source
base-devel provides the compiler and linker needed by cargo:
sudo pacman -S --needed git rust base-devel
git clone https://github.com/YellowHearth1/artix-tui-installer
cd artix-tui-installer/installer
cargo build --release
sudo ./target/release/artix-installer
A few notes:
- The installer must run as root — it partitions disks, runs
basestrapandchroot. - This is a full-screen TUI: run in a real console (
Ctrl+Alt+F2) or in a terminal on a live desktop, with a size of at least 80×24. - On the live image, building from source runs in RAM; if RAM is tight, grab the prebuilt binary above or build on another Artix machine and copy the single file to the target.
- ⚠️ The installer formats disks — test in a virtual machine first.
🧭 Wizard Steps
The installer starts with a mode selection: Installation or System Recovery.
Installation goes through 15 steps:
- Language — Ukrainian / English; sets interface language and system locale.
- Timezone — full IANA list with search filter.
- Wi-Fi — skip (wired), scan, or connect via
nmcli. - Keyboard — console layouts via
localectl; first selected is primary. - Kernel — linux / lts / zen / hardened.
- Desktop Environment — choose a graphical environment (or none) and session manager.
- Packages — GPU driver + search and multi-select from repositories.
- AUR — curated recommended list and live AUR search.
- Disk — boot mode, target disk, SWAP, and root filesystem.
- Bootloader & Encryption — bootloader selection (GRUB / rEFInd / Limine), other OS detection (
os-prober, for GRUB), UEFI entry name, and disk encryption:rootonly, full (with encrypted/boot), or USB key, swap size and passphrase. Done before additional disks so that a key on an additional disk makes sense. - Additional Disks — for each found disk/partition: format (or “keep data”), mount point (home /
/mnt/ custom path with folder name), and separate encryption checkbox. Nothing is changed until you choose. - User — hostname, input mode, username, and passwords (only kept in memory, never written to disk by the installer).
- Settings — passwordless sudo, Chaotic-AUR repository, and mirror optimization.
- Installation — review, then live log executes the plan step by step; stops on error and allows going Back.
- Finish — summary and reboot.
Navigation is consistent everywhere: ↑/↓ moves focus (and up arrow on the topmost item returns to the previous step), ←/→ changes values, Enter next, Esc closes window or goes back.
🧱 How Installation is Organized
src/system/install.rs builds a single ordered list of actions; the installation screen executes each one, streaming output in real time. Roughly: install host tools → partition → format (with LUKS if needed) → mount → phase 1 basestrap of minimal bootable base (kernel, firmware, dinit + services, audio, logging) → configure repositories + keys → phase 2 interactive pacman for environment, drivers, and your packages → user accounts → locale / timezone / layout / hostname + hosts → configure user-dinit (turnstile or userspawn) → initramfs (with encrypt hook when encryption is used) → bootloader → built-in nftables → logrotation → enable all dinit services → phase 3 AUR via paru.
🌳 Btrfs: Subvolumes, Auto-Snapshots, and System Rollback
If you select btrfs on the “Disk & Partitions” step, additional options appear below the filesystem selection (each with a “pro/con” explanation shown in the UI):
- Subvolumes — scheme
@(root),@home,@snapshots→/.snapshots,@log→/var/log,@cache→/var/cache. System snapshots don’t touch/homeand aren’t bloated by logs and cache. - Auto-snapshots (snapper + snap-pac) — snapshot before and after every pacman/paru transaction; enables subvolumes automatically (requires
@snapshots). - Compression (zstd) — transparent
compress=zstdon write. - TRIM for SSD —
discard=asyncin background. - For any filesystem there is separate noatime. Root is always mounted with
rootflags=subvol=@— by name, not via default subvolume.
What the installer configures for snapshots:
- snapper is configured by directly writing to
/etc/snapper/configs/root(becausecreate-configdoesn’t work in chroot):TIMELINE_CREATE=no— snapshots are tied to pacman events, not a timer;NUMBER_LIMIT=10— keeps the last ~10. - Cleanup on schedule —
/etc/cron.d/snapper(daily at 5:30) via cronie, since dinit has no systemd timers. - Base snapshot on first boot — a one-shot background service waits for D-Bus and snapper to start, creates a snapshot “clean system (post-install baseline)”, then removes itself.
Rollback works on any bootloader (GRUB, rEFInd, Limine):
sudo artix-rollback [N]— shows snapshot list; selected one becomes the new@, old root is saved as@.rollback-<time>, default subvolume is redirected, and stale pacman lock from the snapshot is removed (snap-pac creates PRE-snapshot whiledb.lckexists). There’s also a shortcut in the application menu.- Rollback at system start — kernel parameter
artix.rollbackopens snapshot selection directly from initramfs; the mkinitcpio hook runs afterencrypt, so it works with LUKS. On GRUB there is a separate menu item System Rollback. - Classic
snapper rollbackalso works. Rollback does not depend
Similar Articles
@vintcessun: At noon I saw a tool that solves the chaos in download directories, a bit unbelievable—a system tray file organizer written in Rust+Tauri, memory usage only 5MB, and just added Linux support. The core is file monitoring plus a rule engine, automatically classifying by extension or regex, SQLite records operation history for one-click undo. Privacy-wise zero reporting, …
Introduces an open-source desktop file organizing tool Mouzi, built with Rust and Tauri, memory usage only 5MB, supports file monitoring and rule engine for automatic classification, emphasizes zero reporting for privacy.
zinnia: a modular 64-bit Unix-like kernel written in Rust
Zinnia is a modular 64-bit Unix-like kernel written in Rust, designed to boot on UEFI systems and run a modern desktop with Wayland or X11. It implements POSIX APIs and common Linux/BSD extensions.
@QingQ77: A high-performance IM backend written in Rust, using QUIC protocol for real-time messaging, supporting P2P hole punching and group chat broadcasting. https://github.com/nicolastinger/only-talk-rs… Built with Actix-web for RESTful …
A high-performance instant messaging backend based on Rust + Actix-web + QUIC, supporting P2P hole punching, group chat broadcasting, multiple storage backends, can be deployed as a single process or separately.
@geekbb: A Tauri (Rust + Svelte) desktop app that integrates a programming AI agent, API client, SQL/NoSQL editor, SSH terminal, remote file browser, and project management kanban board into a single interface — developers don't need to switch between multiple apps. https://gith…
Clauge is a Tauri (Rust + Svelte) desktop app that combines a programming AI agent, API client, SQL/NoSQL editor, SSH terminal, remote file browser, and project management kanban board into one interface, so developers don't have to switch between multiple applications.
@QingQ77: An open-source project written in Rust and C that uses JIT compilation to run Linux containers directly on macOS. https://github.com/ricccrd/dd It does not require a VM, hypervisor, or Linux kernel, but instead…
dd is an open-source tool written in Rust and C that runs Linux containers on macOS without a VM by using JIT compilation to translate container instructions and handle syscalls in userspace. It implements the Docker Engine API, supports arm64 and x86-64 Linux images, and offers performance comparable to or better than VM-based solutions.