01 — Principles
01

Marketing brain, builder's hands

The better part of a decade as Head of Marketing before going independent. I know why a product needs to exist before I write the first line of it.

02

Agents with job descriptions

Every agent gets a tightly scoped system prompt, a small set of tools, and a documented failure mode. Software with accountability.

03

One operator, ten agencies

The white-label model only works if intake, brief, build, QA and delivery are uniform. Agency Genius is that uniformity as software.

04

Deadlines are a strategy

Hard deadline, narrow audience, urgent need. The exact conditions where a small, focused tool wins a market from incumbents.

02 — The agent rosterEvery agent has a tightly scoped system prompt, a small set of tools, and a documented failure mode.
intake-routerAgency GeniusReads inbound tickets, classifies them, fills out a structured brief, routes them to the right delivery team.
brief-writerAgency GeniusTurns a thin client message into a full brief with acceptance criteria, references, and a draft timeline.
qa-checkerAgency GeniusRuns the finished work against the brief, flags drift, asks the builder to confirm.
site-auditorAgency GeniusNightly job on every active client site. Lighthouse, broken links, schema validity, security headers.
status-summariserAgency GeniusWeekly client digest. Pulls activity, drafts the update, queues it for review.
receipt-issuerLoadSnapReads load photo metadata, calls DEFRA's reference data API, returns a compliant draft. Runs on Groq for kerbside latency.
compliance-checkerLoadSnapValidates the draft against the official DEFRA schema, flags missing fields, retries with corrections.
invoice-drafterLoadSnapPulls customer rates from Supabase, drafts the invoice, queues it in Stripe Connect.
brand-readeravago.aiEnriches whatever the user pastes in. Pulls Tavily for search, DataForSEO for competitor signals, returns a structured brand brief.
page-drafteravago.aiTakes the brand brief, picks a human-designed template, populates copy in the right voice and structure.
cmdk-routerThis siteThe ⌘K agent. Four tools, a sub-agent handoff, source attribution under every reply.
03 — The path hereFull history on LinkedIn →

The better part of a decade as Head of Marketing before going independent. The agency, the products, the consultancy: they're informed by all of it.

2021 →FounderWeb Hero, Agency Genius, Avago, LoadSnap, OutPitchBuilt the agency, then the platform that runs it, then the products that scale from it.
2023 → 2024Head of MarketingCoptrzB2B and B2C growth, 252% MQL growth, 564% YoY e-commerce. CRM and automation overhaul, AI tooling in the marketing stack.
2023 → 2024Head of MarketingCademiFull rebrand, Salesforce to Pipedrive migration, paid media across Google, Meta and LinkedIn, content strategy.
2020 → 2023Head of MarketingRAM Tracking75% increase in lead gen post-redesign, 4x prospect data growth, multi-brand strategy across RAM Tracking, AMS Tracking, Rewire Security. Pardot and Intercom build-outs.
2018 → 2020Senior Business Development ManagerRAM TrackingClosed and managed enterprise sales pipeline across the RAM Tracking portfolio.
2017 → 2018General ManagerHeinekenTested Yorkshire's first Heineken Smart Dispense system.
2016 → 2017General ManagerMarston'sRan a multi-site brewing and pub operation, P&L, team, ops.
04 — Five domains, one codebaseThis site is the application artifact for the Claude Certified Architect program. Each domain is demonstrated in the repo.
D1

Agentic architecture and orchestration

  • components/CmdKAgent mounts the router agent globally on every page.
  • The router decides to answer, call a tool, or hand off to the project-explorer sub-agent via a route_to_explorer tool call: a second model call with a different system prompt and a reduced tool set.
  • .claude/agents/cmdk-router.md and .claude/agents/project-explorer.md hold the version-controlled prompts.
D2

Tool design and MCP integration

  • Four tools with Zod schemas: show_project, email_callum, search_writing, get_now.
  • Every tool returns { ok: true, data } or { ok: false, error: { code, message, retryable } }.
  • search_writing tries the Notion MCP first and falls back to local MDX search when MCP is unavailable.
D3

Claude Code configuration and workflows

  • CLAUDE.md is the project entry point for any Claude Code session.
  • .claude/commands/ holds the slash commands: /new-article, /voice-check, /ship.
  • .claude/agents/ holds the agent system prompts.
D4

Prompt engineering and structured output

  • Tool results are typed JSON validated by Zod; the UI renders structured cards instead of raw text.
  • The agent endpoint includes a validation-retry loop, up to two retries on tool-input schema failures.
  • /studio uses structured JSON output for social post generation.
D5

Context management and reliability

  • Session-scoped conversation state in client memory via Zustand.
  • Every tool result carries a source path, rendered as an attribution under each card.
  • A 'Report this answer' link opens an email_callum flow with the transcript pre-filled. Notion MCP degrades gracefully to local MDX.

Press ⌘K anywhere on this site to talk to the cmdk-router agent directly.