Boondoggling.ai — Software Design Document
Complete governing specification for Boondoggling.ai — a hybrid learning platform and prompt library that moves developers from "I use Claude" to "I conduct Claude."
1. One-Page Problem Summary
Core Problem Statement This system is a hybrid learning platform and prompt library for developers and technical creators who use Claude regularly but have never encountered structured AI-assisted build methodology — solving the absence of a guided, practice-based path from "I use Claude" to "I conduct Claude."
The platform delivers its solution through a scrolling homepage that tells the story of boondoggling from first principles, a /dev section of real annotated Gru projects as worked examples, a /tools prompt library where Gru and companion tools can be copied into any Claude Project, and video instruction throughout.
It occupies the space between a methodology explainer (reads but can't practice) and a raw Claude conversation (can practice but teaches nothing).
Success Condition A developer who uses Claude daily arrives, understands the solve-verify asymmetry, copies the Gru system prompt, runs it locally, and completes a real build using the methodology — without needing to ask anyone how.
2. Architecture Principles
Teaching Outcome Over Feature
Every component earns its place by advancing the learner toward running a Gru build independently. If it doesn't, it doesn't ship.
✓ Honors: a video that walks through a real Boondoggle Score step by step.
✗ Violates: an animated section that visualizes the five supervisory capacities without connecting them to a concrete action.
Production failure state: the site becomes a brand site for boondoggling instead of a platform that produces boondogglers.
YouTube + Substack, Not Textbook
Teaching happens in video and in writing that reads like a person thinking out loud. The site points to content; it does not replace it.
✓ Honors: a blog post that works through one specific failure in a Boondoggle Score.
✗ Violates: a "Course" section with locked modules and progress tracking.
Production failure state: the site drifts toward LMS territory. Content becomes obligation rather than destination.
Audit Before Publish, Tool-Assisted
No community-contributed content goes live without a structured quality review. The audit tool runs locally in the admin's Claude Project. The publish decision is the admin's judgment call.
✓ Honors: every /dev submission goes through the Doc Audit Prompt before publish.
✗ Violates: publishing any doc that arrives because volume feels better than quality.
Production failure state: /dev fills with incomplete SDDs that teach bad habits.
Identical Stack, No Exceptions
Every technical decision defers to the Musinique codebase. Same patterns, same components, same deployment model.
✓ Honors: porting the Musinique /dev filesystem pattern directly.
✗ Violates: introducing a new ORM or auth library.
Production failure state: two codebases that drift apart. A solo developer maintaining two divergent infrastructure patterns.
Principle Collision Resolutions
- P1 vs. P3: P3 is primary at the publish gate. P1 is primary for content already live-and-teaching.
- P2 vs. P1: P2 is primary on format. P1 is primary on outcome. Recommended watch order is surfaced as a suggestion, not a gate.
3. Core User Flows + System Interaction Map
Flow 1 — Learner's First Run (Primary Flow)
LEARNER ARRIVES AT / ├── BEAT 1: What is boondoggling? (conductor metaphor, solve-verify asymmetry) ├── BEAT 2: Why does it matter? (five supervisory capacities) ├── BEAT 3: How does it work? → links to /videos for depth ├── BEAT 4: Get the tool → /tools → copy Gru → paste into Claude Project └── BEAT 5: See it in action → /dev worked examples, /videos
Flow Honesty Test: if this flow were a command-line prototype with no UI — just a README and a copy-paste prompt — would it solve the stated problem? Yes. The site is a surfacing layer, not the core value.
Flow 2 — Tools and Worked Examples (Returning Learner)
/tools → browse card grid → tool detail page → copy prompt → paste into Claude Project
/dev → browse card grid (category-grouped) → open doc → read SDD in sandboxed iframe
→ optional: navigate to real build (external link)
Flow 3 — Admin Submission-to-Publish
Submission arrives (email/DM) → Admin creates draft in dashboard → Admin runs Doc Audit Prompt locally (Claude Project) → Decision: publish / return for revision / decline → Published: quality signal set, category assigned, doc visible in /dev
System Interaction Map
EXTERNAL BOONDOGGLING.AI LEARNER'S LOCAL ENV
──────── ─────────────── ───────────────────
YouTube ←── /videos
Vercel Blob ←── /dev (community uploads) Claude.ai /
←── /blog (cover images) Claude Code
Neon PostgreSQL ←── blog_posts │
←── tools ← Gru system prompt
←── videos (copied from /tools)
←── dev_docs
Vercel ←── deploy on push to main
4. User and Business Needs
User Needs
A new learner must be able to understand what boondoggling is and why it changes how they build with Claude, when arriving for the first time, without reading a wall of documentation before the concept lands.
Test: reads first two homepage sections, can state the solve-verify asymmetry in their own words.
A learner must be able to copy the Gru system prompt and have it running in a Claude Project, when ready to try it, without leaving the site to find instructions, create an account, or wait for access.
Test: time from "I want to try this" to Gru running in a Claude Project is under three minutes.
A learner must be able to study a complete, real Gru SDD project — including the Boondoggle Score — when they want to understand what a finished build looks like, without the example being synthetic, incomplete, or stripped of decisions.
Test: can identify Problem Summary, at least one architecture principle, and one Boondoggle Score step with its handoff condition.
A learner must be able to go deeper on any concept through video, when reading is not enough, without the video being buried or disconnected from the concept it teaches.
Test: can reach a video explaining the five supervisory capacities in one click from the homepage.
A returning learner must be able to find a specific concept, command, or worked example quickly, when mid-build and needing a reference, without re-reading the whole site.
Test: can find the definition of a handoff condition and an example in under sixty seconds.
A practitioner who has completed a real Gru build must be able to submit their SDD as a worked example, when they want to contribute, without needing a GitHub account or technical knowledge beyond what they used to build.
Test: can submit and receive publish confirmation or specific audit feedback within one admin review cycle.
Operator Needs
The operator must be able to publish blog posts, add tools, upload videos, and add /dev docs without touching the codebase or redeploying.
The operator must be able to review a community submission, run the audit prompt locally, and make a publish/return/decline decision using only the admin dashboard and a local Claude Project.
The operator must be able to assign and update quality signals (Featured / Community) on /dev docs and /tools entries without a code change.
Business Needs
The site must demonstrate that boondoggling produces real, finished builds — not just theory. Every Featured /dev doc links to a verifiable external build.
The site must grow the library of Gru variants and companion tools over time through community contribution.
The site must feel like a Bear Brown & Company property — same visual language, same technical patterns as Musinique.
5. Core Component Documentation
Component 1 — Homepage Scroll Arc
Needs: UN-1, UN-2, UN-4, BN-1
Five discrete static scroll sections. No JS-gated progression. Each beat: headline, 2–4 sentences, one contextual action. Beat 4 is the primary CTA (link to /tools/gru). Stateless — no session, no cookie, no progress tracking.
Component 2 — /tools Prompt Library
Needs: UN-2, UN-5, BN-2, ON-1–ON-3
Hybrid card grid: filesystem-driven (artifact tools in /public/tools/) + DB-driven (prompt and link tools). Each tool detail page: description, how-to-use instructions, version, copy button, clipboard fallback (<pre> + "Select all"). Character count displayed for prompt-type tools.
Component 3 — /dev Worked Examples
Needs: UN-3, UN-5, BN-1, BN-2, ON-1–ON-3
Two-source hybrid. Filesystem docs (/public/dev/WWW/, /Agents/, /Games/, with /gru/ subfolder in each) + community uploads (Vercel Blob + dev_docs DB table). Card grid groups by category, Gru-badged within each group. Full-viewport sandboxed iframe viewer. Named error component on Blob 404 or missing file.
Filesystem taxonomy: /public/dev/ WWW/gru/ Agents/gru/ Games/gru/
Community uploads: flat slug, category required before publish, <meta name="methodology" content="gru"> for Gru badge.
Component 4 — /videos Video Library
Needs: UN-4, UN-5, ON-1
DB-driven, identical to Musinique. YouTube embeds (youtube-nocookie.com) + Vercel Blob uploads. Search, tag filtering, pagination, pinned videos. Direct YouTube link fallback below every embed.
Component 5 — /blog
Needs: UN-5, BN-1, BN-3, ON-1
Identical to Musinique. Tiptap editor, DB-driven, Vercel Blob cover images, D3 viz hydration. Nik-authored only. Voice: argument and narrative, not reference documentation.
Component 6 — Admin Dashboard
Needs: ON-1, ON-2, ON-3
Identical auth to Musinique (HMAC-SHA256, httpOnly cookie, 7-day expiry). Tabs: Blog, Tools, Dev, Videos.
New vs. Musinique: Tools tab adds prompt_text, quality_signal, version, published fields. Dev tab adds HTML file upload → Vercel Blob, category (required before publish), methodology, quality_signal, build_url, draft/publish toggle, admin notes field (audit report).
6. External Integrations and Dependencies
| Integration | Purpose | Risk | Failure Behavior |
|---|---|---|---|
| Vercel | Deploy + serverless functions | HIGH — sole compute layer | Previous deployment stays live on build failure |
| Neon PostgreSQL | All DB content | MEDIUM — filesystem content survives | Blog/videos degrade; /tools artifact + /dev filesystem survive |
| Vercel Blob | Community HTML uploads + blog images | LOW | Named error component; filesystem content unaffected |
| YouTube | Public video embeds | LOW | Direct link fallback; course videos unaffected |
Core Path Resilience No integration is a hard dependency for the core teaching path (prompt copy). That flow survives failure of every external service except Vercel.
7. Data Architecture and State Management
State model: Stateless server, stateless client. No global state store. React useState only, component-scoped. No localStorage.
Key Schema
-- New table
CREATE TABLE IF NOT EXISTS dev_docs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
description TEXT,
blob_url TEXT NOT NULL,
build_url TEXT,
quality_signal TEXT DEFAULT 'community',
category TEXT, -- 'www' | 'agents' | 'games' — required before publish
methodology TEXT, -- 'gru' | null
submitted_by TEXT, -- display name / handle only — no email
published BOOLEAN DEFAULT false,
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Extended from Musinique
ALTER TABLE tools ADD COLUMN IF NOT EXISTS prompt_text TEXT;
ALTER TABLE tools ADD COLUMN IF NOT EXISTS quality_signal TEXT DEFAULT 'community';
ALTER TABLE tools ADD COLUMN IF NOT EXISTS version TEXT DEFAULT '1.0';
ALTER TABLE tools ADD COLUMN IF NOT EXISTS published BOOLEAN DEFAULT false;
-- Integrity constraint
ALTER TABLE videos ADD CONSTRAINT video_source_required
CHECK (youtube_id IS NOT NULL OR blob_url IS NOT NULL);
Migration Run Order
- CREATE dev_docs
- ALTER tools (4 columns)
- ALTER dev_docs (category, methodology)
- ADD video CHECK constraint
- Backfill tools (
published=true,quality_signal='curated') - RLS policies
8. Domain Model and Entity Definitions
Ubiquitous Language
- Boondoggling
- The practice of conducting Claude through a build by assigning each task to the correct labor, sequencing by dependency, and making every handoff condition explicit. Reject: "A workaround"
- Boondoggle Score
- The sequenced, dependency-ordered output of
/claude— separating Claude tasks from human tasks with copy-pasteable prompts and handoff conditions. Reject: "The build plan" — the SDD is the build plan. - Gru
- The system prompt that instantiates the Gru persona in a Claude Project. Reject: "The AI" — Gru is a role, Claude is the AI.
- Tool
- A system prompt or HTML artifact hosted in /tools that runs in the learner's local Claude environment. Reject: "A feature of the site"
- Worked Example
- A complete, real Gru SDD project hosted in /dev. Reject: "A demo" — demos are synthetic.
- Quality Signal
- Admin-assigned curation label: Featured or Community. Reject: "A rating"
- Handoff Condition
- A specific, testable statement of what must be true about a Claude task's output before the next step begins. Reject: "Done criteria"
- Learner
- Anonymous developer/creator acquiring the methodology. Reject: "User" — no account at launch.
- Contributor
- Practitioner who submits an SDD or tool variant. Reject: "User"
Core Entities
- Tool — system prompt or HTML artifact.
tool_type: artifact | link | prompt.prompt_textrequired when type=prompt.quality_signal: curated | community. - DevDoc — real Gru SDD project. Two sources: filesystem (Nik-authored) and DB (community uploads via Blob).
categoryrequired before publish.methodology: gru | null. - BlogPost — Nik-authored article. Ported from Musinique unchanged.
- Video — YouTube embed or Blob-uploaded. CHECK constraint: at least one of
youtube_idorblob_urlnon-null. - AdminSession — HMAC-SHA256 signed httpOnly cookie, 7-day expiry. Never client-side.
Bounded Context One context: Content Distribution. No commerce, no identity, no analytics domain at launch.
9. API Contract Documentation
| Endpoint | Method | Auth | Notes |
|---|---|---|---|
/api/admin/login | POST | None | Sets admin_session cookie |
/api/admin/logout | POST | Admin | Clears cookie |
/api/blog | GET/POST | GET: none, POST: admin | |
/api/blog/[id] | PATCH/DELETE | Admin | |
/api/tools | GET/POST | GET: none, POST: admin | prompt_text required for type=prompt |
/api/tools/[id] | PATCH/DELETE | Admin | |
/api/dev | GET/POST | GET: none, POST: admin | |
/api/dev/upload | POST | Admin | Multipart; 5-step validation; Blob then DB |
/api/dev/[id] | PATCH/DELETE | Admin | DELETE: Blob failure never blocks DB delete |
/api/videos | GET/POST | GET: none, POST: admin | |
/api/videos/[id] | PATCH/DELETE | Admin | |
/api/upload | POST | Admin | Images (5MB) + course videos (500MB) |
Global Behavior Guarantees
- All writes are synchronous — 200/201 means DB write completed
- All errors return
{ "error": "string" }— no stack traces in production - PATCH is idempotent — POST is not (duplicate slugs return 409)
- Auth validated by middleware before any handler executes
- No rate limiting at launch (single admin, read-only public routes)
Critical Endpoint — /api/dev/upload
Five-step server-side validation: (1) content-type HTML, (2) ≤500kb, (3) HTML signature check, (4) slug unique in DB, (5) / disallowed in slug. Blob write → DB insert (sequential). Blob failure = clean error. DB failure after Blob success = orphaned file logged, admin retries safely.
10. Data Flow and Sequence Diagrams
Core Flows
Learner Copies Gru Prompt
GET /tools → merge filesystem + DB → GET /tools/gru → tool detail page (prompt_text in DOM) → clipboard API → no server call. Survives Neon outage if Gru is filesystem artifact.
Learner Views /dev Doc
GET /dev → merge filesystem + DB → GET /dev/[slug] → resolve source (filesystem or Blob) → browser loads iframe src → sandboxed render. Blob 404 → named error component.
Admin Uploads Community Doc
POST /api/dev/upload → validate → Blob put() → INSERT dev_docs (draft) → admin runs audit prompt locally → PATCH published=true.
Design Constraint No chatty interfaces. Every user-facing flow completes in 1–2 API calls. No async event architecture at launch.
Latency Profile
| Call | Latency Class | Fallback |
|---|---|---|
| Neon SELECT on page load | Medium (100–500ms) | Filesystem content survives |
| Vercel Blob put() | Slow (>500ms) | Clean error, admin retries |
| Vercel Blob GET (iframe) | Fast (<100ms, CDN) | Named error component |
| YouTube iframe | Fast (<100ms, CDN) | Direct link fallback |
11. Component List with Priority Tags + MVS Spec
Priority Distribution MUST-BUILD: 18 items (47%) · IMPORTANT: 11 items (29%) · NICE-TO-HAVE: 7 items (18%) · EXPERIMENTAL: 3 items (8%) — user accounts, community form, Substack
MVS Verdict
The core loop is complete at MUST-BUILD only: learn the concept (homepage) → get the tool (/tools) → study real builds (/dev) → watch instruction (/videos) → read methodology (/blog) → admin publishes content without redeploying. Search, filtering, and polish (IMPORTANT) improve but do not break the experience.
Critical MUST-BUILD Items (Net-New, Not Ported)
| Item | What It Is |
|---|---|
| Homepage scroll arc | Static 5-beat page — no framework complexity |
| Admin dev tab + upload | Most complex admin tab; Blob + DB write sequence |
| /api/dev/upload | 5-step validation, Blob then DB |
| Category/Gru taxonomy | Filesystem directories + meta tag read |
| Iframe sandbox + error | One JSX attribute + one error component |
| Quality signal on cards | One DB field + one CSS class |
| Admin: Doc Audit Prompt | Content entry in /tools — zero code |
12. Out of Scope
Binding record of decisions. Reopening requires a documented reason with a date.
| Item | Reason | Reopen Condition |
|---|---|---|
| User accounts | No auth surface needed at launch | v2 |
| Progress tracking | Requires accounts | v2 |
| On-site Claude API | No API proxy; learner runs locally | Permanently excluded unless business model changes |
| Community submission form | Email/DM sufficient at launch | v2 |
| Automated on-site audit | Publish decision is irreducibly human | Permanently excluded |
| Substack integration | Not in content strategy at launch | v2 |
| Course module system | Violates P2 | Permanently excluded |
| Blog/dev comments | Requires moderation infrastructure | v2 |
| Paid content | No commerce context | Separate SDD required |
| Admin analytics dashboard | Vercel Analytics sufficient | v2 |
| Multi-admin / RBAC | Solo operator at launch | v2 |
| Mobile app | Desktop use case | Not planned |
| Global search | High complexity, low launch value | v2 |
| Tool version diff UI | version field sufficient at launch | v2 |
| i18n | English only | Future |
13. Infrastructure and Deployment Requirements
Stack: Next.js 15 (App Router), TypeScript 5, Tailwind CSS, Vercel, Neon PostgreSQL, Vercel Blob. Identical to Musinique.
Domain: boondoggling.ai — DNS pointed to Vercel before launch.
Environment Variables
DATABASE_URL
ADMIN_PASSWORD
BLOB_READ_WRITE_TOKEN
NEXT_PUBLIC_SITE_URL=https://www.boondoggling.ai
NEXT_PUBLIC_GA_ID (optional)
Pre-Launch Checklist
- ☐ Vercel project created, domain pointed, SSL issued
- ☐ Neon Pro plan provisioned, all migrations run
- ☐ Environment variables set in Vercel dashboard
- ☐ /public/dev/ subdirectory scaffold created (WWW/, Agents/, Games/ + gru/ within each)
- ☐ Three Featured /dev docs published (one per category, all Gru-produced)
- ☐ Five videos published
- ☐ Gru system prompt published in /tools
- ☐ Admin: Doc Audit Prompt published in /tools
- ☐ Admin login tested, copy button tested, iframe sandbox verified
14. Risk Register
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Unsandboxed community HTML (XSS) | High | High | sandbox attribute on all community iframes — non-negotiable |
| Principle drift during implementation | Medium | High | SDD is the reference; run /g2 before v2 planning |
| Content drought at launch | Medium | High | Three Featured docs + five videos required before launch date is set |
| Blob orphan accumulation | Medium | Low | Log orphaned URLs; monthly manual cleanup; v2 cleanup job |
| Admin publishes without audit | Medium | Medium | UI reminder in dashboard; technical enforcement in v2 |
| Category taxonomy inadequate | Low | Low–Medium | New category = new subdirectory, no code change |
| Gru prompt exceeds Claude Project limit | Low | High | Character count on tool detail page; split prompt as contingency |
15. Open Questions Log
All 15 questions resolved except one:
Must be included in migration script before launch. Owner: Nik Brown.
Status: Non-blocking until migration run.
v2 Planning Inputs
User auth provider · community submission form + privacy policy · global search index · orphaned Blob cleanup job · audit checkbox enforcement · fourth /dev category trigger · Substack newsletter