All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Compressed the public front door again so the first screen keeps the product center on
messy long context -> structured insight -> inspectable outcomes, while leaving MCP, starter bundles, distribution, and promotion surfaces in the second ring. - Clarified the docs/front-door routing so
README -> quickstart -> proofis the shortest honest evaluation order, and promotion/status pages stop competing with the first product read. - Split CI governance more cleanly into
pre-commit / pre-push / hosted / nightly / manual, moved lingering weekly maintenance language to nightly, and made the default local pre-push rehearsal path fast by default while keepingfullas the stricter opt-in path. - Refreshed the active task-board and required-check snapshots with 2026-04-07 live truth so older same-day release/homepage claims no longer masquerade as current state.
- Raised the managed Python security floor by pinning
pillow>=12.1.1,<13throughtool.uv.override-dependencies, narrowed uv lock resolution to the current Linux/macOS support surface, and refreshed bothuv.lockfiles so the in-repo dependency graph no longer requires the vulnerablepillow < 12.1.1line for active supported environments. - Added repo-owned security/governance workflows for GitHub Dependency Review, Trivy, TruffleHog, and a scoped Zizmor lane, while refreshing the pinned GitHub Actions dependency SHAs for checkout, setup-node, setup-python, github-script, artifact transfer, Docker Buildx/build-push, and the Claude Code action.
- Hardened the composite Python bootstrap action against template-injection by parsing
sync-argsthrough a shell-safe argv bridge instead of interpolating raw workflow input directly into therun_uv_managed.shcommand line. - Converted the stale public-distribution task-board snapshot into an explicitly non-authoritative historical artifact by recording the 2026-04-06 closeout addendum:
main/origin/main = 9d2a4a6,open PRs = 20,draft releases = [],open_graph_image_url = null,open code/secret scanning alerts = 0, and the two activepillowDependabot alerts targeted in this wave. - Added an explicit Dependabot ignore ledger for the currently unlandable
apps/webandevals/promptfooupdate wave so unsupported or unverified package bumps stop reopening as if they were silently accepted. - Aligned the app root first door with the documented source-first product path by redirecting
/to/sourcesinstead of the notebook lane, so first-run entry now matches the repo's long-context collection story. - Hardened local runtime host-process safety with fail-closed PID-record handling in the
start_*_local.shentrypoints, a new host-process safety CI/runtime gate, and contract coverage that forbids broad kill/desktop-automation primitives in tracked repo automation. - Required an explicit
PROVENOTE_ALLOW_DETACHED_CHROME_LAUNCH=1operator override before detached repo-owned Chrome launches can start from the real-profile helper, keeping manual browser control inside an ownership-first boundary. - Tightened the tracked OpenClaw example-bundle skills so they preserve the same read-first validation loop and non-public-boundary wording as the repo-local
provenote-mcp-outcome-workflowsskill, instead of drifting into over-broad compatibility claims. - Removed the broken
cache-to: type=ghaexport path from bothDevelopment BuildandBuild and Release; those workflows still read from shared GHA cache scopes, but no longer let optional cache export turn a successfully built GHCR image into a red build. - Aligned the frontend test toolchain after the
@vitest/uibump by movingvitest,@vitest/coverage-istanbul, and@vitest/coverage-v8onto the same4.1.2family so fresh installs stop failing peer resolution. - Refreshed the frontend dependency surface with
@tailwindcss/postcss 4.2.2andlucide-react 1.7.0, while replacing the removed YouTube icon export inSourceContentTabwith a stable play glyph so the existing content flow keeps rendering. - Fixed the Cursor-style host bundle contract test so it now checks the bundle command file as a tracked, non-ignored Git path instead of relying on
git status --untracked-files=allfor a clean tracked file. - Refreshed the closeout truth artifacts so the active plan/task-board layer no longer claims older same-day SHA snapshots or a zero-open-PR state that no longer matches live GitHub truth.
- Clarified the ecosystem truth boundary across the public docs surface so host guides, the first-party CLI, public-skills non-claims, OpenClaw defer status, plugin/marketplace non-claims, and owner-only external actions stay in separate buckets.
- Tightened front-door audience routing across the README, proof page, and quickstart so messy-context, research, coding-agent, operator, and readiness readers can reach the right proof path without mistaking host pages for the product center.
- Refreshed the public status and brand/domain boundary pages with the current external-window framing: repo metadata can be ready before release publication, domain moves, trademark decisions, listings, or partnership actions happen.
- Hardened the outcome client typing surface and the MCP
research_thread.createtyped envelope so runtime type gates pass without changing the current outcome-lane behavior. - Fixed the runtime lint gate so template-only directories no longer get misclassified as Python source roots during
pre_commit_lint.sh --mode runtime. - Added a strict-health option to
provenote status --jsonso operator and agent workflows can fail fast when the local/healthprobe is down instead of only printing a degraded payload. - Brought the Claude Code, Codex, and Cursor integration pages up to the same repo-backed proof-loop standard as the OpenCode page, so host compatibility can be verified from repo-owned entrypoints and tests instead of resting on thin setup copy alone.
- Aligned both Docker runtime build paths with the app-local frontend artifact contract, so
ops/docker/Dockerfileandops/docker/Dockerfile.singlenow copy.runtime-cache/build/next/standaloneand.runtime-cache/build/next/staticinstead of stale.nextassumptions. - Added tracked Claude Code, Codex, Cursor, and OpenCode starter bundles under
examples/hosts/, added a dedicated OpenClaw local proof/prep page, and tightened the OpenClaw-compatible bundle family so local install artifacts, skills, and MCP config stay repo-owned without drifting into plugin-store or marketplace claims. - Hardened registry-auth and release-proof truth around the host bundle and image lanes: release proof now checks explicit GHCR auth linkage, and
Development Builddegrades honestly when GHCR push access is unavailable instead of turning a successful build into a misleading red publish failure. - Surfaced the tracked host starter bundles from the public front door so developers can reach repo-owned copy/install artifacts directly from the README instead of discovering them only through deeper docs.
- Fixed the Gemini startup probe so SDK-thrown model-404 errors now normalize into the existing fallback semantics instead of crashing startup before the stable fast-path probe can continue.
- Added a host-example landing guard for the Cursor bundle so
.cursor/commands/provenote-mcp-outcome-workflows.mdstays visible to Git and contract tests instead of being silently swallowed by the root.gitignore.cursor/rule.
- Finalized the local-to-remote closeout wave: the queue-burst rollout now converges as a source-grounded knowledge-work control tower with synchronized README, docs index, project-status, proof, and compatibility surfaces.
- Promoted the previously local-only closeout truth to committed and pushed
main, including the authoritative version-grade handoff package and refreshed task board / closeout artifacts. - Completed the high-value journey i18n convergence pass: interpolated notebook/source/research journey strings now flow through the shared locale contract, test translation mocks resolve placeholders correctly, and the main journey frontend suites are green again.
- Kept API, MCP, generated client, and builder-facing wording aligned under the same product truth: first-party MCP remains the integration surface, not the brand center, and current public wording stays compatibility-first without official-partnership overclaim.
- Refreshed cleanup evidence with a new audit/apply/recheck pass, including repo-local runtime/cache hygiene, machine-cache cleanup, and final
__pycache__removal while preserving protected local state.
- The release workflow now refuses to publish a release event from an out-of-date tag SHA and only uploads release-proof artifacts when the corresponding image build actually succeeds, reducing noisy false downstream failures in
Build and Release. - Release publication semantics are now split cleanly: the real image publication path stays on
workflow_dispatchfrom the trustedmainhead, while thereleaseevent only verifies that a same-SHA successful manual build already exists before allowing the public release page wave to pass. - Current fork drift governance now uses a refreshed
live_git_truthsample with direct repo-side validation, and no-merge-base topology is now treated as a first-class selective-port reality instead of an ordinary merge/rebase drift story. - Public-facing repository wording now describes the current path as a repo-documented local proof loop rather than a one-minute hosted trial, and release visibility is explicitly separated from release health in repo-tracked public surface snapshots.
- Active runtime source and prompt defaults now keep English-only canonical behavior, with a dedicated runtime English boundary gate and contract test wired into the deterministic CI path.
- The tracked public asset pool is now explicitly guarded in CI, and the broken quick-result storyboard GIF has been removed from the repository asset surface.
- This release tag captured the first governance closeout wave but did not become the final clean public release proof because its release-event build was published before the new same-SHA timing model had been fully exercised.
- Public-facing repository narrative was rewritten around a product-first Provenote identity: the README now leads with result path, proof map, why-star framing, and layered docs entrypoints instead of opening with governance-heavy boundary language.
- Public docs were reorganized for first-time visitors:
docs/index.mdnow routes by user goal, and newdocs/quickstart.md,docs/proof.md, anddocs/faq.mdprovide evaluation, onboarding, and public-proof entry surfaces. - Public visual assets were added for GitHub-native growth and sharing, including a hero visual, proof-stack visual, architecture visual, and a social preview image under
docs/assets/. - GitHub growth surfaces were tightened around Provenote's current public identity, including repository description/topics/discussions strategy, release-note category configuration, and discussion-first support routing in the issue chooser.
- Auto-assign model policy now tolerates provider naming aliases (for example
gemini-3-flash-previewvsgemini-3.0-flash) inservices/services/api/routers/models.py, and related API regression tests were aligned with current fail-closed idempotency and source-processing error semantics to keep local preflight deterministic. - UIUX gate hardening for shared self-hosted runners: Playwright browser install now retries with backoff in
.github/workflows/uiux-gemini-gate.ymlto tolerate transient apt lock contention (/var/lib/apt/lists/lock) under concurrent CI load. - UIUX visual baseline stability calibration: increased
maxDiffPixelsfor Chromium snapshots insearch/settings/sourcesE2E visual-baseline tests while keepingmaxDiffPixelRatio=0.03, reducing cross-runner rendering false negatives without relaxing ratio-based strictness. - Playwright CI artifact policy tightened for self-hosted disk stability: screenshot capture is now
only-on-failure(instead ofon) while keeping trace/video retry evidence, reducing ENOSPC risk without weakening failure diagnostics. - Backend coverage merge reliability: normalized cross-runner coverage path handling via
tool.coverage.run.relative_files+tool.coverage.pathsand made test/merge steps explicitly usepyproject.tomlcoverage config, fixingNo source for codefailures inTestsworkflow coverage aggregation. - Mutation profile config cleanup: removed three intermediate
mutants/tests/test_mutation_survivor_killers.pyinjections frompyproject.toml; runtime survivor-killer selection now stays script-driven viatests/test_mutation_survivor_killers_runtime.py. - Mutation profile execution now uses repo-relative survivor-killer test selection (
mutants/tests/test_mutation_survivor_killers.py) instead of runtime-generated absolute temp paths, fixing mutmut collect failures on workspaces whose absolute path includes[]. - Frontend UI accessibility hardening: clickable notebook/source cards are now keyboard-activatable (Enter/Space) with explicit interactive semantics, source card status/progress colors now follow theme tokens, and Playwright a11y gate now scans
/notebooks,/sources,/settingsin both light and dark themes. - CI queue-pressure optimization:
Pre-commitnow runs onpushonly formain(while still running onpull_request),Claude Codeinteraction workflow runs onubuntu-latest, heavy execution lanes are pinned toe2-core, and build workflows (Development Build,Build and Release) enforce workflow-level concurrency to prevent redundant queued runs. - Additional queue hardening: maintenance/control workflows (
JSCPD Duplication Check,Pre-commit Outdated Check,Upstream Drift Check,Claude Code Review,UIUX Auto Remediation) are now hosted-only with explicit workflow-level concurrency to preservee2-coreslots for heavy trusted lanes. - Build acceleration hardening:
Development BuildandBuild and Releaseswitched Docker Buildx cache from local filesystem cache to sharedtype=ghascopes, improving cache reuse across self-hosted runners while preserving existing release/quality gates. - Billing-fallback routing: when GitHub-hosted jobs are unavailable due billing limits, PR gate workflows (
Pre-commit,JSCPD Duplication Check,Upstream Drift Check,Claude Code Review,Auditable Quality Gate, andTests) now execute onself-hosted,e2-coreto prevent immediate startup failures. - CI reliability hardening on self-hosted:
Pre-commitnow auto-cleans corrupted cache and retries once, heavy change-detection workflows explicitly grantpull-requests: readfordorny/paths-filter, andClaude Code Reviewis gated byvars.CLAUDE_CODE_REVIEW_ENABLEDto avoid failing when the review token is not configured. - Drift governance scope update:
Upstream Drift Checkis now manual-only (workflow_dispatch) so selective-port review stays available without turning everymainmerge into a predictable red maintenance lane. - Release-proof GHCR auth fix:
tooling/scripts/ci/export_oci_evidence.pynow uses workflow-provided GHCR credentials when available, so same-SHA witness export no longer depends on anonymous GHCR pulls when the repository-scoped package remains private. - Development Build shared-runner hardening: privileged disk cleanup now degrades to best-effort when passwordless
sudois unavailable, and build jobs use isolated Docker config state so macOS keychain prompts do not break Buildx bootstrap before dev image publication even starts. - Single-container release fix:
ops/docker/Dockerfile.singlenow uses a Docker-compatible frontend stage name (apps-web-builder), unblocking the single-image build path used by bothDevelopment BuildandBuild and Release. - UIUX gate stability hardening: accessibility E2E now tolerates long-running route hydration in CI (
domcontentloaded+ boundednetworkidlewait), and visual thresholds were calibrated for self-hosted Chromium variance without relaxing ratio guardrails. - Self-hosted resilience hardening:
UIUX Gemini Gatenow performs bounded runner disk hygiene before E2E (_diag/_tempretention cleanup + stale report cleanup) and prints disk telemetry to prevent "No space left on device" runner crashes. - Automatic hosted fallback switch: hosted maintenance workflows (
Pre-commit Outdated Check,UIUX Auto Remediation,Claude Code) now supportHOSTED_FALLBACK_TO_E2_CORE; a new self-hosted workflow (Hosted Runner Fallback Autoswitch) detects hosted quota/billing pickup failures, enables fallback, and reruns failed jobs one2-core. - Spot burst control for heavy lanes: heavy CI jobs now support
CI_HEAVY_USE_SPOT; enabling it routes mutation/E2E/live-integration heavy tasks toself-hosted,e2-core,spot, keeping default behavior stable while unlocking burst capacity when spot runners are available. - Funnel routing hardening: lightweight CI control lanes now default to
ubuntu-latestwith variable-driven autoswitch fallback (HOSTED_FALLBACK_TO_E2_CORE) while heavy lanes remain self-hosted-only (e2-core/spot) for deterministic throughput. - Fallback lane isolation hardening: hosted-fallback jobs now target
self-hosted,e2-core-dedicated(core-only) instead of broade2-core, preventing lightweight fallback traffic from stealingspotburst slots reserved for heavy CI lanes. - Strict key/env fail-fast gate: added
tooling/tooling/scripts/ci/check_required_ci_env.shand wired it into critical workflows (Pre-commit,JSCPD,Tests,Auditable Quality Gate,UIUX Gemini Gate) so missing/placeholderGEMINI_API_KEYorOPEN_NOTEBOOK_ENCRYPTION_KEYfails CI immediately with no bypass path. - Local resource policy update: pre-push hook set is slimmed to fast governance checks; heavy static/runtime audits are CI-enforced to keep developer machines responsive without relaxing merge gates.
- Pre-commit load rebalancing: expensive governance scans (
test-smells,python test-smells, live static audit, env/secret governance, navigation docs pair, Gemini UIUX semantic audit, workflow-policy contract tests) were moved frompre-committopre-push, keeping commit-time feedback fast while preserving strict push/CI enforcement. - Workflow policy hardening (
tooling/tooling/scripts/ci/check_workflow_policy.py): now additionally enforces strict env gate wiring (check_required_ci_env.sh+ both required secrets) and codified runner routing contracts for hosted fallback lanes vs heavy self-hosted/spot lanes. - Live workflow secret parity:
live-integration.ymlnow uses the same strict required-secret validator (check_required_ci_env.sh) as other critical workflows instead of a simple non-empty key check. - Heavy runner routing parity:
Testsbackend shards/frontend coverage andAuditable Quality Gateeval/property jobs now supportCI_HEAVY_USE_SPOT(self-hosted,e2-core,spot) with stable fallback toself-hosted,e2-core. - Heavy lane routing consistency:
test.ymlproperty-testsnow also supportsCI_HEAVY_USE_SPOT, and workflow policy contracts were updated accordingly to keep heavy lanes uniformly spot-capable. - Local hook cost trimming:
gemini-uiux-audit-pre-commitis moved tomanualstage (optional local execution), while strict UIUX quality gate remains mandatory in CI workflow.
- Embedding large documents (3MB+) fails with 413 Payload Too Large (#594)
generate_embeddings()now batches texts in groups of 50 with per-batch retry, preventing provider payload limits from being exceeded- 413 errors now classified with user-friendly message in error classifier
- Misleading "Created 0 embedded chunks" log in
process_source_command— embedding is fire-and-forget, so the count was always 0; now logs "embedding submitted" instead
- Retry button for failed podcast episodes in the UI (#211, #218)
- Error details displayed on failed podcast episodes (#185, #355)
POST /podcasts/episodes/{id}/retryAPI endpoint for re-submitting failed episodeserror_messagefield in podcast episode API responses
- Podcast generation failures now correctly marked as "failed" instead of "completed" (#300, #335)
- Disabled automatic retries for podcast generation to prevent duplicate episode records (#302)
- Bump podcast-creator to >= 0.11.2
- Bump esperanto to >= 2.19.4
- Error classification utility that maps LLM provider errors to user-friendly messages (#506)
- Global exception handlers in FastAPI for all custom exception types with proper HTTP status codes
getApiErrorMessage()frontend helper that falls back to backend messages when no i18n mapping exists
- LLM errors (invalid API key, wrong model, rate limits) now show descriptive messages instead of "An unexpected error occurred" (#590)
- SSE streaming error events in source chat and ask hooks were swallowed by inner JSON parse catch blocks
- Transformation execution errors were caught and re-wrapped as generic 500s instead of using proper status codes
- Fail fast when source content extraction returns empty instead of retrying (#589)
- Chat input and message overflow with long unbroken strings (#588)
- Word-wrap overflow in source cards, note editor, inline edit, note titles, and dialog content (#588)
- Translation proxy shadowing
namekeys (#588) - OpenAI-compatible provider name handling via Esperanto update (#583)
ValueErrorreplaced withConfigurationErrorin model provisioning for proper error classificationConfigurationErroradded to command retrystop_onlists to avoid retrying permanent config failures
- Bump esperanto to 2.19.3 (#583)
- Bump podcast-creator to 0.9.1
- French (fr-FR) language support (#581)
- CI test workflow and improved i18n validation (#580)
- Expose embed
command_idin note API responses (#545)
- ElevenLabs TTS credential passthrough via Esperanto update (#578)
- Handle empty/whitespace source content without retry loop (#576)
- Increase transformation
max_tokensand update Esperanto dep (#568) - Turn the embedding field into optional (#557)
- Fix docker container names in local setup guides (#577)
- Bump langchain-core from 1.2.7 to 1.2.11 (#564)
- Bump cryptography from 46.0.3 to 46.0.5 (#563)
-
Credential-Based Provider Management (#477)
- New Settings → API Keys page for managing AI provider credentials via the UI
- Support for 14 providers: OpenAI, Anthropic, Google, Groq, Mistral, DeepSeek, xAI, OpenRouter, Voyage AI, ElevenLabs, Ollama, Azure OpenAI, OpenAI-Compatible, and Vertex AI
- Secure storage of API keys in SurrealDB with field-level encryption (Fernet AES-128-CBC + HMAC-SHA256)
- One-click connection testing, model discovery, and model registration per credential
- Migration tool to import existing environment variable keys into the credential system
- Azure OpenAI support with service-specific endpoints (LLM, Embedding, STT, TTS)
- OpenAI-Compatible support with per-service URL configurations
- Vertex AI support with project, location, and credentials path
- Environment variable API keys deprecated in favor of Settings UI
-
Security Enhancements
- Docker secrets support via
_FILEsuffix pattern (e.g.,OPEN_NOTEBOOK_PASSWORD_FILE) - Default encryption key derived from "0p3n-N0t3b0ok" for easy setup (change in production!)
- Default password "open-notebook-change-me" for out-of-box experience (change in production!)
- URL validation for SSRF protection - blocks private IPs and localhost (except for Ollama which runs locally)
- Security warnings logged when using default credentials
- Docker secrets support via
-
HTML clipboard detection for text sources (#426)
- When pasting content, automatically detects HTML format (e.g., from Word, web pages)
- Shows info message when HTML is detected, informing user it will be converted to Markdown
- Preserves formatting that would be lost with plain text paste
- Bump content-core to 0.11.0 for HTML to Markdown conversion support
-
Improved Getting Started Experience
- Simplified docker-compose.yml in repository root (single official file)
- Added examples/ folder with ready-made configurations:
docker-compose-ollama.yml- Local AI with Ollamadocker-compose-speaches.yml- Local TTS/STT with Speachesdocker-compose-full-local.yml- 100% local setup (Ollama + Speaches)
- Inline quick start in README (no need to navigate to docs)
- Cross-references between docker-compose examples and documentation
- .env.example template with all configuration options
- Azure form race condition: all configuration now saved in single atomic request
- Migration API "error error" display: added proper MigrationResult model with message field
- Connection tester for Ollama providers: improved error handling and URL validation
- SqliteSaver async compatibility issues in chat system (#509, #525, #538)
- Re-embedding failures with empty content (#513, #515)
- Deletion cascade for notes and sources (#77)
- YouTube content availability issues (#494)
- Large document embedding errors (#489)
- API keys are encrypted at rest using Fernet symmetric encryption
- Keys are never returned to the frontend, only configuration status
- SSRF protection prevents internal network access via URL validation
- Complete documentation update for credential-based system across 25 files
- All quick-start, installation, and configuration guides now use Settings UI workflow
- Environment variable API key instructions moved to deprecated/legacy sections
- Fixed broken links in installation docs
- Added comprehensive examples/ folder with documented docker-compose configurations
- Updated local-tts.md and local-stt.md with links to ready-made examples
- Added Russian (ru-RU) language support (#524)
- Added Italian (it-IT) language support (#508)
- Connection error with llama.cpp and OpenAI-compatible providers (#465)
- Bump Esperanto to 2.17.2 which fixes LangChain connection errors caused by garbage collection
- "Failed to send message" error with unhelpful logs when chat model is not configured (#358)
- Added detailed error logging with model selection context and full traceback
- Improved error messages to guide users to Settings → Models
- Added warnings when default models are not configured
- Ollama troubleshooting: Added "Model Name Configuration" section emphasizing exact model names from
ollama list - Added troubleshooting entry for "Failed to send message" error with step-by-step solutions
- Updated AI Chat Issues documentation with model configuration guidance
- Content-type aware text chunking with automatic HTML, Markdown, and plain text detection (#350, #142)
- Unified embedding generation with mean pooling for large content that exceeds model context limits
- Dedicated embedding commands:
embed_note,embed_insight,embed_source - New utility modules:
chunking.pyandembedding.pyinpackages/core/utils/ - Japanese (ja-JP) language support (#450)
- Embedding is now fire-and-forget: domain models submit embedding commands asynchronously after save
rebuild_embeddings_commandnow delegates to individual embed_* commands instead of inline processing- Chunk size reduced to 1500 characters for better compatibility with Ollama embedding models
- Bump Esperanto to 2.16 for increased Ollama context window support
- Legacy embedding commands:
embed_single_item_command,embed_chunk_command,vectorize_source_command needs_embedding()andget_embedding_content()methods from domain modelssplit_text()function from text_utils (replaced bychunk_text()in chunking module)
- Embedding failures when content exceeds model context limits (#350, #142)
- Empty note titles when saving from chat (clean thinking tags from prompt graph output)
- Orphaned embedding/insight records when deleting sources (cascade delete)
- Search results crash with null parent_id (defensive frontend check)
- Database migration 10 cleans up existing orphaned records
- Improved source listing speed by 20-30x (#436, closes #351)
- Added database indexes on
sourcefield forsource_insightandsource_embeddingtables - Use SurrealDB
FETCHclause for command status instead of N async calls
- Added database indexes on
- Podcast dialog infinite loop error caused by excessive translation Proxy accesses in loops
- Podcast dialog UI freezing when typing episode name or additional instructions
- Removed incorrect translation keys for user-defined episode profiles (user content should not be translated)
- Internationalization (i18n) support with Chinese (Simplified and Traditional) translations (#371, closes #344, #349, #360)
- Frontend test infrastructure with Vitest (#371)
- Language toggle component for switching UI language (#371)
- Date localization using date-fns locales (#371)
- Error message translation system (#371)
- Accessibility improvements: added missing
id,name, andautoCompleteattributes to form inputs (#371) - Added
DialogDescriptionto dialogs for Radix UI accessibility compliance (#371) - Fixed "Collapsible is changing from uncontrolled to controlled" warning in SettingsForm (#371)
- Fixed lint command for Next.js 16 compatibility (
eslintinstead ofnext lint)
- Dockerfile optimizations: better layer caching,
--no-install-recommendsfor smaller images (#371) - Dockerfile.single refactored into 3 separate build stages for better caching (#371)
- CTA button to empty state notebook list for better onboarding (#408)
- Offline deployment support for Docker containers (#414)
- Large file uploads (>10MB) by upgrading to Next.js 16 (#423)
- Orphaned uploaded files when sources are removed (#421)
- Broken documentation links to ai-providers.md (#419)
- ZIP support indication removed from UI (#418)
- Duplicate Claude Code workflow runs on PRs (#417)
- Claude Code review workflow now runs on PRs from forks (#416)
- Upgraded Next.js from 15.4.10 to 16.1.1 (#423)
- Upgraded React from 19.1.0 to 19.2.3 (#423)
- Renamed
middleware.tstoproxy.tsfor Next.js 16 compatibility (#423)
- next: 15.4.10 → 16.1.1
- react: 19.1.0 → 19.2.3
- react-dom: 19.1.0 → 19.2.3
- Infinite scroll for notebook sources - no more 50 source limit (#325)
- Markdown table rendering in chat responses, search results, and insights (#325)
- Timeout errors with Ollama and local LLMs - increased to 10 minutes (#325)
- "Unable to Connect to API Server" on Docker startup - frontend now waits for API health check (#325, #315)
- SSL issues with langchain (#274)
- Query key consistency for source mutations to properly refresh infinite scroll (#325)
- Docker compose start-all flow (#323)
- Timeout configuration now uses granular httpx.Timeout (short connect, long read) (#325)
- Updated next.js to 15.4.10
- Updated httpx to >=0.27.0 for SSL fix