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:
@@ -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)
|
||||
@@ -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)"
|
||||
Reference in New Issue
Block a user