// Content API & feeds

Your articles, on your site —
no CMS, no API key.

Every article I publish lands on a fast, public-read content feed at feeds.ghostwritr.io, backed by Cloudflare R2 and its CDN. There's nothing to sync and nothing to secure: your site's unguessable id is the read capability. Official framework adapters for Next, Astro, Vue, Svelte, and React Router turn that feed into a normal content collection at build time.

// How the feed works

Publish, rebuild, pull.

Publish

I publish the article.

When an article goes live — a new post, a rewrite, a takedown — I commit it first, as the record everything else is built from. The complete article rides along: title, compiled body, your search snippet, canonical, tags, language, author byline, and cover images.

Rebuild

I rebuild the feed.

Right after that commit, I re-project your published articles into a fresh, immutable snapshot and swap the feed pointer last — so readers never catch a half-written build. I can also fire a signed webhook so your site redeploys the instant it changes, instead of waiting on a cache window.

Pull

Your site pulls it in.

Point a framework adapter at your site id and your published articles become a normal content collection at build time — no file syncing, no CMS. The body is pre-compiled, so it just renders. Unchanged articles keep their cached render; removed ones drop out.

Keyless by design

The feed is public-read — nothing to secure.

Reads need no API key. Your site's unguessable id is the read capability, so there's no token to rotate, leak, or wire into a build. The feed is served as static JSON from Cloudflare R2 — fast, cached at the edge, and cheap to hit as often as your build wants.

The static feed is a projection of the authoritative dynamic API, which stays the source of truth — so every article I publish is exactly what your site pulls. Publishing can also fire a signed webhook (feed.updated / article.published) so your site redeploys or revalidates in seconds — or pushes each change to your own endpoint. Either way, that's the signed webhooks. And if you're on WordPress, I publish there directly — no feed wiring needed.

// Framework adapters

Official adapters, one keyless core.

Each adapter is a thin wrapper over the shared feed core and defaults to feeds.ghostwritr.io. React Router 7 is supported too. The adapters live in the Ghost Writr workspace today — you wire one to your site id and pull.

Astro A Content Layer loader — your published articles become a build-time content collection, body pre-compiled.
Next.js A server data client for the App Router: SSG or ISR, with on-demand revalidation off the feed.updated webhook.
Vue / Nuxt A keyless adapter over the shared feed core, with an articleHead() helper that feeds title, description, and Open Graph straight into useHead().
Svelte / SvelteKit A keyless adapter built on the same feed core — fetch in a SvelteKit server load(), throw error(404) on a missing slug, and the site id stays server-side.
// Pull it in

Three lines, no fetch code.

Astro: three lines in content.config.ts — no API key, no fetch code. (Adapters aren't on npm yet — reach out and I'll wire you up, or fetch the JSON feed directly.) ts
// src/content.config.ts
import { defineCollection } from "astro:content";
import { ghostwritr } from "@ghostwritr/astro";

export const collections = {
  articles: defineCollection({
    // keyless — your siteId is the read capability, no API key
    loader: ghostwritr({ siteId: import.meta.env.GHOSTWRITR_SITE_ID }),
  }),
};
// Questions

Content API, answered.

Keys, what's in the feed, freshness, and the SDKs.

Do I need an API key to read the feed?
No. Reads are keyless by design. Your site's unguessable id is the read capability, and the feed is served as static JSON from Cloudflare R2 — there's no token to secure, rotate, or wire into a build. The one thing to keep private is the webhook signing secret, if you use webhooks.
What's in the feed for each article?
The complete article: title, slug, the compiled body, your search snippet (SEO title and description), canonical URL, tags, language, the author byline (name, bio, avatar, job title, and profile links), cover and inline images, and created / updated / published timestamps. You don't re-derive any of it.
How fast does my site see a new article?
The feed rebuilds the moment I publish — a fresh immutable snapshot, pointer swapped last so you never read a half-written build. From there it's your caching choice: a build-time pull needs a redeploy, or you can let a signed feed.updated webhook trigger a redeploy or revalidation so it's live in seconds.
Can I install the SDKs from npm?
Not yet — the framework adapters are built and working, but they live in the Ghost Writr workspace today rather than on the public npm registry, so a plain npm install won't resolve. If you want to pull content now, the keyless feed is public JSON you can fetch directly, or reach out and I'll get you set up with an adapter.
Which frameworks have an adapter?
Next.js (App Router), Astro (Content Layer), Vue / Nuxt, Svelte / SvelteKit, and React Router 7 — all built on one shared keyless feed core. Any framework that can fetch JSON at build time can read the feed directly, even without an adapter.
Is the feed the real source of truth?
The static feed is a projection of the authoritative dynamic API, which stays the source of truth — so what your site pulls always matches what I published. The static snapshot just makes reads fast, cheap, and keyless.
// Stop generating. Start operating.

Hire the content team
that never sleeps.

Ghost Writr ships an action a day, every day. Approve with a reply, watch the graph compound.