Over-engineered. Overly complex. A full-stack todo app intentionally built as the most convoluted implementation imaginable. Uses React, Express, tRPC, and PostgreSQL.
- React 19
- TanStack Router - File-based routing
- TanStack Query - Server state management
- tRPC Client - Type-safe API calls
- Tailwind CSS 4 - Styling
- Radix UI - Accessible component primitives
- Lucide React - Icons
- Express 5 - HTTP server
- tRPC - Type-safe API layer
- Better Auth - Authentication system
- Drizzle ORM - Database toolkit
- PostgreSQL - Database
- TypeScript
- Vite (via Rolldown)
- pnpm - Package manager
- Drizzle Kit - Database migrations
- User authentication (sign up, sign in, sign out)
- Create, read, update, and delete tasks
- Mark tasks as pending or completed
- Search/filter tasks
- Keyboard shortcuts (Alt+T to create task, Escape to cancel)
- Responsive design with dark mode
- Node.js 18+
- pnpm 10+
- PostgreSQL database
Create a .env file in the root directory with the following variables:
DATABASE_URL=postgresql://username:password@localhost:5432/task_tracker
BETTER_AUTH_URL=http://localhost:8000
ALLOWED_ORIGINS=http://localhost:5173
PORT=8000
- Clone the repository:
git clone https://github.com/mhaadiabu/task-thing.git
cd task-thing- Install dependencies:
pnpm install- Set up the database:
pnpm db:pushpnpm db:generate- Generate migration files from schema changespnpm db:push- Push schema changes directly to the databasepnpm db:studio- Open Drizzle Studio to browse/edit data
Start the development server (runs both client and server concurrently):
pnpm devThis will start:
- Frontend dev server at
http://localhost:5173 - Backend server at
http://localhost:8000
To run them separately:
pnpm dev:client # Start Vite dev server
pnpm dev:server # Start Express server with hot reloadBuild the application:
pnpm buildStart the production server:
pnpm starttask-thing/
├── drizzle/ # Database migrations
├── public/ # Static assets
├── server/
│ ├── db/
│ │ ├── auth-schema.ts # Authentication tables
│ │ ├── task-schema.ts # Task table definition
│ │ ├── schema.ts # Combined schema exports
│ │ └── index.ts # Database connection
│ ├── index.ts # Express server entry point
│ └── trpc.ts # tRPC configuration
├── src/
│ ├── assets/ # Frontend assets
│ ├── components/ # React components
│ ├── context/ # React context providers
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilities and auth client
│ ├── routes/ # TanStack Router pages
│ └── utils/ # Helper functions and tRPC client
├── auth.ts # Better Auth configuration
├── drizzle.config.ts # Drizzle Kit configuration
└── vite.config.ts # Vite configuration
getTasks- Query tasks for a usercreateTask- Create a new taskeditTask- Update task contentupdateTask- Toggle task statusdeleteTask- Remove a task
GET /api/me- Get current authenticated user/api/auth/*- Better Auth endpoints (sign in, sign up, etc.)
MIT