Repository navigation
Releases: infinition/langolier
Release list
v0.6.0
Sur un Mac recent, Langolier peut repondre avec le modele que le systeme porte deja. Rien a telecharger, rien a lancer.
Le moteur Apple
- Sur macOS 26 et plus recent, un nouveau fournisseur, Apple, sur ce Mac, interroge le modele embarque du systeme via le framework FoundationModels. Aucun telechargement, aucun serveur a demarrer, aucun port ouvert, aucun espace disque: le modele appartient au systeme et il est partage avec toutes les applications qui le demandent.
- Environ 25 tokens par seconde sur un Mac M, premier token apres une seconde et demie. Au repos le systeme lui reprend la memoire, elle revient quand une question arrive.
- L'entree n'apparait que sur un Mac, et la page dit en clair pourquoi le modele ne peut pas repondre le cas echeant: Apple Intelligence desactive, Mac incapable de l'executer, ou modele encore en telechargement.
- Deux limites a connaitre. Le contexte est de 8192 tokens, partage entre les passages, la conversation et la reponse, donc les longs fils sont raccourcis. Et il n'ecrit que les reponses: Apple n'expose aucun embedding, la memoire continue de tourner sur le moteur compile dans l'application.
Traductions
- La phase affichee pendant une reponse, les avertissements de recherche et le message d'index semantique partiel sont desormais traduits. Ce dernier portait ses nombres dans la phrase, ce qui empechait de la retrouver dans la table de traduction.
- Le statut du moteur dans la barre laterale reconnait le moteur Apple au lieu de le signaler comme a configurer.
Construction
- La build macOS passe sur l'image
macos-26, seule a porter le SDK qui contient FoundationModels, et une verification refuse desormais de publier une build macOS ou le moteur manquerait. - Le pont Swift n'est compile que si le SDK le permet: sur une machine plus ancienne l'application se construit sans lui et signale simplement que le systeme est trop ancien.
Assets
Installateurs pour macOS (.dmg universel), Windows (.exe) et Linux (.deb, .rpm, .AppImage), plus les chatbot-runners-*.zip utilises par les chatbots exportes.
Les versions macOS sont signees en ad hoc. Au premier lancement, clic droit sur l'application puis Ouvrir.
v0.5.1
Le clic gauche sur l'icone de la barre des menus ouvre la palette, sur les trois systemes.
Barre des menus
- macOS confie a son systeme toute icone de barre des menus a laquelle un menu est attache: l'application ne recevait aucun clic et le bouton gauche n'atteignait jamais la palette. Le menu n'est plus attache a l'icone sur macOS, il est ouvert sous elle au clic droit. Windows et Linux laissent deja le clic a l'application et gardent le menu que le systeme dessine.
- Clic gauche: la palette s'ouvre, et se referme au clic suivant. Clic droit: ouvrir Langolier, poser une question, quitter.
Palette
- Le Langolier anime remplace l'etoile, a gauche du champ de question. Il respire, suit le pointeur et repond au clic.
Assets
Installateurs pour macOS (.dmg universel), Windows (.exe) et Linux (.deb, .rpm, .AppImage), plus les chatbot-runners-*.zip utilises par les chatbots exportes.
Les versions macOS sont signees en ad hoc. Au premier lancement, clic droit sur l'application puis Ouvrir.
v0.5.0
Retrieval that needs no model at all, videos read from their subtitles, and a site that explains the whole thing.
Retrieval on its own
POST /api/searchreturns the passages without writing an answer over them, so whatever called it can write instead. Inlexicalandexact, retrieval is pure SQLite: no model is involved, nothing to install, nothing called.hybridandsemanticstill turn the question into a vector, which needs the embedding engine.- Both local endpoints carry a
textfield holding the result ready to read, so a shortcut can show one value instead of walking an array. On/api/askit is the answer with its sources listed underneath; on/api/searchit is the passages themselves, each under its source and locator.
Videos
- A URL whose subtitles already exist is read from them instead of being downloaded and transcribed. An hour of video becomes text in seconds, and an author's own subtitles carry punctuation, which cuts into passages far better than a small transcription model.
- Subtitles a platform generated by machine are accepted only if you ask: the setting sits under Sources, off by default, because they carry no punctuation.
- Requests to the platform are retried with spaced out waits. A rate limit no longer fails the import.
Engines
- The embedding engine is a switch rather than a word to type. Leaving it reveals the address of your own server, prefilled.
- A curated embedding model that is not downloaded yet is now said plainly, with a button to install it, instead of failing when a source is queued against it.
Site and wiki
- A presentation site lives in
docs/, in English and French, published at infinition.github.io/langolier. No CDN, no webfont, no analytics, and a strict content security policy. - The wiki is part of it, generated from the markdown in
wiki/byscripts/build-wiki.py, so the pages and the repository never drift apart. - The sidebar carries three links: the site, the source, and the tip jar.
The creature
- The mark in the sidebar is the Langolier itself. It breathes, follows the pointer, and swallows documents while sources are being read, transcribed or vectorised. Clicking the one at the top feeds it.
Assets
Installers for macOS (universal .dmg), Windows (.exe) and Linux (.deb, .rpm, .AppImage), plus chatbot-runners-*.zip holding the launchers used by exported chatbots.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.
v0.4.0
Langolier answers over a local API, and lives in the menu bar without keeping its interface in memory.
Local API
- A new
POST /api/askreturns one JSON object instead of a stream, which is what Shortcuts, Siri and local agents can consume. It runs the same pipeline as the window and the exported page, so there is no second answer path to keep in step. - The reply carries the pipeline's own payload, plus a
textfield holding the answer with its sources spelled out underneath. A shortcut can showtextand speakcontentwithout walking the sources array. - Loopback only, never the network.
POSTonly, so a question never travels in a URL. AnAuthorization: Bearertoken is required, generated when the API is first switched on, and the endpoint stays shut while no token is set. No CORS headers are emitted, and the same twelve questions a minute limit applies. - The engine lock is shared with the window: a question from Siri and a question typed in the app never generate at the same time.
- Switched on under Engines, with the address, the token and a button that checks the API answers. Starting and stopping takes effect without restarting the app.
Menu bar
- Closing the window now releases it rather than hiding it. The rendering engine goes with it, and on macOS the app steps out of the Dock the way a background agent does. Reopening rebuilds the window and puts it back.
- Left click on the icon asks a question, right click opens the menu.
- Watched folders and source processing stand down while Langolier sits in the menu bar. Two settings bring either back, off by default: a folder filled in the meantime is picked up when the window opens again.
- The menu bar icon is a proper template image on macOS, recoloured by the system for light, dark and selected. Windows and Linux keep the icon in colour, as their trays expect.
- Windows and Linux end an application with its last window, so the exit is refused while Langolier runs from the menu bar on purpose.
Retrieval on its own
POST /api/searchreturns the passages without writing an answer over them, so a shortcut or an agent can write instead. Inlexicalandexact, retrieval is pure SQLite: no model is involved, nothing to install, nothing called.hybridandsemanticstill embed the question.
The creature
- The flat logo in the sidebar is now the Langolier itself. It breathes, follows the pointer, and swallows documents while sources are being read, transcribed or vectorised. Clicking it feeds it on demand.
- The menu bar icon on macOS is a proper template image, drawn from the same creature.
Site and wiki
- A presentation site lives in
docs/, in English and French, published at infinition.github.io/langolier. No CDN, no webfont, no analytics, and a strict content security policy. - The wiki is part of it, generated from the markdown in
wiki/byscripts/build-wiki.py, so the GitHub wiki and the site page never drift apart. - The sidebar carries three links: the site, the source, and the tip jar.
Fixes
- Replacing the database when installing a bundle no longer fails on Windows: pooled connections are closed before the file is touched.
- Tests covering the HTTP surface run without the desktop feature, so the test binary no longer links the Windows GUI stack.
Assets
Installers for macOS (universal .dmg), Windows (.exe) and Linux (.deb, .rpm, .AppImage), plus chatbot-runners-*.zip holding the launchers used by exported chatbots.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.
v0.3.0
PDFs that used to fail now get indexed, duplicates stop counting as errors, and the library gained filters and bulk actions.
Ingestion
- A PDF whose content stream the Rust extractor cannot parse no longer fails the whole source: extraction falls back to
pdftotext, page numbering intact, and OCR is kept for the pages that really hold no text. Two kinds of failure are covered, a parse error and an outright panic, the second of which used to abort the source before any fallback could run. - Content duplicates get their own status instead of being reported as errors. The message names the source already holding those bytes, and watch counters no longer inflate their error totals.
- Stage labels are stored in one language and translated on display. Labels written by older versions are migrated on start.
Sources
- Clickable status chips filter the library: queued or running, needing a check, duplicates. A chip disappears once its sources are gone, and releases the filter with it.
- One button processes again every failed source of the current view, so a filter by name or type narrows what gets queued. Duplicates are excluded, since processing them again changes nothing.
- When the duplicates filter is on, the same button offers to remove them instead, keeping the source that already holds the content.
- A watch detail now lists duplicates in their own section.
Retrieval
- SQLite connections are pooled. The first question after launch no longer pays for a cold page cache, which was the bulk of its latency.
- Vectors are stored normalized, so similarity is a dot product in
f32rather than a cosine inf64. Existing vectors are converted once on start. - Passages are cut on sentence boundaries when one is within reach of the window, instead of mid-word.
- Candidates per search arm, passages per source, passage length and overlap are now settings. The last two apply to sources indexed from then on; existing passages keep the length they were cut with until a reindex.
Exported chatbot
- The page carries a Content-Security-Policy with a per-response nonce, so nothing loads that the page did not ship.
Referrer-Policy,X-Frame-OptionsandX-Content-Type-Optionscome with every response. - Safe areas, PWA meta tags and scroll containment for iOS: the notch and the keyboard no longer cover the composer.
- Questions are rationed per address, twelve a minute, so serving the page to a network cannot pin the machine.
Under the hood
- Tauri commands are split by domain, and the sources page moved out of the main component.
- The HTTP surface gained tests; it had none.
- The Playwright suite pins its locale and asserts on source strings, so it no longer depends on the machine's browser language.
Assets
Installers for macOS (universal .dmg), Windows (.exe) and Linux (.deb, .rpm, .AppImage), plus chatbot-runners-*.zip holding the launchers used by exported chatbots.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.
v0.2.0
Built-in engine by default, and exported chatbots that update themselves from their own page.
Embedded engine
- llama.cpp is now the default engine. Pick a curated tag under Engines, press Install, and the GGUF lands in the app cache:
qwen3:4b-instruct(2.5 GB, recommended),qwen3:8b(5.0 GB),qwen3:1.7b(1.8 GB). Any GGUF path still works. - Weights already pulled by Ollama are linked into the cache instead of being downloaded again.
- Idle models are unloaded after a configurable pause (5 minutes by default), so memory comes back without quitting the app.
- Ollama stays available as a provider; install and launch scripts treat it as optional.
- Exports and the light kit no longer need Ollama.
Remote administration of exported chatbots
- Enable it in the profile before exporting, with a secret. A gear in the chat page footer then lets an administrator import a
.langolier, restore any earlier version from a list, or delete one. - Every bundle the chatbot ever ran is kept on the server, twenty at most, named, timestamped and deduplicated. The running version and the one the kit shipped with cannot be deleted.
- Nothing is ever downloaded from the page: no export, so the corpus and the API key stay on the server.
- The chat page language can be pinned per profile (English or French); by default it follows the visitor's browser. Server messages shown on the page follow it too.
- Secret stored as a hash, five wrong attempts pause the routes for fifteen minutes, uploads stream to disk with a 1 GB cap.
- A bundle whose embedding model is missing on the host is refused with the reason, unless forced.
Fixes
- Installing a bundle written by an older version no longer breaks the server: migrations run after every install.
- Administration settings belong to the deployment; restoring an older bundle does not lock the administrator out.
- The chat page follows the browser language, English or French.
Launch-Mac.commandprefers the installed app, asks before building, and closes its own Terminal window.Stop-Ollama.commandadded.- macOS builds are universal (Apple Silicon and Intel).
LANGOLIER_DISABLE_TELEGRAM=1keeps a test or a second instance from polling the bot.
Assets
Installers for macOS (universal .dmg), Windows (.exe) and Linux (.deb, .rpm, .AppImage), plus chatbot-runners-*.zip holding the launchers used by exported chatbots.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.
v0.1.0
First public release.
Langolier indexes documents, code, video and voice notes, then answers from them with citations. When nothing in the corpus supports an answer, it abstains instead of inventing one.
In this release
- Desktop application for macOS (universal), Windows and Linux
- Ingestion: PDF with OCR fallback, DOCX, PPTX, XLSX, ODT, ODP, ODS, Markdown, text, CSV, JSON, notebooks, source files, subtitles
- Transcription of video and audio through whisper.cpp, voice memos included
- Retrieval: FTS5 BM25 and dense vectors, RRF fusion, optional judge model, abstention thresholds
- Engines: Ollama, local OpenAI-compatible servers, OpenAI, DeepSeek, Anthropic, or llama.cpp compiled in with a GGUF
- Watched folders in sync or hoover mode, local or on a mounted NAS
- Assistant profiles exportable as standalone chatbots, updated by dropping in a new
.langolierbundle - Telegram bridge and headless server mode, with a Docker image
- Interface in English and French
Assets
langolier-* installers for each platform, plus chatbot-runners-*.zip holding the launchers used by exported chatbots. Drop a .langolier next to a launcher and it is a chatbot.
macOS builds are ad hoc signed. On first launch, right click the app and pick Open.