Un'alternativa a Contentful e DatoCMS

Un pannello, N progetti, una fattura che non cresce col traffico

CMS headless multi-tenant e API-first. Il percorso di lettura non arriva mai all'API — quando crescono i visitatori, a salire è il tasso di cache, non la fattura.

I suoi dati risiedono su server gestiti da noiNessun servizio esterno a consumoInstallazione sui suoi server con il piano Enterprise

Il percorso di lettura in numeri

Query al database per lettura
0
Richieste HTTP per pagina
2
Risposta della ricerca tollerante agli errori
<50 ms
Moduli disattivabili singolarmente
7+

Ogni componente sulla nostra infrastruttura

PostgreSQL
Valkey
Typesense
Garage · compatibile S3
cache edge nginx
NestJS
Drizzle
Next.js

Funzionalità

L'infrastruttura dei contenuti, senza il mal di testa

Tutto sta dietro l'API; nessuna funzionalità è chiusa nel pannello.

Multi-tenancy e RLS

Ogni progetto è uno spazio a sé. L'isolamento vive nel database, non nell'applicazione: la sicurezza a livello di riga di PostgreSQL impedisce che i dati di un tenant finiscano in un altro, anche quando il livello applicativo sbaglia.

Motore di schema e ruoli dei campi

I tipi di contenuto non sono scolpiti nel codice; li definisce dal pannello o tramite API. I campi portano ruoli come title, slug e body — la pipeline di build e la generazione SEO guardano il ruolo, non il nome del campo.

Architettura a moduli

Media, ricerca, webhook, SEO, GraphQL, importazione, analytics — ciascuno separato e disattivabile. Disattivare non cancella dati; riattivi il modulo e riprende da dove si era fermato.

Letture servite dall'edge

I contenuti pubblicati vengono scritti a un indirizzo immutabile in fase di build e serviti dalla cache edge di nginx. Né il numero di voci né quello dei visitatori alza il costo di una lettura.

Libreria media

Archiviazione oggetti compatibile S3 (Garage), immagini replicate su tre zone e derivati automatici. I file che carica restano sulla nostra infrastruttura e non finiscono mai su una CDN a consumo.

Ricerca tollerante agli errori di battitura

Ricerca full-text multilingue basata su Typesense. Anche chi digita «Istanul» trova il contenuto giusto, e la risposta torna in meno di 50 millisecondi.

Webhook

Pubblicazione, aggiornamento, eliminazione — a ogni evento i suoi sistemi vengono avvisati. La consegna resta in una coda durevole e viene ritentata con backoff esponenziale; anche se il processo muore, l'evento sopravvive.

GraphQL

Lo schema non si scrive a mano: viene derivato dai tipi di contenuto dello spazio. Aggiunge un tipo e diventa interrogabile. I limiti di profondità e lunghezza sono obbligatori, come difesa dalle query bomba.

SDK type-safe

@corpusctl/client con adattatori per React, Vue e Next.js. I renderer dei blocchi arrivano con zero stile predefinito — non imponiamo una riga di CSS, il design è interamente suo.

Esempi di codice

Dal pannello, oppure con un solo comando

Tutto ciò che può fare nel pannello ha un equivalente API; nessuna funzionalità è chiusa nell'interfaccia.

publish.sh
# 1) Definire il tipo di contenuto — lo schema non è scolpito nel codice
curl -X PUT "$API/v1/content-types/post" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -H "content-type: application/json" \
  -d '{
    "name": "post",
    "title": "Post",
    "fields": [
      { "name": "title", "type": "text",   "role": "title", "required": true },
      { "name": "slug",  "type": "slug",   "role": "slug",  "required": true },
      { "name": "body",  "type": "blocks", "role": "body" }
    ]
  }'

# 2) Creare una bozza
curl -X POST "$API/v1/documents" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT" \
  -d '{ "type": "post", "data": { "title": "Hello", "slug": "hello" } }'

# 3) Pubblicare — validazione, build e distribuzione all'edge in una sola chiamata
curl -X POST "$API/v1/documents/$ID/publish" \
  -H "authorization: Bearer $TOKEN" \
  -H "x-corpusctl-tenant: $TENANT"

# → { "data": { "version": 3, "contentHash": "…", "durationMs": 42 } }

Il percorso di lettura non tocca il database

  • Cache indirizzata per contenuto. L'indirizzo è l'hash del contenuto. Non potendo cambiare, si può conservare a tempo indeterminato — il «dato stantio» smette di essere un problema.
  • Più traffico non significa più costi. Poiché le richieste di lettura non arrivano mai all'API, non c'è alcuna chiamata da misurare; la fattura non sale insieme ai visitatori.
  • Scrittura e lettura in classi separate. ReadClient non porta token segreti e può girare nel browser; ManagementClient resta lato server. Se fosse un'unica classe, far trapelare un token sarebbe un errore da una riga.

Architettura

Percorso di scrittura separato, percorso di lettura separato

Il pulsante Pubblica avvia una build; il visitatore legge il risultato di quella build, non il sistema.

PERCORSO DI SCRITTURAPERCORSO DI LETTURA (VELOCE)Pannello · ManagementClientAPI — NestJSPostgreSQLRLS · partizionepubblicaPipeline di buildFrontend · ReadClientcache edge nginxhit → risposta in msin caso di missorigin — nginxArchiviazione oggetti — compatibile S3<tenant>/c/<hash>.json · immutabilescrivileggi
I due percorsi si incontrano solo nell'archiviazione oggetti. Poiché il traffico dei visitatori non raggiunge né l'API né PostgreSQL, il carico sul lato scrittura è del tutto indipendente da quello sul lato lettura.

Indirizzo immutabile

Il contenuto è indirizzato tramite il suo hash. Lo stesso indirizzo non restituisce mai un contenuto diverso, quindi può restare in cache 30 giorni; al momento della pubblicazione il manifest viene aggiornato.

Il manifest è suddiviso in shard

Quale shard del manifest leggere viene calcolato dallo slug sul client. Anche in uno spazio con diecimila voci si scarica un solo file di piccole dimensioni.

Versioni e pianificazione

Ogni record è versionato e una versione precedente può essere ripristinata nella bozza. La pubblicazione può essere pianificata a una data futura; è lo scheduler stesso ad avviare la build.

Confronto

Dove siamo avanti e dove non lo siamo

Non vinciamo ogni riga. Questa tabella esiste perché veda con chiarezza che cosa sta scegliendo.

corpusctl a confronto con Contentful e DatoCMS — sulla base delle informazioni di prodotto pubbliche al agosto 2026.
CriteriocorpusctlContentfulDatoCMS
Modello di prezzoPiano fisso. Poiché le richieste di lettura non arrivano all'API, non c'è alcuna chiamata da misurare.A consumo per chiamata API, record e utente; extra in caso di superamento.A consumo per chiamata API e per banda.
Gestione multi-progettoNel nucleo del prodotto. Un pannello, spazi illimitati; l'utente ha un ruolo distinto in ciascuno.Ogni progetto è uno «space»; nella maggior parte dei piani si paga per space.Ogni progetto è un ambiente a sé; un piano per progetto.
Isolamento dei tenantA livello di database — sicurezza a livello di riga di PostgreSQL (RLS).A livello applicativo; dettagli non divulgati.A livello applicativo; dettagli non divulgati.
Ubicazione dei datiServer gestiti da noi; con il piano Enterprise interamente sui suoi server.Il cloud del fornitore; scelta della regione nei piani superiori.Il cloud del fornitore; scelta della regione nei piani superiori.
Servizi esterni a consumoNessuno. PostgreSQL, Valkey, Typesense, Garage, nginx — tutto sulla nostra infrastruttura.Sì; i livelli di ricerca, immagini e CDN sono a consumo.Sì; CDN immagini e trasformazioni sono a consumo.
Rendering impostoNessuno. I renderer dei blocchi arrivano con zero stile predefinito; un blocco sconosciuto viene saltato, mai fatale.È fornito un renderer rich text; le scelte di stile restano sue.È fornito un renderer di testo strutturato; le scelte di stile restano sue.
Disattivare funzionalitàOgni funzionalità è un modulo disattivabile; disattivare non cancella dati, e nemmeno il passaggio a un piano inferiore.I limiti di piano rendono la funzionalità inaccessibile.I limiti di piano rendono la funzionalità inaccessibile.
Rete edge globaleCache edge su una sola regione. Non abbiamo una rete di PoP globale.CDN globale su più regioni.CDN globale su più regioni.
Marketplace di appNessuno. Le integrazioni si scrivono con webhook e API.Un ecosistema di app ampio e maturo.È disponibile un ecosistema di plugin.
Maturità enterpriseProdotto giovane; SSO e uno SLA formale sono nella roadmap.SOC 2, SSO, SLA — maturo.SSO e SLA nei piani superiori.
Se serve un pubblico globale con latenza di millisecondi e le occorre un marketplace di integrazioni già pronto, la risposta onesta è che oggi Contentful è più maturo. Ma per i team che servono Turchia ed Europa, gestiscono più progetti e non vogliono che il numero di visitatori muova la fattura, corpusctl è un compromesso deliberatamente migliore.

FAQ

Domande frequenti

Se non ha trovato quello che cercava, scriva a [email protected].

Apra oggi il suo primo spazio

Creare un account richiede pochi minuti: bastano un indirizzo e-mail, una password e un nome per il suo spazio. Non chiediamo la carta. Se le serve aiuto per migrare, ci scriva.