Withvibe Voter

io.github.withvibePublished by GitHub account withvibev0.1.0Updated Oct 24, 2026

Vote-gated change control for WithVibe — the agent proposes a change via MCP; team approves first.

Overview

AI-generated overview

A WithVibe plugin that turns an environment into a vote-gated workspace, where the AI proposes changes and teammates approve them before anything is built.

What you can do
Open a proposal for a requested change instead of editing directly, and instruct the agent to wait for a verdict (propose). Long-poll the team's decision until it is approved, rejected or expired (await decision). Record what shipped after an approved change, or mark an approved change as failed (record, report failure). Show the current board of proposals in voting and recently resolved (status).
When to use it
Use it on a WithVibe environment where several teammates should sign off on AI-made changes before they are applied, such as shared apps, documents, scenes or configs. It suits friendly team workflows rather than hard enforcement.
Requirements
Runs as a WithVibe plugin, spawned as one container per environment; install through the WithVibe plugin or marketplace flow and enable it on an environment. Needs a Postgres database (DATABASE_URL) and a schema name (PGSCHEMA) for its isolated tables. Teammates vote in the plugin's own web panel.
Before you install
The gate is agent-cooperative: it relies on tool instructions, so a non-cooperative agent could bypass it. Enabling it makes every change in that environment go through a vote. It stores proposals, votes and settings in a Postgres schema, and the database connection string is passed as DATABASE_URL.

Installation

In SourceWeft

  1. Open Withvibe Voter in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Voter — a WithVibe plugin

Turn any WithVibe env into a team-voted workspace. When this plugin is enabled, the AI doesn't apply a prompt straight away — it opens a proposal the team votes on, and only an approved proposal gets built. Enable it on any env and that env becomes a vote-gated sandbox.

You (in chat):  "add a dark-mode toggle"        │        ▼   voter_propose_change ──────►  Proposal #7 opens (10-min vote)        │                           👍 👎  team votes in the panel   voter_await_decision  ◄───────  APPROVED ✅  /  REJECTED ✗        │        ▼  (only if approved)   agent makes the change  ──►  voter_record_change  ──►  shows up in History

It's content-agnostic — it knows nothing about what the env contains. Whatever the env is (an app, a doc, a 3D scene, a config), enabling Voter makes every change go through the team first. Multiple envs = multiple independent boards.

How the gate works (and why it's just a plugin)

WithVibe auto-injects an enabled plugin's MCP tools into the agent's turn. Voter uses that to gate prompts without any change to WithVibe core:

  1. voter_propose_change(prompt) — opens a proposal and tells the agent to not touch anything yet.
  2. voter_await_decision(proposal_id) — long-polls the vote. The platform's MCP bridge caps a single tool call at 60s, so this returns after ~45s with STILL_VOTING and the agent simply calls it again until it's terminal.
  3. On APPROVED, the agent makes the change and calls voter_record_change. On REJECTED / EXPIRED it makes no change.

Meanwhile every teammate votes in the plugin's own UI panel — independent of the agent. The gate is agent-cooperative (enforced via tool instructions), which is the right trade-off for a friendly workflow; hardening it to be unbypassable is a later option that would need a small core hook.

MCP tools

ToolPurpose
voter_propose_changeOpen a proposal for the requested change. Agent must call this instead of editing.
voter_await_decisionLong-poll the team's verdict (APPROVED / REJECTED / EXPIRED / STILL_VOTING).
voter_record_changeRecord what shipped after applying an approved change.
voter_report_failureMark an approved change as failed (e.g. build broke).
voter_statusShow the current board: proposals in voting + recently resolved.

State

Four tables in the plugin's isolated Postgres schema (shared-postgres storage): settings (vote window + thresholds), proposal, vote, feed_event.

Resolution rule: a proposal passes when approvals reach the threshold, fails when rejections reach the threshold, and at the deadline the majority wins (ties expire). Defaults: 600s window, 1 approval / 1 rejection — tune them in the panel.

Architecture

manifest.yaml ──► WithVibe spawns one container per env (scope: env)       │   server.js (express)   ├── /health      platform health probe   ├── /mcp         agent's MCP endpoint            ─► mcp.js  (the gate)   ├── /ui          htmx voting panel               ─► ui.js   └── /ui/version  cheap freshness check (live updates)                │              db.js (pg) ─► shared-postgres, per-env schema

Build

bash
docker build -t local/voter:0.1 .

For the marketplace this is published multi-arch as ghcr.io/withvibe/voter:<version>.

Install in WithVibe

  1. Workspace admin → Plugins → Install plugin (or Marketplace once listed).
  2. Paste manifest.yaml (or 1-click install from the catalog).
  3. Open any env → enable Voter → that env is now a vote-gated workspace.

Local development

bash
docker build -t local/voter:0.1 .docker run --rm -p 8080:8080 \  -e DATABASE_URL="postgres://user:[email protected]:5432/withvibe_plugins" \  -e PGSCHEMA="voter_dev" \  local/voter:0.1# open http://localhost:8080/ui  — two browsers = two voters

Repository layout

manifest.yaml   WithVibe plugin manifest (install input)Dockerfile      runtime imagepackage.json    deps (express, pg, @modelcontextprotocol/sdk, zod)server.js       express entry — HTTP + MCP routes + vote handlingdb.js           pg pool, schema, proposal/vote/resolution helpersmcp.js          the gate: propose / await / record MCP toolsui.js           htmx voting panel + dark theme

License

Apache License 2.0. See NOTICE for attribution.

Source: README.md at commit 94a2c89

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts