seo-onboard
First-time SEO setup for a new property — builds the task scaffold, writes workspace config, captures baseline, and registers the recurring sync cadence that ke
npx skills add seo-onboard
seo-onboard — Build Once, Sync Forever
This is the skill that turns a cold website into a SEO/AEO-managed property. You build the scaffold once, and the scaffold keeps itself updated.
Your output is NOT a one-shot report. Your output is a living system: a config file, a task backbone with the right cadences, a baseline snapshot, and a weekly sync hook. Six months from now, the site's SEO operations should still be running off what you set up today.
Two modes — detect which one you're in before doing anything:
- Fresh onboard — no
seo-config.yamlexists. Run all 7 phases. - Sync —
seo-config.yamlexists. Skip to Phase 7 (Sync), diff state, patch the backbone, don't duplicate.
Required Inputs
Project ID (Tycoon): $ARGUMENTS[0]. Outside Tycoon, infer workspace from cwd.
Pull context:
# Inside Tycoon — project fundamentals
tyctl task list --project $ARGUMENTS[0] --json 2>/dev/null
Detect repo + existing SEO state
test -f seo-config.yaml && echo "SYNC MODE" || echo "FRESH MODE"
test -d reports/seo && echo "Has reports dir"
ls public/llms.txt public/ai-plugin.json public/robots.txt 2>/dev/null
Minimum inputs you MUST have before proceeding (ask the owner if any are missing — don't guess):
- Domain (e.g.,
skillboss.co) - GSC property (domain or URL prefix)
- Content directory (where pages live — e.g.,
app/[locale]/) - Top 3–5 competitors (real URLs)
- Primary audience (one sentence — "AI app developers building coding agents")
- Languages (default
[en], expand from there)
Phase 1 — Intent Brief (always post first)
Before touching any file, post a chat brief:
- What you understand the site to be, in one line.
- The current SEO state you can observe in 60 seconds (indexed? has sitemap? has llms.txt? any AEO signals?).
- What "a world-class SEO onboard" means for this site specifically —
skillboss.coneeds 100 pages/day + 7-language pipeline; a 5-person B2B SaaS needs 10 pages/quarter + deep comparison content. Don't apply the wrong template. - Your assumptions. Mark anything you're guessing at.
Phase 2 — Baseline Audit
Capture the starting state. You can't measure progress without a zero mark.
# Technical snapshot
curl -sI https://$DOMAIN | head -20
curl -s https://$DOMAIN/robots.txt
curl -s https://$DOMAIN/sitemap.xml | head -50
curl -s https://$DOMAIN/llms.txt 2>/dev/null | head -20
Indexing snapshot (GSC, if connected)
via existing scripts in ~/skillboss/scripts/seo/ or workspace equivalent
Delegate the deep audit to technical-seo-audit skill — don't re-implement it inline. You're the orchestrator here, not the auditor.
Write baseline to reports/seo/baseline-{YYYY-MM-DD}.json with:
- Technical score + top 3 issues
- Indexed pages (from GSC Coverage)
- Top 50 ranking keywords (current position, clicks, impressions)
- CWV p75 (LCP, INP, CLS) from PageSpeed / CrUX
- AEO visibility — run 5 representative queries against ChatGPT/Perplexity, record whether the brand is cited
llms.txt/ai-plugin.json/robots.txtpresence + correctness
Phase 3 — Write seo-config.yaml
This is the single source of truth for every downstream SEO skill. Without it, seo-discover, seo-create, seo-optimize, seo-monitor have to hardcode assumptions.
Template (write to workspace root):
version: 1
created: 2026-04-16
domain: skillboss.co
gsc_property: sc-domain:skillboss.co
audience: "AI app developers building coding agents and multi-model apps"
content:
dir: app/[locale]
templates: [alternatives, compare, blog, use, landing, integration]
template_registry: ~/.claude/rules/seo-page-templates.md
brand:
color: "#d97757"
color_hover: "#c6613f"
banned_colors: ["#6366f1", "#8b5cf6", "#a855f7"]
voice: "technical, direct, numbers-forward, no fluff"
cta_primary: "Get Started Free — $2 Credits"
trust_signals:
- "No credit card needed"
- "Set up in 30 seconds"
competitors:
- openrouter.ai
- litellm.ai
- portkey.ai
languages: [en, zh-CN, zh-TW, ja, ko, es, de]
targets:
organic_clicks_monthly: 2500
pages_weekly: 10
aeo_citation_share: 0.20
data_sources:
gsc: enabled
ga4: enabled
ahrefs: optional # enabled if tycoon connector attached
posthog: enabled
cadence:
daily_data_collection: "06:05"
daily_cta_iteration: "10:07"
weekly_report: "Mon 09:03"
weekly_aeo_tracking: "Wed 10:07"
monthly_audit: "1st 09:00"
quarterly_refresh: "90d"
Validate the YAML loads. Commit if inside a repo.
Phase 4 — Create Task Scaffold (the backbone)
This is the 架子. Every recurring piece of SEO work becomes a Task with a recurringRule, assigned to role=seo, persisted to the workspace.
Two categories of tasks:
4a. Recurring backbone (runs forever)
Create with tyctl task create --recurring when inside Tycoon; fall back to scheduled cron tasks (/Users/xiaoyinqu/.claude/scripts/) when standalone.
| Title | Cadence | Role | Description contract |
|---|---|---|---|
| Daily SEO data collection | 06:05 | seo | Pull GSC + GA4 + indexing; write reports/seo/daily-{date}.json; update kpi-history.json |
| Daily CTR/CTA iteration | 10:07 | seo | Pick 1–2 pages with highest impressions × (benchmark_CTR - actual_CTR); optimize title/desc/CTA; ship |
| Weekly SEO report | 03 9 1 | seo | 3-week comparison; winners, losers, ≤ 3 recommendations; post to owner |
| Weekly AEO citation tracking | 07 10 3 | seo | Run 20 target queries against ChatGPT/Perplexity/Claude; record citation rate; flag regressions |
| Monthly full site audit | 0 9 1 | seo | Delegate to technical-seo-audit; compare vs baseline; file issues for regressions |
| Quarterly content refresh | every 90d | seo | Identify pages where traffic declined ≥ 30%; refresh with current data; update Last Updated timestamps |
- The contract (what "done" looks like for one run)
- The data source (GSC path, config field, etc.)
- The output (file path or asset post format)
4b. One-time onboarding tasks (P0–P2, disappear when complete)
| Title | Priority | Notes |
|---|---|---|
| Write keyword research (top 100 opportunities) | P0 | Invoke seo-discover |
Ensure llms.txt + ai-plugin.json + markdown versions exist | P0 | AEO Conf finding: markdown = +300% citations |
| Map competitor page gaps (alternatives/compare the site is missing) | P0 | Output a backlog, not a prose report |
| Ship first 5 template-validated pages | P1 | Invoke seo-create; use approved templates only |
| Stand up author/E-E-A-T pages | P2 | Required for Google 2026 E-E-A-T signals |
| Set up AEO probes (20 representative queries baseline) | P1 | Feeds the weekly AEO tracking task |
| Register in schema.org via Organization + SameAs | P2 | One-time structured data |
- A definition of done
- A linked skill or script to invoke
- An owner (role=seo by default; escalate if Tycoon routes to specialist)
Phase 5 — Populate the Backlog
seo-discover will have returned a list of opportunities. Write them to reports/seo/backlog.md with the priority score formula:
Priority = impressions × (benchmark_CTR - actual_CTR) × intent_multiplier
Each backlog item becomes an activatable Task when the weekly sync promotes it. Do not create 200 tasks up front — that creates a rotting task board. Keep the backlog in markdown; let the weekly sync promote the top N into active tasks.
Phase 6 — Dashboard Setup
Generate reports/seo/dashboard.md. This is the owner's read-only view:
# SEO Dashboard — {domain}
_Last synced: {ts}_
KPIs (vs baseline {date})
Metric Baseline Current Target Δ Organic clicks / month ... ... 2500 ...
Impressions / month ... ... ... ...
Avg position (top 50 kws) ... ... ... ...
AEO citation rate ... ... 20% ...
Indexed pages ... ... ... ...
Active recurring tasks (6)
{bulleted list with last-run + next-run}
Open one-time tasks ({N})
{priority-sorted list}
Next 5 priority actions
{synthesized from backlog + CTR opportunities}
Phase 7 — Sync Mode (Re-run Behavior)
This is why the skill is called onboard — it onboards, then stays.When re-invoked on a workspace that already has seo-config.yaml:
- Diff config vs what's live. New competitors? New templates? Language added?
- Reconcile recurring tasks — if cadence changed in config, update the
recurringRuleon the task (don't create a duplicate). - Refresh baseline snapshot every 90 days (quarterly). Write
baseline-{new-date}.jsonbut keep the old one; link both from dashboard. - Promote backlog items — move top-ranked backlog items into active one-time tasks (up to
targets.pages_weeklyworth). - Archive completed tasks older than 30 days.
- Update
llms.txtif new canonical content landed since last sync. - Log changes to
reports/seo/sync-log.md(append-only, never rewrite history).
A weekly recurring Task — seo-onboard sync — is itself part of the backbone created in Phase 4a. That's how the scaffold keeps itself alive.
Quality Bar (non-negotiable before marking done)
On fresh onboard:
- [ ]
seo-config.yamlexists, validates, is committed (if in a repo) - [ ]
reports/seo/baseline-{date}.jsonexists with all 6 fields populated - [ ] 6 recurring backbone tasks created, each with a valid
recurringRuleand a contract in its description - [ ] 7 one-time onboarding tasks created with definitions of done
- [ ]
reports/seo/backlog.mdhas ≥ 30 scored opportunities - [ ]
reports/seo/dashboard.mdrenders end-to-end - [ ] A self-scheduling
seo-onboard synctask is on the calendar - [ ] Owner has received a handoff summary (not a 20-line dump — a 1-screen brief + next action)
- [ ]
sync-log.mdhas a new entry - [ ] No duplicate tasks created
- [ ] Config diff logged
- [ ] Baseline refreshed if ≥ 90 days since last
- [ ] Dashboard
Last syncedtimestamp updated
Integration Notes
Inside Tycoon: tasks go viatyctl task create (persists to Postgres, shows in Task board, AI CEO can monitor). Recurring rules are enforced by the VM's RoutineScheduler. role=seo routes to the SEO agent persona (once that agent is added to builtin-agents.ts).
Standalone (e.g., inside ~/skillboss without Tycoon): fall back to:
tasks/todo.mdfor one-time tasks~/.claude/scripts/for cron scriptsscheduled-tasksMCP for recurrences
tyctl in PATH and $ARGUMENTS[0] project ID.
Deliverables (what you actually ship)
seo-config.yamlat workspace root.reports/seo/baseline-{date}.json,reports/seo/backlog.md,reports/seo/dashboard.md.- Recurring task backbone (6 tasks, each with a live cadence).
- One-time onboarding task set (7 tasks).
- Self-scheduling sync task on the calendar.
- A 1-screen handoff summary with: what was set up, what the next action is, how to trigger updates.
What You Refuse
- To ship without an Intent Brief (Phase 1). Jumping straight to task creation produces a generic scaffold.
- To create > 15 initial active tasks. A rotting task board is worse than a small one.
- To hardcode One Person Company AI-specific values into the config. If you find yourself typing
skillboss.cofor a customer workspace, stop and ask. - To skip baseline capture. "We'll measure later" means we never measure.
- To create recurring tasks without a contract in their description. A recurring task without a clear "done" definition will run forever producing garbage.
- To duplicate work already owned by
seo-discover,seo-create,seo-optimize,seo-monitor. This skill is the conductor; those are the instruments.
Related Skills
seo-discover— called in Phase 5 to populate the backlog.seo-create— called by the "ship first 5 pages" one-time task.seo-optimize— owns the daily CTR iteration task.seo-monitor— owns the daily data collection + weekly report tasks.technical-seo-audit— called in Phase 2 (baseline) and by the monthly audit task.
_Design principle: the onboarding doesn't end. Phase 7 is the load-bearing phase — the scaffold you build must keep itself updated without you. A skill that runs once and dies is a skill that delivers a snapshot, not a system._