Self-hosted · AWX + Ansible log analyzer

Stop scrolling through thousands of lines of Ansible output. See what broke.

Tracegoblins is the top-of-the-line Ansible & AWX log parser and viewer. It turns a wall of raw playbook output into a color-graded Status Map — every task, every host — so you find the failure in seconds, not minutes. Then your whole team annotates, discusses and remembers the fix.

Two containers No Redis, no Celery Light & dark Your logs stay yours
tracegoblins — status map live
Failed
Deploy Storefront API
synced from AWX · 2026-06-04 21:28 · 8 tasks · 3 hosts
Unreachable 1 Changed 9 OK 18
Status map Filter tasks… Errors only
PLAYDeploy Storefront API
1Gathering Facts
2Install base packages
3Pull application image
4Render config from template
5Run database migrations api-01…
6Restart application service
7Wait for HTTP 200 on /healthz
8Assert release version matches
Python 3.12 FastAPI React 19 TypeScript PostgreSQL 16 Docker · 2 containers
The problem

AWX's raw stdout is a wall of text.

When a 600-line playbook fails on host 7 of 12, you scroll. Tracegoblins turns that wall into a triageable map — failures pulsing red — so you find the break in seconds.

● raw_output.log2,418 lines
TASK [app : Pull application image] *********
changed: [api-01.prod] => {"changed": true, "img"…
changed: [api-02.prod] => {"changed": true, "img"…
TASK [app : Run database migrations] ********
fatal: [api-01.prod]: UNREACHABLE! => {"changed"…
ok: [api-02.prod]
TASK [healthcheck : Restart application] ****
changed: [api-01.prod]
changed: [api-02.prod]
fatal: [worker-01.prod]: FAILED! => {"msg": "Job…
TASK [healthcheck : Wait for HTTP 200] ******
ok: [api-01.prod]
ok: [api-02.prod]
skipping: [worker-01.prod]
PLAY RECAP *********************************
api-01.prod : ok=12 changed=3 unreachable=1…
◧ status_mapfirst failure → 1 click
Pull application image
Run database migrationsunreachable
Render config from template
Restart application service
Wait for HTTP 200 on /healthz
Assert release version matches
What you get

A log viewer built for triage, not scrolling.

The Status Map — your single hero view

Every play and task laid out with per-host status dots — ok · changed · skipped · failed · unreachable. The whole run, color-graded, on one screen.

  • Jump straight to the first failure
  • Filter to errors only, search tasks, or scope to one host
  • Real per-task durations when synced via the AWX job_events API
Tracegoblins Status Map — Ansible AWX log viewer showing every task and per-host status, with the failed task pulsing red

Failure analysis + team collaboration

Click any task for the full failure detail, affected hosts and the raw output in a pop-out viewer. Then bring the team in — right next to the break.

  • Annotate with notes, tags and external links
  • Discuss in threaded comments with @mentions
  • My logs, Shared with me and a Team workspace, cleanly separated
Tracegoblins failure detail drawer — affected hosts, raw Ansible output, annotations and threaded discussion

A knowledge base that learns your errors

Promote any failure into a generalized KB entry. Tracegoblins extracts a normalized signature — host-stripped, secret-collapsed — and fuzzy-matches future errors to it with pg_trgm.

  • Next time the error appears, the documented fix is already attached
  • Recurring errors auto-match — your team stops solving the same break twice
  • Postgres full-text + trigram search across every documented fix
knowledge base · auto-match matching
New failureapi-01.prod · just now
fatal: [api-01.prod]: FAILED! => {"msg": "Failed to start service nginx: Unit nginx.service not found"}
normalize ↓ host-stripped · secret-collapsed FAILED start service <svc>: Unit <unit> not found
Service unit not found 94% match
Documented fix · resolved 7×
  1. Run systemctl daemon-reload after the unit drop-in is templated.
  2. Ensure the nginx package task runs before the service handler.
Package install failed — repo unreachable 41%
Template render: undefined variable 23%
Security-first · internet-ready

Built to sit on the open internet.

Designed for a TLS-terminating reverse proxy. Configuration is environment-only. Your AWX tokens and logs stay yours.

argon2id + revocable sessions

argon2id password hashing with httpOnly / Secure, server-side sessions you can revoke at any time.

Two-factor authentication

TOTP 2FA — opt-in for users, enforceable for admins — with one-time hashed recovery codes.

Encrypted AWX tokens

AWX tokens encrypted at rest; base URLs validated to http(s) and pinned to the controller origin.

Full audit log

Admin-invite-only onboarding (no public signup) and a complete audit trail of who did what, when.

Strict CSP + headers

CSRF double-submit, login rate-limiting and a strict Content-Security-Policy with hardened headers.

Supply-chain CI

CodeQL + Trivy + OpenSSF Scorecard + Dependabot, with SHA-pinned GitHub Actions.

Tech stack

Two containers. That's it.

No Redis, no Celery. Background AWX sync and retention run on APScheduler with a Postgres advisory-lock leader.

BackendPython · FastAPI · SQLAlchemy 2.0 async · Alembic · Pydantic v2 · APScheduler
DatabasePostgreSQL 16 — JSONB + pg_trgm / full-text
FrontendVite · React 19 · TypeScript · TanStack Query · self-hosted IBM Plex
PackagingOne multi-stage Docker image — Node builds the SPA, Python serves it
Authargon2id · revocable sessions · CSRF · TOTP 2FA
Quick start

Self-host in three commands.

bash Copy
# 1) clone & generate strong secrets into .env
git clone https://github.com/VladoPortos/tracegoblins.git
cd tracegoblins
./bootstrap.sh

# 2) pull the prebuilt image & run both containers
docker compose pull && docker compose up -d

# 3) open the one-time setup wizard
# → http://localhost:8000/setup  (create the first admin)

Image: ghcr.io/vladoportos/tracegoblins · :latest or a pinned :vX.Y.Z. Behind a proxy, keep COOKIE_SECURE=true.

Open source · self-hosted

Star it. Run it. Keep it alive.

Tracegoblins is free and open source. A GitHub star helps other AWX teams find it — and a coffee keeps the goblins building.

Star on GitHub

Read the source, file an issue, send a PR — or just drop a star so more AWX & Ansible teams discover it.

github.com/VladoPortos/tracegoblins
Apache-2.0 · self-hosted

Buy the goblins a coffee

No paywalls, no telemetry, no SaaS tier. If Tracegoblins saved you an afternoon of scrolling, a Ko-fi keeps development caffeinated.

Support on Ko-fi
One-time or monthly · every coffee helps
FAQ

Questions, answered.

A self-hosted Ansible & AWX log parser, viewer and analyzer. It pulls run logs from your AWX controllers (or you paste / upload them), renders a color-graded Status Map, and adds team annotation, discussion and a self-learning knowledge base on top.
It syncs from your AWX controllers through the job_events API, giving you real per-task durations and per-host status. Tokens are encrypted at rest and base URLs are pinned to the controller origin. Prefer not to connect? Just paste or upload raw Ansible output.
Yes — it runs as two Docker containers (the app plus a Postgres companion) behind your reverse proxy. No SaaS, no telemetry, no external calls for your data. Your logs stay yours.
Promote any failure into a KB entry and Tracegoblins extracts a normalized, host-stripped, secret-collapsed signature. Future errors are fuzzy-matched against it with Postgres pg_trgm — so the next time that error shows up, the documented fix is already attached.
FastAPI + PostgreSQL 16 + a React 19 SPA, shipped as one multi-stage Docker image. No Redis, no Celery — background work runs on APScheduler with a Postgres advisory-lock leader. Two containers total.
Nothing. It's free and open source. If it saves your team time, a Ko-fi or a GitHub ⭐ is the best way to say thanks.