A kernel, an index.php, a config folder with almost nothing in it. That is a Symfony 4 project on day one, and 4.0 came out today together with 3.4 LTS. The code changes are the smaller story. How a project starts is the bigger one.

The Standard Edition is gone. You start from the empty skeleton and ask for what you need. composer require orm pulls Doctrine, and the recipe writes the config files, registers the bundle in bundles.php, adds the variables to .env. You watch your own repo grow file by file as you add dependencies.

This inverts the old model. Standard Edition gave you everything and you deleted what you did not need, which in practice was never. Now you get nothing and add. A microservice stays a hundred lines of config. A monolith grows to exactly its own size.

About the magic, because recipes are magic: code from the internet edits your project at install time. My worry lasted until I looked at the result. A recipe runs once and leaves plain files in the repo, and after that Flex does not own them, you do. You read them, edit them, commit them. Magic that leaves a paper trail is the acceptable kind. The runtime kind, the one that does things on every request where you cannot see, is the one to fear.

Migration. 4.0 is 3.4 minus everything deprecated. Same features, same behavior. So the path is: upgrade to 3.4, turn on deprecation warnings, fix them until the log is silent, then 4.0 is a version bump in composer.json. Anyone planning a direct jump from 3.2 is planning a long weekend.

I have one project on 2.8. For that one I am not planning anything yet.