Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

DamageLabs/kandan

Kandan is an Open Source Alternative to HipChat

DamageLabs/kandan.json
{
"createdAt": "2013-01-24T19:24:05Z",
"defaultBranch": "main",
"description": "Kandan is an Open Source Alternative to HipChat",
"fullName": "DamageLabs/kandan",
"homepage": "",
"language": "TypeScript",
"name": "kandan",
"pushedAt": "2026-04-06T02:21:12Z",
"stargazersCount": 2685,
"topics": [],
"updatedAt": "2026-07-11T20:35:25Z",
"url": "https://github.com/DamageLabs/kandan"
}

Modern revival of Kandan — a self-hosted open-source team chat app. Built on Angular 21 + Express/Node/TypeScript with real-time messaging via Socket.io.

Status: Early development. Backend scaffolded, Angular client coming next.

LayerTechnology
FrontendAngular 21 + TailwindCSS
BackendExpress 5 + TypeScript
DatabaseSQLite via Drizzle ORM
Real-timeSocket.io
AuthJWT + bcrypt
  • Real-time messaging via WebSockets
  • Multiple channels
  • User authentication (register/login/JWT)
  • Admin controls (user approval, suspension, channel management)
  • File attachments
  • /me emote commands
  • Typing indicators
  • Message history with pagination
  • Dark/light mode
Terminal window
git clone git@github.com:DamageLabs/kandan-core.git
cd kandan-core
# Server
cd server
cp ../.env.example .env # edit as needed
npm install
npm run dev # http://localhost:3200
EndpointMethodDescription
/api/v1/auth/registerPOSTRegister new user
/api/v1/auth/loginPOSTLogin, returns JWT
/api/v1/auth/meGETCurrent user
/api/v1/channelsGETList channels
/api/v1/channels/:idGETChannel + recent messages
/api/v1/channelsPOSTCreate channel (admin)
/api/v1/messages/channel/:idGETPaginated message history
/api/v1/usersGETList users (admin)
EventDirectionDescription
channel:joinclient → serverJoin a channel room
channel:leaveclient → serverLeave a channel room
message:sendclient → serverSend a message
message:newserver → clientNew message broadcast
typing:startclient → serverUser started typing
typing:stopclient → serverUser stopped typing
user:connectedserver → clientUser joined channel
user:disconnectedserver → clientUser left channel

MIT