← All docs
Internal

Product positioning

You write content; the system handles structure, layout, builds, and publishing. AI helps with everything from drafting to image generation to rewrites. Mistakes don't matter — every state is reversible.

Product positioning

The pitch — three audiences

For editors / marketers

StaticOwl turns a conversation into a working static site — live. Edit content. Publish. Never lose work. Roll back anything.

You write content; the system handles structure, layout, builds, and publishing. AI helps with everything from drafting to image generation to rewrites. Mistakes don't matter — every state is reversible.

For platform engineers

A graph-native versioned site compiler that emits pure static artifacts. Host them anywhere — or use our managed atomic-release CDN.

Releases bundle versions of content + templates + types + routes + settings. Output is plain static HTML/CSS/JS, deployable to S3, CloudFront, Netlify, Vercel, GitHub Pages, or your own server. No runtime dependency on us. For customers who want it, we also ship a managed atomic-release tier that adds content-addressed artifacts + manifest-pointer deploys + Lambda@Edge resolver — same compiler underneath, advanced serving on top.

For compliance / regulated industries

Every published state is reproducible. Every deploy is an immutable graph fact. Every change is provable. SOX, GDPR, HIPAA, FDA Part 11 audit-trail requirements answered natively, not bolted on.

Bitemporal append-only graph + cryptographic audit chain + Release-scoped Reviews + atomic rollback. "Show me the site as it was on January 15" is a single query, not a six-month subpoena response.


Three deployment modes (all first-class)

Customers choose how output gets served. The compiler is the same in every case; only the publishing target differs.

Static export (the default — "host anywhere")

Plain static HTML / CSS / JS / assets, written to:

/index.html
/blog/post-1/index.html
/api/articles.json
/rss.xml
/sitemap.xml
/assets/main.css

Compatible with any static host: S3 + CloudFront, Netlify, Vercel, Cloudflare Pages, GitHub Pages, your own nginx. No runtime dependency on StaticOwl. You can take your site and leave at any time.

GitHub mirror (opt-in — "your content in your repo")

Same compiler. The output goes to a GitHub repo the customer owns: HTML at predictable paths, plus a JSON sidecar per page, plus _meta/ global definitions:

/index.html
/blog/post-1/index.html
/_meta/pages/index.json
/_meta/pages/blog/post-1.json
/_meta/types.json          ← content-type definitions
/_meta/theme.json          ← site theme
/_meta/routes.json         ← route map (when present)
/_meta/release.json        ← this deploy's facts (releaseId, deploymentId, when, env)

One commit per deploy. Push-only — we never read the repo back. The customer can:

Required env: STATICOWL_GITHUB_TOKEN (PAT with contents: write) + STATICOWL_GITHUB_REPO (owner/name shape) + optional STATICOWL_GITHUB_BRANCH (default main).

This turns "your content isn't locked in" from a marketing claim into a git clone-able artifact.

Managed atomic-release (opt-in upgrade)

Same compiler, different output target: content-addressed artifacts + sharded manifest + Lambda@Edge resolver. Adds:

Trade: depends on our CDN runtime. The other modes stay available — you can run them side-by-side.

How to choose

Need Mode
Marketing site, indie project, personal blog Static export
"Host on S3/CloudFront myself, never touch anything" Static export
Multi-locale, large catalogue, frequent updates Static export (it works)
"I want my content + metadata in a Git repo I own" GitHub mirror
Auto-deploy via GitHub Pages / Cloudflare Pages / Vercel GitHub mirror
Provable lock-in escape hatch for compliance / procurement GitHub mirror
Atomic deploy + instant rollback + cryptographic audit Managed atomic-release
Regulated industry (finance, pharma, gov) Managed atomic-release
Both (export + managed) Both — set STATICOWL_DEPLOY_TARGET=both

Operators select via the STATICOWL_DEPLOY_TARGET env var: static-paths (default), github, manifest-pointer, or both.


The architectural moat

We're not a CMS that has good versioning. We're a versioned site compiler that happens to have an editorial UI. That's a different category.

Most CMSes (Webflow, Contentful, Sanity, WordPress) are databases with a publish flag. We're a graph + a release system + a manifest router. The four claims competitors can't fake:

1. Site = f(env, time)

Querying the site at any past (environment, time) tuple returns the exact bytes that were live then — content, templates, routes, theme, settings, all coherent. Two seconds. Sanity does this for content only; nobody does it for the whole site.

2. Reproducible publishing

The same Release produces byte-identical artifacts on independent compile runs. Determinism is enforced by the architecture: stable selector ordering, content-addressed outputs, immutable Releases, AI output baked into content versions (not generated at build).

3. Atomic blue/green via pointer flip

Deploy = a single S3 object write (the manifest pointer). Rollback = the same operation backward. No infrastructure duplication. No mixed-state window. Lambda@Edge resolver routes every request through the active manifest.

4. Append-only deploy history

Every Deployment is a graph fact, never a state mutation. Rolling back twice creates two new facts; nothing is overwritten. Combined with the engine's cryptographic audit chain, "who shipped what when and what was reviewed" is a single query — not archaeology.


One source. Every channel.

The promise "Your website is just one compiled artifact" extends naturally: the same compiler that emits HTML can emit social posts, print flyers, QR-coded signs, email bodies, and ad creative — each derived from the same content, rendered through a channel-specific template, versioned and audited as part of the same Release.

Output kinds (channels a Template can target)

web          — HTML page (default — currently shipped)
social_post  — image + caption (IG / Twitter / LinkedIn / story)
flyer        — print PDF (letter / legal / A4 / tabloid)
sign         — print-resolution PNG/PDF for physical signage
qr_code      — QR code (PNG / SVG, points to graph URL or external)
email        — cross-client-safe HTML email body
ad_creative  — display-ad sized image (banner / square / rectangle / tower)
transcript   — plain text or SEO HTML for video/podcast/talk content

The registry is in packages/core/src/output/output-kinds.ts. Each kind declares its file format, default DPI, allowed aspect ratios, and whether it's compliance-tracked. New kinds are added there first; compiler implementations register against the registry.

Why this matters (the killer use case)

"Show me every public-facing asset derived from Product X during the recall window."

Most CMSes punt on this question entirely — content lives in their database, but social posts live in Buffer, ads live in Meta, signs live in someone's local Figma. There's no single source of truth across channels.

Our model: every output artifact is a Versionable in the graph, bundled into a Release, attached to the source content node. The query above is a single Cypher traversal. "What flyer was in circulation in Q2?" is two seconds, full audit chain, end to end.

That's the wedge in regulated industries (pharma recalls, insurance disclosure changes, legal copy updates), in retail (SKU discontinuation across channels), and for any compliance team that's ever had to reconstruct "what did our customers see?" across the marketing surface.

Phase status

What we're NOT building

A freeform design canvas. That's Canva's job. We compile structured content into structured outputs through templates the customer authors. "Generate compliant, on-brand marketing artifacts from structured content." — not "design anything."

Pricing fit

Web-only on Solo/Pro. Multi-channel output unlocks at Business. Custom output kinds + brand governance at Enterprise.

Marketing line

"One Release. Every channel."


Same primitive, four uses

The Release/Deployment model isn't just for "deploy now." Once releases are pointer-facts on a manifest, several capabilities fall out as variations on the same mechanic — no new infrastructure required:

Implementation-side: computeDripSchedule() in core handles timestamp distribution; selectVariant() in manifest.ts is the pure selection function (deployable to Lambda@Edge or a CloudFront Function unchanged); ManifestEntry.variants[] carries the variant array.


The four killer demos

These are what win deals, in order of impact:

  1. "Show me the site as it was on Jan 15." → 2 seconds. Renders the historical site in full fidelity (content + templates + routes + theme + settings).

  2. "Roll back the entire site, including theme and routes." → one click. Atomic. No partial state. Audit-stamped.

  3. "Show me everyone who approved Release 42 and what they flagged." → single graph query. SOX-relevant.

  4. "Prove this exact content was live on a specific date." → cryptographic proof via the engine's audit chain.

Webflow / Contentful / Sanity / Kentico can demo none of these without rebuilding their data layer.


Lineage / framing

For technical buyers who want to place us:

We're the intersection: bitemporal graph foundation + Release/Deployment model + manifest publish layer + AI-guided editorial UI. Each piece exists separately; the integrated stack is the product.


The category bet

If the wedge works, we're the first credible entrant in a category that doesn't have an established name. Working labels:

Within 2–3 years, "describe what you want → get a working site with structure" becomes the expected front door. Within 5 years, regulated industries demand provable publishing the way they currently demand provable database-write audit. Whichever tool builds both layers on the same foundation owns both markets.


What we are

What we are NOT

Who we're for

Primary today:

Primary tomorrow (with regulated industry features layered on):

Who we're NOT for (yet):


Quotable lines

For the marketing site / sales decks: