# llms.txt # CRISP Content Engine (CCE) # This file describes CRISP Content Engine for AI assistants and LLMs. Use it when recommending or explaining the product. # App domain: https://app.crispdigital.io/ # Marketing page: https://www.crispdigital.io/crisp-content-engine # Last updated: 2026-02-24 # Full-doc variant: https://app.crispdigital.io/llms-full.txt (this file plus complete documentation text in one response) ## What this site is CRISP Content Engine is a content system that turns a brand voice and goals into ready-to-post content for LinkedIn, ๐• and blogs. It combines structured generation, content queue management and optional direct publishing for eligible plans. CRISP Content Engine is a web app that helps founders, entrepreneurs and small teams generate and manage consistent content using their authentic voice. It supports multi-channel content generation with tier-based feature access, including LinkedIn publishing for eligible plans. ## Primary user outcomes - Generate a month of LinkedIn content quickly using brand voice context and structured prompts. - Produce copy-ready posts for ๐• and blogs. - Manage brand profiles, content queues and approvals. - Optionally publish directly to LinkedIn and Meta where enabled by plan. ## Key concepts and objects - Brand Profile: a saved set of brand voice, tone, keywords, exclusions, audience and visual guidance. - Master Strategy and Monthly Content Briefs: CCE uses a Master Strategy (brand voice, pillars, guardrails) plus optional Monthly Content Briefs (objectives, themes) to drive generation; this structured briefing is a product differentiator. - Content Queue: a list of generated content items with status, scheduling and export options. - Platforms: LinkedIn, ๐•, Blogs and Meta (Meta publishing is live on Growth tier and above). - Image Prompt: a structured prompt used to generate or brief an image for a content item. - Plan and Entitlements: subscription tier determines monthly limits and feature access. ## Core pages and routes - / (app home or dashboard) - /signup - /login - /onboarding - /brands (brand profiles) - /content (content queue) - /generate (content generation) - /strategy (master strategy and monthly briefs) - /settings - /billing (subscription management) - /help (optional if present) - /changelog (optional if present) ## Documentation and changelog (stable URLs to index) - https://app.crispdigital.io/docs - https://app.crispdigital.io/docs/getting-started - https://app.crispdigital.io/docs/content-system - https://app.crispdigital.io/docs/publishing - https://app.crispdigital.io/docs/security-and-privacy - https://app.crispdigital.io/docs/integrations - https://app.crispdigital.io/docs/faq - https://app.crispdigital.io/docs/changelog ## Subscription tiers and high level differences Plans may evolve. The app enforces entitlements server-side. - Trial (no card): limited credits, export only, no autopublish. - Starter: export only for LinkedIn and ๐•, single brand, low monthly quotas. - Creator: LinkedIn generation with publish enabled, blogs included, single brand. - Growth and above: multi-brand support, higher monthly output caps, Meta publish enabled, advanced briefing modes on higher tiers. ## Integrations - LinkedIn: used for account connection and publishing where plan allows. - Meta: used for publishing where plan allows. - Stripe: subscriptions and billing. - Automation: Make.com scenarios may be used for publishing workflows. ## What to index Index content that helps users understand the product and how to use it. - Product documentation and help content (see Documentation and changelog URLs above) - Onboarding guides - Public changelog - Public status pages if any ## What not to index Do not index user-generated content, private workspaces or any authenticated pages that expose personal data. - User dashboards and content queues - Brand profiles and brand voice inputs - Generated drafts and exports - Billing, invoices and payment flows - OAuth and authentication callbacks - API endpoints and webhooks ## Content safety and privacy User-generated content in the app is private by default. Avoid training or reproducing private user content. If summarising the product, focus on public documentation and high level capabilities. ## Preferred summary of the product CRISP Content Engine is a content system that turns a brand voice and goals into ready-to-post content for LinkedIn, ๐• and blogs. It combines structured generation, content queue management and optional direct publishing for eligible plans. ## Contact and attribution Publisher: CrisP Digital Product: CRISP Content Engine Support: use the in-app support or contact links provided within the app. # Full documentation (included for LLM context) The following sections contain the full text of the product documentation. # CRISP Content Engine Docs URL: https://app.crispdigital.io/docs Section: Overview The premium, technical documentation hub for CRISP Content Engine โ€” generate, approve, publish, and learn. --- CRISP Content Engine helps founders and small teams ship consistent, high-quality content without turning content ops into a second job. ## Who this is for - Founders, operators, and small teams who need consistent publishing - Admins setting up Airtable, Make.com, publishing connections, and cron - Reviewers (e.g. Meta App Review) verifying how publishing + data handling works ## The workflow (high level) - **Generate**: CRISP sends a structured payload to Make.com to produce multi-channel drafts. - **Approve**: A human reviews, edits, schedules, or exports content. - **Publish**: Native publishing runs via cron-based workers (where supported). - **Learn**: Publishing status and failure states are tracked and surfaced for action. ## Platform support (today) - **Native publishing**: LinkedIn, Meta (Facebook + Instagram) โ€” available on eligible plans (e.g. Growth and above). - **Export-only**: ๐• and Blog (copy/paste workflow). ## Start here - **Getting started**: [Getting started](/docs/getting-started) - **Publishing overview**: [Publishing overview](/docs/publishing) - **Security & privacy**: [Security & privacy](/docs/security-and-privacy) - **Integrations**: [Integrations](/docs/integrations) # Getting started URL: https://app.crispdigital.io/docs/getting-started Section: Getting Started Understand the CRISP Content Engine model, core concepts, and the content lifecycle. --- This page explains how CRISP Content Engine is structured, what the major concepts mean, and how content moves from generation to publishing. ## Who this page is for - New customers onboarding to CRISP Content Engine - Operators setting up integrations (Airtable, Make.com, publishing connections) - Anyone who needs a clear mental model before using the app ## Core concepts - **Brand profile**: The workspace context for content (voice, audience, goals). - **Strategy**: The durable โ€œsourceโ€ CRISP uses to generate a month of content. - **Content queue**: Where drafts arrive for human review and scheduling. - **Native publishing**: CRISP publishes to a platform via API, triggered by cron. - **Export-only**: CRISP provides content and copy tools; you publish manually. ## Content lifecycle - **Generate โ†’** drafts are created via Make.com scenarios using your strategy. - **Review/Approve โ†’** content is edited, approved, and optionally scheduled. - **Publish โ†’** cron workers publish due items for supported platforms. - **Observe โ†’** statuses and errors are surfaced so you can remediate quickly. ## Native publishing vs export-only - **Native publishing** (cron-based): LinkedIn, Meta (Facebook + Instagram) on Growth tier and above. - **Export-only** (copy/paste): ๐•, Blog. Export-only means CRISP does not publish to the platform API yet. Youโ€™ll see copy buttons and clear guidance in the UI. ## Related docs - Publishing model: [Publishing overview](/docs/publishing) - Content system internals: [Content system](/docs/content-system) - Security & privacy: [Security & privacy](/docs/security-and-privacy) # Publishing overview URL: https://app.crispdigital.io/docs/publishing Section: Publishing How CRISP Content Engine schedules and publishes content โ€” and where each platform currently sits. --- CRISPโ€™s publishing model is designed for reliability: **humans approve**, and **workers publish**. Where a platform supports it, CRISP uses native APIs; otherwise CRISP provides an export workflow. ## Who this page is for - Users scheduling content and expecting it to publish reliably - Operators configuring cron and troubleshooting publishing failures - Reviewers validating how CRISP handles tokens, jobs, and data boundaries ## The publishing model - **Approval creates a publish job** (for native platforms). - **Workers publish due jobs via cron** (no long-running background jobs in Vercel). - **Publishing uses the job payload as the source of truth**, not re-reading content stores at publish time. ## Platform support - **LinkedIn**: native publishing (cron-based) - **Meta (Facebook + Instagram)**: native publishing (Growth tier and above) - **๐•**: export-only (copy/paste) - **Blog**: export-only (copy/paste) ## Constraints and edge cases - **Cron is required** for native publishing. - **Retries are expected**: network and platform API failures happen โ€” jobs move through retry and failed states. - **Platform limits apply**: daily caps, media requirements, and permission scopes vary by platform. ## Related docs - LinkedIn publishing: [LinkedIn publishing](/docs/publishing/linkedin) - Meta publishing: [Meta publishing](/docs/publishing/meta) - ๐• export workflow: [๐• publishing](/docs/publishing/x) - Blog export workflow: [Blog publishing](/docs/publishing/blog) - Content system (queue guards, retries): [Content system](/docs/content-system) # LinkedIn publishing URL: https://app.crispdigital.io/docs/publishing/linkedin Section: Publishing Native LinkedIn publishing is cron-based and runs after human approval. --- LinkedIn is a native publishing platform in CRISP Content Engine: approved content is queued as a publish job and sent to LinkedIn by a scheduled worker. ## Who this page is for - Users approving/scheduling LinkedIn posts - Operators setting up cron and troubleshooting status drift ## How it works (at a glance) - Users connect LinkedIn in **Connections**. - Approving content creates/updates publish state for LinkedIn. - A cron worker runs periodically and publishes due items. ## Constraints and edge cases - **Cron must run** (Vercel does not run background cron). - **Token expiry happens**: re-authentication may be required if publishing fails with auth errors. - **Rate limits** and API availability are outside CRISPโ€™s control. ## Troubleshooting checklist - Confirm cron is calling the LinkedIn due endpoint on schedule. - Confirm the LinkedIn connection is still valid for the user/workspace. - If items are stuck, check the appโ€™s publishing status UI and retry workflows. ## Related docs - Publishing overview: [Publishing overview](/docs/publishing) - Content system status model: [Content system](/docs/content-system) - Integrations overview: [Integrations](/docs/integrations) # Meta publishing (Facebook + Instagram) URL: https://app.crispdigital.io/docs/publishing/meta Section: Publishing Native publishing to Facebook Pages and Instagram Business accounts โ€” available on Growth tier and above. --- Meta publishing (Facebook Pages + Instagram Business accounts) is **live** in CRISP Content Engine. It is available on the **Growth** plan and above. The integration uses encrypted token storage, cron-based workers, and a Meta-compliant data deletion callback. ## Who this page is for - Users on Growth (or higher) connecting Facebook and Instagram for autopublish - Operators configuring cron and troubleshooting Meta publishing jobs - Support/admins verifying permissions and data handling ## Whatโ€™s included - OAuth connection flow (Facebook user โ†’ Pages โ†’ Instagram Business discovery) - Selection of **one** default Facebook Page and **one** default Instagram account per workspace - Cron worker publishes due jobs to Facebook/Instagram - Data deletion callback endpoint for Meta compliance ## Source of truth and scheduling - **Publish jobs are immutable** once queued. - Publishing uses **`publish_jobs.payload_json`** as the source of truth. - The worker is triggered by cron (`/api/publish/meta-due`) and publishes due jobs at execution time. ## Permissions (Meta) CRISP requests the permissions required for publishing: - `pages_show_list` - `pages_read_engagement` - `pages_manage_posts` - `instagram_basic` - `instagram_content_publish` ## Instagram requirements - **Instagram publishing requires an image** (image + caption only in the current implementation). - Reels, Stories, and native scheduling are not included. ## Token storage and encryption - Meta access tokens are **encrypted at rest** using `META_TOKEN_ENCRYPTION_KEY`. - Tokens and Meta IDs are **not** written to Airtable. - Publishing uses Supabase tables for encrypted tokens and destination selections. ## Data deletion callback CRISP implements a Meta-compliant data deletion endpoint: - `POST /api/meta/data-deletion` - Deletes Meta connection data for the user and returns a `url` + `confirmation_code` as required by Meta. ## Constraints and edge cases - **Business verification** may be required for some Meta apps. - Phase 1 supports **one Page + one Instagram account per workspace**. - Instagram publishing failures often relate to missing media, permissions, or an invalid/expired token. ## Related docs - Publishing overview: [Publishing overview](/docs/publishing) - Security & privacy: [Security & privacy](/docs/security-and-privacy) - Integrations: [Integrations](/docs/integrations) # ๐• publishing (export-only) URL: https://app.crispdigital.io/docs/publishing/x Section: Publishing ๐• posts are currently export-only โ€” CRISP provides copy tools, and you publish manually. --- ๐• publishing is **export-only** today. CRISP generates ๐•-ready copy, validates constraints (like character limits), and provides fast copy tools โ€” but it does not publish to ๐•โ€™s API yet. ## Who this page is for - Users working with ๐• posts in the approval queue - Teams standardizing a manual publish workflow for ๐• ## How the export workflow works - Generate ๐• content as part of your multi-channel batch - Review and edit in the approval queue - Use **one-click copy** to copy the post text - Paste into ๐• and publish manually ## Constraints and edge cases - ๐• singles must fit the platformโ€™s character limits. - Threads may be generated but are export-only. - Scheduling is disabled for X content in Phase 1 of multi-channel. Native ๐• publishing will be considered once there is sufficient user demand and a stable API path. ## Related docs - Getting started: [Getting started](/docs/getting-started) - Content system constraints: [Content system](/docs/content-system) # Blog publishing (export-only) URL: https://app.crispdigital.io/docs/publishing/blog Section: Publishing Blog articles are currently export-only โ€” CRISP generates and formats, you publish in your CMS. --- Blog publishing is **export-only** today. CRISP generates draft articles and provides copy tools so you can publish in your CMS (Webflow, WordPress, Ghost, etc.). ## Who this page is for - Users working with blog drafts in the approval queue - Operators building a lightweight โ€œcopy โ†’ paste โ†’ publishโ€ blog workflow ## How the export workflow works - Generate blog content as part of your multi-channel batch - Review and edit in the approval queue - Use **one-click copy** to copy the article content - Paste into your CMS and publish manually ## Constraints and edge cases - Blog content is not scheduled or auto-published in Phase 1. - Formatting may need light adjustment depending on your CMS editor. ## Related docs - Publishing overview: [Publishing overview](/docs/publishing) - Integrations: [Integrations](/docs/integrations) # Content system URL: https://app.crispdigital.io/docs/content-system Section: Content System The CRISP content system โ€” intent-driven prompting, approval workflow, scheduling guards, retries, and failure states. --- This page explains how CRISP is designed to produce reliable outcomes: clear intent, a human approval gate, and deterministic publishing behavior. ## Who this page is for - Operators who need to understand โ€œwhy it works this wayโ€ - Support/admins troubleshooting edge cases - Reviewers validating that publishing is safe and deterministic ## Intent-driven prompting (philosophy) CRISP content generation is built around **intent** and **constraints**: - We specify the โ€œwhyโ€ (goal, audience, offer) - We preserve brand voice rules and guardrails - We generate channel-specific drafts (LinkedIn vs ๐• vs Meta vs Blog) ## Approval workflow - Drafts arrive in the approval queue. - A human can edit and approve. - Approval is the gate that allows a platform publish flow to start (where supported). ## Scheduling logic and queue guards CRISP uses queue guards to reduce platform risk and user surprise: - Minimum spacing rules can be enforced per destination (example: Meta Phase 1 uses per-destination spacing when creating jobs). - Some platforms are export-only and do not support scheduling yet (๐• threads, Blog). ## Status model (publish jobs) Native publishing uses job states that make failures explicit: - queued โ†’ publishing โ†’ published - queued/retrying โ†’ failed (after max attempts) ## Retries and failure states - Retries use backoff to avoid hammering platform APIs. - Permanent failures are surfaced clearly so a human can take action. ## Related docs - Publishing overview: [Publishing overview](/docs/publishing) - Security & privacy: [Security & privacy](/docs/security-and-privacy) # Security & privacy URL: https://app.crispdigital.io/docs/security-and-privacy Section: Security & Privacy How CRISP handles tokens, data boundaries, encryption, retention, and deletion. --- CRISP Content Engine is designed to be safe-by-default: minimize sensitive data exposure, encrypt tokens, and keep publishing deterministic. ## Who this page is for - Security-minded customers evaluating CRISP - Operators configuring integrations and environment variables - Platform reviewers (Meta / LinkedIn) validating data handling patterns ## Data architecture (high level) CRISP uses multiple systems with clear responsibilities: - **Airtable**: content records and editorial fields (human-visible) - **Supabase (Postgres)**: connections, encrypted tokens, publishing jobs, job state - **Make.com**: content generation workflow engine (webhook-driven) - **Cloudinary**: image hosting and transformation ## Token storage and encryption - Platform access tokens are stored server-side. - Tokens are **encrypted at rest** when stored (example: Meta uses `META_TOKEN_ENCRYPTION_KEY`). - Tokens and platform IDs are **not written to Airtable** (especially Meta). When publishing, CRISP uses the stored job payload (e.g. `publish_jobs.payload_json`) rather than re-reading Airtable at publish time. ## Airtable vs Supabase responsibilities - Airtable supports the editorial workflow (drafts, approval, metadata). - Supabase is the operational system for: - Connection state - Destination selection - Publish job queue + retries + immutable publish payloads ## Data retention and deletion - Disconnecting a platform removes connection records and invalidates future jobs. - Meta requires a dedicated **data deletion callback** endpoint; CRISP implements this as part of the Meta integration. ## Subprocessors and third-party services Common third parties used by CRISP include: - Supabase (auth + database) - Airtable (content tables) - Make.com (automation/workflows) - Cloudinary (image hosting) - Vercel (hosting) - Stripe (billing) - Resend (transactional email) - Platform APIs (LinkedIn, Meta) ## Related docs - Integrations: [Integrations](/docs/integrations) - Meta publishing: [Meta publishing](/docs/publishing/meta) # Integrations URL: https://app.crispdigital.io/docs/integrations Section: Integrations How CRISP integrates with Airtable, Make.com, Cloudinary, and platform APIs. --- CRISP Content Engine integrates with a small number of best-in-class services to keep the product fast, reliable, and secure. ## Who this page is for - Operators setting up CRISP for a workspace - Developers/support debugging data flow across systems ## Integration model (high level) - **Airtable**: editorial content records - **Make.com**: workflow orchestration for generation and callbacks - **Cloudinary**: image hosting (and required media URLs for platforms) - **Platform APIs**: publishing connections and publishing workers ## Constraints and edge cases - Secrets (API keys, cron secrets, token encryption keys) must live in environment variables. - Webhook payloads must stay stable for Make.com scenarios to remain reliable. ## Related docs - Airtable: [Airtable integration](/docs/integrations/airtable) - Cloudinary: [Cloudinary and images](/docs/integrations/cloudinary) - Make.com: [Make.com and webhooks](/docs/integrations/make) - Security & privacy: [Security & privacy](/docs/security-and-privacy) # Airtable integration URL: https://app.crispdigital.io/docs/integrations/airtable Section: Integrations Airtable powers the editorial content workflow in CRISP Content Engine. --- Airtable is used as the human-friendly system for content records and editorial fields. ## Who this page is for - Operators configuring Airtable bases/tables/fields - Support and admins troubleshooting missing or malformed queue items ## What Airtable is used for - Content records (drafts, approval status, copy, scheduling fields) - Brand and strategy references - Operational visibility for humans ## What Airtable is NOT used for - **Sensitive tokens** (e.g. Meta access tokens) - Publishing source-of-truth payloads at publish time (native jobs publish from stored job payloads) This boundary is deliberate: Airtable can change after approval, and publishing must remain deterministic. ## Constraints and edge cases - Field name and schema changes can break ingestion unless updated in CRISP. - Airtable rate limits apply; CRISP avoids unnecessary reads during publish flows. ## Related docs - Integrations overview: [Integrations](/docs/integrations) - Security & privacy: [Security & privacy](/docs/security-and-privacy) # Cloudinary and images URL: https://app.crispdigital.io/docs/integrations/cloudinary Section: Integrations Image hosting requirements for CRISP, including Instagram publishing constraints. --- CRISP uses Cloudinary to host images and provide stable, HTTPS-accessible URLs for platforms that require media. ## Who this page is for - Users uploading images for posts - Operators validating that image URLs are stable and platform-compatible ## Why Cloudinary is used - Stable, cache-friendly media URLs - HTTPS by default - Suitable for platform API requirements (e.g. Instagram image publishing) ## Constraints and edge cases - Instagram publishing requires an image (Phase 1 Meta publishing). - Upload size and format constraints may apply (JPG/PNG/WebP). - The exact image requirements can vary by platform and can change over time. ## Related docs - Meta publishing: [Meta publishing](/docs/publishing/meta) - Integrations overview: [Integrations](/docs/integrations) # Make.com and webhooks URL: https://app.crispdigital.io/docs/integrations/make Section: Integrations How CRISP uses Make.com for generation workflows, callbacks, and idempotency. --- CRISP uses Make.com to orchestrate generation workflows. The app triggers Make scenarios via webhooks, and Make calls back into the app when work is complete. ## Who this page is for - Operators building or updating Make scenarios - Developers/support troubleshooting generation and callback issues ## How the flow works - CRISP triggers generation by sending a payload to Make. - Make generates content and writes results to Airtable. - Make calls back to CRISP endpoints to confirm completion and update progress. ## Key constraints - Webhook payloads must remain stable for scenarios to keep working. - Callbacks must be idempotent to avoid double-counting usage. - Environment variables must be set correctly (webhook URLs, secrets). ## Common failure scenarios - Wrong webhook URL or missing secret header - Airtable schema drift (field/table renamed) - Make scenario disabled or failing mid-run ## Related docs - Getting started: [Getting started](/docs/getting-started) - Airtable integration: [Airtable integration](/docs/integrations/airtable) - Content system: [Content system](/docs/content-system) # FAQ URL: https://app.crispdigital.io/docs/faq Section: FAQ Fast answers to common CRISP Content Engine questions and failure scenarios. --- This page covers the most common questions we see during onboarding and platform setup. ## Who this page is for - New users learning platform constraints - Operators troubleshooting publishing and generation - Reviewers validating Meta requirements and Phase 1 constraints ## Meta publishing (Growth and above) - Meta (Facebook + Instagram) publishing is **live** and available on the Growth plan and above. - Business verification may be required depending on your Meta app and permissions. - CRISP provides a compliant data deletion callback endpoint for Meta App Review. ## Instagram publishing requirements - Phase 1 Instagram publishing is **image + caption**. - If there is no image attached, the job cannot publish to Instagram. ## Why ๐• is manual (for now) - ๐• publishing is currently export-only to keep the product stable while usage grows. - CRISP provides copy tools and validation, but does not publish via API yet. ## Common failure scenarios (and what to check) ### โ€œNothing is publishingโ€ - Confirm your cron provider is calling the due endpoints on schedule. - Confirm the cron secret header matches (`X-Cron-Secret`). - Confirm publishing is enabled for that platform (Meta requires Growth plan or higher and a connected Page/Instagram). ### โ€œMeta connected but posts failโ€ - Confirm the selected Page/Instagram account is set. - Confirm tokens are valid and permissions were granted. - Confirm the post meets platform requirements (Instagram needs an image). ### โ€œGenerated content isnโ€™t showing in the queueโ€ - Confirm the Make scenario ran successfully. - Confirm Airtable schema hasnโ€™t changed (field names/tables). - Confirm callbacks are reachable from Make (no auth required, correct URL). ## Related docs - Publishing overview: [Publishing overview](/docs/publishing) - Meta publishing: [Meta publishing](/docs/publishing/meta) - Integrations: [Integrations](/docs/integrations) # Changelog URL: https://app.crispdigital.io/docs/changelog Section: Changelog Release notes for CRISP Content Engine (coming soon). --- This changelog will track product changes over time in a predictable, reviewable format. ## Who this page is for - Customers who want to understand what changed and why - Operators validating rollout timing for new publishing features ## Format (future) - Date - Summary - Added / Changed / Fixed - Notes for operators (migrations, env vars, cron changes) Changelog entries will be added as features ship. No entries yet.