What we shipped on 2026-06-24
We finally stopped the flashing terminal windows on our desktop by wrapping DeployCheckoutSync in a VBS helper (run-hidden.vbs) to force SW_HIDE at the process level (PR #1917). It’s a classic Windows quirk–-WindowStyle Hidden isn’t enough when child processes like git.exe or python.exe decide to call SetConsoleTitle and wake up the console API.
The biggest architectural win today was folding our embedding hygiene jobs into the declarative retention_policies framework (PR #1909). We were carrying around 2,550 lines of legacy job code that we just deleted. Now, tasks like embeddings_orphan_prune and embeddings_collapse are handled by a unified runner. We added a min_interval_hours column to the policies so these heavy collapse jobs run weekly instead of every 6 hours, which is much more sane for our resource budget. To make this usable without raw SQL, we shipped a new CLI subcommand poindexter retention config to patch the JSONB configs (PR #1911), paired with five new Grafana panels in integrations-admin to track orphan pruning and collapse rates.
We also spent some time lowering the barrier for entry with a minimal Docker Compose profile targeting 8-16GB VRAM hardware (PR #1924). By stripping out the heavy operator observability stack–specifically Langfuse, GlitchTip, and the Loki/Tempo/Pyroscope trio–we dropped idle RAM usage from over 20 GB down to about 4-6 GB. We downgraded Langfuse variables to optional and forced LANGFUSE_TRACING_ENABLED: "false" so the SDK stays quiet when keys are missing.
On the bug front, we found a few leaks in our featured image flow. The replace_image service was updating pipeline_versions.featured_image_url but forgetting to sync posts.featured_image_url, meaning live sites never actually updated (PR #1918). While fixing that, we caught a silly mistake where the Pexels API key was being read via .get() instead of .get_secret(), which returned None because secrets are excluded from the in-memory cache.
A few other tight fixes:
- Added format=json to ChatOllama (PR #1914) because phi4:14b was wrapping JSON responses in markdown code fences, which crashed the Ragas output parser.
- Fixed an UndefinedColumnError in poindexter pipeline list-paused by replacing a direct table query with a correlated subquery into pipeline_versions to correctly fetch task_metadata (PR #1916).
- Resolved four mypy type errors, including a shadowing bug in _citation_match.py where an inner loop variable src was clashing with the outer source list (PR #1923).
We’re also making progress on the video front, shipping both the infra half (PR #1902) and the generative source logic (PR #1895) for the Wan 2.2 TI2V-5B hero renderer.
The system feels leaner today. Between the RAM reductions and the retirement of thousands of lines of job code, Poindexter is becoming less of a monolith and more of a tool.
Auto-compiled by Poindexter from today’s commits and PRs. See the work: github.com/Glad-Labs/poindexter.



