chore: Initial commit of Opencord base state
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# Opencord
|
||||
|
||||
Open-source, self-hosted Discord alternative built with TypeScript.
|
||||
|
||||
## Features
|
||||
|
||||
- Real-time text messaging with WebSocket
|
||||
- Servers, channels, and member management
|
||||
- Voice and video chat via LiveKit
|
||||
- Direct messages
|
||||
- File uploads and image sharing
|
||||
- Markdown message formatting
|
||||
- Typing indicators and presence status
|
||||
- Role-based permissions (owner, admin, member)
|
||||
- Invite system with shareable codes
|
||||
- Desktop app (Electron)
|
||||
- Mobile-responsive web UI
|
||||
- Docker deployment
|
||||
|
||||
## Tech Stack
|
||||
|
||||
| Layer | Technology |
|
||||
|-------|-----------|
|
||||
| Backend | Fastify + TypeScript |
|
||||
| Database | SQLite (better-sqlite3) + Drizzle ORM |
|
||||
| Auth | JWT + bcrypt |
|
||||
| Real-time | WebSocket (ws) |
|
||||
| Frontend | React 18 + Tailwind CSS + Zustand |
|
||||
| Voice/Video | LiveKit |
|
||||
| Desktop | Electron |
|
||||
| Build | Vite + pnpm workspaces |
|
||||
|
||||
## Quick Start with Docker
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/your-username/opencord.git
|
||||
cd opencord
|
||||
|
||||
# Create environment file
|
||||
cp .env.example .env
|
||||
|
||||
# Generate a JWT secret
|
||||
echo "JWT_SECRET=$(openssl rand -hex 32)" >> .env
|
||||
|
||||
# Start Opencord
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Open `http://localhost:3000` in your browser. A default server "Opencord" is created automatically.
|
||||
|
||||
**Default admin account:** `admin` / `admin123` (change this after first login).
|
||||
|
||||
## Development Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js 20+
|
||||
- pnpm 8+
|
||||
|
||||
### Install
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Configure
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Edit .env with your settings (generate a JWT_SECRET)
|
||||
```
|
||||
|
||||
### Run
|
||||
|
||||
```bash
|
||||
# Start both server and web dev server
|
||||
pnpm dev
|
||||
|
||||
# Or start individually
|
||||
pnpm dev:server # API server on :3000
|
||||
pnpm dev:web # Vite dev server on :5173
|
||||
```
|
||||
|
||||
### Build
|
||||
|
||||
```bash
|
||||
pnpm build
|
||||
```
|
||||
|
||||
This builds the shared types, server, and web frontend. The server serves the built frontend in production mode.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
Opencord/
|
||||
├── packages/
|
||||
│ ├── shared/ # Shared TypeScript types
|
||||
│ ├── server/ # Fastify API + WebSocket server
|
||||
│ ├── web/ # React frontend (Vite + Tailwind)
|
||||
│ └── desktop/ # Electron desktop app
|
||||
├── data/ # SQLite DB + uploads (created at runtime)
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
└── .env.example
|
||||
```
|
||||
|
||||
## Voice & Video
|
||||
|
||||
Voice and video requires a [LiveKit](https://livekit.io/) server. Set these in your `.env`:
|
||||
|
||||
```
|
||||
LIVEKIT_URL=wss://your-livekit-server
|
||||
LIVEKIT_API_KEY=your-api-key
|
||||
LIVEKIT_API_SECRET=your-api-secret
|
||||
```
|
||||
|
||||
Without LiveKit configured, text chat works fully but voice/video channels will not connect.
|
||||
|
||||
## API
|
||||
|
||||
The server exposes a REST API and WebSocket endpoint:
|
||||
|
||||
- **REST API**: `http://localhost:3000/api/*`
|
||||
- **WebSocket**: `ws://localhost:3000/ws`
|
||||
- **Health check**: `GET /api/health`
|
||||
|
||||
See [CLAUDE.md](CLAUDE.md) for the full API reference.
|
||||
|
||||
## Desktop App
|
||||
|
||||
The Electron desktop app wraps the web UI and adds system tray, notifications, and native window controls.
|
||||
|
||||
```bash
|
||||
cd packages/desktop
|
||||
pnpm build:ts # Compile TypeScript
|
||||
pnpm dev # Run in development
|
||||
pnpm build # Package for distribution
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user