2026-08-18 17:35:34 +02:00
2026-09-08 02:11:33 +02:00
2026-09-21 11:20:24 +02:00
2026-09-08 02:11:33 +02:00
2023-04-09 22:55:12 +02:00
2026-03-27 03:16:44 +01:00
2023-03-30 01:02:30 +02:00
2026-09-08 02:11:33 +02:00
2026-09-08 02:11:33 +02:00
2026-03-27 03:16:44 +01:00

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 Headless MCP Audio Media Video Based On License


⚠️ Veskslop is NOT Vesktop. They are separate projects with separate goals. 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 and the first audio pipes work today. 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 (partly live). TTS into the call, ducking, browser monitoring, and captured call audio with Vosk STT. Browser microphone puppeting is next.
  • 📼 A media archive (live). Walks a channel's whole history, indexes every image, GIF, video, and audio item, caches previews, and makes it all browsable and searchable in the web UI.
  • 📹 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, voice, and the media archive work. 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, voice join/leave/move, a virtual-mic TTS pipeline with ducking, browser call monitoring, VAD-segmented call capture with Vosk STT, core process control, web QR login, and the Nocturne-style debug web UI over self-signed HTTPS are live. The media archive walks channel history on both a dedicated bot and the puppet, caches previews, backfills titles and previews in the background, and ships its own Media and Bot tabs. Reaction polls are paused. Browser microphone puppeting and video are still ahead. The design docs live in 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.
voice_join / voice_leave / voice_move Join muted, leave, or move the account's call.
get_audio_status / speak / stop_audio Virtual-mic TTS state, queue text, stop playback.
start_capture / stop_capture / get_transcript Segment call audio, stop, read the transcript.
search_users Find a user ID from a username, nickname, or cached profile.
list_dms Cached DMs and group DMs with recipients, unread counts, and last-message time.
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.
scrape_media Start a media scrape of a channel or group chat (links or download mode).
stop_media_scrape / resume_media_scrape / delete_media_scrape Control and clean up scrapes.
list_media_scrapes / get_media_scrape Scrape states, counters, and history.
query_media Query the archive: kind, source, provider, extensions, size/length, title search, sort.
get_media_item One item with its local file, preview, and message link.
count_media_messages / get_media_storage Discord search totals and storage usage.

There is also a debug web UI on https://<host>:8789/ (self-signed certificate) with a JSON API, an SSE event stream, a DM/favourites tab, and browser call audio. See docs/webui.md.

Planned: stay @user, invite-link joins, browser microphone puppeting, video streams, message edit/delete/upload, presence 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.
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.
mic / TTS / file ──▶ ffmpeg ──▶ opus ──▶ Veskslop ──▶ voice channel
                                              │
voice channel ──▶ per-user decode ──▶ mix ──▶ PCM/file/STT ──▶ anywhere

Veskslop audio pipeline

📼 Media archive

Point it at a channel and it walks the history, indexes every image, GIF, video, and audio item it finds, caches previews (Discord's own proxy for attachments, provider oEmbed/og:image for embeds), downloads bytes on request, and makes the whole thing browsable in the Media tab.

@puppet scrape media           # index links (default)
@puppet scrape media download  # also download attachment bytes
@puppet scrape media status
@puppet scrape media stop
  • Two backends, picked automatically. A dedicated bot account walks guild channels through the official API; the puppet handles DMs, group chats, and anything the bot cannot see. A scrape remembers which backend it used, and the daemon serializes walks and backfills so Discord's rate limits are never multiplied.
  • Media tab. Kind/source/origin filters, a People popover, aspect and resolution presets, file-type chips, Do not include and Must include groups (providers like Discord, YouTube, Giphy/Tenor, Reddit, Twitter, Instagram, TikTok, Streamable, …, sizes, lengths), a title search with order-free word prefixes and * wildcards, sorting by newest/oldest/user/ size/length, and an Infinite/Page toggle (page mode pre-loads the next page and lets you bookmark a filter+page).
  • Bot tab. Backfill queue with per-chat jobs and ETAs, a YouTube title catch-up lane, a one-shot recovery task for deleted-file previews, a live failure-policy hint, and all the pacing knobs (batch sizes, cooldowns, timers) with server-side persistence.
  • Nothing is thrown away on one bad answer. A failed fetch on Discord's CDN is retried with a freshly signed URL from the source message; still-failing rows are parked for one delayed retry and then left unverified, so a finished backfill never churns over genuinely deleted media. Recovering a stale archive has recovered 90%+ of previously "gone" previews.
  • Re-scrapes are incremental. Starting a scrape of a channel that already has a complete walk starts where that walk began, so only new messages are fetched.
  • Verify it. pnpm verify:scrapes (from poc/) checks every index for completeness: done state, message counts against Discord's search totals, and the oldest message against the source's creation time.

Full details: docs/media.md, docs/media-scraper.md, docs/slopbot.md, docs/media-mcp.md.

📹 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.
# planned CLI energy
veskslop stream start --guild 123 --channel 456 --source ./slop.mp4 --loop

🏗️ Architecture

┌─────────────────────────────────────────────────────┐
│                     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.

⚡ Quickstart

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:

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 and poc/README.md.

🗺️ Roadmap

  • Fork Vesktop and keep the good parts
  • Validated core bridge (fixed actions, strict validation, structured errors)
  • Headless client driven through the core bridge
  • Gateway state, message send/read/fetch, reactions, voice state read
  • Trigger log, trust tiers, conversation context, continuation window
  • Response policy, hard rate limits, persistent action log
  • MCP server with the live text tool surface
  • User search and voice overview
  • Voice join/leave/move (joins muted) over the validated core bridge
  • Nocturne debug web UI (7a shell, DM tab, favourites, speaking marks, HTTPS, process control)
  • Outbound audio pipeline (virtual mic, TTS local/API, ducking, browser monitoring)
  • Inbound audio capture pipeline (VAD segmentation, WAV, transcript store, Vosk STT)
  • [~] Reaction polls and chat command help (paused)
  • Browser microphone puppeting (browser mic into the bot's voice)
  • Voice auto-leave when the owner leaves (with a delay and rejoin cancellation)
  • stay @user and invite-link joins
  • Media archive: full-history walk, dedupe, previews, downloads, Media and Bot tabs
  • Backfill queue per chat, YouTube title catch-up, Discord preview recovery, suspect retries
  • Media filters, title search with wildcards, sorting, infinite/page modes, message links
  • Notification parsing: edits, deletes, reactions, replies (reply-to-puppet triggers too)
  • Reply-to-puppet as a trigger
  • Per-user rate limits and command cooldowns
  • Collector account for voice membership fallback
  • [~] MCP event delivery (parked)
  • 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 — the base, the vibe, the head start.
  • Vencord — the plugin ecosystem that made Vesktop what it is.
  • Discord — 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. 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:

After pnpm install, the usual loop is pnpm testTypes, pnpm lint, pnpm build, then cd poc && pnpm check && pnpm test:comm && pnpm test:media. Optional extras: pnpm test:ui (browser smoke test for the Media tab) and pnpm verify:scrapes (scrape completeness report).


Veskslop — because your Discord account deserves a mind of its own.

S
Description
No description provided
Readme
6.9 MiB
Languages
TypeScript 84.7%
JavaScript 4.5%
HTML 4.4%
C++ 3.1%
CSS 2.5%
Other 0.8%