Evolve University Platform
A self-hosted learning, community, and accountability platform for real estate teams built to beat Skool, Circle, and Kajabi on the dimensions that matter to sales-driven orgs…
- 21 courses / 223 lessons
- migrated and live in production (3 free, 18 paid)
- 446
- recording scripts written (a full and summary version per lesson)
- ~85%
- of the platform's own security runbook checklist passed on first pre-launch audit

Problem
Evolve University's courses lived on Skool, a rented community platform with no CRM awareness, no sales role-play, no certification rigor, and no ownership of the member data or economics. For a real estate training program built around daily accountability and script mastery, a generic community container couldn't tie learning to whether an ISA actually made their calls that day. Every member and dollar of revenue depended on a platform Evolve didn't control. The actual export made the constraint concrete: 1.7 GB across 770 files, entirely Presentation/Lesson-Plan/Homework/Resource-Packet PDFs plus RTF/MD/HTML masters - zero video files, with exactly one document even referencing an external video link. A generic migration plan that assumed a video-hosting decision (Stream vs. Bunny vs. Mux) up front would have blocked the whole project on a provider choice the content didn't need yet. The harder problem underneath the platform swap was economic: Skool doesn't know what "Pro" means to Evolve, doesn't gate an individual PDF behind a subscription, and has no concept of an accountability streak or a role-play score. Those are the mechanics the training program is actually built on, and none of them are ones a rented container can be bent into supporting.
What was built
A self-hosted replacement for Skool: members sign up free, take three free courses, and can subscribe to Evolve University Pro for the remaining eighteen. It has a course catalog with a PDF-based lesson viewer served over signed URLs, a community feed with realtime updates, and an accountability engine for logging daily commitments and tracking streaks. It also has an AI role-play coach that scores practice sales conversations against a rubric, and a certification system that issues publicly verifiable credentials. The original eighteen-course, twenty-plus-module Skool export - PDFs, presentations, homework packets, no video - was migrated through an idempotent five-stage pipeline (inventory, normalize, upload, load, verify) that never touches the original iCloud export and can be re-run without duplicating content. All 223 lessons now have full and summary recording scripts written; the platform itself is live and the money path proven, with the sole remaining gate before public launch being recording the actual instructional video.
Technical approach
Runs entirely on Cloudflare Workers via OpenNext, not a conventional server: D1 (SQLite) with Drizzle replaces the originally-planned Postgres, R2 replaces MinIO/S3, Durable Objects replace a self-hosted WebSocket server, and Cloudflare Queues + Cron Triggers replace BullMQ/Redis. That full re-mapping was documented and locked in an ADR before build started, chosen specifically to avoid adding load to the home Mac Mini and to keep monthly infra cost near $5. Auth is hand-rolled instead of Auth.js: PBKDF2-SHA256 at 100k iterations, the ceiling Workers' SubtleCrypto allows, plus a server-side HMAC pepper so a leaked D1 dump alone isn't offline-crackable. It uses jose-signed JWTs in an httpOnly cookie and a tokenVersion column for stateless revocation, ported directly from a sibling project's proven pattern instead of reinvented. The realtime community feed hit a real infrastructure wall: a standalone /rt/* worker needed a Workers Routes zone-token scope that repeatedly failed to attach. So the team pivoted to intercepting the WebSocket upgrade inside the platform's own raw fetch handler, ahead of Next's router. That meant esbuild-bundling a small handler that wraps OpenNext's worker.js export, since a Next route handler drops the raw webSocket handle that a Durable Object upgrade needs. Course-content access control runs through an access_rule_json field (free vs tier:pro) with Stripe webhooks as the single source of truth for entitlement, mirrored into a subscriptions table. Content streaming is entitlement-gated at the R2 signed-URL layer, so paid PDFs are never publicly reachable. A pre-launch security audit (report-only, not a formality) found the platform met roughly 85% of its own runbook's security checklist out of the gate. The two flagged gaps - missing CSP and non-timing-safe cron secret comparison - were fixed immediately. A signup email-enumeration finding was deliberately left as an accepted, documented risk instead of silently patched. Fixing it would require an email-verification signup flow that would hurt first-touch conversion for a low-sensitivity threat model, since real estate agents already publicize their emails.
Creative approach
Craft
The platform ships the locked 'University LIGHT editorial + gold' brand palette shared across the Evolve site family, applied to a course-catalog-and-lesson-viewer information architecture instead of a from-scratch visual system. The design investment went into content structure (weekly modules, sequential lessons, PDF viewer, progress tracking) over novel UI. The surfaces that carry it: a /learn catalog and per-course pages with a ProgressBar component tracking lesson completion, and a lesson viewer route that renders the signed-URL PDF directly instead of routing through a third-party embed. There's also a /community space with its own feed, comment threads, reaction bar, and a leaderboard page, and a CertBadge component for the publicly verifiable certification pages. The community surfaces (post composer, comment form, reaction bar, feed auto-refresh) are built as the same weight of component as the learning surfaces, not bolted on as an afterthought widget. That matters for a platform whose reframe is that community and accountability are the product, not a side feature next to the video player.
Reframe
The product bet is that the differentiator against Skool/Circle/Kajabi isn't better community mechanics. It's tying learning directly to measurable sales activity: an accountability engine that logs whether a member actually dialed or set the appointment today. An AI role-play coach scores objection-handling the way a paid coach would, instead of generic points-and-badges gamification. The explicit design mandate was to win specifically on the dimensions that matter to sales-driven real estate teams, not to be a better generic community container.
Process and what failed
The realtime feed's first design (a dedicated /rt/* Cloudflare Worker) was built and then abandoned within a day when the Workers Routes zone-token scope it needed kept failing to attach. The fix that shipped instead - intercepting the WebSocket upgrade inside the platform's own request handler before Next ever sees it - is a documented reversal, not the original plan. AI Toolkit Foundations was pulled out of the free tier and moved to Pro late in the build (07-27), specifically to hold the free tier at exactly three courses. That meant re-doing the paid-course recording guide the next day, because it had listed the wrong course count. A 14-minute-per-lesson runtime estimate for that same course turned out mid-pack once the standing 45-to-60-minute-per-lesson rule was applied uniformly. It needed the most padding of any course in the catalog, the opposite of the 'cheapest paid win' it was assumed to be.
Outcome
Live at learn.evolveuniversity.ai as of 2026-07-29, feature-complete and hardened, with the live Stripe money path proven end-to-end by a signed synthetic webhook test and the business's DBA filed 2026-07-23. All 223 lessons across 21 courses (3 free, 18 paid) are migrated, verified 1:1 against their recording scripts, and reconciled against production. The one remaining launch gate is recording the instructional video itself - an estimated 167 to 223 hours of content - which is explicitly Victor's own work, not a software gap. The last engineering task before that gate was a correction pass that republished nine decks as 61 R2 objects, each verified byte-identical after upload, with a rollback script written before the change rather than after it.
A member tools tier shipped on 2026-08-25: twelve tools and seven guided workflows live behind a new rung, a pricing ladder now four rungs deep ($49, $99, $199, $297 a month) live in Stripe, and the tier's database migration applied to the remote database before the code that depends on it. A hardening fix landed the same week, so an unrecognized Stripe lookup key now grants nothing instead of defaulting to a paid tier. The launch gate is unchanged: scripts for all 223 lessons are written; recording them remains the one thing between the platform and a public launch.
Since 2026-08-30 a bearer-token native API lane was built so a companion iOS app can read and write the same data as the web: sign-in, catalog and lesson delivery, community feed with report and block, the practice and tools registries, accountability, certification, team and owned-file endpoints. That lane is committed but not yet deployed to production, and the app itself has its own page. The launch gate is still the same one: scripts for all 223 lessons are written, and recording them is what stands between the platform and a public launch.
Related work
- Live2026Monarch MovementA self-hosted community and onboarding platform that turns a real estate team's recruiting SOP into software members can't skip a step of.
- Live2026Dream Home DesignerA browser home-design tool that pairs a floor-plan editor with a Florida ownership-cost estimate, so a buyer sees the monthly number beside the layout.
- Live2026The Alliance HubA multi-tenant culture-operations platform for a real-estate team's physical hub, built by hard-forking a sibling product and re-deriving its tenancy, security and design…