ca7a9e30f1112cf819f0ccb3f842676813f344c2
Query was ORDER BY ASC LIMIT 50 — returning the 50 oldest messages. On page refresh users saw ancient messages instead of recent ones. Changed to ORDER BY DESC LIMIT then reverse in Go so the API still returns chronological order but from the bottom of the history.
Dumpster
A chaotic, self-hosted Discord-like platform for ~12 degenerates.
Built for fun, maintained with pride, named with intent.
Quick Start
git clone ssh://git@git.dustin.coffee:2222/hobokenchicken/dumpsterChat.git
cd dumpsterChat
docker compose -f docker/compose.yml up
That's it. Visit http://localhost to register and start chatting.
For optional features, copy .env.example to .env and set Giphy, MinIO, LiveKit, or VAPID keys.
Tech Stack
| Layer | Technology |
|---|---|
| Backend | Go, Chi router, pgx, gorilla/websocket |
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Zustand |
| Database | PostgreSQL 16 |
| Cache | Valkey (Redis-compatible) |
| File storage | MinIO (S3-compatible) |
| Voice/video | LiveKit |
| TURN | coturn |
| Reverse proxy | Caddy |
| Auth | Argon2id + WebAuthn passkeys |
Features
- Registration + login (Argon2id)
- Server + channel CRUD
- Messaging with WebSocket real-time delivery
- Cursor-based message pagination
- User profiles (display name, bio, accent color, status, avatar/Gravatar)
- File uploads (MinIO)
- Giphy GIF search + trending
- Terminal/Gruvbox dark aesthetic
- Voice/video rooms (LiveKit)
- Online presence (online/idle/dnd/offline)
- Typing indicators
- Message reactions (emoji picker, counts)
- Message replies/threads
- PWA with service worker
- Invite link system
- @mention autocomplete
- Threads (reply chains)
- Forum channels (threaded topics)
- Calendar (events, RSVPs)
- Docs (wiki with markdown sidebar)
- Lists (kanban todo/in_progress/done)
- Scheduling / availability (per-server slots)
- Audit log (event tracking)
- Blocks (user-level blocking)
- Dark/light mode toggle
- Mobile-responsive layout (bottom nav, drawer)
- Bot framework (token auth, CRUD, WebSocket gateway)
- Slash commands (registration, autocomplete)
- Incoming webhooks (create, execute)
- Example bots (modbot, welcome bot)
- TUI client (Bubbletea, vim-style, voice support)
- Roles & permissions system
- Push notification backend (VAPID)
- Push notification frontend (subscribe toggle in settings)
- WebAuthn passkey scaffolding
- WebAuthn frontend (register/login buttons)
- WebAuthn backend (full begin/finish flow)
- REST API documentation (Swagger UI at /docs)
- Push notification mention parsing and dispatch
Project Structure
dumpsterChat/
├── cmd/
│ ├── server/ # Main API + WebSocket gateway
│ ├── migrate/ # Database migration CLI
│ └── tui/ # Terminal client (Bubbletea)
├── internal/
│ ├── auth/ # Registration, login, sessions, profiles
│ ├── channel/ # Channel CRUD handlers
│ ├── config/ # Environment-based config
│ ├── db/ # PostgreSQL connection + schema migrations
│ ├── gateway/ # WebSocket hub + client fanout
│ ├── giphy/ # Giphy API client (search + trending)
│ ├── message/ # Message CRUD + WS broadcast
│ ├── middleware/ # Session auth middleware
│ ├── server/ # Server CRUD + membership
│ ├── upload/ # MinIO file upload + serve
│ ├── voice/ # LiveKit voice/video integration
│ ├── reaction/ # Message reactions
│ ├── invite/ # Server invite links
│ ├── bot/ # Bot framework, auth, commands
│ ├── webhook/ # Incoming webhooks
│ ├── push/ # Push notification sender (VAPID)
│ ├── permissions/ # Permission bitflags and checker
│ ├── moderation/ # Mute, ban, kick, slowmode, audit log
│ ├── thread/ # Threaded conversations
│ ├── forum/ # Forum channel topics
│ ├── calendar/ # Events + RSVPs
│ ├── docs/ # Wiki documents
│ ├── lists/ # List kanban items
│ ├── availability/ # Scheduling/availability
│ └── block/ # User blocking
├── examples/ # Example bots
│ ├── modbot/ # Moderation bot
│ └── welcome/ # Welcome message bot
├── web/ # React frontend (PWA)
│ ├── src/
│ │ ├── components/ # Layout, ChatArea, LoginForm, UserSettings, GiphyPicker, VoiceChannel, VoicePanel, VoiceControls, TypingIndicator, ReactionBar, EmojiPicker, ReplyBar, MentionPopup, InviteModal, JoinServer, MobileNav, MobileDrawer, ThemeToggle, InstallPrompt, BotManager, CommandManager, SlashCommandPopup
│ │ ├── stores/ # Zustand (auth, server, channel, message, ws, voice, presence, typing, push, bot)
│ │ └── lib/ # API client, WebSocket client
│ └── tailwind.config.js
├── docker/ # Docker Compose, Dockerfile, Caddyfile, LiveKit config
├── Makefile # Build targets
└── .env.example # Environment template
Environment Variables
See .env.example for the full list. Key variables:
| Variable | Description | Required |
|---|---|---|
DUMPSTER_HOST |
Server bind address | No (default: localhost) |
DUMPSTER_PORT |
Server port | No (default: 8080) |
DUMPSTER_SECRET |
Session signing secret | No (auto-generated in Docker) |
POSTGRES_* |
Database connection | No (defaults in compose) |
LIVEKIT_* |
Voice/video server | No |
GIPHY_API_KEY |
Giphy API key for GIF search | No |
MINIO_* |
File upload storage | No |
Wiki
Full documentation: dumpsterChat wiki
License
AGPLv3
Description
A chaotic, self-hosted Discord-like platform for ~12 degenerates.
Built for fun, maintained with pride, named with intent.
https://dumpster.dustin.coffee
Releases
1
v0.2.0 — Desktop App
Latest
Languages
TypeScript
62.3%
Go
36.5%
JavaScript
0.4%
HTML
0.4%
CSS
0.2%
Other
0.1%