Skip to content

Instantly share code, notes, and snippets.

@obeone
Last active September 26, 2026 18:57
Show Gist options
  • Select an option

  • Save obeone/838c7a016ba1f23b32ae3c8d7fcfc9e0 to your computer and use it in GitHub Desktop.

Select an option

Save obeone/838c7a016ba1f23b32ae3c8d7fcfc9e0 to your computer and use it in GitHub Desktop.
Worked example of a private overlay for the Claude Code config template (fictional values)

Example Private Overlay

This gist is a worked example, not anyone's real configuration. Every name, email, host, and path in it is invented, so a reader can see what a filled-in overlay looks like without the author exposing their actual one. It overlays the public Claude Code configuration template gist 40e576f2db145a3ec1c100ee46b1a6bb.

The persona is Mira Vogt, a backend developer at a fictional logistics company who chats in German, self-hosts Gitea instead of Forgejo, and runs a personal Kubernetes cluster at home. None of that maps to a real person, a real company, or a real domain.

Install order

  1. Install the public template first, into ~/.claude, with placeholders still sitting in every snippet.
  2. Install this gist on top, same paths, overwriting the placeholders with Mira's values.

The template's install.sh does both steps in one run, given this gist's id. Since Mira is not you, point it at a throwaway directory rather than your real ~/.claude:

curl -fsSL https://gist.githubusercontent.com/obeone/40e576f2db145a3ec1c100ee46b1a6bb/raw/install.sh \
  | CLAUDE_CONFIG_DIR="$(mktemp -d)" bash -s -- 838c7a016ba1f23b32ae3c8d7fcfc9e0

A real overlay installs the same way, with its own id and without the CLAUDE_CONFIG_DIR override.

What an overlay does

Two things, and this example does both.

  • Fills the four snippet stubs. snippets/identity.md, snippets/voice.md, snippets/local-env.md, and snippets/local-skills.md ship as placeholders in the public template. This overlay replaces each one with Mira's invented values, same filenames, same install paths.
  • Adds files the public template does not ship at all. skills/deploy-notes/SKILL.md here is one such file: house rules for Mira's own deployment process, with no equivalent upstream.

What a real overlay would also carry

A real private overlay lives in a secret gist, never a public one, precisely because it holds values like these. It would also carry a full copy of settings.json, since that file is JSON with no @-import mechanism and has to be replaced whole rather than patched. It is left out of this example because settings.json only gets interesting with real hostnames, real clusters, and real hook wiring, and inventing those would not teach anything the four snippets above don't already show.

name deploy-notes
description House rules for deploying to Mira's personal Kubernetes cluster (heimcluster). Use before applying any Helm release or kubectl manifest to that cluster.

Deploy Notes (heimcluster)

Personal rules for the home cluster. Nobody else reviews these changes, so the checklist has to catch what a second pair of eyes normally would.

Before applying anything

  1. Run kubectl config current-context first, every time. Confirm it says heimcluster, not a leftover Frachtwerk VPN context.
  2. Run helm diff upgrade <release> <chart> -f values.yaml before helm upgrade. No diff output reviewed, no apply.
  3. Land the change in the canary namespace first, wait one full day before promoting the same values to default.

Rollback

  • Keep the last three helm history revisions before pruning. A rollback under load is the wrong time to discover history got trimmed to one.
  • Restart order after a rollback: postgres first, then redis, then the app deployments. Reversing this order has hung the app pods twice.

Never

  • Never kubectl delete namespace default. Scale workloads to zero and delete them individually instead.

Contact Information

Personal Projects

Professional Projects (Frachtwerk)

Anything related to Frachtwerk, for example:

  • git.frachtwerk.example (self-hosted Gitea)

  • A repo found in Frachtwerk's internal repo tree

  • etc.

  • Name: Mira Vogt

  • Nickname: m.vogt

  • Email: mira.vogt@frachtwerk.example

Local Environment

Machine- and account-specific values that complete the generic rules in CLAUDE.md.

  • Git identity for push rules: the "repos you own" clause means repos owned by mvogt on git.frachtwerk.example.
  • Self-hosted git host: git.frachtwerk.example runs Gitea, use the tea CLI, not gh or glab.
  • Extra backup keyword: Sicherung, German for "backup", treat it as protected alongside backup/backups/.backup.
  • Sibling checkout roots on this machine: ~/Code and ~/Projekte hold other project checkouts, keep sweeps out of both.
  • Personal cluster kubeconfig: the home cluster's config lives at ~/.kube/heimcluster.yaml, never the default ~/.kube/config.
  • Auth var example: $GITEA_TOKEN.

Local Skills

  • k8s-context-switch: exists only on this machine. Always pass the context name as a positional argument (k8s-context-switch heimcluster); with no argument it keeps whatever kubectl config current-context last left active, which after a Frachtwerk VPN session is usually the work cluster, not home.

Voice & Output Style

  • Chat: German, informal (Du), direct and matter-of-fact. Skip the polite padding, say plainly when an approach is a bad idea.
  • Output style: answer first, then a short numbered list if steps are needed, no closing recap. Channel envelopes (ntfy priority, title prefixes) still apply on top of this.
  • Writing in your name: no dedicated voice skill exists yet, so default to plain, factual English for anything external (commits, PR descriptions, issue comments): the readers there are colleagues and maintainers, not me.
  • Worktree marker: 🌳 Aktiver Worktree: <path>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment