# Backspace

Open-source, self-hosted Discord alternative built with TypeScript.

## Features

- Real-time text messaging with WebSocket
- Servers, channels, and role-based permission management
- Voice and video chat via LiveKit
- Screen sharing with configurable quality (VP9)
- Direct messages (1-on-1 and group DMs up to 10)
- DM voice/video calls with ringing
- Friend system with requests
- File uploads and image sharing
- Markdown message formatting with syntax highlighting
- Message reactions, replies, and editing
- Typing indicators, presence status, and read states
- Invite system with shareable codes
- Instance-level admin panel (streaming limits)
- 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/backspace.git
cd backspace

# Create environment file
cp .env.example .env

# Generate a JWT secret
echo "JWT_SECRET=$(openssl rand -hex 32)" >> .env

# Start Backspace
docker compose up -d
```

Open `http://localhost:3000` in your browser. A default server "Backspace" 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 :3005
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

```
Backspace/
├── packages/
│   ├── shared/       # Shared TypeScript types & permissions
│   ├── 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
