Day 4 of Demolishing my Stack of Unfinished Projects: Secret Chat
Published on Aug 21st, 2025 🚀 Made some progress Welcome back to my "Demolishing My Stack of Unfinished Projects" series! This week, I'm excited to share the story of how I transformed a simple chat idea into a fully-featured, production-ready real-time messaging application called CodeniChat (formerly Secret Chat Bolt). 🎯 The Project That Started It All Secret Chat began as one of those "wouldn't it be cool if..." moments. I had this idea for a secure, real-time chat application that could handle multiple rooms, user invitations, and password resets. You know the drill - you start with enthusiasm, then life happens, and suddenly it's been months with just a README file and some half-baked code. But this week, I decided enough was enough. It was time to demolish this unfinished project and turn it into something I could actually be proud of. I started off with a short prompt into the bolt.new platform 🛠️ The Tech Stack That Made It Possible Frontend Next.js 15 - The latest and greatest React framework React 19 - Cutting-edge React with the new compiler TypeScript - Because type safety is not optional Tailwind CSS - For rapid, beautiful UI development shadcn/ui - Pre-built, accessible components Backend & Database Neon Database - Serverless PostgreSQL that scales with you Drizzle ORM - Type-safe database operations NextAuth.js - Secure authentication system Bcryptjs - Password hashing and security Real-time Features Server-Sent Events - For real-time message updates WebSocket-like functionality - Without the complexity 🚀 The Week-Long Development Sprint Day 1: Foundation & Database I started by setting up the database schema with Drizzle ORM. The beauty of using a modern ORM is that you can define your relationships once and let TypeScript handle the rest. // Core tables for the chat system export const users = pgTable ( " users " , { id : text ( " id " ). primaryKey (), email : text ( " email " ). notNull (). unique (), name : text ( " name " ). notNull (), password