Conversation
fix: add missing beautifulsoup4 to backend requirements
Adds and harmonizes French translations across the entire UI: - Translate admin pages (Images, connections, models, etc.) - Harmonize API key/URL field translations - Fix "successfully" translations consistency - Add missing translations (feedback, file, model selector) - Fix typos and improve existing translations
- DOCX: mammoth converts to semantic HTML (prose preview) - XLSX: xlsx library extended to FileNav with sheet tabs at bottom - PPTX: custom canvas renderer produces PNG images per slide with panzoom zoom/pan and slide navigation Changes: - New: src/lib/utils/pptxToHtml.ts (canvas-based PPTX renderer) - FileNav.svelte: office format detection, blob download, conversion - FilePreview.svelte: office rendering branches, sheet tabs, slide viewer - FileItemModal.svelte: DOCX/PPTX preview tabs - package.json: added mammoth dependency
XLSX QoL: - Custom table renderer (excelToTable.ts) with column letters, row numbers, right-aligned numbers, empty cell handling - Monospace font, sticky headers + row nums, cell cursor - Sheet tabs moved to bottom bar (like PPTX navigation) - Unified styles between FileNav and FileItemModal Code highlighting: - Shiki-based syntax highlighting for code files in FileNav - Line numbers, dark/light theme support - Source/Preview toggle for code files
…eNav - Add Shiki-powered syntax highlighting for code files with dual light/dark themes (github-light/github-dark), line numbers, and source/preview toggle - Add native <video> player for mp4, webm, mov, ogv, avi, mkv - Add native <audio> player for mp3, wav, ogg, flac, m4a, aac, opus - New utility: src/lib/utils/codeHighlight.ts with extension-to-lang mapping using Shiki's bundled language registry
…e toggle - New JsonTreeView component with recursive collapsible nodes, auto-expand depth, and GitHub-themed dark mode colors - JSON/JSONC/JSON5 files show tree view by default, toggle to Shiki-highlighted source - SVG files show rendered preview (DOMPurify-sanitized) by default, toggle to Shiki-highlighted XML source - SVG removed from IMAGE_EXTS to enable text-based preview - YAML/TOML already covered by Shiki bundled languages
- New NotebookView component renders markdown cells (marked+DOMPurify), code cells (Shiki-highlighted with execution count gutter), and outputs (text, HTML tables, base64 images, error tracebacks) - ANSI escape codes stripped from error output - Source toggle shows raw JSON - Dark mode support throughout
* Update main.py * Update env.py * Update main.py * Update env.py
- Move refresh button out of directory-only block in FileNavToolbar - When viewing a file, refresh reloads that file's content - When in directory view, refresh reloads the listing (unchanged)
- New SqliteView component with table tabs, paginated data view (100 rows/page), SQL query editor (Cmd+Enter), NULL/BLOB formatting, sticky column headers, and dark mode - Supports .db, .sqlite, .sqlite3, .db3 extensions - Uses sql.js WASM served locally from /sql.js/sql-wasm.wasm - Also fixes display_file handling when another file is already open
…un_command Backend emits terminal events for write_file, replace_file_content, and run_command. Frontend showFileNavDir subscriber uses startsWith path matching to smartly refresh only when the event is relevant: - write_file/replace_file_content: refresh if path is in current view - run_command: always refresh (uses root '/' which matches everything) - Also adds copy-to-clipboard button and code preview full-height fix
* perf: pre-compile KaTeX Unicode regex at module load time
The katexStart() function was creating a new RegExp with Unicode
property escapes (\p{Script=Han}, \p{Script=Hiragana}, etc.) on
every invocation. Unicode property escapes are extremely expensive
to compile as the regex engine must build character class tables
covering tens of thousands of code points.
Since marked calls the start() function at every character position
while scanning source text, this meant hundreds of regex compilations
per marked.lexer() call, and lexer runs ~60 times/sec during streaming.
Profiling showed KaTeX regex consuming 87% (320ms/365ms) of total
markdown rendering time.
Changes:
- Pre-compile SURROUNDING_CHARS_REGEX once at module load time
- Use .test() instead of .match() to avoid array allocations
- Fix delimiter search to find earliest match, not last match
* perf: replace katexStart with single-pass character scan
The katexStart() function was the dominant cost in marked's lexer,
consuming 55-58% of total markdown rendering time per profiling.
It was called at every character position by marked and each call:
- Looped through 3-5 delimiters, each doing indexOf() on the full
remaining source (3-5 x O(n) string scans per call)
- Ran the complex ruleReg regex with Unicode lookaheads for validation
- On failed validation, created substrings and looped again
Replace with a single linear character scan using charCodeAt that:
- Checks only for $ (charCode 36) or backslash (charCode 92)
- Filters backslash hits by next character to avoid false positives
- Preserves the surrounding-character validation
- Returns immediately on first valid candidate
- Lets the tokenizer handle full validation (it already does this)
This reduces start() from O(n * delimiters * retries) to O(n) with
a very small constant factor per call.
* Update katex-extension.ts
- Add notebook API functions (createNotebookSession, executeNotebookCell, stopNotebookSession) - Create CellEditor component with CodeMirror for cell editing - Rewrite NotebookView with session-based execution, Run All, Restart, Stop - Kernel status indicator with tooltips - Wire baseUrl/apiKey through FilePreview and FileNav
Added and updated translations.
… (#22304)
codeHighlight.ts had a top-level static import of shiki that pulled
the entire highlighter engine (~5-10MB of JavaScript including all
language grammars) into any page that imported the module - even if
only the lightweight isCodeFile() function was used.
Replace the static shiki import with:
- A static set of ~85 common language IDs for synchronous extension
checks (isCodeFile, extToLang) - no shiki dependency needed
- A dynamic import('shiki') inside highlightCode(), which is already
async so callers are completely unaffected
The static language set covers all commonly-used file extensions.
Obscure extensions not in the set simply won't be detected by
isCodeFile() (the file still opens fine, just won't show the code
file indicator). Highlighting itself still works for all shiki
languages since the full bundle loads on demand.
…nt duplicates (#22383)
Co-Authored-By: Colin Chen <1207878+silenceroom@users.noreply.github.com>
* changelog: terminal keepalive fix * changelog: add chat archive handler fix * changelog: terminal keepalive, chat archive handler, BeautifulSoup4 dependency * changelog: button spinner, terminal keepalive, chat archive, beautifulsoup4 * changelog: group users sort, button spinner, terminal keepalive, chat archive, beautifulsoup4 * changelog: add event call timeout configuration * changelog: add general improvements and French translations * changelog: file refresh button, group sort, event timeout, translations * changelog: add office file previews support * changelog: add Open Terminal port viewing feature * changelog: add Open Terminal video previews entry * changelog: Open Terminal syntax highlighting and XLSX improvements * changelog: add JSON tree view and SVG rendering entry * changelog: add Open Terminal Jupyter Notebook previews entry * changelog: update chat performance entry to reflect broader markdown rendering improvements * changelog: add SQLite browser feature to Open Terminal * changelog: add Open Terminal file copy button entry * changelog: add Open Terminal auto-refresh entry * changelog: open terminal, mermaid, diagrams * changelog: add Open Terminal notebook cell execution entry * changelog: reorder Open Terminal entries by impact * changelog: add initial page load speed entry * changelog: opentelemetry, metrics, telemetry * changelog: fix artifacts memory leak (PR #22303) * changelog: message list performance, array operations optimization * changelog: streaming markdown performance fix * changelog: sqlcipher, stability, memory leak * changelog: chat streaming performance * changelog: fix Floating Quick Actions for unavailable models * changelog: follow-up suggestions, prompt template, JSON format * changelog: banner, navigation, homepage * changelog: api middleware, streaming performance * changelog: tts, thinking content, playback * changelog: add system metrics via OpenTelemetry * changelog: tool access permissions fix * changelog: source list performance fix * changelog: source list performance optimization * changelog: chat message tree performance, #22194 * changelog: add Finnish translations, update version date * changelog: fix parameterless tool calls during streaming * changelog: add stale pinned models cleanup fix * changelog: move performance entries from Fixed to Added section * changelog: android, photo capture, canvas * changelog: action priority query optimization (PR #22301) * changelog: move action priority query to Added section * changelog: group Open Terminal entries together * changelog: group Open Terminal entries together * changelog: move API key middleware entry to Added section * changelog: open-terminal, html-editing * changelog: web search tool guidance update * changelog: add Turkish translations to v0.8.9 * changelog: add German translations * changelog: fix stop sequence error handling * changelog: Open Terminal permission fix for issue #22374 * changelog: add Windows path fix for Open Terminal * changelog: add Simplified Chinese and Traditional Chinese to translations * changelog: fix profile image sizing in chat overview * changelog: queued messages display fix (#22176) * changelog: model list loading performance optimization * changelog: model list performance optimization update * changelog: artifacts reactive loop fix * changelog: artifact navigation fix * changelog: fix image generation in temporary chats * changelog: non-streaming token tracking, admin analytics * changelog: add citation parser error handling fix * changelog: tool server URL trailing slash fix * changelog: inline code typing fix (#20417) * changelog: variable input newlines fix * changelog: add migration memory usage fix for large deployments * changelog: Microsoft OAuth refresh token fix * changelog: add issue link to variable input newlines entry * changelog: tool files access, artifact thinking block fix * changelog: ollama, model unload, proxy fix * changelog: fix banner type dropdown requiring two clicks * changelog: move migration memory fix to top of Fixed section * changelog: fix analytics URL encoding for models with slashes * changelog: fix tool call streaming for GPT-5 models * changelog: fix analytics chat list duplicate error * changelog: pyodide file system support for code interpreter * changelog: fix folder knowledge base native tool call duplicate query * changelog: folder knowledge base native tool call fix with follow-up commit * changelog: nested folders support * changelog: update Pyodide file system entry with pip guidance
Add Chat.id as a secondary sort key to all paginated chat queries that use offset/limit pagination. When multiple chats share the same updated_at timestamp, the database does not guarantee a stable order across page boundaries, causing chats to appear on multiple pages. This produces duplicate keys in the Svelte sidebar each-block (each_key_duplicate error). Adding Chat.id as a tiebreaker ensures fully deterministic ordering. Extends the fix from #22383 (which addressed get_chat_ids_by_model_id) to all remaining paginated chat queries.
# Conflicts: # .github/pull_request_template.md # .github/workflows/build-release.yml # backend/open_webui/config.py # backend/requirements.txt # package-lock.json # package.json # src/lib/i18n/locales/ar-BH/translation.json # src/lib/i18n/locales/ar/translation.json # src/lib/i18n/locales/bg-BG/translation.json # src/lib/i18n/locales/bn-BD/translation.json # src/lib/i18n/locales/bo-TB/translation.json # src/lib/i18n/locales/bs-BA/translation.json # src/lib/i18n/locales/ca-ES/translation.json # src/lib/i18n/locales/ceb-PH/translation.json # src/lib/i18n/locales/cs-CZ/translation.json # src/lib/i18n/locales/da-DK/translation.json # src/lib/i18n/locales/de-DE/translation.json # src/lib/i18n/locales/dg-DG/translation.json # src/lib/i18n/locales/el-GR/translation.json # src/lib/i18n/locales/en-GB/translation.json # src/lib/i18n/locales/en-US/translation.json # src/lib/i18n/locales/es-ES/translation.json # src/lib/i18n/locales/et-EE/translation.json # src/lib/i18n/locales/eu-ES/translation.json # src/lib/i18n/locales/fa-IR/translation.json # src/lib/i18n/locales/fi-FI/translation.json # src/lib/i18n/locales/fr-CA/translation.json # src/lib/i18n/locales/fr-FR/translation.json # src/lib/i18n/locales/gl-ES/translation.json # src/lib/i18n/locales/he-IL/translation.json # src/lib/i18n/locales/hi-IN/translation.json # src/lib/i18n/locales/hr-HR/translation.json # src/lib/i18n/locales/hu-HU/translation.json # src/lib/i18n/locales/id-ID/translation.json # src/lib/i18n/locales/ie-GA/translation.json # src/lib/i18n/locales/it-IT/translation.json # src/lib/i18n/locales/ja-JP/translation.json # src/lib/i18n/locales/ka-GE/translation.json # src/lib/i18n/locales/kab-DZ/translation.json # src/lib/i18n/locales/ko-KR/translation.json # src/lib/i18n/locales/lt-LT/translation.json # src/lib/i18n/locales/lv-LV/translation.json # src/lib/i18n/locales/ms-MY/translation.json # src/lib/i18n/locales/nb-NO/translation.json # src/lib/i18n/locales/nl-NL/translation.json # src/lib/i18n/locales/pa-IN/translation.json # src/lib/i18n/locales/pl-PL/translation.json # src/lib/i18n/locales/pt-BR/translation.json # src/lib/i18n/locales/pt-PT/translation.json # src/lib/i18n/locales/ro-RO/translation.json # src/lib/i18n/locales/ru-RU/translation.json # src/lib/i18n/locales/sk-SK/translation.json # src/lib/i18n/locales/sr-RS/translation.json # src/lib/i18n/locales/sv-SE/translation.json # src/lib/i18n/locales/th-TH/translation.json # src/lib/i18n/locales/tk-TM/translation.json # src/lib/i18n/locales/tr-TR/translation.json # src/lib/i18n/locales/ug-CN/translation.json # src/lib/i18n/locales/uk-UA/translation.json # src/lib/i18n/locales/ur-PK/translation.json # src/lib/i18n/locales/uz-Cyrl-UZ/translation.json # src/lib/i18n/locales/uz-Latn-Uz/translation.json # src/lib/i18n/locales/vi-VN/translation.json # src/lib/i18n/locales/zh-CN/translation.json # src/lib/i18n/locales/zh-TW/translation.json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.