Initial commit — TANINUX (camel): management app + distro packaging

- app: GTK System Settings (tsettings) + Software Hub (thub) + TUI
- distro/: camel.toml manifest + MANIFEST.md (Arch + [tanin] repo model)
- packaging/: taninux, tanin-desktop (niri metapackage), tanin-greet,
  tanin-libadwaita, tanin-setup
- docs/, data/, LICENSE (GPL-3.0-or-later)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-18 20:18:30 +02:00
commit 10b88a67bc
167 changed files with 19624 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
# camel — Distribution Manifest
> Codename **camel**. The project/OS name is still provisional (**taninux** ·
> **tanin** · or a later marketing name). Everything stable keys off the
> codename, not the name. Machine-readable source of truth: [`camel.toml`](camel.toml).
> Last reconciled 2026-06-17.
camel is **not a fork**. It's stock Arch Linux plus one extra binary repo
(`[tanin]`) holding our own packages — the EndeavourOS/CachyOS model. A
Calamares installer lays down a ready-to-use **niri + eww** desktop managed by
the **TANINUX** apps.
## Identity (Fuji palette)
Dark, monochrome, libadwaita, rounded, soft short shadows.
| Token | Value | Used by |
|------------|----------------------|--------------------------------|
| accent | `#a39ec4` (violet) | greeter, eww (`accent.sh`), GTK |
| bg / fg | `#0f0f0f` / `#f0f0f0`| theme |
| UI font | Inter (Medium) | apps, bar |
| icon font | Iosevka Nerd Font | `nf-md-*` glyphs |
| icon theme | Papirus | dock app icons |
## The stack (what it boots into)
| Layer | Choice | Package(s) |
|------------------|-------------------------------------|----------------------------------|
| Display manager | **greetd** + custom GTK4 greeter (via `cage`) | `greetd`, `cage`, `tanin-greet` |
| Compositor | **niri** (Wayland, niri-only) | `niri` |
| Bar/dock/panels | **eww** + Spotlight | `eww`, `tanin-eww` |
| Notifications | **tiramisu** (headless) + eww UI | `tiramisu` |
| Terminal | foot | `foot` |
| Wallpaper | waypaper | `waypaper` |
| Apps | tsettings · thub · taninux (TUI) | `taninux` |
| GTK4 theme | **Fuji** recolour, light + dark | `tanin-libadwaita` |
| Portals | gtk (dark mode) + gnome (screencast)| `xdg-desktop-portal-{gtk,gnome}` |
> **Compositor note:** earlier docs (`docs/distribution.md`, the `tanin-desktop`
> PKGBUILD) still say *Hyprland*. That is stale — the desktop is **niri-only**.
> Reconcile both against this manifest.
## Package model
```
official Arch repos (core/extra/multilib) → everything standard
[tanin] (own binary repo) → our packages + rebuilt AUR deps
AUR → OPT-IN only (paru = optdepend)
```
**Our packages** (`[tanin]`):
| Package | Role | Status |
|-----------------|---------------------------------------------------|-------------------|
| `taninux` | tsettings + thub + TUI, helper, polkit, .desktop | ready |
| `tanin-greet` | custom GTK4 greeter for greetd → `/etc/greetd/` | ready (preview) |
| `tanin-libadwaita` | Fuji libadwaita recolour, light + dark (pills) | ready (preview) |
| `tanin-eww` | eww config + scripts → `/usr/share/tanin/skel` | **todo** |
| `tanin-setup` | seed `~/.config` + enable session target | ready |
| `tanin-desktop` | metapackage pulling the whole environment (niri) | ready (needs tanin-eww) |
**Rebuilt AUR deps** — the desktop's hard requirements that aren't in the
official repos. We rebuild them into `[tanin]` so `tanin-desktop` can hard-depend
on them **without the AUR** (binary repos must never need it): `eww`, `tiramisu`,
`waypaper`, `regreet`, `cliphist`. ⚠️ Verify each before publishing — any that
turn out to live in `extra` should be dropped from this list.
The full Arch package set (compositor, portals, audio, connectivity, fonts, …)
is enumerated under `[packages.arch]` in `camel.toml` and is the seed for the
archiso `packages.x86_64`.
## Why these are first-class (not "just config")
Discovered from the live stack ([eww `launch.sh`](../../eww/launch.sh) + scripts):
the bar genuinely shells out to `eww · niri · jq · wpctl · cliphist · playerctl ·
bluetoothctl · nmcli · wl-clipboard · checkupdates · qalc · grim · flatpak ·
tiramisu`. These map to the package set above; the AUR ones (eww/tiramisu/
waypaper/cliphist) are exactly why `[tanin]` must carry rebuilt AUR packages.
## Delivery
1. **Foundation**`taninux` builds (`makepkg -si`). ✅
2. **Meta + config** — finish `tanin-eww`; update `tanin-desktop` to niri; keep
`tanin-setup`. Dotfiles ship to `/usr/share/tanin/skel`, never to `/home` at
package time; `tanin-setup` seeds them on first run.
3. **`[tanin]` repo** — `repo-add -s` to build+sign the DB. Host as a
Gitea/Forgejo Arch registry **or** a static dir behind `taninux.kgva.ch`.
4. **ISO** — archiso profile with `[tanin]` pre-configured; Calamares `packages`
module installs `tanin-desktop`; greetd+regreet enabled; session target wired.
### Session / dark-mode fix
libadwaita apps read light/dark via `org.freedesktop.portal.Settings`, which
needs `graphical-session.target` active. `tanin-setup` installs
`tanin-session.target`; the shipped niri autostart must run:
```
dbus-update-activation-environment --systemd --all
systemctl --user start tanin-session.target
```
## Open questions (decide before a release tag)
- **Name:** keep TANINUX, or split `app = tanin` / `OS = <marketing name>`?
- **Repo hosting:** Gitea Arch registry vs static dir behind `taninux.kgva.ch`.
- **Signing:** move `[tanin]` to `SigLevel = Required` + distribute the key.
- **regreet theme:** author its GTK CSS to the Fuji accent.
- **AUR check:** confirm which rebuilt-AUR entries are already in `extra`.
- **Blur/shadow:** niri `layer-rule` blur+shadow for eww layers (template is
commented in the niri config).
## Related
- App repo & packaging: `~/projects/taninux` (this repo)
- Desktop shell: `~/projects/eww` — read its `HANDOVER.md` first
- Older prose draft (Hyprland-era): [`../docs/distribution.md`](../docs/distribution.md)
+203
View File
@@ -0,0 +1,203 @@
# camel.toml — distribution manifest (single source of truth)
# =============================================================================
# Codename "camel" is the STABLE internal handle. The project/OS name is still
# provisional — it may stay "taninux", shrink to "tanin", or the shipped OS may
# get a different marketing name later. Everything that must not break when the
# name changes keys off `codename`, not `name`.
#
# This file is the canonical spec. The PKGBUILDs under ../packaging, the archiso
# profile, and docs/distribution.md should be derived from / reconciled against
# it. Last reconciled: 2026-06-17 (compositor switched Hyprland -> niri).
# =============================================================================
[distribution]
codename = "camel"
name = "taninux" # PROVISIONAL (taninux | tanin | TBD)
display_name = "TANINUX" # PROVISIONAL
tagline = "A curated Arch desktop — niri + eww, managed by TANINUX."
base = "arch" # not a fork; Arch + own [tanin] repo
arch = ["x86_64"]
channel = "rolling"
license = "GPL-3.0-or-later"
homepage = "https://taninux.kgva.ch"
maintainer = "Karim <karim@gabrielevarano.ch>"
# Visual identity — the "Fuji" palette. Mirrored into eww (accent.sh) and the
# greeter/GTK theme. Single source for accent so DM, bar and apps agree.
[identity]
theme = "dark, monochrome, libadwaita, soft short shadows, rounded"
accent = "#a39ec4" # Fuji violet
bg = "#0f0f0f"
fg = "#f0f0f0"
ui_font = "Inter" # Medium
icon_font = "Iosevka Nerd Font" # Material Design Icons (nf-md-*)
icon_theme = "Papirus" # dock app icons
# -----------------------------------------------------------------------------
# Package sources. Standard software comes from the official Arch repos; only
# our own packages (and AUR deps we are forced to rebuild) live in [tanin].
# -----------------------------------------------------------------------------
[sources.arch]
repos = ["core", "extra", "multilib"]
[sources.tanin]
repo_name = "tanin"
server = "https://taninux.kgva.ch/$arch"
code_host = "https://git.openbureau.ch/karim/taninux" # PKGBUILD source clones
siglevel = "Optional TrustAll" # TODO: tighten to "Required" + ship the key
db_build = "repo-add -s tanin.db.tar.zst *.pkg.tar.zst"
[sources.aur]
# Policy: AUR is OPT-IN. Nothing in the desktop may HARD-depend on the AUR
# (binary repos must not need it). paru is an optdepend only. Any AUR package
# the desktop genuinely needs is rebuilt into [tanin] (see packages.rebuilt_aur).
policy = "opt-in"
helper = "paru" # optdepend, never a hard depend
# -----------------------------------------------------------------------------
# The desktop stack — what the OS actually boots into.
# -----------------------------------------------------------------------------
[stack]
display_manager = "greetd" # greeter = tanin-greet (own GTK4 greeter)
greeter = "tanin-greet" # custom; mirrors the eww topbar
compositor = "niri" # Wayland, niri-only (Hyprland/Sway removed)
shell_bar = "tanin-eww" # eww bar + dock + panels + spotlight
launcher = "Spotlight (eww)"
notifications = "tiramisu (headless) + eww UI" # replaces mako
terminal = "foot"
wallpaper = "waypaper"
session_target = "tanin-session.target" # pulls graphical-session.target for portals
apps = ["tsettings", "thub", "taninux (TUI)"]
gtk_theme = "tanin-libadwaita" # Fuji recolour, light + dark
portals = ["xdg-desktop-portal-gtk", "xdg-desktop-portal-gnome"]
# gtk portal -> org.freedesktop.portal.Settings (dark mode for libadwaita apps);
# gnome portal -> screencast (niri's recommended screencast backend).
# =============================================================================
# OWN PACKAGES — built from our repo, served from [tanin].
# =============================================================================
[[packages.own]]
name = "taninux"
desc = "GTK System Settings (tsettings) + Software Hub (thub) + TUI"
provides = ["tsettings", "thub", "taninux"]
pkgbuild = "packaging/taninux/PKGBUILD" # exists
status = "ready"
[[packages.own]]
name = "tanin-eww"
desc = "eww bar/dock/panels/spotlight config + scripts -> /usr/share/tanin/skel"
upstream = "~/projects/eww"
pkgbuild = "packaging/tanin-eww/PKGBUILD" # TODO: create
status = "todo"
[[packages.own]]
name = "tanin-greet"
desc = "custom GTK4 greeter for greetd — topbar + wallpaper + corner session"
pkgbuild = "packaging/tanin-greet/PKGBUILD" # exists
status = "ready (previewed)"
note = "replaces ReGreet — its fixed layout couldn't do topbar/corner-session"
[[packages.own]]
name = "tanin-libadwaita"
desc = "Fuji recolour for GTK4/libadwaita + GTK3 — light + dark, pill controls"
pkgbuild = "packaging/tanin-libadwaita/PKGBUILD" # exists
status = "ready (live-verified GTK4; GTK3 partial)"
note = "STATIC defaults + CLI (tanin-libadwaita {dark|light|auto|watch}) for greeter/first-boot. LIVE theming is driven by the taninux app: gui/style.py write_global_theme() regenerates ~/.config/gtk-{4.0,3.0}/gtk(.css)|libadwaita.css from the Appearance settings (dynamic accent + light/dark, surfaces #0f0f0f/#f0f0f0, pills). GTK4/libadwaita = full exact Fuji; GTK3/adw-gtk3 = light/dark + pills only (GTK3 @define-color is parse-time, so adw-gtk3's accent/surfaces can't be overridden — exact-Fuji GTK3 would need a standalone GTK3 theme)."
[[packages.own]]
name = "tanin-setup"
desc = "first-run: seed ~/.config from /usr/share/tanin/skel + enable session target"
pkgbuild = "packaging/tanin-setup/PKGBUILD" # exists
status = "ready"
[[packages.own]]
name = "tanin-desktop"
desc = "metapackage — depends-pulls the whole environment (own + Arch)"
pkgbuild = "packaging/tanin-desktop/PKGBUILD" # exists
type = "meta"
status = "ready (niri stack; depends tanin-eww which is still todo)"
# =============================================================================
# REBUILT AUR DEPS — hard requirements of the desktop that are NOT in the
# official repos. Rebuilt into [tanin] so tanin-desktop can hard-depend on them
# without pulling the AUR. Verify each repo membership before publishing
# (some of these may already be in `extra`; if so, drop them from here).
# =============================================================================
[[packages.rebuilt_aur]]
name = "eww"
reason = "desktop bar/dock/panels — not in official repos"
verify = "extra? AUR has `eww` and `eww-git`"
[[packages.rebuilt_aur]]
name = "tiramisu"
reason = "headless notification daemon feeding the eww UI"
verify = "AUR"
[[packages.rebuilt_aur]]
name = "waypaper"
reason = "wallpaper setter (niri autostart: waypaper --restore)"
verify = "AUR"
[[packages.rebuilt_aur]]
name = "cliphist"
reason = "clipboard history for Spotlight"
verify = "extra? else AUR"
# =============================================================================
# ARCH PACKAGE SET — hard depends of tanin-desktop, pulled from official repos.
# Grouped by role. This is the buildable seed for archiso packages.x86_64.
# =============================================================================
[packages.arch]
compositor = ["niri"]
greeter = ["greetd", "cage"] # cage hosts the GTK greeter; regreet is in rebuilt_aur until confirmed in extra
portals = ["xdg-desktop-portal", "xdg-desktop-portal-gtk", "xdg-desktop-portal-gnome"]
toolkit = ["gtk4", "libadwaita", "gtk3", "python", "python-gobject"]
terminal = ["foot"]
cli = ["jq", "wl-clipboard", "xdg-utils", "libqalculate"] # libqalculate -> qalc
connectivity = ["networkmanager", "bluez", "bluez-utils"]
audio = ["pipewire", "pipewire-pulse", "wireplumber"] # wpctl, pactl
hardware = ["brightnessctl"]
media = ["playerctl"]
screenshot = ["grim", "slurp"]
packages = ["flatpak", "pacman-contrib"] # checkupdates, paccache
security = ["polkit"]
fonts = ["inter-font", "ttf-iosevka-nerd"] # verify nerd-font pkg name
icons = ["papirus-icon-theme", "adwaita-icon-theme"]
[packages.optional]
# optdepends — installed on demand, never required to boot.
"paru" = "AUR support in the Software Hub (opt-in)"
"wlsunset" = "night light"
"cups" = "printer management"
"timeshift" = "system snapshots/backups"
"waybar" = "fallback bar if eww is missing (launch.sh falls back to it)"
# =============================================================================
# DELIVERY / BUILD — how camel becomes an installable ISO.
# =============================================================================
[delivery]
model = "own binary repo [tanin] + official Arch repos (EndeavourOS/CachyOS style)"
iso_tool = "archiso"
installer = "calamares"
calamares_target = "tanin-desktop" # the netinstall/packages module installs just this
dotfiles = "tanin-setup seeds ~/.config from /usr/share/tanin/skel (never writes /home at pkg time)"
[delivery.hosts]
code = "git.openbureau.ch/karim/taninux" # source for makepkg
project = "taninux.kgva.ch" # homepage + [tanin] pacman Server
# pacman.conf snippet shipped to users:
# [tanin]
# SigLevel = Optional TrustAll
# Server = https://taninux.kgva.ch/$arch
# =============================================================================
# OPEN QUESTIONS — decide before tagging a release.
# =============================================================================
[open_questions]
name = "Final project/OS name: keep TANINUX, or split app=tanin / OS=<marketing name>?"
repo_hosting = "Gitea/Forgejo Arch registry vs static dir behind taninux.kgva.ch"
signing = "Move [tanin] SigLevel to Required + distribute the packager key"
regreet_theme = "Author the regreet GTK config/CSS to the Fuji palette (accent #a39ec4)"
aur_repo_check = "Confirm which rebuilt_aur entries are actually in extra (drop those)"
blur_shadow = "niri layer-rule blur/shadow for eww layers (template commented in niri config)"