Skip to content

Latest commit

Β 

History

148 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Unison - Discord Clone

A full-featured Discord-like chat application with real-time messaging, voice calls, guilds, channels, and direct messaging.

πŸš€ Features

Core Features

  • User Authentication - Registration, login, JWT tokens, session management
  • Guilds (Servers) - Create, join, manage servers with invites
  • Channels - Text and voice channels with categories
  • Real-time Messaging - Instant message delivery via Ably
  • Voice Calls - WebRTC voice rooms powered by LiveKit
  • Direct Messages - Private 1:1 conversations with privacy controls
  • Friends System - Friend requests, blocking, friend lists
  • Roles & Permissions - Granular permission system with channel overwrites
  • Custom Emojis - Guild-specific emoji support
  • User Profiles - Customizable profiles with avatars, bios, backgrounds
  • Message Reactions - React to messages with emojis
  • GIF Support - Giphy integration for sending GIFs

Frontend Features

  • Responsive UI - Modern black/white themed interface
  • Voice Mini Player - Persistent voice call controls while browsing
  • Music Player - Background music playback
  • Emoji Picker - Built-in emoji selection
  • Profile Customization - Editable user profiles with cards
  • Notification Sounds - Audio alerts for new messages
  • Desktop App - Tauri-based native application

πŸ›  Technology Stack

Backend

Technology Purpose
Node.js Runtime environment
TypeScript Type-safe JavaScript
Express.js REST API framework
PostgreSQL Primary database (Neon)
Redis Caching layer
Ably Real-time messaging
LiveKit WebRTC voice/video
JWT Authentication tokens

Frontend

Technology Purpose
Svelte UI framework
Vite Build tool
TypeScript Type safety
Tauri Desktop app wrapper
LiveKit Client Voice call SDK
Ably SDK Real-time messaging

Infrastructure

Technology Purpose
Docker Containerization
Railway Deployment platform
Neon Serverless PostgreSQL
Upstash Serverless Redis

πŸ“ Project Structure

β”œβ”€β”€ frontend/                 # Svelte frontend application
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/      # UI components
β”‚   β”‚   β”œβ”€β”€ lib/             # Utilities and stores
β”‚   β”‚   └── types.ts         # TypeScript types
β”‚   └── src-tauri/           # Tauri desktop app config
β”œβ”€β”€ services/                 # Backend microservices
β”‚   β”œβ”€β”€ api/                 # REST API server
β”‚   β”œβ”€β”€ auth/                # Authentication service
β”‚   β”œβ”€β”€ channel/             # Channel management
β”‚   β”œβ”€β”€ friends/             # Friends & DM service
β”‚   β”œβ”€β”€ gateway/             # WebSocket gateway
β”‚   β”œβ”€β”€ guild/               # Guild management
β”‚   β”œβ”€β”€ messaging/           # Message handling
β”‚   └── permissions/         # Role & permission system
β”œβ”€β”€ packages/                 # Shared packages
β”‚   β”œβ”€β”€ cache/               # Redis cache utilities
β”‚   β”œβ”€β”€ database/            # Database pool & migrations
β”‚   β”œβ”€β”€ eventbus/            # Event bus abstraction
β”‚   β”œβ”€β”€ events/              # Event type definitions
β”‚   β”œβ”€β”€ snowflake/           # ID generation
β”‚   └── types/               # Shared TypeScript types
└── scripts/                  # Build & deployment scripts

πŸ“‘ API Reference

Authentication (/api/auth)

Method Endpoint Description
POST /auth/register Register new user
POST /auth/login Login with credentials
POST /auth/refresh Refresh access token
POST /auth/logout Logout current session
GET /auth/me Get current user
GET /auth/users/:user_id Get user profile
GET /auth/sessions List active sessions
DELETE /auth/sessions/:session_id Revoke session
POST /auth/accept-terms Accept terms of service
PATCH /auth/profile Update profile
GET /auth/profile-data Get profile customization
PUT /auth/profile-data Save profile customization
GET /auth/users/:user_id/profile-data Get user's profile data

Guilds (/api/guilds)

Method Endpoint Description
GET /guilds List user's guilds
POST /guilds Create guild (admin only)
GET /guilds/:guild_id Get guild details
PATCH /guilds/:guild_id Update guild
DELETE /guilds/:guild_id Delete guild
GET /guilds/dashboard Dashboard with channel counts
GET /guilds/:guild_id/navigate Guild with channels & members
GET /guilds/:guild_id/members List guild members
POST /guilds/:guild_id/members Join via invite
DELETE /guilds/:guild_id/members/:user_id Leave/kick member
POST /guilds/:guild_id/invites Create invite
GET /guilds/:guild_id/invites List invites
DELETE /guilds/:guild_id/invites/:code Revoke invite
GET /guilds/:guild_id/bans List bans
POST /guilds/:guild_id/bans/:user_id Ban user
DELETE /guilds/:guild_id/bans/:user_id Unban user

Channels (/api/channels)

Method Endpoint Description
POST /guilds/:guild_id/channels Create channel
GET /guilds/:guild_id/channels List guild channels
GET /channels/:channel_id Get channel
PATCH /channels/:channel_id Update channel
DELETE /channels/:channel_id Delete channel (admin)

Messages (/api/channels/:channel_id/messages)

Method Endpoint Description
POST /channels/:channel_id/messages Send message
GET /channels/:channel_id/messages Get messages (paginated)
PATCH /channels/:channel_id/messages/:message_id Edit message
DELETE /channels/:channel_id/messages/:message_id Delete message

Roles (/api/guilds/:guild_id/roles)

Method Endpoint Description
POST /guilds/:guild_id/roles Create role
GET /guilds/:guild_id/roles List roles
PATCH /guilds/:guild_id/roles/:role_id Update role
DELETE /guilds/:guild_id/roles/:role_id Delete role
PUT /guilds/:guild_id/members/:user_id/roles/:role_id Assign role
DELETE /guilds/:guild_id/members/:user_id/roles/:role_id Remove role
GET /guilds/:guild_id/members/:user_id/roles Get member roles

Channel Permissions

Method Endpoint Description
PUT /channels/:channel_id/overwrites/:target_id Set permission overwrite
DELETE /channels/:channel_id/overwrites/:target_id Delete overwrite
GET /channels/:channel_id/overwrites List overwrites

Emojis (/api/guilds/:guild_id/emojis)

Method Endpoint Description
GET /guilds/:guild_id/emojis List guild emojis
POST /guilds/:guild_id/emojis Upload emoji
PATCH /guilds/:guild_id/emojis/:emoji_id Rename emoji
DELETE /guilds/:guild_id/emojis/:emoji_id Delete emoji

Friends & DMs (/api/friends)

Method Endpoint Description
GET /friends List friends
DELETE /friends/:friendId Remove friend
GET /friends/privacy Get DM privacy setting
PUT /friends/privacy Update DM privacy
POST /friends/requests Send friend request
GET /friends/requests/incoming Incoming requests
GET /friends/requests/outgoing Outgoing requests
POST /friends/requests/:requestId/accept Accept request
POST /friends/requests/:requestId/decline Decline request
POST /friends/block/:userId Block user
DELETE /friends/block/:userId Unblock user
GET /friends/blocked List blocked users
GET /friends/dm List DM conversations
POST /friends/dm Start DM conversation
GET /friends/dm/:conversationId Get conversation
GET /friends/dm/:conversationId/messages Get DM messages
POST /friends/dm/:conversationId/messages Send DM
POST /friends/dm/:conversationId/read Mark as read
GET /friends/dm/check/:userId Check if can DM user
GET /friends/search Search users

Voice (/api/livekit)

Method Endpoint Description
POST /livekit/token Get LiveKit access token

πŸ—„ Database Schema

Core Tables

Table Description
users User accounts with auth info
sessions Active login sessions
guilds Servers/communities
guild_members Guild membership
guild_bans Banned users per guild
invites Guild invite codes
channels Text/voice channels
roles Permission roles
member_roles Role assignments
channel_overwrites Channel-specific permissions
messages Chat messages (partitioned)
guild_emojis Custom emojis
message_reactions Emoji reactions
channel_documents Channel attachments
user_profiles Profile customization data

Friends & DM Tables

Table Description
friends Friend relationships & requests
dm_conversations DM conversation metadata
dm_participants Users in each conversation
direct_messages DM messages (partitioned)

βš™οΈ Environment Variables

# Database
DATABASE_URL=postgresql://...

# Redis
REDIS_URL=redis://...

# JWT
JWT_SECRET=your-secret-key
JWT_EXPIRES_IN=15m
REFRESH_TOKEN_EXPIRES_IN=7d

# LiveKit (Voice)
LIVEKIT_API_KEY=your-api-key
LIVEKIT_API_SECRET=your-api-secret
LIVEKIT_WS_URL=wss://your-livekit-server

# Ably (Real-time)
VITE_ABLY_API_KEY=your-ably-key

# Server
PORT=3001
WORKER_ID=1

πŸš€ Getting Started

Prerequisites

  • Node.js 18+
  • PostgreSQL (or Neon account)
  • Redis (or Upstash account)
  • Ably account
  • LiveKit account (for voice)

Installation

# Install dependencies
npm install

# Run database migrations
npm run migrate

# Build all packages
npm run build

# Start development
npm run dev

Docker

# Build and run with Docker Compose
docker-compose up --build

πŸ“¦ Deployment

The application is configured for Railway deployment:

# Deploy to Railway
railway up

See DEPLOYMENT.md and railway-setup.md for detailed deployment instructions.

πŸ§ͺ Testing

# Run all tests
npm test

# Run tests in watch mode
npm run test:watch

πŸ“„ License

Private - All rights reserved.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages