Skip to main content
chudi.dev
What a Solo Builder's Claude Code Operating System Actually Looks Like

What a Solo Builder's Claude Code Operating System Actually Looks Like

Published Chudi Nnorukam 5 min read

A look inside claude-customizations, a production Claude Code harness built over months of solo development. The repository contains 46 named skills, 39 hook scripts, and 18 agents -- each a discrete capability the system can invoke autonomously or on request.

Why this matters

The claude-customizations repository is a production Claude Code harness with 46 named skills, 39 hook scripts, and 18 agent definitions. The three layers form a self-correcting system: skills define capabilities, hooks enforce invariants automatically, and agents handle bounded multi-step workstreams. All counts are sourced from the GitHub API tree at the time of writing.

Most Claude Code tutorials show what is possible. This post shows what it looks like after months of actually using it.

The claude-customizations repository is a production Claude Code harness, MIT licensed, built for a solo technical founder running multiple projects simultaneously. It contains the skills, hooks, and agents that make up a self-correcting agentic work system — not examples or starters, but the actual files used in daily work.

The AI Visibility Readiness (AVR) Framework audits measured at chudi.dev/framework are one workstream the harness supports; the repo also covers content pipelines, trading research, and API integrations. This post focuses on the architecture of the harness itself.


The three layers

Skills: 46 named capabilities

A skill is a markdown file that gives Claude Code a specialized capability: a specific way to approach a type of task, with an engagement condition, a method, and an output format. The harness contains 46 distinct named skills, organized into the skills/ directory.

source: gh api "repos/ChudiNnorukam/claude-customizations/git/trees/HEAD?recursive=1" --jq '[.tree[] | select(.type=="tree" and (.path | split("/") | length == 2) and (.path | startswith("skills/"))) | .path] | length' — returned 46 (run 2026-07-08)

Each skill has a defined trigger condition. Claude Code reads the skills list on session start and invokes the relevant skill when the task matches. Skills do not run automatically; they activate when the trigger condition fires. This means the same Claude Code session can switch between a content-strategy skill for a writing task and a trading-research skill for a market analysis task without configuration changes.

A selection of the five largest skills by file size, measured in the repo:

  • skills/web-design-principles/ — design system rules and review criteria
  • skills/microsaas-bot/ — product development playbook for solo SaaS builders
  • skills/meta-observer/ — a self-monitoring skill that tracks session patterns
  • skills/seo-blog-bot/ — content audit and blog production workflow
  • skills/meta-orchestration-plugin/ — multi-agent coordination patterns

source: M3 exec packet (WGROOT/exec/59-portfolio/M3-consolidation.md), step 1 du output, 2026-07-08.

Hooks: 39 automatic behaviors

A hook is a script that fires automatically at a defined moment in the Claude Code lifecycle — before a tool call, after a turn, when a session starts, or when a response is about to be submitted. The harness contains 39 hook scripts.

source: gh api "...git/trees/HEAD?recursive=1" --jq '[.tree[] | select(.type=="blob") | .path | select(startswith("hooks/"))] | length' — returned 39 (run 2026-07-08)

Hooks enforce invariants that prose rules cannot. If a rule says “never run a destructive command without confirmation,” a hook can intercept the Bash tool call before it executes and check the command against a pattern list. If the rule says “never echo credentials to stdout,” a hook can scan the output buffer and redact before it reaches the display. Hooks are the enforcement layer; skills are the capability layer.

Example hook categories in the repo: bash command classifiers that flag dangerous patterns, pre-response filters that check for overlong outputs, credential redaction hooks, and session-start initializers that load relevant context from persistent storage.

Agents: 18 specialized subagents

An agent definition gives Claude Code a named role to adopt for a bounded task. The harness contains 18 agent definitions.

source: gh api "...git/trees/HEAD?recursive=1" --jq '[.tree[] | select(.type=="blob") | .path | select(startswith("agents/"))] | length' — returned 18 (run 2026-07-08)

Unlike skills (which shape how the main session behaves), agents are dispatched for multi-step workstreams that benefit from a fresh context and a specific mandate. A trading-research agent starts with no conversation history, only its task brief; a content-audit agent knows only the audit scope. This isolation means errors in one workstream do not contaminate others.

Agents are always invoked by the orchestrating session, never by each other directly. The orchestrator holds the task queue and assembles the results.


How the layers interact

The architecture is a practical answer to a common problem: as a Claude Code session grows in scope, the context window fills, the instructions compete with each other, and the model starts averaging across conflicting directives instead of executing a clear path.

The three-layer structure separates concerns:

  1. Skills define the right method for a type of task — read once, applied when triggered.
  2. Hooks enforce the safety invariants that must hold regardless of task type — they run on every relevant event, not just when the operator remembers to ask.
  3. Agents handle the workstreams that need their own context — isolated, mandated, and reported back.

The result is a system where the main session stays lightweight (it loads skills on demand and dispatches agents for heavy work) while the safety layer remains comprehensive (hooks fire regardless of what skill is active).


The self-correcting principle

A harness that requires constant operator attention is not a harness — it is a checklist. The design goal for this repo is that the system should catch its own errors before they propagate: a hook catches a dangerous command before it runs, an agent returns evidence that the orchestrator validates before accepting, a skill includes a verification step that fails loudly rather than silently.

This is not autonomous decision-making; money, deploy, and destructive actions remain operator-gated and always will. The self-correction is bounded to reversible, within-session work: rerunning a failed step, catching a pattern match, validating output shape before reporting completion.


Repository details

source: gh api repos/ChudiNnorukam/claude-customizations --jq '[.description, (.topics|join(",")), .size] | @tsv' (run 2026-07-08)


Adopting one piece

The most practical entry point is a single hook. Pick one invariant you want enforced automatically — “never commit files matching .env” or “always confirm before running rm -rf” — write a PreToolUse hook that checks for it, and add it to .claude/hooks/. You do not need the full skill or agent layer to get value from the hook layer.

The second entry point is a single skill. If you run the same type of task repeatedly — auditing a codebase, drafting a post in a specific voice, triaging a bug report — a skill file lets you encode that method once and invoke it by name rather than re-explaining it each session.

The repository is MIT licensed. Take the piece that fits your workflow.

· Sources & further reading

Sources & Further Reading

Further reading

What do you think?

I post about this stuff on LinkedIn every day and the conversations there are great. If this post sparked a thought, I'd love to hear it.

Discuss on LinkedIn