v1.12.0

anomalyco/opentuiv1.12.0Jul 12, 2026by lfnovo

AI Summary

This maintainability release removes approximately 3,000 lines of dead code and enforces strict quality gates across the codebase. It improves API accuracy with new endpoints for provider discovery and live Anthropic model listing.

Key Highlights

  • ~3,000 lines of dead code removed, including legacy Streamlit-era service layer.
  • CI now enforces mypy at zero errors and production builds.
  • New GET /api/providers endpoint for provider metadata.
  • Live Anthropic model discovery replaces hardcoded lists.

Breaking Changes

  • API error codes are now accurate (422 for config, 404 for missing resources).
  • POST /api/notebooks/{id}/context endpoint was removed.
  • Upgrading from a version older than 1.6 requires draining embedding jobs.

New Features

  • Math rendering in chat steers models to emit formatted LaTeX.
  • Translations interpolate correctly in all 14 languages.
  • Podcast dialog no longer causes request storms on rapid toggling.
  • Docker images now built from a single multi-stage Dockerfile.

Full Release Notes

**We recommend all users upgrade.** v1.12.0 is a maintainability and correctness release: a full-repo cleanup (20+ focused PRs) that removed ~3,000 lines of dead code, fixed real user-facing bugs along the way, and turned on the quality gates that keep them fixed — validated end-to-end by the release test process (full suites, API+UI smoke, fresh-install and upgrade tests on the real images).

## ✨ New features

- **Live Anthropic model discovery** — "Discover models" for Anthropic credentials now queries Anthropic's models API instead of a hardcoded 2024-era list, so new Claude models appear as soon as they ship (#1070)
- **`GET /api/providers`** — new endpoint exposing provider metadata (modalities, docs, env-configured status) from a single backend registry (#1075)
- **Math rendering in chat** — prompts now steer models to emit `$$...$$`/`$...$` so formulas render via KaTeX instead of raw LaTeX code blocks (#1051)

## 🐛 Notable fixes

- **Errors now tell you what's wrong**: a missing/misconfigured model returns a clear 422 with guidance (and not-found resources a 404) instead of a generic "Internal Server Error" — across all API routes (#1078)
- **Translations interpolate correctly in all 14 languages**: counters, names and plurals no longer risk showing literal `{count}`/`{name}` placeholders; eight podcast toasts that always showed `{name}` are fixed (#1074, #1077)
- **Podcast dialog**: rapid source toggling no longer causes a request storm with flickering token counts, and the dialog closes deterministically after the episode list refreshes (#1067)

## 🧹 Code health (why this release exists)

- ~3,000 lines of dead code removed, including the entire leftover Streamlit-era service layer (#1053, #1054, #1056)
- CI now gates every PR on ruff, ESLint, the frontend production build **and mypy at zero errors** (was: 197 baseline errors, not enforced) (#1062, #1068, #1076)
- One provider registry drives env config, modalities, connection tests and discovery — adding a provider went from ~6 hand-synced locations to 2, both test-enforced (#1075)
- Heavy copy-paste deduplicated across the chat routers, sources router, embedding commands and model discovery (#1069–#1072)
- Both Docker images are now built from a single multi-stage `Dockerfile`, eliminating drift between the regular and single-container variants — published image names and tags are unchanged (#1066)
- Dependency diet: unused `langchain-community` and `langchain-deepseek` removed, upper bounds on the langchain family, and an undeclared transitive dependency made explicit (#1073)

## ⚠️ Behavior changes for self-hosters

1. **API error codes are now accurate** — if you script against the API and matched on `500` for configuration mistakes, update your handling: configuration errors return `422`, missing resources `404`, provider rate limits `429`, upstream provider failures `502` (#1078).
2. **`POST /api/notebooks/{id}/context` was removed** — it duplicated `POST /api/chat/context` and had no known callers. If you used it, switch to `POST /api/chat/context` with body `{notebook_id, context_config}` (#1079).
3. **Upgrading from a version older than 1.6** with embedding jobs still queued: drain the queue on a 1.x release before upgrading past this version — the pre-1.6 job compatibility shims were removed (#1056).

## 🙏 Thanks

This cycle was a focused maintenance sprint by the core team, but it stands on the community's shoulders: thank you to everyone who reported the issues that shaped the cleanup backlog and the release checklist — your reports are what turned a "refactor" into a list of real bugs to fix. Special mention to the contributors whose earlier security work (#1042, #1046, #1049) set the quality bar this release enforces in CI.

Full details in the [CHANGELOG](https://github.com/lfnovo/open-notebook/blob/main/CHANGELOG.md).