I found something like this to be most flexible. /root ../src ../../client (entrypoint for client, rehydrates react tree/etc) ../../server (entrypoint for server, spins up db, express, etc) ../../blog .. /../ ../common (react components, graphql typedefs) .. /../ ../../components .. /../ ../../routes .. /../ ../server (graphql resolvers, other stuff that only runs on server) .. /../ ../../resolvers ../../user .. /../ ../common .. /../ ../../components .. /../ ../../routes .. /../ ../server (authentication logic, express middleware, gql resolvers for store, etc ) .. /../ ../client (browser cookie/local storage logic) ../../layout (sitewide react components, IE: PageHeader, NavBar, etc) ../../ui (reusable sitewide micro-components ie: Button, Modal) note: ./layout and ./ui don't have "server"/"common"/etc divisions because they purely in a single domain (common) so I just put their contents at the root instead of ./layout containing a single folder. Obviously it depends on the complexity of your site. But I find this allows me to seperate different aspects of the site (ie: a blog, and a user portal) and break them down into client/common/server. you probably end up with multiple folders named "client" or "common" in your tree but I think that's of minimal concern.