## What Hydrogen Desktop runs

```bash
curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/gallia-bundle/gallia-bundle.tar.gz \
  -o /tmp/gallia-bundle.tar.gz
tar xzf /tmp/gallia-bundle.tar.gz -C ~/
cd ~/gallia && npm install --no-audit --no-fund
node ~/gallia/install.mjs --project ~/project
```

This bundle is **trimmed for fresh Hydrogen Desktop containers** — all the legacy-container uninstall logic in `install.mjs` has been stripped (no old MCP servers to remove, no retired `kel`/`adom-rc`/`skill-pilot`/`ds-queue`/conduit/AV residue to scrub). The full installer with cleanup lives in [adom-inc/gallia](https://github.com/adom-inc/gallia) for cloud containers.

`bootstrap.sh` is **not** in this bundle either — Hydrogen Desktop handles its own Claude-Code-extension install, VS Code settings, auth, and pre-reqs.

## What `install.mjs` actually installs

All work is done in a single pass with a `/tmp/gallia-install.pid` mutex (prevents concurrent runs that race on `~/.claude/skills/`).

| § | Step | What it does |
|---|------|--------------|
| 0 | PATH | Adds `~/.local/bin` and `~/.claude/bin` to `~/.bashrc` |
| 1 | Skills | Copies all SKILL.mds into `~/.claude/skills/adom/guides/<skill>.md` under a single `adom` umbrella skill (so only `/adom` appears in the slash-command list); skills with `user-invocable: true` also get a standalone `~/.claude/skills/<skill>/SKILL.md` so they get their own slash command. **Also prunes orphan guides** — if a skill was previously deployed but no longer exists in source (e.g. retired skills), its `guides/<skill>.md` is deleted so the umbrella `adom` skill stops referencing it |
| 1a / 1b6 | Codex sync | Mirrors `~/.claude/skills/*` into `~/.codex/skills/` |
| 1b | adom-cli | Downloads `adom-cli` from GitHub Releases (fallback: wiki), installs to `/usr/local/bin/adom-cli`, runs `adom-cli skills install` |
| 1b2 | adom-wiki | Downloads `adom-wiki` from GitHub Releases (fallback: wiki), installs binary + SKILL.md, seeds the wiki CLI token from `/var/run/adom/api-key` |
| 1b3 | adom-vscode | Downloads `adom-vscode` from GitHub Releases (fallback: wiki), disables the built-in `github-authentication` VS Code extension (and the `github.gitAuthentication` / `git.autofetch` settings), runs `adom-vscode install` to deploy the VSIX + SKILL.md + bash completions + screenshot bridge |
| 1c | Tier A apps | Downloads + installs these binaries from the wiki: `adom-mouser`, `adom-digikey`, `adom-jlcpcb`, `adom-parts-search`, `adom-gchat`. Each binary's own `install` subcommand deploys its SKILL.md + bash completions |
| 1d | Default agents | Reads `default-agents.json`, fetches each agent's `skill_source` from the wiki API, writes to `~/.claude/agents/<slug>.md` |
| 1b4 | Wiki catalog | Runs `hooks/refresh-wiki-catalog.mjs` to pull the auto-discovery catalog snippet |
| 1c | MEMORY.md | Injects the managed block from `memory-rules.md` (between `<!-- ADOM-BEGIN -->` markers) into `~/.claude/projects/<encoded-projectRoot>/memory/MEMORY.md` |
| 2 | Claude Code settings | Writes `~/.claude/settings.json` — merges `permissions.allow`/`ask`, pins `model: claude-opus-4-7[1m]`, marks `trustedDirectories`, registers `hooks/check-updates.sh` as a `UserPromptSubmit` hook, sets `hooks/statusline.sh` as the statusline. Also updates `~/.claude.json` onboarding flags and forces `python.interpreter.infoVisibility: never` in code-server settings |
| 3 | Identity cache | Calls `adom-cli carbon user get` + `carbon containers current` + `carbon user orgs`, writes safe identifiers (user name, display name, repo name, org names — **never** slug/hostname) to `~/.config/adom-identity.json` |
| 5 | Shared services | Prints info banner: `service-kicad`, JLCPCB, and Mouser run on shared service containers — nothing local needed. Honors `KICAD_SERVICE_API` override |
| 7 | Project dirs | Creates `<projectRoot>/project-content/screenshots` and `.../schematics` (sudo + chown fallback on EACCES) |
| 8 | Background services | Runs `services/adom-start.sh` (which discovers any `services/*/service.json` whose `service` tag matches `$GALLIA_SERVICE`, default `local`); runs each matching `services/*/setup.sh`; patches `/usr/local/bin/code-server-entrypoint.sh` to re-run `adom-start.sh` on reboot; installs a `*/2 * * * *` cron calling `services/adom-watchdog.sh` **only on service containers** (where `/etc/environment` sets `GALLIA_SERVICE` to something other than `local`) |
| 10 | Summary | Prints "Open Claude Code and try your first prompt!" |
| extra | Org bootstraps | For each org in the cached identity that has a customer entry in `CUSTOMER_BOOTSTRAPS` (currently only `ntx-embedded`), clones or wiki-downloads the customer repo to `~/<org>/` and runs its `install.sh` |
| extra | Hash stamp | Writes `sha256(install.mjs)` to `~/.adom/last-install-hash` so `hooks/check-updates.sh` can detect upstream changes |

**Not installed by this bundle:** MCP servers (none — they were all retired); `bootstrap.sh` (HD handles bootstrap itself); `kel`, `adom-rc`, `skill-pilot`, `ds-queue` (all retired). On a fresh HD container, the installer logs are linear and clean — every line is a positive "✓ installed X", no scrubs or removals.

## Skill inventory (117)

Skills below are deployed as guides under the single `adom` umbrella; ones marked `user-invocable: true` in their frontmatter also get their own slash command.

### Adom platform — core
`adom`, `adom-api`, `adom-app-header`, `adom-app-model`, `adom-auth`, `adom-cli-design`, `adom-cloud`, `adom-footprint`, `adom-inventory`, `adom-layouts`, `adom-lbr`, `adom-panels`, `adom-pin-mapping`, `adom-plan`, `adom-port-hints`, `adom-publish`, `adom-repo-management`, `adom-schematics`, `adom-screenshot`, `adom-security`, `adom-symbol`, `adom-tts`, `adom-ui-linter`, `adom-update`, `adom-viewer`, `adom-workspace-control`

### Adom Desktop bridge
`adom-desktop`, `adom-desktop-bridge-author`, `adom-desktop-demo`, `adom-desktop-direct-api`, `adom-desktop-discovery`, `desktop-setup`, `desktop-ssh`, `ssh-connection`, `remote-bootstrap`, `oauth`

### Wiki + sharing
`adom-wiki`, `adom-wiki-v2`, `wiki-backup`, `wiki-first-lookup`, `wiki-split`, `app-creator`, `readme-creator`, `library-creator`, `tool-publisher`, `skill-catalog`, `skill-creator`, `standalone-service`

### KiCad, PCB, electrical engineering
`service-kicad`, `service-kicad-admin`, `kicad-donut-pad`, `kicad-to-markdown`, `kicad-to-molecule`, `pcb-design`, `footprint-creator`, `schematic-creator`, `altium-pcblib`, `gerber-viewer`, `fp3d-viewer`, `pin1-indicator`, `electrical-engineering`, `solder-jet-sizer`, `solder-jetting`, `up-axis-conventions`

### Fusion 360
`fusion-360`, `fusion-export-for-hydrogen`, `fusion-update-libraries`

### 3D models + viewers
`3d-component-creator`, `3d-viewer-design`, `basic-3d-viewer`, `instrument-viewer`, `measure-tool-design`, `mosfet-visualizer`, `molecule-breakout-board-creator`, `board-creator`

### tscircuit
`adom-tscircuit-skill`, `board-building-pipeline`, `instapcb`

### Parts search + sourcing
`adom-parts-search`, `digikey`

### Chipsmith
`adom-chipsmith`, `adom-chipsmith-build`

### Datasheets
`datasheet-parser`, `datasheet-parser-interactive`, `process-datasheets`

### Test instruments
`pyvisa-testscript`, `red-pitaya`

### Process, demos, ops
`brand`, `bug-filing`, `container-bootstrap`, `debug`, `definitions`, `demo-recording`, `tour`, `tts-pronunciation`, `use-cases`

### Other tools + references
`curium`, `neon-mirror`, `pup`, `pup-vs-webview`, `claude-api`, `claude-code-1m-context`, `ai-hints-in-clis`, `relay-hint-pattern`, `avatar`, `movie-maker`, `carbon-preferences`, `human-ui-patterns`

## Differences from the upstream gallia repo

| Item | Upstream `adom-inc/gallia` | This HD bundle |
|------|----------------------------|-----------------|
| `bootstrap.sh` | present (legacy cloud-container bootstrap) | **removed** — HD does its own bootstrap |
| `install.mjs` `oldSkillDirs` cleanup loop | present | **removed** |
| `install.mjs` nested-adom-skill cleanup | present | **removed** |
| `install.mjs` `~/.claude/commands/` scrub | present | **removed** |
| `install.mjs` §1b3 broken-extension removal | present | **removed** |
| `install.mjs` §1b5 ds-queue retirement | present | **removed** |
| `install.mjs` §3 + §4 MCP cleanup | present | **removed** — no MCP servers anywhere |
| `install.mjs` §4b gchat / `kel` legacy cleanup | present | **removed** |
| `install.mjs` §4c desktop-conduit / AV retirement | present | **removed** |
| `install.mjs` §4d2 jst / neon-mirror / piper-tts retirement | present | **removed** |
| `install.mjs` §4d skill-pilot retirement | present | **removed** |
| `install.mjs` §4e adom-rc retirement | present | **removed** |
| `install.mjs` §8 legacy `check-kicad-update.sh` cron scrub + stale-watchdog else-branch | present | **removed** |

`install.mjs` shrinks from **1434 → 976 lines** (-32%). The bundle tarball ships at **4.9 MB** (641 files) vs ~16 MB stale.

## Bundle contents

```
gallia/
├── install.mjs            # cleaned installer (no legacy uninstall code)
├── package.json           # npm deps for installer + MCP servers
├── default-agents.json    # which agents to install from the wiki
├── memory-rules.md        # global memory hygiene rules
├── PORT-REGISTRY.md       # platform port allocations
├── skills/                # 117 SKILL.md packages
├── services/              # service skeletons (kicad-cli, ds-extract, oauth-gateway)
├── hooks/                 # statusline.sh, check-updates.sh, refresh-wiki-catalog.mjs
├── scripts/               # bootstrap-guest, publish-to-wiki, claude-auth, etc.
├── dns/, jst/             # MCP servers (source — not auto-registered by installer)
├── symbol-creator/        # KiCad/EAGLE symbol creator MCP server + UI
├── footprint-creator/     # KiCad footprint creator MCP server + UI
├── youtube/               # YouTube OAuth + API tooling
├── brand/, docs/, plans/, demo/
└── .claude/               # per-project Claude Code config baseline
```

## Source + build process

- **Skill source:** [adom-inc/gallia](https://github.com/adom-inc/gallia). This bundle never touches that repo — it snapshots `HEAD`, applies HD-specific transforms in a sandbox, ships.
- **Build pipeline:** [adom-inc/gallia-hd-bundle](https://github.com/adom-inc/gallia-hd-bundle) is the HD layer. It owns the build script, the strip policy (`strip-install-mjs.py`, 12 exact-match excisions, fails loud on any upstream drift), and a `.gallia-pin` recording which gallia commit each bundle was built from.

Rebuild flow:

```bash
cd ~/project/gallia && git pull
cd ~/project/gallia-hd-bundle && bash build.sh
git add .gallia-pin && git commit -m "Build bundle from gallia $(cat .gallia-pin | cut -c1-7)" && git push
```

Every build uploads two assets to this page: `gallia-bundle.tar.gz` and `bundle-meta.json`. The meta sidecar pins the exact gallia commit, build timestamp, tarball SHA256, skill count, and the strip list applied — so for any deployed bundle you can answer "which gallia SHA was this built from?" with a single `curl`:

```bash
curl -s https://wiki-ufypy5dpx93o.adom.cloud/static/apps/gallia-bundle/bundle-meta.json | jq .
```

The page's asset upload history (visible via `adom-wiki page log app/gallia-bundle`) is the canonical build log.
