A modern, full-stack roadmap management application built with Next.js 16, featuring advanced routing patterns, server-side caching, and real-time data synchronization.
- ** Kanban Board**: Organize issues across four stages (Backlog, To Do, In Progress, Done)
- ** Authentication**: Secure user authentication powered by Better Auth
- ** Comments System**: Engage in discussions on each issue
- ** Like System**: Interactive voting system with optimistic updates
- ** Real-time Search**: Instant search with URL state management
- ** Responsive Design**: Mobile-first design with Tailwind CSS
- ** Performance Optimized**: Server-side caching and React Query for data fetching
The application uses parallel routes (@modal) to render the issue modal alongside the main board content, enabling:
- Non-blocking UI updates
- Independent loading states
- Better user experience with modal overlays
Intercepting routes ((.)issues/[id]) provide:
- Modal view when clicking issues from the board
- Full page view when accessing URLs directly
- Seamless navigation between contexts
Leverages Next.js 16's 'use cache' directive for:
- Automatic request memoization
- Reduced database queries
- Faster page loads
- Optimized Open Graph image generation
- Server-side data fetching by default
- Reduced client-side JavaScript
- Improved SEO and initial load performance
- Next.js 16 - React framework with App Router
- React 19 - Latest React with concurrent features
- TypeScript - Type-safe development
- Tailwind CSS 4 - Utility-first styling
- Radix UI - Accessible UI components
- Lucide React - Beautiful icon library
- TanStack Query (React Query) - Powerful data synchronization
- Automatic caching
- Background refetching
- Optimistic updates
- Query invalidation
- React Hook Form - Performant form management
- nuqs - Type-safe URL search params
- Hono - Ultrafast web framework
- Hono OpenAPI - Type-safe API with OpenAPI
- Scalar - Beautiful API documentation
- Better Auth - Modern authentication solution
- Drizzle ORM - Type-safe SQL ORM
- PostgreSQL - Robust database
- Zod - Schema validation
- Biome - Fast linter and formatter
- TypeScript - Static type checking
- Drizzle Kit - Database migrations
- Docker - Containerized PostgreSQL
- Node.js 20+
- pnpm (recommended) or npm
- Docker (for local database)
git clone https://github.com/iDouglasD/roadmap-board.git
cd roadmap-boardpnpm installCopy the example environment file:
cp env-example .env.localUpdate the .env.local file with your configuration:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/roadmap"
# App
NEXT_PUBLIC_API_URL="http://localhost:3000"
# Auth (Better Auth)
BETTER_AUTH_SECRET="your-secret-key"
BETTER_AUTH_URL="http://localhost:3000"docker-compose up -dpnpm db:pushpnpm db:seedpnpm devOpen http://localhost:3000 in your browser.
| Command | Description |
|---|---|
pnpm dev |
Start development server |
pnpm build |
Build for production |
pnpm start |
Start production server |
pnpm lint |
Run Biome linter |
pnpm format |
Format code with Biome |
pnpm db:generate |
Generate Drizzle migrations |
pnpm db:migrate |
Run database migrations |
pnpm db:push |
Push schema changes to database |
pnpm db:studio |
Open Drizzle Studio |
pnpm db:seed |
Seed database with fake data |
roadmap-board/
βββ src/
β βββ api/ # Backend API (Hono)
β β βββ auth.ts # Better Auth configuration
β β βββ db/ # Database schema and migrations
β β βββ middlewares/ # API middlewares
β β βββ routes/ # API endpoints
β βββ app/ # Next.js App Router
β β βββ (board)/ # Board route group
β β βββ @modal/ # Parallel route for modals
β β βββ api/ # API route handlers
β β βββ issues/ # Issue detail pages
β βββ components/ # Reusable React components
β βββ http/ # Frontend API client
β βββ lib/ # Shared utilities
β βββ utils/ # Helper functions
βββ docker-compose.yml # PostgreSQL container
βββ drizzle.config.ts # Drizzle ORM configuration
βββ package.json # Project dependencies
// Automatic caching and background refetching
const { data, isPending } = useQuery({
queryKey: ['issues', issueId],
queryFn: () => getIssue({ issueId }),
});
// Optimistic updates for likes
const mutation = useMutation({
mutationFn: toggleLike,
onMutate: async () => {
// Optimistically update UI
},
onSettled: () => {
// Invalidate and refetch
queryClient.invalidateQueries(['issue-likes']);
},
});export async function getIssue({ issueId }: GetIssueParams) {
'use cache'; // Automatic request memoization
const response = await fetch(url);
return response.json();
}app/
βββ @modal/
β βββ (.)issues/[id]/page.tsx # Modal view (intercepted)
βββ issues/
βββ [id]/page.tsx # Full page view (direct)
const route = createRoute({
method: 'get',
path: '/issues/{id}',
request: {
params: z.object({ id: z.string() }),
},
responses: {
200: {
content: {
'application/json': { schema: IssueResponseSchema },
},
},
},
});Built with Better Auth, providing:
- Email/Password authentication
- Session management
- Protected routes
- Server and client hooks
- Automatic token refresh
The project includes a Docker Compose configuration for PostgreSQL:
services:
postgres:
image: postgres:17-alpine
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: docker
POSTGRES_DB: roadmapKey tables:
- users: User accounts and profiles
- sessions: Authentication sessions
- issues: Roadmap issues/tasks
- comments: Issue comments
- issue_likes: User likes on issues
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Next.js
- Styled with Tailwind CSS
- Icons from Lucide
- UI components from Radix UI