@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,674 @@
|
|
|
1
|
+
# Payload CMS Patterns
|
|
2
|
+
|
|
3
|
+
> Production patterns for Payload CMS v3: collections, access control, hooks, and deployment — the TypeScript-first embedded CMS for Next.js apps.
|
|
4
|
+
|
|
5
|
+
**When to use:** Building a content platform with Next.js where you want a CMS that's part of your codebase (not a separate service), with full TypeScript control over schema, access, and business logic.
|
|
6
|
+
**Stack:** Payload CMS v3, Next.js 14+ (App Router), PostgreSQL (with Payload's Postgres adapter), TypeScript
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What Makes Payload Different
|
|
11
|
+
|
|
12
|
+
| Feature | Payload | Strapi | Directus |
|
|
13
|
+
|---------|---------|--------|----------|
|
|
14
|
+
| Config style | TypeScript code | JSON/TypeScript | JSON/GUI |
|
|
15
|
+
| Embeds in Next.js | Yes (v3) | No | No |
|
|
16
|
+
| Type safety | Full (generated types) | Partial | No |
|
|
17
|
+
| Database | PostgreSQL, SQLite, MongoDB | PostgreSQL, MySQL, SQLite | Any DB |
|
|
18
|
+
| Admin UI | Built-in, customizable | Built-in | Built-in |
|
|
19
|
+
| Local API | Yes (no HTTP round-trip) | No | No |
|
|
20
|
+
| Lexical editor | Yes (v3) | No (custom) | No |
|
|
21
|
+
|
|
22
|
+
**Payload's killer feature:** The **Local API** — you can call `payload.find()`, `payload.create()`, etc. directly in your Next.js server components. No HTTP request. Blazing fast, fully typed.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Project Structure
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
my-app/
|
|
30
|
+
├── app/
|
|
31
|
+
│ ├── (app)/ # Your actual app routes
|
|
32
|
+
│ ├── (payload)/ # Payload admin UI routes (auto-generated)
|
|
33
|
+
│ │ ├── admin/
|
|
34
|
+
│ │ └── api/
|
|
35
|
+
│ ├── layout.tsx
|
|
36
|
+
│ └── page.tsx
|
|
37
|
+
├── payload.config.ts # Main Payload configuration
|
|
38
|
+
├── collections/
|
|
39
|
+
│ ├── Posts.ts
|
|
40
|
+
│ ├── Authors.ts
|
|
41
|
+
│ ├── Categories.ts
|
|
42
|
+
│ └── Media.ts
|
|
43
|
+
├── globals/
|
|
44
|
+
│ ├── Settings.ts
|
|
45
|
+
│ └── Navigation.ts
|
|
46
|
+
└── payload-types.ts # Auto-generated (run: npm run generate:types)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Payload Config
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// payload.config.ts
|
|
55
|
+
import { buildConfig } from 'payload';
|
|
56
|
+
import { postgresAdapter } from '@payloadcms/db-postgres';
|
|
57
|
+
import { lexicalEditor } from '@payloadcms/richtext-lexical';
|
|
58
|
+
import { nodemailerAdapter } from '@payloadcms/email-nodemailer';
|
|
59
|
+
import sharp from 'sharp';
|
|
60
|
+
|
|
61
|
+
import { Posts } from './collections/Posts';
|
|
62
|
+
import { Authors } from './collections/Authors';
|
|
63
|
+
import { Categories } from './collections/Categories';
|
|
64
|
+
import { Media } from './collections/Media';
|
|
65
|
+
import { Settings } from './globals/Settings';
|
|
66
|
+
|
|
67
|
+
export default buildConfig({
|
|
68
|
+
// Admin UI settings
|
|
69
|
+
admin: {
|
|
70
|
+
user: 'users',
|
|
71
|
+
meta: {
|
|
72
|
+
titleSuffix: '— My CMS',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
// Collections = content types (like database tables)
|
|
77
|
+
collections: [Posts, Authors, Categories, Media],
|
|
78
|
+
|
|
79
|
+
// Globals = single-instance settings
|
|
80
|
+
globals: [Settings],
|
|
81
|
+
|
|
82
|
+
// Database adapter
|
|
83
|
+
db: postgresAdapter({
|
|
84
|
+
pool: {
|
|
85
|
+
connectionString: process.env.DATABASE_URL,
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
|
|
89
|
+
// Rich text editor
|
|
90
|
+
editor: lexicalEditor({}),
|
|
91
|
+
|
|
92
|
+
// Media handling
|
|
93
|
+
sharp,
|
|
94
|
+
|
|
95
|
+
// Secret for JWTs
|
|
96
|
+
secret: process.env.PAYLOAD_SECRET!,
|
|
97
|
+
|
|
98
|
+
// TypeScript type generation
|
|
99
|
+
typescript: {
|
|
100
|
+
outputFile: 'payload-types.ts',
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
// Email (optional)
|
|
104
|
+
email: nodemailerAdapter({
|
|
105
|
+
defaultFromAddress: 'noreply@yourdomain.com',
|
|
106
|
+
defaultFromName: 'My CMS',
|
|
107
|
+
transportOptions: {
|
|
108
|
+
host: process.env.SMTP_HOST,
|
|
109
|
+
port: 587,
|
|
110
|
+
auth: {
|
|
111
|
+
user: process.env.SMTP_USER,
|
|
112
|
+
pass: process.env.SMTP_PASS,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Collection Definition: Posts
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// collections/Posts.ts
|
|
125
|
+
import type { CollectionConfig } from 'payload';
|
|
126
|
+
import { isEditor, isAdmin, isAuthorOrEditor } from '../access/roles';
|
|
127
|
+
|
|
128
|
+
export const Posts: CollectionConfig = {
|
|
129
|
+
slug: 'posts',
|
|
130
|
+
labels: {
|
|
131
|
+
singular: 'Post',
|
|
132
|
+
plural: 'Posts',
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
// Admin UI configuration
|
|
136
|
+
admin: {
|
|
137
|
+
useAsTitle: 'title',
|
|
138
|
+
defaultColumns: ['title', 'status', 'author', 'publishedAt'],
|
|
139
|
+
group: 'Content',
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// Access control — collection level
|
|
143
|
+
access: {
|
|
144
|
+
read: ({ req }) => req.user?.role === 'admin' || { status: { equals: 'published' } },
|
|
145
|
+
create: isAuthorOrEditor,
|
|
146
|
+
update: isAuthorOrEditor,
|
|
147
|
+
delete: isAdmin,
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
// Hooks — lifecycle callbacks
|
|
151
|
+
hooks: {
|
|
152
|
+
beforeChange: [setAuthorOnCreate, generateSlug, computeReadingTime],
|
|
153
|
+
afterChange: [invalidateCacheOnPublish],
|
|
154
|
+
beforeRead: [],
|
|
155
|
+
afterRead: [],
|
|
156
|
+
beforeDelete: [preventDeletingPublished],
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
// Timestamps (auto-managed)
|
|
160
|
+
timestamps: true,
|
|
161
|
+
|
|
162
|
+
// Fields = columns
|
|
163
|
+
fields: [
|
|
164
|
+
{
|
|
165
|
+
name: 'title',
|
|
166
|
+
type: 'text',
|
|
167
|
+
required: true,
|
|
168
|
+
admin: { description: 'The post title — used for SEO and display' },
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'slug',
|
|
172
|
+
type: 'text',
|
|
173
|
+
unique: true,
|
|
174
|
+
admin: {
|
|
175
|
+
position: 'sidebar',
|
|
176
|
+
description: 'URL-friendly identifier (auto-generated from title)',
|
|
177
|
+
},
|
|
178
|
+
hooks: {
|
|
179
|
+
beforeValidate: [({ value, data }) => value ?? slugify(data?.title ?? '')],
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: 'status',
|
|
184
|
+
type: 'select',
|
|
185
|
+
required: true,
|
|
186
|
+
defaultValue: 'draft',
|
|
187
|
+
options: [
|
|
188
|
+
{ label: 'Draft', value: 'draft' },
|
|
189
|
+
{ label: 'In Review', value: 'in_review' },
|
|
190
|
+
{ label: 'Scheduled', value: 'scheduled' },
|
|
191
|
+
{ label: 'Published', value: 'published' },
|
|
192
|
+
{ label: 'Archived', value: 'archived' },
|
|
193
|
+
],
|
|
194
|
+
admin: { position: 'sidebar' },
|
|
195
|
+
access: {
|
|
196
|
+
// Only editors and admins can change status
|
|
197
|
+
update: isEditor,
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: 'publishedAt',
|
|
202
|
+
type: 'date',
|
|
203
|
+
admin: {
|
|
204
|
+
position: 'sidebar',
|
|
205
|
+
date: { displayFormat: 'MMM d, yyyy h:mm a' },
|
|
206
|
+
condition: (data) => data.status === 'published' || data.status === 'scheduled',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'author',
|
|
211
|
+
type: 'relationship',
|
|
212
|
+
relationTo: 'users',
|
|
213
|
+
required: true,
|
|
214
|
+
admin: { position: 'sidebar' },
|
|
215
|
+
access: {
|
|
216
|
+
// Authors can't change their own author field
|
|
217
|
+
update: isEditor,
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: 'categories',
|
|
222
|
+
type: 'relationship',
|
|
223
|
+
relationTo: 'categories',
|
|
224
|
+
hasMany: true,
|
|
225
|
+
admin: { position: 'sidebar' },
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: 'tags',
|
|
229
|
+
type: 'array',
|
|
230
|
+
fields: [
|
|
231
|
+
{
|
|
232
|
+
name: 'tag',
|
|
233
|
+
type: 'text',
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: 'excerpt',
|
|
239
|
+
type: 'textarea',
|
|
240
|
+
admin: { description: 'Short summary (150-300 chars). Used for SEO meta and previews.' },
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
name: 'featuredImage',
|
|
244
|
+
type: 'upload',
|
|
245
|
+
relationTo: 'media',
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: 'content',
|
|
249
|
+
type: 'richText',
|
|
250
|
+
required: true,
|
|
251
|
+
// Uses Payload's Lexical editor by default
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
// SEO group
|
|
255
|
+
{
|
|
256
|
+
name: 'seo',
|
|
257
|
+
type: 'group',
|
|
258
|
+
admin: {
|
|
259
|
+
description: 'Search engine optimization fields. Defaults to title and excerpt.',
|
|
260
|
+
},
|
|
261
|
+
fields: [
|
|
262
|
+
{ name: 'title', type: 'text', admin: { description: 'Overrides post title for <title> tag' } },
|
|
263
|
+
{ name: 'description', type: 'textarea', admin: { description: 'Overrides excerpt for <meta description>' } },
|
|
264
|
+
{ name: 'ogImage', type: 'upload', relationTo: 'media' },
|
|
265
|
+
],
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
// Computed/readonly fields
|
|
269
|
+
{
|
|
270
|
+
name: 'readingTimeMinutes',
|
|
271
|
+
type: 'number',
|
|
272
|
+
admin: { position: 'sidebar', readOnly: true },
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
name: 'wordCount',
|
|
276
|
+
type: 'number',
|
|
277
|
+
admin: { readOnly: true },
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Field Types Reference
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
// All Payload field types and when to use them:
|
|
289
|
+
|
|
290
|
+
// Basic
|
|
291
|
+
{ type: 'text' } // short string, one line
|
|
292
|
+
{ type: 'textarea' } // multi-line text
|
|
293
|
+
{ type: 'number' } // integer or float
|
|
294
|
+
{ type: 'checkbox' } // boolean
|
|
295
|
+
{ type: 'date' } // date/time picker
|
|
296
|
+
{ type: 'email' } // validated email
|
|
297
|
+
{ type: 'code' } // code with syntax highlighting
|
|
298
|
+
{ type: 'json' } // raw JSON
|
|
299
|
+
|
|
300
|
+
// Choice
|
|
301
|
+
{ type: 'select', options: [...] } // single select
|
|
302
|
+
{ type: 'select', hasMany: true, options: [...] } // multi-select
|
|
303
|
+
{ type: 'radio', options: [...] } // radio buttons
|
|
304
|
+
|
|
305
|
+
// Rich content
|
|
306
|
+
{ type: 'richText' } // Lexical (v3) or Slate (v2) editor
|
|
307
|
+
{ type: 'upload', relationTo: 'media' } // file/image upload
|
|
308
|
+
|
|
309
|
+
// Relational
|
|
310
|
+
{ type: 'relationship', relationTo: 'posts' } // single relation
|
|
311
|
+
{ type: 'relationship', relationTo: 'posts', hasMany: true } // many relation
|
|
312
|
+
{ type: 'relationship', relationTo: ['posts', 'pages'] } // polymorphic
|
|
313
|
+
|
|
314
|
+
// Structural
|
|
315
|
+
{ type: 'group', fields: [...] } // inline group of fields
|
|
316
|
+
{ type: 'array', fields: [...] } // repeating group (like a table)
|
|
317
|
+
{ type: 'blocks', blocks: [...] } // flexible content blocks (Gutenberg-style)
|
|
318
|
+
{ type: 'tabs', tabs: [{ label, fields }] } // tabbed layout in admin
|
|
319
|
+
|
|
320
|
+
// Special
|
|
321
|
+
{ type: 'point' } // lat/lng coordinates
|
|
322
|
+
{ type: 'collapsible', fields: [...] } // collapsible section in admin
|
|
323
|
+
{ type: 'row', fields: [...] } // side-by-side fields in admin
|
|
324
|
+
{ type: 'ui' } // custom React component in admin (display only)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Access Control
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// access/roles.ts
|
|
333
|
+
import type { AccessArgs, FieldAccess } from 'payload';
|
|
334
|
+
|
|
335
|
+
type User = { id: string; role: 'admin' | 'editor' | 'author' | 'member' };
|
|
336
|
+
|
|
337
|
+
// Collection-level access functions
|
|
338
|
+
export const isAdmin = ({ req }: AccessArgs) =>
|
|
339
|
+
req.user?.role === 'admin';
|
|
340
|
+
|
|
341
|
+
export const isEditor = ({ req }: AccessArgs) =>
|
|
342
|
+
['admin', 'editor'].includes(req.user?.role);
|
|
343
|
+
|
|
344
|
+
export const isAuthorOrEditor = ({ req }: AccessArgs) =>
|
|
345
|
+
['admin', 'editor', 'author'].includes(req.user?.role);
|
|
346
|
+
|
|
347
|
+
// Return a Payload access filter to read only your own content
|
|
348
|
+
export const isOwnContent = ({ req }: AccessArgs) => {
|
|
349
|
+
if (!req.user) return false;
|
|
350
|
+
if (['admin', 'editor'].includes(req.user.role)) return true;
|
|
351
|
+
return { author: { equals: req.user.id } };
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// Field-level access — hide sensitive fields from non-admins
|
|
355
|
+
export const adminOnly: FieldAccess = ({ req }) =>
|
|
356
|
+
req.user?.role === 'admin';
|
|
357
|
+
|
|
358
|
+
// Example: hide the rejection_reason field from authors
|
|
359
|
+
{
|
|
360
|
+
name: 'rejectionReason',
|
|
361
|
+
type: 'textarea',
|
|
362
|
+
access: {
|
|
363
|
+
read: adminOnly,
|
|
364
|
+
update: adminOnly,
|
|
365
|
+
},
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Hooks: beforeChange, afterChange, beforeRead
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
// collections/hooks/post-hooks.ts
|
|
375
|
+
import type { CollectionBeforeChangeHook, CollectionAfterChangeHook } from 'payload';
|
|
376
|
+
|
|
377
|
+
// Set author on create (don't let API override it)
|
|
378
|
+
export const setAuthorOnCreate: CollectionBeforeChangeHook = ({ data, req, operation }) => {
|
|
379
|
+
if (operation === 'create' && req.user) {
|
|
380
|
+
return { ...data, author: req.user.id };
|
|
381
|
+
}
|
|
382
|
+
return data;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
// Auto-generate slug from title
|
|
386
|
+
export const generateSlug: CollectionBeforeChangeHook = ({ data }) => {
|
|
387
|
+
if (data.title && !data.slug) {
|
|
388
|
+
return {
|
|
389
|
+
...data,
|
|
390
|
+
slug: data.title
|
|
391
|
+
.toLowerCase()
|
|
392
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
393
|
+
.replace(/^-|-$/g, ''),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
return data;
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
// Compute reading time and word count before save
|
|
400
|
+
export const computeReadingTime: CollectionBeforeChangeHook = ({ data }) => {
|
|
401
|
+
if (data.content) {
|
|
402
|
+
// Extract plain text from Lexical JSON
|
|
403
|
+
const text = extractTextFromLexical(data.content);
|
|
404
|
+
const wordCount = text.split(/\s+/).filter(Boolean).length;
|
|
405
|
+
const readingTimeMinutes = Math.max(1, Math.ceil(wordCount / 200));
|
|
406
|
+
return { ...data, wordCount, readingTimeMinutes };
|
|
407
|
+
}
|
|
408
|
+
return data;
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// After publish: invalidate cache
|
|
412
|
+
export const invalidateCacheOnPublish: CollectionAfterChangeHook = async ({
|
|
413
|
+
doc,
|
|
414
|
+
previousDoc,
|
|
415
|
+
req,
|
|
416
|
+
}) => {
|
|
417
|
+
const justPublished =
|
|
418
|
+
doc.status === 'published' && previousDoc?.status !== 'published';
|
|
419
|
+
|
|
420
|
+
if (justPublished && doc.slug) {
|
|
421
|
+
// Fire webhook to Next.js revalidation endpoint
|
|
422
|
+
try {
|
|
423
|
+
await fetch(`${process.env.FRONTEND_URL}/api/revalidate`, {
|
|
424
|
+
method: 'POST',
|
|
425
|
+
headers: {
|
|
426
|
+
'Content-Type': 'application/json',
|
|
427
|
+
'x-webhook-secret': process.env.REVALIDATION_SECRET!,
|
|
428
|
+
},
|
|
429
|
+
body: JSON.stringify({ slug: doc.slug, event: 'content.published' }),
|
|
430
|
+
});
|
|
431
|
+
} catch (err) {
|
|
432
|
+
req.payload.logger.error(`Cache invalidation failed for ${doc.slug}: ${err}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
return doc;
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
// Prevent deletion of published posts
|
|
440
|
+
export const preventDeletingPublished: CollectionBeforeChangeHook = async ({
|
|
441
|
+
req,
|
|
442
|
+
id,
|
|
443
|
+
collection,
|
|
444
|
+
}) => {
|
|
445
|
+
const doc = await req.payload.findByID({ collection: 'posts', id });
|
|
446
|
+
if (doc?.status === 'published' && req.user?.role !== 'admin') {
|
|
447
|
+
throw new Error('Cannot delete a published post. Archive it first.');
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
// Helper: extract text from Lexical JSON
|
|
452
|
+
function extractTextFromLexical(lexicalJson: object): string {
|
|
453
|
+
const texts: string[] = [];
|
|
454
|
+
function walk(node: { text?: string; children?: object[] }) {
|
|
455
|
+
if (node.text) texts.push(node.text);
|
|
456
|
+
if (node.children) node.children.forEach(child => walk(child as typeof node));
|
|
457
|
+
}
|
|
458
|
+
walk(lexicalJson as { children?: object[] });
|
|
459
|
+
return texts.join(' ');
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Local API vs REST API vs GraphQL
|
|
466
|
+
|
|
467
|
+
```typescript
|
|
468
|
+
// Local API — use in Next.js server components, server actions, route handlers
|
|
469
|
+
// FASTEST: no HTTP round-trip, runs in same process
|
|
470
|
+
import { getPayload } from 'payload';
|
|
471
|
+
import config from '../payload.config';
|
|
472
|
+
|
|
473
|
+
const payload = await getPayload({ config });
|
|
474
|
+
|
|
475
|
+
// Find published posts
|
|
476
|
+
const { docs, totalDocs } = await payload.find({
|
|
477
|
+
collection: 'posts',
|
|
478
|
+
where: { status: { equals: 'published' } },
|
|
479
|
+
sort: '-publishedAt',
|
|
480
|
+
limit: 20,
|
|
481
|
+
depth: 2, // resolve relationships 2 levels deep
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// Find by slug
|
|
485
|
+
const post = await payload.find({
|
|
486
|
+
collection: 'posts',
|
|
487
|
+
where: { slug: { equals: 'my-post-slug' } },
|
|
488
|
+
limit: 1,
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
// Create a post
|
|
492
|
+
const newPost = await payload.create({
|
|
493
|
+
collection: 'posts',
|
|
494
|
+
data: {
|
|
495
|
+
title: 'My Post',
|
|
496
|
+
status: 'draft',
|
|
497
|
+
author: userId,
|
|
498
|
+
},
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
// Update a post
|
|
502
|
+
const updated = await payload.update({
|
|
503
|
+
collection: 'posts',
|
|
504
|
+
id: postId,
|
|
505
|
+
data: { status: 'published', publishedAt: new Date() },
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
// Delete
|
|
509
|
+
await payload.delete({ collection: 'posts', id: postId });
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
```typescript
|
|
513
|
+
// REST API — use from external clients, mobile apps, or when you can't use Local API
|
|
514
|
+
// Base URL: /api (configured in payload.config.ts)
|
|
515
|
+
|
|
516
|
+
GET /api/posts?where[status][equals]=published&sort=-publishedAt&limit=20
|
|
517
|
+
GET /api/posts?where[slug][equals]=my-post-slug&depth=2
|
|
518
|
+
POST /api/posts // create
|
|
519
|
+
PATCH /api/posts/:id // update
|
|
520
|
+
DELETE /api/posts/:id // delete
|
|
521
|
+
POST /api/users/login // auth
|
|
522
|
+
POST /api/users/logout
|
|
523
|
+
GET /api/users/me
|
|
524
|
+
|
|
525
|
+
// GraphQL — use when clients need flexible queries
|
|
526
|
+
// Available at: /api/graphql
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**Rule:** Use Local API for all server-side code in Next.js. Use REST API for external consumers, webhooks, and testing with curl. Use GraphQL only if you have a specific need for it (Payload's GraphQL is auto-generated from your collection config).
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## Deploying to Vercel with PostgreSQL
|
|
534
|
+
|
|
535
|
+
```typescript
|
|
536
|
+
// Deployment checklist:
|
|
537
|
+
|
|
538
|
+
// 1. Environment variables needed:
|
|
539
|
+
// DATABASE_URL=postgresql://...
|
|
540
|
+
// PAYLOAD_SECRET=<random-64-char-string>
|
|
541
|
+
// NEXT_PUBLIC_SERVER_URL=https://yourdomain.com
|
|
542
|
+
// REVALIDATION_SECRET=<random-string>
|
|
543
|
+
// SMTP_* (if using email)
|
|
544
|
+
|
|
545
|
+
// 2. vercel.json — optional, for region pinning:
|
|
546
|
+
{
|
|
547
|
+
"regions": ["iad1"], // match your Supabase/Neon region
|
|
548
|
+
"functions": {
|
|
549
|
+
"app/api/**": { "maxDuration": 30 }
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// 3. next.config.ts — required for Payload v3:
|
|
554
|
+
import { withPayload } from '@payloadcms/next/withPayload';
|
|
555
|
+
|
|
556
|
+
const nextConfig = {
|
|
557
|
+
// your config
|
|
558
|
+
};
|
|
559
|
+
|
|
560
|
+
export default withPayload(nextConfig);
|
|
561
|
+
|
|
562
|
+
// 4. Database migrations:
|
|
563
|
+
// payload migrate:create -- create a new migration
|
|
564
|
+
// payload migrate -- run pending migrations
|
|
565
|
+
// payload migrate:status -- check migration status
|
|
566
|
+
|
|
567
|
+
// In production (Vercel), add to build command:
|
|
568
|
+
// "build": "payload migrate && next build"
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
## Payload vs Strapi vs Directus: Decision Guide
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
Need TypeScript-first config (everything is code)?
|
|
577
|
+
→ Payload
|
|
578
|
+
|
|
579
|
+
Need mature plugin ecosystem (25,000+ GitHub stars, 200+ plugins)?
|
|
580
|
+
→ Strapi
|
|
581
|
+
|
|
582
|
+
Wrapping an existing database (want DB to stay the authority)?
|
|
583
|
+
→ Directus (it introspects your DB and builds the API around it)
|
|
584
|
+
|
|
585
|
+
Need to embed CMS directly inside Next.js app (same deployment)?
|
|
586
|
+
→ Payload (v3 is the ONLY major headless CMS that does this)
|
|
587
|
+
|
|
588
|
+
Team prefers GUI-based config over code?
|
|
589
|
+
→ Directus (fully GUI) or Strapi (GUI + code)
|
|
590
|
+
|
|
591
|
+
Need commercial support / enterprise SLA?
|
|
592
|
+
→ Strapi Enterprise or Directus Enterprise
|
|
593
|
+
|
|
594
|
+
Want to get started in 5 minutes with minimal config?
|
|
595
|
+
→ Strapi (more scaffolding, more generators)
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
## Migrating from Strapi to Payload: Schema Translation
|
|
601
|
+
|
|
602
|
+
```
|
|
603
|
+
Strapi concept → Payload equivalent
|
|
604
|
+
|
|
605
|
+
Content Type → Collection
|
|
606
|
+
Single Type → Global
|
|
607
|
+
Component → Array or Group field
|
|
608
|
+
Dynamic Zone → Blocks field
|
|
609
|
+
Relation → Relationship field
|
|
610
|
+
Media → Upload field (with Media collection)
|
|
611
|
+
Plugin → Custom collection + hooks + endpoints
|
|
612
|
+
Lifecycle hooks (beforeCreate, afterUpdate) → beforeChange, afterChange hooks
|
|
613
|
+
Policies → Access control functions
|
|
614
|
+
Routes → Payload custom endpoints or Next.js API routes
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
```typescript
|
|
618
|
+
// Strapi lifecycle hook:
|
|
619
|
+
module.exports = {
|
|
620
|
+
async beforeCreate(event) {
|
|
621
|
+
event.params.data.slug = slugify(event.params.data.title);
|
|
622
|
+
},
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
// Payload equivalent:
|
|
626
|
+
export const Posts: CollectionConfig = {
|
|
627
|
+
hooks: {
|
|
628
|
+
beforeChange: [
|
|
629
|
+
({ data }) => ({ ...data, slug: data.slug ?? slugify(data.title ?? '') }),
|
|
630
|
+
],
|
|
631
|
+
},
|
|
632
|
+
};
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## Lexical Rich Text Output Rendering in React
|
|
638
|
+
|
|
639
|
+
```tsx
|
|
640
|
+
// Payload v3 uses Lexical editor. To render in your frontend:
|
|
641
|
+
|
|
642
|
+
// Option 1: Use Payload's built-in React renderer
|
|
643
|
+
import { RichText } from '@payloadcms/richtext-lexical/react';
|
|
644
|
+
|
|
645
|
+
function PostContent({ content }: { content: object }) {
|
|
646
|
+
return (
|
|
647
|
+
<div className="prose prose-slate max-w-none">
|
|
648
|
+
<RichText content={content} />
|
|
649
|
+
</div>
|
|
650
|
+
);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Option 2: Generate HTML server-side (for email, RSS, etc.)
|
|
654
|
+
import { convertLexicalToHTML } from '@payloadcms/richtext-lexical/html';
|
|
655
|
+
|
|
656
|
+
const html = await convertLexicalToHTML({
|
|
657
|
+
converters: defaultHTMLConverters,
|
|
658
|
+
data: post.content,
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
// Option 3: For Next.js App Router (RSC-safe)
|
|
662
|
+
// Payload's RichText component works in server components in v3
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
667
|
+
## Common Gotchas
|
|
668
|
+
|
|
669
|
+
1. **`payload.config.ts` is NOT a regular module** — it's read at build time by Next.js. Don't import from it in client components. Always use the Local API in server components.
|
|
670
|
+
2. **`depth` parameter is expensive** — `depth: 2` resolves relationships 2 levels deep. For each level, Payload runs additional queries. Use only the depth you need.
|
|
671
|
+
3. **Migrations are required for PostgreSQL** — unlike MongoDB, schema changes require running `payload migrate`. Always run migrations before deploying schema changes.
|
|
672
|
+
4. **Admin UI at `/admin` conflicts with your own routes** — if you have an `/admin` route in your Next.js app, configure Payload's admin to use a different path: `admin: { buildPath: '/cms' }`.
|
|
673
|
+
5. **Generated types drift if you forget to regenerate** — run `npm run generate:types` after every collection schema change. Add it to your `prebuild` script to automate.
|
|
674
|
+
6. **Local API bypasses access control by default** — when using `payload.find()` server-side, pass `overrideAccess: false` if you need access control enforced. Default is `overrideAccess: true` (admin-level access).
|