A modern monorepo setup with Next.js frontend, Express backend, and shared packages.
nocena-app/
├── apps/
│ ├── frontend/ # Next.js 15.1.4 application
│ └── backend/ # Express API server
├── packages/
│ └── indexer/ # Shared package (@nocena/indexer)
├── package.json # Root package.json
├── pnpm-workspace.yaml # pnpm workspace configuration
└── turbo.json # Turborepo configuration
- Node.js >= 18.0.0
- pnpm >= 9.0.0
# Install pnpm if you haven't already
npm install -g pnpm
# Install all dependencies
pnpm installRun all apps in development mode:
pnpm devThis will start:
- Frontend: http://localhost:3000
- Backend: http://localhost:4000
# Run frontend only
cd apps/frontend
pnpm dev
# Run backend only
cd apps/backend
pnpm dev
# Build shared package
cd packages/indexer
pnpm buildA shared package that can be used across both frontend and backend.
Example usage:
import { greet, Indexer } from '@nocena/indexer';
console.log(greet('World')); // Hello, World! Welcome to Nocena.
const indexer = new Indexer();
indexer.add('item1');
console.log(indexer.count()); // 1pnpm dev- Start all apps in development modepnpm build- Build all apps and packagespnpm start- Start all apps in production modepnpm lint- Lint all apps and packagespnpm format- Format code with Prettier
pnpm dev- Start Next.js development serverpnpm build- Build for productionpnpm start- Start production serverpnpm lint- Run ESLint
pnpm dev- Start Express server with hot reloadpnpm build- Build TypeScript to JavaScriptpnpm start- Start production serverpnpm lint- Run ESLint
pnpm build- Build the packagepnpm dev- Build in watch modepnpm lint- Run ESLint
- Frontend: Next.js 15.1.4, React 19, TypeScript
- Backend: Express, TypeScript
- Monorepo Tools: pnpm workspaces, Turborepo
- Code Quality: ESLint, Prettier, TypeScript
To add a new shared package:
-
Create a new directory in
packages/:mkdir packages/my-package
-
Initialize with a
package.json:{ "name": "@nocena/my-package", "version": "1.0.0", "main": "./dist/index.js", "types": "./dist/index.d.ts" } -
Add it as a dependency in apps:
{ "dependencies": { "@nocena/my-package": "workspace:*" } } -
Run
pnpm installfrom root
The backend provides the following endpoints:
GET /api/health- Health checkGET /api/greet/:name- Greet with a name (uses @nocena/indexer)GET /api/status- Server status
MIT