Releases
Every Pectus release lists what changed and any required actions. If a
version adds a database migration or a config change, it shows up here
first. The CMS itself surfaces the same prompts inline when it detects
a missing migration.
v0.4.15
2026-05-14 User-feedback triage + multi-brand path fixes - GA4 and Search Console deferral baked into the install flow: those connectors are no longer required to boot Pectus. Honest-disabled gating surfaces on every Google-data surface until a service account is added.
- Multi-brand path mismatch fixes at three layers: brand resolver, project lookup, and skill-runner brand context. Brand-prefixed routes resolve consistently when the brand slug contains non-ASCII characters.
- Inbound / outbound chip filter on both Apps pages (project-level and brand-level). Inactive apps still listed, but the chip filter narrows by app type.
- README reframe in the public repo: scaffolding for builders, four-layer ASCII diagram, APP.md example, honest scope sections, ecosystem-play closing.
- pectus.ai homepage reframed in the same direction: positioned as a builder framework, not a finished product. New honest-scope sections name what works today and what doesn't.
v0.4.14
2026-05-11 Pages builder UX + Files library - Pages builder preview now renders inside the CMS at `/pectus-preview/[variantId]`. Same origin as the rest of the CMS, no second dev server. The Astro app stays for publishing.
- Canonical env model: one `cms/.env.local` file. CMS auto-snapshots from `process.env` at boot; a settings UI edits them; a shared loader (`scripts/load-pectus-env.mjs`) hands the same values to any app with its own runtime.
- Make-it skill teaches the env pattern so new community apps inherit it by default.
- Files library in Content Insights: per-project Supabase bucket with thumbnail grid and drag-and-drop upload.
- Brand profile gains a Type sizes section (H1/H2/H3/body), persisted to `brands.font_sizes`.
- Eleven commits between `4477b4d` and `12a2a37` on main covering builder UX, env consolidation, and brand-profile polish.
v0.4.4 → v0.4.13
2026-05-09 Migration runner, Insights, Articles authoring Required action Apply migration 0002_content_insights.sql
Adds Content Insights Insights + Articles tables: article_transitions, data_snapshots, data_interpretations, idea_generations, idea_post_dismissals, llm_usage, brand example photo categories, image-gen API key slots (google_genai, fal, replicate), and the `_pectus_migrations` ledger. Apply it from `/settings/updates`.
File: connectors/supabase/migrations/0002_content_insights.sql ↗
- In-CMS migration runner at `/settings/updates`. Pasting `0001_pectus_v04.sql` is the one-time bootstrap; subsequent migrations apply via the Supabase Management API on the user's behalf, with copy-paste fallback when SUPABASE_ACCESS_TOKEN isn't set.
- Insights lands the Content Insights. Run analysis fires Stage 1 (Opus interpretation of GA4 / Search Console / keywords / articles snapshot) and Stage 2 (Opus 5 ranked ideas). Idea cards offer one-click Draft → AI Write → Sonnet 4.6 generated draft → article editor with status workflow → Publish.
- Articles index rebuilt: table with search, status filter, categories chip line, per-row Archive / Delete, bulk-select with action dropdown, Import for shells. AI Write fields persist across tab switches. Generate-article modal walks 8 stages with progress dots.
- Article editor on TipTap: H2/H3, B/I/S, link via inline popover, bullet/ordered/quote, undo/redo, image upload + AI image generation through Google (Imagen 4, Gemini 3 Pro), fal.ai (Flux Pro 1.1 Ultra), and Replicate (Flux Dev, Recraft v3).
- Status workflow: draft → brand_review → market_lead_review → published | archived, with a StatusBar at the top of the editor owning transitions.
- Brand example photos rebuilt per spec: categories with descriptions, drawer with Gemini 3 Flash describe, parallel upload of 5 with thumbnails + per-file XHR progress, auto-save on upload.
- Image-gen API keys (Google AI / fal.ai / Replicate) live in a power-up panel inside the brand profile's Image generation card. Stored in `integrations` per brand under jsonb `service_account_json: {"api_key": "..."}`.
- Article slug collisions now use incrementing `-2`, `-3` suffixes via `uniqueSlug()` instead of timestamp-base36.
- CSS hygiene: cms/CLAUDE.md documents the Tailwind-utilities-first policy. ~95 dead `.pectus-*` rules (~890 lines) removed from `globals.css` after a build-time cascade audit.
v0.4.2
2026-05-05 Connector framing + IA refactor Required action Wipe and reinstall: paste the squashed 0001_pectus_v04.sql
v0.4.2 squashes every previous migration (0001–0008) into a single `0001_pectus_v04.sql`, renames `workspaces` → `projects` everywhere (DB, routes, CLI), and re-keys app activation per-project. There is no automatic upgrade path. To move from v0.4.1: drop / reset your Supabase project, re-clone or `npx pectus init` from scratch, walk pectus.md to rebuild brand + first project, then apply the squashed migration via `/settings/updates`.
File: connectors/supabase/migrations/0001_pectus_v04.sql ↗
- Pectus is framed as a connector framework with a UI, not a CMS. Content-hub is one app among peers (alongside GSC, GA4, seed-keywords).
- Three gating principles enforced on every interactive surface: must-create-without-integrations, honest-disabled, article-authoring-never-gated.
- `workspace` → `project` rename across CMS, CLI, install agent, every app's APP.md, and every skill's SKILL.md. `pectus workspace add` keeps working as an alias for `pectus project add` for one release.
- Smart surfaces collapse into apps: pages, articles, sources, reviews, plan, gap, settings/site-url, settings/redirects, settings/review-policy all moved under apps/content-insights/. settings/seed-keywords moved under apps/seed-keywords/settings. performance moved under apps/ga4/.
- Apps page is project-level: `/brands/<slug>/projects/<code>/apps` lists installed apps with per-row Activate / Deactivate. Per-project sidebar derives groups from each activated app's manifest.
- Settings panel: /admin and /system/updates retired. New /settings hub at /settings/account, /settings/users, /settings/updates, plus brand-scoped /brands/<slug>/settings. NavBar shows Settings instead of Admin / Updates.
- Gating via <NeedsCard>: site plan, gap analysis, GA4 performance, GSC keyword sync, and Publish all gate honestly. Missing prerequisites render an inline CTA card with deep-links to the fix.
- Add-brand modal on /brands. Keyword importer accepts .csv / .tsv / .xls / .xlsx.
- Legacy redirects: `/brands/<slug>/workspaces/<code>/...` URLs 301 to the new `/projects/<code>/...` shape for one release cycle.
v0.4.1
2026-05-04 Slug fix + CMS-driven updates Required action Apply migration 0008_slug_unaccent.sql
Rewrites public._slugify to use the unaccent Postgres extension before character stripping. Re-slugifies every existing brand row whose stored slug differs from the canonical form. Idempotent. Apply it via the new /system/updates page or the Supabase SQL editor.
File: connectors/supabase/migrations/0008_slug_unaccent.sql ↗
- v0.4.0 alpha shipped with two slugify implementations that disagreed on Unicode. The CLI used NFKD; the SQL `_slugify` had no diacritic handling, so `Aström` produced two different slugs and broke every `/brands/<slug>/...` route for non-ASCII brand names. Migration 0008 fixes it.
- /system/updates page: lists every migration in connectors/supabase/migrations/. Click Apply to run a migration against your Supabase project via the Management API.
- runManagementSql helper wraps POST https://api.supabase.com/v1/projects/<ref>/database/query with project-ref derivation from NEXT_PUBLIC_SUPABASE_URL.
- NavBar gains an Updates link visible to every authenticated user.
v0.4.0
2026-05-04 Multi-brand alpha Required action Apply migration 0007_v0_4_multi_brand.sql on a fresh project
Renames `brand_profile` → `brands`, drops the singleton constraint, adds `slug` (NOT NULL UNIQUE) + `created_at`, and adds `brand_id` FK with ON DELETE CASCADE on 19 child tables. Backfills, then NOT NULL + indexes. Re-scopes `projects.code` and `integrations.provider` uniqueness per-brand. This migration is destructive on schema, so re-run on a fresh project or take a backup first. After upgrade: `npx pectus update` runs the disk migration that moves `brand/` → `brands/<slug>/` and `knowledge/` → `brands/<slug>/knowledge/`.
File: connectors/supabase/migrations/0007_v0_4_multi_brand.sql ↗
- Pectus now hosts multiple brands inside a single install. Every brand gets its own row, its own disk directory at brands/<slug>/, its own slug-prefixed URL space, and its own scoped DB rows.
- Brand-prefixed routes: (app)/{brand,apps,reviews,performance,projects} physically moved under (app)/brands/[slug]/. New /brands index page lists every brand.
- BrandSwitcher in the top nav: cascade-fallback server action that swaps the slug and lands on the deepest path that still resolves under the new brand.
- Middleware redirects: every legacy flat path (/brand, /apps, /reviews, /performance, /projects/...) resolves to the brand-prefixed equivalent based on the pectus.lastBrand cookie.
- Skill runner brand-aware: project lookup includes brand_id; brand row resolved once per run; gatherKnowledgeInsights(brandSlug) reads from brands/<slug>/knowledge/insights.md.
- CLI: `npx pectus brand add` is slug-parameterized. `npx pectus connect supabase` walks brands/<slug>/ directories and upserts each row.
- Install agent idempotency: pectus.md step 5 reads .env.local first and skips every variable already set, masking secret-shaped values to first 4 + last 4 characters.
v0.3.9
2026-05-04 Collect Supabase access token at install - Install agent (pectus.md step 5) now asks the user to generate a Supabase access token at https://supabase.com/dashboard/account/tokens and paste it back. Saved to .env.local as SUPABASE_ACCESS_TOKEN. Pectus needs this token to apply schema migrations and other Management-API operations on the user's behalf.
- .env.example documents SUPABASE_ACCESS_TOKEN with the token-page URL.
v0.3.8
2026-05-04 Fix stale /brand credential pointers - GSC sync error messages now point users to /apps/gsc instead of /brand for Google service account and Search Console site URL configuration.
- GscSyncButton UI hint updated for the same reason.
- Google OAuth init and callback routes redirect to /apps/ga4 on success/error instead of /brand.
v0.3.7
2026-05-04 Audit follow-up: auth, prompt caching, sidebar polish - Server actions in cms/src/app/(app)/apps/[name]/actions.ts now call requireUser() before mutating state.
- saveContentInsightsConfig switched from .single() to .maybeSingle() with a fallback redirect, so a missing project row no longer lands on /projects/undefined.
- Skill runner uses Anthropic prompt caching for stable input layers (BRAND, ICP, KNOWLEDGE INSIGHTS) and the system prompt. Successive runs in a 5-minute window read cached input tokens for the static layers.
- Sidebar groups no longer flash open on first paint when previously closed. Tooltips added to sidebar group labels and project header.
- Shared cms/src/app/components/InfoDot.tsx lifted from BrandForm.tsx so all '?' affordances reach for the same component.
v0.3.5
2026-05-03 Workspace sidebar + install polish - WordPress-style left sidebar inside /workspaces/[code], replacing the horizontal tab strip. Dashboard at top; activated apps render as their own collapsible groups; a Settings group holds ICP, Seed keywords, Keyword traffic, Sources, and Review policy. State persists per group in localStorage. Mobile collapses to an off-canvas drawer below 1024px.
- Settings → Site URL and Redirects moved out of the Settings group and into the Content Insights group, where they actually belong.
- Brand save no longer fails on the partial unique index.
- Three new install walkthroughs on pectus.ai: Anthropic API account, Supabase account, Google service account.
- Maintainer-specific identifiers replaced with generic acme-corp / your-brand examples.
v0.3.0
2026-05-03 Apps as plugins Required action Run migration 0006_activated_apps.sql
v0.3 adds two new tables (activated_apps, workspace_app_config) that gate which app surfaces render in the CMS. The migration also includes a backfill that auto-activates content-insights for any existing workspace with a mount slug or content_insights_repo set, so v0.2 users do not lose their Articles or Pages tabs after upgrading.
File: connectors/supabase/migrations/0006_activated_apps.sql ↗
- New top-nav entry Apps in the CMS. Lists every app under apps/* with status badges (Activated / Available), tooltips on type, and an Open button per card.
- Per-app settings pages at /apps/[name]. Each one is the real configuration UI: paste service account JSON for Google apps, pick GA4 property or Search Console site with live test, configure site shape and GitHub repo for Content Insights.
- Shared Google Cloud connection panel on GA4, Search Console, and Google Ads detail pages. One service account JSON powers all three.
- Content Insights becomes the first plugin. Workspace Pages and Articles tabs, plus Settings → Site URL and Redirects, only render when content-insights is activated.
- npx pectus workspace create now asks 4 prompts instead of 6. Site shape and GitHub repo moved into the Content Insights settings page.
- Updater (npx pectus update) now auto-stashes modified tracked files before rebase and pops after.
- Node.js floor pinned to ≥20.19 across root engines, pectus.md step 1, and pectus doctor.
v0.2.0
2026-05-01 Content Insights as website builder - Pages tab and visual page builder: 7 brand-aware templates (hero, feature grid, FAQ, pricing, testimonials, CTA, blog), 8 reusable blocks, locale chips, slug editor, draft preview iframe.
- Publish pipeline: URL resolution, automatic redirect generation when slugs change, single atomic commit per publish.
- Workspace Settings → Site URL and Redirects pages.
- Brand profile import from Claude Design (paste a Claude Design URL, get back a populated brand.json with colors, fonts, voice, and guidelines).
- Brand profile gains an Advanced subset (duotone accent, surface levels, semantic colors, mono font, radius preference).
- Insights architecture: per-skill insights table, base Insight type, skill-runner caches and re-runs interpretations only when stale.
- Seed Keywords app: per-workspace user-typed keyword list, used as the analysis spine when GSC traffic data isn't available yet.
- Workspace Getting Started checklist on the dashboard.
v0.1.0
2026-04-27 Initial scaffold - Repo skeleton: connectors/, apps/, skills/, knowledge/, brand/, cms/, cli/.
- Five seed skills: weekly-analysis, seo-strategy, jobs-to-be-done, internal-linking, knowledge-digest.
- Pre-installed content-insights app at apps/content-insights/ — a static Astro site that renders your articles and pages.
- CLI command stubs and reference documentation at https://pectus.ai/docs.