jonnifyelixir

F6 · system design · 1 of 3

The developer journey

You arrive at F6 holding the thing F5 built: a supervised Portal engine behind a small facade — enroll/2, deliver_lesson/2, progress_of/1 — that returns plain results and a closed error contract, and that imports no web framework. You leave F6 with a deployed, real-time learning platform: a browser that loads a page, enrolls a learner, watches progress update live as other clients act, behind sessions and auth, running as a release in production. The journey between is four short arcs, and the rule never changes — Phoenix sits on top of the engine and calls only its facade, so each milestone adds a layer without reaching into the engine.

Select an arc to see what you build and which modules deliver it. The path runs left to right, from the F5 facade to a live platform.

Four arcs

The chapter is four arcs of roughly two modules each. The first stands Phoenix up; the second gives it data and domain boundaries; the third renders and makes the UI live; the fourth makes it real-time, secure, and shipped. Select an arc.

The journey · select an arc

START F5 facade FINISH live platform STAND IT UP F6.01–F6.02 DATA & DOMAIN F6.03–F6.04 THE LIVE UI F6.05–F6.06 REAL-TIME & SHIP F6.07–F6.09 the rule never changes: Phoenix calls only the Portal facade — the engine never reaches up into the web

arc: Stand it up

modules: F6.01–F6.02

A journey, not a pile of features. Each arc leaves a platform that runs, so you can ship after any one of them and keep going — the same way F5 left the engine runnable after every module.

Where you start, where you land

The two ends of the journey are the clearest way to see it. F5 hands you a facade you can call from anywhere; F6 ends with a real-time route the browser reaches, calling that exact facade. Everything in between is wiring, rendering, and broadcasting — never new domain logic.

# START — what F5 hands you: a supervised, framework-free facade
Portal.enroll(user_id, course_id)        # :ok | {:error, %Portal.Error{}}
Portal.progress_of(enrollment_id)        # {:ok, 0..100} | {:error, _}

# FINISH — what F6 ships: a real-time route the browser reaches, calling the same facade
live "/enroll/:id", PortalWeb.EnrollmentLive   # mount/handle_event call Portal.*

you bring an engine

A supervised facade with a closed error contract, ready to be called.

you ship a platform

A live, multi-client learning product that calls only that facade.

Next in the design brief: what we’re building — the full stack with Phoenix added on top of the F5 engine.

References

The framework the journey adds, and the engine it sits on.

Sources

Related in this course