Point it at the stack you already run.

Three things to do here: connect a pipeline, run the optimizer on your machine, and find or become a host.

What a connector is. It reads everything and writes one thing.

A connector is how PromptPotter reaches your pipeline. It reads the definition your backend already publishes: the nodes, the parameters, the prompts. It runs its loop against your own labelled data, and hands back a per-call overlay. Your code is never edited, never forked, never redeployed to be optimized.

Reads
your pipeline and its settings
the prompts you run today
your labelled examples
Writes
one per-call overlay
Nothing else is touched. Your backend runs exactly as you deployed it.
The connectors that ship with the optimizer
Connector What it reaches Source
harbor An agent run in a sandbox, graded by the task’s own verifier. GitHub
dspy Your dspy.Module. PromptPotter also runs as a DSPy optimizer, PromptPotterOpt. GitHub
termnorm A pipeline served over HTTP. It publishes its nodes at /pipeline and answers one sample at a time at /matches. GitHub
dbllmbench A query-writing benchmark, run in a container. GitHub
promptpotter The optimizer pointed at itself, so its own prompts and settings are the thing being tuned. GitHub

The list is whatever the registry holds on your install. This prints it, with where each one came from:

python -c "from promptpotter.connectors import connector_origins as o; print(*o().items(), sep='\n')"

A connector of your own is a Python package that registers under the entry-point group promptpotter.connectors. A connector is trusted code, not sandboxed. Write a connector

Connect a pipeline. Three endpoints, then one command.

Any backend that publishes a pipeline definition is optimizable: model, retrieval, params and all. PromptPotter never edits the backend. Over HTTP, that means your backend serves these three.

What a backend serves
EndpointMethodWhat it does
/pipeline GET The full schema: nodes, parameters, allowed values and the prompt templates of the LLM nodes. Read once, to find what can be tuned.
/matches POST Run one query under the given parameters and return the prediction.
/status GET Liveness. 200 when up.

Bring a labelled dataset, input and output pairs as CSV, TSV, JSON, JSONL or .xlsx, and say what the job is. A campaign refuses to start without a backend to score against; the default address is http://127.0.0.1:8000. The backend contract

# your backend answers

curl http://127.0.0.1:8000/status

# start a campaign on your own examples

python -m promptpotter new tickets.csv --set task_description="classify support tickets by urgency"

python -m promptpotter resume

Run it on your machine. Or on someone else’s.

PromptPotter runs on someone’s machine: ours, yours, or your team’s. Free and open source, with no license keys and no seats.

  • Hosted Sign in Sign in and use the public instance. Nothing to install.
  • Your machine Run it on your machine Your examples and your API keys stay on your own machine, and there is no account to create before you can try it.
  • Your server Become a host The same app as a service on a Linux box, reached through a tunnel and behind sign-in.

The command line runs where your data already is. It needs Python 3.13 or newer and a provider key. Start a campaign, close the laptop, pick it up where it left off. Calls go to the model provider you configure, on your own key.

The same steps, one at a time

# install

pip install "promptpotter[all]"

# or from source

git clone https://github.com/PromptPotter/prompt-potter-optimizer.git

cd prompt-potter-optimizer

pip install -e ".[all]"

# your provider key

echo "OPENROUTER_API_KEY=your_key_here" > .env

# the app, at http://127.0.0.1:8001/

python -X utf8 -m uvicorn promptpotter.main:app --port 8001

What you download.

What makes a round cheap. Five settings you own.

None of these is a discount. Each one is a decision about where the next dollar buys the most evidence, and each is a setting you own, on your own machine, billed to your own key.

sp_budget_origin
Defaults to 40 samples against 20 for a candidate round. Origin rows are content-addressed, so they replay free into every candidate, every fork and every resume. Origin breadth is the one breadth you pay for once.
Scoring and memory
epsilon
Defaults to 0.15: stop measuring a candidate once its probability of being the round’s best drops under 15%.
Candidate elimination
lives
Opt-in. A campaign banks a life for every round that improves and loses one for every round that does not; at zero it stops itself.
potter/pipeline.yaml
Prior results
Measurements are content-addressed by config and dataset. Resume a campaign and every sample it already paid for replays at zero spend. Close the laptop mid-run without buying those rows twice.
Persistence and state
set-limits
Two hard ceilings, one in dollars and one in tokens; whichever trips first halts the run. The token ceiling exists because a free backend reports $0, and the dollar ceiling would never see it coming.
Your first campaign
python -m promptpotter set-limits --max-usd N --max-tokens N

Find or become a host. Pick who runs it.

Join a public instance below, or take the source and run the whole stack on your own keys.

Public instances
Host Where Address Spots open Join
David Streuli Switzerland app.promptpotter.com 992 of 1,000 Sign in

PromptPotter is open source and whitelabel-ready: run the full stack on your own machine, put your brand on it, invite people you know, then request a listing here. The Linux deploy runs the app on 127.0.0.1 under systemd and reaches it through a Cloudflare tunnel, with no open ports on your router and no static IP.

# on the box, in the deploy-linux folder

cp deploy.config.example deploy.config

./bootstrap.sh