# What's new

What changed in LakehouseBox that you could notice: the CLI, the API, the MCP server, the account page, limits and the docs. Newest first, one line per change, written when it shipped. Updated every day.

## October 2026

### 17 October

- New. A What's new page in the docs (lakehousebox.com/docs/changelog/) lists every change you could notice, newest first, updated daily.

- Fixed. A catalog's maintenance details (the maintenance block when a catalog is created) and the docs now say format-version 3 tables are compacted, as they have been since 2026-09-30; they said it was on the roadmap.

### 16 October

- New. The activity catalog now also holds your members' sign-ins: logins, failed logins, two-factor and passkey changes, password changes, sessions, device approvals, personal API keys, and the connections they approve, refuse or revoke, from the day each person joined; a person in two organisations appears in both, and someone removed stops appearing from the day they left, while what they did before leaving stays in your log.

- New. Sign in with Google on lakehousebox.com: "Continue with Google" on the account page's sign-in and signup creates your account or signs you in with your Google account in one step; optional, and email sign-in is unchanged. The privacy policy and the sovereignty page say what Google sees (your name and verified address, and that you sign in to LakehouseBox; never your catalogs, keys or queries).

- New. People who sign in with their organisation's account (SSO) can approve an MCP connection on the consent page; the sign-in must be recent, and it approves connections for that organisation only.

- Changed. When an older lhbox refuses an option or command, the error now says which version you have, which version is published, and to run lhbox update, instead of telling you the command line is wrong.

- Changed. Every lhbox error now says when a newer lhbox is published: in the JSON error as cli_outdated, and as a line after the error at a terminal.

- Changed. When an older lhbox (from 0.6.54 on) gets an error from the API, the error says a newer lhbox is published and how to update. Every lhbox shows this as part of the error.

- Changed. Directory provisioning (SCIM) no longer removes or demotes an organisation's last admin: the person stays admin and your admins get an email saying what to do, until someone hands the role over. Everything else in the same directory change still applies.

- Fixed. lhbox table import writes unsigned integer columns (such as the UBIGINT block column of raquet files) as the signed type Iceberg supports, and warns which columns it converted. Before, the import failed.

- Fixed. When an organisation's sign-in does not say when the person signed in (Microsoft Entra ID without the optional auth_time claim), the account page says which claim to add once a fresh sign-in has not helped, instead of asking to sign in again for ever.

- Fixed. A catalog takes as many uploader credentials as it needs: past about 32 per catalog, creating one used to be refused with "bucket_policy_full". Existing uploaders keep their keys and are moved over once, without a gap.

- Security. Connecting your organisation's identity provider (Microsoft Entra ID, Okta or another OpenID Connect provider) now takes a sign-in through it by someone of your verified domain, so no other organisation can claim your directory or block you from connecting it.

- Security. An organisation's own sign-in (SSO) now speaks for that organisation only: a person who also belongs to another organisation signs in another way (email and password, where offered). Before, such a sign-in could create keys, tokens, invitations and grants in the person's other organisations (open since organisations could bring their own sign-in, #1426).

- Security. Approving an MCP connection needs a recent sign-in from a password session too (the page asks for the password again); refusing one needs none.

- Security. Signing in with your organisation's account for the first time no longer accepts another organisation's invitation, or activates an organisation someone else reserved for your address, on your behalf; and that sign-in can no longer accept another organisation's invitation, join it by its domain, keep an agent's catalog as a new organisation, or start a new organisation with a first project.

### 15 October

- New. Enterprise: an admin can keep the organisation's activity log as a catalog of its own (Settings › General › Activity catalog). Every action taken in the organisation (grants, policy changes, members, keys, connections, catalog and table changes) lands in activity.events within about 15 minutes, with the network of each address only, never the full address; ask your agent who changed what, or query it with SQL.

- New. A new Enterprise page (lakehousebox.com/enterprise) and an Enterprise plan on the pricing page: single sign-on with your own OpenID Connect provider, SCIM provisioning, grants down to one table, service accounts, the audit log, and managed in the EU or self-hosted.

- New. Published support response times: first answer within 2 business days on every plan, within 1 business day for Enterprise (4 business hours when the service is down), and a 99.5% monthly uptime target measured on status.lakehousebox.com.

- New. A public status page, status.lakehousebox.com, shows whether signing up, logging in, connecting an agent, reading and writing data, the MCP server and the website work right now, checked every 5 minutes from outside our servers, with each day's results kept for 90 days.

- New. Organisation admins decide what members may do, in Settings › General › Member permissions (or lhbox org policy): who may publish catalogs (admins, members too, or nobody), who may connect agents (keys, lhbox login, MCP clients such as Claude, personal API keys) and who may create hosted agents. The defaults keep today's behaviour.

- New. A request the organisation's settings do not allow is refused with a clear reason and the admins to ask; changing a setting is recorded in the audit log and never undoes anything: public catalogs stay public until an admin makes them private.

- New. An admin can let members publish the catalogs they can write, or turn publishing off for everyone while still being able to make any public catalog private.

- New. Self-hosted installs can close self-registration (AL_SIGNUP_CLOSED): every signup path, lhbox new and new organisations at onboarding answer registration_closed with what to do instead, the account page hides "Create an account", and accounts come only from invitations, the identity provider, SCIM and the operator.

- New. Self-hosted installs can require a second factor for password accounts (AL_MFA_REQUIRED): the login walks a person without one through adding an authenticator app before any session, and their keys and the tokens they made work again once they have; identity-provider sign-ins are exempt.

- New. AL_SECURITY_PROFILE=ens turns both on for an ENS install and refuses to start on an unknown profile or with either switched off.

- New. Self-hosted installs: a first-run setup replaces the manual first account. ./al bootstrap prints a one-time link (an hour, single use) that creates the install administrator and the first organisation, in the browser or with lhbox admin setup.

- New. Self-hosted installs: the back office opens with a read-only Install view (release and its signature, every security setting and where it is set, sign-in and SCIM, audit export counters, last backups, storage, administrators); lhbox admin status prints the same.

- New. Self-hosted installs: ./al config-check checks the install's configuration file against the ENS secure-configuration guide and names what is missing, without changing anything.

- New. An install administrator signed in through the install's identity provider can open the back office when the configuration states that the provider requires a second factor.

- New. Install administrators can create an organisation together with its first admin, and add or remove an organisation's admins, from the back office or with lhbox admin org; an address without an account gets an admin invitation, which works even with self-registration closed.

- New. Install administrators can suspend and reactivate a person (sign-in, keys and tokens refused while suspended, restored on reactivation) and revoke every session, key and token of a person, from the back office or with lhbox admin person; every action is audited and reaches the audit export.

- New. Approved OAuth/MCP clients: with self-registration of clients turned off, an install administrator registers the clients allowed to connect (public, or confidential with a secret shown once), and can disable or remove them (lhbox admin client).

- New. The back office's People table shows each person's second-factor status.

- New. A self-hosted install can send its audit log to the organisation's own SIEM as it is written, as JSON lines for a log shipper or as syslog over TLS, without a SIEM outage ever slowing or failing a request.

- New. Every page of the site links the status page in its footer.

- Changed. Under the ENS profile (AL_SECURITY_PROFILE=ens) password login turns off by default when the install trusts an identity provider, and stays on, with a start-up warning, when it trusts none; AL_PASSWORD_LOGIN=true keeps a break-glass local admin and warns at every start.

- Changed. Under the ENS profile, people whose address an organisation's own identity provider covers sign in only through that provider: no local password, passkey or password-reset session.

- Changed. The ENS profile refuses to start unless the audit log is exported to a SIEM (AL_AUDIT_EXPORT), naming the setting and the guide.

- Changed. On a self-hosted install the account page names the install's own operator, support and legal pages (new settings AL_OPERATOR_NAME, AL_SUPPORT_URL, AL_LEGAL_NOTICE_URL, with AL_SUPPORT_EMAIL and the Terms and privacy URLs), and shows no operator line or link for what is unset, never LakehouseBox's company, legal pages or support address.

- Changed. A self-hosted install no longer links LakehouseBox's Terms of Service, privacy notice or Acceptable Use Policy anywhere, including the set-password mail, and its mails carry the install's own footer and reply-to address.

- Changed. The first-run setup of a self-hosted install ends with "Secure your administrator account" and opens the back office, which install administrators now reach from the sidebar and the account menu.

- Changed. On a self-hosted install the account page no longer shows billing, sign-up statistics, campaigns or plans, and the install-level role is called "install administrator".

- Fixed. AI assistants and tools that register as confidential OAuth clients (with a client secret) can now connect to the LakehouseBox MCP server; before, their registration was refused and the sign-in never started.

- Fixed. On a self-hosted install "Create an account" no longer shows on the first-run setup or where self-registration is closed, and the organisation address on the sign-up form is the install's own.

- Fixed. Self-hosted installs can now set the session lifetime, the re-authentication window, passkeys, the sign-in lockouts and rate limits, token lifetimes, audit and usage retention, the DNS resolvers, the platform administrators and the mail footer in .env; before, those lines were ignored and the built-in defaults applied. An empty value keeps the default.

- Fixed. The Home Assistant guide in the docs loads again (it answered an error since 2026-10-15 at the latest).

- Security. Nobody can write, publish, rotate the keys of, re-grant or delete the activity catalog while it is on, admins included; switched off, it is kept read-only and can then be deleted.

- Security. Self-hosted releases ship a CycloneDX SBOM for every image and for the command line, and are signed: a verify.sh in each release checks the signature, every file and the SBOMs offline with OpenSSH, and the installer refuses a release that does not verify.

- Removed. A self-hosted install's account page no longer shows the LakehouseBox blog card, the managed service's public datasets, its Enterprise support line, or its daily numbers report, cold tier and plans in the back office.

### 14 October

- New. Server-side queries can now choose the DuckDB engine (engine: "1.5" default 1.5.6, or engine: "2.0" preview) in POST /v1/query, lhbox query --engine 1.5|2.0, and the MCP query tool.

- Changed. Every public catalog, not only LakehouseBox's own public data, is now distributed through our worldwide CDN: anyone reading a published catalog without an account gets its files from the edge, so a popular public dataset no longer loads the storage servers.

- Changed. Queries you run on our servers (MCP query, the SQL API) now read every public catalog through our CDN, not only our own open data, so a popular public dataset no longer loads the storage servers.

- Changed. Agents reading any public catalog with their own DuckDB are now pointed at our CDN, worldwide, instead of our storage servers.

- Changed. Browser table previews and map views now skip oversized geometry and binary Parquet column chunks in the 100-row table preview, project only the active geometry column and up to 10 scalar tooltip columns on the map tab, set ZSTD compression and 16,384-row Parquet row groups on browser-created tables, and avoid cold-start DESCRIBE and default-catalog attach round-trips when opening /try or inspecting a specific catalog.

- Changed. Public-data catalog cards on /public-data are now clickable as whole cards without repeating "View dataset & SQL →", and dataset preview images carry a content-hash ?v= query parameter so browsers never display stale cached previews.

- Changed. Server-side queries over a catalog start faster when the engine is not busy: a worker is ready with its readers loaded before the query arrives (about 0.15 s less per query).

- Changed. lhbox table import keeps remote file details for the length of the command, so repeated reads of the same files are much faster.

- Changed. Your usage figures, and the MCP server's table list that reads them first, answer faster, and no slower as your organisation adds projects or catalogs; a query also starts sooner in an organisation with many catalogs.

- Fixed. The legal texts and the publish answer say how long a catalog's copies stay on the CDN after it is made private: the purge can take a few hours, not minutes.

- Fixed. Signing up from an unclaimed catalog's claim page keeps that catalog as your new organisation instead of creating a second empty one alongside it, and expired unclaimed catalogs cannot refresh or exchange OAuth tokens.

- Fixed. Explaining a query over a quoted local file ("my".<table>) in the browser explorer keeps its rows in the tab, and the DuckDB snippet no longer doubles a trailing semicolon (#1334).

- Fixed. Server-side SQL (POST /v1/sql) now supports both 2-part information_schema.<view> (across all readable catalogs) and 3-part <catalog>.information_schema.<view> (filtered to <catalog>), while hiding DuckDB's internal system, memory, and temp catalogs.

- Fixed. Scheduled-SQL egress now catches socket.gaierror on DNS lookup failures, reports upstream DNS and TCP connect failures as transient 502 upstream_unreachable (instead of permanent 400 egress_refused), and validates nested LIST/STRUCT/MAP casts in _conform so invalid element or field casts return 400 type_mismatch.

- Fixed. The Terms of Service name passkeys among the sign-in methods, the Privacy Policy names /try alongside the account page for map tiles and refers to paid storage (announced at €0.10/GB-month, not open yet) on the invoices retention row, and the Legal Notice points to the pricing page for paid storage instead of saying "paid plans, when they exist".

- Fixed. Making a public catalog private or deleting it now clears its cached copies from our CDN within a few minutes (measured: 42 to 136 seconds), instead of up to a few hours; the privacy policy, the DPA and the security overview say so.

- Fixed. A server-side read that hit a rare engine crash while starting up is now run once more instead of answering with an internal error.

- Fixed. A deploy or a restart no longer answers MCP, catalog and S3 requests with a brief 502: the gateway waits up to 5 seconds for the service to come back.

- Security. The try-it page's assistant can no longer answer more questions in a day than its allowance when many visitors ask at once.

- Security. Resending a pending web signup keeps the first submission's name, organisation and welcome link intact, approving a CLI login requires a browser session, suspended two-factor accounts check the second factor before disclosing account status, and expired blob-uploader credentials have their storage keys removed by the hourly sweep.

### 13 October

- New. When you connect Claude, ChatGPT or another assistant, you can give it all your catalogs, including ones you create later, at read or at read and write: a new catalog no longer needs a new approval. It never gets more than you hold on a catalog yourself, and loses a catalog the moment you do.

- New. Each public dataset's page has a "Query in browser" button that opens the dataset in /try, and every example query on it has its own Copy button.

- New. The public catalog commons/pubdata adds eight open datasets: 16-day weather forecasts (weather.forecast), global H3 gridded population (population.grid_h3), ECB daily foreign exchange rates (reference.fx_rates), FRED macroeconomic and policy rates (population.macro_rates), world seaports (transport.seaports), global power plants (environment.power_plants), NYC yellow taxi trips and zones (transport.nyc_taxi_trips, transport.nyc_taxi_zones), and SEC EDGAR company financials (population.sec_financials).

- New. The public data catalog lists itself as tables: commons_pubdata.meta.datasets (one row per dataset, with source, licence, coverage, refresh cadence, join keys and live row counts) and meta.columns (every column with its description), so an agent can find datasets in SQL

- New. Every public dataset has its own page at lakehousebox.com/public-data/<dataset>, with a map or chart drawn from the data, sample rows, a ready-to-paste agent prompt, DuckDB recipes with and without an account, the columns, notes and the datasets it joins with

- New. The list of public datasets is also published as Parquet (lakehousebox.com/pubdata/datasets.parquet, columns.parquet) and as Markdown (lakehousebox.com/public-data.md)

- New. An agent can preview a scheduled-SQL query (it runs once, nothing is written) before a person claims its account and before scheduled SQL is enabled, so it hands over a query that has run

- Changed. The account page lists such a connection as "All catalogs (read)" or "All catalogs (read & write)", and a catalog's Access section shows it among the tokens that reach that catalog.

- Changed. Server-side queries of public catalogs (MCP query) now read the data from our CDN, so a popular public dataset no longer loads the storage servers; very large scans of a public table can take a few seconds longer.

- Changed. An Explore share link keeps how the map or chart was drawn.

- Changed. Your usage and your list of catalogs answer faster: a catalog with nothing in cold storage is no longer looked up a second time for it.

- Changed. The guide that comes with the public commons/pubdata catalog now tells readers without an account to read through our content delivery network, with a recipe that also works in sandboxes that set placeholder cloud keys

- Changed. The no-account DuckDB recipe for a public dataset reads the current table through the public-data cache instead of a fixed snapshot, so it no longer goes stale after a refresh

- Changed. The no-credentials recipes for public datasets in commons/pubdata now read through our content delivery network, so popular public data is served from the edge, closer to the reader, with no account needed

- Changed. Server-side queries and writes from an account an agent made without one now share a small, fixed part of the query engine until the account is claimed; when that part is full the answer comes at once and says how to run the query in your own DuckDB (with the no-key recipe when it read public data), so other accounts' queries are never slowed by them.

- Changed. Scheduled SQL (keep a table filled from a URL on a schedule) is now on for every organisation on the free plan, two sinks each; no request needed

- Fixed. Server-side SQL DROP statements now enforce the same active-sink and public-catalog force protections and edge cache purges as the table and namespace delete routes.

- Fixed. Catalog grant routes now refuse per-catalog changes on all-catalogs MCP connections, cap member-granted token access at the token creator's level, and clear a token's sink send rights when its catalog read access is revoked.

- Fixed. Anonymous and public-reader DuckDB S3 recipes across the CLI, web explorer, and public dataset cards now include empty credentials (KEY_ID '', SECRET '') so local AWS credentials never interfere with unsigned requests.

- Fixed. A public table that is replaced (dropped and created again under the same name) is read correctly through our CDN straight away: table metadata is no longer cached at the edge, only the data files.

- Fixed. On the Explore page, clicking a dataset in the list always opens it, even after a first query.

- Fixed. On tablets the Explore page's dataset panel can be closed (button, a click outside, or Escape) and opened again from the header; on phones it sits under the result.

- Fixed. The Explore page's search also finds secondary tables, their columns and your own files, and folds back what it opened when cleared.

- Fixed. Explore results with longitude and latitude columns draw on the map even when their geometry column is empty.

- Fixed. The air-quality tour's "worst PM2.5 days this year" now only shows this year.

- Fixed. The public data page's "Your sales. The weather. One query." section is readable again (light text on its dark background), and the "up to 50 GB" offer no longer runs out of its box on tablets and laptops.

- Fixed. The category filter on the public data page keeps keyboard focus on the chip you pressed and tells screen readers which one is selected.

- Fixed. On the website, keyboard focus stays visible on the sign-up form's handle field and follows each step of sign-up and unsubscribe.

- Fixed. The website lists all five verified engines (DuckDB, PyIceberg, Spark, Trino, Polars) everywhere, describes the MCP write tools truthfully, and states the announced paid-storage rate consistently.

- Fixed. On the account page a token refresh that gets no answer (a laptop waking before its Wi-Fi, a timeout, the API briefly down) no longer signs you out; only a refused session does.

- Fixed. The SQL explorer's Download menu appears only with a result that has rows, closes after a pick, and Parquet never exports a query that failed or was cancelled.

- Fixed. The Import dialog lets go of the files you remove or leave, previews the files you see when you change them mid-preview, offers an append again for an existing table, and "Query the table" works in a namespace named like a SQL keyword (such as default).

- Fixed. Switching organisation on the account page no longer shows the previous organisation's hosted agents, runs or open agent page.

- Fixed. Emptying an agent's run time limit sets it back to the organisation's limit (the API accepts run_seconds: null).

- Fixed. An MCP server connected from the agent editor reports there and its tools appear in the editor once approved, without losing unsaved edits.

- Fixed. A public catalog page names the catalog in the browser tab, keeps column descriptions on phones and shows every code block in one style.

- Fixed. The account page's section strips scroll and take arrow keys everywhere, its toolbars fit on phones and tablets, and search fields show a keyboard focus ring.

- Fixed. Home says when activity or the blog could not be read instead of showing an empty list, and the sign-in copy says how long you stay signed in.

- Fixed. A table's Definition attaches a catalog named after a SQL keyword (such as order) with a valid alias.

- Fixed. A catalog's cold-storage figure no longer drops to zero for an hour when the hourly tiering run ran out of time before reaching it.

- Fixed. A query with more than one statement (including a PIVOT without an IN list) is now refused as one_statement with a remedy that says how to write it, instead of a misleading read_only

- Fixed. Agents connected over MCP with an API key can now write with query_rw when the key may write; before, every key was refused as read-only

- Fixed. Agents can save a query result as a new table with one statement (CREATE TABLE … AS SELECT) through the server-side write tool; it was refused before

- Security. Changing an account password now requires a browser session, verifies a two-factor code when two-factor authentication is enabled, and revokes the account's personal API keys by default.

### 12 October

- New. Agents find LakehouseBox's ways in without reading a page: lakehousebox.com/.well-known/mcp.json (the MCP server and when to use it), /.well-known/agent-skills/index.json (the agent skills), hints in robots.txt, and the API's own metadata, which every "no credential" answer now names.

- New. Agents can start without an account: lhbox new (or one POST to the API) gives an agent an Apache Iceberg catalog it can write at once, for 72 hours, with 1 GB and nothing public; a person keeps it with lhbox claim, by signing up or logging in and typing a code. The recipe is at lakehousebox.com/new.

- New. lhbox claim moves an agent's catalog into an organisation you administer; the agent's earlier key stops working and it gets a new one with the access you choose.

- New. lakehousebox.com/auth.md tells agents how to get access, with or without a person at hand.

- New. A Home Assistant skill for agents: one prompt moves the history Home Assistant still holds (the last 10 days of every change and its hourly statistics) into LakehouseBox with no account to start, then, once you keep the catalog, every change flows in once a minute.

- New. No account yet? When you connect an AI assistant to LakehouseBox, you can let it set up an account for you on the spot: one catalog, up to 1 GB, kept by adding your email within 72 hours

- New. The Files explorer plays sound and video files (voice notes, recordings, clips) in its preview instead of offering only a download.

- New. A server-side query that runs out of time, memory or rows now says what to do next: compute on your own machine, or allow lakehousebox.com in the sandbox's network settings.

- New. AI assistants connected to LakehouseBox (Claude, ChatGPT and other MCP clients) can now create tables and add, change or remove rows with SQL; with no account yet, the assistant can set one up for you when you connect, and you keep it by adding your email within 72 hours

- New. Try LakehouseBox in your browser: the /try page (query public datasets or your own files with DuckDB, with an assistant) is linked from the homepage

- Changed. The website and docs show how an agent starts without an account: the homepage, the Agents and Capabilities pages, the quickstart and the agent skills point to lakehousebox.com/new.

- Changed. The agent skills (0.4.0) teach lhbox new and lhbox claim for an agent with a shell and no account yet.

- Changed. Terms of Service, Privacy Policy and Acceptable Use Policy drafts describe catalogs made without an account, their limits and the claim.

- Changed. When you keep a catalog an agent made without an account, the page now says the agent asked to keep read and write, and why, before you choose; read is still preselected.

- Changed. The Home Assistant guide starts from one prompt to your agent and ends with a live Claude dashboard of your home's energy and temperatures.

- Changed. The connector tells your agent where to run the work: in its own DuckDB when it can reach LakehouseBox, on our shared engine when its sandbox blocks the network.

- Changed. Opening a public catalog through the connector now offers a recipe that holds no key first, which agents' sandboxes run without refusing it.

- Fixed. The page where a person keeps a catalog their agent made says so ("Keep a catalog"), gives the claim code's real life (a day), reads times in hours, and no longer asks the agent to connect again afterwards.

- Fixed. lhbox duckdb refuses a DuckDB binary too old to attach a catalog (older than 1.0) and says how to upgrade, instead of starting it.

- Fixed. MCP clients that register themselves (such as the MCP Inspector) accept LakehouseBox's registration answer: empty optional fields are left out instead of sent as null

- Fixed. The browser tab icon is the same orange cube as the logo.

- Fixed. The AI assistant on the try page answers questions (it was switched off by a configuration gap since it launched).

- Fixed. OpenAI's plugin dashboard can connect to the LakehouseBox MCP server: the sign-in no longer refuses its longer request state

- Fixed. Reading a public catalog without an account now works inside Claude's code sandbox: the no-account recipe no longer picks up placeholder cloud credentials the sandbox sets.

- Fixed. Public data downloads are served from the cache again (they had bypassed it since 2026-10-01), so repeat reads of a public dataset are fast and range reads come from the edge

- Security. lhbox duckdb and lhbox table import no longer run SQL text sent by the server: they build the DuckDB connection statements themselves from the catalog's name, address and credential, each checked, and refuse anything out of shape before DuckDB starts, so a wrong or impersonated --url can no longer run commands on your machine (CLI 0.6.36).

### 11 October

- New. The docs say how to connect from the Claude directory, where LakehouseBox is now listed, and from ChatGPT, checked end to end.

- New. Agents can now run SQL on any organisation's public catalog through the MCP server, by the name open_public_catalog gives it (for example commons_pubdata.reference.countries), so a chat with no shell can query public data and Portolan catalogs directly.

- New. The LakehouseBox plugin for agents is public: one install in Claude Code, Codex or Gemini CLI adds the read-only MCP connector and the skills that teach an agent LakehouseBox and Portolan catalogs, from github.com/lakehousebox/agent-skills (MIT). Docs: /docs/skills/.

- New. Skill zips for Claude and Cowork, to upload as custom skills.

- New. Four more agent skills in the LakehouseBox plugin: loading files into tables, keeping a table filled (from a URL on a schedule, or from a producer that sends rows), sharing (access for colleagues and agents, publishing a catalog), and hosted agents.

- Changed. The second copy of data the platform moves to object storage is now kept in Paris (France) instead of Helsinki (Finland)

- Changed. The MCP server tells the apps that connect to it its name, website and logo, so they can show LakehouseBox with its icon instead of a blank tile.

- Changed. open_public_catalog answers with each table's facts and its number of columns; ask for one table to get its columns. A catalog with many tables no longer floods the conversation.

- Changed. Replies to our account emails (sign-in, recovery, invitations) now reach hello@lakehousebox.com.

- Changed. The off-site copies of the data are kept in France only: a locked copy of the recent backups and the cold tier's copy in Paris; no copy is made in Finland any more, and the legal drafts and the site say so.

- Changed. An organisation over its free 5 GB is now told how to get more: until paid storage opens, write to hello@lakehousebox.com and the limit is raised free; once it opens, the message points to Settings → Billing.

- Fixed. Large query results open faster and keep the page light: the first 1,000 rows are shown, with a button for the next ones; the CSV still has every row.

- Fixed. Leaving a table's map now frees its memory; before, the map and the whole table's geometry stayed loaded.

- Fixed. Folders of large photos no longer download every full-size image for its thumbnail; big images open in the preview.

- Fixed. ChatGPT can sign in to the LakehouseBox MCP server: its sign-in request was refused because ChatGPT describes itself with a key-signed client, though it also works as a public client, which is what LakehouseBox now uses.

- Fixed. Hosted agents on the Qwen vision models no longer fail with "model error" on long runs: the model now has room to think and still answer on its final turn.

### 10 October

- New. The account page lists public data in the sidebar under Public, always: browse its tables and columns, read its AGENTS.md and query it in the SQL page, read-only, without copying anything into your catalogs.

- New. Add any other organisation's public catalog to your sidebar by its name (handle/catalog) or its page address.

- New. Upload whole folders to a catalog's Files: drop a folder on the page or use Upload folder; files keep their paths, with a running total and Cancel.

- New. Query a CSV, Parquet or JSON file in the SQL explorer straight from Files, or make a table from it, without downloading it first.

- New. Select several files to copy their paths or delete them at once; copy a file's path, S3 URI or a one-hour download link from its menu.

- New. Filter files by name and sort them by name, size or date; Parquet files preview their columns and first rows.

- New. Upload files to a catalog from the browser: an Upload button on the Files page, or drop files anywhere on it, with progress for each file and a question before anything is replaced.

- New. Create folders and delete files from the Files page.

- New. Two API routes: a signed upload link for one file (POST /v1/catalogs/{id}/blobs/upload) and deleting one file (DELETE /v1/catalogs/{id}/blobs?key=), both at write level.

- New. The public data catalog describes itself: every table says what it is, where it comes from, its licence and how often it refreshes, every column has a description, and the catalog has an AGENTS.md for agents (how to read it, the keys the tables share, attributions).

- New. A repeated query on tables nobody has written to since is answered from a cache instead of running again, without waiting in the shared queue, so a dashboard opened by many people runs each of its queries once; "cache": false runs it anyway.

- New. A query answer says how fresh its data is: the snapshot and commit time of each table it read (snapshots), and whether it came from the cache.

- New. A query can be checked before it runs: dry_run (the MCP query tool, POST /v1/query, lhbox query --dry-run) names each table it would read with its rows, files and bytes, adds them up as an upper bound, and says whether the cache would answer it. Nothing runs and nothing waits in the queue.

- New. Describe a table and its columns for the people and agents who read it: lhbox table document <catalog>.<ns>.<table> --doc "…" --column name="…" (or doc and column_docs in PATCH /v1/table); the descriptions show in describe_table and list_tables search finds them.

- New. Creating a sink on a table without descriptions says so, with the command that adds them.

- Changed. The empty Files and Feeds pages now say plainly that your agent sets these up, and hand you the prompt to give it; the command-line steps are folded away.

- Changed. Drop files anywhere on a catalog's page to import them: the import window opens with the files already previewed, the namespace and table name filled in, and one button that says what it will do (or what is still missing).

- Changed. The import window is simpler: the rows preview is full width, the format version and row order sit under Advanced, and importing from cloud storage is one link away.

- Changed. An empty catalog now points at the public data to explore while it fills.

- Changed. A new, empty catalog now opens with the way to put data in: drop files on the page, hand it to your agent, or create an empty table.

- Changed. Catalog settings start with visibility and the table format; the identifiers for engines and the API come after.

- Changed. Adding a colleague's catalog starts from pasting their recipe; the individual fields are folded away for when you need them.

- Changed. In the SQL explorer, Save as table appears only when the result can be saved, instead of a greyed-out button.

- Changed. Every "are you sure?" on the account page is now the page's own dialog, naming the action on its button (Revoke, Remove access, Rotate…), instead of the browser's pop-up.

- Changed. Save a query result as a table without typing: the namespace is chosen for you, the table is named after what the query reads, and a second save no longer collides with the first.

- Changed. Create table starts with one column to name and a namespace already chosen, and opens the new table when it is created.

- Changed. A new organisation's first catalog is named after its handle (acme-corp gets acme_corp), so queries read acme_corp.sales.orders; existing catalogs keep their names.

- Changed. A new organisation handle must start with a letter and be at most 27 characters, and the signup form shows the catalog name it will give.

- Changed. The platform's public datasets moved to their own organisation: open them as commons/pubdata (in SQL commons_pubdata.<namespace>.<table>); the old name jatorre/pubdata is retired; lhbox 0.6.30 uses the new name in its examples.

- Changed. An agent opening a public catalog over MCP (open_public_catalog) now sees each table's row count, size, last update and description, as for its own catalogs.

- Fixed. A new catalog's Files page shows that it has no files yet, instead of listing the platform's own probe folder.

- Fixed. Dropping a photo, a PDF or another file that is not a table on a catalog's page now says so, instead of opening the import window; on the Files tab the drop says it makes a table.

- Fixed. The "Add a public catalog" dialog now matches the rest of the account page and shows examples of what to type.

- Fixed. Deleting a catalog, making it public, turning off two-factor and deleting your account no longer ask a second time after you have typed the confirmation.

- Fixed. The Billing page's breadcrumb reads Settings / Billing like the other settings pages.

- Fixed. Grant access no longer fails silently when no one is chosen; it lists only who can still be granted, and when there is no one it says so and offers to invite a colleague or create a key.

- Fixed. Someone invited to an organisation who signs up from the CLI (lhbox signup) now joins its catalog at their own access level, instead of failing with "already exists".

- Fixed. An empty folder on the Files page no longer shows a stray "null" under its message.

- Fixed. A query whose result is cut at the row or character limit now reports the data it read (bytes_scanned) and its CPU time, instead of 0.

- Fixed. Changing only a scheduled-SQL sink's key no longer gives a sink whose runs keep failing another day before it is paused, and no longer needs scheduled SQL to be enabled.

- Fixed. A table loaded with lhbox table import (or written by DuckDB) now shows its size in list_tables, describe_table and the public catalog page; it showed none before.

### 9 October

- New. Paid storage, ready to open: an admin saves a card and sets a monthly budget in Settings → Billing; private storage above the free 5 GB is charged monthly, never above the budget, with an invoice on the account page (not switched on yet).

- New. Purchase orders: an organisation can be invoiced monthly and pay by bank transfer instead of a card.

- New. Paid storage charges earlier when it grows: once the days so far this month pass €20, they are charged at once with their own invoice, and the month's close charges the rest (not switched on yet).

- New. Invoices are ready for Spain's VERI*FACTU: each one carries the tax agency's QR code and is reported to it automatically, chained to the one before (not switched on yet).

- New. A catalog, namespace or table name the MCP server cannot find comes back with the closest names you can read (did_you_mean), such as madrid → analytics.air.madrid_hourly.

- New. lhbox sink dedupe <sink> keeps only the latest row per key in a keyed sink's whole table, once: the duplicates stored before the key was set are removed in one commit (--wait waits and says how many).

- New. A sink can carry a key (--key observation_id): each roll replaces the rows that share it instead of appending them again, so a feed that republishes rows keeps one row per key, the latest one.

- New. lhbox sink update <sink> --key … | --no-key changes any sink's key; a sink stopped because its key could not be applied runs again once the key changes.

- Changed. The Terms and the Privacy Policy describe paid storage as built: card payments through Mollie within a monthly budget, invoices from our accounting system before any charge, retries and read-only (never deletion) for unpaid amounts; Mollie and Holded are listed as processors.

- Changed. Invoices for paid storage are issued by our accounting system (Holded) with the LakehouseBox design, and the account page opens them as PDF; a card is charged only once its invoice exists (not switched on yet).

- Changed. A consumer whose monthly budget is above €330 gives a tax ID, since their invoices are full invoices; Spanish tax IDs are checked for their 9 characters.

- Changed. A public table read by its root URL now follows a commit made directly by an engine within about ten minutes (two before); changes made through LakehouseBox still show at once

- Changed. The MCP query tool returns one object per row keyed by column name, which Claude dashboards and BI tools read without a converter; format: "arrays" keeps the list form at about half the size.

- Changed. query returns DECIMAL values as numbers when they fit exactly; longer ones stay text so no digit is lost.

- Changed. MCP answers are compact JSON, and list_tables no longer repeats how to switch accounts on every call: the server says it once per session.

- Changed. The query tool names DuckDB's SQL dialect with a link, and a catalog's AGENTS.md is described as its owner's notes on the data rather than something to read first.

- Changed. Listing your sinks answers in the same time however many you have: their backlog and totals are read together, not one sink at a time.

- Changed. Tables filled by a sink record each roll in their snapshot history under lakehousebox.sink.* (the sink, its batches, row counts and roll time); history written before keeps its earlier names and still counts.

- Fixed. Deleting a catalog no longer leaves its storage behind, and its name blocked, when the storage service restarted in the minutes after the catalog was created.

- Security. A third copy of the most recent backups is now kept in Paris, written with a key that cannot delete and held under a compliance lock, so a compromise of our servers cannot remove it.

### 8 October

- New. Self-hosted: storage quotas are enforced by the install itself; a catalog over its quota turns read-only until it is back under it

- New. Self-hosted: the install maintains its own tables (compaction, snapshot expiry, usage metering, due deletions) every 6 hours, and checks itself every 5 minutes by writing and reading a row through its public address

- New. Self-hosted: server-side SQL (the API's query, the MCP query tool, reading files) runs on the install itself, isolated on a network of its own

- New. Self-hosted: hourly backups of the data store to any S3-compatible bucket, encrypted to your own key, thinned to 48 hourly, 14 daily and 8 weekly copies; on once a bucket and a key are configured, with a 14-day cap you arm after reading its report

- New. Self-hosted: every service sends traces, metrics and logs over OpenTelemetry (OTLP) to the collector you name in AL_OTLP_ENDPOINT; nothing is sent anywhere until you set it

- New. One trace follows a request across services: an MCP tool call, the API work it caused and the storage calls behind it

- New. Self-hosted telemetry shows what each service did: catalog creation step by step, sink rolls, table maintenance, queries, scheduled-SQL and hosted-agent runs, MCP tool calls and file-drop uploads, each counted by outcome

- New. Self-hosted: metrics to alert on without reading logs (storage reachable, background jobs failing, runs failing, queries waiting)

- Changed. Self-hosted: the install's services reach its own addresses without any DNS (an air-gapped install needs no internal records for them)

- Changed. A device post whose records come to more than 16 MiB once stored is now refused with 413 batch_too_large instead of being accepted and then set aside unread.

- Changed. Metric names start with lakehousebox. (they were tablemere.)

- Changed. Reading a table or listing tables answers faster: each catalog lookup behind them no longer pays about 10 ms of connection setup.

- Changed. Removing access answers which catalog key pairs it rotated (keys_rotated), and the account page says so; other people's pasted recipes for those catalogs need a fresh one (lhbox connect), while lhbox duckdb fetches its own every time.

- Changed. lhbox mcp install for Claude Code refuses a key given only with --api-key (it could not be found when Claude Code connects); export LHBOX_API_KEY or use the login lhbox login saves.

- Changed. lhbox update installs only from lakehousebox.com, whatever LHBOX_URL says; another site must be named with --site (https, or http on this machine), and no redirect is followed.

- Changed. --api-key stays, and its help now says a key on a command line is visible to other users of the machine; LHBOX_API_KEY or the saved login is the safer way.

- Changed. Changing someone's access or role answers tokens_capped and agents_capped when it lowered tokens or agents they made, and the activity log records the access a token was actually given when it was less than asked.

- Changed. Inviting an address that already has an open invitation now refreshes that invitation (a new link valid for seven days, the old link stops working) instead of adding a second one.

- Changed. When an account deletion also deletes an organisation you were the only member of, its catalogs are kept unreachable for their grace period (7 days) before they are purged, instead of being purged at once.

- Fixed. A table whose data files are linked from its catalog's file storage is no longer reported as a maintenance problem; it is left exactly as it is.

- Fixed. Self-hosted telemetry: the control plane's own warnings and errors reach your collector (they did not since the telemetry release)

- Fixed. Self-hosted telemetry: "storage reachable" no longer reads 0 on a new, empty install; a request is one span on the server, not three

- Fixed. File drop: an uploader without a username no longer has every upload stuck in staging

- Fixed. The backup lhbox mcp install makes of Claude Desktop's configuration is readable by you only, like the configuration itself.

- Security. An ingest sink no longer stalls when an oversized file is written into its intake area: the file is set aside as a rejected batch (batch_too_large) and the sink keeps rolling.

- Security. Taking someone's access away now rotates the catalog key pair they were handed, within seconds: a removed member, a revoked token (with the tokens it created) or a lowered grant can no longer keep using a recipe they copied earlier.

- Security. lhbox mcp install no longer puts your API key on a command line or into Claude Code's configuration: Claude Code asks lhbox mcp headers for it when it connects, so a new lhbox login also needs no reinstall.

- Security. The CLI never sends your key to another address when a request is redirected.

- Security. Lowering or removing someone's access to a catalog, taking away their admin role, narrowing a token or consenting an MCP connection again with less now also lowers every token they created (and every token those created) to match, rotates any catalog key pair one of those tokens was handed, and removes send rights they can no longer give.

- Security. A hosted agent whose creator loses access to a catalog it reads loses that catalog too and is paused (owner_lost_access) until someone resumes it.

- Security. A token, send right or lhbox login connection made while its creator's access is being reduced (or approved before and collected after) gets at most the creator's new level, and an admin demoted mid-request can no longer create an admin token or edit someone else's token.

- Security. Tokens and hosted agents that kept more than their creator after an earlier reduction are lowered once at this release's first start, where the creator had given that access; access an admin gave stays.

- Security. Invitations are capped at 20 per person and 50 per organisation in any hour (a token's count as the person's who created it); past that the API answers 429 with Retry-After and says when to try again.

- Security. Invitation emails name the sender by their verified email address, never by a name chosen when the token or account was made.

- Security. Sending an invitation needs a verified email address; an account that never proved its address is told to follow a password-reset link first (self-hosted installs without email verification are not affected).

- Security. Deleting your account now asks for your current password, and for a code when two-factor authentication is on, from the account page, the CLI (lhbox account delete) and the API alike.

- Security. Creating an API key, a token, an uploader, a sink or a device token, rotating a catalog's keys or approving a command-line login from the account page now needs a sign-in in the last 10 minutes; otherwise the page asks for your password (and code) once.

- Security. Every new API key of yours is announced by email.

- Security. A password reset by email, including one that sets a first password, and an operator's two-factor reset revoke every API key of the account, so a key someone else created cannot outlive the reset; machines connected with lhbox login keep working.

- Security. A self-hosted install no longer gives any container access to the Docker socket: backups pause the storage service by signal for a fraction of a second, and the service that does it releases it by itself if anything fails.

### 7 October

- Changed. The "Try in the browser" assistant's daily allowance is kept across restarts of the service.

- Changed. Account, catalog and access data now live in a dedicated PostgreSQL database with continuous encrypted backups: any moment of the last 14 days can be restored, with at most about a minute of changes at risk.

- Changed. The agents and signup pages describe the service the way the homepage does, as parts and mechanisms; the capabilities page counts the MCP server's six read-only tools and, with the quickstart, carries the announced pay-as-you-go rate of €0.10 per GB-month above the free 5 GB.

### 6 October

- New. Sinks carry positions: a sink feeds a table with a geometry column, taking GeoJSON, WKT or hex WKB, or building a point from named longitude and latitude fields; a value that is not a valid longitude/latitude geometry rejects its row with the reason.

- New. Tables can be created partitioned (lhbox table create --partition 'day(ts)', the API's partition), and a sink feeds a format-version 3 table partitioned by day, hour, month or year; each day is compacted apart and ordered in space by the maintenance.

- Changed. The homepage presents LakehouseBox as five parts, Catalogs, Feeds, Query, Agents and Public catalogs, each with its lhbox command and its status, with the measured runs and the limits in view.

- Changed. Pay as you go is announced at €0.10 per GB-month of private storage above the free 5 GB, from the day paid plans open; nothing else is metered.

- Changed. On a table of positions partitioned by day or hour, today's data stays in the order it arrived, so "where is every vehicle now" reads only the newest data all day; a day is reordered by place once it has ended (plus two hours for late batches), which keeps area questions on past days fast. No second table is needed.

- Fixed. A public table that the maintenance has rewritten can be opened by its location again (the pointer file such readers need was not written for it).

- Fixed. Public catalogs keep working for engines that open a table by its location: the pointer file those readers need disappeared a day after a catalog was published, and every such read failed until the platform restarted.

- Fixed. Tables written by Snowflake are now maintained: old snapshots expire and files nothing uses are cleaned up, where every run used to stop on them.

- Fixed. Tables with true/false columns that the maintenance had compacted can be read by DuckDB again (it refused them with "Payload value bigger than allowed"), and the maintenance handles true/false columns correctly whichever engine wrote them.

- Fixed. Tables whose files spell the same columns differently (a column added later, or one engine writing a column as required and another as optional) are compacted again instead of being skipped.

### 5 October

- Changed. Maintenance writes a geometry table in spatial order (rows sorted by location, small row groups, geometry bounds on every file), so tables that agents keep appending to stay clustered; the table property lakehousebox.cluster.geometry picks the column or turns it off.

- Fixed. Geometry tables stay fast to query by area after maintenance compacts them: a 1 km lookup on 2.1 M points reads 1.2–3.4 MB after compaction, where it read 28 MB before.

- Fixed. Compacting a format-version 3 table no longer stores its two row-id columns uncompressed, which cost 16 bytes a row (2.1 M points grew from 106 to 141 MB).

- Security. The authorization page for remote MCP connections now always says where the access you allow is sent (the application's return address), including for applications that registered themselves.

### 4 October

- New. An ispindel sink preset: point an iSpindel hydrometer (HTTP or HTTPS Post service) or a GravityMon at a sink's device URL and every reading becomes one row with gravity, temperature, angle, battery and signal, the device's token checked and never stored.

- New. Sensor.Community (airrohr, formerly Luftdaten) air-quality sensors can post to a sink with the new sensor-community preset: each reading (PM2.5, PM10, temperature, humidity, pressure and the rest) becomes one row with the sensor's chip id, in the same columns as the Ecowitt preset.

- New. A sink mapping can now reach readings nested in a list of name/value objects (pairs), and pressure can be converted from Pa to hPa.

- New. Sinks take The Things Network (The Things Stack) webhooks: the new ttn preset turns every uplink's decoded payload into rows of device, time, metric and value (lhbox sink create … --device --preset ttn).

- New. Sink mappings can read nested JSON (flatten) and copy a per-record field such as a device id onto every row (carry).

- Changed. The documentation now starts with pages for people who work through an agent: what to ask and what you approve. Each page links "For agents" to the instructions your agent follows, and those pages link back. The side menu now runs Start here, What you can do, Guides, then For agents.

- Changed. The command-line getting started moved to /docs/quickstart/ ("Quickstart (CLI)"). The community guides drop their tabs: each guide links its technical reference with "For agents".

- Changed. Guides can now be written for people working with an agent: a "With an agent" page with the prompts to paste, example replies, and the steps only you do (with screenshots), next to a "Technical reference" tab that your agent reads. The Home Assistant guide is the first.

- Changed. A device that sends a number into a text column (an iSpindel's chip id) is stored as its text instead of being rejected.

- Changed. Every catalog's bucket is reachable at https://<bucket>.s3.lakehousebox.com (virtual-hosted addressing) with nothing to turn on, under one certificate that names no bucket; a bucket that does not exist answers 404 NoSuchBucket there instead of failing at TLS.

- Changed. Requests for a bucket that does not exist now answer 404 NoSuchBucket to a signed caller, and a malformed bucket name answers 400 InvalidBucketName, as Amazon S3 does; anonymous requests still get 403.

- Fixed. The quickstart now says what the approval page really does (read is preselected; tick write when your agent must create tables) and that connection recipes hide the secret unless you ask for it with --show-secrets.

- Fixed. Tables written by Snowflake into a catalog are no longer refused by maintenance: their old snapshots expire, their metadata is trimmed and unreferenced files are cleaned up (the data files Snowflake wrote are left as they are, not compacted)

- Fixed. After you approve an agent's sign-in, the "Go to your account" button is readable again (it showed as a blank black block).

- Fixed. lhbox sink create --save onto a file that already holds something now stops before anything is created, so a new sink's send key can no longer be lost (it used to create the sink, then refuse to write the file).

### 3 October

- New. Snowflake can write to your catalogs: lhbox connect --engine snowflake --write prints a recipe with a catalog-linked database in which Snowflake creates and writes Iceberg tables, format version 3 with geometry and geography columns included (on a Snowflake account allowed for our endpoint).

- New. Snowflake can now create and write Iceberg tables in a LakehouseBox catalog (a catalog-linked database, geometry and geography included), on a Snowflake account allowed for our endpoint.

- Changed. lhbox connect takes --write to ask for the writing recipe explicitly; the Snowflake recipe stays read-only unless you ask (CLI 0.6.16).

- Fixed. Retrying a catalog creation that was interrupted after its storage was made now completes, instead of failing every time with "safe to retry"; storage that still holds files from an earlier catalog is still never reused.

### 2 October

- New. An agent can have a one-line description, shown in the lists and on its page.

- New. Home shows the latest articles from the LakehouseBox blog, updated as soon as a new post is published.

- New. Outside Catalogs and Agents, the sidebar lists the catalogs, tables and agents you opened last.

- New. A running query or table preview can be cancelled, and it really stops.

- New. Every table has its own page with its numbers, columns and descriptions, latest commit, a preview, its history and the code to connect; writers can edit a table's description.

- New. lhbox prints one line on stderr, at most once a day, when a newer version is published (silence it with LHBOX_NO_VERSION_CHECK=1 or --no-version-check).

- New. lhbox update installs the published version (--check only says which one is out).

- New. lhbox logout revokes the key this machine's login holds and removes it from the credentials file (--local only removes it).

- New. lhbox env check says set or missing for each LHBOX_* variable and the saved login, and never prints a value.

- New. lhbox login --profile NAME keeps a second login (another account or organisation) on the same machine; --profile NAME or LHBOX_PROFILE picks it for a command, lhbox profile use NAME makes it the default, lhbox profile list shows them and lhbox profile delete NAME removes one.

- New. New docs page: File types (/docs/files/).

- New. Photos in a public folder can be served publicly for organisations that ask for it, for example thumbnails next to STAC rasters.

- New. A token can be allowed to send to named sinks of a catalog it reads (lhbox token create --grant <catalog>:read --send <sink>), so one key reads a catalog and appends to its sinks; lhbox sink send uses your own key when you have no send key.

- New. A table with a geometry or geography column has a Map view on its Preview tab: the whole table on a map, or, for a big table, where its data lies, down to the rows of the area you zoom into, read without scanning the rest.

- Changed. A test run's record now lists the email the agent would have sent (subject and text, marked as not sent), and a real run's emails are marked as sent.

- Changed. A hosted agent run may now take up to 400 seconds (was 300), so an agent that reasons at length finishes instead of timing out; an existing agent keeps its own limit until you raise it with lhbox agent update <name> --run-seconds 400.

- Changed. Agents works like Catalogs: the list, each agent's own page (overview, runs, settings) and its editor, with the agents listed in the sidebar while you are in Agents.

- Changed. A catalog's AGENTS.md is edited with Write and Preview, line numbers and Markdown colours, and says when there are unsaved changes.

- Changed. Each page's title carries the icon of what it is: a catalog, a table, an agent.

- Changed. SQL, commands and code shown in the account pages are coloured like the SQL editor; text written by you or your agents (instructions, AGENTS.md, an agent's answers) is set apart in its own typeface, and long instructions no longer break into ragged lines.

- Changed. The account pages are more compact: smaller headings, controls and spacing, so more fits on screen; table names in a catalog's AGENTS.md no longer break across lines.

- Changed. Home is redesigned: quick actions, one banner for what needs attention, the activity for today or the last weeks, your agents' latest runs, usage and your recent catalogs.

- Changed. The account page is back to its previous layout (sidebar, catalog pages, SQL explorer, footer) while a new design is prepared; the changes of #859, #860, #863 and #864 are undone.

- Changed. While a preview, a map, a query or a list loads, the page shows where the data will appear, what it is fetching and for how long.

- Changed. Catalogs in the account page's menu always opens the list of catalogs; a catalog in the sidebar tree opens its Overview.

- Changed. In the sidebar a catalog opens to its namespaces and a namespace to its tables, one level at a time.

- Changed. The account page has a new design: Home, Catalogs and Agents in the sidebar, your catalogs and their tables as a tree to browse, and Settings for members, access keys and usage.

- Changed. Agents shows what needs attention first, filters by status and catalog, and says each schedule in words.

- Changed. Connecting to a catalog is one dialog: an agent through the CLI or MCP (with a setup prompt to copy), or DuckDB, PyIceberg or Spark.

- Changed. Access keys are one list (approved logins, keys made by hand and your own full-access keys), and a new key is made in a dialog that adds catalogs by search.

- Changed. Usage shows your plan as tiles and one table by catalog.

- Changed. lhbox whoami and errors name the profile in use when it is not the default, and a "catalog not found" error lists the other saved logins that might hold it.

- Changed. A catalog's file bucket now takes data files: Parquet, COG and other rasters, FlatGeobuf, PMTiles, GeoPackage, shapefiles, CSV, JSON, Zarr, spreadsheets, PDF, photos and archives, plus any small file. Uploads of other types (video, audio, web pages, programs) are refused with a clear error that says how to ask for a format.

- Changed. The FTP and SFTP drop box refuses video, audio, web pages and programs at upload, so the device sees the error.

- Changed. Catalog names ending in __blobs are no longer accepted.

- Changed. The public datasets with shapes (countries and regions, places of Europe, Europe's rail network) are now Iceberg v3 tables with a native geometry column; places and rail are stored in spatial order, so a query or a map for one area reads a fraction of the table (a box around Madrid: 1.8 MB instead of 27 MB). The old geometry_wkb column is now geometry.

- Changed. lhbox table import writes ZSTD-compressed files (DuckDB's default is SNAPPY), smaller files (a third smaller for the country polygons).

- Changed. Public catalogs are free up to 5 GB as soon as you publish, and up to 50 GB for datasets we review: write to hello@lakehousebox.com with the catalog and what it holds.

- Changed. The public data page's "Publish a dataset" button now leads to the publishing guide.

- Changed. A public catalog's published folder now serves its data files (Parquet, GeoTIFF, FlatGeobuf, PMTiles, GeoPackage, CSV, JSON, Zarr and the other data types) to readers without an account; photos, PDFs, spreadsheets and archives stay readable with your own credentials.

- Changed. Claims made before this change are kept but unverified: they do nothing until the organisation publishes the TXT record and runs lhbox org domain --domain … --verify.

- Changed. lhbox login says when the approval gave less than it asked for (downgraded in its JSON), lhbox agent create|update shows the instructions your integrations will run, and a login request without a level asks for read.

- Changed. A key with write on a catalog may now send to that catalog's sinks; a key without the right gets one "forbidden" answer whether the sink exists or not.

- Fixed. A hosted agent that sends several SQL queries at once no longer gets "busy" back and re-sends the whole batch: the queries wait their turn and are all answered.

- Fixed. Home's "storage measured" time reflects your current catalogs; a recently deleted catalog no longer makes it look days old.

- Fixed. On a phone the account pages use the full width again, and the menu closes once you pick a catalog, table or agent from it.

- Fixed. In the sidebar, the catalog you are on can be folded; it opens by itself only when you arrive at it.

- Fixed. A table preview with very large geometries (country outlines, for example) loads in a second instead of freezing the page; large values show their shape and size.

- Fixed. Queries that return very large geometries no longer freeze the SQL page; each still opens on the map and goes whole into a CSV.

- Fixed. Editing a table's description on its page saves again; it answered with an error about naming the catalog.

- Fixed. lhbox catalog agents-md --raw prints the text alone when its output goes to a file or a pipe, so saving, editing and writing back a catalog's AGENTS.md no longer stores the JSON wrapper in it.

- Fixed. A command an old lhbox sends to a path the API no longer serves now says so, and names the update, instead of a bare Not Found that read like a wrong id.

- Fixed. A hosted agent's prompt now includes its catalogs' AGENTS.md (it never did, from a response-shape mismatch), except for an agent that acts with your integrations, which reads it as data on request.

- Fixed. A table's Preview shows geometry values as readable WKT instead of raw bytes.

- Security. An organisation's email-domain claim takes effect only after a DNS TXT record (_lakehousebox.<domain>) proves control of the domain, and it is re-checked daily; public mail domains cannot be claimed; a verified, open domain now offers membership that the person accepts (lhbox org offers, lhbox org join), and nobody is added by their email domain alone or put back after leaving or being removed.

- Security. Only the person who connected an integration or a web key attaches it to a hosted agent, changes that agent, runs it by hand or reads what its runs did, signed in as themselves; a token (an lhbox login connection, an MCP client) is refused, and a definition a token wrote runs with the integrations only after the person approves it (lhbox agent update --confirm-definition).

- Security. Approving an lhbox login now asks for the code shown in your own terminal, preselects read (write is ticked by you), and shows the network and time the request came from.

- Removed. The account page no longer makes API keys that act as you; give a machine its own key with lhbox login or New key.

### 1 October

- New. Hosted agents can run on a model that sees images: choose Qwen 3.6 35B or Qwen 3.5 397B (both on Scaleway in Paris) on the agent's page or with lhbox agent update --model.

- New. view_image: an agent on a vision model can look at photos in its catalogs' files (downscaled, up to 6 per run); its run record keeps the key and size, never the image.

- New. A hosted agent can append rows to tables you name (lhbox agent update NAME --write catalog.ns.table): append-only, checked against the table's columns, capped per run, never stored twice on a retry, and only checked (not written) in a test run.

- New. A hosted agent can read web pages and APIs on hosts you name (--allow-host HOST): https GET only, redirects only to those hosts, 2 MB per page, a set number of fetches per run.

- New. An API key for a web host is stored once (lhbox integration add NAME --web-key --host HOST --api-key-stdin) and sent by LakehouseBox to that host only; the agent never sees it and a run's record never shows it.

- New. Members of an organisation can have an agent's notices emailed to them (lhbox agent subscribe NAME or "Email me this agent's notices" on its page), each with their own stop link.

- New. A catalog's page lists the hosted agents that read it.

- New. Home shows what needs attention across your catalogs: a stopped or lagging feed, a paused scheduled query or agent, a failed agent run, storage near the plan's limit.

- New. Home shows what happened in the last two weeks (tables, catalogs, feeds, agents, keys, members), each line linking to the thing it names; members see their own.

- New. A new organisation gets its first steps on Home: load data, connect, query, invite.

- New. A banner on the account page says when LakehouseBox is not answering, and goes away once it answers again.

- New. The account page opens on a new Home: load data, connect an agent, query, invite your team, your catalogs and your plan at a glance.

- New. Every page of the account page has its own address, so a link or a reload opens the same page, also after signing in again.

- Changed. The agent allowance counts tokens of the default model; other models use it faster or slower by their price (lhbox agent models shows each model's multiplier). Runs on the default model are charged exactly as before.

- Changed. An agent's notices are written in Markdown and arrive as formatted email.

- Changed. The public page of a public catalog (tables, columns, recipes, the catalog's AGENTS.md) uses the same denser type scale as the account page, so a table's columns and its recipes fit on one screen; the smallest labels in the account page are never below 10 px.

- Changed. The documentation reference pages (API, CLI and the rest of /docs) read one step denser (15 px body, smaller headings and route cards), the Public data page's dataset cards are tighter, and the sign-in, welcome and reset pages have smaller titles and sub-lines; nothing moved and nothing changed behaviour.

- Changed. A catalog's page opens on an Overview: what comes in (feeds), what is stored (tables) and which agents read it, how to connect, and the start of its AGENTS.md.

- Changed. Connecting to a catalog has one card with a tab per way in: an agent (lhbox login or the MCP server), DuckDB, PyIceberg or Spark.

- Changed. A catalog's identifiers and where it is stored moved to its Settings, under Details; its header shows size, tables and the country it is stored in.

- Changed. Sinks are called Feeds on the account page; the CLI command stays lhbox sink.

- Changed. The account page no longer has a footer; the query engine's state shows next to the Run button while it starts or if it fails.

- Changed. In the catalog explorer a namespace expands and collapses its tables, and a collapsed one shows how many it holds.

- Changed. The account page's sidebar is Home, Catalogs, SQL and Agents; Members, Access keys, Usage and the organisation's details are under Settings, and your own profile and security under your name.

- Changed. The catalog explorer with its switches is now part of the SQL page.

- Changed. Members no longer see buttons for actions only an admin or a catalog's writers can take.

- Changed. append_rows writes each set of rows once: its answer says what is stored this run, and the same rows sent again in the same run are not written twice.

- Changed. The company is now named Lakehousebox, S.L., with its registered office at calle Bárbara de Braganza, 2, 2ª planta, 28004 Madrid: the Terms, privacy policy, legal notice, data processing agreement, acceptable use policy, the website and account emails say so.

- Changed. An account created with lhbox signup reaches the account page by setting its first password through "Forgot your password?".

- Security. Signing up from the command line (lhbox signup) now connects the machine you signed up from with its own key, holding read and write on your first catalog only, instead of handing out a key with all of your access; it is listed and revocable under Connections & tokens.

- Security. Lost keys are no longer replaced by a code sent to your email: a person resets the password with "Forgot your password?" and logs in, and a machine runs lhbox login again; lhbox recover and the recovery page now say so.

## September 2026

### 30 September

- New. Each agent has its own page on your account: what it does, which catalogs it reads, when it runs (with the next run times), and the tools it may use (email you, your integrations and which of their tools), plus a New agent button.

- New. Hosted agents can be test-run: "Test run" on the agent's page or lhbox agent run --dry-run runs it for real but only shows the email and memory it would write; test runs do not use the day's runs.

- New. Every agent run now shows what it did: each tool call with its SQL and result, the email it sent, and the memory before and after (lhbox agent runs --detail, "What it did" on the page); lhbox agent show shows the agent's memory.

- New. lhbox agent models lists the models agents can use, where they run and their price; hosted agents have their own docs page (preview, enabled on request).

- New. The account page has an Agents tab: your organisation's agent allowance, each agent's schedule and runs with their final message, Run now and Pause, and your integrations with Connect, Reconnect and Delete.

- New. Hosted agents can use any MCP server: paste its URL on the account page and sign in there (servers that register apps automatically), give it an API key, or connect a server that needs neither; its tools are listed to choose from per agent.

- New. You can get LakehouseBox product news by email, about once a month: tick the box when you sign up, or turn on Email updates on your account page; every email has a one-click unsubscribe.

- New. A "Try in the browser" page (/try, not linked from the menu yet) queries the public catalog with DuckDB running in the visitor's tab: no account, nothing executed on our servers; results as a table, a map (WKB geometries and lon/lat points, coloured and sized by a column) or a chart; a CSV, Parquet, JSON or GeoJSON dropped into the page, or a Parquet on the web, becomes a my.<name> table that joins with the public tables and never leaves the tab; every dataset has a story and a short tour; a link shares a query.

- New. The page's assistant writes DuckDB SQL from a question in plain words, fixes a query the engine refused, explains a result and picks a chart for it, and suggests questions for a dataset (POST /v1/try/ask, anonymous, rate-limited per address and per day; the model sees table and column names, the SQL and a sample of the result, never a file).

- New. The Explore page's map draws with deck.gl on the CARTO basemap: markers coloured and sized by a column, polygons and lines, and a heatmap or 3D hexagon bins for a dense point result; the table sorts on a header click and draws a data bar behind every measure; the assistant proposes follow-up questions as chips and titles each result.

- Changed. The account page reads one step smaller throughout: page titles, the sidebar and catalog explorer, tables, forms and buttons are set at a workbench's scale (12–13 px body, 28 px titles, 32–34 px controls, tighter rows), so a catalog's tables, tokens and members fit on one screen; nothing moved and nothing changed behaviour.

- Changed. Account emails (sign-up, password, invitations, agent notices) carry the LakehouseBox logo and name the company, LakehouseBox SL.

- Changed. The privacy policy, legal notice and data processing agreement name the company, LakehouseBox SL in Madrid, and the privacy policy describes the opt-in product-news email and its sender.

- Changed. The email updates you can sign up for are a weekly: product news, new blog posts and the occasional offer, at most once a week.

- Changed. Hosted agents refuse unknown fields with invalid_field, and a scheduled run that ends needing attention emails the owner.

- Changed. Deleting your account also deletes the organisations you were the only member of, with their catalogs and tokens.

- Fixed. The store's maintenance compacts format-version 3 tables, geometry tables included, and keeps each row's lineage.

- Security. Connecting a server finishes only in a browser signed in to LakehouseBox as the person who started it, and each agent run can reach only the MCP servers it uses.

- Security. An uploader key can no longer change its file storage's versioning, CORS or lifecycle settings; an audit found no such change in production.

- Removed. The Gmail connector (Google's Gmail MCP server is limited to Workspace developer-preview accounts); agents email their owner with the built-in notice instead.

### 29 September

- New. Scheduled SQL sinks: an organisation it is enabled for runs a DuckDB query on a schedule to keep a table populated (lhbox sink preview|create|run|runs|pause|resume), and the account page shows each sink's schedule, query and runs.

- New. Scheduled SQL connections hold a write-only credential for an authenticated https source, added on the account page or with lhbox sink connection create --value-env.

- New. Scheduled SQL has its own docs page with a worked example run on the live service.

- New. Hosted agents, in preview for the organisations it is enabled for: a named prompt with read grants on catalogs runs on demand (lhbox agent create|run|runs) within a monthly token allowance and notifies its owner.

- New. Hosted agents run on a cron schedule in a time zone (lhbox agent create --schedule), and pause and email the owner after three failing runs in a row.

- New. lhbox table import writes geometry files in Hilbert order of the geometry, so spatial lookups read far less data.

- New. New docs pages for loading data, time travel, public catalogs and access.

- New. The docs get a side menu grouped by section, and every page has a Markdown copy for agents.

- Changed. Organisation tokens are called tokens everywhere: lhbox token and /v1/orgs/{org}/tokens replace the agent names, with no compatibility layer.

- Changed. --bbox-columns is removed from lhbox table import; the docs filter spatially with &&, which skips files and row groups.

- Changed. The query service, scheduled SQL and the account page run DuckDB 1.5.6, so && no longer returns rows with a NULL geometry; st_subdivide is refused.

- Changed. The CLI and docs say catalog tokens and storage credentials live an hour (CLI 0.4.3).

- Changed. The home page tells the whole product (store, feed, act), and the site marks public catalogs as live with a link to their docs.

- Changed. The site, docs, API answers and maintenance messages no longer name the underlying store.

- Removed. The /docs/self-hosting/ page is removed.

### 28 September

- New. A public catalog can also publish a folder of its file storage (lhbox catalog publish --files <prefix>/), so rasters and other files are readable without an account; --no-files stops it.

- New. lhbox table delete and lhbox namespace delete (DELETE /v1/table, DELETE /v1/namespace) drop a table with its data or an empty namespace, confirming first and refusing a public catalog without force.

- New. A catalog's AGENTS.md, a file at the root of its file storage, is read by anyone who reads the catalog and edited by writers through the API, CLI and account page; MCP list_tables and describe_table say when one exists.

- New. lhbox connect --engine trino|polars|clickhouse prints the recipes verified against the service.

- New. The docs show Snowflake reading a catalog from a Snowflake account allowlisted for S3-compatible storage.

- New. The account page's Create-a-token form offers an admin role to organisation admins, and the tokens list shows each token's role.

- Changed. CLI 0.3.15: with --json or piped, every failure prints one error envelope on stderr, and exit 5 says whether the request may have completed.

- Changed. CLI 0.3.16: a table is written one way, [catalog.]namespace.table, on every table command, irreversible verbs take --yes, and MCP scopes are checked per route.

- Changed. The docs and a catalog's maintenance block say compaction covers format-version 2 tables; format-version 3 tables get snapshot expiry and orphan cleanup, compaction is roadmap.

- Changed. The read recipes drop the "known gap" note: the read-only credential cannot write by any path on the store we run.

- Fixed. UPDATE, DELETE and MERGE work on format-version 3 tables (the store accepts their deletion-vector files).

- Fixed. Maintenance expires snapshots and sweeps orphans on format-version 3 tables with deletion vectors and on geometry tables with a CRS, which it used to skip or fail on.

- Fixed. In a public catalog, a table created or committed after publishing no longer answers 404 at its public URL until maintenance runs.

- Fixed. An MCP connection approved with catalogs:read alone can open a public catalog.

- Security. The store checks S3 Tables authorisation before revealing whether a resource exists, and creates are exclusive, closing a low-severity cross-tenant tag write.

### 27 September

- New. Signing up with an address at a throwaway mailbox service (or a subdomain of one) is refused with disposable_email; invited and claimed-domain addresses are unaffected.

- New. Trino 483 and Polars are verified to read and write a catalog, and ClickHouse to read one through icebergS3; the docs and site list them.

- Changed. The acceptable use policy gains an egress fair-use section, and the public limits state the 3× guideline: egress stays free for analytical use but not for bulk public serving.

- Changed. Security reports go to hello@lakehousebox.com, which security.txt and the docs footer now name.

- Fixed. Deleting a catalog with purge no longer reports its storage as incomplete because an empty namespace list was read as unreadable.

- Security. The query service's image library moves to Pillow 12.3.0, clearing the 18 known vulnerabilities in the decoder that renders file previews.

### 26 September

- New. Any account can attach a public catalog read-only by name with lhbox duckdb --catalog <handle>/<catalog> or lhbox connect <handle>/<catalog>.

- New. The MCP server gains a fifth read-only tool, open_public_catalog, which returns a public catalog's tables, their columns and the DuckDB recipe to attach it.

- New. Launch-day admission control: past an hourly or total cap, or while the store is short of room, a new signup joins a waitlist ("You're on the list") instead of failing, and existing accounts, logins and invitations are never held.

- New. The public data catalog publishes places and rail_network and refreshes earthquakes, nine datasets in all.

- New. lhbox catalog update <name> --virtual-host on (CLI 0.3.8) and PATCH /v1/warehouses/{id} mark a catalog for virtual-host S3 addressing, and only such catalogs get a certificate.

- New. The agent docs and llms.txt open with "rules that save a retry", the pitfalls that otherwise cost an agent a second attempt.

- Changed. The server-side query scheduler serves the organisation with the fewest queries running first, so a light query no longer waits behind other organisations' heavy ones.

- Changed. A server-side catalog read costs a fraction of the CPU it did: extensions are verified once at start-up and the query process starts preloaded.

- Changed. The docs say the CLI installs from install.sh only; the PyPI names are placeholders, and Python 3.9 is the stated minimum.

- Changed. The publish note and help say plainly that any account can attach a published catalog read-only by name, while anonymous callers get no catalog access.

- Changed. The site describes backups as hourly with a second copy in Helsinki, a weekly automatic restore drill, and catalog tokens that live an hour.

- Changed. Every page of the site fits a 375 px phone, the sitemap lists every docs page, and phones load lighter hero and dataset images.

- Changed. Storage use is metered from the store's own per-catalog figure every 5 minutes, and maintenance runs in parallel every 6 hours.

- Fixed. Public tables read with iceberg_scan on their path again: the version hint file holds the bare number, and public_holidays drops spurious Sunday rows.

- Fixed. GET /v1/sinks?catalog_id= and ?catalog= filter the list instead of returning every sink.

- Fixed. GET /v1/warehouses reports each catalog's virtual_host flag as stored.

- Fixed. Creating a catalog whose first attempt half-succeeded now finishes, and deleting one no longer leaves storage behind, however many catalogs the store holds.

- Fixed. A confirmation mail the relay refuses for the moment waits in a retry line instead of failing the signup with a 502.

- Fixed. The ingest sink delivers each batch exactly once, even after a crash mid-roll and after old snapshots have been expired.

- Fixed. The public data catalog refreshes daily again (the host had run a stale copy for four days).

- Security. Revoking an agent also revokes every agent it created, transitively, in one step.

- Security. Sign-in rate limits survive a deploy, and IPv6 callers are counted per /64.

- Security. Service responses no longer name the proxy or the drop box's version, and send a Permissions-Policy header.

### 25 September

- New. The hosted MCP server offers four read-only tools (list_tables, describe_table, query, get_object) to agents with catalogs:read, and accepts agent keys remotely.

- New. The API lists tables with freshness, size, row count, docs and sort order, searches them, and returns a table's recent snapshot log, all from Iceberg metadata.

- New. GET /v1/object returns a file from a catalog, with images downscaled, and a 15-minute download link.

- New. The SQL explorer shows geometry columns as WKT with a Map button that draws a row or the whole result on a basemap.

- New. A person can sign in with a passkey alone, or use one as the second step of 2FA.

- New. The API answers under catalog names as well: /v1/catalogs, catalog_id, catalog, and catalog_location beside every warehouse field.

- New. A public catalog has its own page at lakehousebox.com/app/<handle>/<catalog>, with its tables, columns and a no-credentials DuckDB recipe.

- New. The explorer shows a table's definition as DDL and copyable connection snippets for DuckDB, PyIceberg, Spark and lhbox.

- New. The explorer profiles each column from the table's manifests and shows its distribution or top values on a click.

- New. The account page has a ⌘K palette that finds catalogs, namespaces, tables and columns as well as pages and actions.

- New. Every empty state on the account page offers a ready prompt to hand the job to an agent.

- New. The account page says where a catalog's data lives and where its recovery copies are kept.

- New. The public data catalogs gain Europe's places, daily air quality and rail network.

- New. lhbox --version names the build, and lhbox doctor warns when a newer CLI is published.

- Changed. lhbox mcp install sets up the hosted MCP server by default; the local stdio server is a developer tool only (CLI 0.2.1).

- Changed. The CLI (0.3.0), the MCP server and the account page speak the catalog API names.

- Changed. lhbox agent revoke and lhbox agent update take the agent's name or id as a plain argument (CLI 0.2.3).

- Changed. Queries run in a shared queue with at most 4 running per organisation and 4 per key, a busy answer names the limit it hit, and lhbox whoami shows the query limits.

- Changed. The query endpoint allows only a pinned list of functions and supports spatial SQL.

- Changed. Queries cost about three times less CPU, and spatial loads only when the SQL asks for it.

- Changed. A key that keeps resending a busy query or object request is answered busy by the API directly, with Retry-After.

- Changed. A query that runs out of memory answers query_memory with the limit and a remedy instead of a raw error.

- Changed. OAuth discovery publishes one authorization-server document (no OpenID one), and protected-resource metadata at the root path too.

- Changed. Access tokens name the member or agent that made them, revoking names the agent first, and Usage is described in words.

- Fixed. Explorer SQL errors point at the user's own lines, and a failed run no longer shows stale results or errors.

- Fixed. MCP tools quote table names, flag catalogs marked gone, and list_tables works with catalogs:read alone.

- Fixed. A request that cannot reach the store answers 503 storage_unavailable instead of 500.

- Fixed. Requests during a platform deploy no longer fail with 502 while the control plane restarts.

- Fixed. Maintenance compacts tables whose position-delete files it could not read before.

- Fixed. A deleted catalog whose storage was not yet empty is retried automatically instead of waiting for an operator.

- Security. A tenant's storage key can no longer create further access keys, and revoking an identity deletes every key it holds.

### 24 September

- New. A sink can take readings straight from a device at in.lakehousebox.com (a per-sink device URL, a declarative field mapping and an Ecowitt preset), managed with lhbox sink --device, device-token, mapping and test.

- New. Index rules turn every file uploaded under a prefix of a catalog's file storage into a row of a table (lhbox index), with image size and time extractors.

- New. Uploaders can deliver files over FTP, FTPS or SFTP to a drop box at ftp.lakehousebox.com, with a generated login.

- New. Deleting a catalog starts a 7-day grace period during which it can be restored.

- New. A catalog can keep N days of time travel (lhbox catalog update --snapshot-retention-days, 1–90).

- New. POST /v1/query and lhbox query run a read-only SQL query on the server side against the catalogs you can read.

- New. SQL explorer result rows that name a stored file get a View cell that opens the file's preview.

- New. The account page stays signed in across tabs and browser restarts, and several accounts can be signed in on one browser.

- New. Signups record the campaign tags of the page they came from, including signups that start from lhbox login, without cookies or a pixel.

- Changed. The account tab is split into Profile, Security, API keys and Organisation.

- Changed. The account page and SQL explorer get four design rounds and seven polish items, including narrow screens.

- Changed. The pricing page shows three plans (Free 5 GB; Public data and Commercial coming soon), what is not metered, and use cases.

- Changed. The site footer is three columns with fewer words, and the compatibility strip shows whole logos aligned.

- Changed. Blog posts and legal pages use a white reading surface.

- Changed. Table maintenance no longer lets empty files or unbounded files break ordered compaction.

- Fixed. lhbox --help and usage errors work on Python 3.9.

- Security. A deleted public catalog is no longer readable during its grace period, and uploader keys whose revocation failed are retried until removed.

- Security. Login sessions and API keys stop working as soon as they are revoked, two-factor code guesses are capped per account, MCP tokens cannot mint API keys and end with the consenting person, and OAuth client metadata fetches are protected against SSRF.

- Security. A member removed from an organisation loses write on the catalogs they created, and a write holder can no longer undo an admin's revocation.

- Security. An uploader can no longer write into the service's own area of the file storage, and failed uploader creations leave no live key.

### 23 September

- New. The account page's Catalog explorer attaches several of your catalogs at once, read-only, plus a colleague's catalog from a pasted read-only recipe, and one query joins across them.

- New. "Save as table" in the SQL explorer writes a query's result into a new table of the catalog, in format version 2 or 3.

- New. The SQL explorer has a real editor with DuckDB syntax highlighting, and the DuckDB in the tab validates the query as you type.

- New. Human accounts can turn on optional two-factor authentication (an authenticator app code, with 8 one-time backup codes).

- New. lhbox table import and the other import paths write larger files in the order of a chosen column, so queries read fewer files; the performance docs explain the layout.

- Changed. The homepage says what LakehouseBox is for a reader who does not know Iceberg, with a service-boundary section and the capabilities as use cases.

- Changed. Compaction by the store records column statistics, keeps the data's order and writes several row groups, so compacted tables can be pruned at the file level.

- Changed. Table maintenance compacts files in order of the table's cluster column with 1 M-row row groups, so a range query reads only the files it needs.

- Fixed. The SQL explorer no longer falls to Direct mode with "database already exists" when the table panel connects at the same moment as the first Run.

- Fixed. The nightly backup no longer takes the catalog and S3 endpoints down for 3–4 minutes; it snapshots the store online with a sub-second pause.

- Fixed. lhbox table import --python and LHBOX_PYTHON use the named virtual environment's DuckDB instead of the one running lhbox.

- Fixed. No page of the site or docs scrolls sideways at 1440, 1024 or 390 px wide.

- Fixed. The account page gets a phone layout (the sidebar is a drawer) and seven other workspace defects are fixed.

### 22 September

- New. Public data: a pubdata catalog of public datasets refreshed daily, shown on /public-data with an image and an agent data card per dataset.

- New. The account page's Import files dialog previews Parquet, CSV or JSON files from the computer or from S3-compatible storage and writes them into a table from the browser, as format-version 2 or 3 with geometry included.

- New. The SQL explorer runs DuckDB 1.5.5 in the browser, so "Load the sample table" writes the table instead of falling back to text.

- New. The catalog view has a Files section that lists the catalog's uploaded files with size, date, image thumbnails, a preview and a download link.

- New. The account page gains a Permissions view with a Grant access dialog, a Tables page with search and filters, and Download as CSV or Parquet.

- New. The site has a blog with a front page, article pages and an Atom feed.

- New. Every page ships a favicon.ico.

- Changed. The product is LakehouseBox: the CLI is lhbox (package lakehousebox, LHBOX_* variables, ~/.config/lhbox/), the MCP server is lakehousebox, and the site and services live on lakehousebox.com, with no compatibility layer for the old names.

- Changed. A project may hold 10 catalogs (was 3), tables and namespaces are no longer limited, and the Usage tab shows the free plan as one storage figure.

- Changed. The account page is a workspace: one sidebar with navigation and the catalog tree, a breadcrumb, settings as cards, a status footer, an SQL explorer with a side panel, and Back returns to the previous view.

- Changed. The homepage is rebuilt for LakehouseBox with copy controls on every command.

- Changed. The How it works page is rebuilt around an illustrated walkthrough, with the technical detail under expandable sections.

- Changed. The sovereignty page is rebuilt.

- Changed. The account page and signup use an accessible custom select in place of the native one.

- Fixed. A live catalog is no longer marked as gone, skipped by maintenance and shown as storage_gone on the account page because its storage answered HEAD with 404.

- Fixed. Deleting a catalog removes its tables' files and its storage instead of leaving them behind after a 409.

- Fixed. The login page loads in Chrome 153 again (the account page's script failed to parse).

- Fixed. The SQL explorer shows decimals as numbers with their scale, and column types read as SQL.

### 21 September

- New. A catalog's file storage accepts expiry rules: catalog lifecycle set|get|clear in the CLI and four API routes make uploaded files expire on their own, and the storage meter follows.

- New. The docs publish /docs/uploaders/ and /docs/lifecycle/, and the agents page explains expiring uploads.

- New. The ingest sink: a producer without an engine POSTs JSON rows (up to 16 MiB a batch) to one endpoint per table with a send-only key, and a roller commits them to the Iceberg table; the CLI has sink create|list|get|delete|send and the docs have /docs/ingest/.

- New. Each catalog has a storage tier policy, hot or cold, that an organisation admin sets with catalog update --tier or the API; catalog get and usage show the cold bytes, and demo_data and public catalogs stay hot.

- New. A new catalog reports its status and its recipe answers 503 provisioning until a storage probe signed as the tenant succeeds, so an agent never receives a recipe that does not work yet.

- New. login --no-wait keeps a pending device login and login --resume finishes it later; the default wait says how long is left.

- New. doctor --write-probe performs a real write and delete against the catalog and fails while the catalog is still provisioning.

- New. table import reads CSV (.csv, .csv.gz, .tsv or --format csv) as well as Parquet, and --python PATH chooses the interpreter whose DuckDB runs the import.

- New. login --catalog NAME[:LEVEL] asks for specific catalogs at read or write level, and the device approval page lists every catalog with its level and says "waiting" until the agent claims its key.

- New. The MCP tools are named list_catalogs, create_catalog and delete_catalog (the old warehouse names stay as aliases), and the server reports a real version.

- New. The docs explain how your data is stored (/docs/architecture/), with encryption at rest corrected in the security page.

- Changed. New catalogs get readable storage names built from the organisation handle and the catalog name instead of UUIDs; older catalogs keep theirs.

- Changed. whoami and usage print brief JSON by default (identity, organisations, catalogs, limits with headroom and what is enforced); --full returns the API's whole document.

- Changed. Every catalog <verb> takes the catalog as a positional argument, and catalog get <name|id> shows one catalog.

- Changed. The default catalog created at signup is named demo_data, and the recipes and the SQL explorer attach every catalog under its own name.

- Changed. The agent setup guide leads with a quick path of a few shell commands and gains a gotchas-by-engine section and a flags and environment reference.

- Changed. Creating a catalog makes one propagating identity change in the store instead of four, with data access granted by a catalog policy.

- Changed. The Spark recipe sets client.region us-east-1 and notes Java 17, and the engines page states each engine's status.

- Changed. The account page asks the API for each answer once per page load (17 requests to 14 on login).

- Fixed. Uploads by a tenant or uploader key in aws-chunked form, the default of current AWS SDKs over HTTPS and of PyArrow and PyIceberg, are no longer refused with AccessDenied.

- Fixed. Deleting a catalog waits for the store to empty the dropped tables instead of failing with a 409.

- Fixed. On the account page "Load sample data" loads the sample, the invitation link opens a page that accepts it, the site header works at phone width, and names no longer show as ids after a reload.

- Fixed. /pricing/ is a page instead of a 404, and user-facing text no longer points at repository paths.

- Security. New data written to the store is encrypted at rest.

### 20 September

- New. People log in with email and password owned by the platform (argon2id, rotating sessions with reuse detection, password reset), and the CLI can log in through a device flow.

- New. The account page serves login, welcome, forgot-password, reset and device-approval pages, with sessions and password change in the account tab.

- New. tablemere login connects a machine by browser approval and never prints the key; each approval creates a named connection (an agent).

- New. /docs/agent-setup/ publishes the instructions an agent follows to install the CLI, log in, check DuckDB and run its first tasks.

- New. Organisations have admin and member roles and per-catalog access grants, with a read-only credential per catalog; deleting a catalog asks for its typed name.

- New. Agent tokens carry an admin or member role, capped by their creator (--role).

- New. An MCP server exposes the platform to agents over stdio (23 tools); tablemere mcp install sets it up without printing the key.

- New. A remote MCP server answers at mcp.tablemere.eu over Streamable HTTP.

- New. The remote MCP server has its own OAuth 2.1 authorization server, with a consent page on the account page.

- New. A catalog can be published for anonymous reads (publish and unpublish with the typed name), with a no-credential DuckDB recipe and a 50 GB public storage tier.

- New. Virtual-hosted-style S3 addresses (<bucket>.s3.<host>) work, with certificates issued on demand for existing catalogs only, for Snowflake's S3-compatible path.

- New. A catalog carries a default Iceberg format version (2 or 3) for tables created through the CLI, MCP or API; GET /v1/config/formats says which engines write which version.

- New. Format-version 3 tables with geometry and geography columns are supported; DuckDB 1.5.5+ writes them.

- New. table import loads many Parquet files in one commit, tablemere duckdb opens an attached shell, and table properties can be set in one commit.

- New. Scoped blob-uploader credentials let a device or partner only drop files into a catalog's blob storage (catalog uploader create|list|revoke).

- New. GET /v1/usage reports per-catalog storage history and S3 traffic.

- New. Storage is measured when a catalog is created and on demand (catalog measure), and every figure says when it goes stale.

- New. The CLI gains doctor, a DuckDB 1.5.5 check, a short whoami, and uses the default catalog when none is named.

- New. The website is rewritten around persistent analytical data for agents, with /agents, /sovereignty and /self-hosted pages.

- New. The homepage answers a recorded question on real data and offers a copyable prompt as a second way in.

- New. The site documents recovery points, throughput, duckdb and table import, and bring-your-own relay with blob uploaders.

- Changed. The unit is called a catalog everywhere a person reads it: tablemere catalog is the command group and warehouse a hidden alias.

- Changed. The default catalog is demo_data and new catalog names must be SQL identifiers (400 invalid_name with a suggestion); the account page shows a catalog list and a catalog view.

- Changed. A catalog can be created without naming a project.

- Changed. Catalog routes accept a catalog name or id, the CLI shows tables instead of JSON blobs, and agents are addressed by name.

- Changed. The connection recipe attaches the catalog under its own name.

- Changed. Every limit reports whether it is enforced; tables, namespaces, objects and commit spacing are advisory.

- Changed. Deleting a catalog answers 202 at once and tears storage down in the background; key rotation answers without waiting on the old read-only key.

- Changed. Maintenance checks tables hourly and compacts from 10 small files.

- Changed. The site moves to tablemere.com and the service hostnames (api, catalog, s3, mcp) move under it; tablemere.eu becomes the sovereignty front door.

- Changed. Onboarding says one thing, tablemere login; piped connect prints JSON and --human prints the SQL.

- Fixed. Fetching a connection recipe no longer takes about 20 s (it stopped rewriting access policies on every call).

- Fixed. Table row counts are net of delete files.

- Fixed. --column accepts types whose parameters contain colons, such as geometry(EPSG:28992).

- Fixed. The remote MCP host and the catalog-token endpoint work again after a route clash.

- Fixed. Signup no longer tells an invited or domain-joining person they are the first admin.

- Fixed. A server error reaches the browser with CORS headers for allowed origins, so the account page can show it.

- Security. Account deletion needs confirmation, code attempts are atomic with a per-address verify limit and salted hashes, and emails are unique.

- Security. The S3 hosts no longer expose the store's fingerprint headers.

- Security. The website's Content-Security-Policy no longer allows inline scripts.

- Security. Password reset answers identically for known and unknown addresses.

- Removed. The Rauthy identity provider leaves the managed service; login is the control plane's own (external issuers stay for self-hosters).

### 19 September

- New. Signing up ends in a working catalog with a paste-ready DuckDB recipe, not a mailing list; API errors share one {"error": {code, message, remedy}} envelope.

- New. Registration by email and a one-time code works from the CLI (signup --code --save), with a per-address budget.

- New. Organisations with domain join and invitations, API-key management and account recovery.

- New. Agents are first-class principals owned by an organisation, each with its own scoped API key.

- New. Every catalog gets a blob bucket next to it for images and other non-table files.

- New. Terms acceptance is recorded per version and an account can be deleted (DELETE /v1/me, purged in the background), with CLI terms and account commands.

- New. An audit log records every action on an organisation, readable with GET /v1/audit and the CLI's audit.

- New. The Tablemere website launches on its new design, with signup against the live API, Terms and six legal draft pages.

- New. The site gains a docs section and llms.txt generated from the CLI and API, a CLI installer (install.sh with checksum), pip packaging and a 404 page.

- New. The account page has a SQL panel that runs DuckDB in the browser against the real catalog.

- New. Every site page, docs included, links to "Your account".

- Changed. The platform runs on one European store that is also the Iceberg catalog, credential vendor and maintenance engine; Lakekeeper, Postgres and OpenFGA are gone.

- Changed. Vended storage credentials last 3600 s (the store had been replaying an older flag); Snowflake's catalog integration is verified.

- Changed. The user-facing product is renamed Tablemere: the CLI is tablemere (with an agentlake shim), with texts, recipes and docs to match.

- Changed. The free tier is defined by size only: 5 GB of storage.

- Changed. The CLI talks to https://api.tablemere.eu by default; TABLEMERE_URL is only for self-hosted or local stacks.

- Changed. Table row counts are exact (read from manifests), and production answers without API docs, open CORS or input echoes.

- Changed. The connection recipe states DuckDB 1.5.5 as the minimum version; the maintenance gap was specific to 1.5.0.

- Fixed. The browser SQL panel works with CORS enforced (credentials and the host-override header are allowed).

- Fixed. Signup from the website works (CORS passes through the gateway) and site URLs are clean.

- Security. Storage is capped at 5 GB per organisation (409 quota_exceeded), enforced by the store as well as the API.

- Security. The authentication limiter counts only failures, so correct logins are never throttled.

- Security. The website sends a Content-Security-Policy and hardening headers.

---
HTML version: https://lakehousebox.com/docs/changelog/ · every page: https://lakehousebox.com/llms.txt
