yggcli is the guided front door into the Yggdrasil ecosystem.
It does not create a hidden control plane. It writes the real config files the other repos already use, so the path from first-run user to confident operator stays open.
This README is the operator manual for using yggcli as the bootstrap layer for yggdrasil, yggclient, and yggsync.
Use yggcli when you want guided setup, sane defaults, and inspectable output files.
It is responsible for:
- bootstrapping a workspace with the right repos
- collecting config values through a TUI or CLI flags
- writing native config files into those repos
- optionally kicking off a server ISO build on Linux
flowchart TD
C[yggcli]
D[yggdrasil]
L[yggclient]
Y[yggsync]
T[yggtopo]
C --> D
C --> L
C --> Y
C --> T
L --> Y
yggcli is meant to disappear after it has done its job.
It writes plain files so you can:
- inspect the generated output
- edit it by hand later
- version it normally
- rerun
yggcliwithout feeling trapped by it
On Linux, bootstrap keeps the ecosystem together in one workspace, including:
yggdrasilyggclientyggsyncyggdocsyggtermyggtopo
On Android or Termux, the bootstrap is smaller and does not pull in server-build work.
Today yggcli can:
- launch an interactive TUI
- bootstrap missing repos
- write local config defaults
- render the live runtime
~/.config/ygg_sync.toml - fetch
yggsync - apply the platform-appropriate client stack
- apply exact overrides with
--set - run Linux ISO build and smoke flows
It should be thought of as a guided writer for ecosystem config, not as an all-purpose runtime manager.
yggcli writes the native files already used by the other repos:
yggdrasil/ygg.local.tomlyggclient/yggclient.local.tomlyggclient/config/profiles.local.envyggsync/ygg_sync.local.toml
That split matters:
yggdrasilgets host-build settingsyggclientgets endpoint profile settingsyggsyncgets sync-engine defaults
flowchart LR
A[yggcli fields] --> B[yggdrasil/ygg.local.toml]
A --> C[yggclient/yggclient.local.toml]
A --> D[yggclient/config/profiles.local.env]
A --> E[yggsync/ygg_sync.local.toml]
The conservative first server path is still the right one.
- bootstrap the workspace
- write defaults
- inspect the generated files
- build the server ISO
- tune advanced options only after the first host is alive
curl -fsSL https://raw.githubusercontent.com/yggdrasilhq/yggcli/main/install.sh | bash
yggcli --bootstrap --write-defaults
yggcli --workspace ~/gh --build-iso --profile serverFirst server guidance:
- keep
apt_proxy_mode=off - keep
infisical_boot_mode=disabledunless you already run Infisical in an LXC - keep
with_lts=falseunless you intentionally want the compatibility-pinned kernel path
Later, after the host is alive:
- switch to
apt_proxy_mode=explicitif you adopt the apt-proxy container pattern - switch to
infisical_boot_mode=containeronly if you intentionally adopt that pattern
Use this when the server already exists and you want endpoint defaults written cleanly.
yggcli --workspace ~/gh \
--set yggclient.profile_name=laptop \
--set yggclient.user_name=alice \
--set yggclient.samba_host=nas.internal \
--set yggclient.samba_username=smb-login \
--set yggclient.ssh_host=nas-box \
--set yggsync.notes_local=~/Documents/notes \
--set yggsync.notes_remote_path=netshare/alice/notes \
--write-defaults --render-runtime-configThis is the mode most relevant to yggclient and yggsync onboarding.
Android or Termux hosts can bootstrap the client-side stack, but they do not build yggdrasil ISOs.
curl -fsSL https://raw.githubusercontent.com/yggdrasilhq/yggcli/main/install.sh | bash
yggcli --bootstrap --write-defaultsUse this when:
- you want
yggclientandyggsyncdefaults on the phone - you want the safe path first
- you do not want Android attempting server-build work
Running yggcli with no arguments launches the interactive TUI.
Use it when:
- you want guided field-by-field editing
- you are still learning the ecosystem
- you want to run bootstrap and apply actions without memorizing file paths or scripts
Controls:
Tab/Shift-Tab: switch sectionUp/Down: move between fieldsEnter: toggle booleansCtrl-B: bootstrap the workspaceCtrl-S: save generated local config filesCtrl-R: render the live runtime~/.config/ygg_sync.tomlCtrl-F: fetchyggsyncCtrl-Y: apply the endpoint stackCtrl-D: install desktopyggsyncservice and timer on LinuxCtrl-A: run Android setup on TermuxCtrl-I: build the server ISO on LinuxCtrl-M: run smoke on Linuxq: quit- mouse: click tabs, click fields, scroll sections
The right side of the TUI explains the selected field and shows the equivalent CLI flags for the main actions.
Use the CLI mode when you need repeatability, exact overrides, or agent-friendly automation.
Examples:
yggcli --bootstrap --write-defaults
yggcli --list-actions
yggcli --list-fields
yggcli --workspace ~/gh --apply-client-stack
yggcli --workspace ~/gh --render-runtime-config
yggcli --workspace ~/gh --build-iso --profile server
yggcli --workspace ~/gh --smoke --profile kde --with-qemu
yggcli --workspace ~/gh \
--set yggdrasil.hostname=mewmew \
--set yggdrasil.net_mode=dhcp \
--set yggdrasil.with_lts=false \
--build-iso --profile serverNotes:
- repeat
--setto override exact fields without hand-editing files first --list-fieldsmakes the override surface self-documenting--list-actionsmakes the supported platform actions self-documenting- Linux ISO builds automatically use
sudo -nwhen root privileges are required - Linux bootstrap also clones
yggtopo - Android or Termux hosts are blocked from server ISO build actions by design
--apply-client-stackis the high-level non-interactive endpoint path
This is the section that should influence the future TUI design.
The most useful end-user patterns look like this:
The TUI should make the conservative first-host path obvious:
- apt proxy off
- Infisical boot disabled
- normal sid kernel path
- build first, optimize later
The TUI should be able to ask:
- is this endpoint using direct SMB credentials or a mounted NAS path
- should the generated desktop service enforce a mount-point guard
- which small jobs should be enabled first
The TUI should be able to ask:
- which Termux-accessible folders matter first
- whether Wi-Fi-only should be required
- what battery and temperature limits should gate jobs
- whether Tailscale-dependent NAS access needs defer behavior
The TUI should be able to ask:
- where the local vault lives
- where the central repository lives
- whether the first operation should be
updateorcommit - which default filters to apply for
.obsidian, trash, conflict files, and DOS aliases
Those patterns are not just documentation ideas.
They are the most likely high-value prompts to wire into yggcli next.
- Linux can bootstrap the full workspace and run
yggdrasilbuild and smoke actions - Android or Termux bootstraps
yggcli,yggclient,yggsync, andyggdocs - Android or Termux does not run
yggdrasilISO builds or smoke benches - existing local config files are loaded first, so reruns behave like editing a live workspace
That usually means either:
- the wrong workspace was selected
--setoverrides targeted the wrong section or key- existing local config files were loaded and are influencing what you see
Inspect the generated files directly. That is the intended workflow.
That should not happen. Android or Termux is intentionally blocked from server ISO build actions.
Use:
yggcli --bootstrap --write-defaultsand stop there.
That is fine. Use yggcli as a sharp utility:
- generate a starting config
- inspect the diff
- keep what helps
- ignore the rest
Install from the release installer:
curl -fsSL https://raw.githubusercontent.com/yggdrasilhq/yggcli/main/install.sh | bashRun locally during development:
cargo runStack:
- Rust
- ratatui
- crossterm
- GitHub Actions for release automation
- Code: GPL-3.0-or-later, full text in
LICENSE - Documentation: CC BY-SA 4.0, see
LICENSE-CC-BY-SA-4.0 - Names and logos: neither licence covers them — see
TRADEMARKS.md
Copyright 2026 Avikalpa Kundu [email protected].
Ygg CLI was Apache-2.0 until 2026-08-01. Anything published under that licence stays available under it; everything from the relicensing commit onward is GPL-3.0-or-later.
Contributions need a signed CLA, because this project is also licensed
commercially. See CONTRIBUTING.md and CLA.md — it is a page, you keep your
copyright, and it takes one line to sign.