Cortis is a full-stack messaging website with a Vim-inspired visual style and normal web navigation.
The app includes:
- account creation with display name, username, and profile picture presets
- friend requests by username (not display name)
- direct messages and small group chats (max 10 members)
- server creation, server invites, and multi-channel messaging
- owner-controlled channel permissions (including owner-only posting)
- profile pages with Markdown bios (200 character limit)
- realtime updates with Socket.IO
- red ping badges when messages include @everyone
- Frontend: React + Vite
- Backend: Node.js + Express + Socket.IO
- Current storage: in-memory server state
- Optional persistence: MongoDB (not yet wired)
cortis/
client/ # React app (Vite)
server/ # Express + Socket.IO API
README.md
- Node.js 20+ recommended
- npm 10+ recommended
- Install client dependencies:
cd client
npm install- Install server dependencies:
cd ../server
npm install- Start the server:
npm run dev- In a new terminal, start the client:
cd ../client
npm run dev- Open the URL printed by Vite (usually http://localhost:5173).
Copy server/.env.example to server/.env and edit values as needed:
PORT=3001
CLIENT_ORIGIN=http://localhost:5173If your API runs on a different host/port, create client/.env.local:
VITE_API_URL=http://localhost:3001
VITE_SOCKET_URL=http://localhost:3001- npm run dev: start Vite dev server
- npm run build: production build
- npm run lint: lint React code
- npm run preview: preview production build
- npm run dev: start API with nodemon
- npm start: start API with Node
The server currently stores users, rooms, requests, and messages in memory.
- data resets whenever the server restarts
- great for local UI iteration and feature validation
- not suitable for production persistence
You do not need MongoDB to run this repo right now.
You will need MongoDB when you want persistent data across restarts or deployment.
Typical next steps:
- Provision MongoDB (local or Atlas)
- Add MONGODB_URI to server/.env
- Replace the in-memory state module in server/index.js with a database adapter
- This project currently has no real auth/password system
- Input validation and authorization are basic and demo-oriented
- Add proper auth, rate-limiting, persistent storage, and hardened validation before production use
No license file is currently included. Add one if you plan to publish or distribute.