User stories & competitive scorecard
Rates how well StaticOwl serves each persona's stories today, and where the nearest competitor lands.
Scoring rubric
| Score | Meaning |
|---|---|
| 1-2 | Not possible, or so painful it's effectively not possible. |
| 3-4 | Possible but deeply manual, hacky, or incomplete. |
| 5-6 | Possible with workarounds; rough edges visible. |
| 7-8 | Solidly supported; the product handles the case naturally. |
| 9-10 | Best-in-class; the product is a reason by itself to choose this category. |
All scores are honest self-assessments as of 2026-04-25 (re-scored after the AI-assistant + Page Builder + workflows + search + comments + scheduling push of 2026-04-22 → 24).
1. Designer stories
Best-in-class alternatives considered: Webflow, Framer, Squarespace, WordPress+Elementor, Contentful Studio.
| # | Story | StaticOwl | Best alt (score) | Notes |
|---|---|---|---|---|
| D1 | Create a new site from a described vibe | 8 | Webflow 5 · Framer 6 | AI guide with plan-emit + iteration is unusual; most competitors start from a blank canvas or rigid templates. |
| D2 | Seed content types + sample pages on creation | 8 | Squarespace 7 | Persona-driven starter kit; Squarespace uses rigid "what kind of site" templates. |
| D3 | Browse pages in a folder tree | 8 | Kentico 8 · Webflow 3 · WP 2 | Tree + allowed-children is our differentiator vs. most modern CMSes. |
| D4 | Nest folders arbitrarily deep | 8 | Kentico 9 | Works; polish gap on drag-drop vs. Explorer-grade. |
| D5 | Restrict what types live under a folder | 8 | Kentico 9 | allowedChildren supports exact types + wildcard. |
| D6 | Define a custom content type in UI | 8 ↑2 | Contentful 9 · Sanity 8 | Basic CRUD + "Derive from" picker: pick page (or any existing type) → fields copied into the new type as a starting point. No live inheritance — clean copy. |
| D7 | Add field validation (required, unique) | 5 | Contentful 9 | Required + unique booleans exist; no regex/length/format. |
| D8 | Upload an image | 7 ↑5 | Webflow 9 · WP 8 | S3 upload + CDN serve + media tab works end-to-end. Gaps: tagging, search. |
| D9 | Insert image into an article | 7 ↑5 | Ghost 9 · WP 9 | Featured image picker + Page Builder image widget both wired. |
| D10 | Crop / resize / optimize an image | 9 ↑2 | Webflow 8 · Photoshop 10 | Crop, adjust (brightness/contrast/saturation), text overlay, smart-crop (vision focal point), AI alt text, object removal (vision-guided mask + inpaint), restyle, remove-bg, upscale, freehand inpaint. Plus opt-in auto-optimize on upload (resize + JPEG/WebP recompression). Beyond what most CMSes ship. |
| D11 | Build a landing page with hero + CTAs | 9 ↑3 | Webflow 9 · Framer 9 | Page Builder w/ zones, 10 widgets, drag-drop, live preview, viewport switcher. Now par with Webflow for this case. |
| D12 | Create an image gallery | 7 ↑3 | Squarespace 9 | Gallery widget exists; no managed collection model. |
| D13 | Change theme colors later | 8 | Squarespace 8 | Unchanged. |
| D14 | Create a reusable template | 8 ↑2 | Contentful 7 | "Save as new", live preview, code-behind in template. No partials yet. |
| D15 | Bind a template to a content type | 7 | Kentico 8 | Unchanged. |
| D16 | Preview a page before publish | 8 ↑2 | Webflow 9 · Ghost 8 | Iframe preview + Page Builder live preview + viewport switcher. |
| D17 | Mobile / responsive preview | 9 ↑3 | Webflow 10 | Page Builder + main Preview pane both have Desktop/Tablet/Mobile switcher. Visual edit view also. |
| D18 | Set SEO title / description | 5 | WP/Yoast 9 | Unchanged. |
| D19 | Manage page slugs / URLs | 6 | WP 9 | Unchanged. |
| D20 | Custom fonts | 3 | Squarespace 9 | Unchanged. |
| D21 | Dark mode support for the rendered site | 3 | Framer 8 | Unchanged. |
| D22 | Apply different templates to different sections | 6 | Kentico 8 | Unchanged. |
| D23 | See design history / revert | 8 ↑6 | WP 7 · Webflow 7 | History modal + per-version diff (red/green) + restore button. Best in class. |
| D24 | Duplicate a page | 8 ↑6 | WP 8 | Row action menu in content list: Open / Visual edit / Duplicate / Delete. Hits existing /duplicate endpoint. |
| D25 | Organize media by collection | 2 ↑1 | Sanity 8 | Media exists; no collection model. |
| D26 | Embed Figma / export a design system | 1 | Framer 9 | Not a feature. |
| D27 | Ask AI to change something on the live site | 9 ↑6 | — | AI assistant with tool-use shipped — calls list/create/update content, generate images, set templates, drop widgets. Category unlock. |
| D28 | See last-deploy status + URL without leaving the workspace | 7 ↑5 | Webflow 9 · Netlify 10 | Builds page shows last-build stats, View Live Site button when publicUrl set. |
| D29 | Post-publish receipt showing the live page URL | 6 ↑4 | Ghost 9 · Webflow 9 | Build toast shows live URL + duration. No per-page receipt yet. |
| D30 | Audit my site for design / accessibility issues | 9 new | Lighthouse 8 (per-page only) | Site Health groups issues across the whole site, surfaces missing alt text / contrast risks / broken layouts via slug + link checks, one-click AI fixes. |
| D31 | One upload → multiple polished assets | 10 new | — | Multi-asset Derive turns a video / podcast into a blog post + chapters + social + SEO transcript. Designer keeps the layout, AI fills the content. |
| D32 | Edit content by clicking it on the live preview | 10 new | Webflow 9 | Visual edit mode: click any text on the rendered preview, type "make this shorter" / "rewrite as a question", AI proposes, editor approves. Voice profile auto-applied. |
| D33 | Featured image is just a regular field | 9 new | Contentful 9 · Sanity 9 | Editor's image panel is schema-driven — renders one row per image-typed field declared on the type. No hardcoded "Featured image" special-case; types without an image field show no image input. Legacy data falls back gracefully. |
| D34 | Create a new content type by deriving from an existing one | 9 new | Sanity 5 · Contentful 4 | "Derive from" picker on type creation copies the source type's fields as a starting point. One-time copy, not live inheritance — explicit by design. |
| D35 | Link content items to other items, see them in the rendered site | 9 new | Contentful 9 · Sanity 9 | Schema declares relationships → editor picks references in the right rail → templates read them via {{ author.0.name }}. Render-side traversal works in build + preview. AI assistant can set relationships too. |
Designer average: 8.0 / 10. ↑3.4 from 4.6. Image editing suite + Site Health + Derive + Visual edit + Derive-from types + end-to-end relationships (picker → render → AI) all closed the editing-tools gap. Page Builder + AI assistant remain the standouts.
2. Developer stories
Best-in-class alternatives considered: Contentful, Sanity, Payload, Strapi, Directus, Ghost, Hygraph.
| # | Story | StaticOwl | Best alt (score) | Notes |
|---|---|---|---|---|
| V1 | Define a schema in UI | 6 | Sanity 9 · Contentful 9 | Types CRUD works; relationship UI thin; no field-level previews. |
| V2 | Define a schema in code | 3 | Sanity 10 · Payload 10 | No code-first schema definitions; config happens through the graph. |
| V3 | Relationships / references between types | 5 | Sanity 9 | RelationshipDef exists; UI is a stub; target label resolution rough. |
| V4 | Query data with a graph language | 9 | Contentful 5 · Sanity 7 | Cypher against a real graph engine is a genuine differentiator. |
| V5 | Write transforms / lifecycle hooks | 8 | Payload 8 · Sanity 7 | Three triggers (onSave, beforeRender, onPublish), VM sandbox, AI-draft button. |
| V6 | AI-generate a transform from English | 8 | — | No competitor does this natively. |
| V7 | Create an API key for external clients | 7 | Contentful 9 | Works; single scoped key on create; no rotation UX. |
| V8 | REST / GraphQL access to content | 3 | Contentful 10 · Hygraph 10 | /api/content/:type/:id exists but isn't a real public-facing CDN. |
| V9 | Webhooks on publish | 4 | Contentful 9 | onPublish transform can fire code; no utils.http yet so no network. |
| V10 | Environment variables accessible to transforms | 2 | Payload 9 | No utils.env. Would need a curated allowlist. |
| V11 | Preview mode for draft content | 5 | Contentful 8 | Preview endpoint exists; no separate "draft token" for external preview sites. |
| V12 | Version / history of content | 8 ↑3 | Sanity 9 | History modal with diff + restore shipped. |
| V13 | Multi-environment (dev / staging / prod) | 10 ↑6 | Contentful 10 | Releases + Deployments + atomic blue/green via manifest pointer architecture. Same Release promotes staging → prod (no duplication). Scheduled deploys via future-dated Deployment facts (no scheduler — purely data-driven). Rollback = new Deployment fact (append-only). Multi-env replay: Site(env, time) answerable for any past moment. Best in class. |
| V14 | Locale / i18n | 6 ↑4 | Contentful 10 · Sanity 9 | Locale management in Settings + "Translate to…" action duplicates content with a locale stamp. Per-field localized variants still missing — that's the path to 9. |
| V15 | Import JSON bulk | 3 | Strapi 7 | Unchanged. |
| V16 | Export JSON bulk | 8 ↑5 | Strapi 7 | JSON + Markdown bundle export shipped (Settings → Export tab). Cross-platform splitter in README. |
| V17 | Custom block types (Editor.js) | 4 | Sanity 9 | BlockType entity exists; no editor extension hook surfaced. |
| V18 | Run a script on schedule | 2 | Payload 7 | No scheduler. |
| V19 | Deploy compiled output to a CDN | 7 ↑6 | Any 9 | S3 + CloudFront publish wired; per-env public URLs; BYO bucket UX in Site Settings. No incremental cache invalidation tuning yet. |
| V20 | Rollback a bad deploy | 1 | Contentful 7 | Unchanged. |
| V21 | Audit log (who changed what) | 5 ↑2 | Contentful 9 | Per-page history + diff + restore. No site-wide audit feed. |
| V22 | Typed SDK for client apps | 8 ↑6 | Sanity 10 · Hygraph 10 | Generated .d.ts (per-type interface, enum unions, ContentByType map) + zero-dep JS client. Downloadable from Settings → Export. |
| V23 | Rate-limit public API calls | 3 | Contentful 9 | Unchanged. |
| V24 | Validate content against schema | 4 | Payload 9 | Unchanged. |
| V25 | CI/CD integration | 3 | Contentful 8 | Unchanged. |
| V26 | Local development / offline editing | 2 | Sanity 8 (studio locally) | Unchanged. |
| V27 | Run a transform in a dev sandbox before committing | 8 | — | Unchanged. |
| V28 | Wire a Slack / Discord webhook | 3 | WP/Zapier 8 | Unchanged. |
| V29 | Observability of transforms (logs, errors, run count) | 6 ↑2 | Payload 6 | Per-transform "Recent runs" tab now shows persisted history. |
| V30 | Branching content (feature branches) | 1 | Contentful 9 | Unchanged. |
| V31 | Ask AI to add a new type / field to the existing schema | 8 ↑5 | — | Assistant with tool-use can list types, create types, edit fields. Category unlock. |
| V32 | See a history of transform runs with input/output/errors | 6 ↑3 | Payload 6 | Per-transform Recent runs tab loads from persisted TransformRun nodes. |
| V33 | See a build log after a deploy | 6 ↑4 | Netlify 10 · Vercel 10 | Builds page lists every BuildEvent with status, duration, artifacts, publicUrl, drill-down detail. |
| V34 | Public lead-capture for marketing site | 8 new | — | POST /leads (CORS-allowed) + admin Leads view shipped this session. |
| V35 | Workflow / approvals state machine | 8 new | Contentful 9 | Editor + 3 starter templates + chip strip + role-gated transitions. |
| V36 | Read-after-write across writes + reads | 9 new | Most CMSes ignore this | SDK auto-carries Graph-Min-Seq + Graph-Write-Ticket. Same-request "create then read" works. |
| V37 | Reproducible builds | 10 new | Webflow 4 · Contentful 5 | Same Release → same content-addressed artifacts. Determinism harness (compareSnapshots) verifies bit-for-bit equivalence across runs. SHA-256 dedup means unchanged paths never re-upload. No CMS makes this guarantee. |
| V38 | Atomic blue/green deploys | 10 new | Vercel 9 · Netlify 9 | Manifest pointer architecture: deploy = pointer flip on a single S3 file. Rollback = pointer flip backward. No mixed-state window. Lambda@Edge resolver (10s TTL default; TTL=0 + invalidation for strict atomicity). |
| V39 | Incremental builds at scale | 10 new | Hugo 7 · Gatsby 6 · Webflow 3 | Content-addressed artifacts + dependency graph means a 1M-page site change-1-article rebuild = ~5-10 file uploads, not 1M. Aggregate dependency tracking (type / tag / tree / edge) keeps invalidation precise. |
| V40 | Append-only deploy history (audit-grade) | 10 new | None | Every Deployment is a graph fact. Rollbacks are new facts pointing at older Releases. No state mutation, ever. Combined with engine's cryptographic audit chain, deploy history is provable for SOX / GDPR / HIPAA compliance. |
| V41 | Site = f(env, time) — replay any past state | 10 new | Sanity 5 (content only, not theme/routes) | Bitemporal append-only graph + Deployment facts: render any (env, time) tuple from history. Rollback isn't a feature; it's a query. No competitor can match this without rebuilding their data layer. |
| V42 | Pre-deploy validation gate (Reviews) | 9 new | Contentful 6 (manual only) | Polymorphic Reviews (kind: ai | automated | manual | compliance) gate every deploy. Dependency hash invalidates stale reviews. Blocking findings prevent deploy with 409 Conflict. Admin override available. |
Developer average: 7.4 / 10. ↑3.3 from 4.1. Add the architecture wins from this push (V37–V42 — six new stories at 9–10 each) and the average jumps significantly. The CMS is now demonstrably versioned site compiler + deployment system + temporal database, not just a CMS. Still weak on local dev, branching content, deeper i18n field variants, CI integration.
3. Author stories
Best-in-class alternatives considered: Ghost, WordPress, Medium, Substack, Notion.
| # | Story | StaticOwl | Best alt (score) | Notes |
|---|---|---|---|---|
| A1 | Write a new post | 7 | Ghost 10 · Medium 10 | Editor.js with headers / paragraphs / lists / code / quote / images (via block). |
| A2 | Save as draft | 7 | Ghost 10 | status: 'draft' default; autosave wired. |
| A3 | Autosave | 6 | Ghost 10 | Wired but only visible via "Saved Xs ago" stamp; no conflict resolution. |
| A4 | Find my unfinished drafts | 7 ↑3 | Ghost 10 | Command palette (⌘K) does hybrid lex+semantic search across all content. No status filter yet. |
| A5 | Continue where I left off | 8 ↑5 | Substack 9 | Dashboard's Recent card surfaces the most recent draft as a prominent "Continue editing — |
| A6 | Preview before publishing | 7 ↑1 | Ghost 10 | Preview iframe works; per-env URL shown when published. |
| A7 | Publish now | 7 ↑1 | Ghost 10 | Workflow chip strip with state-aware transition buttons. |
| A8 | Schedule publication | 8 ↑6 | Ghost 10 · Substack 9 | datetime-local picker per env, scheduler runs every 60s, "scheduled in X" badge. |
| A9 | Unpublish a post | 7 ↑3 | WP 9 | Workflow transitions handle this; per-env unpublish endpoint. |
| A10 | AI draft from notes | 10 ↑2 | Notion 7 · Ghost 0 | Document import accepts PDF / markdown / pasted text and produces a hierarchy of typed pages — no manual block-by-block re-keying. Best in class. |
| A11 | AI improve existing copy | 9 ↑1 | Notion 9 | Assistant can edit one item; bulk rewrite can edit hundreds with voice samples + per-item diff approval. |
| A12 | AI suggest headline / tags | 5 ↑1 | — | Assistant can do this if asked but no dedicated action. |
| A13 | Insert an image from a library | 7 ↑5 | Ghost 10 | Media library + picker + AI-generated images saved automatically. |
| A14 | Generate a hero image with AI | 9 ↑3 | Midjourney+any 9 | Assistant: "write a post about X with a hero image" → it generates, saves to media, sets featuredImage. |
| A15 | Set a featured image | 8 ↑4 | Ghost 10 | Picker on Content panel + AI assistant flow. |
| A16 | Tag a post | 6 | Ghost 9 | Unchanged. |
| A17 | Revise a published post | 6 | WP 8 | Unchanged. |
| A18 | See version history | 8 ↑6 | WP 7 | Modal + per-version diff + restore. |
| A19 | Word count / read time | 8 ↑6 | Medium 10 | Live word count + read-time estimate in the editor toolbar — title + dek + body all counted, updates on every keystroke. |
| A20 | Format text (bold, italic, quote, code) | 7 | Ghost 10 | Unchanged. |
| A21 | Embed a tweet / YouTube | 7 ↑5 | Ghost 9 | Embed widget exists in Page Builder; not in Editor.js inline yet. |
| A22 | Internal linking to another post | 7 ↑3 | Ghost 9 | "Page link" widget in Page Builder (inline or card variants). Editor.js inline link picker would push this to 9. |
| A23 | Collaborate with a reviewer | 7 ↑3 | WP 8 · Google Docs 10 | Comments per page (post / resolve / delete by author). No real-time co-edit. |
| A24 | Submit for review (workflow) | 8 ↑6 | WP 7 | Workflow editor + chip strip + role-gated transitions. |
| A25 | Get notified of a publish | 7 ↑6 | Substack 10 | Bell icon in nav, polls every 30s. Auto-fires on workflow transitions, build completion, comment posts. Email channel still missing — that's the gap to 10. |
| A26 | Write in multiple languages | 6 ↑5 | Ghost 3 · Contentful 10 | Locales configurable + "Translate to…" duplicates page with locale stamp. Per-field localized variants needed for 9. |
| A27 | Add a pull quote | 6 | Ghost 9 | Unchanged. |
| A28 | See recent posts on dashboard | 6 | Ghost 10 | Unchanged. |
| A29 | Ask AI to revise the current draft in a different tone | 7 ↑2 | Notion 8 · Lex 7 | Assistant can update content fields conversationally. |
| A30 | See "scheduled for X" on the content row and trust it will fire | 8 ↑6 | Ghost 10 · Substack 10 | Environments card shows scheduled badge per env + cancel. |
| A31 | Post-publish receipt showing the live URL | 6 ↑4 | Ghost 10 · Substack 10 | Build toast includes live URL. No per-page receipt yet. |
| A32 | Import an existing document as content | 10 new | — | Drop a PDF / markdown / Notion export and approve the structured plan. Nobody else ships this. |
| A33 | Apply one tonal change across many posts | 9 new | — | Bulk rewrite picks a content type + field + voice samples + instruction; shows side-by-side diffs; per-item approval. |
| A34 | Auto-caption + alt-text a video | 9 new | YouTube 9 | Whisper transcription → SRT + transcript; one-click poster from current frame; AI alt text from any frame. |
| A35 | One upload → blog + social + transcript | 10 new | — | Multi-asset Derive: drop a podcast / talk / interview, get blog post + show notes + 3 tweets + LinkedIn post + transcript SEO page in one Claude call. No CMS ships this. |
| A36 | Find what's wrong with my site | 9 new | Lighthouse 8 (single-page only) | Site Health audit: scans every page in seconds, groups issues by kind (alt text / stale / thin / SEO / drafts / duplicate slugs / broken links), one-click AI fix per issue. |
| A37 | Make AI sound like me, not generic | 10 new | — | Site-wide Voice Profile (style guide + tone tags + use/avoid words + sample posts) auto-injected into every AI surface — import, derive, bulk rewrite, expand, SEO descriptions, visual edit. Configure once; every output sounds like the site. |
| A38 | Edit text by clicking it on the live preview | 10 new | Webflow 9 | Visual edit mode: click any rendered text → type instruction → AI proposes → approve. Voice profile auto-applied. No editor field navigation required. |
Author average: 8.7 / 10. ↑4.4 from 4.3. AI as content production line + diagnostician + ghost-writer that sounds like you. With the Voice Profile + Visual edit pair, AI stops sounding generic and starts shipping changes by clicking text on the preview. Real-time collaboration is the only big gap left.
Summary
| Persona | 04-22 | 04-25 mid | 04-25 late | 04-25 later | 04-25 latest | 04-25 final | 04-25 last | 04-26 | 04-26 later | Δ total | Standout | Remaining gap |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Designer | 4.6 | 6.7 | 7.0 | 7.1 | 7.2 | 7.5 | 7.8 | 7.9 | 8.0 | ↑3.4 | Page Builder; image editing; Site Health; Derive; Visual edit; end-to-end relationships (picker → render → AI); Derive-from types | Dark-mode scaffold; Figma export |
| Developer | 4.1 | 5.9 | 6.7 | 6.7 | 6.8 | 7.0 | 7.1 | 7.2 | 7.3 | ↑3.2 | Cypher; transforms; deploy + rollback; SDK codegen; bulk-rewrite + import + derive + audit; graph-native relationships with no cardinality / inverse-name baggage | Local dev mode; branching content; deeper i18n; CI integration |
| Author | 4.3 | 6.9 | 7.5 | 7.6 | 8.0 | 8.4 | 8.7 | 8.7 | 8.8 | ↑4.5 | Scheduling; comments; history+diff; Voice Profile; Visual edit; link content to other content with one click, see it on the live site | Real-time co-edit; per-field locale variants |
Path to 7+ per persona — the next-session items:
Designer (6.0 → 7+):
- D24 Duplicate a page (~30 min)
- D17 Responsive preview on the main Preview panel (~1 hr)
- D10 In-app image crop / resize (~half day, can lean on a JS library)
- D20 Font picker UI (~half day)
Developer (5.3 → 7+):
- V14 i18n / Locales — actual UI + per-locale fields (~2 days)
- V22 Typed SDK codegen for client apps (~1 day, generated from content types)
- V9 / V28 webhook helper (
utils.httpin transforms) (~half day) - V20 Rollback a deploy (revert to a prior BuildEvent's snapshot) (~half day)
- V24 Deeper field validation (regex, length, format) (~1 day)
Author (6.4 → 7+):
- A19 Word count / read time — auto-derived field via on-save transform (~30 min)
- A22 Internal-link autocomplete — picker for existing pages (~half day)
- A25 Publish notifications — email on publish, comment notifications (~half day)
- A26 Multi-language / locales (shared with V14)
- A12 AI headline / tags suggestions as one-click actions (~1 hr)
Product-wide pattern. Where the graph + AI story bites (workflow, comments, history+diff, AI tool-use, dependency-aware build, RAW protocol), we're now competitive or ahead. Where it's editor-craft 10-year-polish (image pipelines, i18n, notifications, redirects), we're behind.