Analysis · Geskus reference

Analysis: Geskus reference repos analysis

Two public Geskus repos solve a related but smaller problem space. Neither implements subjects, duplicates, exports, or layouts — so we're learning shapes (RBAC, file trees, task-driven uploads), not borrowing features.

License posture

Both repos lack a LICENSE file. Treat as proprietary / all-rights-reserved. We can read for inspiration and reimplement patterns idiomatically in our stack, but no copy-paste of source.

Repos surveyed

Stack

Frontend
SvelteKit 2.47 + Svelte 5, Tailwind 4 + DaisyUI, Vite, @sveltejs/adapter-node for Cloud Run.
Auth
@auth/sveltekit + Auth0. Backend validates JWTs against Auth0 JWKS; supports an API-key + impersonate-user fallback for automation.
Backend
FastAPI (Python) on Uvicorn, deployed to Google Cloud Run.
Data
Firestore for metadata (users, roles, clients, events, file metadata, tasks). Google Cloud Storage for file binaries.
Email
ZeptoMail, gated by a RECEIVE_NOTIFICATIONS permission opt-in.

Our stack (Next.js + Supabase + Pics) doesn't align directly, but the conceptual model translates cleanly.

Domain model

RBAC

Roles live in a Firestore sub-collection: studios/{STUDIO_ID}/users/{user_id}/roles. Each role doc carries a name (one of the predefined role types) and the materialized permission list derived from PREDEFINED_ROLES. Roles can be globally scoped (client_id == null, studio-level) or per-client.

RolePosture
STUDIO_ADMINImplicit superuser — special-cased in code.
STUDIO_USERBroad CRUD across events, files, tasks; can invite + modify roles.
CLIENT_ADMINManages a single client, can invite users and modify client-scoped roles.
CLIENT_USERView access + upload data via tasks. The "everyday school user".
DATA_ACCESSNarrow grant: upload data files, view files and tasks. No event management.
EVENT_ACCESSView events only.
RECEIVE_NOTIFICATIONSOpt-in for emails; not a privilege grant.

Permission checks iterate the user's roles, match the requested client_id scope, and look for the named permission. Granular permissions exist for VIEW / CREATE / UPDATE / DELETE of events, files, tasks, plus INVITE_USERS and MODIFY_ROLES.

File handling pattern

Task pattern (file-request workflow)

Worth highlighting because it's the cleanest piece of these repos for our Phase 4 (customer portal + files):

  1. Studio admin creates a task with input_type='file', allowed types (csv/xlsx/xls/txt/zip), assignee, and due date.
  2. Notifications fire to anyone with VIEW_TASKS + RECEIVE_NOTIFICATIONS.
  3. Client user sees the task in the portal, uploads the file via a POST endpoint that pushes to GCS and updates the task document.
  4. Status transitions from pending → in_progress → completed.

What to borrow

What to avoid (or not assume exists)

Net

Geskus gives us a validated RBAC vocabulary and a clean task-and-file-request pattern. Everything that makes this product different from Geskus — subjects, dedupe, exports with format authoring, print layouts with template authoring, render pipeline — has to come from us.