@thierrynakoa/fire-flow 12.2.1 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
# Headless CMS Architecture
|
|
2
|
+
|
|
3
|
+
> Comprehensive guide to decoupled content architecture: content API design, cache invalidation, multi-channel delivery, and integration patterns for Next.js and beyond.
|
|
4
|
+
|
|
5
|
+
**When to use:** Designing or evaluating a content platform that needs to serve content to multiple frontends (web, mobile, email, voice), or migrating from a monolithic CMS (WordPress) to a headless architecture.
|
|
6
|
+
**Stack:** Node.js/Express or Bun, Next.js, PostgreSQL, any CDN (Cloudflare/Vercel/Fastly)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What "Headless" Means
|
|
11
|
+
|
|
12
|
+
**Traditional (monolithic) CMS:**
|
|
13
|
+
```
|
|
14
|
+
[CMS Backend + Database]
|
|
15
|
+
|
|
|
16
|
+
[Template Engine] ← CMS controls how content looks
|
|
17
|
+
|
|
|
18
|
+
[HTML to Browser]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Headless CMS:**
|
|
22
|
+
```
|
|
23
|
+
[CMS Backend + Database]
|
|
24
|
+
|
|
|
25
|
+
[Content API] ← CMS only provides structured content
|
|
26
|
+
/ \
|
|
27
|
+
[Web Frontend] [Mobile App] [Email] [Voice] [Any Consumer]
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The CMS becomes a **content repository** with an API. Every consumer fetches the same structured data and renders it however it needs to.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Architecture Diagram
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─────────────────────────────────────────────────────────┐
|
|
38
|
+
│ Content Platform │
|
|
39
|
+
│ │
|
|
40
|
+
│ ┌──────────┐ ┌─────────────┐ ┌─────────────────┐ │
|
|
41
|
+
│ │ Author │ │ CMS Admin │ │ Media Storage │ │
|
|
42
|
+
│ │ Workflow │───►│ UI │ │ (S3 / R2 / CDN) │ │
|
|
43
|
+
│ └──────────┘ └──────┬──────┘ └────────┬────────┘ │
|
|
44
|
+
│ │ │ │
|
|
45
|
+
│ ┌──────▼──────┐ │ │
|
|
46
|
+
│ │ PostgreSQL │◄────────────┘ │
|
|
47
|
+
│ │ (content) │ │
|
|
48
|
+
│ └──────┬──────┘ │
|
|
49
|
+
│ │ │
|
|
50
|
+
│ ┌──────▼──────┐ │
|
|
51
|
+
│ │ Content API │ ← REST or GraphQL │
|
|
52
|
+
│ │ /api/v1/ │ │
|
|
53
|
+
│ └──────┬──────┘ │
|
|
54
|
+
└──────────────────────────┼──────────────────────────────┘
|
|
55
|
+
│
|
|
56
|
+
┌────────────┼────────────┐
|
|
57
|
+
│ │ │
|
|
58
|
+
┌─────────▼─┐ ┌───────▼───┐ ┌────▼──────────┐
|
|
59
|
+
│ CDN / │ │ Mobile │ │ Newsletter / │
|
|
60
|
+
│ Next.js │ │ App API │ │ Email ESP │
|
|
61
|
+
│ (ISR) │ │ (React N) │ │ (Resend etc) │
|
|
62
|
+
└─────────┬─┘ └───────────┘ └───────────────┘
|
|
63
|
+
│
|
|
64
|
+
┌─────────▼──────────┐
|
|
65
|
+
│ End User Browser │
|
|
66
|
+
└─────────────────────┘
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## REST vs GraphQL Content API
|
|
72
|
+
|
|
73
|
+
### Use REST when:
|
|
74
|
+
- Your content types are simple and relatively fixed
|
|
75
|
+
- Consumers are varied (mobile devs, third-party integrators) — REST is universally understood
|
|
76
|
+
- You want CDN-cacheable responses (GET requests with predictable URLs)
|
|
77
|
+
- Team is not yet familiar with GraphQL
|
|
78
|
+
|
|
79
|
+
### Use GraphQL when:
|
|
80
|
+
- Different consumers need different subsets of the same content (web wants full post, mobile wants summary only)
|
|
81
|
+
- Content is deeply relational (post → author → bio → social links → recent posts)
|
|
82
|
+
- You want to avoid over-fetching or under-fetching
|
|
83
|
+
- You're building a developer platform where external devs write their own queries
|
|
84
|
+
|
|
85
|
+
### REST Content API Design
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// REST endpoints for a content API
|
|
89
|
+
GET /api/v1/posts // list (paginated, filterable)
|
|
90
|
+
GET /api/v1/posts/:slug // single post by slug
|
|
91
|
+
GET /api/v1/posts/:slug/related // related posts
|
|
92
|
+
GET /api/v1/categories // all categories
|
|
93
|
+
GET /api/v1/categories/:slug/posts // posts in category
|
|
94
|
+
GET /api/v1/authors/:id // author profile
|
|
95
|
+
GET /api/v1/search?q=... // full-text search
|
|
96
|
+
GET /api/v1/tags // all tags
|
|
97
|
+
GET /api/v1/feed.rss // RSS feed
|
|
98
|
+
|
|
99
|
+
// Query parameters for list endpoints:
|
|
100
|
+
// ?page=1&limit=20
|
|
101
|
+
// ?category=typescript
|
|
102
|
+
// ?tag=tutorial,beginner
|
|
103
|
+
// ?status=published (admin only)
|
|
104
|
+
// ?sort=published_at:desc // or views:desc, title:asc
|
|
105
|
+
// ?fields=id,title,slug,excerpt // field selection (reduces payload)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Response envelope pattern:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"data": {
|
|
113
|
+
"id": "uuid",
|
|
114
|
+
"title": "My Post",
|
|
115
|
+
"slug": "my-post",
|
|
116
|
+
"excerpt": "...",
|
|
117
|
+
"published_at": "2026-03-08T10:00:00Z",
|
|
118
|
+
"author": { "id": "uuid", "name": "Thierry", "avatar": "..." },
|
|
119
|
+
"categories": [{ "id": "uuid", "name": "TypeScript", "slug": "typescript" }],
|
|
120
|
+
"tags": ["tutorial", "beginner"],
|
|
121
|
+
"reading_time_minutes": 5
|
|
122
|
+
},
|
|
123
|
+
"meta": {}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// List response:
|
|
127
|
+
{
|
|
128
|
+
"data": [...],
|
|
129
|
+
"pagination": {
|
|
130
|
+
"total": 142,
|
|
131
|
+
"page": 1,
|
|
132
|
+
"limit": 20,
|
|
133
|
+
"pages": 8,
|
|
134
|
+
"next_cursor": "abc123"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Content Modeling
|
|
142
|
+
|
|
143
|
+
Design content types to be **channel-agnostic** — the same content should work on web, mobile, email, and voice without transformation.
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Content Type: Post
|
|
147
|
+
├── id (UUID)
|
|
148
|
+
├── title (string, required)
|
|
149
|
+
├── slug (string, unique, URL-safe)
|
|
150
|
+
├── excerpt (string, 150-300 chars — used as email preview, social meta)
|
|
151
|
+
├── body_json (TipTap/ProseMirror JSON — lossless, renderable anywhere)
|
|
152
|
+
├── body_html (string — cached render of body_json)
|
|
153
|
+
├── featured_image (object: { url, alt, width, height })
|
|
154
|
+
├── author (relationship → Author)
|
|
155
|
+
├── categories (relationship → Category[])
|
|
156
|
+
├── tags (string[])
|
|
157
|
+
├── status (enum: draft|in_review|scheduled|published|archived)
|
|
158
|
+
├── published_at (timestamp UTC)
|
|
159
|
+
├── scheduled_at (timestamp UTC)
|
|
160
|
+
├── seo_title (string — overrides title for <title> tag)
|
|
161
|
+
├── seo_description (string — overrides excerpt for <meta description>)
|
|
162
|
+
├── og_image (string — overrides featured_image for Open Graph)
|
|
163
|
+
├── reading_time_minutes (computed)
|
|
164
|
+
├── word_count (computed)
|
|
165
|
+
└── created_at, updated_at (timestamps)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Key principle:** Store content in the most flexible format (JSON), cache the rendered format (HTML). Compute derived fields (reading_time, word_count) on write, not on read.
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Cache Invalidation Strategy
|
|
173
|
+
|
|
174
|
+
The hardest problem in headless CMS. When content changes, cached pages must be invalidated.
|
|
175
|
+
|
|
176
|
+
### Strategy 1: Time-Based (ISR — Incremental Static Regeneration)
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
// Next.js page with ISR
|
|
180
|
+
export async function getStaticProps({ params }) {
|
|
181
|
+
const post = await fetch(`${process.env.CMS_API_URL}/posts/${params.slug}`).then(r => r.json());
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
props: { post },
|
|
185
|
+
revalidate: 60, // Regenerate this page at most once per 60 seconds
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Simple but stale up to `revalidate` seconds. Acceptable for blogs, not acceptable for breaking news.
|
|
191
|
+
|
|
192
|
+
### Strategy 2: On-Demand Revalidation (Webhook → Next.js)
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// CMS side: fire webhook when content is published/updated
|
|
196
|
+
async function notifyFrontend(contentId: string, slug: string, event: string) {
|
|
197
|
+
const webhookSecret = process.env.REVALIDATION_SECRET;
|
|
198
|
+
|
|
199
|
+
await fetch(`${process.env.FRONTEND_URL}/api/revalidate`, {
|
|
200
|
+
method: 'POST',
|
|
201
|
+
headers: {
|
|
202
|
+
'Content-Type': 'application/json',
|
|
203
|
+
'x-webhook-secret': webhookSecret,
|
|
204
|
+
},
|
|
205
|
+
body: JSON.stringify({ contentId, slug, event }),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Next.js side: /api/revalidate route
|
|
210
|
+
// app/api/revalidate/route.ts
|
|
211
|
+
import { revalidatePath, revalidateTag } from 'next/cache';
|
|
212
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
213
|
+
|
|
214
|
+
export async function POST(request: NextRequest) {
|
|
215
|
+
const secret = request.headers.get('x-webhook-secret');
|
|
216
|
+
|
|
217
|
+
if (secret !== process.env.REVALIDATION_SECRET) {
|
|
218
|
+
return NextResponse.json({ error: 'Invalid secret' }, { status: 401 });
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const { slug, event } = await request.json();
|
|
222
|
+
|
|
223
|
+
// Revalidate specific paths
|
|
224
|
+
revalidatePath(`/posts/${slug}`);
|
|
225
|
+
revalidatePath('/posts'); // index page
|
|
226
|
+
revalidatePath('/'); // home page (if it shows recent posts)
|
|
227
|
+
revalidateTag('posts'); // all pages tagged "posts"
|
|
228
|
+
|
|
229
|
+
return NextResponse.json({
|
|
230
|
+
revalidated: true,
|
|
231
|
+
now: Date.now(),
|
|
232
|
+
slug,
|
|
233
|
+
event,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Strategy 3: CDN Purge (Cloudflare/Fastly)
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// Purge specific URLs from Cloudflare cache on publish
|
|
242
|
+
async function purgeCloudflareCache(urls: string[]): Promise<void> {
|
|
243
|
+
const response = await fetch(
|
|
244
|
+
`https://api.cloudflare.com/client/v4/zones/${process.env.CF_ZONE_ID}/purge_cache`,
|
|
245
|
+
{
|
|
246
|
+
method: 'POST',
|
|
247
|
+
headers: {
|
|
248
|
+
'Authorization': `Bearer ${process.env.CF_API_TOKEN}`,
|
|
249
|
+
'Content-Type': 'application/json',
|
|
250
|
+
},
|
|
251
|
+
body: JSON.stringify({ files: urls }),
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
if (!response.ok) {
|
|
256
|
+
throw new Error(`Cloudflare purge failed: ${response.statusText}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Call this in the onPublishSuccess callback:
|
|
261
|
+
onPublishSuccess: async (id, title) => {
|
|
262
|
+
const { rows } = await db.query('SELECT slug FROM content WHERE id = $1', [id]);
|
|
263
|
+
if (rows[0]?.slug) {
|
|
264
|
+
await purgeCloudflareCache([
|
|
265
|
+
`https://yourdomain.com/posts/${rows[0].slug}`,
|
|
266
|
+
`https://yourdomain.com/posts`,
|
|
267
|
+
`https://yourdomain.com/`,
|
|
268
|
+
]);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Webhook Pattern: CMS → Frontend
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// lib/webhooks.ts
|
|
279
|
+
|
|
280
|
+
interface WebhookEvent {
|
|
281
|
+
event: 'content.published' | 'content.updated' | 'content.archived' | 'content.scheduled';
|
|
282
|
+
contentId: string;
|
|
283
|
+
contentType: string;
|
|
284
|
+
slug?: string;
|
|
285
|
+
timestamp: string;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
async function fireWebhooks(event: WebhookEvent): Promise<void> {
|
|
289
|
+
const webhooks = await db.query(
|
|
290
|
+
"SELECT url, secret FROM webhooks WHERE events @> ARRAY[$1]::text[] AND active = true",
|
|
291
|
+
[event.event]
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
const payload = JSON.stringify(event);
|
|
295
|
+
const timestamp = Date.now().toString();
|
|
296
|
+
|
|
297
|
+
await Promise.allSettled(
|
|
298
|
+
webhooks.rows.map(async (webhook) => {
|
|
299
|
+
const signature = createHmacSignature(payload, webhook.secret, timestamp);
|
|
300
|
+
|
|
301
|
+
try {
|
|
302
|
+
const res = await fetch(webhook.url, {
|
|
303
|
+
method: 'POST',
|
|
304
|
+
headers: {
|
|
305
|
+
'Content-Type': 'application/json',
|
|
306
|
+
'X-Webhook-Signature': signature,
|
|
307
|
+
'X-Webhook-Timestamp': timestamp,
|
|
308
|
+
},
|
|
309
|
+
body: payload,
|
|
310
|
+
signal: AbortSignal.timeout(10_000), // 10s timeout
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
if (!res.ok) {
|
|
314
|
+
console.error(`Webhook ${webhook.url} responded ${res.status}`);
|
|
315
|
+
}
|
|
316
|
+
} catch (err) {
|
|
317
|
+
console.error(`Webhook delivery failed to ${webhook.url}:`, err);
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
import { createHmac } from 'crypto';
|
|
324
|
+
|
|
325
|
+
function createHmacSignature(payload: string, secret: string, timestamp: string): string {
|
|
326
|
+
return createHmac('sha256', secret)
|
|
327
|
+
.update(`${timestamp}.${payload}`)
|
|
328
|
+
.digest('hex');
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Multi-Channel Delivery
|
|
335
|
+
|
|
336
|
+
Same content, different rendering:
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// Each channel gets what it needs from the same API response
|
|
340
|
+
|
|
341
|
+
// WEB: Full HTML rendering via TipTap generateHTML
|
|
342
|
+
import { generateHTML } from '@tiptap/html';
|
|
343
|
+
|
|
344
|
+
const webContent = generateHTML(post.body_json, extensions);
|
|
345
|
+
|
|
346
|
+
// EMAIL: Strip complex blocks, inline styles, simplify for email clients
|
|
347
|
+
function contentToEmailHtml(bodyJson: object): string {
|
|
348
|
+
// Use a simplified extension set for email compatibility
|
|
349
|
+
return generateHTML(bodyJson, [StarterKit, Link]);
|
|
350
|
+
// Then run through an email CSS inliner (juice npm package)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// MOBILE (React Native): Pass JSON, render natively
|
|
354
|
+
// The mobile app receives body_json and renders each node type
|
|
355
|
+
// with its own native components (no HTML string needed)
|
|
356
|
+
|
|
357
|
+
// RSS: Use excerpt or truncated body as text
|
|
358
|
+
const rssDescription = post.excerpt || post.body_html?.slice(0, 500);
|
|
359
|
+
|
|
360
|
+
// VOICE (text-to-speech): Extract plain text
|
|
361
|
+
function contentToPlainText(bodyJson: object): string {
|
|
362
|
+
return editor.getText(); // or walk the JSON tree
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// SOCIAL: Use og_image + excerpt + title
|
|
366
|
+
const socialPreview = {
|
|
367
|
+
title: post.seo_title ?? post.title,
|
|
368
|
+
description: post.seo_description ?? post.excerpt,
|
|
369
|
+
image: post.og_image ?? post.featured_image?.url,
|
|
370
|
+
};
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Next.js Integration Patterns
|
|
376
|
+
|
|
377
|
+
### Static Generation with ISR (blog posts)
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// app/posts/[slug]/page.tsx
|
|
381
|
+
import { Metadata } from 'next';
|
|
382
|
+
|
|
383
|
+
// Generate static params for all published posts (SSG)
|
|
384
|
+
export async function generateStaticParams() {
|
|
385
|
+
const res = await fetch(`${process.env.CMS_API_URL}/posts?fields=slug&limit=1000`);
|
|
386
|
+
const { data } = await res.json();
|
|
387
|
+
return data.map((post: { slug: string }) => ({ slug: post.slug }));
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Generate metadata for SEO
|
|
391
|
+
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
|
|
392
|
+
const post = await getPost(params.slug);
|
|
393
|
+
return {
|
|
394
|
+
title: post.seo_title ?? post.title,
|
|
395
|
+
description: post.seo_description ?? post.excerpt,
|
|
396
|
+
openGraph: { images: [post.og_image ?? post.featured_image?.url] },
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// Page component
|
|
401
|
+
export default async function PostPage({ params }: { params: { slug: string } }) {
|
|
402
|
+
const post = await getPost(params.slug);
|
|
403
|
+
return <PostTemplate post={post} />;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
async function getPost(slug: string) {
|
|
407
|
+
const res = await fetch(`${process.env.CMS_API_URL}/posts/${slug}`, {
|
|
408
|
+
next: { revalidate: 60, tags: ['posts', `post-${slug}`] }, // ISR + tag-based invalidation
|
|
409
|
+
});
|
|
410
|
+
if (!res.ok) throw new Error('Post not found');
|
|
411
|
+
const { data } = await res.json();
|
|
412
|
+
return data;
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Content Preview Mode (Drafts)
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
// app/api/preview/route.ts
|
|
420
|
+
// Enables preview mode so editors can see draft content
|
|
421
|
+
|
|
422
|
+
import { draftMode } from 'next/headers';
|
|
423
|
+
import { redirect } from 'next/navigation';
|
|
424
|
+
|
|
425
|
+
export async function GET(request: Request) {
|
|
426
|
+
const { searchParams } = new URL(request.url);
|
|
427
|
+
const secret = searchParams.get('secret');
|
|
428
|
+
const slug = searchParams.get('slug');
|
|
429
|
+
|
|
430
|
+
if (secret !== process.env.PREVIEW_SECRET || !slug) {
|
|
431
|
+
return new Response('Invalid preview request', { status: 401 });
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Enable Draft Mode — all fetch() calls will bypass ISR cache
|
|
435
|
+
draftMode().enable();
|
|
436
|
+
|
|
437
|
+
redirect(`/posts/${slug}`);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// In the post page, check for draft mode and fetch unpublished content:
|
|
441
|
+
import { draftMode } from 'next/headers';
|
|
442
|
+
|
|
443
|
+
export default async function PostPage({ params }) {
|
|
444
|
+
const { isEnabled: isDraft } = draftMode();
|
|
445
|
+
|
|
446
|
+
const url = isDraft
|
|
447
|
+
? `${process.env.CMS_API_URL}/posts/${params.slug}?status=any` // includes drafts
|
|
448
|
+
: `${process.env.CMS_API_URL}/posts/${params.slug}`; // published only
|
|
449
|
+
|
|
450
|
+
const res = await fetch(url, {
|
|
451
|
+
headers: isDraft ? { 'Authorization': `Bearer ${process.env.CMS_PREVIEW_TOKEN}` } : {},
|
|
452
|
+
cache: isDraft ? 'no-store' : 'default',
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
const { data: post } = await res.json();
|
|
456
|
+
return <PostTemplate post={post} isDraft={isDraft} />;
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## Self-Hosted vs SaaS Decision Guide
|
|
463
|
+
|
|
464
|
+
| Factor | Self-Hosted (Payload, Strapi, Directus) | SaaS (Contentful, Sanity, Storyblok) |
|
|
465
|
+
|--------|-----------------------------------------|---------------------------------------|
|
|
466
|
+
| Monthly cost | VPS cost only (~$10-40) | $0-300+ depending on plan |
|
|
467
|
+
| Data control | Full — your DB, your server | Vendor-controlled |
|
|
468
|
+
| Setup time | 1-4 hours | 15 minutes |
|
|
469
|
+
| Ops burden | You manage updates, backups | Vendor handles it |
|
|
470
|
+
| Scaling | You handle it | Auto-scales |
|
|
471
|
+
| Custom logic | Full access | API only (webhooks, plugins) |
|
|
472
|
+
| Best for | Products, sensitive data | Agencies, rapid launch |
|
|
473
|
+
|
|
474
|
+
**Rule:** If you're building a product (not an agency deliverable), self-host. You control the roadmap and data. If you need to launch in an afternoon for a client, use SaaS.
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## Common Gotchas
|
|
479
|
+
|
|
480
|
+
1. **The frontend is not part of the CMS** — headless means you choose your own frontend. The CMS provides data, not views. Don't let the CMS dictate your frontend stack.
|
|
481
|
+
2. **Cache invalidation is the hard part** — "there are only two hard things in CS..." The webhook → revalidate pattern is the right approach. Build it from day one, not as an afterthought.
|
|
482
|
+
3. **Content preview requires a special auth token** — your CMS API should have a preview token that bypasses the `status = 'published'` filter. Keep this token secret (server-side only, never expose to browser).
|
|
483
|
+
4. **Media assets need their own CDN** — don't serve images from your CMS API server. Upload to S3/R2 and serve via CDN. Add a `cdn_url` field to your media records.
|
|
484
|
+
5. **Reading time is not optional** — compute and store it on write. Every content platform's UI shows reading time, and computing it on every read is wasteful.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Headless CMS Stack Selection Guide
|
|
2
|
+
|
|
3
|
+
> Decision flowchart and comparison matrix for selecting the right headless CMS — Payload, Strapi, Directus, Sanity, Contentful, Ghost, and niche picks.
|
|
4
|
+
|
|
5
|
+
**When to use:** Starting a new content platform project and needing to choose a CMS, or evaluating a migration from one CMS to another.
|
|
6
|
+
**Stack:** Any — this is a technology selection guide, not stack-specific
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Decision Flowchart
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
START: What type of project is this?
|
|
14
|
+
│
|
|
15
|
+
├── "I'm building a Next.js / React app in TypeScript and want the CMS
|
|
16
|
+
│ embedded in my codebase — one deployment, one repo"
|
|
17
|
+
│ └── → PAYLOAD CMS ✓
|
|
18
|
+
│
|
|
19
|
+
├── "I need non-technical editors with a visual drag-drop interface
|
|
20
|
+
│ and block-based editing (no-code page builder style)"
|
|
21
|
+
│ ├── "Budget: $0-30/mo self-host is fine"
|
|
22
|
+
│ │ └── → STORYBLOK (free tier) or TINACMS (git-based)
|
|
23
|
+
│ └── "Budget: $50-200/mo SaaS is OK"
|
|
24
|
+
│ └── → STORYBLOK or BUILDER.IO
|
|
25
|
+
│
|
|
26
|
+
├── "I'm wrapping an existing database and don't want to recreate the schema"
|
|
27
|
+
│ └── → DIRECTUS ✓ (introspects your existing tables)
|
|
28
|
+
│
|
|
29
|
+
├── "I need a blog + newsletter + membership/paywall in one product"
|
|
30
|
+
│ └── → GHOST ✓ (see ghost-creator-monetization-pattern.md)
|
|
31
|
+
│
|
|
32
|
+
├── "My team needs Git-based content (Markdown files in repo, no DB)"
|
|
33
|
+
│ ├── Small team, Next.js
|
|
34
|
+
│ │ └── → KEYSTATIC or TINACMS
|
|
35
|
+
│ └── Any framework
|
|
36
|
+
│ └── → DECAP CMS (formerly Netlify CMS) or FRONT MATTER
|
|
37
|
+
│
|
|
38
|
+
├── "Enterprise: compliance, SSO, audit logs, SLA required"
|
|
39
|
+
│ └── → CONTENTSTACK or KONTENT.AI (Kentico)
|
|
40
|
+
│
|
|
41
|
+
├── "I want a mature ecosystem with plugins, and I'm comfortable with
|
|
42
|
+
│ JavaScript but not TypeScript-obsessed"
|
|
43
|
+
│ └── → STRAPI ✓
|
|
44
|
+
│
|
|
45
|
+
└── "I need a great content editing experience with real-time collaboration
|
|
46
|
+
│ and I'm OK paying $12-25/mo per user"
|
|
47
|
+
└── → SANITY ✓
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Comparison Matrix
|
|
53
|
+
|
|
54
|
+
| | Payload | Strapi | Directus | Sanity | Contentful | Ghost |
|
|
55
|
+
|--|---------|--------|----------|--------|------------|-------|
|
|
56
|
+
| **Self-hosted** | Yes | Yes | Yes | Optional | No | Yes |
|
|
57
|
+
| **Free tier (self-host)** | Yes | Yes | Yes | Yes* | Limited | Yes |
|
|
58
|
+
| **TypeScript-first** | Full | Partial | No | Partial | No | No |
|
|
59
|
+
| **Embeds in Next.js** | Yes (v3) | No | No | No | No | No |
|
|
60
|
+
| **GraphQL built-in** | Yes (auto) | Yes (plugin) | Yes | Yes | Yes | No |
|
|
61
|
+
| **REST API** | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
62
|
+
| **Visual block editor** | Basic | Basic | Basic | Excellent | Good | Good |
|
|
63
|
+
| **Real-time collab** | No | No | No | Yes | No | No |
|
|
64
|
+
| **Git-based content** | No | No | No | No | No | No |
|
|
65
|
+
| **Newsletter built-in** | No | No | No | No | No | Yes |
|
|
66
|
+
| **Membership/paywall** | No | No | No | No | No | Yes |
|
|
67
|
+
| **Plugin ecosystem** | Growing | Large | Medium | Large | Large | Large |
|
|
68
|
+
| **GitHub stars (2025)** | ~28K | ~60K | ~27K | ~12K | N/A | ~46K |
|
|
69
|
+
| **Self-host complexity** | Medium | Medium | Low | N/A | N/A | Medium |
|
|
70
|
+
| **DB options** | PG/SQLite/Mongo | PG/MySQL/SQLite | Any | Sanity's cloud | Contentful cloud | MySQL/SQLite |
|
|
71
|
+
|
|
72
|
+
*Sanity has a generous free tier (3 users, 10GB bandwidth)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Budget Tiers
|
|
77
|
+
|
|
78
|
+
### $0/month (Self-host on your existing infrastructure)
|
|
79
|
+
- **Payload** — unlimited, MIT license
|
|
80
|
+
- **Strapi** — Community edition, MIT license
|
|
81
|
+
- **Directus** — BSL license (free for non-competing products)
|
|
82
|
+
- **Ghost** — MIT license (self-host on a $5-10/mo VPS)
|
|
83
|
+
- **Keystatic** — free, git-based
|
|
84
|
+
- **TinaCMS** — free self-hosted
|
|
85
|
+
|
|
86
|
+
### $15-50/month
|
|
87
|
+
- **Ghost Pro Starter** — $15/mo, up to 500 members
|
|
88
|
+
- **Sanity Growth** — $15/mo + usage
|
|
89
|
+
- **Storyblok Starter** — $23/mo
|
|
90
|
+
- **Contentful Basic** — $300/mo (actually expensive at scale — start free, then steep)
|
|
91
|
+
|
|
92
|
+
### $100-400/month
|
|
93
|
+
- **Ghost Pro Creator** — $25/mo
|
|
94
|
+
- **Ghost Pro Team** — $50/mo
|
|
95
|
+
- **Sanity Team** — $15/user/mo
|
|
96
|
+
- **Storyblok Team** — $90/mo
|
|
97
|
+
- **Contentful** — $300+/mo for serious usage
|
|
98
|
+
|
|
99
|
+
### Enterprise ($500+/month)
|
|
100
|
+
- **Contentstack** — custom pricing
|
|
101
|
+
- **Kontent.ai** — custom pricing
|
|
102
|
+
- **Contentful** — custom pricing
|
|
103
|
+
- **Sanity Enterprise** — custom pricing
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Use Case Matching
|
|
108
|
+
|
|
109
|
+
| Use Case | Best Pick | Why |
|
|
110
|
+
|----------|-----------|-----|
|
|
111
|
+
| TypeScript Next.js product | Payload | Embedded, type-safe, Local API |
|
|
112
|
+
| Agency delivering to non-technical clients | Storyblok or Sanity | Best visual editing UX |
|
|
113
|
+
| Wrapping existing database | Directus | Introspects schema, no migration |
|
|
114
|
+
| Blog + newsletter + memberships | Ghost | Built-in, 0% platform fee |
|
|
115
|
+
| Enterprise compliance (SOC2, SSO, audit) | Contentstack or Kontent.ai | Enterprise-grade features |
|
|
116
|
+
| Git-based, no database | Keystatic or TinaCMS | Markdown in repo |
|
|
117
|
+
| Real-time collaborative editing | Sanity | Only major CMS with live collab |
|
|
118
|
+
| Plugin-heavy, large community | Strapi | 200+ plugins, 60K GitHub stars |
|
|
119
|
+
| Multi-language / i18n at scale | Contentful or Storyblok | Best i18n tooling |
|
|
120
|
+
| E-commerce content + commerce | Sanity | Excellent Shopify/commerce integrations |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Red Flags: When NOT to Pick Each Platform
|
|
125
|
+
|
|
126
|
+
**Payload**
|
|
127
|
+
- You need to support non-developer content editors who will configure fields via GUI (Payload's admin is for content entry, not schema management — schema is code)
|
|
128
|
+
- You're not using TypeScript or Next.js
|
|
129
|
+
- You need a proven plugin ecosystem on day one
|
|
130
|
+
|
|
131
|
+
**Strapi**
|
|
132
|
+
- You need TypeScript throughout (types are partial, not generated)
|
|
133
|
+
- You want to embed the CMS in your Next.js app (separate deployment required)
|
|
134
|
+
- You need real-time collaboration
|
|
135
|
+
|
|
136
|
+
**Directus**
|
|
137
|
+
- You're starting from scratch (no existing DB to wrap)
|
|
138
|
+
- You need deep TypeScript integration
|
|
139
|
+
- Your content model will change frequently (GUI-based schema changes can drift from code)
|
|
140
|
+
|
|
141
|
+
**Sanity**
|
|
142
|
+
- Budget is tight (per-seat pricing adds up fast for teams)
|
|
143
|
+
- You need self-hosted data sovereignty
|
|
144
|
+
- You want everything in one deployment
|
|
145
|
+
|
|
146
|
+
**Contentful**
|
|
147
|
+
- Budget under $300/mo for any serious usage
|
|
148
|
+
- You want self-hosting or data control
|
|
149
|
+
- Your team is TypeScript-heavy (tooling is OK but not TypeScript-first)
|
|
150
|
+
|
|
151
|
+
**Ghost**
|
|
152
|
+
- You need custom content types beyond blog posts/pages (Ghost's data model is opinionated)
|
|
153
|
+
- You need complex user roles and permissions
|
|
154
|
+
- You want to build a general-purpose CMS (Ghost is publishing-specific)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Migration Cost Matrix
|
|
159
|
+
|
|
160
|
+
Switching headless CMSes is painful. Here's a relative cost estimate:
|
|
161
|
+
|
|
162
|
+
| From | To | Cost |
|
|
163
|
+
|------|----|------|
|
|
164
|
+
| WordPress | Any headless | High — export content, reformat, rebuild frontend |
|
|
165
|
+
| Strapi | Payload | Medium — schema translation, hooks migration |
|
|
166
|
+
| Contentful | Sanity | Medium — export via API, remap schema |
|
|
167
|
+
| Contentful | Self-hosted | High — rebuild all integrations |
|
|
168
|
+
| Ghost (headless) | Payload | Low — Ghost Content API to Payload migration script exists |
|
|
169
|
+
| Directus | Any | Medium — DB is yours, but Directus-specific API calls need updating |
|
|
170
|
+
| Any | Ghost | High (if using memberships/newsletters) — member data migration is complex |
|
|
171
|
+
|
|
172
|
+
**Rule:** Budget 1-2 weeks of engineering time for any CMS migration. Test content rendering thoroughly before cutting over DNS.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Quick Decision Rules
|
|
177
|
+
|
|
178
|
+
1. **Building a product (not an agency site), Next.js, TypeScript?** → Payload. Full stop.
|
|
179
|
+
2. **Client needs to manage content without touching code?** → Strapi or Directus. Both have excellent admin UIs that non-developers can operate.
|
|
180
|
+
3. **"I need this live in a weekend"** → Strapi (most generators/scaffolding) or Sanity (best DX for rapid setup).
|
|
181
|
+
4. **"I'm writing a newsletter and want to monetize subscribers"** → Ghost. Nothing else comes close to the subscription + newsletter + 0% fee combination.
|
|
182
|
+
5. **"We have an existing PostgreSQL database and just need a GUI + API on top"** → Directus. It introspects and works with what you have.
|
|
183
|
+
6. **"Our legal team requires data never leaves our servers"** → Self-host Payload, Strapi, or Directus. Disqualifies all SaaS options.
|