Read in: Français

How I Structure a Modern Full-Stack Project

A project's structure directly determines how smoothly it will evolve… or how painful it becomes.

I've worked on products that have grown for several years, but also on projects that became nearly impossible to maintain after just a few months. In most cases, the problem wasn't the technology used, but how the code was organized from the start.

Here's how I approach structuring a modern full-stack project, with one simple goal: keep it readable, scalable, and pleasant to work with over time.

Backend Organization

Rather than structuring code by technical layers (controllers, services, repositories, etc.), I organize the backend by business domains.

Concretely, this means each major feature or business concept has its own clearly identified space: users, billing, catalog, orders, authentication, etc.

Each domain groups together:

  • its business logic,
  • its data access,
  • its validation rules,
  • its APIs,
  • and its tests.

This approach offers several very concrete advantages:

  • you quickly understand what the system does by browsing the structure,
  • dependencies between features are visible and controlled,
  • changes are localized and less risky,
  • it becomes simpler to evolve or refactor one part without impacting everything else.

This is especially important in startups, where new features appear constantly and scope evolves rapidly.

Frontend Organization

On the frontend side, I make a very clear separation between:

  • interface logic (components, visual states, user interactions),
  • and business logic (rules, calculations, data transformations, orchestration).

The goal is twofold:

  • prevent critical business rules from being scattered across UI components,
  • allow the interface to evolve without questioning the core functioning of the application.

APIs are treated as real contracts.

This means:

  • clear schemas,
  • strict types,
  • explicit errors,
  • and stability over time.

When this boundary is well-defined, frontend and backend can evolve in parallel without blocking each other.

Common Practices

Structure alone isn't enough. Shared rules play an equally important role.

From day one, I establish:

  • consistent linting,
  • automatic formatting,
  • strict typing,
  • clear naming conventions,
  • and minimal code review rules.

This allows:

  • avoiding pointless debates about style,
  • reducing trivial errors,
  • making code homogeneous even with multiple developers,
  • and facilitating onboarding for new team members.

These choices may seem secondary at first, but they become critical once the project exceeds a few thousand lines.

Result

With this type of organization, projects remain:

  • readable,
  • predictable,
  • simpler to test,
  • and much easier to evolve.

Even after several years, you can still quickly understand:

  • where a feature is located,
  • how it works,
  • and what the consequences of a change will be.

For a startup, this represents a huge advantage: less technical debt, less wasted time, and the ability to iterate faster without fragilizing the product.

Structure doesn't do everything, but it creates a framework.

And in an environment where everything evolves quickly, that framework often makes the difference between a product that grows smoothly… and one that gradually becomes impossible to maintain.