Software Design Document · v1.0

Boondoggling.ai

Version: 1.0 — First complete draft Date: March 30, 2026 Owner: Nik Bear Brown / Bear Brown & Company / Musinique LLC Produced with: Gru (Ada + Boondoggling layer)
Ready to Govern Implementation V1–V4 Complete S1–S4 Complete D1–D3 Complete P1–P5 Complete 1 Open Question (Non-Blocking)
v0.1–v0.17 produced through phase-gated intake with Gru. v1.0 is the compiled full document. Changelog maintained in working document.

01 One-Page Problem Summary

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, that solves the absence of a guided, practice-based path from "I use Claude" to "I conduct Claude" 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.

02 Architecture Principles

Principle 1 — 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 visualizing 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.
Principle 2 — 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.
Principle 3 — 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.
Principle 4 — 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.

03 Core User Flows + System Interaction Map

Flow 1 — Learner's First Run (Primary)

Happy Path
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 — 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

Single point of failure: Vercel (full site). All other dependencies degrade gracefully. Core teaching path (prompt copy) survives failure of every integration except Vercel.

04 User and Business Needs

User Needs

UN-1 — First-Time Learner Comprehension
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.
UN-2 — Zero-Friction Tool Access
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.
UN-3 — Real Worked Examples
A learner must be able to study a complete, real Gru SDD project — including the Boondoggle Score — 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.
UN-4 — Video Depth
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.
UN-5 — Fast Reference
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.
UN-6 — Community Contribution
A practitioner who has completed a real Gru build must be able to submit their SDD as a worked example 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

ON-1
Operator must be able to publish blog posts, add tools, upload videos, and add /dev docs without touching the codebase or redeploying.
ON-2
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.
ON-3
Operator must be able to assign and update quality signals (Featured / Community) on /dev docs and /tools entries without a code change.

Business Needs

BN-1 — Demonstrated Real Builds
The site must demonstrate that boondoggling produces real, finished builds — not just theory. Every Featured /dev doc links to a verifiable external build.
BN-2 — Growing Library
The site must grow the library of Gru variants and companion tools over time through community contribution.
BN-3 — Bear Brown Brand Consistency
The site must feel like a Bear Brown & Company property — same visual language, same technical patterns as Musinique.

05 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.
Scope boundary: No course outline, progress tracker, feature grid, or pricing section.
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.
Scope boundary: Distributes prompts. Does not host conversations or evaluate prompt use.
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.

Community uploads: flat slug, category required before publish, <meta name="methodology" content="gru"> for Gru badge.
Scope boundary: Document library only. No interactive tools, no live Claude sessions.
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.
Scope boundary: No locked sequences, no progress tracking, no completion certificates.
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.
Scope boundary: No community content. No comments.
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).
Scope boundary: No analytics, no user management, no automated link checking.

06 External Integrations and Dependencies

IntegrationPurposeRiskFailure behavior
VercelDeploy + serverless functionsHIGH — sole computePrevious deployment stays live on build failure
Neon PostgreSQLAll DB contentMEDIUMBlog/videos degrade; /tools artifact + /dev filesystem survive
Vercel BlobCommunity HTML uploads + blog imagesLOWNamed error component; filesystem content unaffected
YouTubePublic video embedsLOWDirect link fallback; course videos unaffected

No integration is a hard dependency for the core teaching path (prompt copy). That flow survives failure of every external service except Vercel.

07 Data Architecture and State Management

State model: Stateless server, stateless client. No global state store. React useState only, component-scoped. No localStorage.

Key Tables

-- 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

1. CREATE dev_docs → 2. ALTER tools (4 columns) → 3. ALTER dev_docs → 4. ADD video CHECK constraint → 5. Backfill tools (published=true, quality_signal='curated') → 6. RLS policies.

Retention

No PII beyond submitted_by (display name only). No regulatory compliance requirements at launch. Privacy policy must note that contributor display names are stored.

08 Domain Model and Entity Definitions

Ubiquitous Language

TermDefinitionReject
BoondogglingThe practice of conducting Claude through a build by assigning each task to the correct labor, sequencing by dependency, and making every handoff condition explicit"A workaround"
Boondoggle ScoreThe sequenced, dependency-ordered output of /claude — separating Claude tasks from human tasks with copy-pasteable prompts and handoff conditions"The build plan" — the SDD is the build plan
GruThe system prompt that instantiates the Gru persona in a Claude Project"The AI" — Gru is a role, Claude is the AI
ToolA system prompt or HTML artifact in /tools that runs in the learner's local Claude environment"A feature of the site"
Worked ExampleA complete, real Gru SDD project hosted in /dev"A demo" — demos are synthetic
Quality SignalAdmin-assigned curation label: Featured or Community"A rating"
Handoff ConditionA specific, testable statement of what must be true about a Claude task's output before the next step begins"Done criteria"
LearnerAnonymous developer/creator acquiring the methodology"User" — no account at launch
ContributorPractitioner who submits an SDD or tool variant"User"

Core Entities

EntityKey FieldsNotes
Tooltool_type: artifact | link | prompt; prompt_text required when type=prompt; quality_signal: curated | community; version, publishedSystem prompt or HTML artifact in /tools
DevDoccategory required before publish; methodology: gru | null; quality_signal: featured | community; submitted_by: display name onlyTwo sources: filesystem (Nik) and DB (community)
BlogPostPorted from Musinique unchangedNik-authored only
Videovideo_type: youtube | upload; CHECK constraint: at least one of youtube_id or blob_url non-nullYouTube embed or Blob-uploaded course video
AdminSessionHMAC-SHA256 signed httpOnly cookie, 7-day expiryNever client-side

Bounded Context

One context: Content Distribution. No commerce, no identity, no analytics domain at launch.

09 API Contract Documentation

API Surface

EndpointMethodAuthNotes
/api/admin/loginPOSTNoneSets admin_session cookie
/api/admin/logoutPOSTAdminClears cookie
/api/blogGET/POSTGET: none, POST: admin
/api/blog/[id]PATCH/DELETEAdmin
/api/toolsGET/POSTGET: none, POST: adminprompt_text required for type=prompt
/api/tools/[id]PATCH/DELETEAdmin
/api/devGET/POSTGET: none, POST: admin
/api/dev/uploadPOSTAdminMultipart; 5-step validation; Blob then DB
/api/dev/[id]PATCH/DELETEAdminDELETE: Blob failure never blocks DB delete
/api/videosGET/POSTGET: none, POST: admin
/api/videos/[id]PATCH/DELETEAdmin
/api/uploadPOSTAdminImages (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, run in order: (1) content-type HTML check, (2) ≤500kb size check, (3) HTML signature check (reads first bytes — independent of filename), (4) slug format check (/^[a-z0-9-]+$/ — no slashes), (5) slug uniqueness check in DB. Blob write → DB insert (sequential). Blob failure = clean 500. DB failure after Blob success = orphaned file logged, admin retries safely. Auth is checked before any file processing.

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.

No Chatty Interfaces Every user-facing flow completes in 1–2 API calls. No async event architecture at launch.

Latency Profile

CallLatency classFallback
Neon SELECT on page loadMedium (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 iframeFast (<100ms, CDN)Direct link fallback

11 Component List with Priority Tags + MVS Spec

Priority Distribution

TagCountPercent
MUST-BUILD18 items47% — justified; majority are Musinique ports
IMPORTANT11 items29%
NICE-TO-HAVE7 items18%
EXPERIMENTAL3 items8% — user accounts, community form, Substack
MVS Statement — MUST-BUILD Only
The core loop is complete with 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 Net-New MUST-BUILD Items

ItemWhat it is
Homepage scroll arcStatic 5-beat page — no framework complexity
Admin dev tab + uploadMost complex admin tab; Blob + DB write sequence
/api/dev/upload5-step validation, Blob then DB
Category/Gru taxonomyFilesystem directories + meta tag read
Iframe sandbox + errorOne JSX attribute + one error component
Quality signal on cardsOne DB field + one CSS class
Admin: Doc Audit PromptContent entry in /tools — zero code

12 Out of Scope

Binding record of decisions. Reopening requires a documented reason with a date.

ItemReasonReopen condition
User accountsNo auth surface needed at launchv2
Progress trackingRequires accountsv2
On-site Claude APINo API proxy; learner runs locallyPermanently excluded unless business model changes
Community submission formEmail/DM sufficient at launchv2
Automated on-site auditPublish decision is irreducibly humanPermanently excluded
Substack integrationNot in content strategy at launchv2
Course module systemViolates P2Permanently excluded
Blog/dev commentsRequires moderation infrastructurev2
Paid contentNo commerce contextSeparate SDD required
Admin analytics dashboardVercel Analytics sufficientv2
Multi-admin / RBACSolo operator at launchv2
Mobile appDesktop use caseNot planned
Global searchHigh complexity, low launch valuev2
Tool version diff UIversion field sufficient at launchv2
i18nEnglish onlyFuture

13 Infrastructure and Deployment Requirements

Stack: Next.js 15 (App Router), TypeScript 5, Tailwind CSS, Vercel, Neon PostgreSQL, Vercel Blob. Identical to Musinique.

New: 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 on production URL

14 Risk Register

RiskLikelihoodImpactMitigation
Unsandboxed community HTML (XSS)HighHighsandbox attribute on all community iframes — non-negotiable
Principle drift during implementationMediumHighSDD is the reference; run /g2 before v2 planning
Content drought at launchMediumHighThree Featured docs + five videos required before launch date is set
Blob orphan accumulationMediumLowLog orphaned URLs; monthly manual cleanup; v2 cleanup job
Admin publishes without auditMediumMediumUI reminder in dashboard; technical enforcement in v2
Category taxonomy inadequateLowLow–MediumNew category = new subdirectory, no code change
Gru prompt exceeds Claude Project limitLowHighCharacter count on tool detail page; split prompt as contingency

15 Open Questions Log

14 of 15 questions resolved. One remaining — non-blocking.

OQ-13 — Video CHECK Constraint
Must be included in migration script before launch. The constraint requires that at least one of youtube_id or blob_url is non-null on every video record. This is addressed in the migration script (step 4 in the run order). Owner: Nik Bear 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 integration

16 Document Metadata

FieldValue
Version1.0
DateMarch 30, 2026
OwnerNik Bear Brown / Bear Brown & Company / Musinique LLC
Produced withGru (Ada + Boondoggling layer)
Phases completedV1–V4, S1–S4, D1–D3, P1–P5
Open questions1 (OQ-13 — non-blocking)
StatusReady to Govern Implementation
Next action/g2 audit, then /claude Boondoggle Score