← notes

The 12 Factor App

source

Created: 2025-11-15: Blind summary of the factors

Codebase

Dependencies

Config

I don't agree that the best solution are env vars but whatever, it is A solution

Backing Services

I think it is a bit misleading the "[...] without any changes to the app’s code" sentence. You could think code reuse and abstraction are king, and to some degree they may be, but without understanding the trade-offs, this can be very painful long-term.

To be clear, the example is fine, IF it is from MySQL to MySQL Aurora RDS. Someone may read this only knowing that Aurora RDS has a PostgreSQL version and think their code should handle both engines.

Build, release, run

If the build is attached to a commit in your version control system, and you have your dependencies explicitly defined in a manifesto, GENERATING a separate ID to identify the build seems redundant. Do use something to identify the build. I'm just saying it is not necessary to have a separate data store to know which build you are at.

Processes

Port binding

I don't like this, because the network is unreliable. Since this whole thing prefaces with "In the modern era, software is commonly delivered as a service: called web apps, or software-as-a-service." I think this whole "chapter" is binded to that context.

Concurrency

Great, but this may be interpreted as "if you need to scale, just spawn more processes". Since they should be stateless, you could have N processes in M machines. Thats ok, but make sure you dont have wasteful processes first. You could be unnecessarily wasting CPU or memory. and since it is easier to spawn a process in a separate machine, you keep the wasteful application running.

Disposability

Dev/prod parity

Logs

Admin processes