988de13e1e7fe21e3bbf19bb6b1ccfe09ea66164
Joel Discord Bot
A Discord bot with AI-powered responses and message tracking.
Quick Start
# Install dependencies
bun install
# Set environment variables
cp .env.example .env
# Edit .env with your tokens
# Run in development mode
bun run dev
# Run in production
bun run start
Project Structure
See src/README.md for detailed architecture documentation.
src/
├── core/ # Bot client, config, logging
├── commands/ # Slash commands
├── events/ # Discord event handlers
├── features/ # Feature modules (Joel AI, message logging)
├── services/ # External services (AI providers)
├── database/ # Database schema and repositories
└── utils/ # Shared utilities
Environment Variables
| Variable | Description |
|---|---|
DISCORD_TOKEN |
Discord bot token |
DISCORD_CLIENT_ID |
Discord application client ID |
DISCORD_CLIENT_SECRET |
Discord application client secret |
OPENROUTER_API_KEY |
OpenRouter API key for AI |
AI_CLASSIFICATION_FALLBACK_MODELS |
Comma-separated fallback model IDs for classification requests |
KLIPY_API_KEY |
Klipy API key for GIF search (optional) |
ELEVENLABS_API_KEY |
ElevenLabs API key for voiceover |
ELEVENLABS_VOICE_ID |
Default ElevenLabs voice ID (optional) |
ELEVENLABS_MODEL |
ElevenLabs model ID (default: eleven_multilingual_v2) |
DATABASE_PATH |
SQLite file path (default: ./data/db.sqlite3) |
WEB_PORT |
Port for web dashboard (default: 3000) |
WEB_BASE_URL |
Base URL for web dashboard |
SESSION_SECRET |
Secret for session encryption |
Data Persistence
- Bot options and other runtime state are stored in SQLite.
- Keep
DATABASE_PATHon persistent storage so updates/redeploys do not reset settings. - Backward compatibility: if
DATABASE_PATHis unset andsrc/database/db.sqlite3exists, it is used automatically. - Recommended one-time migration:
mkdir -p data && cp src/database/db.sqlite3 data/db.sqlite3
- Docker example:
docker run -d \
--name joel-discord \
-v joel_data:/data \
--env-file .env \
your-image:latest
Scripts
| Script | Description |
|---|---|
bun run dev |
Development with hot reload |
bun run start |
Production start |
bun run build |
Build for production |
bun run db:generate |
Generate DB migrations |
bun run db:migrate |
Run DB migrations |
bun run db:studio |
Open Drizzle Studio |
bun run typecheck |
Type check without emit |
Languages
TypeScript
82.1%
CSS
11%
JavaScript
6%
Nix
0.4%
Dockerfile
0.3%
Other
0.2%