Latest update · v0.23.3 releasedA production-grade, monorepo-first starter for
A production-grade, monorepo-first starter for 

newt-app gives you a Next.js frontend and a real NestJS backend, with auth and a database, curated so you're not deleting half of it on day one.
$npm create newt-app
Next.js
NestJS
Better Auth
database
testing
linter
shadcn/ui
extras
my-app/
apps
webNext.js frontend
app
dashboard
page.tsxtodo example
layout.tsx
page.tsxhome route
next.config.ts
apiNestJS backend
src
todos
todos.service.ts
app.module.ts
main.ts
packages
uishadcn/ui + 40 components
authBetter Auth configuration
dbKysely + Postgres
oxlint-configoxlint + oxfmt
typescript-configShared TypeScript config
$ npm create newt-app my-app -- --shadcn --testing vitest --database postgres --linter oxcapps/web/app/dashboard/page.tsx
import { Button } from '@my-app/ui/components/button';
import { cn } from '@my-app/ui/lib/utils';
import { auth } from '@my-app/auth';
import { headers } from 'next/headers';
export default async function Dashboard() {
const session = await auth.api.getSession({
headers: await headers(),
});
return (
<main className={cn('flex min-h-screen flex-col p-8')}>
<h1>Welcome back, {session?.user.name}</h1>
<Button variant="outline">Sign out</Button>
</main>
);
}Share code between apps, not copy it.
@my-app/ui and @my-app/auth are importable by name from day one, in both apps/web and apps/api.
No relative path climbing, no publishing to a registry, no manual workspace links.
A structure that can scale.
Inject NestJS services directly inside Next.js route handlers. Keep your business logic separate from your frontend, organized into modules and providers from day one.
Add services, swap implementations, or move to a standalone API when you're ready.
apps/web/app/api/todos/route.ts
import { NextResponse } from 'next/server';
import { inject } from '@/lib/nest';
import { TodosService } from '@my-app/api';
export async function GET() {
const todos = await inject(TodosService);
return NextResponse.json(todos.findAll());
}
export async function POST(req: Request) {
const { title } = await req.json();
const todos = await inject(TodosService);
return NextResponse.json(todos.create(title), { status: 201 });
}