App Platform runs your app — your app takes in every article.
DigitalOcean has no content API to publish into: its API manages apps, droplets, databases, domains, functions and storage, and none of those is a post or a page. Your app on DigitalOcean App Platform is another matter — it receives every article automatically through a signed webhook, sent to one route in whichever component you choose, whether a buildpack built that component or your Dockerfile did. The post then renders in your own templates.
| DigitalOcean content API | None — apps, droplets, databases — no post, page or article resource to publish into |
|---|---|
| Where articles land | A route in your component — signed JSON your recipe verifies before it stores anything |
| Languages | Buildpack or Dockerfile — Node.js, PHP, Python, Ruby, Go, Rust and .NET build directly; Java and Elixir from a Dockerfile |
| Route prefixes | Stripped before forwarding — mount the receiver component at / or set preserve_path_prefix: true |
| Static Site components | Add a Web Service component — a Static Site runs no code; the Node.js recipe works as-is |
Who does what
Choose the recipe for your component’s stack, add the route, and save the secret as an encrypted Run time variable. Once the signed test passes, an article costs you no time at all — templates, routing and styling remain your own code.
Keep posts in a database — container files vanish on every deploy.
Setup
The App Platform part fits in two steps: how the route is mounted and where the secret lives.
Connect a site → DigitalOcean and name the stack your component runs — Laravel, Django, Ruby on Rails, Go, ASP.NET Core, Next.js and the rest. Its recipe opens beside your signing secret.
~1 minute
Paste the recipe and keep it listening on 0.0.0.0 and PORT (8080 unless you changed the HTTP port) — bound to localhost, the component fails its health check. Mount the component at /, or set preserve_path_prefix: true in the app spec, because App Platform strips a route prefix before forwarding.
~10 minutes
Apps → your app → Settings → the component → Environment Variables → Edit. Add DRAFTSEO_WEBHOOK_SECRET with scope Run time and Encrypt ticked, then Save — the app redeploys with the value in place.
~2 minutes
Register the ondigitalocean.app URL, or your custom domain if the default one redirects to it. DraftSEO sends a signed test delivery — and a deliberately invalid one, which your receiver must reject.
~1 minute
From here each scheduled article reaches your App Platform app on its own, images and SEO fields attached.
Ongoing · zero clicks
FAQ
No — there is nothing on DigitalOcean for an article to go into. Its API covers apps, droplets, databases, domains, functions and storage, and none of those resources is a post or a page. DraftSEO publishes into the app running on DigitalOcean App Platform, which is where your blog is actually rendered.
App Platform buildpacks cover Node.js, PHP, Python, Ruby, Go, Rust and .NET, so the Next.js, Node.js / Express, Astro, SvelteKit, Nuxt (Vue), plain PHP, Laravel, Django, FastAPI, Ruby on Rails, Go, ASP.NET Core and Rust / Axum recipes build from your repository — Expo too, served through expo-server’s Express adapter. Java / Spring, Kotlin (Ktor) and Elixir / Phoenix have no buildpack: add a Dockerfile at the repository root, listen on 8080, and App Platform builds from it instead.
Not by itself, because a Static Site component runs no code and a webhook needs something to answer the POST. Add a Web Service component to the same app as the receiver — the Node.js recipe works there as-is — and point the DraftSEO endpoint at that component’s route.
App Platform strips a component’s route prefix before it forwards the request. A component mounted at /api gets a POST to /api/webhook as /webhook, so a receiver listening on /api/webhook never sees it. Mount the component at /, or set preserve_path_prefix: true in the app spec so the full path arrives.
Not safely — files written inside an App Platform container are lost on every deploy, so a post saved to disk disappears the next time the app ships. Store posts in a database such as DigitalOcean Managed PostgreSQL, upsert each delivery on the article id, and render your blog pages from that table.
No card required. Signed test delivery in under a minute.