← Back to the roundtable

Project Organization Per Project Type

1. The solution folder

the top of the tree: everything hangs off this one folder

Inside the solution folder sit six folders as siblings: none of them is nested inside another. That flatness is the whole point of an n-tier layout: every folder holds one job, and its name tells you what it is allowed to know about.

2. The Angular workspace

one folder per project: and the CLI decides what lives where

Angular's answer to "where does everything go?" is a workspace: a folder that holds the shared configuration, one root application, and (if you ever need them) more applications and libraries beside it. Almost every file at the top was written by the CLI, not by you. All of your code hides one level down, in src.

3. The React app

the same question, answered with a flat folder of files

A Vite + React project has no workspace file and nothing generated to hide behind. Everything that matters sits in src, and the HTML page is an ordinary file at the top of the project. Where Angular's entry point is TypeScript, React's is still HTML, and that single difference explains most of what follows.

4. The iOS app

a project file you rarely open, and a source folder even Xcode now treats as plain

An Xcode project is two things wearing one name: a build description you almost never edit by hand, and a folder of Swift. Since Xcode 16 that folder is a buildable folder: every file in it belongs to the target, so there is no file list to maintain and adding a file is just adding a file. There is no Info.plist in it either: Xcode synthesizes one from build settings unless you deliberately point INFOPLIST_FILE at a plist of your own.

5. The Android app

a module wrapped in build files, with Kotlin in a folder named java

An Android project is one app module surrounded by Gradle files. The Kotlin lives under a folder called java, the package name is a real folder chain, and the layout file that used to describe the screen is simply absent: a @Composable function draws it instead.