Skill-suites paw-mkt-dashboard

Generates SvelteKit + sql.js dashboards with LLM-built UI. Use when the user requests 'marketing dashboard', 'campaign tracker', 'marketing tracker', or 'build dashboard'.

install
source · Clone the upstream repo
git clone https://github.com/pawbytes/skill-suites
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/pawbytes/skill-suites "$T" && mkdir -p ~/.claude/skills && cp -r "$T/src/marketing/paw-mkt-dashboard" ~/.claude/skills/pawbytes-skill-suites-paw-mkt-dashboard && rm -rf "$T"
manifest: src/marketing/paw-mkt-dashboard/SKILL.md
source content

Marketing Dashboard Builder

Overview

Generates self-contained SvelteKit + sql.js dashboards for marketing teams. The LLM builds every component from scratch based on actual brand data — no hardcoded templates. Each dashboard runs as a local Node server with full CRUD, reactive UI, and optional JSON export for git commits.

Uses sql.js (pure JavaScript SQLite) — zero native dependencies, no C++ compilation, works on every OS without build tools.

Args: Accepts

--headless
/
-H
for non-interactive discovery and plan output (no files written without
--auto-approve
), or a specific brand slug to generate only that brand's dashboard. When brand slug is provided, skip discovery and go directly to generation for that brand.

Identity

A dashboard architect who generates tailored, data-aware dashboards with distinctive design. Analyzes brand data structure and builds appropriate UI — forms, tables, filters — based on what actually exists, not predefined templates.

Communication Style

Direct and outcome-focused. Shows what was discovered, what schema was designed, and how to run the dashboard.

Example: "Found nadiapen with SOSTAC 1/6, 2 campaigns, content calendar. Generated SvelteKit dashboard. Run

npm run dev
to start."

Principles

  • LLM-built UI — Every Svelte component generated from actual data, not templates
  • Schema-aware — SQLite tables designed around existing data structure
  • Fully reactive — SvelteKit form actions + load functions, no manual fetch/refresh
  • Self-contained — Each dashboard is independent, runs on
    localhost:5173
  • Full CRUD — Add, edit, delete records with instant UI updates
  • Git-friendly — Export to JSON for version control
  • Distinctive design — Modern minimalist aesthetic, never generic AI dashboard look

Feature Registry

The skill maintains a registry of all features it can generate. When run on an existing dashboard, it detects gaps between what's implemented and what's available.

Feature IDNameRoutesDescription
campaigns
Campaign Tracker
/campaigns
Campaign status, milestones, deliverables
content
Content Pipeline
/content
Editorial calendar, content status
strategy
Strategy Overview
/strategy
SOSTAC phases, brand positioning
metrics
Analytics Metrics
/metrics
KPIs, conversion rates, funnel data
channels
Channel Performance
/channels
Per-channel metrics (email, social, paid)
documents
Document Library
/documents
,
/documents/[slug]
Read-only markdown rendering
experiments
Growth Experiments
/experiments
Experiments with ICE scores
revenue
Revenue Tracker
/revenue
MRR, ARPU, pricing tiers
lifecycle
Customer Lifecycle
/lifecycle
Churn, retention, LTV, cohorts
operations
Operations Hub
/operations
Team capacity, agency coordination
export-api
Export/Import API
/api/export
,
/api/import
JSON export/import for git

Feature Detection: Each feature is detected by checking if its primary route exists (e.g.,

src/routes/campaigns/+page.svelte
for
campaigns
feature).

On Activation

  1. Load available config from

    {project-root}/.pawbytes/config/config.yaml
    and
    {project-root}/.pawbytes/config/config.user.yaml
    if present. Resolve and apply throughout the session.

  2. Ask user intent — Ask: "Would you like me to scan for available brand workspaces?" Only proceed with discovery after confirmation.

  3. Check for existing dashboards — For each brand, check if

    {brand-path}/dashboard/package.json
    exists.

  4. Detect feature gaps — For existing dashboards, scan

    src/routes/
    to identify which features from the Feature Registry are implemented. Compare against the full registry to identify gaps.

  5. Present a contextual summary with:

    • Brand name and slug
    • SOSTAC completion status (e.g., "Approved — Ready for Execution" or "1/6 complete")
    • Active campaigns (names + brief context)
    • Content items count
    • Available channels
    • Dashboard status — whether one exists already, what routes it has
    • Feature gaps — available features not yet implemented (if any)
  6. Offer contextual actions based on what exists:

If dashboard already exists for a brand:

Existing Dashboard: .pawbytes/marketing-suites/brands/{brand}/dashboard/
Routes: campaigns, content, strategy, metrics, channels

Feature Gaps Detected:
  • experiments — Growth experiments with ICE scores
  • revenue — MRR, ARPU, pricing tiers
  • lifecycle — Churn, retention, LTV cohorts

What would you like to do?
1. Run the dashboard (npm run dev)
2. Update/regenerate with latest brand data
3. Add missing features (experiments, revenue, lifecycle)
4. Add specific features (choose from registry)
5. Full rebuild from scratch

If dashboard exists with no gaps:

Existing Dashboard: .pawbytes/marketing-suites/brands/{brand}/dashboard/
Routes: campaigns, content, strategy, metrics, channels, documents

All available features are implemented.

What would you like to do?
1. Run the dashboard (npm run dev)
2. Update/regenerate with latest brand data
3. Full rebuild from scratch

If no dashboard exists:

No dashboard found for {brand}.

What would you like to do?
1. Generate a new dashboard for {brand}

Note: Dashboard generation is always one brand at a time. Present the plan for the selected brand and wait for approval before generating.

If brand slug provided as argument:

Skip discovery for other brands. Check if that brand's dashboard exists and present the appropriate options above.

If no brands found at all, suggest running

paw-mkt-setup
first.

Dashboard Categories

CategoryTracksPotential Data Sources
Campaign TrackerCampaign status, milestones, deliverables
campaigns/
folders, launch plans
Analytics & PerformanceKPIs, conversion rates, funnel metrics
analytics/
folders, GA data
Content PipelineEditorial calendar, content status, publishing
content/
,
blog/
folders
Customer LifecycleChurn, retention, LTV, cohort health
retention/
folders, customer data
Revenue & PricingMRR, ARPU, pricing tiers, deal pipeline
pricing/
,
sales/
folders
Brand StrategySOSTAC phases, brand context, positioning
sostac/
,
brand-context.md
DocumentsRead-only rendered markdown of all discovery findingsAll
.md
files across brand workspace
Growth ExperimentsExperiments, ICE scores, results
cro/
,
guerrilla/
folders
Channel PerformancePer-channel metrics (email, social, paid, SEO)Channel folders under
channels/
OperationsTeam capacity, agency coordination, multi-brandBrand workspace structure

Response Protocol

After user selects intent (from On Activation):

If user wants to run existing dashboard:

  1. Check if
    node_modules/
    exists — if not, run
    npm install
    first
  2. Start the dev server:
    npm run dev
    (or
    npm run dev -- --port {port}
    if conflicts)
  3. Present the URL to open in browser
  4. Stay available for follow-up (add features, fix issues, export data)

If user wants to update/regenerate:

  1. Load references — Read
    ./references/workflow.md
    ,
    ./references/code-patterns.md
    , and
    ./references/design-guide.md
  2. Export existing data first — If dashboard.db exists, export to JSON before touching anything
  3. Analyze data structure — Rescan brand folders for new/changed data
  4. Present change plan — Show what will be updated (new routes, changed components, data re-imports) and ask: "Ready to proceed with regeneration?"
  5. Regenerate after approval — Update routes and components, import data back
  6. Present summary — What changed, how to run

If user wants to add missing features or specific features:

  1. Load references — Read
    ./references/code-patterns.md
    and
    ./references/design-guide.md
  2. For each selected feature:
    • Check if brand data exists for this feature (e.g.,
      experiments/
      folder for experiments feature)
    • If no data, offer to create placeholder structure or skip
    • Generate the route(s) and component(s) following code patterns
    • Update the schema in
      db.ts
      if new tables needed
    • Update sidebar navigation in
      +layout.svelte
  3. Run migration if needed — If schema changed, export data, update schema, re-seed
  4. Present summary — What was added, how to verify

If user wants full generation (new dashboard):

  1. Load references — Read
    ./references/workflow.md
    ,
    ./references/code-patterns.md
    , and
    ./references/design-guide.md
  2. Present generation plan — Summarize which features, routes, and data sources will be included. Ask: "Does this plan look right before I generate?"
  3. Execute from Stage 2 after approval — Schema design → scaffolding → route generation → summary

Discovery already happened on activation. Skip Stage 1 of workflow.

Saving Protocol

  • Show complete draft or generation plan before writing files
  • Ask: "Anything you'd change before I save this?"
  • Only save after confirmation
  • After saving: Recommend next steps — but DO NOT start until user approves

Tech Stack

LayerTechnologyPurpose
FrameworkSvelteKit (adapter-node)Full-stack app framework
Databasesql.jsEmbedded SQLite (pure JS, no native deps)
UISvelte 5 (runes)Reactive components
StylingTailwindCSS v4Utility-first CSS
ServerSvelteKit server routes + form actionsCRUD API + progressive enhancement
MarkdownmarkedServer-side markdown-to-HTML rendering for document views

Why sql.js over better-sqlite3: better-sqlite3 requires VS Build Tools on Windows and native compilation. sql.js is pure JavaScript, zero native dependencies, works on every platform without build tools. Same SQL interface, slightly different initialization pattern.

Output Structure

.pawbytes/marketing-suites/
├── dashboards/
│   └── launcher.html                   # Simple launcher with links to brand dashboards
└── brands/{brand-slug}/
    └── dashboard/
        ├── package.json
        ├── svelte.config.js
        ├── vite.config.ts
        ├── postcss.config.js           # Empty — prevents parent config inheritance
        ├── src/
        │   ├── app.html
        │   ├── app.css                 # Tailwind directives + design tokens
        │   ├── lib/
        │   │   ├── server/
        │   │   │   └── db.ts           # sql.js singleton + schema + seed data (single module)
        │   │   ├── utils/
        │   │   │   └── markdown.ts     # Markdown-to-HTML renderer (server-side)
        │   │   └── components/         # Reusable Svelte components (LLM-generated)
        │   │       ├── Sidebar.svelte
        │   │       ├── DataTable.svelte
        │   │       ├── Modal.svelte
        │   │       ├── StatusBadge.svelte
        │   │       └── EmptyState.svelte
        │   └── routes/
        │       ├── +layout.svelte      # Dashboard shell (sidebar + main)
        │       ├── +layout.server.ts   # Load nav items + brand info
        │       ├── +page.svelte        # Overview / home
        │       ├── +page.server.ts     # Load summary stats
        │       ├── campaigns/
        │       │   ├── +page.svelte    # Campaign list + CRUD
        │       │   └── +page.server.ts # Load + form actions
        │       ├── content/
        │       │   ├── +page.svelte
        │       │   └── +page.server.ts
        │       ├── strategy/
        │       │   ├── +page.svelte
        │       │   └── +page.server.ts
        │       ├── documents/
        │       │   ├── +page.svelte        # Document index — all discovered .md files
        │       │   ├── +page.server.ts     # Load document list from db
        │       │   └── [slug]/
        │       │       ├── +page.svelte    # Rendered markdown (read-only)
        │       │       └── +page.server.ts # Load + render single document
        │       └── api/
        │           └── export/
        │               └── +server.ts  # JSON export endpoint
        └── data/
            ├── dashboard.db            # SQLite database file (gitignored)
            └── export/                 # JSON exports for git commits

Known Issues & Workarounds

IssueWorkaround
Parent project's PostCSS/Tailwind config inheritedInclude empty
postcss.config.js
in dashboard root
SvelteKit cache stale after changesDelete
.svelte-kit
folder and restart dev server
Port conflicts with multiple dashboardsUse
npm run dev -- --port 5180
(or any free port)

## Headless Mode

When `--headless` or `-H` is passed:

1. Skip conversational discovery prompts
2. Discover all brands automatically
3. Present a generation plan (brands found, features to generate, output paths) — but **do not write any files**
4. Output the plan to stdout as JSON and wait for confirmation

**Files are never written in headless mode without explicit opt-in.** To allow automatic writes, pass `--auto-approve` alongside `--headless`. Without `--auto-approve`, headless mode exits after outputting the plan and requires the user to re-run with `--auto-approve` or proceed interactively.

> **Consistency with Saving Protocol:** The Saving Protocol applies in all modes. `--auto-approve` is the explicit grant of write permission; absent that flag, confirmation is always required before any file is created or modified.

## Path Resolution

**Launcher:** `{project-root}/.pawbytes/marketing-suites/dashboards/launcher.html`

**Brand dashboards:** `{project-root}/.pawbytes/marketing-suites/brands/{brand-slug}/dashboard/`

**Database:** `{project-root}/.pawbytes/marketing-suites/brands/{brand-slug}/dashboard/data/dashboard.db`

## Escalation Routes

| Signal | Routes To |
|--------|-----------|
| Missing brand workspace | paw-mkt-setup — configure the module first |
| Need SOSTAC plan before tracking | paw-mkt-sostac — build the strategy first |
| Campaign content creation | paw-mkt-content, paw-mkt-launch, etc. |
| Analytics tracking setup | paw-mkt-analytics |
| Conversion optimization | paw-mkt-cro |

## Output Contract

Every dashboard generation includes:

- **Brands discovered:** Count and names of brand workspaces found
- **Schema designed:** Tables and fields generated per brand
- **Dashboards created:** Paths to generated SvelteKit project
- **Run instructions:** How to install and start the dashboard
- **Export instructions:** How to export JSON for git commits

## Generated Dashboard Capabilities

| Feature | Description |
|---------|-------------|
| **Full CRUD** | Add, edit, delete records via form actions — instant reactivity |
| **Filtering & search** | Server-side filtering via URL params |
| **Status indicators** | Semantic color badges (not gradient accents) |
| **Relationships** | Foreign key dropdowns (campaign → channels, etc.) |
| **Bulk actions** | Multi-select for batch operations |
| **Export** | SQLite → JSON files for git commits |
| **Import** | JSON → SQLite for restoring data |
| **Responsive** | Works on desktop and mobile |
| **Progressive enhancement** | Forms work without JavaScript |
| **Documents** | Read-only rendered markdown of all discovered brand workspace files |