Deals, budgets, boards and people for teams at Maastricht University.
The institute’s system of record. Bizzy keeps BISS’s funding pipeline and forecast, finances, project boards, weekly planning, people and activities in one place, in place of its Monday.com boards and Excel forecast. Any team at the university can open a workspace of its own.
An assistant on Mistral, an EU provider, answers from the team’s own figures and suggests changes that a person approves. Every change, by a person, a suggestion or an import, is logged and can be undone. I designed and built it from the first commit on 3 November 2026; it runs on the institute’s Coolify.
Answers on any data you may see with the app’s own queries, explains how things work, and makes changes after you confirm, with Undo.
Review and historyevery change
One queue for the assistant’s and the data steward’s suggestions, and a change log in which any batch can be undone.
MCP and APIpersonal tokens
An MCP endpoint for Claude and other clients, an API for scripts, and signed webhooks.
collabHocuspocus
Live updates and presence over a WebSocket; two people can type in the same text.
Shared sign-inauth.caselawexplorer.tech
The same Keycloak as Case Law Explorer, in a realm of its own.
The story
01Why it exists
BISS kept its deals on Monday.com boards and its forecast in an Excel workbook. The boards were slow and the totals had to be rebuilt by hand. Bizzy puts deals, money, projects and people on one set of records, so a deal is the same deal in the pipeline, the forecast, a project board and a person’s planning.
02Figures you can open
The financial overview sets secured money against the year’s costs, the open pipeline and the forecast year by year. Every figure opens the deals behind it, so nobody has to trust a total they can’t check.
03An assistant that asks first
Bizzy, the assistant, runs on Mistral and answers with the app’s own queries, limited to the data the person asking may see. When it wants to change something it writes a suggestion. A person approves or dismisses it in the review queue, next to the data steward’s checks for duplicates, double counting and stale deals. Every change, by anyone, goes into a history where it can be undone.
04For other teams too
It is multi-workspace: BISS is one workspace, and any team at Maastricht University can start its own, with its own members, roles and settings. The data stays on servers BISS runs in the EU.
Under the hood
One write path for people and the assistant
Bizzy is one Nuxt application, one Postgres database, a small service for editing together, and Mistral for the assistant. Here is how an edit travels, whoever makes it, and why every one of them can be undone.
01 / 06
Every edit takes the same road
A cell edited by a person, a suggestion someone approved, a row from an import: all of it goes through one function, changes.ts. The function that writes the value writes a change_log row in the same transaction, one per changed field, grouped in a batch.
History is that log, and Undo writes the old values back as a new batch that points at the one it reverts. Nothing is ever edited around the log.
change_log
entity, field deal · year:2027
old, new the values
actor person, ai, import
batch_id undone together
reverts_id which batch it undoes
02 / 06
The assistant sees what you see
Bizzy is a tool-using agent on Mistral. It reads data only through the app’s own loaders, run as the person asking, so the numbers it states are the numbers their pages show. It explains how things work from help topics in English and Dutch.
It acts only after you confirm a card in the chat, through the same write path as everyone else. Deletions and bulk changes become suggestions instead.
03 / 06
Nothing changes until a person approves
The data steward runs cheap rule checks, such as deals without a PI, yearly values that disagree with the total, stale pipeline, typos and possible duplicates, then a Mistral pass over the open deals. Each finding is a suggestion with a fingerprint, so running the checks again never repeats one, and a dismissed one stays dismissed.
Review is one queue for the steward and the assistant. Approving applies the change as a batch signed by the approver, so it can be undone like any other.
04 / 06
Workspaces that share nothing
BISS is one workspace; any team at the university can start another. Isolation is enforced three times: each request carries exactly one workspace, a guard on the query logger flags any statement on a workspace table without the workspace condition, and the database’s own foreign keys tie every child row to its parent’s workspace.
1 request context one workspace per request
2 SQL guard unscoped query → error
3 constraints composite foreign keys
05 / 06
Live, without a reload
Every committed batch makes Postgres notify the app. The live hub reads the batch back from the log, works out what each open tab may see and tells it, and the page refetches only what changed, holding back while someone is typing there.
Two people typing in the same text is a separate service on Hocuspocus. It reads and writes records only through the app’s signed internal routes, so permissions, the log and Undo still apply.
06 / 06
Open to other tools
Personal API tokens let scripts and MCP clients such as Claude use the same routes as the pages, under the same roles. A worker reads the change log and posts signed webhooks to Slack, Teams or n8n.
Sign-in is the shared BISS Keycloak that Case Law Explorer also uses. The whole app ships as one Docker image, plus the collab service, on the institute’s Coolify.
01 · Every edit takes the same road
Ask Wick
Answers from this site, David’s GitHub and his press
Hi, I’m Wick. I run on the same server as David’s projects, so I’ve watched most of them get built. Ask me anything about him.
AI answers can be wrong; the linked pages are the source. Questions aren’t stored.