Changelog

20 Sept 2026
0.2.0-beta.7

Cassini sets itself up, and names anything it cannot do

Installing used to mean running occ commands by hand. Cassini now offers to make those changes itself: the cassini service account and its group, the Team folder, its group mappings, advanced permissions, and the permission manager delegation. It lists every change before it makes any of them and performs them as you, with Nextcloud asking you to confirm your own password in its own dialog. Cassini never sees it, stores it or sends it on. The occ recipe is still there if you would rather run it yourself, generated from the same plan, so the two cannot disagree.

Anything Cassini cannot do for itself is named, together with the command that fixes it: the service account, each Nextcloud app, the Team folder, its group mappings, its permissions setting and its permissions manager. Installing the two Nextcloud apps is the one step that stays yours, and it says so.

The Setup tab and its wizard are gone. Cassini no longer opens on a question that blocks every recording until somebody answers it. Where storage is genuinely broken you get one sentence saying recordings cannot be saved right now, with Try again and Show details; the steps, paths and commands live inside that disclosure. Anyone who is not an administrator gets the same sentence and no buttons.

20 Sept 2026
0.2.0-beta.7

Choose who can see recordings

Recordings can be visible to anyone with a Nextcloud account, or only to the people who were in the call. Until now there was one model, meeting participants, and it needs two Nextcloud apps that an external app cannot install for itself, so an instance without them recorded meetings happily and then could not publish any of them. The choice lives in Operator, Settings, “Who can see recordings”, and the meeting list carries a chip saying which is in force.

Switching says what it would do before it does it: how many recordings would move, between which folders, whether the destination already holds any, and whether an earlier switch left a copy behind. Working that out changes nothing, and nothing happens until you confirm. The switch copies the archive, checks that every recording arrived, records the new audience, and only then empties the old folder, so whichever audience is in force that folder holds a complete archive.

A meeting’s audience is captured while it runs, when the recording starts and again when it stops, and then frozen. A room that gains or loses members afterwards does not change who can open a recording made before. That also means recordings a switch left visible to everyone can now be narrowed to the people who were in the call, which Cassini previously had no way of working out.

20 Sept 2026
0.2.0-beta.7

Tag a meeting, or a stretch of one

A tag such as hiring can go on a whole meeting or on a stretch of it, and the marks live inside the recording’s .opus file. A meeting keeps its tags when it is downloaded or shared, and a reader that does not understand them still opens the recording normally.

Tag a meeting from its row in the list, or select several and tag them together. Inside a meeting, select the words and choose Tag selection, then set exactly where it begins and ends with the handles in the text or the arrow keys. Tagged sections are underlined in their tag’s colour and arrows step from one to the next. A tag has a colour and, if you want, an icon; Manage tags is where they are renamed, merged and deleted.

The meeting list is organised by room now, with a rooms nav down the left, month headings, and each row showing its room, its date, its speaker count and how long it ran. The tag filter sits beside the rooms, and the search box finds meetings by the names of their tags as well as by what was said in them.

Anyone who can read a meeting can tag it, and every mark is attributed to the Nextcloud account that made it. Two people tagging the same meeting at once no longer overwrite each other. Re-running a meeting keeps the tags added since it was published, and marks made against audio the rerun changed are kept and flagged rather than dropped. From outside the app, cassini meetings tags, annotations and annotate do the same work, and --tag narrows a list or a search.

20 Sept 2026
0.2.0-beta.7

Ask your meetings a question

Pick meetings in the browse list, open Prepare context, and press Generate. Cassini sends those transcripts to the AI endpoint you chose and writes the answer into your own Nextcloud Files, in a Cassini Insights folder in your home. You own the file outright, so Nextcloud’s own sharing decides who else may read it.

One of the templates is “Ask your own question”: you type the question, and the answer comes back in at most three sentences, with the evidence of who said what, and what these meetings do not answer. A second template, “Commitments and owners”, gives a section per person who spoke and what they took on.

Every meeting is fetched as you, at the moment the run happens, so an answer can only ever be built out of meetings you could already open yourself. A run says what it is doing rather than spinning: queued, then running, then a result or a failure named in words you can act on. A local model reading five meetings takes minutes, and the card tells you so.

Endpoints and models are chosen in the app’s own Settings, beside Browse and Operator. Moving between a hosted provider and a model server of your own is one settings change with no redeploy, and registering your first endpoint turns meeting summaries on.

20 Sept 2026
0.2.0-beta.7

Search across your meetings, and the names transcription gets wrong

Cassini indexes each transcript as it is published and answers with the moments that match: the meeting, the speaker, and where in the recording they said it. You only ever see meetings you can already open. There is a search box above the transcript as well, for finding words inside the meeting you are reading.

Search knows the names transcription gets wrong. Looking for “cassini” also finds the recordings where it was written down as “casino”, and each result says whether it matched your words or a known mis-hearing of them. Administrators keep that list in the app’s settings, one name per line with its spellings after it, and Cassini ships a starting list. The participant and project vocabulary beside it now guides transcription itself, so the recogniser can prefer a name it used to invent a spelling for.

Every answer says how much of your archive it covered: how many of the meetings you can read were actually searched. A meeting that could not be indexed is reported as outside that coverage rather than passing as one with no matches. Recordings published before the index existed can be added to it with cassini-operator backfill-search.

20 Sept 2026
0.2.0-beta.7

Hand several meetings to an agent as one document

cassini meetings context takes several meeting ids and prints one document holding all of them, in the order you named them, so a question can be asked of a set of meetings rather than one at a time. --timestamps cites where each passage starts, and --local reads portable .opus files off disk, needing none of the connection settings.

The same document is available inside the app. Pick meetings in the browse list, across rooms, and Prepare hands you all of them to copy or download. It is the same document the command prints for the same meetings in the same order, byte for byte, because the app asks the same producer for it rather than assembling its own.

Before it hands anything over, Prepare says what the bundle will not contain: how many of the picked meetings have no summary, how many predate the single file format, and whether the word count it shows is a total or a floor. The format has a published schema, so anything reading these documents can rely on their shape.

20 Sept 2026
0.2.0-beta.7

Embed a recording in any page

<cassini-meeting src="…"> puts one recording in any page from a single script tag, served from gocassini.com/embed/v1/viewer.js.

A recording published on its own, in a static export or embedded somewhere, now shows the tags and marked stretches that are inside it, read from the file rather than from a server. The public viewer is read only by construction: the marks are drawn, and no control that would add or remove one appears. It used to hide tags altogether when there was no server behind it to write them.

An embed carries a “Recorded with Cassini” footer by default, linking to gocassini.com. The hide-badge attribute removes it.

20 Sept 2026
0.2.0-beta.7

Transcription runs on the CPU when there is no GPU

Each build works out its own device: CUDA when the image carries the CUDA runtime and an NVIDIA device is visible, and the CPU otherwise. An installation on a plain image transcribes again.

This reverses the behaviour of 28 August, where transcription on a plain image waited in a blocked state until the -cuda image was installed. If you have blocked jobs from that period, they still rerun.

20 Sept 2026
0.2.0-beta.7

Cassini runs on ARM64

The portable ExApp image is published for linux/arm64 as well as linux/amd64, with the ARM64 speech recognition runtime and models bundled, so Cassini installs and transcribes on an ARM server without a separate build.

29 Aug 2026
0.2.0-beta.6

Sharper transcripts: interjections, long turns, and who said what

A quick “yes” or “exactly” in the middle of someone else’s sentence used to lose its position, its speaker, or both. Those land where they happened now, attributed to the person who said them, and near silent noise is no longer promoted into words.

Long turns are the other half. Speech running twenty to twenty five seconds without a break could come back with words missing. It is decoded in overlapping windows now, so the words survive, and where two windows disagree the transcript still has one clear owner for each word.

A meeting’s length comes from the audio you can actually play, rather than from what the container claims.

28 Aug 2026
0.2.0-beta.4

Transcription can run on an NVIDIA GPU

Install the matching -cuda image on a deploy daemon with a GPU and transcription runs there instead of on the CPU. Readiness failures are now reported explicitly rather than discovered later, and every generated file records which device transcribed it.

If you already run Cassini, this one asks something of you. Capture and preservation of Talk audio carry on as before, but transcription enters a blocked state instead of quietly running on the CPU. Install the -cuda image, then choose Rerun for each blocked job in Cassini Admin. Nothing is lost while you wait.

20 Aug 2026
0.2.0-beta.2

Meetings remember which conversation they came from

Until now a recording’s room name was flattened into its title and the conversation’s identity was thrown away. Meetings now carry the room itself, and the meeting list groups and filters by it.

The room published on a meeting is a one way derivation of the conversation’s identity, never the conversation’s own token, so a public conversation’s token cannot be recovered from a published file. CASSINI_ROOM_ID_PEPPER controls that derivation.

Recordings published before this update can be given their room back: run scripts/backfill-catalog-rooms.sh once, on the host where the app container runs. Until you do, one conversation can appear as two rooms, one identified from its token for recordings made since the update and one from its name for everything older. Running it again merges them.

14 Aug 2026
0.2.0-beta.1

Read your meetings from outside Nextcloud

cassini meetings runs on a laptop or in a container. It signs in with an app password, lists what that account may see, and either fetches a meeting’s .opus file or prints its transcript and summary in a form a script or an agent can read.

The account’s permissions are the only permissions. There is no separate key and no second access path, so nothing is exposed that the person could not already open in Nextcloud.

14 Aug 2026
0.2.0-beta.1

Recordings live in Nextcloud Files, locked to the people in the call

A recording is readable by everyone who had access to the conversation, including people who were invited and never joined. Making a conversation public afterwards does not widen recordings made while it was private. Recordings belong to a cassini account rather than to whichever administrator installed the app, so they no longer depend on one person’s account surviving.

Enabling the app provisions all of it: the account, the Team folder, and the permissions. No occ commands. If a step fails, the app reports an unfinished install and says what went wrong, instead of looking healthy while showing nobody their recordings. Registering Cassini as Talk’s recording backend is easier too: the signalling secret is generated on first start if you do not supply one, and an administrator endpoint hands you the exact recording_servers value to paste into Talk.

Access control is no longer optional. It used to be a deploy option that defaulted to off, so a stock install shipped without it. If you set CASSINI_NC_ACCESS_CONTROL, drop it; nothing replaces it. Installations that published recordings before this update can migrate them in one shot, and enabling or updating the app no longer re-uploads the whole archive.

24 Jul 2026
0.2.0-alpha.4

One Cassini in Nextcloud, with the recording controls inside it

Cassini used to add two entries to the Nextcloud menu, one to browse recordings and one to control them. Now there is one. Everyone who is logged in gets the meeting browser, and administrators get a Browse and Operator switch inside it. Recording controls stay administrator only; that boundary has not moved.

You can link straight to a recording, the back button returns you to the list, and the panel tells you in one word whether it is connected.

The other half of this release is calls that finished empty. A participant whose handshake completed but whose audio never arrived could leave a short call with nothing to transcribe, and turning a camera on mid call could silently lose the rest of that person’s video. Both are fixed.

7 Jul 2026
0.2.0-alpha.1

Alpha release

First public release. Cassini records and transcribes Nextcloud Talk meetings on your own server. No audio leaves your infrastructure.

  • Start a recording of any Talk room (group or 1:1) directly from inside Nextcloud
  • Transcription runs locally via sherpa-onnx with NVIDIA Parakeet models on CPU or CUDA
  • Every transcript line is attributed to the correct speaker automatically
  • Recordings are stored as self-contained .opus files (audio, transcript, and metadata in one place)
  • Transcripts and audio are readable and replayable inside Nextcloud via the embedded viewer
  • Recordings are resumable if interrupted

Optionally connect an OpenRouter key for post-meeting summaries. Only the transcript is sent; disabled by default.