One clone of the whole org — and the place all charly development happens.
opencharly/opencharly is an org-level umbrella repo: every OpenCharly repo (409 today)
is pinned here as a git submodule ("gitlink", in the org's vocabulary), flat at the
root — submodule path == repo name for all but one alias (.github, pinned at the
dotgithub/ path).
It is two things at once. It is a view of the org: one checkout in which every repo
sits at the exact commit the rest of the org builds against. And it is the working root
for the product — charly development happens here, in per-session worktrees, and lands
through the org's PR-only chain. charly remains the product repo and the single
source of truth; this umbrella is where you work on it.
Product docs: charly's README · opencharly.ai.
git clone https://github.com/opencharly/opencharly.git
cd opencharly
bash scripts/init-submodules.sh # materialize the working set (needs only git + python3)
./charly/scripts/bootstrap-charly.sh # builds charly/bin/charly — once per clone
export PATH="$PWD/charly/bin:$PATH" # from here on this page reads `charly …`
charly task hooks # installs this clone's pre-commit gateThe umbrella has two non-charly entrypoints, and both have to be: the build that
produces the charly binary cannot itself be a charly task, and neither can the
materialization — the working set includes charly itself, so the binary does not exist
yet when the first clone happens. scripts/init-submodules.sh materializes the working
set, and charly/scripts/bootstrap-charly.sh builds the binary from the charly
checkout it materialized; the initializer needs git and python3, and it checks both
and names a missing one. Every command after the bootstrap is the installed-binary form
— charly task …, exactly as on a host that installed a package. charly task init is
that binary form of the same materialization: it runs the same script, so it carries the
same two requirements. Without the export, the same commands run as
./charly/bin/charly task …; both forms are the same binary.
The umbrella is a view over the org, not a 9.5 GB checkout (measured 2026-10-22).
It pins every OpenCharly repo as gitlinks, and the pins live in the umbrella's index —
every pin is audited from the index, so a checkout is only needed for the repos you
actually build against or edit.
scripts/init-submodules.sh materializes a working set — the repos the project
loads from, the pin contract's own repos, the harness corpus root, and the repos the
umbrella's own gate scripts read — and leaves the rest as index entries:
| clone shape | on disk | wall clock |
|---|---|---|
git clone --recurse-submodules (every checkout, full history) |
9.5 G | minutes |
git clone + scripts/init-submodules.sh (the working set, blobless) |
77–77 M | 14–15 s |
git clone + scripts/init-submodules.sh --all (every path, blobless) |
1.9–2.2 G | 5 m 44 s – 6 m 43 s |
Every figure in the table was measured on this machine on 2026-10-22; the bands carry the readings taken on 2026-10-27 as well.
Those sizes are the clone; the bootstrap builds the binary and leaves its build cache
in the tree, so a bootstrapped light tree measures 129–129 M, against the 9.5 G a full
checkout occupied on 2026-10-22. Sizes are du -sh at whole-unit granularity, and the
packs move with the upstream repos, so the two shapes the runs repeated carry a band —
the range the runs produced — rather than a number that stays put: the light clone
measured between 77 M and 77 M, and the --all shape between 1.9 G and 2.2 G. The
--recurse-submodules row is the baseline this replaces: one measurement, of a full
checkout; it tracks the upstream mirrors, so it moves as they do. The --all shape's band
is the openclaw mirror's module store — 480–520 M in a from-scratch clone, and more
in a tree whose store was reused across runs, which holds more of that mirror's history
and grows as the mirror does.
The bands are re-derived, not remembered. scripts/measure-clone.sh measures the
shapes above from fresh clones of the tree under test and prints every reading;
scripts/check-readme-measurements.mjs reads the bands this table commits, asserts
that the prose agrees with the table, and — handed that script's log — asserts that
every reading falls inside its band. The second is a step of charly task verify and
of the pre-commit hook, so a figure the prose and the table disagree about is a
failed gate rather than a sentence nobody notices.
A reading is a property of the TREE, not of the machine. The measurement clones the superproject over the transport, on the one branch that holds the tree under test: a local clone copies the source's entire object store — every commit on every branch, including other sessions' pushed branches — so a reading made that way drifts with the org's push traffic while the tree stands still. The gate fails on a measurement that clones the tree locally, and its self-test mutates the measurement's own clone invocation to prove the assertion can fail.
The samples half needs the run's own log, so it is a manual step after a
measurement: the two automatic steps above run the comparison without --samples,
and a reading nobody measured is a reading no gate can see.
bash scripts/measure-clone.sh > /tmp/measure.log
node scripts/check-readme-measurements.mjs --samples /tmp/measure.logSo a band a reading has outgrown is a failed check against the run that produced
the reading — the run stamps the day it was taken (MEASURED=), and the comparison
holds that day to the span this table states.
The last of those four sources is what keeps the light tree honest. The umbrella's
gate scripts compare surfaces that live in submodules — the committed rulebook in
action-review/charly.yml and the coordination shell in marketplace/scripts/coord.sh
— and a gate skips a comparison whose surface is not checked out, so it still
exits 0. Measured on a light clone, 2026-10-22: charly task verify reported 26/26 steps passed while six cross-repo comparisons never ran. The
working set therefore includes the repos the gates read, so a light tree's gate
covers what the full tree's covers — and the light tree now reports every step
passed, none skipped, the same as the full tree.
The wall clocks are samples of repeated runs of the same step, measured from a fresh
clone, so the two shapes the runs repeated carry the band the runs actually produced
across this branch — rather than a single number: the light row's fresh clones measured
between 14 s and 15 s — the whole of it is the network fetch of the working set's
blobless clones — and the --all row's from-scratch materializations measured between
5 m 44 s and 6 m 43 s.
The --recurse-submodules row is stated coarsely, as minutes: that shape was measured
once, and its time is the mirrors' fetch. The --all row is the maintenance shape: it
clones every declared path in parallel and then checks them out one at a time, and its
time is dominated by the vendored upstream mirrors — openclaw alone, whose history
measured 7.6 GB on 2026-10-22, is the largest of them, and a blobless fetch still brings
down every commit and tree it holds.
scripts/init-submodules.sh clones blobless (--filter=blob:none): every commit and
every tree are present, so "is this pin an ancestor of the remote's tip?" stays
answerable, while the blobs of history are never fetched. --depth 1 is deliberately
not used — a shallow clone cannot answer that question, so a healthy pin reads as
divergent. The filter has to be an explicit flag: a filter = key in .gitmodules is
not honoured by git submodule update.
charly task init is the same operation through the binary. The mode is chosen by
the environment, not by a task parameter:
charly task init # the working set
CHARLY_INIT_MODE=all charly task init # every declared path
CHARLY_INIT_MODE=list charly task init --output # print the set, change nothing
CHARLY_INIT_PATHS=a,b charly task init # the named repos--output is what makes the task's own output visible: the task runner prints its
report on stderr and the step's output on stdout only in that mode.
The environment is the only channel that carries an operator's value as data: an
upper-case task parameter's value is substituted into the command's text, and the
shell then parses that text, so a parameter carrying a shell metacharacter would
execute (measured: a parameter of $(touch /tmp/marker) created the marker). A
lower-case parameter is not substituted at all — the expander's grammar is
upper-case-initial — so it reaches the shell, finds no such variable, and its empty
word vanishes. An environment
value reaches the shell as a parameter-expansion result, which is never re-parsed —
and an unknown mode is reported as a value, not run:
$ CHARLY_INIT_MODE='all; touch /tmp/pwned' charly task init
[fail] run — materialize the umbrella's submodules
exit=2, want 0 (stderr: FAIL: CHARLY_INIT_MODE must be working-set, all or list (got 'all; touch /tmp/pwned'))
The same law governs the manifest's own command steps: a braced reference in a
command: step's text is claimed by the plan runner and expanded against the task's
merged environment, and one it cannot resolve does not fail the step — it skips it,
so the gate reads green over a check that never ran. A command step's text therefore
carries no value at all: read the environment at run time, so the runner never sees
it — with a bare $NAME, or, under set -eu, through $(printenv NAME 2>/dev/null || true) so an unset variable cannot abort the step before it runs.
node scripts/check-task-command-vars.mjs holds that line, in the pre-commit gate and
in charly task verify.
All submodule URLs are plain HTTPS, so forks work without extra configuration: every
gitlink resolves to its opencharly/<repo> upstream over HTTPS, no credentials needed
for a read-only checkout.
Then the one rule that keeps the checkout honest: never edit a submodule in place.
Every repo you change gets its own worktree at .worktrees/<slug>/<repo>/, branched off
a fresh origin/main, so the submodule's tracked checkout stays detached and clean at
its recorded gitlink. Change lands only by pull request. The full model — worktrees,
the pin contract — its intent model, the producer-first landing order, after-merge cleanup — is in
AGENTS.md under The development model.
AGENTS.md is the one rulebook, and it is harness-neutral: every agent
harness reads that same file directly, so no second copy exists to drift. Harness
configuration now lives at this umbrella root and only here — a plain move-in of
every harness's settings and workflows (Claude Code, Codex, opencode, pi, Kimi/reasonix,
DSH),
with no mirror and no parity gate. Skills live in neither: they
come from the opencharly/marketplace
corpus, which each harness resolves per its own conventions.
Every change lands the same way: a feat/ branch, a PR validated by
charly/pr-validator, then native auto-merge — and tag-on-merge writes the CHANGELOG
entry and the CalVer tag.
Build the binary once per clone and put it on PATH (both in Start developing above),
then run the umbrella's own maintenance from the umbrella root. Every command below is the
installed-binary form — charly task …, the same shape a packaged charly gives you:
| command | purpose |
|---|---|
charly task init |
materialize the umbrella's submodules on demand (the working set; CHARLY_INIT_MODE=all|list and CHARLY_INIT_PATHS select the others) |
charly task map |
list every submodule with its pin and sync state |
charly task sync |
advance EVERY submodule pin this repo declares, per the pin contract (it rolls the checkouts that exist to their default-branch HEAD and stages the gitlinks; it does not commit) |
charly task verify |
the full pinning gate, on demand (every pin, incl. the remote branch audit) |
charly task design-check |
run the DESIGN gate — the seven controls of DESIGN.md A.1/A.2 (the CUE toolchain, DESIGN.md↔DESIGN.cue, the examples and their negatives, the capability ledger, every citation into a pinned module resolved at its pin, the schema patterns of every pinned plugin module, every pin's relation to a release tag). It is the same command hooks/pre-push runs for a push that changes a surface those controls read — the caller is asserted by node scripts/check-design-gate.mjs |
charly task hooks |
install hooks/pre-commit for this clone (once) |
charly task org-map |
verify the README org-map tables against the repo and .gitmodules |
charly task skills |
splice the generated R0 dispatcher from the pinned marketplace into AGENTS.md |
charly task pin-check |
assert the pin contract's consistency half — the EDGE (every pin_map entry equals its twin in the pinned_from checkout) and the CHECKOUT AUDIT (every declared path clean and at its recorded gitlink). It READS the index's gitlinks, the MANIFEST charly.yml's pins: block and the DECLARED PATH SET .gitmodules, so a commit can violate it by moving a gitlink or by editing the manifest or by editing the declared path set — a commit that moves NO gitlink can still violate it. It is the half of verify that needs no remote (the per-submodule git ls-remote default-branch audit is the rest), and it is what hooks/pre-commit runs. Checkout DRIFT on its own — a checkout dirty or at another commit, caused by NO commit — stays with charly task verify |
charly task pins |
the pin-contract pin operation over EVERY declared path (mode via param) — the distro-* paths are its EDGE subset (the pin_map); MODE=bump advances EVERY pin this repo declares |
charly task self-test |
self-test the committed CI body/pin-evidence builders + the dispatcher splice + the submodule initializer |
charly task prune |
reap merged-upstream session worktrees + branches (MODE=report is a dry run) |
charly task list enumerates them. Without the PATH export, the same commands run as
./charly/bin/charly task ….
Every submodule is listed below, grouped by category and alphabetically ordered within each table. The pinning policy in the next section says how each pin is kept current.
Two repos are deliberately not listed as their own-name submodules:
opencharly/opencharlyitself — the umbrella cannot pin itself; it is this repo.opencharly/.github— the org-wide community-health defaults and the reusable validation/merge workflows every repo inherits. It is pinned at thedotgithub/path (submodule path != repo name), so this repo's own.github/workflows/stays free for its CI dispatchers.
heroic-heroic is archived and intentionally not a submodule.
Each class has ONE placement rule, and the class prefix in the repo name states it:
- Core & contract — bare names (
charly,sdk,spec,marketplace,docs): the product, the wire/IR contract, the generated corpus, the site. - Distro image families —
distro-<distro>: the base and builder, distro-exclusive OS layers, that distro's VMs and beds. - Package repositories —
charly-<distro>for the published repo andpkg-<distro>for package source: packaging plus its publishing bed. - Candy layers —
layer-<name>: ONE candy with its files beside it. A family'sskill:entities live beside the code, plugin, or config they describe (AGENTS.mdPart II #5), never in a repo that holds nothing else: a repo whose only content is skills is not a class. - Product families —
layer-<family>: a family's box(es), candy, VM, beds and skills (layer-agentteamsis the canonical example;layer-openclawfollows it). - Plugins —
plugin-<word>: the provider candy, its Go module and its CUE schema. - Pods / service bundles —
pod-<name>: a candy withservice:plus its skill. - VMs —
vm-<family>:kind: vmdefinitions plus VM skills. - Product & tooling — bare or product-specific: appliances, CI action config, vendored upstreams.
The rule these placements follow — what may be bare, and why a product family is a
layer-<family> repo — is stated once in AGENTS.md ("Repo classes and naming"); the lines
above only place each class. The authoring procedure is /charly-internals:repo-setup, and
charly task org-map verifies the tables below against the repo and .gitmodules.
6 repos — the product and the contracts it consumes.
| path | repo | role |
|---|---|---|
charly/ |
opencharly/charly | The agentic DevOps tool for you and your agents. |
charly-lib/ |
opencharly/charly-lib | The shared multi-call plugin host for charly — ONE binary serving every welded plugin (opencharly/sdk/charlylib) |
docs/ |
opencharly/docs | Documentation site for OpenCharly — the agentic DevOps tool, its candies, and its plugins. Published at opencharly.ai. |
marketplace/ |
opencharly/marketplace | OpenCharly plugins — Claude Code skills, agents, and workflows for the charly CLI |
sdk/ |
opencharly/sdk | OpenCharly plugin SDK + contract repo |
spec/ |
opencharly/spec | OpenCharly wire/IR contract module: spec + proto (generated from CUE schema). The dedicated contract every pl… |
6 repos — each maps to a box/<distro> inside charly; their pins follow charly's own gitlinks (the pin contract's edge).
| path | repo | role |
|---|---|---|
distro-arch/ |
opencharly/distro-arch | OpenCharly — the Arch Linux image family |
distro-cachyos/ |
opencharly/distro-cachyos | OpenCharly — the CachyOS image family |
distro-debian/ |
opencharly/distro-debian | OpenCharly — the Debian image family |
distro-fedora/ |
opencharly/distro-fedora | OpenCharly — the Fedora image family (incl. the nvidia GPU base) |
distro-omarchy/ |
opencharly/distro-omarchy | Omarchy image family (charly's box/omarchy) - vanilla Arch + Hyprland |
distro-ubuntu/ |
opencharly/distro-ubuntu | OpenCharly — the Ubuntu image family |
10 repos — native package repos for supported distros.
| path | repo | role |
|---|---|---|
charly-alpine/ |
opencharly/charly-alpine | charly native package repo |
charly-arch/ |
opencharly/charly-arch | charly native package repo |
charly-debian/ |
opencharly/charly-debian | charly native package repo |
charly-fedora/ |
opencharly/charly-fedora | charly native package repo |
charly-openwrt/ |
opencharly/charly-openwrt | charly native package repo |
charly-ubuntu/ |
opencharly/charly-ubuntu | charly native package repo |
pkg-arch/ |
opencharly/pkg-arch | OpenCharly — native Arch PKGBUILD for the charly CLI binary |
pkg-debian/ |
opencharly/pkg-debian | OpenCharly — native Debian/Ubuntu packaging for the charly CLI binary |
pkg-fedora/ |
opencharly/pkg-fedora | OpenCharly — native Fedora RPM packaging for the charly CLI binary |
plugin-generate-packages/ |
opencharly/plugin-generate-packages | charly native package repo |
13 repos — streamer product, appliance provisioning, org action, third-party pins, and the six vendored OpenClaw upstream forks.
| path | repo | role |
|---|---|---|
action-review/ |
opencharly/action-review | Charly config for the org AI PR-review gate: dual-runner workflow, env/secret contract, review plan |
charly-jetkvm/ |
opencharly/charly-jetkvm | Provision the appliance-resident charly on a JetKVM (armv7) — install the published release binary + welded plugins over ssh and verify it runs project-less |
charly-streamer/ |
opencharly/charly-streamer | charly-streamer (cstream) — Hyprland desktops streamed to a browser over WebRTC: Rust streamer + leader, Go g… |
clawsweeper/ |
opencharly/clawsweeper | Vendored upstream fork of openclaw/clawsweeper — scans the org's issues and PRs weekly and proposes what to close, and why |
crabbox/ |
opencharly/crabbox | Vendored upstream fork of openclaw/crabbox — warm a box, sync the diff, run the suite (the remote-execution CLI the plugin-crabbox provider drives) |
crabhelm/ |
opencharly/crabhelm | Vendored upstream fork of openclaw/crabhelm — the OpenClaw meta orchestrator |
dotgithub/ |
opencharly/.github | OpenCharly org-wide community-health defaults (PR template, etc.) — single source inherited by every repo wit… |
gst-wayland-display/ |
opencharly/gst-wayland-display | A micro Wayland compositor that can be used as a Gstreamer plugin |
lobster/ |
opencharly/lobster | Vendored upstream fork of openclaw/lobster — the OpenClaw-native workflow shell that plugin-lobster implements (workflow:lobster) |
openclaw/ |
opencharly/openclaw | Vendored upstream fork of openclaw/openclaw — the OpenClaw agent gateway the layer-openclaw family packages |
openclaw-enterprise/ |
opencharly/openclaw-enterprise | Vendored upstream fork of openclaw/openclaw-enterprise — the enterprise control plane for the same gateway family |
pi-review-action/ |
opencharly/pi-review-action | Archived — the org PR-review gate now runs the charly engine (opencharly/action-review) |
pixelflux/ |
opencharly/pixelflux | Patched pixelflux wl-screenshot/record library for OpenCharly selkies desktops (migrated from overthinkos) |
4 repos — vendored pi agent packages and extensions (the OpenCharly pi-plugin forks and mirrors).
| path | repo | role |
|---|---|---|
pi-asciinema/ |
opencharly/pi-asciinema | pi agent extension: cast_read — read and analyze asciinema .cast recordings from agents |
pi-fabric/ |
opencharly/pi-fabric | Vendored mirror of monotykamary/pi-fabric (npm 0.70.0) |
pi-lsp/ |
opencharly/pi-lsp | Vendored mirror of pi-lsp (npm 0.1.7, no upstream repo) |
rpiv-todo/ |
opencharly/rpiv-todo | Vendored mirror of juicesharp/rpiv-mono packages/rpiv-todo (npm 2.8.0) |
2 repos — the charly meta/skill candy layers.
| path | repo | role |
|---|---|---|
layer-charly-check/ |
opencharly/layer-charly-check | The charly-check candy — 14 check skills (extracted from charly/candy) |
layer-charly-tools/ |
opencharly/layer-charly-tools | image layer / candy |
13 repos — the omarchy desktop image composition layers.
| path | repo | role |
|---|---|---|
layer-omarchy-base/ |
opencharly/layer-omarchy-base | Omarchy base - the [omarchy] pacman repo, keyring and core runtime |
layer-omarchy-boot/ |
opencharly/layer-omarchy-boot | Omarchy boot chain - limine, snapper, plymouth, sddm (machine-only) |
layer-omarchy-desktop-apps/ |
opencharly/layer-omarchy-desktop-apps | Omarchy desktop applications - files, productivity, input methods, web apps |
layer-omarchy-dev/ |
opencharly/layer-omarchy-dev | Omarchy developer toolchain - editors, language runtimes, containers |
layer-omarchy-fonts/ |
opencharly/layer-omarchy-fonts | Omarchy font set |
layer-omarchy-gpu-nvidia/ |
opencharly/layer-omarchy-gpu-nvidia | Omarchy NVIDIA GPU stack (machine-only, opt-in) |
layer-omarchy-hardware/ |
opencharly/layer-omarchy-hardware | Omarchy hardware and laptop support - dkms and vendor quirks (machine-only, opt-in) |
layer-omarchy-hyprland/ |
opencharly/layer-omarchy-hyprland | Omarchy Hyprland compositor stack and desktop portals |
layer-omarchy-media/ |
opencharly/layer-omarchy-media | Omarchy media stack - audio, video, imaging, capture |
layer-omarchy-network/ |
opencharly/layer-omarchy-network | Omarchy networking - NetworkManager, bluetooth, printing, firewall (machine-only) |
layer-omarchy-shell/ |
opencharly/layer-omarchy-shell | Omarchy Quickshell desktop shell - bar, notifier, launcher, OSD |
layer-omarchy-terminal/ |
opencharly/layer-omarchy-terminal | Omarchy terminal and CLI toolkit - foot, starship, modern coreutils |
layer-omarchy-themes/ |
opencharly/layer-omarchy-themes | Omarchy's 22 themes and the theme-token renderers |
2 repos — the omarchy PR evaluation beds and their run artifacts.
| path | repo | role |
|---|---|---|
eval-omarchy/ |
opencharly/eval-omarchy | omarchy PR evaluation: check beds + eval results |
omarchy-eval-artifacts/ |
opencharly/omarchy-eval-artifacts | omarchy PR evaluation artifacts (screenshots, GIFs, run logs) |
15 repos — check-bed and plugin fixture layers.
| path | repo | role |
|---|---|---|
layer-check-base-layer/ |
opencharly/layer-check-base-layer | image layer / candy |
layer-check-builder-npm/ |
opencharly/layer-check-builder-npm | image layer / candy |
layer-check-composition-layer/ |
opencharly/layer-check-composition-layer | image layer / candy |
layer-check-cross-local-driver-layer/ |
opencharly/layer-check-cross-local-driver-layer | image layer / candy |
layer-check-group-layer/ |
opencharly/layer-check-group-layer | image layer / candy |
layer-check-local-layer/ |
opencharly/layer-check-local-layer | The check-local-layer candy — kind:local check fixture (extracted from charly/candy) |
layer-check-retention-fixture/ |
opencharly/layer-check-retention-fixture | image layer / candy |
layer-check-stack-layer/ |
opencharly/layer-check-stack-layer | The check-stack-layer candy — stack check fixture (extracted from charly/candy) |
layer-check-structkind-layer/ |
opencharly/layer-check-structkind-layer | image layer / candy |
layer-check-substrate-layer/ |
opencharly/layer-check-substrate-layer | image layer / candy |
layer-check-tier1-layer/ |
opencharly/layer-check-tier1-layer | image layer / candy |
layer-examplebuilder-consumer/ |
opencharly/layer-examplebuilder-consumer | image layer / candy |
layer-examplestep-consumer/ |
opencharly/layer-examplestep-consumer | The examplestep-consumer fixture — build-context plugin-execution consumer (extracted from charly/candy) |
layer-examplestep-deploy-consumer/ |
opencharly/layer-examplestep-deploy-consumer | The examplestep-deploy-consumer fixture — deploy-context plugin-execution consumer (extracted from charly/can… |
layer-stepkind-build-consumer/ |
opencharly/layer-stepkind-build-consumer | The stepkind-build-consumer fixture — class:step build-emit consumer (extracted from charly/candy) |
144 repos.
| path | repo | role |
|---|---|---|
layer-a11y-tools/ |
opencharly/layer-a11y-tools | image layer / candy |
layer-agent-forwarding/ |
opencharly/layer-agent-forwarding | image layer / candy |
layer-agentteams/ |
opencharly/layer-agentteams | image layer / candy |
layer-agentteams-cli/ |
opencharly/layer-agentteams-cli | image layer / candy |
layer-agentteams-openclaw/ |
opencharly/layer-agentteams-openclaw | image layer / candy |
layer-agentteams-snapshot/ |
opencharly/layer-agentteams-snapshot | image layer / candy |
layer-android-apidemos/ |
opencharly/layer-android-apidemos | image layer / candy |
layer-android-sdk/ |
opencharly/layer-android-sdk | image layer / candy |
layer-android-test-apps/ |
opencharly/layer-android-test-apps | image layer / candy |
layer-asciinema/ |
opencharly/layer-asciinema | image layer / candy |
layer-blogwatcher/ |
opencharly/layer-blogwatcher | image layer / candy |
layer-build-toolchain/ |
opencharly/layer-build-toolchain | image layer / candy |
layer-cachyos-extras/ |
opencharly/layer-cachyos-extras | image layer / candy |
layer-camsnap/ |
opencharly/layer-camsnap | image layer / candy |
layer-charly/ |
opencharly/layer-charly | The charly meta-candy — the full charly toolchain layer (extracted from charly/candy) |
layer-chrome/ |
opencharly/layer-chrome | charly candy: layer-chrome (standalone repo of the candy de-submodule cutover) |
layer-chrome-sway/ |
opencharly/layer-chrome-sway | image layer / candy |
layer-claude-code/ |
opencharly/layer-claude-code | image layer / candy |
layer-clawhub/ |
opencharly/layer-clawhub | image layer / candy |
layer-codex/ |
opencharly/layer-codex | image layer / candy |
layer-container-nesting/ |
opencharly/layer-container-nesting | image layer / candy |
layer-crabbox/ |
opencharly/layer-crabbox | image layer / candy |
layer-cstream-desktop/ |
opencharly/layer-cstream-desktop | charly metalayer: the full cstream streaming desktop — pod-cstream + pod-hyprland + fixings |
layer-cua/ |
opencharly/layer-cua | image layer / candy: the Cua computer-use candies |
layer-cuda/ |
opencharly/layer-cuda | charly candy: layer-cuda (standalone repo of the candy de-submodule cutover) |
layer-cue/ |
opencharly/layer-cue | image layer / candy |
layer-debootstrap-builder/ |
opencharly/layer-debootstrap-builder | image layer / candy |
layer-debug-tools/ |
opencharly/layer-debug-tools | image layer / candy |
layer-desktop-fonts/ |
opencharly/layer-desktop-fonts | image layer / candy |
layer-desktop-media/ |
opencharly/layer-desktop-media | image layer / candy |
layer-dev-tools/ |
opencharly/layer-dev-tools | image layer / candy |
layer-devops-tools/ |
opencharly/layer-devops-tools | image layer / candy |
layer-direnv/ |
opencharly/layer-direnv | image layer / candy |
layer-docker-ce/ |
opencharly/layer-docker-ce | image layer / candy |
layer-docs-site/ |
opencharly/layer-docs-site | image layer / candy |
layer-fastfetch/ |
opencharly/layer-fastfetch | image layer / candy |
layer-ffmpeg/ |
opencharly/layer-ffmpeg | charly candy: layer-ffmpeg (standalone repo of the candy de-submodule cutover) |
layer-fonts-extended/ |
opencharly/layer-fonts-extended | image layer / candy |
layer-forgecode/ |
opencharly/layer-forgecode | image layer / candy |
layer-gemini/ |
opencharly/layer-gemini | charly candy: layer-gemini (standalone repo of the candy de-submodule cutover) |
layer-gh/ |
opencharly/layer-gh | image layer / candy |
layer-gifgrep/ |
opencharly/layer-gifgrep | image layer / candy |
layer-github-actions/ |
opencharly/layer-github-actions | image layer / candy |
layer-gnupg/ |
opencharly/layer-gnupg | image layer / candy |
layer-gocryptfs/ |
opencharly/layer-gocryptfs | image layer / candy |
layer-gogcli/ |
opencharly/layer-gogcli | image layer / candy |
layer-golang/ |
opencharly/layer-golang | charly candy: layer-golang (standalone repo of the candy de-submodule cutover) |
layer-google-cloud/ |
opencharly/layer-google-cloud | image layer / candy |
layer-google-cloud-npm/ |
opencharly/layer-google-cloud-npm | image layer / candy |
layer-goplaces/ |
opencharly/layer-goplaces | image layer / candy |
layer-grafana-tools/ |
opencharly/layer-grafana-tools | image layer / candy |
layer-gst-wayland-display/ |
opencharly/layer-gst-wayland-display | charly candy building gst-wayland-display — the Smithay compositor packaged as the GStreamer source waylanddi… |
layer-helm-chart/ |
opencharly/layer-helm-chart | image layer / candy |
layer-hermes-playwright/ |
opencharly/layer-hermes-playwright | image layer / candy |
layer-heroic/ |
opencharly/layer-heroic | image layer / candy |
layer-himalaya/ |
opencharly/layer-himalaya | image layer / candy |
layer-java-openjdk/ |
opencharly/layer-java-openjdk | image layer / candy |
layer-jupyter-mcp/ |
opencharly/layer-jupyter-mcp | image layer / candy |
layer-k3s/ |
opencharly/layer-k3s | image layer / candy |
layer-k3s-kernel/ |
opencharly/layer-k3s-kernel | image layer / candy |
layer-kde-shell/ |
opencharly/layer-kde-shell | image layer / candy |
layer-keepassxc/ |
opencharly/layer-keepassxc | image layer / candy |
layer-kimi/ |
opencharly/layer-kimi | image layer / candy |
layer-kind/ |
opencharly/layer-kind | image layer / candy |
layer-kubernetes/ |
opencharly/layer-kubernetes | image layer / candy |
layer-kubevirt/ |
opencharly/layer-kubevirt | virtctl CLI (the KubeVirt client) at a stable path — installs the pinned virtctl release binary for driving a KubeVirt cluster. |
layer-kubevirt-operator/ |
opencharly/layer-kubevirt-operator | KubeVirt + CDI platform install: applies the pinned KubeVirt operator + CR and the CDI operator + CR to a Kubernetes cluster, then waits for the CRs Available. |
layer-language-runtimes/ |
opencharly/layer-language-runtimes | image layer / candy |
layer-libnotify/ |
opencharly/layer-libnotify | image layer / candy |
layer-llama-cpp/ |
opencharly/layer-llama-cpp | image layer / candy |
layer-maplibre-versatiles-styler/ |
opencharly/layer-maplibre-versatiles-styler | image layer / candy |
layer-mcporter/ |
opencharly/layer-mcporter | image layer / candy |
layer-nano-pdf/ |
opencharly/layer-nano-pdf | image layer / candy |
layer-nerdctl/ |
opencharly/layer-nerdctl | image layer / candy: the containerd engine stack (nerdctl CLI + buildkit + CNI) |
layer-nodejs/ |
opencharly/layer-nodejs | charly candy: layer-nodejs (standalone repo of the candy de-submodule cutover) |
layer-notebook-finetuning/ |
opencharly/layer-notebook-finetuning | image layer / candy |
layer-notebook-graph/ |
opencharly/layer-notebook-graph | image layer / candy |
layer-notebook-llm-on-supercomputers/ |
opencharly/layer-notebook-llm-on-supercomputers | image layer / candy |
layer-notebook-ollama/ |
opencharly/layer-notebook-ollama | image layer / candy |
layer-notebook-openrouter/ |
opencharly/layer-notebook-openrouter | image layer / candy |
layer-notebook-osm/ |
opencharly/layer-notebook-osm | image layer / candy |
layer-notebook-templates/ |
opencharly/layer-notebook-templates | image layer / candy |
layer-nvenc-headers/ |
opencharly/layer-nvenc-headers | image layer / candy |
layer-nvidia/ |
opencharly/layer-nvidia | charly candy: layer-nvidia (standalone repo of the candy de-submodule cutover) |
layer-ollama-cuda/ |
opencharly/layer-ollama-cuda | image layer / candy |
layer-ollama-rocm/ |
opencharly/layer-ollama-rocm | image layer / candy |
layer-openclaw/ |
opencharly/layer-openclaw | product family (box + candy + beds + skills) |
layer-oracle/ |
opencharly/layer-oracle | image layer / candy |
layer-ordercli/ |
opencharly/layer-ordercli | image layer / candy |
layer-pacstrap-builder/ |
opencharly/layer-pacstrap-builder | image layer / candy |
layer-pavucontrol/ |
opencharly/layer-pavucontrol | image layer / candy |
layer-pi-agent/ |
opencharly/layer-pi-agent | image layer / candy |
layer-pixi/ |
opencharly/layer-pixi | image layer / candy |
layer-playwright/ |
opencharly/layer-playwright | image layer / candy |
layer-pod-addcandy-marker/ |
opencharly/layer-pod-addcandy-marker | image layer / candy |
layer-pre-commit/ |
opencharly/layer-pre-commit | image layer / candy |
layer-punktfunk/ |
opencharly/layer-punktfunk | Punktfunk streaming host candy — punktfunk/1 QUIC host daemon, web console and plugin runner from unom's sign… |
layer-punktfunk-client/ |
opencharly/layer-punktfunk-client | The punktfunk streaming CLIENT — punktfunk-client and its headless punktfunk CLI, installed from unom's signe… |
layer-python/ |
opencharly/layer-python | charly candy: layer-python (standalone repo of the candy de-submodule cutover) |
layer-python-ml/ |
opencharly/layer-python-ml | image layer / candy |
layer-qdrant/ |
opencharly/layer-qdrant | charly candy: the Qdrant vector-search service layer — pinned static-musl binary, supervisord REST 6333 + gRPC 6334, ~/.qdrant volume, admin API-key auth from the credential store |
layer-ripgrep/ |
opencharly/layer-ripgrep | charly candy: ripgrep (standalone repo of the candy de-submodule cutover) |
layer-rocm/ |
opencharly/layer-rocm | image layer / candy |
layer-rpmfusion/ |
opencharly/layer-rpmfusion | image layer / candy |
layer-rust/ |
opencharly/layer-rust | image layer / candy |
layer-sag/ |
opencharly/layer-sag | image layer / candy |
layer-selkies-kde-desktop/ |
opencharly/layer-selkies-kde-desktop | image layer / candy |
layer-sherpa-onnx/ |
opencharly/layer-sherpa-onnx | image layer / candy |
layer-shortbread/ |
opencharly/layer-shortbread | image layer / candy |
layer-socat/ |
opencharly/layer-socat | charly candy: layer-socat (standalone repo of the candy de-submodule cutover) |
layer-songsee/ |
opencharly/layer-songsee | image layer / candy |
layer-sqlite/ |
opencharly/layer-sqlite | image layer / candy |
layer-ssh-client/ |
opencharly/layer-ssh-client | image layer / candy |
layer-steam/ |
opencharly/layer-steam | image layer / candy |
layer-strata/ |
opencharly/layer-strata | The strata candy + box/strata — Qwen3.8-Flash-Next on one consumer NVIDIA card, OpenAI/Anthropic/Responses-compatible API on :8080 |
layer-summarize/ |
opencharly/layer-summarize | image layer / candy |
layer-supervisord/ |
opencharly/layer-supervisord | charly candy: layer-supervisord (standalone repo of the candy de-submodule cutover) |
layer-sway-desktop/ |
opencharly/layer-sway-desktop | image layer / candy |
layer-sway-desktop-vnc/ |
opencharly/layer-sway-desktop-vnc | image layer / candy |
layer-tailscale/ |
opencharly/layer-tailscale | image layer / candy |
layer-tailscale-up/ |
opencharly/layer-tailscale-up | image layer / candy |
layer-thunar/ |
opencharly/layer-thunar | image layer / candy |
layer-tmux/ |
opencharly/layer-tmux | charly candy: layer-tmux (standalone repo of the candy de-submodule cutover) |
layer-typst/ |
opencharly/layer-typst | image layer / candy |
layer-unsloth/ |
opencharly/layer-unsloth | image layer / candy |
layer-uv/ |
opencharly/layer-uv | image layer / candy |
layer-vectorchord/ |
opencharly/layer-vectorchord | image layer / candy |
layer-versatiles-fonts/ |
opencharly/layer-versatiles-fonts | image layer / candy |
layer-versatiles-style/ |
opencharly/layer-versatiles-style | image layer / candy |
layer-vscode/ |
opencharly/layer-vscode | image layer / candy |
layer-wacli/ |
opencharly/layer-wacli | image layer / candy |
layer-wf-recorder/ |
opencharly/layer-wf-recorder | image layer / candy |
layer-whisper/ |
opencharly/layer-whisper | image layer / candy |
layer-wl-overlay/ |
opencharly/layer-wl-overlay | image layer / candy |
layer-wl-record-pixelflux/ |
opencharly/layer-wl-record-pixelflux | image layer / candy |
layer-wl-screenshot-grim/ |
opencharly/layer-wl-screenshot-grim | image layer / candy |
layer-wl-screenshot-pixelflux/ |
opencharly/layer-wl-screenshot-pixelflux | image layer / candy |
layer-wl-tools/ |
opencharly/layer-wl-tools | image layer / candy |
layer-workspace-mount/ |
opencharly/layer-workspace-mount | image layer / candy |
layer-xdg-portal/ |
opencharly/layer-xdg-portal | image layer / candy |
layer-xfce4-terminal/ |
opencharly/layer-xfce4-terminal | image layer / candy |
layer-xterm/ |
opencharly/layer-xterm | image layer / candy |
layer-xurl/ |
opencharly/layer-xurl | image layer / candy |
layer-yay/ |
opencharly/layer-yay | image layer / candy |
120 repos — charly plugin candies. Their providers: blocks register the kinds,
deploys, verbs, steps, builds, builders, commands, engines, loaders, refs,
agent runtimes and terminals charly speaks.
| path | repo | role |
|---|---|---|
charly-registry/ |
opencharly/charly-registry | charly plugin: the charly registry command — the local OCI image cache and the command:registry word (an in-process OCI registry over the shared cache; the registry-based delivery surface for pod, VM and Kubernetes) |
plugin-adb/ |
opencharly/plugin-adb | charly plugin |
plugin-addr/ |
opencharly/plugin-addr | charly plugin |
plugin-agent/ |
opencharly/plugin-agent | charly plugin |
plugin-agent-pi/ |
opencharly/plugin-agent-pi | charly plugin |
plugin-agentteams/ |
opencharly/plugin-agentteams | charly plugin |
plugin-alias/ |
opencharly/plugin-alias | charly plugin |
plugin-appium/ |
opencharly/plugin-appium | charly plugin |
plugin-authoring/ |
opencharly/plugin-authoring | charly plugin |
plugin-boot-kind/ |
opencharly/plugin-boot-kind | charly plugin: the bootloader and snapshot kinds |
plugin-box/ |
opencharly/plugin-box | charly plugin |
plugin-bpf/ |
opencharly/plugin-bpf | charly generic eBPF/BPF kernel plugin — command:bpf (status/lsm/config/probe) + verb:bpf check steps |
plugin-build/ |
opencharly/plugin-build | charly plugin |
plugin-builder/ |
opencharly/plugin-builder | charly plugin |
plugin-builder-aur/ |
opencharly/plugin-builder-aur | charly plugin |
plugin-builder-cargo/ |
opencharly/plugin-builder-cargo | charly plugin |
plugin-builder-npm/ |
opencharly/plugin-builder-npm | charly plugin |
plugin-builder-pixi/ |
opencharly/plugin-builder-pixi | charly plugin |
plugin-cache/ |
opencharly/plugin-cache | charly plugin: the `charly cache status |
plugin-candy/ |
opencharly/plugin-candy | charly plugin |
plugin-candy-kind/ |
opencharly/plugin-candy-kind | charly plugin |
plugin-cardwire/ |
opencharly/plugin-cardwire | charly plugin: cardwire (eBPF LSM GPU manager) — install + command:cardwire CLI |
plugin-cdp/ |
opencharly/plugin-cdp | charly plugin |
plugin-check/ |
opencharly/plugin-check | charly plugin |
plugin-clean/ |
opencharly/plugin-clean | charly plugin |
plugin-cmd/ |
opencharly/plugin-cmd | charly plugin |
plugin-command/ |
opencharly/plugin-command | charly plugin |
plugin-crabbox/ |
opencharly/plugin-crabbox | charly plugin |
plugin-cstream/ |
opencharly/plugin-cstream | charly plugin serving the cstream: check verb — session/login/frame/stats probes for charly-streamer deployme… |
plugin-cua/ |
opencharly/plugin-cua | charly plugin: verb:cua + kind:cua (the Cua computer-use provider) |
plugin-dbus/ |
opencharly/plugin-dbus | charly plugin |
plugin-deploy-local/ |
opencharly/plugin-deploy-local | charly plugin |
plugin-deploy-pod/ |
opencharly/plugin-deploy-pod | charly plugin |
plugin-deploy-vm/ |
opencharly/plugin-deploy-vm | charly plugin |
plugin-desktop-kind/ |
opencharly/plugin-desktop-kind | charly plugin: the theme, session, displaymanager and desktopentry kinds |
plugin-distro/ |
opencharly/plugin-distro | charly plugin |
plugin-dns/ |
opencharly/plugin-dns | charly plugin |
plugin-docs/ |
opencharly/plugin-docs | charly plugin |
plugin-doctor/ |
opencharly/plugin-doctor | charly plugin |
plugin-dsh/ |
opencharly/plugin-dsh | charly plugin |
plugin-egress/ |
opencharly/plugin-egress | charly plugin |
plugin-enc/ |
opencharly/plugin-enc | charly plugin |
plugin-example/ |
opencharly/plugin-example | charly plugin |
plugin-example-bootstrap/ |
opencharly/plugin-example-bootstrap | charly plugin |
plugin-example-builder/ |
opencharly/plugin-example-builder | charly plugin |
plugin-example-command/ |
opencharly/plugin-example-command | charly plugin |
plugin-example-deploy/ |
opencharly/plugin-example-deploy | charly plugin |
plugin-example-dispatch/ |
opencharly/plugin-example-dispatch | charly plugin |
plugin-example-external/ |
opencharly/plugin-example-external | charly plugin |
plugin-example-kind/ |
opencharly/plugin-example-kind | charly plugin |
plugin-example-lifecycle/ |
opencharly/plugin-example-lifecycle | charly plugin |
plugin-example-require/ |
opencharly/plugin-example-require | charly plugin |
plugin-example-step/ |
opencharly/plugin-example-step | charly plugin |
plugin-example-stepkind/ |
opencharly/plugin-example-stepkind | charly plugin |
plugin-example-structkind/ |
opencharly/plugin-example-structkind | charly plugin |
plugin-examplerunverb/ |
opencharly/plugin-examplerunverb | charly plugin |
plugin-feature/ |
opencharly/plugin-feature | charly plugin |
plugin-file/ |
opencharly/plugin-file | charly plugin |
plugin-fleet/ |
opencharly/plugin-fleet | charly plugin |
plugin-gh/ |
opencharly/plugin-gh | The canonical GitHub surface for opencharly plugins — verb:gh + command:gh + the ghkit client (one gh implementation, zero hand-rolled subprocesses) |
plugin-gpu/ |
opencharly/plugin-gpu | charly plugin |
plugin-harness-kind/ |
opencharly/plugin-harness-kind | charly plugin |
plugin-helm/ |
opencharly/plugin-helm | charly plugin |
plugin-herdr/ |
opencharly/plugin-herdr | charly plugin: command:herdr + verb:herdr — control a Herdr terminal-multiplexer session over its NDJSON socket API |
plugin-http/ |
opencharly/plugin-http | charly plugin |
plugin-init/ |
opencharly/plugin-init | charly plugin |
plugin-installstep/ |
opencharly/plugin-installstep | charly plugin |
plugin-interface/ |
opencharly/plugin-interface | charly plugin |
plugin-jetkvm/ |
opencharly/plugin-jetkvm | charly plugin: the jetkvm: IP-KVM verb — drive a JetKVM device (WebRTC/JSON-RPC/HID) from a charly plan without a browser |
plugin-k8sgen/ |
opencharly/plugin-k8sgen | charly plugin |
plugin-kernel-param/ |
opencharly/plugin-kernel-param | charly plugin |
plugin-kube/ |
opencharly/plugin-kube | charly plugin |
plugin-kubevirt/ |
opencharly/plugin-kubevirt | OUT-OF-TREE charly plugin owning ALL KubeVirt interaction: the kind:kubevirt substrate, the deploy:kubevirt venue lifecycle, the kubevirt: check verb, and the charly kubevirt CLI. |
plugin-loader/ |
opencharly/plugin-loader | charly plugin |
plugin-lobster/ |
opencharly/plugin-lobster | charly plugin: the native lobster workflow engine — workflow:lobster (workflow-run/resume/schedule/emit) + command:lobster (the .lobster importer/exporter and doctor), plus the systemd-user timer scheduler |
plugin-marketplace/ |
opencharly/plugin-marketplace | charly plugin |
plugin-matching/ |
opencharly/plugin-matching | charly plugin |
plugin-mcp/ |
opencharly/plugin-mcp | charly plugin |
plugin-media/ |
opencharly/plugin-media | charly plugin: the transcode pipeline verb — host-side MJPEG → H.264 MP4 transcoding |
plugin-migrate/ |
opencharly/plugin-migrate | charly plugin |
plugin-mise/ |
opencharly/plugin-mise | charly plugin: builder:mise + verb:mise — full mise (jdx/mise) support |
plugin-mount/ |
opencharly/plugin-mount | charly plugin |
plugin-nerdctl/ |
opencharly/plugin-nerdctl | charly plugin: engine:containerd — the containerd engine provider (the nerdctl CLI drives it) |
plugin-oci/ |
opencharly/plugin-oci | charly plugin |
plugin-ollama/ |
opencharly/plugin-ollama | charly plugin |
plugin-omarchy/ |
opencharly/plugin-omarchy | charly plugin: the omarchy CLI surface as a check verb |
plugin-openclaw/ |
opencharly/plugin-openclaw | charly plugin |
plugin-package/ |
opencharly/plugin-package | charly plugin |
plugin-pipeline/ |
opencharly/plugin-pipeline | charly plugin: the generic agent/workflow engine — the bare agent runtime, the plan executor, the kind:pipeline entity |
plugin-pod/ |
opencharly/plugin-pod | charly plugin |
plugin-port/ |
opencharly/plugin-port | charly plugin |
plugin-preempt/ |
opencharly/plugin-preempt | charly plugin |
plugin-process/ |
opencharly/plugin-process | charly plugin |
plugin-punktfunk/ |
opencharly/plugin-punktfunk | OUT-OF-TREE charly plugin serving the punktfunk: check verb — probe and manage a punktfunk streaming host ove… |
plugin-qdrant/ |
opencharly/plugin-qdrant | OUT-OF-TREE charly plugin serving the qdrant: check verb + the charly qdrant CLI, driving the official Go client (gRPC 6334) |
plugin-quickshell/ |
opencharly/plugin-quickshell | The quickshell: check verb — IPC against any Quickshell desktop shell |
plugin-record/ |
opencharly/plugin-record | charly plugin |
plugin-refs/ |
opencharly/plugin-refs | charly plugin |
plugin-resource/ |
opencharly/plugin-resource | charly plugin |
plugin-review/ |
opencharly/plugin-review | charly plugin: read-only GitHub PR review — deterministic verb:pr tools + command:review |
plugin-secrets/ |
opencharly/plugin-secrets | charly plugin |
plugin-service/ |
opencharly/plugin-service | charly plugin |
plugin-settings/ |
opencharly/plugin-settings | charly plugin |
plugin-sidecar/ |
opencharly/plugin-sidecar | charly plugin |
plugin-spice/ |
opencharly/plugin-spice | charly plugin |
plugin-ssh/ |
opencharly/plugin-ssh | charly plugin |
plugin-status/ |
opencharly/plugin-status | charly plugin |
plugin-strata/ |
opencharly/plugin-strata | The charly strata management CLI — read-only inspection of a deployed Strata engine |
plugin-substrate/ |
opencharly/plugin-substrate | charly plugin |
plugin-task/ |
opencharly/plugin-task | Generic declarative task runner for charly — kind:task entities + command:task + verb:task |
plugin-tmux/ |
opencharly/plugin-tmux | charly plugin |
plugin-tunnel/ |
opencharly/plugin-tunnel | charly plugin |
plugin-udev/ |
opencharly/plugin-udev | charly plugin |
plugin-unit/ |
opencharly/plugin-unit | charly plugin serving the unit: act/assert verb — declarative init-unit authoring (.socket/.target/.slice/dro… |
plugin-unix-group/ |
opencharly/plugin-unix-group | charly plugin |
plugin-user/ |
opencharly/plugin-user | charly plugin |
plugin-vision/ |
opencharly/plugin-vision | The vision: check verb — validate a screenshot by sending it directly to an OpenAI-compatible vision endpoint from charly |
plugin-vm/ |
opencharly/plugin-vm | charly plugin |
plugin-vnc/ |
opencharly/plugin-vnc | charly plugin |
plugin-wl/ |
opencharly/plugin-wl | charly plugin |
72 repos — pod/deployment bundles.
| path | repo | role |
|---|---|---|
pod-agentteams-controller/ |
opencharly/pod-agentteams-controller | pod / deployment bundle |
pod-agentteams-element/ |
opencharly/pod-agentteams-element | pod / deployment bundle |
pod-agentteams-higress/ |
opencharly/pod-agentteams-higress | pod / deployment bundle |
pod-agentteams-manager/ |
opencharly/pod-agentteams-manager | pod / deployment bundle |
pod-agentteams-matrix/ |
opencharly/pod-agentteams-matrix | pod / deployment bundle |
pod-agentteams-minio/ |
opencharly/pod-agentteams-minio | pod / deployment bundle |
pod-agentteams-worker/ |
opencharly/pod-agentteams-worker | pod / deployment bundle |
pod-airflow/ |
opencharly/pod-airflow | pod / deployment bundle |
pod-android-emulator-layer/ |
opencharly/pod-android-emulator-layer | pod / deployment bundle |
pod-appium-server/ |
opencharly/pod-appium-server | pod / deployment bundle |
pod-charly-hooks/ |
opencharly/pod-charly-hooks | pod / deployment bundle |
pod-charly-mcp/ |
opencharly/pod-charly-mcp | The charly-mcp candy — the charly MCP gateway pod (extracted from charly/candy) |
pod-charly-versa/ |
opencharly/pod-charly-versa | pod / deployment bundle |
pod-check-keepalive/ |
opencharly/pod-check-keepalive | pod / deployment bundle |
pod-check-redis-init-layer/ |
opencharly/pod-check-redis-init-layer | pod / deployment bundle |
pod-check-tier23-layer/ |
opencharly/pod-check-tier23-layer | pod / deployment bundle |
pod-chrome-cdp/ |
opencharly/pod-chrome-cdp | charly candy: pod-chrome-cdp (standalone repo of the candy de-submodule cutover) |
pod-chrome-devtools-mcp/ |
opencharly/pod-chrome-devtools-mcp | pod / deployment bundle |
pod-chrome-headless/ |
opencharly/pod-chrome-headless | pod / deployment bundle |
pod-cloud-init/ |
opencharly/pod-cloud-init | pod / deployment bundle |
pod-comfyui/ |
opencharly/pod-comfyui | pod / deployment bundle |
pod-crabbox-coordinator/ |
opencharly/pod-crabbox-coordinator | pod / deployment bundle |
pod-cstream/ |
opencharly/pod-cstream | charly candy: the charly-streamer transport spine — streamer/gateway/broker/leader services, PAM stack, PipeW… |
pod-dbus/ |
opencharly/pod-dbus | charly candy: pod-dbus (standalone repo of the candy de-submodule cutover) |
pod-dsh/ |
opencharly/pod-dsh | pod / deployment bundle |
pod-filebrowser/ |
opencharly/pod-filebrowser | pod / deployment bundle |
pod-github-runner/ |
opencharly/pod-github-runner | pod / deployment bundle |
pod-herdr/ |
opencharly/pod-herdr | pod / deployment bundle — the herdr stack box + check-herdr-pod R10 bed |
pod-hermes/ |
opencharly/pod-hermes | pod / deployment bundle |
pod-hermes-full/ |
opencharly/pod-hermes-full | pod / deployment bundle |
pod-hyprland/ |
opencharly/pod-hyprland | charly candy: Hyprland as a nested compositor inside charly-streamer's Wayland parent |
pod-immich/ |
opencharly/pod-immich | pod / deployment bundle |
pod-immich-ml/ |
opencharly/pod-immich-ml | pod / deployment bundle |
pod-jupyter/ |
opencharly/pod-jupyter | pod / deployment bundle |
pod-jupyter-ml/ |
opencharly/pod-jupyter-ml | pod / deployment bundle |
pod-k8s-layer/ |
opencharly/pod-k8s-layer | pod / deployment bundle |
pod-kde-desktop/ |
opencharly/pod-kde-desktop | pod / deployment bundle |
pod-kde-selkies/ |
opencharly/pod-kde-selkies | pod / deployment bundle |
pod-labwc/ |
opencharly/pod-labwc | pod / deployment bundle |
pod-maputnik/ |
opencharly/pod-maputnik | pod / deployment bundle |
pod-marimo/ |
opencharly/pod-marimo | pod / deployment bundle |
pod-mcp-layer/ |
opencharly/pod-mcp-layer | pod / deployment bundle |
pod-nested-podman-socket/ |
opencharly/pod-nested-podman-socket | pod / deployment bundle |
pod-ollama/ |
opencharly/pod-ollama | pod / deployment bundle |
pod-openwebui/ |
opencharly/pod-openwebui | pod / deployment bundle |
pod-os-layer/ |
opencharly/pod-os-layer | pod / deployment bundle |
pod-osm-tools/ |
opencharly/pod-osm-tools | pod / deployment bundle |
pod-pipewire/ |
opencharly/pod-pipewire | charly candy: pod-pipewire (standalone repo of the candy de-submodule cutover) |
pod-pmtiles-viewer/ |
opencharly/pod-pmtiles-viewer | pod / deployment bundle |
pod-postgresql/ |
opencharly/pod-postgresql | pod / deployment bundle |
pod-qdrant/ |
opencharly/pod-qdrant | pod / deployment bundle — the qdrant box + check-qdrant-pod R10 bed |
pod-qemu-guest-agent/ |
opencharly/pod-qemu-guest-agent | pod / deployment bundle |
pod-redis/ |
opencharly/pod-redis | pod / deployment bundle |
pod-redis-client-layer/ |
opencharly/pod-redis-client-layer | pod / deployment bundle |
pod-redis-server-layer/ |
opencharly/pod-redis-server-layer | pod / deployment bundle |
pod-selkies/ |
opencharly/pod-selkies | charly candy: pod-selkies (standalone repo of the candy de-submodule cutover) |
pod-selkies-core/ |
opencharly/pod-selkies-core | pod / deployment bundle |
pod-selkies-desktop/ |
opencharly/pod-selkies-desktop | pod / deployment bundle |
pod-sshd/ |
opencharly/pod-sshd | pod / deployment bundle |
pod-sway/ |
opencharly/pod-sway | charly candy: pod-sway (standalone repo of the candy de-submodule cutover) |
pod-swaync/ |
opencharly/pod-swaync | pod / deployment bundle |
pod-testapi/ |
opencharly/pod-testapi | pod / deployment bundle |
pod-traefik/ |
opencharly/pod-traefik | pod / deployment bundle |
pod-unsloth-studio/ |
opencharly/pod-unsloth-studio | pod / deployment bundle |
pod-valkey/ |
opencharly/pod-valkey | pod / deployment bundle |
pod-versatiles/ |
opencharly/pod-versatiles | pod / deployment bundle |
pod-versatiles-frontend/ |
opencharly/pod-versatiles-frontend | pod / deployment bundle |
pod-virtualization/ |
opencharly/pod-virtualization | pod / deployment bundle |
pod-waybar/ |
opencharly/pod-waybar | pod / deployment bundle |
pod-waybar-labwc/ |
opencharly/pod-waybar-labwc | pod / deployment bundle |
pod-wayvnc/ |
opencharly/pod-wayvnc | pod / deployment bundle |
pod-web-layer/ |
opencharly/pod-web-layer | pod / deployment bundle |
2 repos.
| path | repo | role |
|---|---|---|
vm-k3s-agent/ |
opencharly/vm-k3s-agent | VM image definition |
vm-k3s-server/ |
opencharly/vm-k3s-server | VM image definition |
Every submodule is pinned to a specific commit (a gitlink), and currency answers whether the
whole org is a single coherent snapshot:
charlytracks its own default branch — the pin is themaincommit the lastsyncrecorded.- every
distro-*follows exactly the commit charly's own gitlinks pin (charly'sbox/<distro>↔ this repo'sdistro-<distro>), so the umbrella means "the org exactly as charly sees it". sdkandspecare pinned the same way, at their own default branch's HEAD.- every other repo follows its own default-branch HEAD.
This umbrella's .gitmodules records branch = <repo default> on all of its entries,
so a future default-branch rename keeps working. The pins are advanced with
charly task sync (the pin-contract bump — it advances EVERY pin this repo declares),
run by hand and landed through the org's PR-only validation chain, which opens a PR and
never pushes to the default branch. There is no scheduled workflow; charly task sync
is the one path that moves a pin.
A pin is a gitlink — the recorded commit, checked out detached and clean — and
charly task verify asserts exactly that. A dangling pin is a failure.
The pins move only through the pin contract, and three different questions have three different answers. Ask the right one:
| question | command | what it answers |
|---|---|---|
| where is each repo pinned? | charly task map |
the state — every submodule with its pin and sync state |
| does this tree agree with itself? | charly task verify |
the consistency — every checkout sits at the gitlink the index records, and every pin's branch is its remote's default branch — plus a report of the currency below, which never fails the gate |
| is the org current with its upstreams? | charly task pins --param MODE=currency |
the currency — every pin against the ref its intent names, judged from the index and the remote, never from a checkout |
verify being green does not mean the org is current: a tree can be perfectly
consistent while every pin is behind what its repo serves. So the gate names the
pins that are not current — currency asks that other question, and when a pin waits
on its source it names the producer leg instead of leaving you to discover it an hour
later. A pin that is behind is an advance available NOW, in its producer's own repo, so
the gate reports it and stays green; only a pin the workflow cannot judge, or two sides
that disagree, fails it.
The sanctioned catch-up is one sequence, and it is the only one that moves a pin:
charly task sync # the pin-contract bump — it advances EVERY pin this repo declares, in the index; it commits nothing
charly task init # materialize the paths the wave advanced, AT their new pins
charly task verify # judge the tree against the pins it records
# …then land the pin wave as a PR through the org's validation chainOn a tree that was never materialized, the materialization comes first — the project
cannot load before its import: paths exist, so the wave's own first verb would not run.
bash scripts/init-submodules.sh is that step (see Start developing); the sequence above
follows it unchanged.
A wave needs no full set: the bump advances a path with no checkout in the index
— a leaf to the tip its remote serves for its branch=, an edge to the twin the source's
tree records — and a path with a checkout is still rolled in that checkout, so the two
keep agreeing. It still fails loud for every path it cannot advance: a sync over a
tree it could not fully advance must never report success. That is why the order is
sync → init → verify — the sync writes the pins, the init materializes the checkouts
at those pins, and the verify judges them. The daily tree stays light, and so does a
wave. A repo you merely want to work on is one
CHARLY_INIT_PATHS=<repo> charly task init away.
Never catch up by hand. A pin is advanced by charly task sync and lands as a PR.
It is never hand-edited in the index, never re-pointed at a branch tip, and never
"fixed" by checking out a newer commit inside the submodule: the pin is the index
entry, and the checkout follows it.
MIT — see LICENSE. Each submodule is governed by its own repository's license.