Skip to content

Collaboration Guide

jinflow uses git for collaboration. Every tenant AFS is a git repository from birth. Teams share work through GitHub (or any git remote).

Create a tenant from a domain pack, connect to GitHub, push:

Terminal window
# Create from pack
jinflow init --pack hrcentral --tenant rmc
# Connect to GitHub (create the repo on GitHub first)
jinflow afs remote https://github.com/org/afs-hrcentral-vai.git
# Push initial state
jinflow afs push -m "initial setup"

Clone the AFS from GitHub — no pack needed:

Terminal window
# Clone from GitHub
jinflow init --clone https://github.com/org/afs-hrcentral-vai.git
# Sync data and build
jinflow make --tenant hrcentral.vai --sync --clean

This creates the full tenant layout (raw/, build/, store/) around the cloned AFS. The pack is not needed — the AFS IS the analytical framework.

Terminal window
# Start of day: pull team changes
jinflow afs pull
# Work: edit signals, theses, notes
# Build and explore
jinflow make
jinflow desk
# End of day: push your changes
jinflow afs push -m "added io_coefficient signal"

A principal is a person (or role, or group) recognised in a tenant. Each principal carries a stable slug (principal_id), a display name, and — for human users — an identity like owner, analyst, or viewer that determines what they can do.

Terminal window
jinflow invite alice@example.com numetrix.rmc \
--identity analyst --principal-id alice

This:

  1. Writes afs/principals/user_alice.yaml locally
  2. Fires a Clerk invitation email to alice@example.com
  3. Stamps the returned clerk_invitation_id onto the YAML

Alice receives the email, clicks the magic link, signs up (or signs in if she already has a Clerk account), and lands on the tenant page.

After acceptance — materialise the binding

Section titled “After acceptance — materialise the binding”

Once Alice has accepted, run:

Terminal window
jinflow sync-principals numetrix.rmc

This walks Clerk’s accepted invitations for the tenant, matches them to AFS principal YAMLs by clerk_invitation_id, and stamps clerk_user_id + accepted_at onto each one. Idempotent — safe to re-run; --dry-run previews changes without writing.

Terminal window
jinflow ship numetrix.rmc --do-it

Rebuilds the KLS with Alice’s pinned binding, syncs to R2, refreshes Fly. Her badge now shows green in JinDesk with her identity.

Terminal window
jinflow revoke alice numetrix.rmc

This:

  1. Calls Clerk to surgically remove publicMetadata.jinflow.tenants["numetrix.rmc"] from Alice’s record — other tenant assignments she holds are preserved
  2. Marks her YAML status: archived and stamps left_at (the file stays — analytical authorship references continue to resolve)
  3. Refuses self-revocation (you can’t lock yourself out)

After jinflow ship, Alice’s access to the tenant disappears. She keeps her Clerk account; she just no longer belongs to this tenant.

If you revoke someone and later want them back, re-run jinflow invite with the same email and slug. The archived YAML gets resurrected with fresh active state; a new Clerk invitation is sent. Lifecycle history (previous clerk_user_id, accepted_at, left_at) survives in git.

Terminal window
jinflow afs remote # show current remote
jinflow afs remote <url> # set remote (add or update)
jinflow afs status # show branch, tags, changes
jinflow afs log # build logbook (git log)
jinflow afs log -n 10 # last 10 entries
jinflow afs pull # pull from remote (fast-forward only)
jinflow afs push # commit all changes + push
jinflow afs push -m "message" # with custom commit message

The AFS (afs/) is the git repo. It contains:

ContentVersionedNotes
Signals, theses, verdictsYesThe analytical instruments
SMEbits, BitBundlesYesExpert knowledge
NotebooksYesInvestigation notes
Entities, lineage, contractsYesSchema definitions
dbt macros, seeds, testsYesData transformation logic
Models (bronze, silver, gold)YesSQL source models
jinflow.ymlYesPack config
tenant/ (config, logo, seeds)YesTenant-specific content

What is NOT in git (lives alongside the AFS):

ContentLocationNotes
Raw CSVsraw/Immutable source data from DLZ
Build artifactsbuild/Compiled SQL, enriched CSVs (regenerable)
KLS + OPSstore/Built databases (regenerable via make)

jinflow make auto-commits a structured one-liner after each build:

jinflow make: ok | clean | 34/0/1 | v0.7.9 | darwin | mig | hrcentral.vai | 12.3s

jinflow afs update --do-it auto-commits after syncing pack content.

These auto-commits create a build logbook visible via jinflow afs log.

Domain packs are independent git repos (e.g., jinflow-pack-hrcentral). They’re cloned manually:

Terminal window
git clone https://github.com/jinflow-io/jinflow-pack-hrcentral.git

Configure the pack root so jinflow can find them:

Terminal window
jinflow us --pack-root ~/jinflow-packs

Pack changes flow into tenant AFS via jinflow afs update --do-it.

jinflow afs update uses three-way merge (SHA-256 manifest):

  • Only pack changed → safe update (auto-applied)
  • Only tenant changed → preserved (your customization wins)
  • Both changed → conflict (NOT overwritten, flagged for manual resolution)
  • Force mode--force makes pack win on conflicts

jinflow afs pull uses fast-forward only. If local and remote diverge, it tells you to resolve manually with git pull --rebase.

jazzisnow jinflow is a jazzisnow product
v0.64.7 · built 2026-09-20 19:48 UTC