Skip to content

Changelog

Versions are produced by semantic-release from the commit log, so what follows is written by the commits themselves. SeeReleases for how that works, andChanges from Hollama for what this fork changed before any of it was versioned.

0.31.021 September 2026

Bug Fixes

  • docs: crop the framed captures to the window and draw the shadow in CSS (a603669)
  • docs: draw the mock the way the app does, on one canvas with two panels (31393cb)
  • docs: stop framing screenshots that already carry their own frame (e6337c7)
  • docs: take the mock’s colours off the captures, not off the markup (4c04684)
  • docs: take the palettes from the app, and cut the provider note down (1de88e8)
  • integrations: align the Chatto client with the 0.5 beta API (65547b5)
  • integrations: keep direct messages flat when a Chatto bot answers in threads (a4e351f)
  • integrations: mark every Chatto notification read, answered or skipped (6a70a77)
  • screenshots: write the frames flat and let the page draw the shadow (7dc769d)

Features

  • docs: count visitors with a self-hosted Umami, and say so on the home page (693c22e)
  • integrations: let a Chatto bot read attached documents and see attachment descriptions (25bcf8b)
  • integrations: say which Chatto permissions a bot is missing when its connection is tested (4200e3a)
  • integrations: stream a Chatto bot’s answer by editing its message (6795a60)
  • mcp: let a turn announce its servers and fetch a catalogue only when asked (ef0e6b1)
  • mcp: read a gateway’s servers off its tool names, and switch them on or off (998ca6d)
  • screenshots: shoot the hero’s window dark, and wait on the fonts rather than on a delay (97b44ce)
  • voice: one shape for the voice screen and the home card, whose silhouette carries the state (9b36e44)

0.30.031 August 2026

Bug Fixes

  • mobile: make the current tab visible, and keep it current inside the Library (4af6955)
  • mobile: size the persona faces so one always sits past the edge (ee5e130)
  • search: give the search panel a way out (0241f85)
  • settings: stop a card’s name field cutting off its last characters (a514a11)
  • voice: ask each model which speech format it takes, keep the turn detector running past the first frame, and move the status into the header (d528a81)
  • voice: replace the previous upgrade listener instead of stacking one on top of it (08ffb30)
  • voice: reserve the meter’s place instead of mounting it with the conversation, and calm it down (47a00ef)

Features

  • mcp: fold each server into the shared settings card (ef9c927)
  • mcp: keep each server’s catalogue, count it, and refresh it on demand (610c177)
  • mcp: make the tool ceiling yours to set, and say what a large one costs (c6da624)
  • mcp: start conversations with the tools off, and reach for them when needed (3de2091)
  • mobile: a Library that stays in the phone interface (bbc7f53)
  • settings: rename a connection from its own heading, like a bot (f8ea927)
  • voice: read a persona’s greeting on arrival and keep the whole exchange on screen (e7905d0)

0.29.131 August 2026

Sorry for that !!

Bug Fixes

  • mcp: bundle the mcp client into the build instead of leaving it external (0beec8d)

0.29.031 August 2026

Features

  • integrations: let an admin grant, bound and oversee the bots on an instance (cad6cf1)
  • integrations: meter bot turns, defuse mentions, read images, acknowledge on receipt (41d261d)
  • mcp: put every call to the person before it is made, and let a conversation switch the tools off (28dd149)
  • mcp: reach the tools an account already runs, over http streamable (883493a)
  • voice: hold a spoken conversation over the app’s own socket and turn engine (64ec271)

Reverts

  • voice: put the orb back on the voice screen (c870e81)

0.28.030 August 2026

Features

  • integrations: answer in a chatto room as a bot (39230e3)

0.27.026 August 2026

Bug Fixes

  • mobile: keep the tab bar frosted, stop a navigation hanging on the update check (52eed65)
  • readme: mobile screenshots (cf39e22)

Features

  • mobile: make the phone interface the default, and give personas a way in (392cced)

Reverts

  • mobile: drop the page transitions, which cost the tab bar its glass (81cb221)

0.26.026 August 2026

Bug Fixes

  • chat: keep the questions that parse when an ask block is malformed (0a8134f)
  • images: say why a picture could not be stored instead of answering 500 (730cc8c)
  • mobile: draw the home orb in the accent, larger, and lit rather than blurred (46c4f19)
  • voice: make the orb the control, cancel on a second press, and keep it still (9d75022)

Features

  • mobile: give the phone interface its own navigation grammar (47db00d)
  • mobile: show usage against the allowance on the profile card (e89b31b)
  • voice: animate the status line on a variable font’s height axes (28584e1)
  • voice: give the whole screen the living face, and light the orb on the home card (7f8666c)
  • voice: read answers aloud, on OpenRouter, and meter what speech costs (c0d62fc)

0.25.025 August 2026

Bug Fixes

  • connections: let an Ollama load option go back to unset (1a3b1a0)
  • mobile: let the phone interface replace the app shell instead of nesting in it (15d5a06)

Features

  • mobile: a phone-first interface, voice input, and one welcome instead of two (f8d7274)
  • mobile: fill the last two tabs, drawing and the account (fefdf19)

0.24.024 August 2026

[BREAKING] Local mode is gone

Llooma used to run two ways: everything in the browser, or everything on the server. That is over, there is one way now, and it is the server one.

Local mode kept all your conversations, knowledge, personas and playbooks in the browser’s localStorage, which is about 5 MB for the lot. It stored API keys there in plain text, where extension could read them. Image generation could not work at all, because the bytes had nowhere to go. And a handful of features had to be written twice, once for each side.

You are not losing the easy way in. Start the server with nothing configured and it opens straight into the app: no account, no login screen, no secret to generate. That was the whole point of local mode, and it still works, it just has a real database behind it now, with keys actually encrypted at rest.

If you were on local mode, your data does not come across. Export a backup from Settings, Data, Backup and restore before you update, then restore it afterwards. The previous release stays available on the pre_local_mode_removal branch and the v0.23.0 tag if you need to go back and fetch something.

Bug Fixes

  • chat: put the policy lines ahead of the conversation, never after it (82de6b6)
  • chat: send the sampling settings to every provider, not only Ollama (e22d835)
  • connections: move the model loading options off the conversation and onto the Ollama connection (59f94d0)
  • runs: hand a returning client the conversation’s latest run, not its oldest (bb37b6a)
  • security: apply the fetch allow-list where pages are read, and drop two unused routes (6f32d51)

Features

  • chat: the server writes the conversation it produces (58057d0)
  • server: run without accounts, with a secret the instance generates (828de4b)
  • settings: sampling defaults in Settings, shared by the admin the same three ways (34ce689)

Full Changelog: https://github.com/cedhuf/llooma/compare/0.23.0…0.24.0

0.23.023 August 2026

Bug Fixes

  • chat: let a turn stop asking without withdrawing its tools (fe3e409)
  • sessions: keep a message from the moment it is sent, and a draft before that (53a8e0a)

Features

  • images: stream the rewritten prompt, and rework the composer strip (43af013)

0.22.022 August 2026

Bug Fixes

  • home: quiet the image strip and make its way out a control (91b6b36)

Features

  • images: draw from the pictures you bring (bfcd6f9)
  • tour: show real pictures on the image step, one changing at a time (8fa1edb)

0.21.022 August 2026

One file per provider 🚀

Everything Llooma knows about a specific provider (Ollama, OpenAI, Claude, Infomaniak) now lives in one file each, under src/lib/providers/. It used to be spread across seven places: a metadata list, four capability predicates, a pair of URL templates, and the image sizes added last week.

The reason is that none of it is really this application’s code. A provider renames an endpoint, ships an image model with different sizes, starts accepting tool calls: that changes on their schedule, not ours. So it is data now, kept as data, and adding a provider is adding a file and a line.

Which means contributions are now a small, reviewable thing. If your provider needs a preset endpoint, a key help link, or its own image shapes, that is one file and a pull request, and the reviewer needs to know the provider rather than the application. Same for a fix when a vendor changes something under us, and they will.

See docs for more on this !

Bug Fixes

  • images: fit the picture above the prompt instead of behind it (8bf7f1f)
  • images: let a shared image model be the permission, instead of a switch beside it (c19ad52)
  • images: one prompt under the picture, the one that was actually sent (0ed35b3)
  • images: one truncated line on a tile, showing the prompt that was sent (136bf87)
  • images: separate the bar by blur, since paint on paint only adds up (a3daf61)
  • images: the backdrop runs under the whole dialog, and the figures step back (641ff2b)
  • images: the dialog’s actions in its title bar, and the figures on the picture (7217ecb)
  • images: the figures move into the title bar, and the picture shows through it (969139d)
  • images: the prompt floats on the picture, one line and a way to open it (a53c574)
  • interface: put the picture icon with the action it belongs to, in its colour (b811126)
  • interface: the first segment is the home screen, and says so (d9fe5e4)
  • settings: one line per control on the Tools tab, the reasoning in the docs (b478cdd)

Features

  • images: a split New chat button, and the latest pictures on the home screen (411c245)
  • images: ask for a shape and a quality, and translate them per provider (de59780)
  • images: name each picture, and let the name be what everything reads (65c54ae)
  • images: the picture behind itself, softened, so the dialog belongs to it (8d9ed39)

0.20.022 August 2026

Images is coming!

Llooma draws now. There is a gallery of your own, a field at the top of it, and everything you make stays there. A page for it, not a corner of the chat. Images sits beside the Library, with the same shape and the same width. The prompt goes in at the top, the results fill in below, newest first. Click one for the whole picture, the model, how long it took and what it cost.

A prompt writer, if you want one. Image models respond to a different kind of writing than a chat model does: framing, lens, lighting, palette. A text model can turn what you meant into that. What it writes appears in its own editable box, and that box is what gets sent. Clear it and your own words go instead. Both are kept, so “why doesn’t this look like what I asked for” stays a question with an answer.

Models finally say what they are. Every model on a connection can now be marked as chat, images, embeddings or speech, grouped into sections under Models and pricing, guessed from the name and correctable. Which also means the chat picker has stopped offering you embedding models: choosing one produced a 400 with no explanation, and that is now impossible rather than merely unlikely.

Prices that match the invoice. Image models are rarely billed by the token. A price can now be per million tokens, per image, per second or per minute, whichever your provider actually charges. Unpriced still means unpriced: not counted towards anybody’s spending, and refused while a credit limit is in force, so a forgotten model cannot quietly become a hole in the limit.

Providers that keep their images somewhere else. Some do. Infomaniak serves chat from one API version and images from another, and no path appended to the first reaches the second. Connections have an image endpoint field for that, filled in automatically where we can, and the model catalogue is read from both roots so the models that draw actually turn up.

Getting them out. Export gives you the latest image, or every one of them as a single zip streamed rather than assembled, with an images.json beside the pictures holding each prompt, model, duration and cost.

A welcome that says all this. The tour has two new stops, one for the rest of the Library, playbooks and knowledge, and one for drawing. It is also in French now.

Off by default, and deliberately: image models cost real money per request, so nothing draws until an administrator turns it on. Server mode only. See the Images page.

Bug Fixes

  • images: fit the picture to the dialog instead of scrolling it (15e1544)
  • images: give export the same button the library gives import (ee704b0)
  • images: let the picture dialog close by every route it offers (92799d8)
  • images: one section for the feature, a switch for the writer, and one width for the family (ce80614)
  • interface: give filled header buttons the border their outlined neighbours have (1e060a1)
  • models: read a connection’s image root too, so the models that draw are in the catalogue (91ffa10)
  • providers: fill the image endpoint at creation instead of guessing it later (449e03b)
  • providers: reach image endpoints where the provider actually serves them (fbdf90e)

Features

  • images: a composer that reads as one surface, and tiles that fill in while they are drawn (7b1e830)
  • images: a gallery of its own, beside the library (781ea46)
  • images: a prompt writer, shared defaults, and the documentation for both (a7fca1b)
  • images: export the latest picture or every one of them, with the prompts beside them (5e6cfff)
  • images: keep what the app draws, and draw it where the keys already are (d18ebad)
  • models: say what each model is for, and price the ones that are not billed by the token (94e5446)
  • onboarding: a step for the rest of the library, one for drawing, and both in French (614fc4e)

0.19.018 August 2026

Do you remember? I don’t, but personas will!

Knowing what it costs, and setting a limit

Models have a price, and until now Llooma pretended otherwise. Each model on a connection can carry its input and output cost per million tokens, with its own currency, set from the server’s model panel. Shared models are marked green when priced and red when not, so nothing slips through unnoticed.

From that comes an allowance. An instance can set one for everybody and a different one per account, over a calendar month, week or day. Your Profile shows what you have spent, what is left, when it resets, and thirty days of spending as a chart.

Two decisions, a limit never cuts a conversation in half: the check happens before a turn starts, never in the middle of one. And an unpriced shared model is refused while a limit is in force, rather than quietly costing nothing. A model whose price nobody entered is not a free model, it is an unmeasured one, and treating it as free is how an allowance becomes decorative.

When the instance refuses, it says so properly and gives the administrator’s address rather than an error code. Local mode counts too. There is nobody to limit there, but there is still something to know, so the same figures are kept in the browser.

Administrators get a Users tab of their own, beside Admin: the accounts on one side, what each of them spends on the other.

A Prompts tab

Everything Llooma adds behind your message was already yours to rewrite, but it lived in a dropdown at the foot of an already long Tools tab. Which is to say nowhere. It now has a tab of its own, in five folded sections. A prompt you have rewritten says so without being opened.

Three gaps closed along the way. The prompt that names your conversations is editable at last. So are the native tool descriptions, which ends a duplication that was being kept in step by hand between the prose path and the tool path. And the system prompt, global and per model, moves here from Chat, where it always belonged.

On a shared instance an administrator can share their prompts, locked or as a starting point. Everyone still sees the whole tab either way: a read-only field tells you what is being sent on your behalf, where a hidden one only tells you that something is. Shared as a starting point, the rewrites merge prompt by prompt, so rewriting one does not quietly discard the other nineteen.

Personas that remember

A persona can keep a few things about you between conversations. It writes them itself, and every write shows up in the conversation as a step you can see, exactly the way a web search does.

Two tiers. One block it rereads at the start of every message, for what is true most of the time, and notes carrying only a title and a line saying when each one matters, the note itself opened only when that line says it bears on the conversation. Everything always carried fits in 4000 characters. When it is full the persona has to merge two notes or forget one, and it is told so rather than being allowed to truncate quietly.

Open the persona in the Library and the memory is there in full, to correct or delete. That is the real safeguard: a memory you cannot read is one you cannot fix.

It belongs to the pair of you and that persona, and to nothing else. Exporting the persona does not carry it. Sharing the persona on an instance does not carry it, and cannot: the memory is not stored on the persona at all. Each account using a shared persona has its own, invisible to everybody else, the administrator included. It has its own row in Settings → Data, and an administrator can turn the feature off for the whole instance.

It needs a model that can call tools. Without one, the persona still receives what it remembers and still answers from it, but cannot write to it by itself.

Fixes

Starting a conversation with a persona could create an ordinary conversation instead: the write was still queued when the page read it back, and a blank conversation settled on top. The persona lost its voice, its greeting and its title. A persona with no model of its own now takes yours, instead of arriving with none at all.

Server-side turns went entirely uncounted. The meter was watching the browser relay, and in server mode the browser sends nothing through it. Counting now happens where the turn actually runs.

What an administrator shares goes through an allowlist. The whole persona object used to travel, conversation id included.

And a decimal comma no longer silently discards what you typed, in prices or in an account’s allowance.

Before updating - Database migrations run at startup. Back up first: an earlier version will not read back what they write.

Bug Fixes

  • credits: a label was swallowing the click, and the two panels now match (a90ba9f)
  • credits: an unpriced shared model is a limit that does not apply (27d97df)
  • credits: the allowance sits with the accounts, and an admin sees their own (a4d90d9)
  • pricing: a price per model, on its own row, with a way back to unset (f311d86)
  • pricing: arrows for labels, the unit against the figure, the row spread out (d0e61c6)
  • pricing: both arrows lean the same way, and the figures fill the row (88f891b)
  • pricing: one height for every control on the price row (23f073a)
  • pricing: the unit in the box, an arrow on the label, and a comma is a decimal point (67e7ea4)
  • pricing: the unit on every label, native spinners gone, reset on the row (7ee1f06)
  • settings: fold what is rarely wanted, and say which side of a price is which (eb839ad)
  • usage: count where the turn runs, not where the browser would have sent it (34445ed)
  • usage: watch the stream on its way out instead of racing a copy of it (dc00975)

Features

  • credits: a refusal says who to ask, with the address (88d87dc)
  • credits: an allowance per account, folded, with its own period (b6b3814)
  • credits: count what each account spends, and a limit that never cuts a turn (17d5547)
  • prompts: one screen for everything the app says, and personas that remember what you tell them (d712c60)
  • servers: record what a million tokens costs, per model and per connection (f4c108b)
  • usage: the tokens beside the money, since the money rounds to nothing (13f4c1a)
  • usage: thirty days of spend, a currency on the figure, and a ledger in local mode (7e2cde5)

0.18.017 August 2026

This is some BIGGG update !

Breaking: the Hollama compatibility path is gone

Llooma carried three one-shot migrations from the days it was called Hollama Next. On first start it renamed hollama.db, it copied hollamanext-* browser keys onto their current names, and it read backup files written under the old keys. All three are now removed, along with the keys themselves.

If you are updating from a build older than the rename, pin 0.17.0 first, open the app once so it migrates, then update. Concretely:

  • a data directory still holding hollama.db is no longer adopted, and the server will start on an empty database beside it
  • a browser still holding hollamanext-* keys starts empty
  • backup files exported before the rename no longer import

Nothing is deleted in any of those cases, but nothing is picked up either. This is an alpha and it is the kind of thing an alpha does.

Conversation markers are now a single field

Compaction summaries and cleared-context markers used to be two separate fields on a message. They are one note field now, with the kind inside it, which is what lets a new kind be added without touching the context builder, the search, the SQL and the renderer at once. /context and the mention records shipped in this release are the first two to arrive that way.

Stored conversations are converted automatically: server instances migrate on first start, browsers on first load, and backup files are converted when imported. Nothing is lost and nothing is asked of you.

Two things worth knowing:

  • Take a backup before updating if you keep one. The conversion is one-way, and a version older than this one will not read the new field.
  • Backup files exported from any version stay importable, before and after this change.

Playbooks, and a store that holds more than one thing

A playbook is a way of doing something, written once and switched on in any conversation. Where a persona is who is answering, a playbook is how the job gets done: a procedure the model follows, with no voice, no model and no conversation of its own.

Type /playbooks in any conversation. The list opens where you asked for it, with a tick against the ones in force, and stays there — what changed the answers is visible above them rather than buried in a settings panel. What is switched on is added to the system prompt when the message is sent, so editing a playbook reaches every conversation running it, immediately.

Write your own in the Library, or install one of the four that come with the store: plan a week of meals around what is already in the kitchen, turn an official letter into what you actually have to do, work through a decision you keep going round in circles on, or track down why something at home stopped working. They are deliberately ordinary. A playbook earns its place by being the thing you would otherwise retype every time.

The store now has one address. Personas and playbooks are catalogues under it, and anything installable that follows will be another. If you run a mirror, there is one folder to copy and one field to change, in Settings → Tools → Store. The addresses have moved from llooma.eu/personas/ to llooma.eu/store/personas/, so an instance pointing at the old one needs its address updated.

Also in this release

/context writes down what the model is actually being sent: the estimate, what it is made of — system prompt, messages, sources index — and the single heaviest message, named, because a context that filled up unexpectedly is almost always one file somebody pasted. It costs no request and is never sent to the model.

/compact now takes an instruction. /compact keep every decision about the schema outranks the summariser’s own rules, their length and their structure included. Whatever the summary leaves out is gone from the model’s memory of the conversation, which is why compaction stays reversible.

A persona called into a conversation with @ now leaves a record in its own conversation: which conversation wanted it, with the question and its answer. The model has not read it until you press Add to this conversation, which repeats the exchange there, framed so it understands it was said elsewhere.

Under the hood, compaction summaries, cleared-context markers and everything above are now one field with the kind inside it, which is what let three of these ship without touching the context builder, the search and the SQL. Stored conversations are converted automatically: server instances on first start, browsers on first load, backup files when imported. Take a backup before updating if you keep one — a version older than this will not read the new field.

Bug Fixes

  • auth: send state with the authorization request, as OIDC servers may require (c882929)
  • chat: let the compaction instruction outrank the rules it contradicts (3f95984)
  • data: a collection this server has never heard of is empty, not fatal (40a3002)
  • knowledge: a draft nobody guarded was losing what you typed (2e11cb3)
  • knowledge: the editor fills the dialog, and the title says it is a field (7a2084d)
  • library: every row of a section is as tall as its tallest card (8e9ff86)
  • library: the playbook modals were mounted behind a persona being edited (fcda53a)
  • library: the section tint was an angle where a number was wanted (3cd5ee7)
  • personas: let the editor draw a face, and let you pick one (3fc3991)

Features

  • chat: add /context, a note that says what the model is being sent (0fbcdea)
  • chat: let a slash command take an instruction, starting with /compact (436b316)
  • chat: name a conversation again once it has grown into one (4fc0133)
  • library: one Import that reads the files, Markdown included (4075bbf)
  • onboarding: give the tour its own cast, so it no longer depends on the store (5fb86de)
  • onboarding: let the personas step play a mention turn instead of describing one (c65431d)
  • personas: give the store’s characters a face instead of a symbol (e4f1bbb)
  • personas: keep a record, in a persona’s own chat, of where it was called (8e3e616)
  • playbooks: a procedure reads as a procedure, not as a character (0e8908a)
  • playbooks: an instance can hand out its own, and relay the store’s (80348f2)
  • playbooks: four to start with, served from the site like the personas (6f2b810)
  • playbooks: give a procedure a place to live, on both sides of the wire (530342f)
  • playbooks: switch a procedure on where the conversation can see it (6a3e2f0)
  • store: one storefront for every catalogue, with the type as a filter (57f14a9)
  • store: one storefront, two catalogues, a card each (c5d0fbe)

0.17.016 August 2026

Fixed: an answer appearing two or three times

If you came back to a conversation shortly after it finished generating, the reply could land in it again. Come back twice and you had three copies.

A finished generation is kept on the server for a few minutes so a tab that was closed mid-answer can still pick it up. Revisiting the conversation inside that window replayed it from the start, and the tab that had already watched it live applied the whole thing a second time.

Every message a generation produces now carries the moment it was created, stamped once and never rewritten, so the same answer delivered twice is recognised and stored once. Same for compaction markers, which had the same problem and would have drawn two boundaries where there is one.

One thing to do yourself: copies already in your conversations stay there. Delete the extra ones by hand, they will not come back (hopefully !).

Bug Fixes

  • chat: lay the composer’s mention overlay out as text, not as a flex row (ddd4b73)
  • chat: stop the composer’s mention overlay from rendering its own indentation (8d6dcbd)
  • chat: stop the conversation fighting you when you scroll during a generation (1dd4ccd)
  • runs: apply a replayed answer once, so revisiting a conversation stops duplicating it (ea5c1a5)

Features

  • admin: show when each account was last around, in the users list (5fbb296)
  • chat: delete a single message, which the conversation had no way to do (19ca0a1)

Performance Improvements

  • admin: let the statement do the throttling too, so a restart costs nothing (a5eeb2f)

0.16.016 August 2026

Bug Fixes

  • personas: decide what a card offers from what it is, once, instead of once per view (0c6245f)
  • personas: let the store install what it has, and leave restoring to the copy that was edited (f15a044)
  • personas: one footer in every store view, and a footnote where a label was shouting (3d83727)

Features

  • admin: share the instance theme, and replay the welcome tour for everyone (680f8c0)
  • chat: add /clear, which sets a conversation aside instead of summarising it (385c3f4)
  • chat: call a persona into any conversation with @, and let several answer in turn (6a5e799)
  • personas: give everyone the views and the same cards, refusing what they may not do (afe8f89)
  • personas: keep installed copies current, and let an edited one take the published version back (3b0e0d0)
  • sessions: archive a conversation instead of losing it, and give a persona the menu its conversation has (61bb295)

Performance Improvements

  • search: record where a conversation was cut when it is saved, not when it is searched (b1e08df)

0.15.016 August 2026

Bug Fixes

  • library: keep the store shortcut in the personas heading as well as at the end of the grid (c8389de)
  • mobile: make the sidebar control float on home and library as it does in a session (5249a30)
  • personas: redraw the card so nothing hides and clicking it does what it looks like (0a14342)
  • personas: republish a shared persona when it is edited, and read its state against what is published (a0c4a41)
  • personas: say share where it means share, and drop the labels that repeated their own view (0de10fe)

Features

  • personas: compose each user’s store from what their instance offers, and tell a copy from a rewrite (05be3cc)
  • personas: give each one the language it answers in, and let the model stay yours (89534b3)
  • personas: let an admin share from the store, and govern who may install (2133467)
  • personas: make the store the one place an instance decides what it offers (fb9edf3)
  • personas: read them from a store over the network instead of shipping them in the app (d9234c5)
  • personas: separate relaying a store persona from sharing your own, and draw one card everywhere (8a77d14)

0.14.016 August 2026

Some cool news !

Replies no longer die with the page. A generation now runs in the server. Reload, follow a link, or let your phone put the app to sleep: the reply keeps being written, and the conversation picks it up where it was when you come back. Titles and automatic compaction moved with it, so a first exchange that lands while you are away no longer comes back untitled.

Where your conversation goes, in local mode. This is the part worth reading twice. Talking to a local Ollama, the browser used to reach it directly and the llooma server never saw your messages. A turn that runs in the server passes through it. That server is your own machine or your own container, and nothing leaves it, but it is not the same sentence as before. Settings → Chat → Generate on the server turns it off and restores the old path exactly.

Nothing changes in server mode: the instance already held the accounts, the connections and the keys, and the same admin rules apply on this path as on the proxy.

Two honest limits. Runs live in memory, so a server restart loses whatever was in flight. And in local mode the finished reply is held for a few minutes rather than written into the conversation, since the conversation belongs to your browser.

Bug Fixes

  • chat: apply a finished reply as history instead of replaying it (cdef7c9)
  • chat: leave the conversation’s scrollbar to the platform so it fades away (f59410a)
  • chat: pick a running generation back up when the conversation is reopened (b225758)
  • sidebar: forget the scroll direction when the list is built again (0b55e76)
  • sidebar: keep the profile avatar and its dot in place when the column narrows (2ed0adb)

Features

  • chat: run a generation in the server so a reload no longer loses the reply (cc3c232)
  • wallpaper: let the wallpaper show on a phone’s main view (dbb56b3)

0.13.015 August 2026

Bug Fixes

  • sidebar: let each block paint to the edge while its contents stay put (99127a4)

Features

  • pwa: let the app take its own screenshots for the install sheet (9a62c02)
  • pwa: offer to install the app, and stop asking when told to (2e2f4cc)

0.12.015 August 2026

Bug Fixes

  • sidebar: take the plate out from under a row’s pin and delete (08735f2)

Features

  • chat: give the phone its own floating bar instead of a squeezed one (27c9b91)
  • interface: offer a wallpaper pack and give its blur a slider of its own (790d2e4)
  • pwa: take the whole screen on iOS instead of the safe area (2445c0e)
  • sidebar: make the collapsed rail somewhere you can work from (9b52f18)

0.11.014 August 2026

Bug Fixes

  • chat: settle the floating bars’ size, spacing and footing (cd6efe4)
  • sidebar: animate the whole header, not half of it (03d79ec)

Features

  • documents: offer a sent document to the Library (d19aed6)
  • home: animate the prompt suggestions panel (88c2114)
  • interface: put a picture behind the app (9fb5d9d)
  • sidebar: condense the header on the way down, restore it on the way up (967fff7)
  • sidebar: give the collapsed rail the conversation menu and real tooltips (7f8af7e)

0.10.014 August 2026

Bug Fixes

  • data: stop reporting a signed-out boot as a failed load (c663610)
  • search: resolve reread requests against the source index (086bcc5)
  • server: treat a session whose user is gone as signed out (f1658a6)
  • settings: run the transparency slider from glass to tint (ce51f10)
  • sidebar: show the persona strip only once the grid is out of view (a456d66)
  • sidebar: stop clipping the active ring in the condensed persona strip (9cdef0a)

Features

  • settings: add a switch for the sidebar’s translucent bars (5995fd5)
  • settings: pair the transparency switch with an amount around a midpoint (921711d)
  • sidebar: condense early and let the grid fold once it is off screen (f9ac2ff)
  • sidebar: condense the header once the list scrolls (5e2866f)
  • sidebar: float the bars over the list they sit on (c2d8280)
  • sidebar: fold the persona grid away when the strip takes over (a6e8ebe)
  • sidebar: smooth the condensed header and mark persona conversations (c087c7a)
  • ui: make surface transparency a level rather than a switch (59005a6)
  • ui: narrow the transparency range and float the conversation header (f35d531)

Reverts

  • sidebar: drop the grid fold and keep the simple condensed header (09a0bc3)
  • sidebar: go back to the strip following the header (25e3058)
  • ui: leave the modal opaque over its blurred overlay (4501315)

0.9.06 August 2026

Bug Fixes

  • connections: ask Infomaniak for a product ID instead of a whole URL (73ea847)
  • make the knowledge save button save, and unblock the Docker build (36fd9a1)
  • mobile context menu, keyboard and theme colour (f34a038)
  • search: aim queries at the sources that hold the answer (bac029f)
  • search: don’t lose the router decision to the model’s reasoning (5b5d242)
  • search: scope the no-search notice to the current message (1349eeb)

Features

  • chat: carry tool definitions and tool calls through the strategies (7829476)
  • chat: detect native tool-calling support and make it selectable (4e1201e)
  • search: drive web search and page reads with native tool calls (950e98e)
  • search: keep an index of what was found, and let the model reread it (77eb950)

0.8.05 August 2026

Bug Fixes

  • open the collection picker instead of swallowing its click (c62680f)

Features

  • add a code view to the knowledge editor and make its title look editable (62751ee)
  • draw compaction in the conversation and tidy hover states (2ac3f65)
  • edit knowledge in a dialog and copy a conversation from the sidebar (1dd7711)
  • group knowledge into collections (d2c9352)
  • lay collections out as foldable sections instead of a folder to enter (a610de7)
  • one add-context menu with a searchable knowledge picker (2e8c974)
  • pick or create a collection without leaving the editor (7bced1e)
  • read attached documents in the browser (6bb9598)
  • right-click a sidebar row for pin, knowledge and delete (1142fd6)
  • show what a compaction freed and quiet down the summary (f9245f2)

0.7.04 August 2026

Bug Fixes

  • align the version row and move the release link onto the badge (7498f5b)
  • generate the SvelteKit tsconfig on install so dev and the docs build work on a clean checkout (876636e)
  • keep the update status row stable while a check runs (4781a9b)
  • show the documentation logo on dark backgrounds (35729fd)
  • update auth and kit to patch a critical advisory (360c508)

Features

  • compact long conversations to keep them within the context window (cc8637b)
  • link the documentation and the maintainer from the about panel (8e994df)
  • report when updates were last checked and what the check found (0ee1028)

0.6.03 August 2026

🦙 Hollama Next is now Llooma /ˈluː.mə/

Same app, same llama, its own name. The fork has diverged far enough from Hollama that sharing its name was becoming confusing, for the upstream project as much as for this one.

What changes for you

  • The repository is now cedhuf/llooma. GitHub redirects the old URLs, and your existing git remote keeps working.
  • The container image moved to ghcr.io/cedhuf/llooma. The old path is no longer published. A registry does not redirect the way a repository does, so an instance still pulling ghcr.io/cedhuf/hollama will simply stop seeing updates quietly, with no error.

Repoint it:

image: ghcr.io/cedhuf/llooma:latest

What you don’t have to do, your data migrates itself

  • The SQLite database is renamed from hollama.db to llooma.db on first start, -wal and -shm included. Look for Migrated hollama.db to llooma.db in the container logs; it runs once.
  • Browser storage keys are carried over on first load.
  • Backup files exported before the rename restore exactly as they did before, and always will, an exported file has no way of knowing the app changed its name.

Back up your data directory before updating anyway. The migration is tested, but your database is not the one it was tested on.

Bug Fixes

  • jump to the searched message on client-side navigation too (13e684e)
  • keep the full-search button in reach whatever the list length (1d81511)

Features

  • list the available keyboard shortcuts in settings (40bc84c)
  • rename storage keys to Llooma and migrate existing data (8a6b00e)
  • rename the app to Llooma (bb5bdbe)

0.5.03 August 2026

This release closes an unauthenticated Server-Side Request Forgery (SSRF) / open proxy in server mode.

What was wrong. The generic provider proxy /api/proxy/… had no mode check and no session check, and the auth guard deliberately exempts every /api path. In server mode it was therefore reachable by anyone who could reach the instance. With the default (empty) PROXY_ALLOWED_ORIGINS, it forwarded to any HTTP(S) target it was given, following redirects, with an Authorization header supplied by the caller.

Impact. An unauthenticated attacker could use the instance as a network client: probing hosts reachable from your server, including private addresses and the cloud metadata endpoint (169.254.169.254). Unlike the web-fetch tool, this route had no private-address protection.

What was not affected.

  • Your stored provider API keys. They are encrypted at rest and never travelled through this route; the Authorization header was the attacker’s own.
  • Conversations and other user data, this route reads no application data.
  • Local mode (PUBLIC_MODE=local), which is unchanged: the proxy exists there so the browser can reach Ollama on localhost and providers without permissive CORS.

The fix. /api/proxy/… now returns 404 in server mode. There is no functional change: the browser already talks to /api/llm/<serverId>, the authenticated proxy that verifies your session, checks you may use that server, and injects the decrypted key server-side.

If you cannot update right now, set an allow-list, it closes the open-relay behaviour on any version:

PROXY_ALLOWED_ORIGINS="https://api.openai.com,http://localhost:11434"

🗃️ Two data-loss fixes, equally worth updating for

  • A failed read was indistinguishable from an empty account. When the app came back to the foreground it re-read your conversations; if that read failed, a server restarting underneath it, a network blip, the empty result was treated as real data, and the next save replaced every stored conversation with the single one still open on screen. Reads now fail loudly, saving pauses, and a toast says so.
  • Every save rewrote the whole collection. Saving one conversation deleted and reinserted all of them, so a second client holding a slightly older list silently erased what the first had added, the ordinary PWA-plus-browser situation. Conversations are now written one at a time.

✨ Also in this release

  • Full-text search across every conversation (⌘K / Ctrl+K), with per-message excerpts and jump-to-passage. Server mode uses a SQLite FTS5 index; local mode scans in memory.
  • Conversations load on demand instead of all at boot, the sidebar now carries titles and dates, not entire histories.

Upgrading

podman pull ghcr.io/cedhuf/hollama:0.5.0

Back up your SQLite file first. This release adds migration 6, which creates the full-text index and fills it from your existing conversations. It runs once, is not reversible to the previous schema version, and makes the first start after the update noticeably longer in proportion to your history.

0.4.030 July 2026

Bug Fixes

  • define the composer tool menu once instead of in each composer (32c8da7)
  • offer the page-reading tool on the home composer too (be41d32)
  • search when the model does not know, and admit when it has not searched (ea195b3)
  • stop auto-follow fighting the reader and set the reasoning apart (7b7b111)

Features

  • close the timeline with a Done step and let it follow along while the model works (fbe8419)
  • enforce shared models and locked prompts in the LLM proxy (6a1a6b6)
  • keep the whole reasoning trace when the model reads a page (ab56346)
  • show what a turn did as one timeline instead of widgets that flicker (e6075f9)

0.3.029 July 2026

Bug Fixes

  • stop dialogs scrolling themselves when a revealed control takes focus (c480590)
  • tell the model when the pages it asked for could not be read (a6d45d3)

Features

  • announce a new release with a dismissible toast (7e23e9e)
  • let the model open a search result instead of answering from snippets (df63098)
  • read the pages a message links to instead of searching around them (284a7b3)

0.2.029 July 2026

First tagged release

The app doesn’t change in this release, it’s the point where the fork stops being a moving target and starts having version numbers.

Since the fork, some few of the mdifications

Providers - Claude and Infomaniak added alongside Ollama and any OpenAI-compatible server, picked from a card grid instead of a dropdown. Each connection gets its own colour and label, shown wherever its models appear, and its own display names so mistral/Mistral_Small-24B-Instruct can read as something human.

Chat - AI-generated conversation titles, web search per message, interactive choices when a request is ambiguous, system prompts at three levels, and a message layout rebuilt from scratch: the assistant answers as plain prose, you speak in a bubble, actions sit under the message they act on.

Personas - reusable characters with an avatar, a system prompt, a model, a greeting and their own knowledge. Importable from OpenWebUI exports, pinnable to the sidebar, shareable across a team in server mode.

Server mode - multi-user with email/password and OIDC sign-in, per-user storage in SQLite, and provider API keys that never leave the server.

Interface - six themes with light and dark ramps, settings rebuilt on shared components, dialogs full screen on phones, English and French with automatic fallback, and a new logo. Also a major ui rework since the fork, and a working pwa.

Under the hood - Svelte 4 → 5, Tailwind 3 → 4, npm → pnpm, Node 20 → 26, Electron removed (todo : tauri desktop version).

The full list is in CHANGES.md.

What this release actually changes

  • Images are published per release, not on every push to main.
  • :latest follows releases. Each one is also tagged with its version, so ghcr.io/cedhuf/hollama:0.2.0 works if you’d rather pin.
  • The update check has something to read. Settings → About → Check now was querying an empty release list until now, so it always answered “up to date”.

Versions start at 0.2.0: 0.1.0 was tagged as a baseline and never released.

Still an early preview — expect rough edges, and see the disclaimer in the README.