Skip to content

Cahut 1.0.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 11:20
· 32 commits to main since this release
ca5e86f

Cahut 1.0.0 gives each Window a database of its own: a poll, a contact form, a petition, a sign-up sheet or the tracker of a team keeps what its readers write, on your server, in SQLite. Its pages read what its declaration makes readable and call the queries it declares; the people of its Room and their AIs read and change all of it, after a copy that one call goes back to. The SQL of Windows runs in workers of its own, which Landlock confines on Linux. See ADR 56 and The data of Windows.

Upgrading from 0.11.0

1.0.0 is a major release: under the default CAHUT_UPDATES=patch, the daily timer does not install it. Install it from the console, under This server · Updates, or:

sudo /usr/local/bin/cahut update
  • One migration of the database of each Cahut, 0036: the size of the data of each Window, and the limit data_per_window. None for the database of the server. As every update does, it takes a snapshot of the databases first, and rolls back if the health check fails.
  • The workers. The service starts itself again, cahut window-data-worker, for each database of a Window in use, 32 at most, and stops it after a minute without a call. They run under the unit of the service, and its memory limit counts them. On Linux, Landlock closes to each every file outside the folder of its database, and TCP from Linux 6.7. cahut doctor gains a line, Window data, that says whether they are confined: on a kernel without Landlock, they keep their limits but read what the cahut user reads, and the line says how to enable it.
  • Three new tools for AIs: query_window_data, change_window_data and rollback_window_data. publish_window and update_window take declaration.data. The list of tools for an administrator weighs about 37 KB, under the new bound of 40 KB (ADR 57).
  • New for the administrators of the server: the limit data_per_window, on the page Kind and limits or with cahut settings set --data-per-window SIZE. Without it, each database holds 100 MiB at most. The limit disk now counts the data of each Window with its copies.
  • The skill for Claude goes from 0.9.0 to 0.10.0: it makes polls, forms and petitions that keep what readers write, and tells their readers what they keep.
  • Backups: the data folder holds the data of each Window, in cahuts/<id>/windows/<id>/data/, with its three latest copies. Cahut has no backups of its own yet: back up the whole folder.

Added

  • The data of a Window. declaration.data holds the migrations that make its database, run once each and only adding; what is readable by readers, table by table and column by column, every other column reading as NULL; the queries that its pages call by name, for anyone, people signed in or the members of its Room; and when writing closes. publish_window and update_window check it all before they publish, and say what each query does: it reads, adds, changes or deletes rows (#234).
  • The calls of pages. POST .data/sql and POST .data/queries/<name> under the root of a Window, in JSON, without credentials, at the address of a public Window and in the frames of the others. :reader is a value of the person or of the pass of the reader, the same in one Window and another in every other, or NULL for a reader of a public Window. Calls are limited by address and by Window (#235).
  • The data for AIs and people. query_window_data reads all of it; change_window_data changes it after a copy, and knocks first when it removes or renames a table, a column, an index, a view or a trigger; rollback_window_data goes back to a copy, and undoes itself. The writes of readers copy the database once a day, and three copies are kept. What readers wrote reaches AIs marked as data, never instructions (#236).
  • The console shows the data of each Window (#237): its tables and their rows as text, an export as CSV, what readers read, what each query does and for whom, and its copies, each with a button to go back to it.
  • The workers: the package windata runs the SQL of each database in a process of its own, with an authorizer for each kind of statement, the functions of SQLite allowed by name, a hard limit on its heap, sqlite3_limit and a time for each call (#233).
  • Limits: data_per_window, and the data in the limit of the disk (#238).

Changed

  • Knock first: making a Window public says which queries let anyone write in its data; update_window knocks first when a public Window gets a query that changes or deletes rows for anyone.
  • The consent screen says that a connected AI reads the data of the Windows of the Rooms it reaches, which goes to the company that runs it.
  • The MCP instructions and the skill tell AIs how a page keeps what readers write, what it says beside its form, and to show what readers wrote as text.
  • ADR 57 raises the bound of the list of MCP tools from 32 KB to 40 KB.

Security

  • The SQL of Windows never runs in the process that serves the Cahuts: a bug of SQLite that a stranger reaches with SQL stays in one worker, with the database of one Window, away from the keys and the databases of the Cahuts.
  • A reader reads only what the declaration makes readable: a column forgotten stays private.

Full changes: v0.11.0...v1.0.0