Skip to main content

The four features

All domain code lives under src/features/. If you know the page you’re changing, this tells you which folder to open. Inside each one the layout is the same (components/, views/, hooks/, services/ and so on), so ls is faster than any list I could keep accurate here. The architecture guide explains what belongs in each subfolder.

Routes

Public

Requires a session

Guarded by src/middleware.ts, and excluded from indexing in src/app/robots.ts. The wizard runs across six steps under /projects/create: choose a method, import a repository, confirm it, describe the project, pick tech and categories, done. They share a layout that mounts the wizard’s Zustand store.

Things that catch people out

Project discovery lives on /. A link to /projects returns a 404. This surprises nearly everyone, because the detail route is /projects/<projectId>.
POST /api/feature-request forwards the feature-request form to a Discord webhook. Every other request goes to the external API. See the API Reference. There is no Next.js API layer proxying the backend.
/projects/create/<provider>/… accepts only github or gitlab. Anything else calls notFound().
/learn is driven by MDX files in content/learn/ and content/hands-on/ at the repository root, indexed by content/chapters.ts, not by a folder under src/features/. Chapters are prerendered, so adding one requires a rebuild. See Writing Learn content.
The only dynamic segments are [slug], [userId], [projectId] and [provider]. There are no route groups, parallel routes, or intercepting routes to reason about.

Beyond pages

src/app/ also holds the files that shape how the app is crawled and shared: sitemap.ts (static routes plus every trending published project), robots.ts, manifest.ts, and two dynamic Open Graph image routes for projects and profiles.

Next: development guide

Recipes for adding an API call, a mutation, a page, or a component.