Changelog
LM-Kit One Changelog
Notable changes to LM-Kit One, newest first. Versions follow YYYY.M.PATCH. A version marked
"not yet published" is on the development branch and has not shipped.
2026.10.102026-10-26#
Changed
- Improved document parsing accuracy.
Fixed
- Search reindex: newly ingested documents no longer raise a false "backlog present but not draining" error after a long idle period.
- A client that drops off mid-response (connection timed out or unreachable) is logged at Debug instead of as two Kestrel errors.
2026.10.92026-10-23#
Added
POST /lmkit/v1/barcode-splitting: splits a PDF, TIFF or image batch into documents by barcodes (separator sheets, cover codes, document values).POST /lmkit/v1/barcode-reading: every barcode on the pages of a PDF, TIFF or image, with format, text and position.- MCP tools
document_split_by_barcodesanddocument_read_barcodes, and the Barcode Splitting and Reading guide. POST /lmkit/v1/document-parsing:markdown_underlineandmarkdown_underscore_emphasis.
Changed
- Admin > Models: the model memory popover shows memory composition, slot or input occupancy and the pool's shape as designed blocks, and opens at its final size.
- Embedding models: the pinned context opens at the window its inputs need and grows up to
Inference:EmbeddingContextSize(was always the full window).
Fixed
- OCR: a 1-bit page (fax or scanner TIFF) could crash the server; pages of any bit depth are now read.
- Attachment requests on a GPU short of memory no longer fail as "torn down twice" or flood the log with CUDA out-of-memory errors.
- Admin > Models: the context popover no longer names a KV cache type for a model that keeps none (embedding models).
2026.10.82026-10-20#
Added
- Usage metering on every API response: a root
usagefield on/lmkit/v1JSON bodies and theX-LMKit-Usageheader on every metered response (/lmkit/v1,/v1,/api). usagefields:operation,input(llm,vlm,ocr,layout,image,embedding,speech,training,tools),output(tokens,characters,items),partial,duration_ms,models.GET /lmkit/v1/jobs/{job_id}:usageonce the job has ended, also as theX-LMKit-Usageheader.POST /v1/chat/completionsstreamed withstream_options.include_usage:lmkit_usageon the usage chunk.- Chat, chat with documents and grounded answer streams:
usageon the terminal event. POST /lmkit/v1/file-info:usage_estimate(images,characters,audio_seconds).- Guide: Usage Metering and Billing.
- Model
embeddinggemma-2(EmbeddingGemma 2): text, code and image embeddings; Search Service catalog model 6. POST /lmkit/v1/document-parsing:markdown_scripts(HtmlTags,Latex),markdown_table_cell_emphasis,markdown_running_text,markdown_charts,markdown_task_list_markers,markdown_page_separator.
Changed
- Chat, completions, Responses, Ollama and Anthropic requests: an omitted
temperature,top_p,top_kormin_ptakes the publisher's recommended value for the mode (was a server value). POST /v1/messagesand its token count: a request withoutthinkingdoes not reason, as the Messages API defines;adaptivekeeps the model's own level.DefaultTextEmbeddingsModeldefaults toembeddinggemma-2(wasembeddinggemma-300m); a new Search Service tenant takes it. Existing tenants keep their model.DefaultImageEmbeddingsModeldefaults toembeddinggemma-2(wasnomic-embed-vision); a server that sets it keeps its value.- CUDA engine built with CUDA 13.4 (was 13.1); Linux hosts outside the container need CUDA 13.4 runtime libraries (
cuda-libraries-13-4). - Admin > Search: the tenant embedding picker lists models by family and size, and offers a replaced model (
embeddinggemma-300m) only to a tenant still using it. - Admin > Search: during an embedding model switch, the tenant row, Search setup and re-embedding progress name the new model.
Fixed
- Improved document parsing accuracy.
- Improved PII and named entity detection accuracy.
- Search Service (local cluster, or MySQL / SQL Server with Qdrant): changing a tenant's embedding model no longer interrupts semantic search; queries switch once every document is re-embedded.
presence_penalty,frequency_penaltyandrepeat_penaltyhad no effect on chat, completions and Ollama requests; they now act over the last 64 tokens.- Linux arm64: the CUDA 12 engine linked the CUDA 13 runtime libraries; it now links CUDA 12.
- Agent and chat tools with Gemma 4: a file id the model wrote unquoted (e.g.
66d6...) failed as invalid JSON; it now reaches the tool. - Server log: a chat tool that returns an error is logged as a Warning with its message.
- Search Service: a tenant re-embedding with a new model keeps its old and new embedding models loaded together; they no longer unload each other on every search and batch.
- Admin > Models: model pickers show full model names, and their list stays within the visible area.
- Admin > Search: cluster and tenant pages no longer jump while their sections load; each section opens at its final height.
- Admin > Search: a tenant page could list the collections of another tenant that was re-indexing; it now lists only its own.
2026.10.72026-10-15#
Added
- Admin > Requests: the request inspector shows where a search request's time went, stage by stage, with the costliest stage marked.
- Server log: a search taking 1 s or more is logged as a Warning with its time per stage and the document frequency of each query term.
- Admin > Requests: a semantic or hybrid search notes whether its vector retrieval scanned the scope exactly or walked the HNSW index; the vector query plan diagnostic follows the same choice.
- Admin > Search > Slow queries: names the database sessions hidden from the admin role, and the remedy.
- Admin > Search: tabs in the header; Activity is a full-width cockpit (KPIs with history, time by stage, hotspots, indexing, database now) whose details open in a side panel.
- Admin > Search > Activity > Query statistics: database time by area and the costliest statements named by what they do, with their SQL on demand.
- Admin > Server memory diagnostics: an Idle conversation states row, released by Collect LM-Kit cache.
- Office documents through the LibreOffice engine: legacy Word, Excel and PowerPoint, OpenDocument, RTF, Visio, Publisher, Apple iWork and more get thumbnails, a PDF export, and indexing, parsing and extraction.
- Admin > Settings > Engines: one card per engine (LibreOffice, FFmpeg) with a guided install, test and remove; paths and tuning under Advanced settings.
- Managed LibreOffice install, under
/lmkit/v1/admin/libreoffice/:GET status,POST download,POST test,POST libraries,DELETE managed. - Conversion cache:
LibreOffice:CacheDirectorysetting;GET libreoffice/cache/disk-usage,POST libreoffice/cache/delete-all; folder, usage and Clear cache on the LibreOffice card. - LibreOffice on Linux: the system libraries it needs are fetched from the host's package repositories and kept for LibreOffice alone, without changing the host.
- Settings:
LibreOfficePathandLMKIT_LIBREOFFICE_PATH;LibreOffice:Workers,ConversionTimeoutSeconds,IdleWorkerMinutes,RecycleAfterConversions,CacheSizeMB,WarmOnStart. GET /lmkit/v1/files/supported-extensionsandGET /lmkit/v1/document-thumbnail/supported-formats:office.POST /lmkit/v1/document-to-pdf: office formats assource_format, andrendererin the response.- Error codes
office_runtime_unavailable,encrypted_document,conversion_timeout,conversion_failed. - Guide: Office Documents and LibreOffice.
- Playground > Parse > Markdown:
Renderedshows the whole document's Markdown in the document viewer, tables with their spans included;Sourcekeeps each element's Markdown. - Search access levels: a tenant grant is Read, Write or Manage, over every collection or a chosen few; existing grants stay Manage over every collection.
- Admin
POST clusters/search/{clusterId}/tenants/{tenantId}/access:roleandcollectionIds;GET: each key'srole,collectionScope,grantedAt,grantedBy, and the tenant'scollections. - Admin
POST apikeys:tenantGrants, written with the key in one request. AdminPOST clusters/search/{clusterId}/tenants:grantRole. - Admin
GET access/search(every grant, for the overview and its CSV export) andGET access/search/explain(the access checker). GET /lmkit/v1/search/collections:access. Tenant responses:access,collection_scope.- Admin > Access > Search access: grants by key or by tenant, CSV export, and Check access, which walks the gates and opens the fix.
- Guide: Access Model covers levels, collection scope and the access tools.
Changed
POST /lmkit/v1/search/search: full-text facets count the ranked pool, like the other search types;facets_exactis false when the pool was truncated.- Dashboard > Loaded models: a model is listed from the moment it is requested, with its phase (downloading, waiting to load, loading) and a progress bar, instead of only once resident.
- Chat, agent and compatibility requests with no reasoning level follow the model's default (the default chat model now thinks first);
reasoning_effort: "none"or its surface equivalent answers directly. POST /lmkit/v1/chat-with-document: answers without a reasoning phase by default.DefaultVisionOcrModeldefaults tolightonocr-3:0.8b(waslightonocr-2:1b).- Admin: FFmpeg Path moved from Settings > General to Settings > Engines.
POST /lmkit/v1/document-to-pdf: Word documents are laid out by LibreOffice when it is installed.- Container image: LibreOffice inside (the release Settings > Engines installs), with every library it links; office formats work with nothing to install.
- Read-only API keys may call Search retrieval (
search,documents/list,documents/get,documents/similar); query modes other thanOriginalstay refused. - Admin: the create-key dialog, a key's Search access and a tenant's Access section share one grant editor; a key's cluster access applies on each change.
- Admin: toasts no longer move one another as they appear and leave.
- Admin: API keys, clusters, tenants and collections each carry one icon wherever their name appears, selects included.
Fixed
- Faster full-text and hybrid search on large tenants, notably for questions written in natural language; results are unchanged.
- Faster semantic and hybrid search scoped to a few collections of a large tenant; such searches now return the exact nearest passages.
- Full-text and hybrid search no longer time out (HTTP 500 after 30 s) on questions of moderately common words over many collections.
- Faster search result assembly (titles, snippets, proximity, context expansion) and similar-document page counts on large tenants.
- Lower background database load from the embedding backlog checks, the telemetry backlog counters and the document-centroid self-heal.
- Search clusters on PostgreSQL keep their full-text tables vacuumed: the server vacuums one due partition at a time and sets proportionate autovacuum thresholds, so searches stay fast once the data is out of cache.
- Admin > Search > Slow queries: search queries run by the data-plane role are captured; the admin role is granted that role at startup.
- Search cluster setup: the data-plane role gets its password when the admin role lacks
BYPASSRLS. - Linux:
dotnet-trace,dotnet-countersanddotnet-gcdumpattach to the server again; the process is listed under its own name instead ofexe. - Admin > Telemetry: GC counters read their current total, not the sum of every poll; per-generation heap sizes read as the whole heap; up-down counters read their current level.
- Server memory no longer grows over hours of traffic until the host runs out: the memory kept for idle conversations is one budget for the whole server, shared by every model and task.
- JPEG files whose scan header carries nonstandard spectral parameters are read instead of failing.
- An image that cannot be decoded answers HTTP 415 with error code
invalid_image, instead of 500. - Multi-GPU with distributed inference: a model that fits one GPU but not with its context window is spread over the GPUs at load, instead of its window being halved.
- Admin > Settings > Inference: the Slot pool summary counts per-model overrides as they are added or removed.
- Requests wait for GPU memory instead of failing with 503 or 500 when the device is momentarily full.
- Admin > Models: a download requested while the same model is already transferring shows its progress instead of staying at 0%.
- Playground > Parse: selecting an element inside a panel outlines that element, not the whole panel.
- Playground > Parse: selecting a table outlines each of its cells.
- Improved document parsing accuracy.
- Parsing a multipage TIFF could crash the server when its pages were read concurrently.
- Admin: the create-key dialog's tenant list rendered its checkboxes as empty full-width fields with a horizontal scrollbar.
- Agents:
document_detect_piiand entity detection on an image or a scanned page returned an error instead of the detected values. - Server log: no more native "inconsistent sequence positions" errors during structured generation with models that carry a draft.
- Playground: a message can be sent with an attached file and no text.
Security
- A read-only key refused for a write is refused, never served as an anonymous local caller.
2026.10.62026-10-08#
Added
POST /lmkit/v1/document-to-pdf: renders a Word document, an e-mail (.eml, .msg, its attachments embedded), an HTML, Markdown or text file, or an image as a PDF the page tools can act on.- Search tenants:
parsing_effort(Minimal,Low,Medium,High) andparsing_backlog; aboveMinimala document is searchable at once, then parsed again in the background. - Admin > Search > tenant: Parsing on the setup card and in the settings dialog (replaces the OCR switch, which shows only for a tenant that turned OCR off).
- Document parsing: effort
Minimal(no model) onPOST /lmkit/v1/document-parsing, the MCPdocument_parsetool and Playground > Parse. - Guide: Parsing Effort for RAG.
POST /lmkit/v1/document-parsingstreaming:progressevents while a page is read (stage, characters read, fraction).
Changed
- Search indexing reads documents through the document parser at
Minimal: same text, layout and OCR as before; tables index their cells. - Playground > Parse: the document parser or the Markdown converter (
Fast,Fast + OCR,Balanced,Accurate); a conversion shows its paragraphs in reading order, its Markdown, how it was read, export and code. - Improved document parsing accuracy.
Fixed
- Read-only model directory (
/data/modelsmounted:ro): a model it lacks downloads intomodels/under the work directory instead of answering503 model_store_read_only. - Read-only model directory: a catalog model placed on it by hand, without its
.originfile, loads instead of failing withRead-only file system; it is recognized by the catalog checksum, offline included. POST /lmkit/v1/image-redacthonors the EXIF orientation: areas are read on the image as displayed and a stripped photo stays upright (apply_orientation).- Playground > Parse: clicking a region on the page scrolls its row into view from the row's start, tall rows (tables) included.
- Playground > Parse: on images, clicking a region on the page selects it (the hand tool captured every press).
2026.10.52026-10-04#
Changed
- Improved document parsing accuracy.
- Improved query rewriting support for RAG.
2026.10.42026-10-03#
Added
POST /lmkit/v1/document-parsing: turns a PDF, scan or image into typed, positioned elements;effort,pages,output_format(Json,Markdown,Html,DocLang),include_figure_images.lmkit run document-parsing: writes.json,.md,.htmlor.dclgafter--output-format.- MCP tool
document_parse: Markdown inline or linked, the JSON parse as a resource. - Playground > Parse: parse at
Low,MediumorHigheffort in the document viewer; pages streamed, elements boxed and linked to the export, type filter, effort comparison, SDK and REST code, samples. - Guide: Document Parsing.
POST /lmkit/v1/admin/area-ticket?persist=true: the area ticket of a remembered session survives a browser restart, for its 12-hour validity.
Changed
- Switching areas holds the current page until the next one can paint, then swaps without a crossfade.
Removed
- The
osdOCR dictionary is no longer shipped underlm-kit/tessdata-fast/: the OCR engine recognizes with LSTM only and reads page orientation with its own classifier.
Fixed
- App bar: a signed-in browser without a valid area ticket completes the bar in place instead of missing the operator areas until a reload.
- Opening a gated area behind an expired ticket no longer flashes the sign-in prompt before the area.
- Playground: the sidebar, history and model name paint once on open instead of redrawing after the configuration loads.
Security
POST /lmkit/v1/admin/logoutclears the area-ticket cookie.
2026.9.82026-09-25#
Added
POST /lmkit/v1/admin/memory/release-device: returns idle attachment prefill contexts, backend scratch and vision encoder buffers to the device.- Admin dashboard, VRAM attribution: Attachment prefill, Vision encoder and Backend scratch segments, and a Release idle action.
Inference:IdleDeviceMemoryReleaseSeconds(default 300, 0 never), editable from Settings > Inference > Contexts & defaults.- Memory page inventory: attachment prefill contexts, vision encoder buffers and backend scratch rows; Collect LM-Kit cache returns them too.
POST /lmkit/v1/admin/2fa/setupand the sign-in enrollment answers carryqrSvg: the otpauth URI drawn as a QR code on the server.lmkit run <task> --in <path> --out <folder>: a REST task on local files without a server, options from its request;document-to-markdownfirst.- Every package ships the default OCR dictionaries (English, orientation) under
lm-kit/tessdata-fast/: OCR works offline and pays no download on its first document. POST /lmkit/v1/image-convertwatermark: a visible text or logo watermark (tiled, centered or in a corner) at the output size; a character no font draws answers 422unsupported_characters.POST /lmkit/v1/image-convertrights: copyright notice, creator, credit line, usage terms and rights page written into the file as XMP, even withkeep_metadatafalse.GET /lmkit/v1/image-convert/capabilities:watermark_layouts,watermark_max_text_length,watermark_installed_fonts.POST /lmkit/v1/pdf-watermark: a vector text or logo watermark over every page orpages; marking again replaces it; 422signed_document,pdfa_forbids_transparency,unsupported_characters.POST /lmkit/v1/pdf-remove-watermark: removes the watermarkspdf-watermarklaid.POST /lmkit/v1/image-watermark: burns a watermark into an image, keeping its size, format and metadata.GET /lmkit/v1/pdf-watermark/capabilities,GET /lmkit/v1/image-watermark/capabilities: layouts, longest text, installed fonts.- MCP tools
pdf_watermarkandpdf_remove_watermark. - The container image bootstrap install DejaVu, WenQuanYi Micro Hei and Lohit Devanagari for watermark text.
Changed
- Admin dashboard, VRAM attribution: the legend is an aligned table with each segment's value and share of the bar.
- Admin dashboard: CUDA runtime + reserved is now the true remainder; memory the runtime holds between requests no longer reads as growth there.
- Settings > Access, two-factor: the setup dialog shows a QR code beside the setup key, grouped in blocks of four.
- Settings > Access, two-factor: the 6-digit code confirms itself once typed, and one footer carries Cancel and the action.
- Settings > Access, two-factor: recovery codes appear in the same dialog, with Copy all and Download.
- The sign-in enrollment step shows the same two-factor QR code.
- A farm node whose model volume is read-only refuses to start until
ModelWorkDirectorynames a shared mount; the per-node fallback below would split the fleet's imports. - The startup line, the dashboard and
lmkit doctorgive the file system's reason when a model or work directory refuses writes. document-to-markdownwith theTextExtractionstrategy no longer takes a completion slot (MaxConcurrentCompletions): it runs no model.lmkit run document-to-markdownsplits a large text-extraction batch without OCR across processes of about eight documents each.- The LM-Kit OCR engine is built on first use; a server start still builds it during startup.
- On Linux only the server caps malloc arenas (
MALLOC_ARENA_MAX); command-line verbs no longer re-execute under the cap.
Fixed
- Search: a deletion-journal flush the store could not take kept only its first tenant and dropped the rest of the batch, leaving their content unreconciled; every entry now stays on the node for the next flush.
- Admin dashboard, VRAM attribution: a "?" tooltip no longer blinks while the dashboard refreshes.
- Repointing the model directory left training jobs and imports writing under the previous one, which refused them once it was gone; the default work directory is decided again per model directory.
- Training jobs and model imports on a read-only model directory answered
503 model_store_read_onlyuntilModelWorkDirectorywas set; with the setting empty they now write underwork/in the state directory. - The startup line, the dashboard, the Models strip and
lmkit doctorname the effective work directory. - Settings > Storage: Browse and Download all read as disabled while the upload directory is empty, and their hints say why; before, they looked live and did nothing.
- Packages carried the
.jsonfiles of build output left in the project directory; publish takes declared content only, and packaging refuses an unexpected top-level directory. - Admin dashboard: the first telemetry payload no longer shifts the page; every card is laid out at its loaded size before data arrives.
- Admin dashboard: Downloads in progress sits last, so it appearing or leaving moves nothing.
- Admin dashboard: Recent requests times older than a day read as a date and no longer overlap the method column.
- Admin: a collapsed sidebar is applied before the first paint instead of reflowing the page.
2026.9.72026-09-17#
Added
- Image Utilities:
image-deskew,image-enhance,image-analysis,image-redactandimage-color-paletteroutes. image-normalization:flip,deskew,crop,fit_boxandoutput_dpistages;deskew_anglein the response.page_indexon every image route (multi-page TIFF);tiffas an output format.image-convertroute: format, size (never past the master unlessallow_upscale), colour space (sRGB, gray, CMYK via ICC), metadata, every TIFF page, inline orfile_iddelivery;GET image-convert/capabilities.- HEIC / HEIF images decode on every platform.
- Container image:
vulkaninfoincluded; the release smoke test proves the Vulkan loader, Mesa drivers and SDK backend inside the image (deploy/containers/check-vulkan-stack.sh). - Container image: ffmpeg included; AMD and Intel GPUs served; a GPU that did not reach the container is diagnosed in the Hardware panel and the startup log.
ModelWorkDirectorysetting: a writable home for training jobs and imported models beside a read-only model volume.- Guides: search on pgvector in containers; Podman GPU pass-through through CDI.
- Changelog page in the documentation, beside Guides and API reference.
Changed
pdf-unlockreports the security the original carried: encryption, revision, algorithm, author permissions, which password opened it.- Access: a new API key preselects the default Search cluster, the choices state their consequence, the token reveal states the key's reach.
- A key without Search access and a read-only model store are refused with their own fact; every refusal keeps its reason in the request trail.
- A training job refused for device memory waits up to ten minutes instead of failing.
- A request value the decoded content rejects (a page index past the last page, a crop outside the image) answers 400
invalid_argumentinstead of 500. - EULA: free production use requires a visible LM-Kit acknowledgement; outgrowing the free thresholds keeps the grant for 90 days.
Fixed
- Windows portable zip: Windows Explorer refused to extract it (entries carried a
./prefix); the release archive now lists the payload files directly and a guard rejects any archive Explorer cannot open. - Setup wizard: the model download step failed with
(entries || []).filter is not a function; the progress poll now reads thedownloadslist the endpoint returns. - A fresh server reachable from the network could not be signed into: the API access policy layered over the admin endpoints.
- Read-only model store: downloads, imports and the Ollama-compatible pull refuse before a byte streams, naming the remedy.
- OpenAI-compatible vector stores pass the Search cluster gate.
- Exported documentation: every link is site-absolute; a directory URL redirects to its trailing-slash form.
2026.9.62026-09-14#
Initial public release.
Added
- REST API under
/lmkit/v1: chat, chat with documents, embeddings, reranking, summarization, translation, rewriting, correction. - Text analysis: categorization, sentiment, language detection, keyword, entity, PII and structured data extraction.
- Documents: OCR, document to Markdown, splitting, validation, thumbnails, search highlight, image to PDF.
- PDF: info, layout, merge, split, edit, unlock, redact, OCR, sign, verify signatures, timestamp, LTV, PDF/A, to images, search.
- Media: audio transcription, voice activity detection, video frames.
- Image Utilities: background removal, normalization.
- Agents, skills, MCP server, training jobs.
- Search: hybrid keyword and vector search with clusters, tenants, collections and per-key grants over SQLite, PostgreSQL, SQL Server and MySQL.
- Compatible APIs: OpenAI, Ollama, Anthropic (Claude Desktop gateway).
- Admin console, Playground, Guides, API reference.
- Deployment: Windows (MSI, portable, service, tray), Linux, macOS, container image (Docker Hub, GHCR); SSO, API keys, network posture, TLS, declarative configuration.