Duckeighty integrate
npx -y skills add mackee/duckeighty --skill duckeighty-integrateAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generate a docker-compose.local.yaml override that wires an existing Docker Compose project into duckeighty's shared local HTTPS ingress, so each exposed service becomes reachable at https://<project>-<service>.duckeighty.test with a locally trusted certificate. TRIGGER: the project already has a compose.yaml / docker-compose.yml and the user asks to expose it over duckeighty, add a local override, route via traefik / shared_ingress, or set up *.duckeighty.test URLs. Also fires when the user says "duckeighty" and refers to a Compose app in the current working directory. SKIP: projects without Docker Compose, or projects whose existing docker-compose.local.yaml already attaches the target service(s) to shared_ingress with correct traefik labels.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
7.7 KB, as published. Nobody here has run it
duckeighty: add a docker-compose.local.yaml override
Goal: produce a docker-compose.local.yaml at the project root that, when
combined with the project's existing compose.yaml, routes selected services
through the duckeighty ingress stack.
Reference files (bundled with this skill)
Read these from the skill's references/ directory before generating
output:
- references/single-service.template.yaml — canonical single-service pattern
- references/multi-service.example.yaml — pattern for multiple exposed services
- references/conventions.md — hostname rules, env var contract, normalization
Hard rules (wrong rule → Traefik 404)
- Labels must be in list form (
- "key=value"), not a YAML mapping. Compose does not expand${VAR}inside mapping keys, so the${DUCKEIGHTY_PROJECT_NAME}token in the router/service name would stay literal and Traefik ends up with no matching router. - Include
traefik.docker.network=shared_ingressso Traefik picks the correct network when the container is on multiple networks. - Router and service names must include the project token
(
${DUCKEIGHTY_PROJECT_NAME}-<svc>) so multiple worktrees do not collide at Traefik's global router registry. - Attach the service to both its own
defaultnetwork andshared_ingress. - Declare
shared_ingressat the bottom asexternal: true, name: shared_ingress. - Do not publish host ports on the exposed services. Traefik handles ingress; host-published ports conflict between worktrees.
Workflow
-
Read the existing
compose.yaml/docker-compose.ymlto identify the service(s) underservices:the user wants to expose. Ask if ambiguous (e.g. "expose onlyweb, or alsoadmin?"). -
For each exposed service, determine the in-container listen port. The duckeighty default is
8080. If the app listens on a different port, ask and setloadbalancer.server.portaccordingly. -
Read the single- or multi-service reference template depending on count.
-
Write
docker-compose.local.yamlat the project root. One labeled block per exposed service, following all hard rules above. -
Keep the override out of the target repo's tracked set. Default to the non-invasive path: add the filename to
.git/info/excludeso it stays out ofgit statuswithout modifying any tracked file:f=".git/info/exclude" test -f "$f" && ! grep -qxF docker-compose.local.yaml "$f" \ && printf '\n# duckeighty (local, per-developer)\ndocker-compose.local.yaml\n' >> "$f"If the user signals they want the whole team on duckeighty, offer to append the line to the target's
.gitignoreinstead (that change gets committed). Do not pick the.gitignorepath by default. -
Print the follow-up run command for the user (see references/conventions.md).
Prerequisites to surface to the user
Before the override is useful, the duckeighty ingress stack must be running on the host. The ingress is host-wide: one install per developer, shared by every app repo.
-
If the user has never set up duckeighty on this host, point them to the
duckeighty-initskill (sibling of this one) — it clones duckeighty, installs the mkcert CA, the macOS resolver entry, and brings up traefik + dnsmasq. -
If the user might have it set up but is unsure (URL 404s, TLS error, NXDOMAIN), point them to the
duckeighty-doctorskill first. It only diagnoses. -
If the user wants to do it manually, from a duckeighty checkout:
./duckeighty.sh setup-ca # once: mkcert local CA ./duckeighty.sh setup-resolver # once: /etc/resolver entry (macOS, sudo) ./duckeighty.sh up # starts traefik + dnsmasq
Do not run any of those commands from inside the application repo itself.
Do / Don't
- Do name the override
docker-compose.local.yaml. Compose does not pick it up automatically; the user invokesdocker compose -f compose.yaml -f docker-compose.local.yaml up -d. - Do leave the existing
compose.yamluntouched. - Do not add TLS / certificate configuration in the override — Traefik terminates TLS at the ingress layer.
- Do not guess service names from the
compose.yamlfile name; use the keys underservices:. - If any exposed service also needs to call another duckeighty hostname
from inside the container (OIDC discovery, webhooks, internal HTTPS),
add the
extra_hosts+ mkcert CA bind-mount pattern to the caller. See references/conventions.md § "Container-to-container calls over*.duckeighty.test". - If the service is a dev server (Vite / Next dev / webpack-dev-server), whitelist the duckeighty hostname in its allowed-hosts config. See references/conventions.md § "Dev-server allowed-hosts gotcha".
devcontainer-based projects
If the target project is started through the devcontainer CLI (VS Code
Dev Containers) rather than plain docker compose up, two extra bits
need attention because the CLI owns the docker compose invocation.
1. Make the override visible to devcontainer CLI
The CLI only loads compose files listed in dockerComposeFile in
.devcontainer/devcontainer.json. The override has to be listed
explicitly:
"dockerComposeFile": [
"./docker-compose.yml",
"./docker-compose.local.yaml"
]
devcontainer.json is usually tracked, so editing it pulls duckeighty
into the repo's pushed files. If the team doesn't all use duckeighty, or
the author wants zero duckeighty trace in tracked code, use the CLI's
--override-config flag against a separate gitignored
devcontainer.local.json instead of editing devcontainer.json:
devcontainer up --workspace-folder . \
--override-config .devcontainer/devcontainer.local.json
devcontainer.local.json is a full devcontainer config (not merged —
--override-config replaces). Copy the tracked one and add the
dockerComposeFile array in the copy. Add devcontainer.local.json
and docker-compose.local.yaml to .git/info/exclude or .gitignore.
2. Call update-ca-certificates at start-up for CA trust
If the service inside the container calls other *.duckeighty.test
URLs (OIDC discovery, webhooks, etc. — see §"Container-to-container
calls over *.duckeighty.test" in
references/conventions.md), the mkcert CA
has to be registered at start-up. devcontainer's postStartCommand is
the right hook:
"postStartCommand": "sudo update-ca-certificates && <existing command>"
Microsoft's mcr.microsoft.com/devcontainers/base images ship sudo
and ca-certificates preinstalled. Custom base images may need either
to be installed via a feature or to run the command without sudo.