# Auth & Licensing Quick Reference
Version: 1.1.1
Last Updated: January 23, 2026
Plan Snapshot
| Plan | Key Features | Notes |
|---|---|---|
| Ren’Py Free | All features (AI, pilot, PFI, patch, cloud solo) | 30-day token, free forever, renewable |
| Free (Registered) | Full analysis, doctor lite, compare | No payment; login required |
| Pro | AI, pilot, PFI, patch, cloud solo | 30-day auto-renew |
| Team | Pro + team cloud, identity, audit, policy | 30-day auto-renew |
| Enterprise | Team + SSO, priority support, VPC | Contract |
Token Lifetimes
- Access: 15 minutes (memory only)
- Refresh: 30–90 days (disk)
- License (entitlements): 30–90 days (disk), offline allowed up to
max_offline_days(default 30)
Common Commands (CLI)
branchpy license login # Email/password login
branchpy license status --json # Show plan/features
branchpy license claim-renpy # Idempotent Ren’Py claim
branchpy license logout # Revoke refresh token
Python Gating Helpers
from branchpy.license import has_feature, require_feature, get_plan
if has_feature("pilot_mode"):
run_pilot()
@require_feature("ai_review", "AI Review")
def review():
...
Env Vars (critical)
JWT_PRIVATE_KEY,JWT_PUBLIC_KEY(access/refresh)LICENSE_PUBLIC_KEY(entitlements verification)MAX_OFFLINE_DAYS(default 30)RATE_LIMIT_AUTH_LOGIN,RATE_LIMIT_DEVICE_START,RATE_LIMIT_DEVICE_POLLCORE_DB_URL/CORE_DB_URL_PROXY(Postgres)
Support Patterns
- “License required†→ login or claim-renpy, then re-run command
- Device approval stuck → ensure
/device/pollis called; rebuild extension if missing - Duplicate email errors → verify Migration 024; lower-case emails