# Dumpster

A chaotic, self-hosted Discord-like platform for ~12 degenerates.

Built for fun, maintained with pride, named with intent.

## Quick Start

```bash
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

- [x] Registration + login (Argon2id)
- [x] Server + channel CRUD
- [x] Messaging with WebSocket real-time delivery
- [x] Cursor-based message pagination
- [x] User profiles (display name, bio, accent color, status, avatar/Gravatar)
- [x] File uploads (MinIO)
- [x] Giphy GIF search + trending
- [x] Terminal/Gruvbox dark aesthetic
- [x] Voice/video rooms (LiveKit)
- [x] Online presence (online/idle/dnd/offline)
- [x] Typing indicators
- [x] Message reactions (emoji picker, counts)
- [x] Message replies/threads
- [x] PWA with service worker
- [x] Invite link system
- [x] @mention autocomplete
- [x] Threads (reply chains)
- [x] Forum channels (threaded topics)
- [x] Calendar (events, RSVPs)
- [x] Docs (wiki with markdown sidebar)
- [x] Lists (kanban todo/in_progress/done)
- [x] Scheduling / availability (per-server slots)
- [x] Audit log (event tracking)
- [x] Blocks (user-level blocking)
- [x] Dark/light mode toggle
- [x] Mobile-responsive layout (bottom nav, drawer)
- [x] Bot framework (token auth, CRUD, WebSocket gateway)
- [x] Slash commands (registration, autocomplete)
- [x] Incoming webhooks (create, execute)
- [x] Example bots (modbot, welcome bot)
- [x] TUI client (Bubbletea, vim-style, voice support)
- [x] Roles & permissions system
- [x] Push notification backend (VAPID)
- [x] Push notification frontend (subscribe toggle in settings)
- [x] WebAuthn passkey scaffolding
- [x] WebAuthn frontend (register/login buttons)
- [x] WebAuthn backend (full begin/finish flow)
- [x] REST API documentation (Swagger UI at /docs)
- [x] 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](ssh://git@git.dustin.coffee:2222/hobokenchicken/dumpsterChat.wiki.git)

## License

AGPLv3
