# DevPlace Changelog — Last 24 Hours ## AI Gateway — Non-OpenAI Upstreams & Client Model Passthrough The AI gateway now supports routing to non-OpenAI upstream providers. The gateway can target any compatible API endpoint, and client-specified model names are passed through to the upstream instead of being forced to a fixed model. This opens the door for self-hosted providers and alternative APIs. **Files:** `services/openai_gateway/gateway.py`, `service.py`, `thinking.py`, `vision.py` ## AI Gateway — Trust Only Upstream X-Gateway-Model Header The gateway now trusts only the `X-Gateway-Model` header from the upstream response when determining which model served a request. This prevents spoofing and ensures usage attribution is accurate. **Files:** `services/openai_gateway/gateway.py`, `usage.py` ## Backup Service — Remote Offload to Hetzner Storage Box Completed backups can now be automatically offloaded to a remote Hetzner Storage Box. The offload module handles the transfer, and the backup service orchestrates the full lifecycle: create, verify, offload, and prune. **Files:** `services/backup/offload.py`, `service.py`, `store.py` ## Container Manager — Orphan Blob Fix & System Prune Fixed container sync races that leaked orphan blobs (files on disk with no database reference). Added a new `devplace system prune` CLI command that safely removes orphan blobs, sweeps unreferenced container workspace dirs, and prunes expired fork/zip job rows. The command supports `--dry-run` for preview. **Files:** `cli/system.py`, `services/containers/store.py`, `attachments.py`, `project_files.py` ## Container Manager — Two-Phase Plan/Execute Report The `system prune` CLI command now uses a two-phase plan/execute report: first it shows what would be deleted (plan), then executes and reports what was actually removed. **Files:** `cli/system.py`, `cli/containers.py` ## Post Page — Happy 404, Featured/Related Sidebars, Next-Post Nav The post page now includes: - A "Happy 404" page for missing posts - Featured posts sidebar - Related posts sidebar - Next-post navigation **Files:** `happy404.py`, `routers/posts.py`, `templates/post.html`, `database/content.py` ## Static Asset Cache-Busting — Unified with Auto-Bumped App Version Static asset URLs now use the auto-bumped app version for cache-busting instead of a separate timestamp. This ensures assets are invalidated whenever the app version changes, and eliminates the need for manual cache-bust updates. **Files:** `config.py`, `templates/docs/static-caching.html`, `nginx/nginx.conf.template` ## Automatic Patch-Version Bumping via Git Pre-Commit Hook A new `.githooks/pre-commit` hook automatically bumps the patch version in `pyproject.toml` on every commit. The hook increments patch (e.g. `1.0.0` → `1.0.1`) and stages the change. A hand-set major/minor bump in the same commit is left untouched. The hook defers during merges and never blocks a commit. **Files:** `.githooks/pre-commit`, `Makefile`, `CLAUDE.md` ## Test Infrastructure — Shared `run_async` Helper Provision tests now use the shared `run_async` test helper instead of bare `asyncio.run` calls, improving consistency and error handling across the test suite. **Files:** `tests/unit/services/containers/workspace/provision.py` ## Documentation Updates - Updated `README.md` with new feature documentation - Updated `CLAUDE.md` with new CLI commands and architecture notes - Updated docs pages: production nginx, static caching, backups, architecture backend - Updated nested `CLAUDE.md` files for gateway, containers, backup, and posts subsystems --- *Generated from git log — all commits from the last 24 hours.*