HALO Knowledge Docs
Generated knowledge spine · research/lanes/02-oss-replacements.md

04 · OSS replacements

Ten capability lanes of verified open-source candidates, plus the trap list.

Generated from research/lanes/02-oss-replacements.md · regenerate with /opt/homebrew/opt/node@24/bin/node site/scripts/generate-docs.mjs

The work is complete — I did not lose it. Pasting the final deliverable below verbatim.

Every repo row was verified via gh api repos/OWNER/NAME on 2026-08-29. Stars, licence, and last-push are as of that date. Where the API returned NOASSERTION, I read the actual LICENSE file text via gh api repos/OWNER/NAME/license.


OSS Prior-Art Hunt — HALO Angels CRM

TOP 8 OVERALL PICKS

#RepoWhy
1get-convex/better-auth (765★, Apache-2.0)The single highest-fit find: Convex's own Better Auth component. Kills bespoke SHA-256/localStorage auth with a first-party adapter, not a bolt-on.
2better-auth/better-auth (29,744★, MIT)The engine behind #1. MIT, TS-native, sessions/OAuth/2FA/orgs. Auth solved without a separate service.
3get-convex/convex-test (22★, Apache-2.0)In-memory Convex backend mock. The only way to unit-test 57 tables of Convex functions. Zero-tests problem starts here.
4get-convex/convex-helpers (489★, Apache-2.0)Custom functions/ctx wrappers, relationship helpers, validators, session storage. Directly deletes hand-rolled Convex boilerplate.
5stalniy/casl (7,063★, MIT)Isomorphic TS authz. Role ladder + per-resource flags is exactly its shape. Same rules run in Convex functions and React.
6get-convex/workflow + workpool + action-retrierDurable execution for the Drive scan/index/thumbnail pipeline. Replaces ad-hoc scheduler chains that silently die.
7docusealco/docuseal (18,398★, AGPL-3.0)Best-engineered e-sign of the three; embeddable form builder. AGPL flagged.
8lovell/sharp (32,613★, Apache-2.0)Thumbnail generation, in-process. No thumbor/imgproxy service to run.

Lane 1 — Auth

RepoLicencePushedReplacesDifficultyVerdict
get-convex/better-auth765Apache-2.02026-08-28Bespoke auth table + localStorageDrop-in componentThe answer. First-party Convex↔Better Auth component, actively developed.
better-auth/better-auth29,744MIT2026-08-28SameLibraryCleanest licence in the lane; the framework #1 wraps.
get-convex/convex-auth179NO LICENCE FILE2026-08-29SameDrop-inConvex's older built-in auth. 154 open issues; Convex has visibly shifted energy to the Better Auth component. Legal risk: no LICENSE at all.
get-convex/workos-authkit22Apache-2.02026-08-27SameComponentReal, but ties you to WorkOS's hosted service.
lucia-auth/lucia10,450MIT2026-08-08Confirmed: your recollection is right. Repo is alive but repositioned as a learning resource, not a library. Do not adopt as a dependency.
zitadel/zitadel14,890AGPL-3.02026-08-29SameSeparate serviceExcellent IdP, wrong weight class for one CRM.
keycloak/keycloak36,475Apache-2.02026-08-29SameSeparate JVM serviceEnterprise-grade, enormous operational tax.
ory/kratos13,855Apache-2.02026-07-29SameSeparate serviceHeadless and clean, but no Convex story.
hexclave/hexclave (was stack-auth)6,843MIT client / AGPL server2026-08-28SameService + SDKRenamed since you listed it. Rebrand churn = adoption risk.
supertokens/supertokens-core15,288Apache-2.0 (+ ee/ proprietary)2026-08-28SameSeparate serviceSolid, but a Java service beside Convex.
nextauthjs/next-auth28,350ISC2026-07-22SameAdapter neededNext.js-shaped; you're on Vite + react-router. Poor fit.

Convex-specific answer: only get-convex/better-auth, get-convex/convex-auth, and get-convex/workos-authkit integrate with Convex natively. Everything else needs a custom bridge.

Lane 2 — RBAC / Permissions

RepoLicencePushedDifficultyVerdict
stalniy/casl7,063MIT2026-08-26Drop-in libraryBest fit. Pure TS, no service, subject/field-level rules — matches a role ladder + per-resource flags precisely.
apache/casbin-node-casbin2,917Apache-2.02026-08-13LibraryNote: moved to the apache/ org. Policy-file model is heavier than CASL for this shape.
openfga/openfga5,673Apache-2.02026-08-28Separate serviceZanzibar done well; overkill unless you need relationship-based sharing on the content drive.
authzed/spicedb6,999Apache-2.02026-08-28Separate serviceStrongest Zanzibar engine. Same overkill verdict.
Permify/permify5,942AGPL-3.02026-08-28Separate serviceNow part of FusionAuth — acquisition = roadmap risk.
osohq/oso3,491Apache-2.02025-02-26Deprecated — README says so. Do not adopt.

Lane 3 — E-signature / Contracts

RepoLicence (LICENSE read)PushedDifficultyVerdict
docusealco/docuseal18,398AGPL-3.02026-08-25Separate service + embedBest DX; embeddable signing form. Ruby service alongside Convex.
documenso/documenso14,796AGPL-3.02026-08-29Separate serviceTypeScript — closest to your stack for code-lifting. Most active of the three.
OpenSignLabs/OpenSign6,931AGPL-3.0 + proprietary customRoute/ dir2026-08-21Separate serviceMixed licence with a carved-out proprietary directory. Messiest of the three.

All three are AGPL. Flagged as metadata per your rule, not eliminated. Documenso is the one whose code you could actually study/lift given it's TS.

Lane 4 — Invoicing / Billing / Multi-currency

RepoLicence (verified)PushedDifficultyVerdict
getlago/lago10,438AGPL-3.02026-08-28Separate service + APIBest-engineered billing engine here; API-first so it composes rather than replaces.
killbill/killbill5,706Apache-2.02026-08-22Separate JVM serviceCleanest licence in the lane. Battle-tested, heavy Java deployment.
midday-ai/midday14,935AGPL-3.02026-06-13Study / lift patternsTypeScript, gorgeous invoicing UX — steal the patterns. Slowing (2.5mo since push).
solidtime-io/solidtime8,886AGPL-3.02026-08-28Separate appTime-tracking, adjacent to payroll/attendance. Laravel.
invoiceninja/invoiceninja10,034ELv2 — hosting clause2026-08-27Separate PHP appELv2 explicitly forbids offering it as a hosted service. Highest commercial risk in this doc.
InvoicePlane/InvoicePlane3,126Trademark-restricted + open code2026-08-28Separate PHP appDated CodeIgniter stack.
crater-invoice-inc/crater8,341AGPL-3.02024-08-10Stale ~2 years. Do not adopt. (Also renamed from crater-invoice/crater.)

Honest read: none of these lift as a library into Convex. Multi-currency creator + referral invoicing stays yours; Lago or Kill Bill are the only credible "run it beside us" options.

Lane 5 — Credential Vault / Secrets

RepoLicence (verified)PushedDifficultyVerdict
FiloSottile/age23,350BSD-3-Clause2026-08-28Library/CLIRecommended pattern. Envelope-encrypt each credential to a KMS-held key; store ciphertext in Convex. Smallest correct change.
jedisct1/libsodium.js1,152ISC2026-07-14Drop-in libraryWASM libsodium — crypto_secretbox + per-record nonce, runnable in Convex actions. The "do it properly" option.
Infisical/infisical29,010MIT core + proprietary ee/2026-08-29Separate serviceBest-licensed full platform. Real infra to run.
openbao/openbao7,194MPL-2.02026-08-28Separate serviceVault fork under a genuinely open licence.
dani-garcia/vaultwarden66,439AGPL-3.02026-08-24Separate serviceHuman password manager, not app-level secrets. Wrong tool for secureAreaPasswords.
passbolt/passbolt_api6,095AGPL-3.02026-08-21Separate serviceSame wrong-shape verdict.
hashicorp/vault36,185BSL 1.1 (now IBM)2026-08-28Separate serviceLicence changed to BSL; use OpenBao instead.

Verdict for this lane: don't adopt a vault product. Do envelope encryption with libsodium/age and a real KMS key. That's a ~200-line fix, not a service.

Lane 6 — File / DAM Pipeline

RepoLicence (verified)PushedDifficultyVerdict
lovell/sharp32,613Apache-2.02026-08-28Drop-in libraryThumbnails in-process. No extra service. Take this.
googleapis/google-api-nodejs-client12,236Apache-2.02026-08-28LibraryOfficial Drive client — incremental changes.list + pageToken beats full rescans.
get-convex/r249Apache-2.02026-08-28Convex componentMove derived thumbnails to R2; kill egress cost.
immich-app/immich112,891AGPL-3.02026-08-28StudyBest prior art anywhere for scan→hash→thumbnail→index job queues. Read it, don't run it.
imgproxy/imgproxy11,034Apache-2.02026-08-27Separate serviceOn-the-fly resizing with signed URLs. Adopt only if sharp proves too slow.
thumbor/thumbor10,514MIT2026-08-27Separate serviceMature but Python; cleanest licence of the two proxies.
rclone/rclone59,438MIT2026-08-28CLI/binaryBulletproof Drive sync if you ever need bulk mirroring.
photoprism/photoprism40,117AGPL-3.02026-08-28StudyTaxonomy/auto-labelling prior art.
CaramelFur/Picsur1,246AGPL-3.0Separate serviceNote: the owner is CaramelFur, not CaiJimmyCaiJimmy/picsur returns 404. Small; skip. Stars/licence verified via gh search repos; last-push unverified.

Lane 7 — Gamification / Quests / XP

This lane is empty. Reporting it honestly.

RepoLicencePushedVerdict
ActiDoo/gamification-engine474MIT2023-02-15Best OSS gamification engine that exists — and it's Python, 3.5 years stale.
agoragames/leaderboard481MIT2021-03-11Ruby, 5 years stale.

Everything else returned by search is sub-100★ or abandoned pre-2015. There is no maintained TypeScript gamification engine. Quests/XP/shop/ranks is a domain-specific state machine — keep it bespoke. The only sensible OSS help is get-convex/aggregate (31★, Apache-2.0, pushed 2026-08-28) for leaderboard sums/counts without O(n) scans, and get-convex/workflow for multi-step quest chains.

Lane 8 — Admin Panel / CRUD Scaffolding

RepoLicence (verified)PushedDifficultyVerdict
refinedev/refine35,593MIT2026-06-05Framework, headlessBest fit for the 39-pages problem. Headless + shadcn-compatible, so you keep your UI. Needs a Convex data provider (~1 file). Note the 2.5-month push gap.
marmelab/react-admin26,914MIT2026-08-27FrameworkVery actively maintained, but Material-UI opinionated — fights your shadcn/Tailwind design.
appsmithorg/appsmith40,779Apache-2.02026-08-29Separate serviceBest-licensed platform, but a parallel app; you'd have two UIs.
ToolJet/ToolJet40,787AGPL-3.02026-08-28Separate serviceSame shape as Appsmith.
Budibase/budibase28,246GPLv3 overall + BSL on /packages/pro2026-08-28Separate servicePaid features are BSL-fenced.
directus/directus37,677MSCL-1.0-GPL (source-available, new)2026-08-28Separate serviceLicence changed to Monospace Sustainable Core License. No longer plain GPL.
tremorlabs/tremor3,586Apache-2.02025-10-10Copy-pasteDashboard charts. ~10 months stale — check before depending.
twentyhq/twenty55,812AGPL-3.0 (+ @license Enterprise files)2026-08-29StudyA real CRM's data model, worth reading for the creator/contact domain.

Refine realistically compresses list/create/edit/show pages — maybe 30-40% of the 80k LOC, not 80%. The domain screens (Drive taxonomy, voice cloning, quests) won't scaffold.

Lane 9 — Testing

Minimum credible harness, all MIT/Apache, all actively pushed:

RepoLicencePushedRole
vitest-dev/vitest17,022MIT2026-08-28Runner. Zero-config with your existing Vite setup.
get-convex/convex-test22Apache-2.02026-08-27Load-bearing. In-memory Convex backend; test queries/mutations/actions without a deployment.
testing-library/react-testing-library19,646MIT2026-08-27Component tests.
microsoft/playwright95,316Apache-2.02026-08-29E2E: login → invoice → payment log.
mswjs/msw18,174MIT2026-07-24Mock ElevenLabs/Drive/Stripe at the network layer.

Order of adoption: Vitest + convex-test first (highest value per hour — 57 tables of untested mutations), then Playwright on 3-5 money paths, then RTL, then MSW.

Lane 10 — Convex Ecosystem (highest-fit lane)

Every component below is Apache-2.0, first-party (get-convex), and pushed within the last week.

ComponentPushedWhat it replaces here
convex-helpers4892026-08-27Hand-rolled auth wrappers, relationship joins, validators, session storage. Highest LOC-deleted-per-hour.
better-auth7652026-08-28The bespoke auth table.
convex-test222026-08-27Nothing — it fills the zero-test hole.
workflow802026-08-27Multi-step Drive scan/index/thumbnail chains; durable, survives failures.
workpool312026-08-28Bounded parallelism so a Drive scan can't exhaust the action budget.
action-retrier122026-08-28Retry logic around ElevenLabs / Drive / payment calls.
migrations202026-08-27The Supabase→Convex migration itself — tracked, resumable stateful migrations.
table-history222026-08-27Audit log for contracts, payments, payroll. Compliance-relevant.
aggregate312026-08-28Dashboard analytics + gamification leaderboards without O(n) scans.
rate-limiter272026-08-29Login throttling — your bespoke auth almost certainly has none.
crons62026-08-27Runtime-configurable crons vs. hardcoded crons.ts.
r2492026-08-28Cloudflare R2 file storage for thumbnails.
presence192026-08-26Messaging online-indicators.
stripe782026-08-27Payment log ingestion.
resend392026-08-28Transactional email with delivery tracking.
agent3462026-08-28Persistent AI chat history if the voice/AI features grow.
rag362026-08-28Semantic search over the content drive.
templates1352026-08-28Official Convex starters.
convex-ents582026-08-22Schema/relations ergonomics — but no LICENSE file, and slower cadence.

DO NOT ADOPT

  • osohq/oso (3,491★) — README declares it deprecated; last push 2025-02-26.
  • lucia-auth/lucia (10,450★) — your recollection is correct; repositioned as a learning resource, not a maintained library.
  • crater-invoice-inc/crater (8,341★) — last push 2024-08-10. Stale ~2 years and the owner org renamed.
  • hashicorp/vault (36,185★) — LICENSE is now BSL 1.1 under IBM, not MPL. Use OpenBao.
  • invoiceninja/invoiceninja (10,034★) — ELv2 with an explicit no-hosted-service clause. Highest commercial risk in this document for a client-adjacent product.
  • directus/directus (37,677★) — silently moved to the Monospace Sustainable Core License. Anyone citing it as "GPL/open source" is working from stale information.
  • get-convex/convex-auth (179★) — no LICENSE file at all, 154 open issues, and Convex's own effort has visibly moved to the Better Auth component. Attractive because it's first-party; a trap because it's the deprecated path.
  • Vaultwarden / Passbolt — both excellent, both the wrong shape. They manage human passwords, not application-level encrypted credentials.
  • CaiJimmy/picsurdoes not exist (404). The real repo is CaramelFur/Picsur, 1,246★, AGPL-3.0.
  • Budibase / ToolJet / Appsmith as an "admin panel drop-in" — each is a whole second application with its own datastore and auth. They do not reduce your React LOC; they add a parallel system.

Corrections to the brief's assumptions

Four repos in the task list have moved or changed since the names were written: stack-auth/stack-authhexclave/hexclave; casbin/*apache/casbin*; crater-invoice/cratercrater-invoice-inc/crater; and CaiJimmy/picsur does not exist. Two licences have changed under repos commonly cited as open source: Directus (now MSCL-1.0-GPL) and Vault (now BSL 1.1). Convex's own backend is FSL-1.1-Apache-2.0, not Apache-2.0 as the API's NOASSERTION might suggest — though the client libraries and all components genuinely are Apache-2.0.


One verification caveat, stated plainly: every row above came from a gh api repos/OWNER/NAME call except CaramelFur/Picsur, whose stars and licence I got from gh search repos — its last-push date is unverified. Everything else in the tables is directly verified.

Canonical source remains research/lanes/02-oss-replacements.md. This HTML is a generated projection; edit the source, then run generate-docs.mjs.