How to Self-Host Rust Error Tracking with TrapFall
Your Sentry SDK needs one URL change to feed your own server. A walkthrough of TrapFall v0.3.0: binary download, setup wizard, DSN swap, and the honest caveats.
Your Rust service panics at 2am. The Sentry Rust SDK already caught it, because panic ships in that crate's default features. All you need next is somewhere to send the event. If your reasons for not opening a sentry.io account are cost, data residency, or just wanting the errors on your own disk, keep reading. This walkthrough uses TrapFall, a self-hosted error capture engine we build. It speaks the Sentry SDK wire format, so any existing Sentry integration becomes a trapfall integration by changing one URL.
It is early software. Eight GitHub stars, no Windows support story beyond an archive file, docs that still reference v0.1.1 in places. We will point those out as we go, because a guide that hides maturity is worse than no guide. If you want the positioning story first, we have a separate post on TrapFall as a self-hosted Sentry alternative, plus a three-way comparison against GlitchTip and Bugsink. This one is just the setup.
What you get for the effort
TrapFall runs as a single binary: Rust backend, embedded SvelteKit 5 dashboard, SQLite with WAL mode by default, Postgres when you outgrow it. Ingest is Sentry-compatible, so the same SDKs keep working. Issues are grouped by blake3 fingerprinting, the dashboard updates over WebSocket, and alert rules can POST webhooks with a cooldown window. The release you will download is about 4MB compressed. The production Docker image weighs 5.75MB, though you cannot pull it anonymously right now (more on that below).
Step 1: Download the binary
Grab the archive matching your platform from the latest release page. Version 0.3.0 ships five assets: x86_64 Linux and macOS ARM archives, a Windows zip, and a checksums file.
curl -fsSL https://github.com/codecoradev/trapfall/releases/download/v0.3.0/trapfall-x86_64-unknown-linux-gnu-v0.3.0.tar.gz -o trapfall.tar.gz
tar xzf trapfall.tar.gz
On October 13 the project merged a hardening pass on auth, atomic event writes, and graceful shutdown, so a v0.3.1 or v0.4.0 tag is plausible in the near future. When a newer tag exists, use its asset names. Also compare the SHA256 from checksums-sha256.txt before you run anything.
Step 2: First boot and the setup wizard
./trapfall --db /var/lib/trapfall.db serve --listen 0.0.0.0:9090
Open http://localhost:9090 and a setup wizard appears on first run: create the admin account, and a default project is minted with its own DSN. Copy that DSN. Two environment variables matter early: TRAPFALL_SECURE_COOKIE defaults to true, which is correct for HTTPS and blocks login over plain HTTP, so set it to false only while testing locally. TRAPFALL_CORS_ORIGINS starts empty, meaning permissive, and should get an explicit allowlist before real traffic arrives.
Step 3: Point a Rust app at it
With the sentry crate (0.49.3 at the time of writing), replace the host in your DSN:
let _guard = sentry::init(("https://<key>@your-server:9090/<project_id>", sentry::ClientOptions::default()));
Since panic is a default feature of the crate, panics flow to your server with no extra integration. sentry::capture_message handles everything else. Any other SDK works the same way: Python, JavaScript, Flutter, each just swaps the host portion of the DSN. Each project gets an isolated DSN, so web, mobile, and backend errors never mix.
Step 4: The Docker shortcut, with one honest caveat
The repo ships a production compose file with healthchecks and an optional Postgres service:
git clone https://github.com/codecoradev/trapfall.git
cd trapfall
cp .env.production .env
docker compose -f docker-compose.prod.yml up -d
The caveat: that compose file pulls ghcr.io/codecoradev/trapfall:latest, and the package is currently not anonymously pullable, which we confirmed while writing this post. Until that changes, the compose route needs a locally built image, or you run the binary directly as in Step 2. The README's docker pull line assumes access we could not verify. If you build the multi-stage image yourself, you get the same scratch-based 5.75MB result.
What you get in the dashboard
Events arrive in real time and group into issues automatically. From the issue detail page you can resolve, ignore, or assign status, read a 14-day events-per-day chart, and page through individual events. Alert rules are per project: define a condition, attach a webhook URL, set a cooldown so one crashing loop does not send forty messages. There is also an MCP server with 12 tools (list_issues, get_issue, search_issues, and friends) over stdio JSON-RPC, which is a quiet way to let your coding agent read production errors.
Where it fits and where it does not
TrapFall covers error capture, grouping, a dashboard, and webhooks. It does not do profiling, session replay, or the wider observability suite that commercial platforms bundle. If you need those, the hosted product is the right call. If you need errors on your own infrastructure, with a wire format your SDKs already speak, and a binary you can read the source of (Apache-2.0), this is a workable afternoon of setup.
That said, this project is young. If eight stars bothers you, treat that as information about age, not quality: the CI pipeline runs ten checks including Cora Review, Trivy, and Cargo Audit, the docs are in the repo, and the whole thing builds from source with two commands. Start with one side project, keep the DSN in your environment config, and see whether you ever open the hosted dashboard again.
Sources: github.com/codecoradev/trapfall, docs.rs/sentry. Repository facts verified October 15, 2026.