vesper
Details
Vesper
A self-hosted feedback and bug intelligence server.
Named for the evening star — the light that appears first at dusk, quiet and constant, watching while everything else winds down. It receives what your users feel, understands what matters, and surfaces it to you with grace.
What it is
- A self-hosted server that receives anonymous feedback from your applications
- An AI triage layer that classifies, summarises, and surfaces what matters
- A dashboard with two distinct modes: one for reading what people feel, one for working through what is broken
- A notification system that reaches you when something genuinely needs you
What it is not
- A crash reporter that automatically captures stack traces
- A log aggregator or uptime monitor
- A team collaboration tool — no comments, assignments, or mentions
- A two-way communication channel (Vesper cannot reply to reporters — by design)
- A hosted service of any kind
The no-reply constraint is worth naming directly. Reporters are anonymous. There is no return address. This is the privacy model, not a missing feature.
Quick start
You need: Docker, Docker Compose, and a domain with a reverse proxy (Caddy recommended).
1. Get the configuration file.
curl -o vesper.toml https://raw.githubusercontent.com/asha-software/vesper/main/vesper.example.toml
chmod 600 vesper.toml
2. Edit vesper.toml.
At minimum, set dashboard.token and server.base_url. If you want AI triage, set agent.api_key and agent.endpoint.
[server]
base_url = "https://vesper.example.com"
[dashboard]
token = "..." # openssl rand -hex 32
[agent]
enabled = true
endpoint = "https://api.minimaxi.chat/v1"
api_key = "..."
model = "MiniMax-Text-01"
3. Start it.
curl -o docker-compose.yml https://raw.githubusercontent.com/asha-software/vesper/main/deploy/docker-compose.yml
docker compose up -d
4. Add a reverse proxy.
# Caddyfile
vesper.example.com {
reverse_proxy 127.0.0.1:7777
}
5. Visit the dashboard.
https://vesper.example.com — enter the token you set. That is the entire login flow.
Configuration
All configuration lives in vesper.toml. The example file is documented inline — every field has a comment explaining what it does and when to change it.
Three environment variables can override secrets at runtime, useful for containers and NixOS:
VESPER_DASHBOARD_TOKEN
VESPER_AGENT_API_KEY
VESPER_DB_URL
SDKs
TypeScript (browsers, Tauri, Electron):
npm install @asha-software/vesper
import { createClient, detectDevice } from '@asha-software/vesper';
const vesper = createClient({
endpoint: 'https://vesper.example.com',
product: 'Peach',
appVersion: '1.2.0',
silent: process.env.NODE_ENV === 'production',
});
vesper.report('The vault re-locks immediately after unlocking.');
vesper.report('Layout broken on this screen', detectDevice());
Nim:
import vesper
let v = newVesperClient(VesperConfig(
endpoint: "https://vesper.example.com",
product: "Peach",
appVersion: AppVersion,
silent: defined(release),
))
v.report("The vault re-locks immediately after unlocking.")
v.reportWithDevice("Layout broken", detectDevice())
waitFor v.flush()
Both SDKs are fire-and-forget. report() returns immediately and never throws. Retries happen in the background.
License
MIT — Asha Software
Vesper is developed and used in production by Asha Software. It is maintained because it has to work, not because of community pressure or contributor enthusiasm. That is a durable foundation.