The Twelve-Factor App methodology for building scalable, maintainable cloud-native applications. Use when designing backend services, APIs, microservices, or any software-as-a-service application...
Comprehensive methodology for building modern software-as-a-service applications that are portable, scalable, and maintainable. Contains 51 rules across 12 categories, covering the entire application lifecycle from codebase management to production operations.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Codebase & Version Control | CRITICAL | code- |
| 2 | Dependencies | CRITICAL | dep- |
| 3 | Configuration | CRITICAL | config- |
| 4 | Backing Services | HIGH | svc- |
| 5 | Build, Release, Run | HIGH | build- |
| 6 | Processes & State | HIGH | proc- |
| 7 | Concurrency & Scaling | HIGH | scale- |
| 8 | Disposability | HIGH | disp- |
| 9 | Port Binding | MEDIUM | port- |
| 10 | Dev/Prod Parity | MEDIUM | parity- |
| 11 | Logging | MEDIUM | log- |
| 12 | Admin Processes | MEDIUM | admin- |
code-single-codebase - Maintain one codebase per application in version controlcode-one-app-one-repo - Enforce one-to-one correlation between codebase and applicationcode-deploys-not-branches - Use deploys not branches to represent environmentscode-shared-as-libraries - Factor shared code into libraries managed by dependency managerdep-explicit-declaration - Declare all dependencies explicitly in a manifest filedep-isolate-execution - Isolate dependencies to prevent system package leakagedep-no-system-tools - Never rely on implicit system tools being availabledep-deterministic-builds - Use lockfiles for deterministic dependency resolutionconfig-separate-from-code - Strictly separate configuration from codeconfig-use-env-vars - Store configuration in environment variablesconfig-no-env-groups - Treat environment variables as granular controls not grouped environmentsconfig-validate-on-startup - Validate required configuration at application startupconfig-never-commit-secrets - Never commit secrets or credentials to version controlsvc-as-attached-resources - Treat backing services as attached resourcessvc-connection-strings - Reference all backing services via connection URLs in configsvc-no-local-vs-remote - Make no distinction between local and third-party servicessvc-detach-attach-without-code - Design services to be detachable and attachable without code changesbuild-separate-stages - Strictly separate build, release, and run stagesbuild-immutable-releases - Create immutable releases with unique identifiersbuild-no-runtime-changes - Never modify code at runtime - changes require new releasebuild-complexity-in-build - Push complexity into build stage keep run stage minimalbuild-artifact-per-commit - Generate one build artifact per commit deploy same artifact everywhereproc-stateless-processes - Execute the application as stateless processesproc-no-sticky-sessions - Never use sticky sessions - store session data in backing servicesproc-no-local-filesystem - Never assume local filesystem persists between requestsproc-compile-at-build - Perform asset compilation and bundling at build time not runtimeproc-share-nothing - Design processes to share nothing with each otherscale-process-model - Scale out via the process model with multiple process typesscale-process-types - Assign workloads to appropriate process typesscale-no-daemonize - Never daemonize or write PID files let process manager handle itscale-horizontal-not-vertical - Design for horizontal scaling over vertical scalingscale-process-formation - Define process formation as declarative configurationdisp-disposable-processes - Design processes to be disposable started or stopped at any momentdisp-fast-startup - Minimize startup time to enable rapid scaling and recoverydisp-graceful-shutdown - Implement graceful shutdown on SIGTERMdisp-crash-only - Design for crash-only software that recovers from sudden deathdisp-idempotent-operations - Make operations idempotent to safely retry after failuresport-self-contained - Make the application completely self-contained with embedded serverport-export-via-binding - Export services via port binding using PORT environment variableport-any-protocol - Use port binding to export any protocol not just HTTPparity-minimize-gaps - Minimize gaps between development and production environmentsparity-same-backing-services - Use the same type and version of backing services in all environmentsparity-deploy-frequently - Deploy frequently to minimize the time gapparity-developers-deploy - Involve developers in deployment to minimize personnel gaplog-event-streams - Treat logs as event streams not fileslog-no-routing - Never route or store logs from within the applicationlog-structured-format - Use structured logging for machine-readable event streamslog-unbuffered-stdout - Write logs unbuffered to stdout for real-time streamingadmin-one-off-processes - Run admin tasks as one-off processes not special scriptsadmin-same-environment - Run admin processes against a release with same codebase and configadmin-repl-access - Provide REPL access for debugging and data inspectionRead individual reference files for detailed explanations and code examples:
| File | Description |
|---|---|
| references/_sections.md | Category definitions and ordering |
| assets/templates/_template.md | Template for new rules |
| metadata.json | Version and reference information |