|
| 1 | +# Engraphis — Launch Plan (v1.0 release + first paid tier) |
| 2 | + |
| 3 | +_Date: 2026-07-03. Companion to `RELEASE_READINESS.md` (state audit) and |
| 4 | +`docs/GO_TO_MARKET.md` (pricing research). This document is the execution plan: what ships, |
| 5 | +in what order, and how the paid tier works technically and commercially._ |
| 6 | + |
| 7 | +## 1. Where we are |
| 8 | + |
| 9 | +The free core is launch-ready (127 tests, offline gate green, 17 MCP tools, hardened write |
| 10 | +path). What was missing for revenue — and what this pass adds — is the commercial layer: |
| 11 | +there was no license mechanism, no paid feature, and no upgrade path in the product. See §3. |
| 12 | + |
| 13 | +## 2. Monetization architecture (decided 2026-07-03) |
| 14 | + |
| 15 | +**Model: open-core with offline signed license keys.** The core stays Apache-2.0 and fully |
| 16 | +functional. Pro features ship in this repo but activate only with a valid key. Keys are |
| 17 | +Ed25519-signed JSON payloads verified **offline** — no phone-home, no license server, which |
| 18 | +keeps the local-first promise intact (a memory engine that phones home would undercut the |
| 19 | +entire pitch). |
| 20 | + |
| 21 | +- Key format: `ENGR1.<base64url payload>.<base64url signature>`; payload carries plan, |
| 22 | + features, seats, expiry. Verified against the vendor public key pinned in |
| 23 | + `engraphis/licensing.py`. Verification is pure stdlib (RFC 8032 Ed25519), so the |
| 24 | + numpy-only core guarantee holds. |
| 25 | +- Issue keys with `python -m scripts.license_admin issue --email … --plan team`. The signing |
| 26 | + key lives in `.secrets/` (gitignored). **Rotate the committed dev public key before selling |
| 27 | + a single license** (`license_admin keygen`), and keep the production private key in a |
| 28 | + password manager, never on a dev box. |
| 29 | +- Honesty note (Apache-2.0): a determined user can fork out the gate. That is the accepted |
| 30 | + trade of the Sidekiq-style model — you sell convenience, updates, and support to the honest |
| 31 | + majority. Do not escalate to obfuscation; it poisons trust and never works anyway. |
| 32 | + |
| 33 | +### Tiers |
| 34 | + |
| 35 | +| Tier | Price (target) | What's in it | |
| 36 | +|------|----------------|--------------| |
| 37 | +| Free | $0 forever | Whole engine: MCP server, recall/why/timeline, governance, code graph, single-user Inspector | |
| 38 | +| Pro | $20/mo or $200/yr | Analytics dashboard, compliance export (full bi-temporal JSON dump), priority support | |
| 39 | +| Team | $35/user/mo | Pro + multi-user Inspector: logins, roles (admin/member/viewer), seat-limited keys | |
| 40 | + |
| 41 | +$20 anchors against Letta Pro ($20) and mem0 Starter ($19); see GO_TO_MARKET.md §10. Team |
| 42 | +pricing is per-seat because the seat count is in the signed key. |
| 43 | + |
| 44 | +### Payments & fulfillment (not yet built — next step after this pass) |
| 45 | + |
| 46 | +Use a merchant-of-record (Polar.sh or Lemon Squeezy — handles VAT/sales tax, ~5% fee) rather |
| 47 | +than raw Stripe at this stage. Flow: checkout → webhook → `license_admin issue` → key |
| 48 | +emailed. Automate with a ~50-line serverless function when volume justifies it; issue keys |
| 49 | +manually for the first customers (it's also a customer-discovery channel). Add the purchase |
| 50 | +URL in the Inspector's license dialog once live. |
| 51 | + |
| 52 | +## 3. What ships in this pass (implemented) |
| 53 | + |
| 54 | +1. **`engraphis/licensing.py`** — key parsing/verification, feature registry, cached |
| 55 | + `current_license()`; reads `ENGRAPHIS_LICENSE_KEY` or `~/.engraphis/license.key`. |
| 56 | +2. **`scripts/license_admin.py`** — vendor CLI: `keygen`, `issue`, `verify`. |
| 57 | +3. **Inspector license UX** — plan badge in the header, license dialog (activate key, see |
| 58 | + features), tasteful locked-tab teasers. Free tier is never nagged mid-workflow; upsell |
| 59 | + surfaces are opt-in clicks. |
| 60 | +4. **Pro: Analytics tab** — memory growth, retention distribution, decay forecast (which |
| 61 | + memories fall below the archive threshold in 7/30 days), resolver action mix, top |
| 62 | + entities. Server-side in `engraphis/analytics.py` (numpy/stdlib only), inline-SVG charts |
| 63 | + client-side (no chart library, consistent with the zero-dependency house style). |
| 64 | +5. **Pro: compliance export** — one-click full workspace dump (memories incl. superseded |
| 65 | + history, audit trail, sessions) as attachment-download JSON. |
| 66 | +6. **Team: multi-user Inspector** — `ENGRAPHIS_TEAM_MODE=1` + a `team` key enables login |
| 67 | + (PBKDF2, HttpOnly session cookie), first-run admin setup, roles enforced server-side |
| 68 | + (viewer=read, member=+governance, admin=+consolidation/users/export), Team tab for user |
| 69 | + management. Without team mode nothing changes for existing single-user setups. |
| 70 | +7. **Tests** for all of the above, following the repo's `importorskip` CI-gate convention. |
| 71 | + |
| 72 | +## 4. UI/UX improvements — beyond this pass |
| 73 | + |
| 74 | +Ordered by effort-to-impact; the Inspector is already accessible (ARIA tabs, keyboard nav, |
| 75 | +dark/light) so this is polish, not rescue: |
| 76 | + |
| 77 | +1. **First-run experience**: when no workspaces exist, show a guided empty state with the |
| 78 | + exact MCP config snippet to paste into Claude Code/Cursor (copy button), instead of a |
| 79 | + toast. Biggest funnel fix available — the current first screen is blank. |
| 80 | +2. **Onboarding command**: `engraphis init` that writes `.env`, picks a DB path, and prints |
| 81 | + the MCP snippet. Closes the "install → configured agent" gap in one step. |
| 82 | +3. Global search-as-you-type across tabs (debounced recall), keyboard palette (`/` to focus |
| 83 | + search), relative timestamps ("3d ago") with exact time on hover. |
| 84 | +4. Graph visualization of entity/link neighborhoods in the detail dialog (SVG, force layout |
| 85 | + is overkill — radial layout is fine at this scale). Candidate second Pro feature. |
| 86 | +5. Retire the v1 dashboard from the default install (`engraphis-server` keeps serving it for |
| 87 | + compat, but docs point at the Inspector only) — one product surface, one story. |
| 88 | + |
| 89 | +## 5. Feature roadmap (next / later) |
| 90 | + |
| 91 | +**Next (pre-1.0):** encryption-at-rest for the SQLite file (SQLCipher optional extra → |
| 92 | +`encryption` feature flag, regulated-ICP requirement per RELEASE_READINESS.md §"Before you |
| 93 | +charge" #3); consolidation policies (saved schedules with per-scope thresholds) as a Pro |
| 94 | +feature; publish LoCoMo/LongMemEval numbers (the eval adapter already exists). |
| 95 | + |
| 96 | +**Later:** SSO/OIDC for Team (gate: first team customer asking); hosted Inspector (gate: |
| 97 | +recurring demand — it abandons local-first, so it must be pull, not push); scale backends |
| 98 | +(Qdrant/pgvector already behind interfaces); per-token tenant authorization for |
| 99 | +multi-tenant hosting. |
| 100 | + |
| 101 | +## 6. Launch checklist (ordered) |
| 102 | + |
| 103 | +1. ~~License mechanism + first three paid features~~ (this pass). |
| 104 | +2. Rotate vendor keypair; store private key offline. Set the real purchase URL in the |
| 105 | + Inspector dialog and `licensing.py`. |
| 106 | +3. Set up Polar/Lemon Squeezy product + webhook → key issuance. |
| 107 | +4. `git commit` (the tree at HEAD must be the audited one), tag `v0.2.0`, push, verify CI |
| 108 | + matrix (3.9/3.11), publish wheel to PyPI, smoke-test `pip install engraphis[all]` and the |
| 109 | + Docker image. |
| 110 | +5. Run LoCoMo benchmark, publish numbers in README (honest recall@k, per |
| 111 | + RELEASE_READINESS.md #1). |
| 112 | +6. Trademark search on "Engraphis" (#2 there) before spending on brand. |
| 113 | +7. Launch free tier loudly (Show HN, MCP directories, r/LocalLLaMA — the local-first angle |
| 114 | + is the hook), sell quietly (license dialog + pricing page). Revisit pricing after ten |
| 115 | + real conversations. |
| 116 | + |
| 117 | +## 7. Risks |
| 118 | + |
| 119 | +- **Someone forks out the gate** — accepted (see §2); mitigation is velocity and support, |
| 120 | + not DRM. |
| 121 | +- **Team mode expands the attack surface** — mitigated: PBKDF2-HMAC-SHA256 (600k iters), |
| 122 | + hashed session tokens, SameSite=Strict cookies, login backoff, server-side role checks on |
| 123 | + every route; see SECURITY.md §6. Still run `/security-review` on any change touching it. |
| 124 | +- **Paid features drift into the free core's value story** — the line is: *the engine |
| 125 | + remembers for free; seeing, proving, and sharing what it remembers is paid.* Analytics, |
| 126 | + export, and team are all on the right side of that line. Keep it that way. |
0 commit comments