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:- Create or read a language
- Create or read an author and a category
- Create an article, list articles, and set
isPublishedto publish - Load a form and submit an answer to it
- Call
ai.summarizeandreport.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 inlinesimport.meta.env.* into the shipped JavaScript, so a key referenced from a component
is readable by every visitor.
The pattern in each:
- React / Vue / Angular
- Next.js
- Nuxt
- Laravel
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.Running one
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:
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

