Skip to content

Cobblr 2026.8.1

Latest

Choose a tag to compare

@cobblr-hq cobblr-hq released this 27 Aug 19:05

Cobblr 2026.8.1

Changes from 2026.8.0 (10 August) through 27 August: 114 features, 128 improvements, 155 fixes, 397 in all. This is the first stable in 17 days, and most of that time went into scanning, purchases, and the assistant. Features and improvements are listed in full below; the fixes are in the changelog, linked at the end. This is the part worth reading first.

Read before upgrading

  • A self-host instance now refuses to start in production with a placeholder secret. If your .env still carries a template default for the session key, the credential-encryption key, or the database password, the server stops with a message instead of running on a publicly known signing key. Generate real values (the setup builder does it, or the openssl one-liners in the template) and it starts as normal. This is the only change in 8.1 that can stop an existing install from booting.
  • Migrations are additive. Nothing in this range drops or renames a column, so 2026.8.0 can be run against a database that 8.1 has migrated, if you need to roll back.
  • A blank line in .env no longer prevents startup. An empty value now means "not set", which is what compose passes anyway.
  • The self-host stack now takes a nightly database dump you can restore from, instead of relying on a copy of the data directory taken while Postgres is running.

Security and stability fixes

The first two had no user-facing symptom and are the reason to upgrade even if nothing else here applies to you.

  • Requesting an API token with a scope the build did not recognise silently minted an unrestricted one. Unknown scopes were dropped, an empty scope list meant "full access", and the caller got a credential more powerful than the one they asked for. It now fails with unknown_scope and mints nothing.
  • A dropped tenant database could take down the whole API. The provisioning pool had no error handler, so a Postgres admin_shutdown during tenant teardown terminated the Node process, and every request failed until a restart. It now logs and carries on. This was hitting roughly one CI run in ten before it was found.
  • Closed several authorization gaps: a sandboxed app can no longer change workspace configuration through its scoped token; a workspace admin can no longer demote or remove an owner; the forwarded Discord button endpoint requires a token minted for it; a removed platform admin loses impersonation immediately rather than for the life of an outstanding token; a guest can no longer be handed a capability grant.
  • A required password reset is enforced server-side, not only in the app. Signup invites default to a 14-day expiry instead of living forever, and requesting a new reset link invalidates older ones.

What changed, by area

Scanning (84 entries). A forwarded receipt now keeps the whole purchase: who sold it, what it actually cost after any discount, and when it is due to arrive. A confirmed receipt fills in your own custom fields by what they mean rather than what you named them ("Acquired from", "Source" and "Bought from" all work). Scanning a screenshot of a listing crops the item's own picture out of the page for its catalog photo. Replay is now safe: it re-applies today's processing to an older scan and can no longer overwrite a good name with a worse one, which the previous fallback could.

Purchases (25 entries). Paste a tracking number and Cobblr works out the carrier, follows the parcel on its own schedule, and only asks about an order when there is something to answer. It works while the receipt is still in the scan inbox. FedEx connects directly; a tracking service on your own network can be reached through an edge bridge.

Ask Cobb (78 entries). He can now see your attention feed, activity log, notifications, maintenance and calendar, your lists, saved views, automations, apps, templates and units, and the actual items in your scan inbox rather than just a count. He can run the actions he could previously only describe, and answers stream in as they are written. A delete always waits for your confirmation, even when changes are set to apply automatically.

Fields. A field can hold a person from the workspace. A custom field can carry a role that says what it means (identifier, expiry, category, packaging, assignee). A dropdown value can carry a one-off note beside it without becoming a permanent choice.

Elsewhere. An edge bridge installs and updates its own driver packages. A Cobblr account can sign you in to a surface and hand you a workspace on the spot. Self-hosted instances serve their own MCP endpoint. The empty Locations page has a button to create your first location again; the put-away walk opens reliably after Accept all; customising a starter template validates instead of returning an error.

Still rough

Digifab (sending jobs to printers and laser cutters, watching for failed prints) is in and marked experimental. Browser push is not a finished notification channel and no longer claims to be. The nightly e2e suite had been failing for six weeks before this release and was repaired as part of it; expect it to catch more in the coming days.

Images

ghcr.io/cobblrhq/cobblr-{api,web,db,caddy}:2026.8.1, amd64 and arm64. 2026.8, stable and latest all point at this build. Self-hosting guide and setup builder: https://docs.cobblr.xyz


Features

  • fields: Fields can now hold a person. Pick a Member field in the field builder and the field becomes a dropdown of everyone in the workspace, showing their name rather than an id, with Unassigned as a real option. Renaming someone updates it everywhere, and a person who has left still shows on records they were on.
  • scan: You can now crop your own scan photo into the item's catalog picture, instead of taking whatever the web turned up.
  • fields: Four new field roles describe how something came to be yours: where you got it, when, what it cost you, and who sold it. Mark your own fields with these and a receipt can fill them in for you, whatever you happen to have named them. "Acquired from", "Bought from" and "Source" are the same idea, and saying so is what lets Cobblr work on all three.
  • fields: A dropdown field can carry a one-off note beside its value. Pick "eBay" from the list and note the specific seller next to it, and the record reads "eBay · detroitaxle". The value stays "eBay", so grouping, filters and saved views still gather every eBay purchase together however many sellers you have noted. Useful when a detail is worth keeping but does not deserve a permanent spot in your choices list.
  • fields: A custom field can say what it means, not just what it is called. Fields you create yourself can now carry a role from a short standard list (identifier, expiry, category, packaging, assignee), the same list bundles use. A field named "Best before" and one named "Use by" are the same idea, and saying so lets Cobblr fill it in for you, match it against a field someone else made, and warn you before you end up with two fields for one thing.
  • scan: A confirmed receipt fills in your own fields. If you have a field marked as "acquired from", "acquired on" or "acquired for", a receipt fills them in for you: where you bought it, when, and what it actually cost after any discount. It matches on what your fields MEAN, not what you named them, so "Acquired from", "Source" and "Bought from" all work. On a marketplace the individual seller is kept alongside the shop rather than replacing it.
  • scan: A forwarded receipt now keeps the whole purchase, not just the item. Alongside the line items, Cobblr reads who sold it, what it actually cost you after any discount, and when it is due to arrive. Marketplace orders keep the shop and the individual seller as separate facts, because you shop at one again and probably never deal with the other twice.
  • scan: Replay now means "re-apply the latest processing", and it can no longer make an item worse. What the AI works out about an item (its name, brand, category, what the photo shows) is stored on the item. Everything after that (which table it belongs in, which fields fill, the pack size, a decoded serial, the catalog photo) is worked out from that stored answer by Cobblr's own code. Replay redoes the second half with the code as it is today and never touches the first, so it costs nothing, returns immediately, and has no new information to overwrite anything with. Previously it re-asked the AI for a copy of an answer it already had, and when that copy could not be found, degraded to a keyword guess that could overwrite a good name with a worse one. Use it to bring an item you scanned last month up to date with an improvement that shipped since. Re-run AI is still the one that takes a fresh look. Scan names that an earlier replay truncated are restored automatically.
  • scan: You can paste a screenshot straight into the scan inbox's search box, instead of saving it to disk first so you can drag it back in. Pasting text still searches as it always did.
  • purchases: An order with an expected arrival date now asks you whether it turned up, on the day it was due, instead of sitting open forever.
  • devices: An edge bridge can now install and update driver packages from Cobblr, instead of you editing a config file on the machine it runs on.
  • auth: A Cobblr account can now sign you in to a surface directly, instead of that account only existing to be verified.
  • auth: Signing in with a Cobblr account on a surface that welcomes new people now gets you a workspace on the spot, instead of a dead end.
  • scan: Scan a screenshot of a listing and Cobblr crops the item's photo out of it. Upload a marketplace or shop screenshot and the item's own picture is cut out of the page, away from the chrome, price, buttons and seller, and used as the catalog photo. It is a picture of the actual item you are getting rather than a stock shot of some other unit of the same product, it appears instantly because nothing has to be searched or downloaded, and it cannot break later the way a hotlinked image can. The internet options are still one tap away in the photo strip, the crop stays there as a "From your screenshot" pane so you can go back to it, and Revert undoes it like any other picture change. Costs no extra AI: the read that identifies your item answers this at the same time.
  • purchases: Cobblr now follows a tracked parcel on its own schedule, uses the carrier's date when it is better than the seller's estimate, and only asks you about an order when there is something to answer.
  • purchases: Paste a tracking number on an order and Cobblr works out which carrier it belongs to, then links you straight to their tracking page.
  • purchases: Connect FedEx and an order with a tracking number shows where the parcel actually is, with its scan history.
  • purchases: A tracking service running on your own network can now be reached through your edge bridge, so hosted Cobblr can follow parcels it could not otherwise see.
  • purchases: Connect a tracking service and Cobblr can follow parcels from any carrier, including ones it has no built-in support for.
  • core-ai: Ask Cobb can now answer what needs you, what changed, what you missed, what is due for service and what is coming up: he reads your attention feed, activity log, notifications, maintenance and calendar.
  • core-ai: Ask Cobb can now see how your workspace is set up, your lists, saved views, automations, apps, templates and units, and can add a unit for you when you ask.
  • core-scan: Ask Cobb can now see the items in your scan inbox, not just the count: ask what is waiting, what needs a look, or what has been sitting there for days, and he reads the actual queue.
  • purchases: A receipt with a tracking number is followed while it is still in your scan inbox, so you are told when the parcel lands without having to file it first.
  • purchases: Add a tracking number to a receipt while it is still in your scan inbox, and Cobblr files it as still on its way instead of already arrived.
  • scan: A scan item's fields are chips now, not a page of boxes. Opening an item used to give you one labelled box per field, including every field the table defines that the scan left empty, which on a phone ran well past a screen. Now each field is a small chip sized to its own value, several sit on a row, and the fields nothing filled in are offered underneath as a row of named chips rather than hidden behind a "+1 more field" counter that never said what it was hiding. Tap any chip to edit it right there: the chip holds its place so nothing shifts under your finger, then grows as you type so you can always see the whole value instead of scrolling inside a tiny box. Tap one of the offered fields and it opens ready to type, and if you change your mind and leave it blank it goes back on offer instead of sitting there empty.
  • platform: Ask Cobb can now change your workspace's own setup, with your confirmation: add a custom field, create a separate list from a module, and switch an automation on or off.
  • core-ai: Ask Cobb now walks you to the screens he cannot operate for you, with the form already filled in: ask him to invite someone and you land on Members with the invite ready, you press Send.
  • purchases: Parcels on their way now show up on the dashboard, and a tracked receipt shows where its parcel is on the item card itself.
  • scan: You can now choose a picture already on your device when adding one to a scan item, instead of only taking a fresh photo. A picture you choose is attached to the item without changing its name or its main photo, because a file off your camera roll is often a listing screenshot or a spec sheet rather than a photo of the thing.
  • scan: The scanner now greets you with the items you marked for a photo, so you never have to find them again in a long inbox. Tap the line to point the camera at one; your next shot becomes its picture.
  • scan: Scan inbox cards now carry a camera button. On a phone it opens the camera pointed at that item. At a desk, where you probably cannot take the picture, it marks the item instead so it comes to you on your phone rather than you hunting for it in a long list.
  • scan: The dashboard now lists the items you marked for a photo, and each one has a button that opens the camera pointed straight at it.
  • platform: Self-hosted instances now serve their own MCP endpoint, so connecting your own Claude to your workspace, and letting Ask Cobb read it through a local bridge, works without the hosted service.
  • scan: You can attach a receipt to an item you already have. Choose the PDF from the item's own camera button and Cobblr reads it into a purchase, links the item to it, and puts nothing in your inbox, because that item is already there.
  • scan: A scan item whose receipt listed other things now says so on its card, and opens to show what they were.
  • maintenance: Ask Cobb can keep your service log. Tell it what you did to something and when, and it records the entry against that thing, or schedules the next one if you say when it is next due. It can also mark a scheduled job done. Until now Cobb could read a service history and had no way to add to it.
  • locations: Ask Cobb can put your locations in order. Say which shelves or racks under a place should come first and Cobb sets that order, the same order dragging them in the tree produces. It orders one parent's children at a time, and it will tell you if you have mixed locations from different parents rather than quietly renumbering both.
  • projects: Ask Cobb can do more of the everyday things you could only click before. It can say that a task is waiting on another task or on a record like a purchase order, and remove that dependency again. It can add a line to a purchase or sales order you already raised, and add an inventory category.
  • tags: Ask Cobb can tidy up for you. It can merge two tags that mean the same thing, clear the done items off a list, and refresh a catalog from the source it was built from. All three were things you could do by clicking and Cobb had no way to do at all.
  • auth: You can now sign in with your Cobblr account from the sign-in page, and your account page lists the Cobblr instances you can reach.
  • ai: Cobb answers some questions before you finish typing them. Start writing "how many locations do I have" and the answer appears in a green bubble under the conversation, straight from your workspace, with no AI asked and nothing spent. It works with no AI connected at all. Only questions it can answer exactly are shown, so an unfamiliar word, a request to change something, or anything ambiguous is left alone for the assistant as before.
  • ai: Cobb's answers now appear as they are written, a few words at a time, instead of the whole thing landing at the end of a long wait. A reply that takes ten seconds starts showing up after three. This works with a self-hosted Claude bridge, which now streams from the CLI for real rather than waiting for the whole answer and sending it in one piece, and with any other provider whose API streams.
  • ai: Ask Cobb's no-AI mode now shows you what it could not answer. Every question that falls through to the "I only handle the basics" reply is collected under Configuration then Assistant, most asked first, in the words the person used, and one click turns any of them into an answer. It also gained answers for the things people actually type that it used to ignore: try again, yes go ahead, stop, undo, and questions about your own records like "how many do I have" or "where is my ...".
  • ai: Ask Cobb now answers the everyday questions while you are still typing them, in a green bubble that says where the answer came from and costs no AI call. "What can you do?", "where do I scan?" and the rest come from what he already knows; questions about your own records still come from a read of your workspace. Cobb's written answers also know whether your workspace has AI connected, so a connected workspace is never told it isn't.
  • inventory: Ask Cobb can set stock aside for a job and settle it later. Tell it to reserve some of a part for a project and it holds that amount without moving your stock; when the work is done, consuming the reservation takes the stock and puts a line on the part's statement, and releasing it simply gives the reservation back. Cobb could move stock before but could not reserve it, so this was the last everyday inventory job you could only do by clicking.
  • ai: When what you are typing to Cobb is something your workspace already knows how to do, it says so before you send it. A strip above the box shows what it would do, and tab takes it: the work happens straight away and no AI is asked. Pressing enter still sends the message to the AI as it always did, so the quick way is something you choose rather than something that happens to you. This works whether or not AI is connected.
  • ai: Cobblr now remembers which message produced which change, so a thing you asked for once can become something your workspace does on its own. Ask for twelve racks and the twelve records that appear are recorded together with the sentence that asked for them, then generalised into a reusable command with the numbers and names as blanks to fill in.
  • ai: A brand-new workspace already knows how to do a few things, with no AI connected and nothing taught to it. Modules now ship the sentences their users commonly type, so "make Shelf 1 through 4 in Garage" works on day one, and one command covers shelves, bays or bins alike. A command your own workspace learned can also be exported as the snippet to contribute it back, so something that turns out to be common can ship for everyone instead of being taught again in every workspace.
  • scan: Point the camera scanner at a paper receipt and it is read as a receipt: one inbox line per item, under its own "Receipt" session, with the purchase recorded. Before this it was filed as a single thing you owned, named after whatever text the camera could read off the paper.
  • ai: A workspace can now be taught to do something and then do it with no AI at all. Ask an AI for twelve racks once, and under Configuration then Assistant that becomes a command you can keep. From then on the same kind of sentence, with different numbers or a different place, offers to run itself and needs only a yes. Every change it makes is recorded and undoable exactly like one an AI made, and a sentence that does not fit is refused rather than guessed at.
  • ai: Setting up AI now shows numbered steps with real links, instead of a bare box asking for a key.
  • ai: Every record's detail page now has a small Cobb button beside its other actions. Press it and that record is what Cobb is talking about: the panel opens, the chip says its name, and your question carries the record itself rather than a name he has to go and find. Press it again to drop it. It is always visible rather than appearing on hover, so it works the same on a phone as on a desktop, and it lights up in the same amber as the highlight on the page.
  • ai: Ask Cobb for a whole set of records and he now makes them in one go. "Each rack should have Shelf 1 through 5" used to become sixty separate requests, one a second, with a spinner for two minutes; it is now a single one that takes seconds, and it arrives as one line in the chat with a single Undo that puts all of them back. Anything already there is counted and named rather than duplicated: "Added 58 locations. 2 were already there."
  • cadence: Your tables can now show how often you re-buy something, and how long what you have will last. Cobblr has been learning both from ordinary shopping for a while, but the only way to see them was one item at a time. They are now field values, so you can put them in a table, sort by them, and see the whole cupboard ranked by what runs out first. Both stay blank until Cobblr has seen you buy the thing twice, because a guess from one shop would be made up.
  • ai: When your AI is a personal connection that does the work itself, Cobb now shows each step as it happens instead of sitting on "Thinking". A request that added sixty locations over two minutes used to show a spinner and nothing else, because the tool calls were happening on the far side of one long request; now each one appears as it runs, named, with a tick when it lands. The step list also stopped printing raw record data at you: a finished step reads "Adding a location - Shelf 1".
  • dashboard: The dashboard now opens with what is late and what is coming. A new "Up next" section lists everything dated across your whole workspace in one time-ordered list: maintenance you scheduled, tasks with a due date, orders you are expecting, things that expire, and any date field on any of your own records. It is grouped into Overdue, Today, Next 7 days and Later, each row saying which tracker it came from and how far away it is, and each row clicks through to the thing itself. Anything you have set a date on is already in here, with nothing to configure. The section hides itself when nothing is scheduled, and you can move or hide it with Arrange dashboard like any other.
  • ai: "Delete duplicates" now works with no AI connected. Cobb looks for places with the same name in the same spot, tells you what he found ("Delete 2 duplicate places (Shelf 1, Shelf 2), keeping the original of each"), and does it only once you accept. Pointing at something first scopes it, so with a rack selected it means the shelves in that rack rather than everything you own. The removals are tracked and undoable like any other change. And when you press enter for the AI instead of taking the free offer, the assistant is now told what that offer had already worked out, so it does not go and solve the same problem from scratch or ask a question the offer had answered.
  • ai: "Delete duplicates" now covers parts as well as places, and any other kind whose module says what "the same place" means for it. Two shelves with one name in one rack are duplicates; the same two in different racks are not. Two identical parts in one bin are a double entry; the same name in two bins is two piles of bolts. A kind that has not said how to read it is never touched, because two assets called "Drill" are usually two drills, and guessing otherwise is how an assistant deletes something you meant to keep.
  • ai: Connect a free Google AI Studio key to power scanning, image identification, chat and tool calls, without pasting a base URL.
  • ai: Tick some rows or highlight some text, and Ask Cobb knows what you mean by "these". The selection appears as a chip above the box ("In context: 12 locations") and goes with your message, records and all, so "delete duplicates" acts on the twelve you picked instead of hunting through the workspace. A highlight used to vanish the moment you clicked into the chat box, which made it useless for exactly the question you were about to ask; it is now captured when you make it and held until you send or dismiss it.
  • ai: Ticking rows now tells Cobb what you mean on every list, not just Locations. Parts, assets, machines, projects and purchase orders all put what you selected in context, so "order more of these" or "move these to the Garage" acts on exactly the rows you picked. Lists whose checkboxes are not workspace records, like the scan inbox, say so rather than sending ids that would mean nothing.
  • ai: Two more jobs Cobb can do with no AI connected. "Fix broken links" finds records filed in a place that no longer exists and clears the dead link, leaving the records themselves alone. "Delete empty places" finds places with nothing inside them and nothing filed in them. Both say exactly what they would touch before they touch it, and both are undoable. You have to say the word "empty" for the second one, since everything you number in a run is empty the moment you make it.
  • ai: Undo now takes back what Cobb did without taking back what you did after him. If you edited the same record before pressing Undo, your edit stays: the fields still as Cobb left them go back, the ones you changed are kept and named ("Left the notes as you set it"). If your edit was to the very thing Cobb changed, the undo declines rather than overruling you, because yours is the more recent word. A record you have since used or renamed is not deleted by undoing the create that made it, and a record you deleted is never resurrected by undoing an edit to it.
  • ai: An undo that stops short now offers you the rest instead of leaving it there. "Put back 5 of 6. Left Shelf 3 alone, because you have changed it since" comes with a "Take that one back too" button: nothing is decided for you, but the choice is one press away rather than something you have to go and do by hand. Taking the offer is itself a tracked change, so it can be undone in turn.
  • ai: Undo now puts things back rather than doing the opposite. A record Cobb deleted comes back as itself, with its own id, so everything filed inside it or pointing at it is pointing at it again; before, a lookalike was created with a new id and the old links were left dangling. An edit is reverted in full, including fields the change touched indirectly, and if something else edited that record in the meantime you are told rather than having it quietly rolled back too. Undoing a whole instruction is one request now: "each rack should have Shelf 1 through 5" goes back in one press, in seconds.
  • account: Your account is a set of cards now, like Configuration. It used to be three big open forms stacked down the page with five one-line links underneath that were easy to miss. It opens on four cards instead - You, Notifications, Connections, History - each naming what is inside it, and each one clicks through to a page listing those settings with a line on what they do. Identity and password share one page. Connections carries an + Add a connection button that takes you straight to the form. The page is also called the same thing everywhere now: the sidebar, the phone menu and the Connections back-link all said "Profile" while the user menu said "Your account".
  • ai: Your AI key is checked as you paste it, and the model becomes a dropdown. Before, a key was only tested after saving, so a wrong one got written down and the connection sat there broken until you went back to edit it. Now the form checks what is currently typed and says so underneath, a moment after you stop: Works, or the reason it did not. Nothing wrong is stored. The same check asks the provider which models it serves, so the Model field turns into a list you pick from instead of a name you have to type exactly right. A provider's list is not curated: Google AI Studio reports 51 models and most of them make video, music or speech and cannot answer a prompt at all, so the chat ones are grouped at the top and the rest sit under them. Nothing is hidden. All three places you can add a key do this: adding a provider to a workspace, replacing its credentials, and your own connections under Your account.
  • assistant: An action you bound to a kind now appears on every row of that kind, not only on each record's own page. Bind label printing to everything physical once and every row has a Print label button.
  • assistant: The Cobb button that puts one record in context now sits on list rows too, not only on a record's own page. Every area and container on Locations has one.
  • platform: The feedback box can point at every place you run, not just Discord. It offered one community link, hardcoded to a chat invite; a forum or a docs site had nowhere to go. An instance now lists whichever it has - Discord, a community forum, an issue tracker, documentation - each with a line saying what you would go there for, in the order that answers a question fastest. They appear in the feedback box and the account menu. Set none and no links show.
  • notifications: You can now set a delivery window on a channel. Choose immediate or a daily time, in your own timezone, per channel. An unrecognised timezone is refused when you save it rather than accepted and then quietly ignored.
  • platform: Pressing a button on a Cobblr notification in Discord now does the thing, without opening Cobblr.
  • platform: A notification can now carry the action that resolves it, so a Discord message about a delivered parcel comes with a button to say you have it.
  • notifications: You can now say when a channel is allowed to interrupt you, instead of hearing about everything the moment it happens. Set a delivery window on a channel and anything routine waits and arrives together, once, as a single message. Anything urgent still comes straight through, so choosing a quiet channel never means missing something that mattered. In-app notifications are unaffected and always immediate.
  • ai: When more than one of your AI connections serves a workspace, you now choose which goes first, and the screen tells you what is already powering it. Before, whichever connection you edited most recently quietly won.
  • fields: Sets of fields you can switch on in one click, starting with Provenance: where each thing came from, when, and what it cost.
  • bundles: Installing a bundle now tells you what it changed and where it went, including when it adds to a table you already have instead of making one of its own.
  • scan: Scanned food now records how it needs to be kept, separately from where it is. Frozen, refrigerated or ambient, worked out from what the item is. That is a fact about the product; where it currently sits is a different fact and stays on its location. Keeping them apart means Cobblr can eventually tell you when they disagree. Anything you set yourself always wins, and nothing is guessed when the item does not say.
  • inventory: Several of the same thing bought on different days now each keep their own use-by date. Four meals in the fridge, two from Sunday and two from Wednesday, are no longer one date pretending to cover both. You are told about the oldest one, the rest are left alone, and once you have eaten it the warning moves on to the next by itself. Everything you already track carries on working unchanged; nothing needs re-entering.
  • bundles: A bundle can now offer to set up the places its things live in. Groceries offers a Kitchen with a Fridge, Freezer and Pantry inside it, so you can put a label on each and scan things straight in. If you already have a Kitchen, they go inside the one you have and nothing already in it is moved. It is a question at install, not something that happens to you, and declining changes nothing else about how the bundle works.
  • discussion: Mention @cobb in a discussion and he answers there, where everyone can see it. Replying to him carries on the conversation without mentioning him again.
  • discussion: Discussions now keep up with you: a Discussion page listing everything with something new in it, an unread dot, and a bell to follow or stop following any record.
  • discussion: Type @ in a discussion to name a person, a record, or Cobb. Naming a record links the two together, both ways, using the same Linked entities you already have.
  • discussion: You can now talk about a record with the people you share a workspace with: every part, printer, location or entry has its own conversation, in the panel beside it.
  • discussion: You can now reply to a specific comment in a discussion. The reply quotes what it answers, and tapping the quote jumps to the original.
  • knowledge: Pin a knowledge entry and it stays in the side panel on every page, so the things you keep needing are one glance away instead of one search away.
  • scan: Fill provenance fields from receipts you scanned before those fields existed, and Groceries now records the day you bought something rather than the day you scanned it.
  • inventory: Adding another one now dates it properly instead of making it inherit the last one's use-by. Say how long something keeps and adding one records that it arrived today and works out its own date. Eating one always takes the oldest, so once the urgent one is gone the warning moves on by itself. Nothing to type, and nothing you already track changes until you use it.
  • inventory: Cobblr can now work out how long your things keep, from what you tell it you did. You do not need to know that a jar of pesto lasts five days once opened. Mark it opened when you open it, and mark it thrown out if it goes off, and after a couple of jars Cobblr knows. Finishing something never counts as a measurement, because eating it early proves nothing about when it would have gone bad, so the figure is only ever learned from things that actually spoiled.
  • scan: Cobblr now tells you when something goes somewhere it should not. Put a thing that has to stay frozen into a cupboard and you hear about it straight away, rather than finding out later. It only speaks up when it actually knows how the thing must be kept, so it stays quiet rather than guessing, and it never comments on shelf-stable things. This one interrupts instead of waiting for a daily summary, because a message about food spoiling is no use tomorrow morning.
  • tags: Tags now sort by how much they still matter, and a tag you have not used in months folds away behind a "+N" instead of sitting on every record forever.
  • views: The vending board can now be tapped. It has always shown what you have and never let you change it. A "Use / restock" button turns on a plus and minus on every tile, so you can record what you used while standing in front of the cupboard rather than going back to a laptop. Undo sits next to the toggle, because a mis-tap on a screen you walk past is going to happen.
  • ai: Cobb can now rename a field, make it required, replace a dropdown's choices, or take a field off a kind of record. Name the field the way it appears on the form. A field that applies to a whole class of records (everything physical, say) is refused with a note about where it lives, so a change meant for one list cannot land on all of them.
  • ai: Cobb can switch a whole set of fields on across everything it applies to ("track where my things came from"), and rename a heading on a form.
  • ai: Cobb can lay out a form for you: "put purchase date and supplier under Buying" creates the heading and moves those fields under it, in the order you named them, and taking them back out removes a heading nothing is left in.
  • assistant: Ask Cobb to group sections in your navigation and he does it. "Put Spices and Tea under Kitchen" creates the heading and moves them under it, as a change you confirm and can undo, instead of telling you which settings screen to open.
  • ai: Cobb can rename what a list is called ("call my parts spools"), give a category a list of its own ("give spices their own list"), and fold one back where it came from.
  • ai: Cobb can turn a Cobblr feature on or off for your workspace when you ask for it by name, so "I want to track maintenance" sets it up instead of telling you where the switch is.
  • discussion: When someone mentions you, the Discord DM now carries a Reply button: press it, type, and your answer lands in the discussion without opening Cobblr.
  • discussion: Discussion and tags now work on every record, including inventory parts.
  • views: A view can now be filtered to several places at once, not just one. A screen mounted between a fridge and a pantry can show both cupboards and nothing else. Filtering to a list of values used to be quietly ignored, which showed you everything instead of what you asked for; an unusable filter now shows nothing, so a mistake is visible rather than silent.
  • bundles: Groceries is now its own table rather than extra columns on Inventory, so a scanned cucumber and a scanned bolt no longer share a list. Groceries, Tea and Spices sit together under one Kitchen heading in the nav, and Tea and Spices now reach the shopping list when they run low, which they previously did not. Anything already filed into Inventory stays exactly where it is and keeps all its columns.
  • scan: One button files everything waiting, adding to what you already have instead of making a second one. A receipt saying three cucumbers now finds the cucumbers already in your kitchen and adds to them. It shows you what it would do before it does anything, and anything it cannot tell apart is left for you rather than guessed at.
  • discussion: Builds, knowledge entries, lists, projects, sales orders, tracked metrics and catalogs can now be tagged and discussed, like the rest of your records.
  • notifications: Conversation can now reach you as it happens while everything due today waits for one message in the morning, on the same channel.
  • discussion: You can now talk to the whole workspace, not only about one record at a time.
  • projects: Attaching a pattern PDF to a design now pulls the finished-object photo out of it automatically, and the "pull photo from PDF" link becomes a way to see the other images in the pattern and pick a different one. The picker was measured on 26 real PDFs before being trusted to run unasked: it now tells a photograph from a chart, a logo or a coloured diagram, and attaches nothing rather than a diagram when a pattern has no photo. Patterns exported with JPEG 2000 images, which used to come back as "no photo found", now yield their photos too.
  • discussion: You can now mark a discussion settled (and reopen it later), and edit your own comments, straight from the Discussion tab and the Discussion inbox.
  • kitchen: Food stops going bad at midnight. Give an item a grace period (the "Still fine for" field groceries already carry) and the kitchen wall shows an orange "1d past its date, still OK" instead of flipping straight to red, and automations that react to something expiring hold off until the grace has actually run out. Items without a grace behave exactly as before.
  • kitchen: The dashboard now offers to move items into the table they look like they belong in: food filed in plain Inventory before the Groceries table existed gets a one-press "Move N to Groceries" card, and nothing ever moves without that press. The Groceries table also gains the two re-buy views Tea and Spices already had, and fresh installs get one pinned "What's on hand" instead of a second, permanently empty copy.
  • notifications: Notifications about a conversation now carry the conversation. The bell and the cross-workspace inbox show the comment you were mentioned in under the one-line summary, the same way a Discord DM already does, instead of telling you something happened and making you open the app to find out what. When Cobb answers a question in a discussion, the people following that thread are notified like they would be for any other reply, so asking from your phone and walking away works. And a reply posted from Discord now names its workspace properly instead of saying "your workspace".
  • platform: A public demo can hand visitors its login instead of making them find it. Set COBBLR_DEMO_SIGNIN_EMAIL and COBBLR_DEMO_SIGNIN_PASSWORD and the sign-in page shows that shared login and pre-fills both fields, so the first thing someone does is press one button. COBBLR_DEMO_SIGNIN_NOTE adds a line of your own underneath ("Everything here resets every 15 minutes."). Both credentials are required or nothing is published, and it never overwrites something a visitor has already typed.
  • ai: Without AI connected, "yes", "again", "undo" and "stop" now act on the conversation instead of apologizing: yes runs the command Cobb just offered, again re-runs the last one, undo puts its changes back, and stop waves an offer away. No model is involved; the words do what the buttons do.
  • integrations: One-click "Import from Part-DB (live)." Under Configuration → Integrations → Migrate in from another app, a new Part-DB card imports an electronic-component inventory in one step: paste your Part-DB address and an API token, and it brings your storage-location tree, your categories, and your parts across (name, description, stock total, minimum, manufacturer and part number, unit, supplier link, with the rest of each part's Part-DB record kept in its details). A part that Part-DB stocks in more than one place lands at its first lot's location, and the import summary tells you how many parts that applied to. When it is done it asks whether to keep it synced or import just this once; either way the connection is saved under Live sync. A Part-DB on your local network is reached through your workspace's edge bridge.

Improvements

  • feedback: The server now says at startup where user feedback goes: either "Discord OFF, feedback stays private" or a note that new reports are posted to your configured webhook and so leave the instance. Whether a report stays between the reporter and you came down to one environment variable, and nothing told you which way it was set.
  • fields: You can now create a relation field, the one that links a record to another record, from Configuration then Fields. The type existed and worked, but it was only reachable by installing a bundle, so it never appeared in the field builder.
  • release: The changelog publisher runs hourly instead of once at 08:00, and holds until the self-host images for that release are actually published, so a release cut during the day is announced when it is pullable rather than the next morning.
  • ops: Operator tooling: the cross-instance console can now act on a report, not just show it. An edit is forwarded to the deployment that owns the item, so the reply reaches the reporter through their existing thread and notification.
  • ops: Operator tooling: the triage card moved into the shared UI package and a cross-instance ops console now mounts it, so one component serves both the per-instance console and the multi-instance view.
  • auth: API tokens gain an ops:read scope: read-only access to the operator overview and product metrics, and nothing else. It exists for a monitoring or reporting tool that should be able to see the dashboards without being able to read tenant data or write anything.
  • deploy: Settings the deployment docs offer now actually reach the container, including the signup rate limits and five sandbox tuning knobs whose documented names the code never read.
  • scan: The inbound-email dispatcher records an outcome for each message: imported, duplicate, degraded, or nothing to import. The reprocess work-list reads that instead of working it out from an item count, so it lists only messages a replay could still help.
  • feedback: An instance with no Discord webhook now emails its operators when someone files feedback, instead of leaving the report in a queue nobody is watching.
  • deploy: Setup writes the generated secrets to a root-only file instead of printing them, and takes a stack directory so one host can run more than one instance without the two fighting over backups.
  • purchases: A tracking number Cobblr cannot name now links to a universal lookup instead of leaving you with nowhere to click.
  • purchases: Set how often Cobblr checks a tracked parcel, when you know your tracking service is cheap to ask.
  • auth: An instance now says at boot which signup defences are actually on, and warns loudly when signup is open with no captcha, no email verification or no rate limit.
  • web: Ask Cobb survives a page refresh. If the panel was open when you reloaded, it comes back, on that page. It does not follow you around: open it on the scan inbox, wander off to Inventory, and Inventory stays as you left it. Closing the tab forgets it entirely, so a fresh visit never greets you with a panel you opened once yesterday.
  • web: A notification that has nowhere to take you now stays put. Clicking it marks it read and leaves you where you are, with the panel still open so you can work through the rest. Before, it could switch you to another workspace on the way to nowhere and shut the panel behind you. Rows that do have somewhere to go behave as before, and only those look clickable.
  • platform: Personal connections are no longer AI-only: a parcel-tracking account can be connected under your profile and routed to the workspaces you choose, the same way your own AI key already was.
  • scan: A photo you add to a scanned item is now looked at, not just displayed. If the item has no name yet, the photo identifies it. If it already has one and the photo shows something else, the item says so and offers the corrected name in one tap, rather than renaming itself or ignoring the picture.
  • scan: Catalog photo searches now use the packaging shape the scan already noticed, so an item described as a box stops coming back illustrated with a bottle. And the offer to split one photo into several items is limited to photos you took on purpose: a barcode scan no longer proposes splitting because something unrelated was on the bench behind it.
  • scan: When Pick best (AI) chooses a catalog photo that shows two or more of the same item, the picture is now cropped to one of them. The chosen photo is still the one the ranker judged most accurate, and it costs no extra AI call: the same pass that picks the photo now also reports how many units it sees. A photo whose units overlap or cannot be cleanly separated is left whole.
  • scan: The scanner's auto-flash now fires when a scan is failing rather than whenever the room is dark. A barcode that will not read in dim light lights up within about a second, while plain darkness with nothing scannable in view has to hold for a few seconds first, so glancing at a dark shelf or pointing the phone at the floor no longer turns the light on.
  • scan: Catalog photos fetched from the web are trimmed down to the product. Studio shots often put a small item in a large empty field, which made the thumbnail mostly background and the item hard to recognise at a glance. The dead space is cropped away and a margin is left so nothing is clipped. Photos that already fill their frame, and your own uploaded pictures, are left exactly as they are.
  • deploy: The self-host stack now takes a nightly database dump you can actually restore from, instead of relying on copying a data directory while Postgres is running.
  • purchases: Your own tracking bridge now serves every workspace you route it to, instead of needing one per workspace.
  • web: Switching workspace keeps you where you were. Change workspace from the scan page and you land on the new workspace's scan page, not its dashboard. Anything that points at a specific record is dropped, since that record does not exist in the other workspace, and you land on that section instead. Clicking a notification for another workspace now also takes you to what the notification was about, rather than to that workspace's dashboard.
  • tooling: A workflow asking for a runner label no runner carries is now caught by a lint. Such a job is never scheduled, so it fails silently rather than red, which is how the coupling census shipped without ever running.
  • tooling: The module-coupling census now records its readings to a history repo (CobblrHQ/coupling-census) instead of printing them into a job log that nobody assembles into a series, and it is dispatched by the daily release against the commit that release ships rather than running on its own cron against main.
  • tooling: A nightly census counts where modules name each other and where the kernel names a module, so the architecture's drift is a tracked number rather than an impression. It never fails a build.
  • purchases: A parcel notification or dashboard row now opens the exact receipt or order it is about, instead of the page it lives on.
  • purchases: A parcel on the dashboard now names the order it is, instead of just the vendor, and stops repeating its own status.
  • scan: A receipt now becomes a purchase order the moment it is read, instead of only once you triage its lines. Every line is recorded on the order straight away, and a line becomes an item you own only when you confirm it. Discarding a whole receipt cancels the order it created.
  • tooling: The coupling census now also measures how many specific modules the web shell names, reported as its own separate number, after the api-only reading turned out to cover about 5 percent of what the kernel actually knows about the cast.
  • locations: A closed rack's shelf chips now sit right after its name, instead of across the row at the right edge. What is inside a place is the next thing you want after knowing which place it is, so it reads with the name. The kind label and the row's buttons stay at the right edge.
  • locations: The locations list folds. Rooms open to show the racks and bins in them; what is inside each rack stays closed behind a chevron with a "5 inside · 23 items" summary until you open it, so a house of rooms, racks and shelves is one screen instead of a thousand rows. What you open stays open, per workspace, across refreshes. Expand all and Collapse all sit above the tree, and a Find a place box narrows the whole tree to matches and the path to them (type "shelf 3" and you get shelf 3 of every rack, nothing else). Adding something to a closed rack opens it so you can see what you just made.
  • locations: The Locations page gets to the list sooner. Floor Plan / List is a small switch in the title row instead of a tab strip of its own, the search box sits right under the title with the one-line explanation beside it, and Expand all / Collapse all share the Areas line. Three rows above your first room instead of five.
  • locations: A closed rack shows its shelves as chips in its own row. Instead of "5 inside" and a click to find out what the five are, the row reads Rack 1 · Shelf 1 · Shelf 2 · Shelf 3 · Shelf 4 · Shelf 5, and each chip opens that place. A chip with its own contents carries a small count. Past eight, the row shows "+N more" which unfolds the rack. Phones keep the count, since the chips would wrap under the name.
  • locations: Fifteen racks are one row. When a room holds a numbered run of the same thing (Rack 1 to Rack 15, Bin 20 to Bin 60), the list draws it as one row, "Rack 1 – 15 · 15 racks · 75 inside", closed, and opens to the individual racks. Tick its box to select every rack in it for a bulk print or delete without unfolding. A run that is everything inside its parent stays plain, so a rack's shelves are still one click away, not two. Runs read in your order, so a bottom-up rack still shows shelf 5 first.
  • locations: Every place you choose a location now uses the same picker. Picking a location on a record, an asset or a machine used to drop you into a flat dropdown listing every location in the workspace, while other screens gave you the searchable drill-down. They all give you the drill-down now. Choosing a parent when you edit a location works the same way, and it hides that location and everything under it, so you cannot accidentally make a shelf its own grandparent.
  • purchases: A single-item parcel on the dashboard is named by what is in it, not by the order it came from.
  • core-scan: The camera's scan sheet is now render-tested across its state space, so a bug that lives in a transition rather than a state gets caught.
  • locations: Shelf 1 is the bottom shelf. Type a range like Shelf 1-5 when you are adding a rack's shelves and Cobblr now asks which end you are counting from, with counting up from the floor already chosen. Pick that and shelf 1 sits at floor level on every rack you own, so "shelf 1" is a height you can walk to instead of a label you have to look up, and adding a shelf on top later renames nothing. The list draws the rack the way you see it, top shelf at the top. Counting from the top is one tap away if that is how a rack is already labelled, and you can drag any group into any order afterwards. Drawers are left alone, since drawer 1 is almost always the top one.
  • ci: CI job logs now reach the durable sink even when a job fails before the step that writes its output, so an early failure is diagnosable instead of leaving nothing anywhere, and lint:ci-sink now checks for it.
  • tooling: The session-start sync now installs dependencies after it fast-forwards the shared checkout. A dependency one agent added used to go missing for every other agent at once, failing as an unrelated missing module while CI stayed green.
  • scan: Your own photo now leads the image strip, and you can search without leaving it. When you are choosing a catalog picture, the photo you took sits first, separated from the web results by a divider, so the one image you can recognise instantly is always in the same place. The search box and Search button are in the full-screen viewer too, so you can refine the term while you are looking at the candidates instead of closing it to retype.
  • scan: The scan inbox card files an item from one place. The table pill now picks any table in your workspace and Add files there; the fields you want to check edit right under it, in the header row, and the separate form at the bottom of the card is gone. Cards with a long history are shorter, the "Revert" line leads with the name, and the photo strip no longer runs under the controls on a talkative item.
  • scan: The scan inbox card now shows your photos and the web suggestions as one strip, split by a thin line, instead of two stacked rows. The card is shorter, the pictures are bigger, and the search box stays put while you scroll through the suggestions.
  • scan: Scroll the photo strip sideways and the search box widens into the space your own photos leave behind, so a long product name is readable while you look through the suggestions. Scroll back and it returns.
  • scan: A line off a receipt now keeps the product number the till printed beside it, so it resolves to a real catalog name and picture instead of staying as the till's abbreviation. Nothing is invented for a receipt that prints no codes. Clicking the dark area around an "Original" receipt also closes it again, rather than only the X doing so.
  • scan: A scan card with a short name no longer spends two rows on it: the name and the line under it ("Baby Carrots" and "from Lidl") sit together when they fit, and still wrap onto separate lines when the name is long.
  • ai: Cobb is better at working out which action you mean. Actions now carry the phrasings a person actually uses, so "used one", "that order turned up" or "put the racks in order" map to the right thing instead of being guessed at from an internal name. Eighteen of the most-asked-for actions ship with theirs.
  • ai: The recorded AI test corpus now covers models that cannot call tools, not just those that can. Every cassette drove native tool calls, so the path a subscription bridge takes had no coverage, which is where three chat defects shipped. Added fixtures for that path, for plain prose answers, and for a tool call that fails, with a lint that fails the build if any of those disappear again.
  • ai: Press the up arrow in the Cobb box to bring back what you sent before, and the down arrow to come forward again, the way a terminal does. A half-typed message is kept while you look and comes back when you reach the end, and your history survives a page refresh. Inside a message that runs over several lines the arrows still move the cursor.
  • ai: While Cobb works, the panel now shows what he has done rather than the single word "Thinking". Each step appears as he takes it, in plain words about your workspace ("Reading your locations", "Searching for drill", "Running adjust stock"), ticks green when it finishes, and the one in progress carries a running clock once the wait is long enough to wonder about. A step that fails says so instead of vanishing.
  • ai: Cobb can now run the actions that can be undone, like reordering locations or logging a measurement, when your chat is set to apply changes automatically. He was blocked from every action, whatever it did, and could only tell you he had no way to run it. Anything that cannot be put right again, printing a label, commanding a device, emptying a list, still waits for you to confirm it in Cobblr, and now says so by name.
  • ai: Ask Cobb now shows what he is doing while he works, keeps working if you refresh the page, and stays in step across tabs. Before, a question could sit for a minute or more with nothing on screen but three dots, a refresh threw the answer away, and a second tab of the same workspace had no idea a question was in progress. Each question is now a turn that runs on the server: his speech bubble narrates it ("Reading: list records", "Making a change"), reloading or opening another tab picks the same turn up mid-way, and the answer arrives in whichever tab is watching.
  • ai: The big Cobb on an empty Ask Cobb panel now steps aside as soon as there is something to show, so his first answer arrives where every later one does: beside him, at reply size. Before, an answer appeared underneath the full-size Cobb with a second small one next to it. Clear the box and the big Cobb comes back.
  • scan: A coupon printed under an item on a receipt now comes off that item instead of being dropped. The line keeps the price it was rung up at and records what came off, so two coupons on a 2-for-0.49 pair of croissants correctly leave them costing nothing, and the receipt's items add up to what you actually paid. A coupon never becomes an item of its own, so there is no row to triage for something nobody owns.
  • ai: Every action in Cobblr now either says how a person would ask for it, or says why nobody would. Three more turned out to be things people do ask for out loud, including moving a bundle's own place field into real Locations, and they were only missing phrasings because an automation also fires them. The remaining seven are steps in a pipeline rather than requests, and each now says so where it is defined.
  • ai: Cobb recognises far more of the ways people ask for things. Another thirty actions now carry the words somebody would actually use, so "part out this kit", "where is my parcel", "split one off that lot" and "that order went out" reach the right action instead of being guessed at from an internal name. Every action a person can ask for now has its phrasings, and a new one cannot ship without them.
  • scan: When a scan suggests a table you do not have yet, installing it and filing the item now happens from the same destination pill every other item uses, instead of a second button beside it running the identical action while the pill offered only "Review".
  • ai: Ask Cobb "what page am I on?" and he answers at once, from the page itself, without asking anything of the server or an AI. The same goes for "where am I" and "what is on this page", which now show the page's own one-line summary. A page that does not describe itself is still left to the assistant rather than guessed at.
  • scan: A receipt import now adds up the lines it read and checks them against the total the receipt charges, and tells you when the two disagree. A per-item coupon is the common cause: it is not an item, so the items sum higher than you actually paid, and until now nothing said so.
  • scan: Lines from a receipt now look for their own catalog picture instead of arriving blank, and the search uses the shop the receipt came from, so a "Croissant" off a Lidl receipt looks for a Lidl croissant. Each line also shows which shop it came from under its name. The "this receipt lists N other items" note is a small chip now, and it stays out of the way entirely when the rest of the receipt is already sitting in your inbox as its own rows.
  • ai: The replay AI provider reads its cassette directory on every call instead of once at boot, so a scenario recorded against a real model replays immediately without restarting the API. Its "no cassette matches" error now also lists what the directory actually holds.
  • scan: A receipt session's name no longer gets clipped to make room for its buttons. Reading the original, re-parsing it, adding an order number and following a parcel now sit behind one "..." on the row, since you do each of those once if ever. An order number and a parcel's delivery status stay on the row once they exist, because those are facts about the session rather than actions.
  • ai: Setting up AI now leads with the free option, says plainly that scanning works without it, and offers a Connect button where it tells you nothing is connected. Your browser can no longer autofill a saved password into the connection fields.
  • config: "+ New category" on the Build card now sits next to the section's name and carries a warm fill, so the one thing you can do from that card is easy to spot. It used to float at the right edge, competing with the count for the same corner.
  • config: The People card in Configuration now has a "+ Invite someone" button that takes you straight to the invite form, with the email box already focused, rather than to the members list to scroll and find it. Separately, the Modules and Members settings pages were printing their own title a second line under the one the settings shell draws; they now show it once.
  • account: Your account pages now sit in the same centred column as Configuration. Profile, Connections, Communication, Notification channels, App settings, Drive and Feedback were each picking their own width, and five of them set a width without centring it, so on a wide screen they hugged the left edge with a gap down the right. Activity and Notifications stay wider, because they are lists you scan rather than text you read.
  • scan: Filing a whole session now uses one word for its category: "Place & file all 3 as Mugs" when it still has to ask you where, "File all 11 as Figurine" when it knows. The two used to read "as" and "into" for the very same thing, which made them look like different operations. "Into" now only ever means a place. The destination pill also comes first on an item's row even when the item has a series, so it sits in the same spot on every card.
  • ai: Three things about pointing Cobb at something. A half-written question now survives a page refresh instead of being thrown away. A highlight stays visible on the page while you type about it, rather than vanishing the moment you click into the chat box. And a highlight that names a record is sent as that record: highlighting "Rack 1" and asking to delete duplicates used to have Cobb search for racks called Rack 1 and report there was only one, when the duplicates were the shelves inside it. The context also stays for the whole conversation now, so an answer to Cobb's follow-up question still knows what you were talking about.
  • scan: A receipt session's name, number, date and item count now sit together on the left instead of scattered across the row, and the number is edited by tapping it where it is read rather than through a separate PO# control. The date shown is the one printed on the receipt rather than when the photo was uploaded. Filing says "File all 4" whether or not it still has to ask where, since the pin already says that.
  • ai: The prompt to connect AI says a free tier is available, and both daily limits are now stated the same way.
  • tooling: The coupling census now records which kernel files name modules, not just how many references there are, so a rising total can be told apart from one file growing.
  • assistant: Pointing Cobb at a record no longer moves the conversation. What you pointed him at shows as a chip above the message box, and the chat stays exactly where it was, instead of parking the earlier turns behind a divider and scrolling to it.
  • Workspace notifications now reach your Discord DMs. If you have connected and verified Discord in your account settings, notifications a workspace sends you (a parcel out for delivery, an order to confirm) arrive there as well as in the bell, instead of only in the bell. Low-priority notices stay bell-only, and email is unaffected: it is still sent only where a workspace has explicitly subscribed you to it.
  • scan: Folding a scan session away is now the chevron's job alone. Tapping its name used to do it too, which meant reading the title and hiding it were the same gesture. The checkbox that selects the whole session also sits further left, clear of the chevron, so the control that acts on the section is not flush against the one that acts on the row.
  • assistant: Cobb buttons add up. Press the one beside Rack 5 and then the one beside Rack 6 and he has both, instead of the second replacing the first. Press a lit one to drop just that record.
  • scan: Viewing a receipt's original, re-parsing it and following its parcel are back on the session row instead of behind a "..." menu. They were tucked away while the row was crowded, and it is not crowded any more.
  • ui: A list you can tick rows on now says what ticking is for ("Tick rows to print labels or delete") before you tick anything, instead of revealing its bulk actions only afterwards. A row's own action explains itself on hover, and says whether a label was queued or printed as it happens.
  • scan: A receipt session's number and the offer to add one now occupy the same place, right after the name, instead of the number sitting by the name while "+ #" sat across the row with the actions. A session whose number was cleared also stops showing the old one in its name while offering to add another.
  • assistant: Ticking rows no longer hands them to Cobb behind your back. Selecting things is for the bulk actions on that list; when you want the assistant to have them, press Ask Cobb in the same bar. The standing "tick rows to print labels or delete" line is gone.
  • assistant: Cobb no longer shows you the internal ids of your own things, and answers more plainly. Asked about two racks he was reciting their storage classification, their parent's uuid and three offers of help; now he tells you what you asked.
  • assistant: Cobb now answers questions about Cobblr from the app's real features. Asked for a navigation parent he used to suggest creating a new app; he names the navbar heading and the screen that makes it, and says he is not sure when something is not a feature at all. Confirm cards also say what they will do ("Add a category: Kitchen & Grocery") instead of showing the action's internal id.
  • platform: On a phone, list rows give their space back to the name. The per-row Cobb head is gone from lists on mobile (it opened the chat over the list you were reading, and the checkbox already says which rows you mean), along with the drag handle and the blank gap where a chevron would be. Names that were being cut off now read in full. To ask Cobb about several things, tick them and use Ask Cobb in the selection bar, which now wears Cobb's head instead of a generic speech bubble. Cobb's head stays on a record's own page, where there is no checkbox to use instead. Select all has also moved to the start of the Areas line, above the row checkboxes it mirrors, instead of sitting up beside Export and Import. Rows no longer carry their own delete button - deleting a location takes everything under it with it, so it lives with the selection bar, which names what will go and asks first. And red "Delete" text is readable in dark mode now, here and in the twenty other places across the app that had the same problem.
  • locations: Nested locations have breathing room on the right again, without losing the straight column their buttons now sit in. The gap is opened once by the outermost card and inherited all the way down, rather than added at every level, so a shelf inside a rack inside a room shares one right edge with everything else instead of stepping further in each time.
  • locations: Every row's buttons line up in one column. A nested location was padded on both sides, so each level of nesting pulled its row's controls further from the right edge: across four levels the Cobb heads, pencils and kind labels sat 39px apart and there was no straight line for your eye to follow. Nesting indents on the left only now, which is what shows the hierarchy anyway, so the controls land on a single vertical line at every depth.
  • assistant: A message you sent Cobb now shows what it was sent with. The context chip sits beside your words in the conversation, so scrolling back to "tell me about these" still tells you which records you meant.
  • release: Operator announcement webhooks take a list rather than a single URL, so adding a second Discord is a config edit instead of a change to every publisher. CHANGELOG_DISCORD_WEBHOOK and CHANGELOG_ALERT_WEBHOOK split on whitespace, newlines or commas; ci-runner-health.sh reads one URL per line from its webhook file. A single URL is a list of one, so nothing migrated. Each destination keeps its own delivery record (sent, resume cursor, message ids for a later correction) keyed by the webhook's own id, because sharing those three scalars across two servers makes the new one read as already delivered, makes a retry resume it at the other one's cursor, and points a correction at the wrong message. A destination added later is marked caught up without being sent; seeding one is scripts/changelog-backfill.mjs, which posts nothing itself and hands you the publisher commands to run one at a time.
  • scan: Items scanned together now agree on their categories instead of each inventing one alone. Five monitors in one session used to come back filed under three different names, all of them reasonable, none of them the same, because each item was identified on its own and a proposed category is not saved until you confirm it. Each item now sees what the rest of its batch has already proposed and reuses it when it fits. On a replay of 40 real scans the number of distinct categories dropped from 17 to 9.
  • scan: A receipt that says when something is arriving now shows it on the session row, instead of keeping it to itself.
  • ai: Cobb now runs the change you asked for instead of offering to take you to the screen where you could do it yourself, whenever one of his actions covers the ask.
  • ai: Asking Cobb to hide or rename one of the fields Cobblr ships (a part's manufacturer, a machine's serial number) now works, instead of getting a list of your own custom fields back.
  • ai: Cobb can rename this workspace and turn simple mode on or off when you ask. Renaming changes the name only, so links, bookmarks and printed labels keep working.
  • notifications: When Cobblr moves to a new Discord app, your linked account no longer goes quietly unreachable. A Discord DM belongs to the bot that sent it, so a new app has to earn its own permission to message you, and previously nothing noticed: notifications simply stopped arriving while the settings page still said Discord was connected. Your communication settings now say the app changed and offer one re-confirm, and notifications wait in the bell until it is done rather than being sent into a channel nobody is listening on. If Discord ever blocks messages from us outright, the connection is marked unverified instead of silently swallowing everything after it.
  • release: A new Discord channel can be seeded with the whole public changelog history, one post per user-facing day, oldest first, via scripts/publish/changelog-backfill-discord.mjs - the Discord counterpart of the forum backfill. It reads the changelog.d archive rather than the publisher's state file, so it reaches back past the nightly cursor, and it renders through the same lib/changelog-cards.mjs the nightly uses so history and future look identical. Dry run by default, windowable by --since/--until/--limit, paced by --pace, and resumable through a local file since a webhook cannot read a channel's history. Also fixed 17 archive entries typed feat or change instead of feature/improvement: no surface could label them, so the nightly published cards titled literally "feat" and the forum backfill dropped them from the public history entirely. lint:changelog now checks the whole archive's types rather than only the entries a PR touches.
  • navigation: Reordering the sidebar now starts on a short hold rather than as soon as you move, and letting go no longer opens the item you were moving. A quick press that drifts a few pixels counts as a click and follows the link, which it did not always do before. The case that failed every time was dragging the top item upwards, where the drop lands outside the list and the reorder is abandoned: the item opened as if you had simply clicked it.
  • scan: Receipts and order emails that print a model number now record it on the item, instead of reading past it.
  • release: Cutting a numbered release now says which nightly it was, immediately, on every changelog destination. A release is a blessed nightly re-tagged, so its contents were announced days earlier and a reader had no way to connect "2026.8.0" to the nightly they actually read about; the hand-written announcement closed that gap eventually, or in 2026.8.0's case not at all. cut-release.sh posts a short follow-up ("the nightly of is now release ") and edits that nightly's own post to add a line saying so, which is what the publisher records message ids for. Best-effort, so a release never fails because Discord did, and idempotent through a released_as marker. Also fixed the reason editing a published post could never have worked: Discord rejects a request with no User-Agent, which POSTs got away with and a PATCH did not.
  • release: Cutting a release now stamps the forum's copy of the nightly as well as Discord's, so both surfaces say which release a nightly became. Two Discourse traps are handled in code rather than in a runbook: the recorded forum_url carries a post NUMBER (/t/22/11), not the post id the edit endpoint wants, so treating one as the other would edit a different post successfully; and under the narrow changelog-editor key almost every read is refused, so resolving the id and reading the markdown are a single GET /t/<topic>/posts.json?include_raw=true. The key is disabled by default, so a 403 now says that instead of looking like a header problem. Best-effort throughout: a release never fails because a forum key is switched off.
  • scan: Categories from a scan now come back at the level of a section you would browse rather than the label a shop files a product under, so a run of kitchen gear lands in "Kitchen" instead of "Steamer Baskets", "Mugs" and "Kitchen & Dining". One recorded scan of a single room had produced 81 different categories, since the routing prompt asked for "a few dozen" of them and judged two items the same only if they would share a bin, which a bin of one product passes. It now aims for a handful across a whole workspace and shows what a collapse looks like. Placeholder values are no longer filed either: "unknown", "other" and the literal "undefined" leave the category blank so you get asked, instead of looking answered.
  • ui: Wide lists like Inventory now use the whole screen, and a long product name wraps instead of pushing the last column off the edge.
  • notifications: A Discord mention now arrives as a card showing what was actually written, instead of a single line saying only that somebody mentioned you somewhere. Replying from the DM also shows your reply back to you afterwards, so you can see what you sent rather than just a tick. Names and record links inside a comment are rendered as words, never as the internal markers the app stores them with.
  • account: Every page under Your account wears the same header, drawn from one registry, with a breadcrumb back to the hub - the same treatment Configuration got. Your desktop layout (top bar or sidebar) is now visible on the Appearance page, where you can also stop it syncing across desktops. Notification channels gets the wide table column it was designed for.
  • scan: Filing a mixed batch of scans now lets you answer per table. The question that used to be all-or-nothing lists each suggested table with a tick: agree about the teas, disagree about the spices, and each group goes where you said. Closing the dialog files nothing.
  • platform: Modules that are shipping but still below 1.0 now wear a "Beta" badge, so you can tell a settled module from one that is still moving. Beta modules stay fully available; the badge is just a heads-up.
  • tooling: The coupling census counts distinct module pairs from shipping code only, the way its two sibling numbers always did, so a reference that exists solely in a test no longer reads as a new edge in the architecture.
  • ai: A hundred-plus authored chat utterances now run as tests against the no-AI answer machinery. Its first pass fixed two more interceptions (asking to delete one specific duplicate no longer triggers the whole-workspace sweep; "print a label for X" no longer gets a how-to strip offered over it) and taught the basics two phrasings they missed.
  • ai: Some AI models answer a request to change something by writing out the change instead of making it. Cobb now reads that reply as the change it plainly is, so a model that writes the right thing in the wrong place still gets it done.
  • dashboard: The dashboard leads with your content again. The Jump-to button grid now shows only on phones, where the navigation hides behind the menu button; on a desktop the same links were already in the top bar, and the grid held the first screenful above everything that mattered. The "also enabled" line also stops naming tables whose card directly below already says it is empty.
  • platform: A workspace custom font now has to come from a safe source: an uploaded font, a same-origin file, or a well-known font host. This stops a theme from quietly pulling a font off an arbitrary outside server on every page load.
  • ai: The local-model bench gained an OpenAI-compatible transport and the docs now carry measured numbers for Sonnet (via the claude bridge's MCP relay) and gemini-flash-lite alongside the local models.
  • ai: More everyday phrasings get an instant no-AI answer ("do that over", "how much filament is there", "which bin did the drill end up in"), and typing an instruction like "add a part called Brass Widget" no longer gets a how-to suggestion offered over it: questions get the quick answer, instructions go to Cobb.
  • admin: Every operator console section has a proper page title with a line saying what it is for. The sidebar stays put while a long table scrolls, wide tables get the whole screen, a mistyped console address redirects instead of quietly showing the wrong page, and on a phone the open section scrolls into view.
  • Parcel updates on Discord are now one rich card with the answer as a button. A delivered parcel offers "It is in hand", a due-today question offers "Yes, it turned up", and pressing the button confirms the arrival right in the card, ending the tracking watch without opening the app. The bare link under a plain sentence is gone from carded messages, surviving only as the fallback when a card cannot be rendered. Also fixed: a restart could re-ask "did it turn up?" about a parcel it had just announced as delivered; one parcel now says one thing, once.
  • Parcel notifications now go to the parcel's owner instead of the whole workspace. The owner is figured out automatically: whoever added the tracking number, or failing that whoever captured the receipt. Everyone else in the workspace is no longer pinged about orders that are not theirs. If the owner has since left the workspace, the notification falls back to all members so a waiting parcel is never silently dropped.
  • Parcel tracking no longer sleeps through delivery day. A receipt that promised a date now tells the tracker about it, so a parcel due today is checked through the day instead of once at dawn; a parcel out for delivery is re-checked overnight, so the delivered scan is seen by morning instead of a day later; and a tracking bridge can now push "this parcel moved" through an inbound webhook, so updates land minutes after the carrier scans rather than at the next scheduled check. One real laptop was delivered at 7:49pm with nobody told until this; that exact day is now covered three ways.
  • ai: The local-model bench gained a scan-corpus mode: every staging inbox photo through the app's real identify and matchmaker prompts, timing the camera's instant path against its 1-second budget.
  • platform: Sign out of every other device, and a first Content-Security-Policy. Your account settings now have a "Sign out everywhere" button that revokes every other signed-in session and keeps only the device you press it on, so a token you no longer trust can be killed without changing your password. The app also began sending a Content-Security-Policy: the parts that cannot break a page (anti-clickjacking, anti-plugin, form and base restrictions) are enforced now, and the stricter script and connection rules ride along in report-only mode so the operator can confirm them against real usage before turning them on.
  • ai: The bundle builder now checks the AI's proposal against the workspace before showing it: a field the kind already has (a "brand" when it ships "manufacturer") is left out and said so, a request that names nothing to track gets an explanation instead of invented fields, and the modules a bundle needs are worked out from what it references rather than trusted to be listed. Models that can be held to an output shape are, so a garbled reply cannot happen.
  • ai: The bundle builder is now measured against local models too: qwen3:14b and gemma4 both score 0.933 and produce a valid bundle every time, where gemini-flash-lite produced five invalid ones out of nine.
  • configuration: Settings sections read as one system: a self-contained tool is a card with one title style and one fill, and a labelled region of a page keeps the mono rule the rest of the app uses. Backup, Assistant, Links, General, Units and Health all converge on those two shapes.
  • core-discussion: A message that arrives in the open Discussion tab now lights up amber with a "new" tag for a few seconds and the tab scrolls to it, so a reply is noticed without a notification. The message box's hint text no longer gets cut off on a phone after sending. A reply typed into a Discord notification card now shows inside the card, under the message it answers, with the time.
  • Chat now describes your workspace's actions more compactly and lets the assistant look up the details of the one it needs, instead of spelling out every action's arguments and phrasings on every message. On a workspace with many actions that is about a third of the text each message used to carry, which is part of what pushed free AI plans into their per minute limit after a few questions. Measured over 33 requests: it picks the same actions it did before.
  • inventory: Inventory registers an entity writer for its category tree, so a sync source can mirror a source's categories (with hierarchy, per-instance slug de-collision, restore and snapshot for undo) the same way it already mirrors locations and parts.
  • integrations: The Part-DB live import now brings each part's master picture across as its photo. A sync source's API token is sent only to the source's own host when fetching pictures; an image that lives on a third-party site is fetched without it.
  • selfhost: The self-hosting env template now carries the community links, so a fresh install can offer its users the Discord, the community forum and the documentation site by uncommenting three lines. The issue tracker stays blank on purpose: point it at your own fork if you run one.
  • core-integrations: A sync-source manifest can now read a foreign key that the source sends as a link. Writing $.parent|last takes the last segment of a value like /api/storage_locations/1, so an API that expresses relations as URLs (API Platform, Django REST hyperlinked serializers, JSON:API) can feed the engine's parent and cross-section references without a code change. A manifest that misspells the operator is rejected when it is saved rather than silently importing a flat tree.
  • core-integrations: A live sync source can now turn the tags on a mirrored record into Cobblr tags. Homebox labels and Part-DB tags become real tags on the imported part (attached by name, created if missing, never removed), instead of riding along unseen in the item's details. If a tag cannot be attached the import result counts it rather than dropping it quietly.

Fixes

155 fixes in this range. The security and stability ones are described above; the
rest are mostly scanning (38), platform (29) and assistant (25) corrections.
Full list: CHANGELOG.md