Skip to content

A sidecar for Hermes

Aphrodite

she stands at the gate.

A little server you run yourself. It proves every Discord request is genuine, hands it to the right tool, and never touches your main app.

aphrodite · zsh
$ aphrodite serve
Starting Aphrodite on http://127.0.0.1:9079 (Ctrl-C to stop)
$ curl -fsS http://127.0.0.1:9079/health
{"ok":true,"service":"aphrodite","version":"0.1.0","policy":"no-hermes-core","modules":["image_gen","skillopt","acp_relay"]}

Built with

FastAPI Uvicorn PyNaCl Discord MCP Python 3.10+

Why you'd want it

You built the cool part. This is the rest.

Putting your own tool on Discord means real backend plumbing: proving requests are genuine, sending them to the right place, keeping strangers out, and knowing it still works. Get one piece wrong and anyone can poke your bot. Aphrodite is all of that, already done right, so you can stay on the fun part.

Doing it yourself

A weekend of plumbing.

  • Verify Discord's signatures yourself, and hope the crypto is right.
  • Wire up routing for every button and slash command.
  • Lock things down so strangers can't trigger your bot.
  • Write your own health and status checks.
  • Babysit a server you'd rather not think about.

With Aphrodite

One command, done.

  • One command and you're safely live.
  • Every request is checked before anything runs.
  • Each click already goes to the right tool.
  • Health checks tell you it works before you ship.
  • It stays on your machine and never touches your app.
Get started

How it connects

Where it fits

Hermes uses Aphrodite, not the other way around. You talk to Hermes; it hands the gnarly parts — checking Discord, routing, tools — to Aphrodite, and Aphrodite hands the results straight back. It runs as a separate sidecar, so your Hermes code never changes.

You
01 — caller
Hermes
02 — your agent
uses
answers
Aphrodite sidecar hub
03 — the hub

Aphrodite handles Discord · routing · tools · health

A separate sidecar — it never changes your Hermes files.

Features

What it does for you

Three small jobs, each one easy to follow. No mystery backend, no surprises.

01 Verify

Only real Discord requests get in

Every incoming request is signature-checked, so strangers can't trigger your bot. There's also a no-signature test mode for trying things out on your own machine.

02 Route

Sends each click to the right tool

Tap a button or run a command and Aphrodite works out which of your tools should handle it, then sends it there, with no tangled if-statements to maintain.

03 Health

Tells you it's healthy before you go live

/health and /status report the service state, doctor flags missing runtime pieces, and read-only preflight/endpoint-preflight checks help you prove readiness before changing public traffic.

Modules

Batteries included, and yours to extend

Aphrodite ships with a small native set of tools. Adding your own is one command and a name — no forking, no patching the core.

skillopt

Tune and review your skills

Kick off optimization runs, compare diffs, score evaluations, and read it all back in a built-in review page. Self-contained aside from configured local storage and optional train commands.

Bundled · self-contained

image_gen

Make images on demand

Provides dispatch status and the /image/generate HTTP route. Live HTTP generation requires private Hermes Codex/OpenAI OAuth from the agent stack; it does not use OPENAI_API_KEY.

Bundled · private OAuth for live HTTP

acp_relay

Hold a real conversation

Bridges Aphrodite to an external ACP agent runtime and exposes dispatch plus /acp/* HTTP surfaces. Real turns require a working external Hermes/ACP runtime.

Bundled · external runtime required

Bring your own

Build a module in minutes

One command scaffolds a ready-to-edit package. Aphrodite discovers it through the aphrodite.adapters entry-point group, so APHRODITE_MODULES=+my_module appends your system name to the built-ins. A bare comma list replaces the built-ins and should be intentional. Every module answers calls shaped system:v1:action, and an unknown name gets a safe placeholder instead of crashing startup.

Read the module guide
aphrodite · zsh
$ aphrodite new-module my_module$ ~/.local/share/aphrodite/venv/bin/python -m pip install -e my_module$ export APHRODITE_MODULES=+my_module$ aphrodite modules$ aphrodite dispatch-test my_module:v1:ping

Install

Install it, run it locally.

If you can paste a line into a terminal, you can run it. All you need is Python 3.10+. It pulls in everything else.

Installer / updater
$ curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/Frens-Pods/aphrodite/main/install.sh | bash$ export PATH="$HOME/.local/bin:$PATH"$ aphrodite easysetup$ aphrodite serve
From a clone
$ git clone https://github.com/Frens-Pods/aphrodite && cd aphrodite$ python3 -m venv .venv && . .venv/bin/activate$ .venv/bin/python -m pip install .$ .venv/bin/python -m pip install -e ".[dev]"
Run, verify, update
$ aphrodite easysetup --json$ curl -fsS http://127.0.0.1:9079/health$ curl -fsS http://127.0.0.1:9079/status$ aphrodite update$ aphrodite update --check$ aphrodite version

MCP

Use it inside your AI assistant.

Run aphrodite easysetup for guided Hermes MCP setup, or aphrodite easysetup --json for the machine-readable profile entry. Keep the printed command as Aphrodite's exact absolute interpreter path; do not replace it with ~, $HOME, or a guessed path. Clone and venv installs are only the fallback; after restarting the Hermes profile or session, run aphrodite doctor to confirm readiness.

Preferred setup
$ aphrodite easysetup$ aphrodite easysetup --json$ aphrodite doctor
Secondary clone fallback
$ git clone https://github.com/Frens-Pods/aphrodite && cd aphrodite$ python3 -m venv .venv && . .venv/bin/activate$ .venv/bin/python -m pip install ".[mcp]"
Client config
{
  "mcp_servers": {
    "aphrodite": {
      "command": "/absolute/path/to/python",
      "args": ["-m", "aphrodite.mcp_server"]
    }
  }
}
Runs on your machine · Open source · MIT

Make it
yours.

Your main app stays untouched, you stay in control, and it all runs on a machine you trust.

Aphrodite mascot inviting you to run the sidecar on your own machine