App Router applications built the way the framework intends, by someone who ships them to production rather than to a preview URL.
Next.js rewards getting a few decisions right and punishes getting them wrong for the life of the project. Where state lives, what renders on the server, how data is cached and invalidated: these are not refactors you do later, they are the shape of the application.
I build App Router applications in TypeScript, on current versions rather than the patterns that were current two majors ago. This site runs Next.js 16 with React 19 and Tailwind CSS 4, including the parts most projects avoid: server components talking to a real database, streamed rendering, and a build that produces a standalone container.
Frontend work here is not decoration over somebody else’s API. It comes with the data layer attached, which is usually where the performance problems actually are.