Schemat i kod. Innehållet över HTTP.
Definiera collections i TypeScript, redigera dem i adminen, läs dem via REST, GraphQL eller Astro-loadern. Driftat i EU, eller på dina egna servrar.
Fyra saker du kan kontrollera.
- Schemat Fjorton fälttyper Text, textarea, rich text, tal, boolean, datum och tid, slug, select, relation, media, grupp, array, JSON, block. Alla exporterade av core-paketet.
- Den publika läsningen Utan nyckel, 404 som standard En collection kan läsas utan nyckel bara när dess åtkomstregel släpper in en anonym anropare. Allt annat svarar 404, aldrig 403.
- Språken Tio innehållsspråk Lokaliserade fält, en täckningsmatris per sida och språk, och luckorna som CSV.
- Nycklarna Hashade, visade en gång API-nycklar lagras som HMAC-hash med pepper. Du ser nyckeln när den skapas; adminen behåller de sista fyra tecknen.
Från en TypeScript-fil till en sida på webben.
Skrolla. Samma innehåll, vid vart och ett av sina fyra stopp.
- 01 · Schema
Du definierar collectionen i TypeScript.
Slug, fält, åtkomstregler. Den bor i ditt repo och går genom granskning som all annan kod.
import { defineCollection, fields } from '@osprey/core' export const blogPost = defineCollection({ slug: 'blog-post', access: { read: () => true }, fields: { slug: fields.slug({ from: 'title' }), locale: fields.text({ required: true }), title: fields.text({ required: true }), excerpt: fields.textarea(), body: fields.richText({ required: true }), publishedAt: fields.datetime(), }, }) - 02 · Admin
Adminen läser schemat och ritar formuläret.
Obligatoriska fält, språkväljaren, brödtexten i rich text. Inget ställs in två gånger.
- 03 · API
Publicerade poster kommer ut som JSON.
En GET, utan nyckel, med SEO, canonical och hreflang redan sammanslagna i varje post.
GET /api/v1/collections/blog-post/entries?locale=en Host: cms.altovar.net 200 OK { "data": [ { "id": "fdoc_16d9i3ef", "data": { "title": "EU-first content infrastructure", … }, "seo": { "metaTitle": "EU-first content infrastructure", … }, "canonical": "https://…/en/eu-first-content-infrastructure", "alternates": { "en": …, "x-default": … } } ], "pagination": { "page": 1, "limit": 20, "total": 3 } } - 04 · Webbplats
Din frontend renderar dem.
Astro-loadern hämtar posterna vid bygget. Bloggen nedan är byggd precis så, från det här CMS:et.
Öppna den skarpa bloggen →import { defineCollection } from 'astro:content' import { ospreyLoader } from '@osprey/astro' const blog = defineCollection({ loader: ospreyLoader({ collection: 'blog-post', baseUrl: 'https://cms.altovar.net', tenantId: 'altovar', }), })
Ditt innehåll. Din server. I dag.
Gratisplan, inget kort. Driftat i EU, eller på dina egna maskiner.