EXPERIMENT2025Shelved

Zanvex

An experiment in relationship-based permissions for Convex.

convexauthzopen-sourceexperiment
ROLE
Solo · agent-built
MODEL
ReBAC · Zanzibar
TIMELINE
6 days · 67 commits
STATE
Not production-ready

Zanvex was my attempt at relationship-based access control inside Convex, based on Google's Zanzibar model. Permissions are stored as tuples, and a small rule language describes how they connect. A visual permission tester shows the path behind an allowed or denied request.

The Zanvex permission tester: a check for Alice on a booking comes back ALLOWED, and the path from Alice through Acme Studio and Studio B to the Afternoon Session is drawn as a four-node graph
The permission tester: one check, its matched rule and the path it walked

How I got there

In December 2025 I was working on sign-in and permissions for the booking component. I wanted a ready-made component for permissions, one call that answers whether a user may do something with an object. I built Zanvex over six days with Claude Code, with recording studios as the demo: two studio companies, admins, members, external customers and their bookings.

The idea that pulled me in was Zanzibar's New Enemy Problem. Google solves it with consistency tokens. In Convex, permission checks could run as ordinary reactive queries: when a relationship is deleted, every check that read it is invalidated and runs again. Permissions would also live in the same transactions as the application data, instead of behind an external API.

"Curious how others think about abstracting AuthZ into something like: can(user, "someAction", "someSubject")"My post in the Convex Discord, December 2025

Where it stalled

In my own test harness, walking the graph was too slow. Ian from the Convex team replied to my post with a second concern. Every permission check is a call into the component, and his rule of thumb was to keep those in the low tens per query or mutation.

"My only concern right now is if there will be too many calls to the component in a single query/mutation."Ian from the Convex team, replying in the Discord

A check that runs for every object fetched in a join would go far beyond that. Two weeks later I planned a successor with batched checks on top of OpenFGA's model, and it never got past the planning questions. In January 2026 convex-authz appeared. I shelved Zanvex.

What stayed

The booking component ended up on the other side of the line. It handles booking and nothing else; the host app decides who may do what. The code and demo of Zanvex are public, but I would not use it for production authorization.

Mr. Finch© 2026 Daniel FinkeStuttgart, DE