Alles wat het doet, op één pagina.
Gecontroleerd in de code die het draait, op 2 september 2026. Niets hier is gepland of binnenkort beschikbaar.
De admin bestaat in het Engels en Italiaans, dus deze opnames zijn de Engelse set.
Het schema is het formulier.
Wat je links schrijft, krijgen redacteuren rechts.
fields.text()fields.textarea()fields.richText()fields.number()fields.boolean()fields.datetime()fields.slug()fields.select()fields.relation()fields.media()fields.group()fields.array()fields.json()fields.blocks()
- Vlaggen, geen schermen
- required en localized zijn twee booleans op het veld.
- Slug uit de titel
- fields.slug({ from: 'title' }) vult zichzelf; select draagt vaste opties.
- Ook vanuit de admin
- Eigen collecties maak je in de admin aan en worden in de database opgeslagen.
Eén inhoud, vier manieren om te lezen.
Kies degene die je stack al spreekt.
Publieke items vragen geen sleutel. Back-office-documenten vragen een API-sleutel of een bearer token.
curl 'https://cms.altovar.net/api/v1/collections/blog-post/entries?locale=en'
{ "data": [ { "id": "fdoc_16d9i3ef", "locale": "en",
"data": { "title": "EU-first content infrastructure", … },
"seo": { "metaTitle": …, "metaDescription": …, "robots": "index,follow" } } ],
"pagination": { "page": 1, "limit": 20, "total": 3, "totalPages": 1 } }
# The back-office route is the same shape, with a key:
curl -H 'x-api-key: sk_…' \
'https://cms.altovar.net/api/v1/collections/blog-post/documents?limit=10' Een getypeerde client met dezelfde envelop: data en pagination.
import { OspreyClient } from '@osprey/client'
const osprey = new OspreyClient({
baseUrl: 'https://cms.altovar.net',
tenantId: 'altovar',
})
const { data, pagination } = await osprey
.collection('blog-post')
.listEntries({ locale: 'en', limit: 10 }) Alleen queries, via POST. GraphiQL is beschikbaar in ontwikkeling.
POST /api/v1/graphql
x-api-key: sk_…
query Posts($limit: Int) {
documents(collectionSlug: "blog-post", status: "published", limit: $limit) {
data { id status data }
pagination { total }
}
} Items belanden tijdens de build in Astro content collections. Geen sleutel op de edge.
---
import { getCollection } from 'astro:content'
const posts = (await getCollection('blog'))
.filter((p) => p.data.locale === 'en')
.sort((a, b) => b.data.publishedAt.localeCompare(a.data.publishedAt))
---
{posts.map((p) => (
<article>
<a href={'/' + p.data.slug}>{p.data.title}</a>
<p>{p.data.excerpt}</p>
</article>
))} Hier publiceren, daar verschijnen.
Concepten blijven privé. Een gepubliceerd item bereikt het publieke endpoint binnen een minuut, en een webhook kan de site opnieuw bouwen.
- Drie statussen
- draft, published, archived. Pagina's voegen review, goedkeuring en planning toe.
- Ondertekende webhook
- HMAC-SHA256 over de body in x-osprey-signature. Negen events, geheim versleuteld in rust.
- Cache-headers
- Publieke reads dragen max-age=60 met stale-while-revalidate, klaar voor elke cache ervoor.
Tien talen, één matrix.
Elk gelokaliseerd veld, elke taal, geteld.
- Inhoudstalen
- en, it, es, de, fr, nl, pl, sv, pt, ro, ingesteld per workspace.
- Admin
- Engels en Italiaans, te wisselen vanuit de bovenbalk.
- Dekking
- Een matrix per pagina en taal, en de ontbrekende teksten als CSV.
- Levering
- Eén queryparameter kiest de taal; hreflang-alternates reizen mee met elk item.
Jouw domein, in vier stappen.
Vandaag via de API. De instellingenpagina komt eraan, en deze pagina zegt dat ook.
- Claimen POST de host naar het domein-endpoint. Hij wacht als in behandeling.
- Bewijzen Voeg het TXT-record _osprey-verify.<host> toe met het ontvangen token.
- Verifiëren POST opnieuw met verify: true. De host gaat naar de workspace.
- Wijzen CNAME naar het platform. Het certificaat wordt bij het eerste verzoek uitgegeven.
POST /api/v1/admin/domains
Authorization: Bearer <jwt>
{ "host": "www.example.com" }
{ "status": "pending",
"verification": { "type": "TXT",
"name": "_osprey-verify.www.example.com",
"value": "osprey-verify=…" } } Eigen domeinen hangen af van het plan of van de hosting-add-on.
Controle die haar werk laat zien.
Elke regel hieronder is een route en een scherm, geen roadmap.
- Rollen
- admin, editor, author, contributor, viewer
- API-sleutels
- gehasht, één keer getoond, alleen-lezen-vlag, vervaldatum
- Auditlog
- wie, wat, wanneer en vanwaar, bij elke statuswijziging
- Revisies
- paginageschiedenis met diff en herstel
- Prullenbak
- verwijderde pagina's wachten; je herstelt ze of verwijdert ze voorgoed
- Samen
- aanwezigheid en gedeeld bewerken van pagina's, veld voor veld
- Toestemming
- cookiebanner en een toestemmingslog met gehasht IP
- Wissen en exporteren
- één aanroep anonimiseert een betrokkene; export vanuit de admin of de CLI
- Inloggen
- OpenID Connect per workspace, of een lokaal wachtwoord
- Snelheidslimieten
- één bucket per routefamilie, limieten in de response-headers
De stukken eromheen.
Twee gepubliceerde pakketten, een CLI, een MCP-server en een self-host-stack.
- @osprey/client
- getypeerde SDK, React-blokrenderer, toestemmingsbeheer
- @osprey/astro
- content-loader, SEO-head, vertalingssync
- CLI
- setup, init, dev, build, generate-types, link, export
- MCP-server
- zestien tools via stdio, voor de AI-agent die je al gebruikt
- Self-host
- één compose-bestand en een eerste-start-wizard op /setup
- AI-assistent
- vertaalt gaten, vult SEO aan, schrijft alt-teksten; uit tot jij hem aanzet
Jouw inhoud. Jouw server. Vandaag.
Gratis plan, geen kaart. Gehost in de EU, of op je eigen machines.