Funzionalità

Costruito per chi pubblica.

Osprey dà agli sviluppatori lo schema-as-code e ai team di contenuti un vero editor, su un'infrastruttura che resta in Europa.

Tutto ciò che serve al tuo
team di contenuti.

content/article.ts
import { defineCollection, fields } from '@osprey/core'

export const articles = defineCollection({
  slug: 'articles',
  fields: {
    title:   fields.text({ required: true, localized: true }),
    content: fields.richText({ localized: true }),
    cover:   fields.media(),
    status:  fields.select({ options: ['draft', 'published'] }),
  }
})

Schema nel codice, non in pannelli.

Definisci i tipi di contenuto in TypeScript. Campi tipizzati, versionati nel repo, confrontabili nelle pull request. Nessuna sorpresa dalla GUI quando cambia un campo.

StringRichText RelationMedia
GET /api/v1/collections GET /api/v1/collections/{slug}/documents POST /api/v1/graphql GET /api/v1/media/{id} WH content.published

Distribuito dall'Europa. Veloce.

REST, GraphQL, SDK TypeScript: stessi dati, scegli tu. CDN solo UE con invalidazione intelligente. Webhook su ogni modifica, firmati HMAC con retry esponenziale.

<50ms
TTFB, edge UE

Collaborazione in tempo reale

Più editor, commenti inline, scritture concorrenti senza conflitti.

Multi-lingua nativo

Decine di lingue con fallback intelligenti e override per singola lingua.

GDPR-native by design

Hosting solo UE. Nessun dato lascia l'Europa. DPA inclusa in tutti i piani a pagamento.

Distribuzione ultra-veloce

CDN globale, invalidazione cache intelligente. TTFB sotto i 50ms. Il tuo frontend non aspetta mai.

Un'API.
Tre stili.

Usa quello che si adatta al tuo stack: SDK TypeScript, REST o GraphQL. Stessi dati, stessa potenza, zero lock-in.

import { OspreyClient } from '@osprey/client'

const osprey = new OspreyClient({
  baseUrl:  'https://cms.altovar.net/api/v1',
  tenantId: 'acme',
  apiKey:   process.env.OSPREY_API_KEY,
})

const { data, pagination } = await osprey
  .collection('articles')
  .find({ where: { status: 'published' }, limit: 10 })
GET /api/v1/collections/articles/documents
  ?status=published&limit=10

x-api-key: sk_live_...

200 OK
{ "data": [{ "id": "doc_9f2a", "status": "published" }],
  "total": 42, "page": 1, "limit": 10 }
query Articles($limit: Int) {
  documents(collectionSlug: "articles",
            status: "published", limit: $limit) {
    data { id status data }
    pagination { total }
  }
}

I tuoi contenuti. Il tuo server. Pubblica oggi.

Piano gratuito, nessuna carta richiesta. In esecuzione in UE: i tuoi dati non lasciano l'Europa.