Gestión de contenido
Un CMS headless con colecciones, entradas, locales y releases. Administra el contenido desde el panel Content o el SDK.
Proyecta incluye un CMS headless completo. Es schema-first: defines colecciones (tipos de contenido estructurado) y luego creas entradas que cumplen con los campos de cada colección. Las entradas pueden localizarse y agruparse en releases.
El panel Content
Sección titulada «El panel Content»El contenido puede administrarse mediante el SDK o pidiéndoselo a la IA. La Content API tiene seis tipos de recursos:
| Pestaña / Recurso | Para qué sirve |
|---|---|
| Collections | Define y administra schemas de contenido (p. ej., “Blog Post”, “FAQ”, “Product Spec”) |
| Fields | Slots con tipo dentro de una colección (se administran como sub-recurso de Collections) |
| Entries | Navega, crea, edita, publica y elimina entradas dentro de una colección |
| Locales | Agrega y administra locales de idioma/región para contenido traducido |
| Releases | Agrupa entradas para publicarlas (o despublicarlas) juntas; publícalas manualmente con releases.publish() |
| Assets | Sube y administra archivos multimedia (imágenes, videos, PDFs) referenciables desde las entradas |
Haz clic en una colección en la pestaña Collections para ir directamente a sus entradas. La pestaña Entries te permite crear, editar, publicar y eliminar elementos de contenido individuales.
También puedes administrar todo de forma programática mediante el SDK (proyecta.content).
Conceptos
Sección titulada «Conceptos»| Concepto | Qué es |
|---|---|
| Collection | Un schema: la forma de un tipo de contenido (p. ej., “Blog Post”, “FAQ”, “Product Spec”) |
| Field | Un slot con tipo en una colección (p. ej., title: string, body: rich_text, coverImage: asset) |
| Entry | Una instancia individual de una colección (un artículo de blog, un ítem de FAQ) |
| Asset | Un archivo multimedia subido, referenciable desde las entradas |
| Locale | Un idioma/región al que se traduce el contenido |
| Release | Un grupo de entradas programadas para publicarse (o despublicarse) al mismo tiempo |
Quickstart
Sección titulada «Quickstart»import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collectionconst blog = await proyecta.content.collections.create({ api_id: 'blogPost', name: 'Blog Post', // fields are added via collections.fields.create()});
// 2. Create an entryconst post = await proyecta.content.entries.create({ collection_id: blog.id, data: { title: 'Hello, world', body: 'My very first post.', },});
// 3. Publish itawait proyecta.content.entries.publish({ entryId: post.id });Collections
Sección titulada «Collections»// Browse collectionsfor await (const collection of proyecta.content.collections.list()) { console.log(collection.name);}
// Add or remove fields on a collectionawait proyecta.content.collections.fields.create(blog.id, { /* field definition */});await proyecta.content.collections.fields.delete(blog.id, fieldId);Entries
Sección titulada «Entries»Las entradas son las filas de contenido reales. Cada entrada pertenece a una colección y contiene datos que corresponden a los campos de esa colección.
// Browse entries (pass the collection's api_id, not its numeric id)for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) { console.log(entry);}
// Update an entryawait proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entryawait proyecta.content.entries.publish({ entryId: post.id });
// Delete an entryawait proyecta.content.entries.delete(post.id);La subida de assets es de primera clase — úsalos para adjuntar imágenes, videos o PDFs a tus entradas:
// Browse assetsfor await (const asset of proyecta.content.assets.list()) { console.log(asset);}
// Upload, update, or delete via assets.create / assets.update / assets.deletePara subidas de archivos desde el chat (arrastrando al builder), consulta Files & Media.
Localización
Sección titulada «Localización»El contenido puede traducirse a múltiples locales. Cada locale es un registro administrado mediante proyecta.content.locales:
await proyecta.content.locales.create({ /* code, name, etc. */});
for await (const locale of proyecta.content.locales.list()) { console.log(locale);}Al obtener entradas, puedes solicitar la traducción de un locale específico. Consulta Internacionalización para ver el panorama completo de i18n.
Releases
Sección titulada «Releases»Un release es un conjunto de entradas que se publican (o se despublican) al mismo tiempo. Esto te permite preparar un lanzamiento de contenido coordinado — un lanzamiento de marketing, una nueva página de producto, una actualización de FAQ — y que todo cambie de forma atómica.
Nota: La publicación automática programada aún no está implementada. Los releases con una fecha
scheduled_atentran al estadoscheduled, pero deben publicarse manualmente mediantereleases.publish(). La publicación automática a la hora indicada estará disponible próximamente.
// Create a release (optionally with a target date)const release = await proyecta.content.releases.create({ name: 'Monday launch', scheduled_at: '2024-01-08T09:00:00Z',});
// Manually publish a release when readyawait proyecta.content.releases.publish({ releaseId: release.id });
// Browse releasesfor await (const r of proyecta.content.releases.list()) { console.log(r);}Para cambiar la programación de un release, elimínalo y vuelve a crearlo — no existe un endpoint de actualización.
Patrones comunes (deja que la IA lo configure)
Sección titulada «Patrones comunes (deja que la IA lo configure)»"Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug].""Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page.""Set up a multi-language landing page using Proyecta Content with English and Spanish locales.""Create a release containing three blog posts and publish it manually when ready."
Cuándo usar Content vs Database
Sección titulada «Cuándo usar Content vs Database»| Caso de uso | Usa esto |
|---|---|
| Contenido editorial (artículos, FAQs, copy de marketing) — requiere estados de publicado/borrador, programación, localización | Content API |
| Datos de la app (usuarios, órdenes, líneas de pedido) — requiere velocidad de consulta, transacciones, tiempo real | Database |
| Assets estáticos en el código | Directorio public/ en tu proyecto |
| Archivos subidos por usuarios | Files & Media |
Próximamente
Sección titulada «Próximamente»- Editor de entradas de texto enriquecido — edición WYSIWYG completa para campos
rich_texten el panel Content - Vista previa en vivo de los cambios de contenido en tu app
- Roles de contenido — permisos separados para editores y desarrolladores