- Rewrite README.md to reflect the current service: quick-start links, OpenAI-compatible chat endpoint, updated tech stack, funding, docs, contributing and license sections.
- Replace the long FAQ.md with a pointer to aihorde.net/faq. Shrink README_StableHorde.md and README_KoboldAIHorde.md to short pointers to the website and main readme. Add a private-horde intro to README_docker.md.
- Remove the now-unused FAQ and GUI images (and their .license files), and update the join-the-horde and FAQ links in index_stable.md.
- The image check and status handlers keep only their outer span; the nested spans around `request_avg`, queue stats, the active-worker count and response assembly cost a span lifecycle on every poll, and the database helpers record spans for their queries
- `OTEL_INSTRUMENT_SQLALCHEMY` turns statement instrumentation off per deployment, parsed like `OTEL_INSTRUMENT_REDIS`
- The check route's debug log formats lazily
Establishes additional unit/integration testing, the CI to run it, and the runtime fixes those tests surfaced
Testing
- Add unit (ORM/function) and integration (API route) tiers over a shared dependency runtime that auto-provisions Postgres, Redis, and S3-compatible object storage (Garage) via testcontainers, with an external-deps mode.
- Add fixtures/factories plus coverage for user roles, kudos pricing, worker.can_generate, countermeasures, WP activation, and adversarial malformed-input route sweeps.
- Modularize the locust suite into locustsuite/ and add a stability-only smoke gate (check_smoke_results.py).
CI / tooling
- Rework pr/main/trusted-fork/publish workflows around composite actions (setup-test-python, start-test-stack) and a Dockerized PG+Redis+Garage stack.
- Bump the Python floor to 3.12 (+3.13 matrix) and consolidate on uv.
Runtime hardening
- Make telemetry activation opt-in (telemetry_enabled): the image stays telemetry-capable but a bare server.py is inert unless an OTLP endpoint or AI_HORDE_TELEMETRY_ENABLED is set.
- Turn NUL bytes, out-of-range user ids, and duplicate worker names into clean 4xx responses instead of session-poisoning 500s.
- Fix get_anon() to resolve the anon account by oauth_id (re-enabling the kudos-transfer guards); shrink and instrument the SQLAlchemy pool (15/5) to expose connection-hold inefficiency as pool timeouts rather than PG refusals.
Pull Horde's custom postgres image
Build aihorde Docker image in two stages to minimise rebuild time
Establish minimal necessary configuration to bring up a working composition
Fix pre-commit config so black and ruff hooks run
Catch and report exceptions in is_redis_up()
Add missing final EOL markers to some files (per black)
Update documentation