Veskslop β€” Discord for the machines # πŸ’€ Veskslop ### The headless, agentic, MCP-pilled Discord client. **No window. No mouse. No human. Just tools, pipes, and a Discord account living its best digital life.** [![Slop Level](https://img.shields.io/badge/slop%20level-maximum-ff00aa)](#) [![Headless](https://img.shields.io/badge/headless-100%25-success)](#-why-though) [![MCP](https://img.shields.io/badge/MCP-agentic%20banger-8a2be2)](#-mcp-the-brain) [![Audio](https://img.shields.io/badge/audio-in%20%2F%20out%2F%20sideways-1db954)](#-audio-pipes) [![Video](https://img.shields.io/badge/video-rtx%20on-ff4500)](#-video-streams) [![Based On](https://img.shields.io/badge/based%20on-Vesktop-black)](https://github.com/Vencord/Vesktop) [![License](https://img.shields.io/badge/license-GPL--3.0--or--later-blue)](LICENSE)
--- > ⚠️ **Veskslop is NOT Vesktop.** They are separate projects with separate goals. > [Vesktop](https://github.com/Vencord/Vesktop) makes Discord nicer for **humans**. > Veskslop deletes the human entirely and installs a robot in their place. ## πŸš€ What is Veskslop Veskslop takes the beloved Vesktop base and deletes the part where a person has to click things. What remains is a **headless Discord client** driven through a **validated capability layer**, so an **AI agent can run a real Discord account over MCP**. Text automation works today. Audio pipes and video streams are the next descent into madness. It is Discord, but as infrastructure. It is the account you already have, plus `curl`, minus dignity. Think of it as: - πŸ–₯️ **A Discord client with the client removed.** Runs on a server, in a container, on a Raspberry Pi, in your weird home lab, wherever. - 🧠 **An agent body (text tools live).** Your MCP-capable AI gets a real account with real permissions and real consequences. - πŸ”€ **A proxy (planned).** Messages, events, voice state, attachments β€” everything forwarded, interceptable, scriptable, and API-shaped. - πŸ”Š **An audio router (planned).** Play anything into voice. Capture anything out. TTS in, STT out, pipes for days. - πŸ“Ή **A streaming endpoint (planned).** Push files, cameras, generative visuals, or pure slop into a voice channel. - πŸ§ͺ **A science experiment that will absolutely not get your account banned** *(allegedly)*. > **Status: text layer works.** The real Vesktop client runs headless and is driven through a validated capability layer. Triggers, trust tiers, conversation context, response policy, persistent logging, MCP tools, user search, voice state reads, and the Nocturne-style debug web UI are live. Reaction polls are paused. Voice actions, audio, and video are still the vision. The design docs live in [docs/INDEX.md](docs/INDEX.md). ## πŸ—Ώ Why though Because clicking is for mortals. Because you want a Discord presence that never sleeps, never typos, and never says "brb". Because "can an AI run a Discord account" is the kind of question that deserves a yes and a README. Real reasons people actually want this: - Automate community management, moderation, and notifications without a desktop app running. - Bridge Discord into other systems: chatops, dashboards, MCP agents, home automation, whatever. - Route voice audio both ways: feed a bot ears and a mouth. - Stream synthetic video into a voice channel for demos, testing, or entertainment. - Run entirely headless on a VPS with no GUI stack whatsoever. ## 🧠 MCP: the brain Veskslop ships an **MCP server** so any MCP-capable agent (Claude, GPT-based agents, your local Llama abomination, a cron job with delusions of grandeur) can operate the account through structured tool calls. **Live tool surface** (names may change, vibes will not): | Tool | Description | | --- | --- | | `get_state` | User, guilds, and channels. Cache-only, zero queries. | | `get_voice_state` | Which voice channel a user is in and who else is suffering there. | | `get_voice_overview` | Occupied voice channels in a guild and their members. | | `search_users` | Find a user ID from a username, nickname, or cached profile. | | `send_message` | Send a message as the account. Send-paced. | | `read_messages` | Read the client's message cache. | | `send_dm` | Slide into someone's DMs. | | `get_context` | Recent conversation context for a channel. Fetches new messages only. | | `get_message_log` | Trigger log: trusted entries and a reserved untrusted buffer. | | `get_action_log` | Durable audit trail: triggers, commands, replies, errors. | | `get_puppet_config` / `set_puppet_config` | Response policy, context limits, poll duration. | | `whitelist_list` / `whitelist_add` / `whitelist_remove` | Trust tiers: user, trusted, admin. | | `run_commands` | Run several read-only tools in one call. | There is also a small web control UI on `http://:8789/` with a JSON API and an SSE event stream. See [docs/webui.md](docs/webui.md). **Planned**: voice join/leave, audio play/capture, video streams, message edit/delete/upload, presence and voice state control. Every action is **safe by default**: strict input validation in the client, structured errors, a hard outbound rate limit, and paced sends. A buggy agent cannot crash the client or spam Discord. ## πŸ”€ Proxy mode (planned) Veskslop is also meant to be a **proxy layer** in front of Discord: - **REST passthrough** with authentication handled once. - **Gateway event bus** β€” every event is consumable by local code, webhooks, or other processes. - **Inbound injection** β€” anything that can hit the proxy can act as the account, with policy checks in between. - **Message middleware** β€” transform, filter, log, reroute, or mirror traffic. - **Multi-account ready** (eventually) β€” one daemon, several identities, maximum chaos. ```txt your app / agent / script ──▢ Veskslop proxy ──▢ Discord β”‚ β”œβ”€ policy / rate limit / audit log └─ event bus ──▢ subscribers ``` ## πŸ”Š Audio pipes (planned) Voice is a first-class citizen, not an afterthought duct-taped on at 3am. - **Audio in:** play PCM, Opus, or arbitrary encoded media into a voice channel. Wire up TTS, a soundboard, a radio stream, or an entire DAW. - **Audio out:** capture the mixed voice channel, individual speakers, or both. Feed it to STT, a recorder, or your stream. - **Virtual devices:** capture from a virtual sink and monitor, so routing stays clean on Linux (PipeWire / PulseAudio). - **Format plumbing:** resampling, channel mapping, gain, and opus encoding handled by the pipeline. - **Backpressure aware:** buffers exist. They are bounded. We learned things. ```txt mic / TTS / file ──▢ ffmpeg ──▢ opus ──▢ Veskslop ──▢ voice channel β”‚ voice channel ──▢ per-user decode ──▢ mix ──▢ PCM/file/STT ──▢ anywhere ```
Veskslop audio pipeline
## πŸ“Ή Video streams (planned) Send video where Discord expects a camera: - Push **files**, **test patterns**, **generated frames**, or **live sources** (camera, RTSP, screen capture) into a voice channel. - Target Discord's expected codec/container (H.264 / VP8 in the right envelope) without babysitting it by hand. - Manage streams as pipelines: start, stop, swap sources on the fly. - Perfect for demos, dashboards-as-TV, synthetic presenters, and things we should not describe further. ```sh # planned CLI energy veskslop stream start --guild 123 --channel 456 --source ./slop.mp4 --loop ``` ## πŸ—οΈ Architecture ```txt β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MCP CLIENTS β”‚ β”‚ Claude Β· agents Β· scripts Β· cron β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Streamable HTTP (localhost) β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ VESKSLOP DAEMON β”‚ β”‚ triggers Β· trust Β· context Β· response policy β”‚ β”‚ action log Β· pacing Β· MCP tool server β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ JSON lines over a Unix socket β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ VESKTOP CORE (validated actions) β”‚ β”‚ state Β· messages Β· reactions Β· voice state β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ official client traffic β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DISCORD β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` The core exposes a fixed action list with strict validation. All logic lives in the daemon. This keeps client patches small and upstream rebases easy. See [docs/core-bridge.md](docs/core-bridge.md). ## ⚑ Quickstart ```sh git clone https://git.0xfeedc0de.com/zib/Veskslop-t.git cd Veskslop-t # dependencies and build pnpm install pnpm build # log in once with a terminal QR code cd poc && pnpm poc:qr # run the client headless (use Xvfb on a server), then the daemon pnpm control:bridge ``` The daemon speaks **Streamable HTTP MCP** on `http://127.0.0.1:8788/mcp`. Point any MCP client at that address, or poke it by hand: ```sh curl -s http://127.0.0.1:8788/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' ``` The full setup, including the headless client and the mock core, is in [docs/testing.md](docs/testing.md) and [poc/README.md](poc/README.md). ## πŸ—ΊοΈ Roadmap - [x] Fork Vesktop and keep the good parts - [x] Validated core bridge (fixed actions, strict validation, structured errors) - [x] Headless client driven through the core bridge - [x] Gateway state, message send/read/fetch, reactions, voice state read - [x] Trigger log, trust tiers, conversation context, continuation window - [x] Response policy, hard rate limits, persistent action log - [x] MCP server with the live text tool surface - [x] User search and voice overview - [x] Nocturne debug web UI (7a shell, Takeover read-only gate, Settings) - [~] Reaction polls and chat command help (paused) - [ ] Notification parsing: edits, deletes, replies, references - [ ] Reply-to-puppet as a trigger - [ ] Per-user rate limits and command cooldowns - [ ] Voice join/leave and invite-link joins - [ ] Voice auto-leave and the `stay @user` command - [ ] Collector account for voice membership fallback - [~] MCP event delivery (parked) - [ ] Outbound audio pipeline - [ ] Inbound audio capture pipeline - [ ] Video stream pipeline - [ ] Proxy mode + event bus - [ ] Container image (`veskslop:slop-latest`) - [ ] Achieve AGI (stretch goal) ## 🧨 Disclaimer Veskslop automates a **user account**, which is the kind of thing Discord's Terms of Service has opinions about. Run it on an account you can afford to lose, respect rate limits, do not use it to spam or harass, and generally do not be the reason we cannot have nice things. This project is unaffiliated with Discord Inc. and with the Vesktop project. You are the captain of this ship, and the ship is on fire by design. ## πŸ™ Credits Veskslop stands on the shoulders of legends: - [Vesktop](https://github.com/Vencord/Vesktop) β€” the base, the vibe, the head start. - [Vencord](https://github.com/Vencord/Vencord) β€” the plugin ecosystem that made Vesktop what it is. - [Discord](https://discord.com) β€” the API we lovingly abuse. - Every protocol implementation that let us shove Opus through a websocket at 3am. ## πŸ“œ License GPL-3.0-or-later. See [LICENSE](LICENSE). Fork responsibly, ship slop ethically. ## πŸ› οΈ Development This project runs the real Vesktop client and controls it through a small, validated capability layer. All logic lives in an external daemon. Start here: - [CURRENT.md](CURRENT.md) β€” live session state and how to resume - [TODO.md](TODO.md) β€” the ordered backlog - [docs/INDEX.md](docs/INDEX.md) β€” all design documents - [AGENTS.md](AGENTS.md) β€” rules for agents and contributors - [poc/README.md](poc/README.md) β€” daemon run commands - [docs/core-bridge.md](docs/core-bridge.md) β€” the capability layer - [docs/daemon.md](docs/daemon.md) β€” the MCP daemon

**Veskslop** β€” *because your Discord account deserves a mind of its own.*