core/skills/start/SKILL.md
Start a container as a background service. MUST be invoked before any work involving: charly start command, launching containers, quadlet vs direct mode startup, or encrypted volume auto-mounting.
npx skillsauth add overthinkos/overthink-plugins startInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Start a container image as a background service. In quadlet mode, charly config <image> MUST be run first to generate the systemd quadlet unit. In direct mode, start creates an ephemeral container directly.
Relationship to charly deploy add — charly start <image> is the ergonomic wrapper for charly deploy add <image> <image> (container target). New scripts should prefer charly deploy add <name> <ref> directly when they need explicit deploy names, --add-candy overlays, or the host target. charly start covers the common single-image case and is retained for backwards compatibility. See /charly-core:deploy for the unified command family and /charly-local:local-deploy for the host target.
| Action | Command | Description |
|--------|---------|-------------|
| Start (quadlet) | charly start <image> | Start via systemd quadlet unit |
| Start (direct) | charly start <image> | Create ephemeral container (when run_mode=direct) |
| With specific tag | charly start <image> --tag TAG | Use specific image tag |
| Build first | charly start <image> --build | Build image before starting |
| Named instance | charly start <image> -i INSTANCE | Start a named instance |
| Action | Flag | Description |
|--------|------|-------------|
| Bind volume | --bind name=path | Override volume backing for session |
| Volume config | -v name:type[:path] | Configure volume backing |
| Environment | -e KEY=VALUE | Set environment variable |
| Env file | --env-file PATH | Load environment from file |
| Port mapping | -p PORT | Additional port mapping |
Note: -e flags use Kong sep:"none" — commas in values are preserved (e.g., NO_PROXY=localhost,127.0.0.1).
charly start reads only OCI labels (via ExtractMetadata) + charly.yml. It
does not touch charly.yml. Remote refs (@github.com/...) are rejected
with a redirect to charly box pull.
If the image isn't in local storage, startup fails with the standard
ErrImageNotLocal recommendation pointing to charly box pull. See
/charly-build:pull.
In quadlet mode (default), charly config <image> MUST be run before charly start. If the quadlet file does not exist, start fails with:
not configured; run 'charly config <image>' first
The correct workflow is:
# Step 1: Configure (generates quadlet, provisions secrets, sets up volumes)
charly config sway-browser-vnc
# Step 2: Start
charly start sway-browser-vnc
# Configure first
charly config jupyter --bind workspace --password auto
# Start the service (systemctl --user start charly-jupyter.service)
charly start jupyter
Encrypted volumes declared in the image are auto-mounted at start time. In quadlet mode, ExecStartPost commands in the quadlet file register Tailscale serve/funnel rules (if tunnel is configured in charly.yml). These are automatically cleaned up by ExecStopPost on service stop.
Quadlet auto-mount hook. Quadlets generated for encrypted-volume images carry an ExecStartPre=charly config mount <image> directive. Without it, a host reboot or any other event that drops the gocryptfs FUSE mount would let systemd start the container against an empty plain/ mountpoint — at which point the container would write plaintext data on top of the populated cipher tree. If you have quadlets generated by an older charly, run charly migrate to regenerate them in place — see /charly-build:migrate "charly migrate". Direct-mode starts have a parallel safety net: verifyBindMounts fails loud when the cipher dir is populated and the plain mount is empty (see /charly-automation:enc "Pre-start safety check").
# Start with workspace and env vars
charly start jupyter -e JUPYTER_TOKEN=mytoken
# Start with port mapping
charly start jupyter -p 8888:8888
# Build the image first, then start
charly start jupyter --build
/charly-build:pull -- Required before charly start can work on a fresh host. charly start rejects remote refs (@github.com/...) — pull first./charly-core:charly-config -- MUST run first in quadlet mode (setup: quadlet + secrets + encrypted volumes)/charly-core:service -- Full service lifecycle (in-container supervisord/systemd services)/charly-core:stop -- Stop a running service/charly-core:charly-status -- Check service status/charly-core:charly-update -- Update image and restart/charly-core:logs -- View service logs/charly-core:shell -- Interactive shell into the same image/charly-core:deploy -- Tunnel configuration (ExecStartPost commands generated by quadlet)/charly-automation:enc -- Encrypted volume mount lifecycle (inline mount in direct mode, ExecStartPre=charly config mount in quadlet mode, short-circuit fast path)/charly-build:secrets -- Credential store hierarchy for encrypted volume passphrase resolution/charly-image:image -- Box definitions (ports, volumes, env) in charly.yml/charly-build:build -- Build the image you intend to start/charly-eval:eval 10 standards)Changes that touch this verb's output must reach a healthy deployment on a target explicitly marked disposable: true (see /charly-internals:disposable). Use charly update <name> to destroy + rebuild unattended on any disposable target. Never experiment on a non-disposable deploy — set up a disposable one first with charly deploy add <name> <ref> --disposable or mark a VM in vm.yml.
After committing the source-level fix, charly update the disposable target ONCE MORE from clean and re-run the full verification. A fix that passes only on a hand-patched target is not a real fix — it's a regression waiting for the next unrelated rebuild. Paste BOTH the exploratory-pass output and the fresh-rebuild-pass output into the conversation.
Unit tests + a clean compile are necessary but not sufficient. See CLAUDE.md R1–R10.
tools
OpenCharly CLI (charly) binary installed into container/VM images for in-container use. Use when working with charly binary deployment inside containers, native D-Bus support, or the full charly toolchain (charly binary + virtualization + gocryptfs + socat).
development
Operator CachyOS workstation profile — a kind:local template + target:local deploy that installs the full dev stack (30 candies) onto a CachyOS host via ShellExecutor. Lives in the overthinkos/cachyos submodule. MUST be invoked before editing or applying the charly-cachyos workstation profile.
tools
Fedora box with the full charly toolchain using shared candies. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Same candy list as charly-arch. Includes NVIDIA GPU runtime. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-fedora box.
tools
Arch Linux box with the full charly toolchain. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Composes /charly-coder:charly-mcp so the box is reachable as an MCP gateway on port 18765. NVIDIA GPU runtime composed in. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-arch box.