A modern team task manager with real-time Kanban boards β built for teams that ship and collaborators who stay in sync.
Hudo lets teams organize work in workspaces, boards, lists, and cards β with drag-and-drop ordering and live updates across every connected client. Sign in with GitHub or Google via Auth.js, with database-backed sessions so every API route and board action stays protected. The UI is fast, clean, and built around real collaboration flows.
| Landing Page | Dashboard |
|---|---|
![]() |
![]() |
| Workspace | Kanban Board |
|---|---|
![]() |
![]() |
π Live Demo: hudo.vercel.app
β‘ Socket Server: hudo-socket.onrender.com
- Features
- Tech Stack
- Getting Started
- Project Structure
- API Documentation
- Real-time Events
- Testing
- Deployment
- Contributing
- License
- Author
- OAuth sign-in with GitHub and Google via Auth.js v5 β database sessions with the Prisma adapter
- Workspaces with slug-based routing, descriptions, and owner management
- Invite teammates by email with role checks (
OWNERΒ·ADMINΒ·MEMBER) - Color-coded boards inside each workspace
- Lists and cards with full CRUD and inline editing
- Drag-and-drop card reordering and cross-list moves via
@dnd-kit - Real-time sync across clients with a standalone Socket.io server and board-scoped rooms
- Zod validation on REST API routes and socket event payloads
- Activity logging model for workspace audit trails (schema-ready)
- Responsive UI with Tailwind CSS 4 and shadcn/ui components
| Area | Technologies |
|---|---|
| Framework | Next.js 16.2.6 (App Router), React 19.2.4, TypeScript 5 |
| Auth | Auth.js v5 (NextAuth), @auth/prisma-adapter, GitHub + Google OAuth |
| Database | PostgreSQL (Supabase) via Prisma 6.19.3 and @prisma/adapter-pg |
| Real-time | Socket.io 4.8.3 (standalone server/index.ts) |
| UI | Tailwind CSS 4, shadcn/ui, Radix UI, Lucide icons |
| Interactions | @dnd-kit (drag-and-drop), Sonner (toasts) |
| Validation | Zod 4 |
| DevOps | Vercel (app + API), Render (socket server), Supabase (database) |
- Git
- Node.js v20+
- PostgreSQL β local instance or Supabase project
- OAuth apps for GitHub and/or Google
1. Clone the repository
git clone git@github.com:Thryyve/hudo.git
cd hudo2. Install dependencies
npm install3. Configure environment
Create a .env file in the project root:
# Database (Supabase: use Transaction pooler + Direct connection)
DATABASE_URL="postgresql://..."
DIRECT_URL="postgresql://..."
# Auth.js
AUTH_SECRET="your_auth_secret_from_openssl_rand_base64_32"
GITHUB_CLIENT_ID="your_github_client_id"
GITHUB_CLIENT_SECRET="your_github_client_secret"
GOOGLE_CLIENT_ID="your_google_client_id"
GOOGLE_CLIENT_SECRET="your_google_client_secret"
# App URLs
NEXT_PUBLIC_APP_URL="http://localhost:3000"
NEXT_PUBLIC_SOCKET_URL="http://localhost:3001"4. Set up the database
npx prisma migrate dev5. Generate Prisma client (if needed)
npx prisma generate| Variable | Description | Example |
|---|---|---|
DATABASE_URL |
PostgreSQL connection (pooled) | postgresql://user:pass@host:6543/db?pgbouncer=true |
DIRECT_URL |
Direct PostgreSQL URL for migrations | postgresql://user:pass@host:5432/db |
AUTH_SECRET |
Auth.js encryption secret | openssl rand -base64 32 |
GITHUB_CLIENT_ID |
GitHub OAuth app client ID | β |
GITHUB_CLIENT_SECRET |
GitHub OAuth app secret | β |
GOOGLE_CLIENT_ID |
Google OAuth client ID | β |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | β |
NEXT_PUBLIC_APP_URL |
Public app URL (CORS + redirects) | http://localhost:3000 |
NEXT_PUBLIC_SOCKET_URL |
Socket.io server URL | http://localhost:3001 |
PORT |
Socket server port (production) | 3001 |
Run Next.js and the Socket.io server together:
npm run dev:allOr in separate terminals:
Terminal 1 β Next.js
npm run devTerminal 2 β Socket.io server
npm run socketOpen http://localhost:3000.
Production build
# Next.js
npm run build
npm run start # runs socket server via package.json "start" script
# For local production preview of the app only:
npx next startNote: In production, deploy the Next.js app on Vercel and the Socket.io server separately on Render. The
startscript runsserver/index.ts; host the Next.js app on Vercel (or similar) withnext build+ platform start command.
hudo/
βββ app/
β βββ (auth)/ # Sign-in flow
β β βββ sign-in/
β βββ (main)/ # Protected app shell
β β βββ dashboard/ # Workspace overview
β β βββ workspace/[workspaceId]/ # Boards in a workspace
β β βββ board/[boardId]/ # Kanban view + real-time sync
β βββ api/ # REST API routes
β βββ auth/[...nextauth]/ # Auth.js handlers
β βββ workspaces/ # Workspace CRUD + invites + members
β βββ boards/ # Board CRUD
β βββ lists/ # List CRUD
β βββ cards/ # Card CRUD + reorder
βββ components/
β βββ ui/ # shadcn/ui primitives
β βββ shared/ # Navbar, sidebar, layout
β βββ modules/ # Workspace, board, card features
βββ lib/
β βββ auth.ts # Auth.js + Prisma adapter config
β βββ db.ts # Prisma client singleton (pg pool)
β βββ validations/ # Zod schemas per domain
βββ server/
β βββ index.ts # Standalone Socket.io server
βββ prisma/
β βββ schema.prisma # Auth.js + app models
β βββ migrations/
βββ types/ # Shared TypeScript types
All JSON API routes require an authenticated session (Auth.js cookie) unless noted. Unauthorized requests return 401.
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/workspaces |
List workspaces for the signed-in user | β |
POST |
/api/workspaces |
Create a workspace (owner membership auto-created) | β |
GET |
/api/workspaces/:workspaceId |
Get workspace with boards | β |
POST |
/api/workspaces/:workspaceId/invite |
Invite member by email (OWNER / ADMIN only) |
β |
DELETE |
/api/workspaces/:workspaceId/members/:memberId |
Remove a workspace member | β |
POST |
/api/boards |
Create a board in a workspace | β |
GET |
/api/boards/:boardId |
Get board with lists and cards | β |
DELETE |
/api/boards/:boardId |
Delete a board | β |
POST |
/api/lists |
Create a list on a board | β |
PATCH |
/api/lists/:listId |
Update list title | β |
DELETE |
/api/lists/:listId |
Delete a list | β |
POST |
/api/cards |
Create a card in a list | β |
PATCH |
/api/cards/:cardId |
Update title, description, listId, or order |
β |
DELETE |
/api/cards/:cardId |
Delete a card | β |
Auth routes are handled by Auth.js at /api/auth/* (sign-in, sign-out, callbacks).
Workspace member roles: OWNER Β· ADMIN Β· MEMBER
Clients connect to the Socket.io server, join a board room, and broadcast changes to other viewers.
| Client β Server | Server β Room | Payload |
|---|---|---|
join-board |
β | boardId |
leave-board |
β | boardId |
card-created |
card-created |
{ boardId, listId, card } |
card-deleted |
card-deleted |
{ boardId, cardId, listId } |
card-moved |
card-moved |
{ boardId, cardId, listId, order } |
list-created |
list-created |
{ boardId, list } |
list-deleted |
list-deleted |
{ boardId, listId } |
Payloads are validated with Zod on the server. Sockets must be in the board room before broadcasting.
| Service | Purpose |
|---|---|
| Vercel | Next.js app + API routes |
| Render | Socket.io server (npm start β server/index.ts) |
| Supabase | PostgreSQL (DATABASE_URL + DIRECT_URL) |
Frontend β Vercel
- Import the repository and deploy with the default Next.js settings.
- Add environment variables:
DATABASE_URL,DIRECT_URL,AUTH_SECRET, OAuth credentials,NEXT_PUBLIC_APP_URL,NEXT_PUBLIC_SOCKET_URL. - Set OAuth callback URLs to
https://<your-domain>/api/auth/callback/github(and/google).
Socket server β Render
- Create a Web Service pointing at this repo.
- Build command:
npm install - Start command:
npm start(runsnpx tsx server/index.ts) - Set
PORT,NEXT_PUBLIC_APP_URL(your Vercel URL), and allow Vercel origins (built intoserver/index.ts).
Database β Supabase
- Create a project and copy the Transaction pooler URL β
DATABASE_URL. - Copy the Direct connection URL β
DIRECT_URL. - Run
npx prisma migrate deployagainst production.
Note: Renderβs free tier spins down after inactivity. The first WebSocket connection after idle may take ~30 seconds on cold start.
- Fork the repository
- Create a feature branch:
feat/<short-description> - Commit using Conventional Commits:
feat: add card due-date filters fix: sync cross-list drag on socket reconnect docs: improve deployment notes - Push your branch and open a Pull Request
Code style: ESLint via eslint-config-next β run npm run lint before submitting.
Distributed under the MIT License. See the project repository for details.
Made by Aayam Sinha



