- packages.x86_64.desktop: 30+ packages for desktop variant (Plasma, Firefox, VLC, LibreOffice, PipeWire). No duplicates with base list. - build-desktop.sh: creates temp profile, merges package lists, enables SDDM via preset + display-manager.service symlink. WORK_DIR is mktemp-created (not caller-selected) to prevent symlink races. VERSION copied into temp profile so profiledef.sh resolves correctly. Cleans up both temp dirs via trap. - CI workflow: Python AST validation (sys.argv), VERSION SSOT gate, single make check (no double-lint). - test_packages.sh: 15 assertions for desktop overlay (existence, package count, no dups, Plasma/Firefox exact match, build script structure: mktemp WORK_DIR, VERSION copy, SDDM, cleanup trap). Codex D-grade findings fixed: symlink race (use mktemp), VERSION path (../../VERSION not ../VERSION).
SamiOS — A Custom Arch Linux Distribution
Overview
SamiOS is a custom Linux distribution based on Arch Linux, designed as a
personal daily-driver desktop OS. It ships a custom CLI (samios), an
automated disk installer, a single-source-of-truth version system, and
a voice-bridge prototype for hands-free OS control via Hermes.
Features
- Rolling release Arch-based
- Custom CLI (
samios) for system management — version, status, update, install, remove, services, fonts - Automated installer (
samios-installer.sh) — UEFI/BIOS, partitioning, pacstrap, GRUB, user creation - VERSION single-source-of-truth — one file drives every component
- Custom branding — GRUB theme, MOTD, bashrc, zshrc, pacman welcome message
- Font policy — excludes fonts with "7777" in the filename (personal branding)
- Voice bridge prototype —
voice-bridge.pylistens to SamiType transcripts and routes to Hermes (command mode) orxdotool(dictation mode) - CI — Gitea Actions runs
make checkon pushes tomaster/mainand on pull requests targeting those branches
Building from Source
Prerequisites
# On Arch Linux
sudo pacman -S archiso git shellcheck
Clone and Build
git clone https://git.sami/sami7777/samios.git
cd samios/packaging/archiso
sudo ./build.sh
Installation
From ISO
- Boot the generated ISO. The ISO ships the live environment, the
samiospackage-management CLI, and/etc/samios-version(the mirrored VERSION file). It does not shipsamios-installer.shautomatically — that script lives inpackaging/scripts/in the source repo and is invoked manually after boot (or copied into the live environment first). - To install SamiOS to disk from the live ISO, run the installer:
The installer is interactive by default; pass
sudo /root/samios-installer.sh # if you copied it into the live env # — or — sudo bash /path/to/samios-installer.sh--disk,--user, and--passwordto drive it non-interactively from automation:sudo /path/to/samios-installer.sh --disk /dev/sda --user sami --password ...
Note:
samios install(the CLI subcommand on the live system and on the installed OS) is the package installer — e.g.samios install firefox. It does not invoke the OS installer. The OS installer is thesamios-installer.shscript.
Manual Installation
See docs/installation.md for detailed
instructions.
Repository Layout
samios/
├── VERSION # Single source of truth for the release version
├── Makefile # Targets: test, lint, check, version, version-set, version-sync, build, clean, help (see "Makefile Targets" below)
├── README.md # This file
├── branding/ # GRUB theme, pacman welcome, fonts
├── docs/ # roadmap, installation, voice-to-Hermes design
├── packaging/
│ ├── archiso/ # The archiso profile (profiledef.sh, packages, airootfs overlay)
│ │ └── airootfs/
│ │ ├── etc/samios-version # Mirrored from /VERSION by `make version-sync`
│ │ └── usr/local/bin/samios # The CLI tool (installed)
│ ├── packages/
│ │ └── samios-branding/ # PKGBUILD (also reads ../../../VERSION)
│ └── scripts/
│ ├── samios-installer.sh # The disk installer
│ ├── samios-desktop-setup.sh # Post-install KDE/desktop setup
│ └── voice-bridge.py # Voice command/dictation bridge prototype
└── tests/ # Test suite (see "Test Suite" below)
VERSION Single Source of Truth
There is exactly one authoritative source for the release version:
the VERSION file at the repo root. Each consumer resolves it via
its own mechanism:
samiosCLI (packaging/archiso/airootfs/usr/local/bin/samios) — walks up from$0to find./VERSION, falls back to/etc/samios-version, then to a documented placeholder.samios-installer.sh(packaging/scripts/samios-installer.sh) — walks up from$0to find./VERSION, falls back to/etc/samios-version, then to a documented placeholder. Same algorithm as the CLI it emits.voice-bridge.py(packaging/scripts/voice-bridge.py) — walks up from its own location to find./VERSION, falls back to/etc/samios-version, then to a documented placeholder.profiledef.sh(packaging/archiso/profiledef.sh) — walks up from$0to find./VERSION, then to the documented placeholder. (No/etc/samios-versionfallback — this runs at ISO build time, not at runtime.)PKGBUILD(packaging/packages/samios-branding/PKGBUILD) — reads$startdir/../../../VERSIONfirst, falls back to../../../VERSION, then fails loudly withexit 1. There is no walk-up and no placeholder — the SSOT invariant is absolute: a release build without VERSION is a build error..bashrc/.zshrc(in the airootfs overlay — run in the live ISO when root opens a shell) — read/etc/samios-versiondirectly; fall back to the documented placeholder. (No walk-up: the live ISO ships/etc/samios-versionviamake version-sync. Note: the installer does not copy these root dotfiles to installed systems — it writes its own/etc/bash.bashrcinstead.)
The test_version.sh suite enforces this invariant: any X.Y.Z literal
introduced into a production file fails CI. To bump the version:
make version-set NEW=<your-version>
That edits ./VERSION and mirrors it into
packaging/archiso/airootfs/etc/samios-version (the on-system anchor
that installed systems read at runtime). Then commit and push.
If you prefer editing manually:
# Write your target version to the SSOT file:
echo "<NEW>" > VERSION
# Mirror into the airootfs overlay:
make version-sync
# Verify the SSOT invariant still holds:
make check
(The exact X.Y.Z string is intentionally omitted from this README —
the version lives in the VERSION file, not in documentation.)
Makefile Targets
make help # Show all targets
make version # Print current SamiOS VERSION
make version-set NEW=<NEW> # Bump VERSION (semver-ish, X.Y.Z[-suffix])
make version-sync # Mirror VERSION into the airootfs overlay
make test # Run the test suite
make lint # Run shellcheck on all shell scripts
make check # Run lint + test (CI entry point)
make build # Build the SamiOS ISO (requires archiso + root)
make clean # Remove build artifacts
Test Suite
The test suite lives under tests/ and is wired into
tests/run_tests.sh. It contains 142+ assertions across 8 test files:
| Test file | What it covers |
|---|---|
test_profiledef.sh |
archiso profiledef.sh — script presence, package lists, hooks |
test_packages.sh |
package list shape and required packages |
test_pacman_conf.sh |
pacman.conf configuration |
test_samios_cli.sh |
the installed samios CLI — syntax, --help, version, status, fonts |
test_font_policy.sh |
7777-exclusion font policy |
test_version.sh |
VERSION single-source-of-truth — 55+ assertions across all 7 components |
test_installer.sh |
samios-installer.sh — syntax, SSOT, heredoc-emitted CLI |
test_voice_bridge.sh |
voice-bridge.py — 20 hermetic behavioral assertions |
Run them with:
make test # just the tests
make lint # just shellcheck
make check # both (the CI entry point)
Individual tests can be run directly:
bash tests/test_voice_bridge.sh --verbose
CLI Tool
The samios command provides system management:
samios version # Show SamiOS version
samios status # Show system status (disk, memory, network)
samios update # Update system packages
samios install # Install a package
samios remove # Remove a package
samios services # List running services
samios fonts # Check installed fonts and the 7777-exclusion policy
samios help # Show all commands
The CLI walks up at runtime to find ./VERSION (or /etc/samios-version
on a freshly installed system) so the version is never duplicated.
Voice Bridge (Prototype)
packaging/scripts/voice-bridge.py is an early prototype of the
voice-to-Hermes pipeline. It listens for transcripts on stdin
(eventually from SamiType's STT socket), parses them, and:
- If the transcript starts with the wake word "computer", strips the
wake word and POSTs the remainder to the Hermes API at
http://localhost:8765/command. - If the transcript is "start dictation", enters dictation mode and
routes subsequent phrases to
xdotool type(withxdotool keyfor dictation commands like "new paragraph", "tab", "scratch that"). - If the transcript is "stop dictation", exits dictation mode.
The script also exposes --version / -V which prints
SamiOS voice-bridge v<VERSION> — the version comes from the same
./VERSION walk-up resolver used by every other component.
The bridge is a prototype: it does not yet connect to a real
SamiType socket, does not implement TTS feedback, and uses
localhost:8765 as a placeholder Hermes endpoint. See
docs/voice-hermes-pipeline.md and
docs/voice-integration-architecture.md
for the design direction. The 20 behavioral assertions in
tests/test_voice_bridge.sh guard the version SSOT, the wake-word
routing, the dictation mode state machine, and the documented fallbacks.
Font Policy
SamiOS excludes any fonts with "7777" in the filename as these are
personal branding fonts. samios fonts enforces this at runtime; the
CI test test_font_policy.sh enforces it at build time.
Development
This project is under active development. See
docs/roadmap.md for planned features and the
current phase, and docs/developer-guide.md
for build/test/release workflows.
License
TBD