A full-stack web application with file management, todo list, AI chat, and subscription features.
The application uses Replit Auth for authentication (migrated from Firebase Auth on January 4, 2026). Authentication is session-based using cookies and OpenID Connect.
server/replit_integrations/auth/replitAuth.ts- Replit Auth setup with passport.jsserver/replit_integrations/auth/storage.ts- User upsert logic for authserver/middleware/auth.ts-isAuthenticatedmiddleware andgetUserIdhelperclient/src/hooks/use-auth.ts- React hook for auth state
- User clicks "Sign in with Replit" button
- Browser redirects to
/api/login - Replit Auth handles authentication via OpenID Connect
- On success, redirects to
/api/callback - Session is created and stored in PostgreSQL
sessionstable - User data is upserted into
userstable
- Sessions stored in PostgreSQL using
connect-pg-simple - Session TTL: 7 days
- Cookies: httpOnly, secure
PostgreSQL database with Drizzle ORM.
users- User profiles (id is Replit user ID)sessions- Session storage for authenticationitems- Todo itemsfiles- File metadatathreads- AI chat threadsmessages- AI chat messages
npm run db:push- Push schema changes to databasenpm run db:studio- Open Drizzle Studio
client/ # React frontend (Vite)
├── src/
│ ├── components/ # UI components
│ ├── hooks/ # Custom React hooks
│ ├── pages/ # Page components
│ └── lib/ # Utility libraries
server/ # Express backend
├── routes/ # API route handlers
├── middleware/ # Express middleware
├── storage/ # Data access layer
├── replit_integrations/ # Replit-specific integrations
└── lib/ # Utility libraries
shared/ # Shared code between client/server
└── schema.ts # Database schema (Drizzle)
GET /api/login- Initiate Replit Auth loginGET /api/callback- OAuth callbackGET /api/logout- End sessionGET /api/user- Get current user session
GET /api/users/profile- Get user profilePATCH /api/users/profile- Update user profile
GET /api/items- List user's itemsPOST /api/items- Create itemDELETE /api/items/:id- Delete item
GET /api/files- List user's filesPOST /api/files/upload- Upload fileGET /api/files/:id/download- Download fileDELETE /api/files/:id- Delete file
POST /api/ai/chat- Chat with AI (streaming)GET /api/ai/status- Check AI service statusGET /api/ai/threads- List chat threadsPOST /api/ai/threads- Create threadGET /api/ai/threads/:threadId/messages- Get thread messages
POST /api/create-checkout-session- Start Stripe checkoutPOST /api/create-portal-session- Open billing portalPOST /api/webhook- Stripe webhook handler
npm run devDATABASE_URL- PostgreSQL connection stringSESSION_SECRET- Session encryption keyREPL_ID- Replit App ID (auto-set by Replit)ISSUER_URL- Replit OIDC issuer (defaults to https://replit.com/oidc)OPENAI_API_KEY- OpenAI API key for AI featuresSTRIPE_SECRET_KEY- Stripe API keySTRIPE_WEBHOOK_SECRET- Stripe webhook secretSTRIPE_PRICE_ID_PRO- Stripe price ID for Pro subscription
- Migrated from Firebase Auth to Replit Auth
- Changed user ID from
firebaseIdtoid(Replit user ID) - Added
sessionstable for server-side session storage - Removed Firebase dependencies from client
- Updated all routes to use session-based authentication
- Updated all client components to use
use-auth.tshook