Skip to main content
Eight complete applications, one per stack, all using the official SDK for their own language rather than raw HTTP. Each is a real project you can clone and run — none is a fragment.

React + Vite

TypeScript SPA with a dev-server proxy

Vue + Vite

Composition API, same proxy pattern

Next.js

App Router Route Handlers

Nuxt 3

Server routes keep the key server-side

Angular

Signals and a standalone Node proxy

Laravel

PHP SDK behind a controller and Blade

Go Fiber

Backend only, no frontend

.NET Web API

Minimal API with Swagger

What every example does

The same sequence, so you can compare them side by side:
  1. Create or read a language
  2. Create or read an author and a category
  3. Create an article, list articles, and set isPublished to publish
  4. Load a form and submit an answer to it
  5. Call ai.summarize and report.getStatistics
No example calls the REST API directly. Each uses the official SDK for its own language, and each sends exactly one header: x-api-key.

The API key never reaches the browser

Every full-stack example puts the key on a server and has the browser call its own backend. This is not a style preference: a Vite or Next build inlines import.meta.env.* into the shipped JavaScript, so a key referenced from a component is readable by every visitor. The pattern in each:
A Vite dev-server plugin, or a standalone Node server for Angular, mounts a middleware under /api/octavia/*. It is the only code that reads the key.
In the Vite examples the proxy is dev-only. A production deploy must put an equivalent server-side route in front of the built bundle — serving the static build alone renders the UI but every API call 404s. Each README says so explicitly.

Running one

You need three values, from your dashboard:
The dependency order matters. An article cannot be created before the language, author and category exist — see Quickstart.

Working in these projects with an agent

The repository ships the agent skill at .claude/skills/octavia-cms/, so cloning it installs the skill and the examples together:
An agent working in that checkout has both the rules and eight working references to check its output against. See Using these files for the full install guide.

Two things the examples get right that are easy to miss

Forms are fetched by id, not listed. form.getAll returns only a submissions count per form — no id, title or slug — so it cannot drive a picker. Every example takes a form id as input and calls form.getById. Publishing is a field update. There is no publish endpoint. article.update with isPublished: true publishes; archive is a soft delete, and delete is the real remove.

Quickstart

The same sequence as plain HTTP

SDKs

Per-language reference