ElixirConf
Server-side stateful rendering on the BEAM matches client-side application interactivity while eliminating complex JavaScript frameworks by streaming real-time template diffs over WebSockets.
AI-assisted summary of ElixirConf 2018 - Keynote - Chris McCord — original source. Check the original for full context.
Source published:
Key ideas
- Phoenix 1.4 approaches release with native HTTP/2 support, faster compilation, a route-listing 404 page, and a modular transport layer refactored by José Valim to ease custom WebSocket implementations. (0:00)
- The new open-source Telemetry library, created in collaboration with Erlang Solutions and Plataformatec, introduces an unopinionated, macro-free core dispatch API designed to unify ecosystem-wide metrics collection. (4:49)
- Chris McCord unveils Phoenix LiveView, a server-rendered real-time UI framework running over WebSockets that delivers rich interactivity using standard Elixir GenServers without requiring dedicated client-side JavaScript frameworks. (15:18)
- A stress test porting Marko.js's 60 FPS rainbow animation across 85 dynamic elements demonstrates that BEAM processes and microsecond template rendering can handle extreme server-driven DOM updates at scale. (40:41)
Detailed notes
## Background This keynote address by Chris McCord was published on YouTube by the ElixirConf channel on September 8, 2018. The presentation runs for nearly 58 minutes and features no formal video description or show notes provided by the uploader.
## TL;DR Chris McCord begins with ecosystem milestones, detailing the near-completion of Phoenix 1.4, updates to the official Programming Phoenix book, and the newly collaborative Telemetry project for unified metrics. He then unveils the keynote's centerpiece: Phoenix LiveView, a server-driven UI library designed to provide reactive, real-time user experiences over WebSockets without the operational overhead and toolchain fatigue of modern client-side JavaScript single-page applications. McCord demonstrates LiveView's capabilities through real-time form validation, multi-tab presence tracking, and an absurd 60 FPS animation rendered directly on the BEAM, before outlining its architectural trade-offs, performance advantages, and multi-node clustering strategies.
## Atmosphere & style The presentation is candid, enthusiastic, and laced with self-deprecating humor—ranging from McCord joking about caffeine overdoses to getting playfully reprimanded by José Valim over slide formatting. There is an unmistakable undercurrent of ambition as McCord challenges the status quo of modern front-end complexity, eliciting excitement and amusement from the audience with live demos that push the boundaries of server rendering. It feels like an invigorating, paradigm-shifting community keynote that blends pragmatic engineering advice with an inspiring call to advance the state of the art.
## Bulletin - [00:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=0s) Phoenix 1.4 approaches release with native HTTP/2 support, faster compilation, a route-listing 404 page, and a modular transport layer refactored by José Valim to ease custom WebSocket implementations. - [04:49](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=289s) The new open-source Telemetry library, created in collaboration with Erlang Solutions and Plataformatec, introduces an unopinionated, macro-free core dispatch API designed to unify ecosystem-wide metrics collection. - [15:18](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=918s) Chris McCord unveils Phoenix LiveView, a server-rendered real-time UI framework running over WebSockets that delivers rich interactivity using standard Elixir GenServers without requiring dedicated client-side JavaScript frameworks. - [40:41](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2441s) A stress test porting Marko.js's 60 FPS rainbow animation across 85 dynamic elements demonstrates that BEAM processes and microsecond template rendering can handle extreme server-driven DOM updates at scale.
## Key takeaways - [00:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=0s) Phoenix 1.4 features native HTTP/2 support, significantly faster development compilation, and an interactive 404 page that lists available router routes. - [00:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=0s) José Valim refactored the Phoenix 1.4 transport layer, eliminating the need to copy-paste core implementations to extend WebSockets and resolving a race condition in the JavaScript Presence client. - [04:49](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=289s) The Telemetry project establishes a minimal, macro-free event dispatch contract across the Elixir ecosystem, executing zero-cost ETS lookups when no handlers are attached. - [09:41](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=581s) Standardized Telemetry enables actionable, automated BEAM diagnostics—such as detecting atom table exhaustion or message queue bottlenecks—directly inside browser dashboards. - [11:09](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=669s) Phoenix LiveView traces its origins to Sync, a 2013 Ruby library that hit insurmountable concurrency roadblocks under MRI and EventMachine, ultimately leading McCord to Elixir. - [18:57](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1137s) LiveView addresses front-end complexity creep by replacing multi-tiered SPA toolchains, GraphQL schemas, and Node.js SSR layers with server-side rendered stateful components. - [21:16](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1276s) LiveView ports the React component model to the server, using the ~L sigil and GenServer processes to push minimal template diffs over WebSockets directly to the DOM. - [25:10](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1510s) Declarative HTML attributes like phx-click and phx-change map browser interactions directly to handle_event/3 server callbacks, enabling instant inline Ecto validations without client JavaScript. - [29:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1740s) The phx-submit binding allows forms to persist directly within the existing LiveView process, keeping localized Gettext error translations entirely on the server. - [35:05](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2105s) Combining Phoenix PubSub contexts with LiveView enables real-time, cross-tab synchronization and automatic page redirects in fewer lines of code than traditional CRUD controllers. - [38:59](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2339s) Integrating Phoenix Presence inside server-side LiveViews enables instant multi-tab presence tracking without writing custom client reconciliation code in JavaScript. - [40:41](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2441s) A 60 FPS server-rendered rainbow animation benchmark proves the BEAM runtime can compute layout transforms and push real-time WebSocket diffs at 16.6 ms intervals. - [45:35](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2735s) LiveView is not designed for offline-first apps or low-latency optimistic UI, but offers unmatched velocity and built-in SEO for standard forms, dashboards, and CRUD flows. - [48:18](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2898s) Phoenix measures template rendering in microseconds rather than milliseconds, providing the underlying speed necessary to support streaming DOM diffs across thousands of clients. - [48:59](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2939s) Framework performance matters beyond marketing benchmarks because sub-millisecond execution unlocks entirely new architectural paradigms like server-driven real-time interfaces. - [54:54](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=3294s) LiveView leverages distributed Erlang and Phoenix PubSub to support multi-node clusters behind sticky WebSocket load balancers using serialized server process tokens.
## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=0s) Introduction and Phoenix 1.4 Update
Chris McCord opens the keynote by teasing the theme of "going full circle," noting that while the audience does not yet know what that phrase means, it will become clear later in the talk. He plans to unveil exciting new features that the team has been working on, but explains that understanding the motivation requires traveling back in time to what originally brought him to Elixir and Phoenix. Before diving into the history, he gives credit to his employer, DockYard, highlighting that they allow him to dedicate the majority of his time to open-source development while serving clients ranging from early-stage startups to Fortune 100 enterprises.
Turning to Phoenix 1.4, McCord addresses the anticipation built up over his previous conference talks. Phoenix 1.4 is practically finished, with only a single open issue on the milestone tracker—a code formatter issue that would take only ten minutes to complete. McCord jokes that there is already an open pull request for it, but if he merges and closes it, people will demand to know why the final version has not been published yet. The real bottleneck is bandwidth: between preparing a keynote, writing a book, and finishing framework development, the team needs time to ensure documentation is fully prepared so they do not have to immediately rush out a 1.4.1 release. Although he hoped to drop a release candidate on stage "Apple-style," a release candidate is expected within the week, and the master branch is already very stable.
Phoenix 1.4 introduces several major enhancements: HTTP/2 support, faster development compilation times, and quality-of-life additions such as displaying all available router routes directly on the 404 error page during development. A major architectural improvement is the overhaul of the transport layer, executed primarily by José Valim. McCord describes his own development process as top-down: he envisions the high-level API first—such as typing `channel` and expecting bi-directional communication to immediately work—and builds downward into lower-level dependencies like PubSub without focusing on broader design abstractions. Valim subsequently refactored the transport layer, extracting emerging patterns into clean, extensible, modular pieces. As a result, extending WebSocket transports no longer requires copy-pasting the framework's entire transport implementation. McCord also shares a mixed update regarding the Presence API: applications using the existing JavaScript library contain an inherent race condition, but the newly rewritten JavaScript fixes the issue while simplifying the API.
“With Phoenix 1.4, José has pretty much completely rewritten the transport layer so now if you want to extend the WebSocket transport, you used to have to like copy paste our entire WebSocket transport, now there's much less code for you to write.” — Chris McCord
- **DockYard Sponsorship**: Supports McCord's full-time open-source work across startups and Fortune 100 projects. - **Phoenix 1.4 Core Enhancements**: - Native HTTP/2 support. - Significantly faster development compilation cycles. - Interactive 404 debug page listing all configured router routes. - Extensible, modular transport layer refactored by José Valim. - Bug fix resolving a race condition in the JavaScript Presence client library alongside a cleaner API surface.
---
[04:02](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=242s) Programming Phoenix >= 1.4 Book Update
McCord provides an update on the official book, *Programming Phoenix*. The release had been substantially delayed; originally planned as a Phoenix 1.3 edition, the authors decided to skip version 1.3 entirely and focus on *Programming Phoenix >= 1.4* to ensure the content remains future-proof.
Only three chapters remain to be written. The plan is to release new chapters on the Pragmatic Bookshelf platform every two weeks, bringing the beta release to completion within six to eight weeks, followed by a final print publication before the end of the year. McCord shares an ElixirConf attendee discount code (`phoenixworkshop2018`) valid for approximately five days, directing attendees to the shortcut link `phoenixframework.org/book`.
“It was supposed to be Programming Phoenix 1.3, and it is now Programming Phoenix greater than 1.4, so we just skipped the 1.3 and went straight for a book that should be relatively future-proofed.” — Chris McCord
---
[04:49](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=289s) The Telemetry Project: Unified Metrics for the Ecosystem
McCord transitions to a long-standing initiative: establishing a universal system for collecting and reporting metrics within the Elixir ecosystem. While metrics have been discussed at previous conferences, the Phoenix team previously lacked the bandwidth to build an overarching solution. Erlang Solutions stepped up to collaborate with the Phoenix team, with José Valim and Plataformatec providing guidance and mentorship. Over the preceding three months, this initiative culminated in an open-source project named **Telemetry**.
The fundamental problem Telemetry aims to solve is fragmentation. The Elixir community has access to a wealth of operational data and numerous third-party backends—such as StatsD, Prometheus, and New Relic—but libraries have historically instrumented and exposed metrics in inconsistent, ad-hoc ways. Telemetry provides an unopinionated, rock-solid, and minimal core dispatch API. Unlike Phoenix's older macro-heavy instrumentation, Telemetry requires no metaprogramming. Publishers execute events using `telemetry:execute/3`, and consumers simply register standard module-function callbacks via `attach`. If no handlers are attached, dispatch acts as an almost zero-cost no-op lookup in ETS.
Because Telemetry remains completely framework-agnostic, any library across the ecosystem—including Ecto, Plug, Absinthe, and HTTP clients like Hackney—can depend on this tiny core without risk of frequent breaking changes. Higher-level concerns, such as system probing, request-per-second rate calculation, aggregations, and vendor-specific reporting (StatsD, Prometheus), reside in separate companion packages layered on top of the Telemetry foundation. This architecture frees framework maintainers to focus on extracting rich runtime data to deliver actionable application insights.
“Telemetry's goal is to be this initial bare-bones metrics library that everyone can use, that way we have a common interface to start collecting and reporting metrics.” — Chris McCord
```mermaid flowchart TD accTitle: Telemetry Event Dispatch Architecture accDescr: Diagram illustrating how ecosystem libraries emit events through Telemetry's core API to user handlers and external reporting packages.
subgraph Producers ["Ecosystem Event Producers"] P1["Phoenix (e.g., [:phoenix,:request,:stop])"] P2["Ecto (e.g., [:ecto,:query])"] P3["HTTP Clients / Absinthe"] end
subgraph Core ["Telemetry Core API"] T["telemetry:execute(event, measurements, metadata)"] ETS[("Fast ETS Handler Lookup")] end
subgraph Consumers ["Consumers & Reporters"] H["User Defined Callback Functions"] R1["StatsD Reporter"] R2["Prometheus Reporter"] end
P1 --> T P2 --> T P3 --> T T --> ETS ETS -->|"Dispatch (if registered)"| H ETS -->|"Forward"| R1 ETS -->|"Forward"| R2 ```
- **Collaborative Effort**: Joint initiative between Erlang Solutions, Plataformatec (José Valim), and the Phoenix core team. - **Design Philosophy**: Minimalistic, zero-macro, rock-solid core interface avoiding breaking changes for foundational libraries. - **Performance Characteristics**: Emitted events with zero attached listeners perform an ETS table lookup and immediately no-op, minimizing runtime overhead. - **Decoupled Architecture**: Separation between the core dispatch mechanism (`telemetry`) and external aggregators, gauges, or metrics reporters (StatsD, Prometheus).
[09:41](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=581s) Phoenix Telemetry and VM Insights for Non-Experts
At DockYard, Chris McCord and his team frequently work with client organizations that have had Elixir running in production for years without having internal BEAM expertise. Many of these teams do not know what the Erlang runtime atom table is or how it behaves, and they remain unaware when their applications leak memory. Instead, when an application occasionally runs out of memory and crashes, the automated deployment or container orchestrator simply restarts the node; developers shrug off the transient downtime because they lack accessible tooling to diagnose the root cause. McCord argues that this diagnostic information has always been present in the runtime, but developers need high-level tools that automatically surface actionable insights directly in their browser interfaces.
With the unified Telemetry effort underway, McCord envisions a real-time Phoenix telemetry dashboard that connects to runtime metrics and translates raw VM statistics into clear human guidance. Rather than forcing engineers to dig into low-level runtime monitors, the system can use straightforward heuristics to diagnose common failure patterns. If the atom table reaches 90% capacity, the dashboard should explicitly flag that an atom leak is likely occurring and provide links to explanatory documentation. Similarly, if memory steadily climbs or request latencies degrade, the dashboard can isolate the top processes sorted by message queue length to pinpoint processing bottlenecks. McCord expresses deep gratitude to José Valim and the Erlang community members driving Telemetry forward, noting that pairing a standardized event interface with Phoenix Channels makes it trivial to deliver real-time operational insights.
```mermaid flowchart LR accTitle: Phoenix Telemetry VM Insights Flow accDescr: Metrics from the BEAM VM flow through Telemetry into Phoenix Channels to give developers automated bottleneck and memory heuristics. subgraph BEAM["Erlang BEAM Runtime"] AT["Atom Table Usage"] MQ["Process Message Queues"] end subgraph Tooling["Diagnostic Layer"] T["Telemetry Hooks"] H["Automated Heuristics<br/>(e.g., 90% Atom Limit)"] end subgraph UI["Phoenix Dashboard"] C["Phoenix Channels"] D["Real-Time Browser View"] end
AT --> T MQ --> T T --> H H --> C C --> D ```
- High BEAM atom table usage (e.g., above 90%) represents an unrecoverable memory leak pattern that heuristics can detect automatically. - Message queue inspection reveals concurrency bottlenecks where single processes fail to process incoming messages as quickly as they arrive. - The combination of a standardized telemetry contract and Phoenix Channels allows live VM instrumentation to be rendered in web pages without bespoke infrastructure.
[11:09](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=669s) The Origins of Phoenix: The Espresso-Bean-Fueled "Sync" Library
Before revealing his next major project, McCord asks the audience to withhold judgment until hearing the entire rationale, acknowledging that some might find the concept controversial or regressive at first glance. He traces the technical motivation back to 2013, when he was working primarily as a Ruby on Rails developer. During that era, the software industry was vigorously pushing client-side Single Page Applications (SPAs) as the only viable future, warning developers that continuing with server-rendered HTML meant becoming a "dinosaur." Loved by Rails for its developer productivity, McCord set out on a personal thought experiment to achieve real-time, dynamic web experiences without abandoning server-side development or taking on immense client-side JavaScript complexity.
The origin of that experiment involved an accidental caffeine overdose. McCord ate an entire bag of chocolate-covered espresso beans late one evening without realizing their potent caffeine content. Freaking out and unable to sleep, he stayed up all night coding; the result of that manic session was Sync, his first major open-source library, committed to GitHub on April 6, 2013. Sync was designed to render partial HTML templates on the server and push updates downstream to connected browsers via WebSockets without requiring custom client-side JavaScript or client CRUD logic. As McCord reflects on this pivotal moment in his career:
> “I stayed up all night and Sync is what fell out of that, I'm serious that's what happened, that's ultimately Phoenix probably wouldn't be here if I hadn't eaten that bag of espresso beans.”
Sync proved that the programming model of server-rendered real-time partials was compelling to developers, but the concurrency constraints of the Ruby ecosystem made production stability impossible. In order to operate, Sync required running a dedicated standalone WebSocket server alongside the primary Rails process. To broadcast updates without blocking Ruby's single operating system execution thread, McCord had to run an EventMachine event loop—essentially importing JavaScript's concurrency model into Ruby. In production, the EventMachine thread would silently terminate without alerting the host process, forcing McCord to write supervisor-like polling threads to detect dead background loops. Recognizing that Ruby's underlying platform would never allow this architecture to be robust or performant, McCord began scouting other languages. Six months after publishing Sync, he discovered Elixir, which possessed the native concurrency model required to realize his architectural ambitions and ultimately led to the creation of Phoenix.
[15:18](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=918s) Introducing Phoenix LiveView: The Quest for Rich UI Without SPA Fatigue
Five years after abandoning Sync, McCord announces that the Phoenix ecosystem has come full circle with a project tentatively named Phoenix LiveView. Developed outside Phoenix core as an independent, independently versioned package, LiveView builds directly upon Phoenix Channels to deliver rich, real-time user experiences that rival client-side JavaScript applications without incurring their systemic complexity. McCord anticipates skepticism from engineers who might accuse him of trying to build a “turbocharged horse buggy,” but he emphasizes that the modern JavaScript ecosystem imposes a disproportionate maintenance and cognitive burden on teams attempting to deliver ordinary interactive experiences.
McCord emphasizes that developers do not build heavy client-side applications simply out of a desire to use new technology; they do so because interactive interfaces directly impact business conversion rates. A standard multi-input registration form illustrates this dynamic:
1. **Step 1: User omission** — When confronted with a phone number field, the average user intentionally leaves it blank. In a classic server-rendered web application, clicking "Save" causes a disruptive full-page reload only to reveal that the field is mandatory. 2. **Step 2: Placeholder entry** — The user types an evasion like `"no thanks"` or `"N/A"` into the field and submits again, triggering another round-trip refresh and a subsequent validation error that the text is not a legitimate phone number. 3. **Step 3: Synthetic valid data** — The user enters a syntactically valid fake phone number and submits a third time. 4. **Step 4: Persistence collision** — The backend database validation runs and rejects the form because the entered email address is already registered to another account.
After four consecutive user rejections across three simple fields, conversion rates collapse. Teams turn to client-side frameworks to give instant inline feedback and eliminate submission friction. Yet implementing even this modest feedback loop in JavaScript forces teams into an exhausting labyrinth of tooling debates and library choices:
> “Just literally take an input tag and then maybe show another label error message beneath it, it's absolute insanity.”
Teams must choose between Ember, Angular, or React; negotiate whether to fetch data over REST or set up Apollo and GraphQL; configure compilation pipelines like Webpack or whatever bundler is newly fashionable; and reconcile disparate state models across server and client. LiveView is engineered to solve these core interactive needs directly from Elixir, eliminating the sprawling client-side stack while preserving immediate, interactive user feedback.
[18:57](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1137s) The Front-End Complexity Trap vs. Most Real-World Apps
Chris McCord describes the escalating complexity that developers face when building rich front-ends. What starts as wanting a slightly dynamic user experience quickly turns into configuring loaders, Babel, and JSX for React. Then tutorials insist TypeScript is mandatory: suddenly developers find themselves learning an entirely new language and type system just to add an interactive feature around an HTML `<input>` tag they had already written. The cycle escalates further when business stakeholders note that a single-page app (SPA) hurt conversion rates because search engine optimization (SEO) suffered from client-side rendering. The common "fix" is adding a Node.js server between the client and the backend to render server-side HTML and rehydrate data in the browser. McCord characterizes this entire pipeline as excessive for what most products actually require.
```mermaid flowchart TD accTitle: Modern Front-End Complexity Creep accDescr: Diagram tracing the escalating requirements from a simple input tag to a multi-tiered Node SSR architecture.
subgraph ClientNeeds["Original Need"] Input["Static Input Tag"] --> UX["Add Dynamic Interaction"] end
subgraph Toolchain["Tooling Escalation"] UX --> Build["Webpack, Babel, JSX"] Build --> TS["Adopt TypeScript"] end
subgraph BusinessProblems["Architecture Band-Aids"] TS --> SEOLoss["Lost SEO & Conversions"] SEOLoss --> NodeSSR["Node.js Pre-rendering Server"] NodeSSR --> Rehydrate["Client Rehydration Layer"] end ```
McCord clarifies that he has worked on many client applications and is not arguing that JavaScript apps or client-side architectures are inherently bad. Some products—like Google Maps, Google Docs, or the Spotify Web Player where background audio cannot be interrupted across navigation—genuinely demand full client-side SPA architectures. However, the vast majority of applications built over the past decade fall somewhere between a plain HTML page and a desktop-like web app. Developers simply want lively, reactive features without maintaining an unwieldy ecosystem. McCord points out the broader cost: “There's so much complexity here to accomplish the rich user experience that we want and it may be justified in some cases but I think in a lot of cases if we had alternatives we would all be better off for it and better off in team size, team bandwidth, time to market, and just developer sanity.”
- Tooling requirements often spiral from JSX and Babel to entire language shifts like TypeScript just for small UI tweaks. - Server-side rendering (SSR) setups frequently require running a dedicated Node.js middle tier solely to rehydrate DOM state and satisfy SEO demands. - Dedicated client-side SPAs remain necessary for specific application classes (e.g., continuous audio streaming in Spotify, canvas-heavy tools like Google Maps), but represent an edge case rather than the standard web application.
---
[21:16](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1276s) Porting the React Component Model to Phoenix LiveView
To illustrate how to bridge this gap, McCord analyzes React's classic "Hello World" clock example. At its base, React begins with a pure render function that takes data and returns markup—conceptually identical to calling `render/2` in a Phoenix view. What makes React powerful, however, is its stateful component model: components hold state on the client, and whenever that state changes, `render` is invoked automatically to update the UI. McCord explains that in 2013, looking at Elixir’s extreme rendering speed and the BEAM's native affinity for lightweight, stateful, evented server processes, the natural question was: why not move that exact model to the server?
```mermaid flowchart LR accTitle: React vs Phoenix LiveView State Loop accDescr: Comparison of how React manages state on the client versus LiveView managing state inside a BEAM process.
subgraph ReactModel["React (Client-Side)"] RState["Component State"] -->|"setState"| RRender["render()"] RRender --> RDOM["DOM Updates"] end
subgraph LiveViewModel["Phoenix LiveView (Server-Side)"] LVProcess["BEAM GenServer Process"] -->|"handle_info / handle_event"| LVRender["render/1 (EEx / ~L)"] LVRender -->|"WebSocket Diff"| BrowserDOM["Client Browser DOM"] end ```
He presents the React clock tutorial ported directly to Phoenix LiveView with zero omitted dependencies or hidden tricks. Using the `~L` sigil—a feature compiled to regular EEx templates inside Phoenix HTML—the LiveView view defines a pure `render/1` function. Underneath, a stateful BEAM process runs on the server. A recurring timer emits `:tick` via `Process.send_after` or `:timer.send_interval`. When received by `handle_info(:tick, socket)`, the process updates its socket state. Because the state changes, `render` runs automatically, and the resulting HTML is pushed down to the client. Running the demo live in Chrome, McCord inspects the page to highlight that while the server renders the template, a lightweight client diffing engine flashes only the updating `<h2>` element containing the clock.
- LiveView leverages the BEAM’s native strengths: lightweight concurrency, isolated stateful processes, and high-throughput rendering. - The `~L` sigil allows inline EEx templates that compile directly into standard Phoenix rendering structures. - Initial prototypes push the full rendered template HTML over the wire and run an in-browser DOM diff (with plan for fine-grained diffing optimizations in future iterations). - As McCord summarizes the approach: “The conceptual model is the same: the only difference is the UI updates has a little bit of a network hop to go over and a little bit of JavaScript running.”
---
[25:10](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1510s) Client Interactions: Bindings, Event Handlers, and Validations
Pushing periodic server updates is only half the requirement; true rich web applications require interactive user input. McCord demonstrates Phoenix event bindings, which wire client-side interactions directly into the server process. Showing a minimal counter example, he jokes about having to compress the code onto a single slide by omitting `import` statements and collapsing a `use` call into a single line, which provoked a humorous rebuke from José Valim for violating the Elixir code formatter.
In the template, adding client reactivity is as simple as adding standard HTML attributes, such as `phx-click="decrement"` or `phx-click="increment"`. When clicked, the browser dispatches that event name across the WebSocket directly into a `handle_event/3` callback inside the LiveView process. If `handle_event/3` mutates the socket's state, LiveView automatically re-renders the template and pushes the changes back to the client; if the handler leaves state unchanged, no render takes place.
```mermaid flowchart LR accTitle: Phoenix LiveView Event Interaction Cycle accDescr: Flow diagram showing user interaction traveling from client DOM to server handle_event and back to browser DOM.
Browser["Browser: Button Click"] -->|"phx-click event over WS"| HandleEvent["Server: handle_event/3"] HandleEvent -->|"Mutate socket.assigns"| ReRender["Server: render/1"] ReRender -->|"HTML Patch / Diff"| DOMPatch["Browser: Targeted DOM Patch"] ```
McCord demonstrates the counter running live in the browser at `/counter`. Clicking the increment and decrement buttons alters the state instantly inside the underlying GenServer without writing a line of custom client-side JavaScript. He then shows how this pattern solves larger real-world challenges, such as live form validations. Instead of wiring up a client validation framework, an engineer can place a `phx-change="validate"` binding on an existing `form_for` tag. Because `form_for` treats `phx-change` as an arbitrary data attribute, the form needs no custom scaffolding: whenever any input field triggers a change, the client serializes the form data, passes it to the LiveView `handle_event("validate", %{"user" => params}, socket)` clause on the server, runs standard Ecto changeset validations, and reflects inline validation errors immediately back to the user interface.
- Interactive bindings use declarative HTML data attributes like `phx-click` and `phx-change`. - LiveView runs on top of standard Elixir processes: “This thing could be doing anything, it's just a GenServer underneath; it's holding state, it's reacting to events.” - Form validation workflows map directly onto idiomatic Phoenix controller idioms, turning an empty changeset initialized during `mount`/`init` into dynamic, per-keystroke Ecto validations.
[29:00](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1740s) Server-Side Validations and `phx-submit`
Chris McCord explains that instead of the standard controller workflow—evaluating whether an Ecto changeset is valid and choosing which template to render—a LiveView simply places the updated changeset directly into its state. If the state has changed, the template automatically re-renders and the diff is pushed to the client, providing immediate, instant feedback. This eliminates the massive complexity typically required for client-side validations, especially when internationalization comes into play. Shipping Gettext translations to the browser requires deciding on a JSON payload shape, serializing the data, and sending substantial payloads over the wire just to translate validation messages. With LiveView, all of that localized validation logic stays on the server with zero extra effort: “literally this is the only amount of code required to get client-side style validations.”
When persisting data, LiveView introduces another binding called `phx-submit`. Rather than submitting an HTML form via a standard POST request to a traditional controller, the form submits directly back to the active LiveView process. McCord notes that while submitting to a controller is still possible, round-tripping through a separate controller action just to re-render in an error condition wastes work when a stateful process is already running. Handling persistence simply requires adding `phx-submit="save"` and defining a `handle_event("save",...)` callback. While noting that the API is still evolving as they blend controller semantics with stateful paradigms, McCord highlights the productivity gains: “now suddenly the application is ten times more interactive and feature full with potentially less code.”
On a successful save, the callback sets a flash message and redirects directly to another LiveView rather than routing through a controller, allowing traditional controllers to fall away entirely. In the error condition, the model becomes even simpler than standard controller code: instead of branching to manually render an `:edit` or `:new` template with assigned variables, the callback merely updates the socket state with the invalid changeset. Because the template is already rendering against that state, the view updates reactively. McCord envisions a generator like `mix phx.gen.live_view` that produces a fully real-time application in fewer lines of code than the standard `mix phx.gen.html` scaffolding.
```mermaid flowchart TD accTitle: LiveView Form Submission Flow accDescr: Diagram illustrating how phx-change and phx-submit events are handled within the LiveView process instead of routing to an external controller.
subgraph Client["Client Browser"] Input["User Input / Keypress"] Submit["Form Submission"] end
subgraph LiveView["LiveView Process"] Validate["handle_event('validate')<br/>Update Changeset in State"] Save["handle_event('save')<br/>Persist Resource"] Check{"Valid?"} PushDiff["Push Minimal Diff"] Redirect["LiveView Redirect"] end
Input -->|"phx-change"| Validate Validate --> PushDiff PushDiff -->|"DOM Patch"| Client
Submit -->|"phx-submit"| Save Save --> Check Check -->|"Failure"| Validate Check -->|"Success"| Redirect ```
---
[31:53](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=1913s) Live Form Validation and Cross-Tab Real-Time Sync
Moving to a live demonstration, McCord opens a user registration screen (`/users/new`). The rendered output is clean, standard HTML delivered on the initial HTTP request, backed by a persistent server process listening for validation events over a WebSocket connection. Because browser input fields emit change events on keypress, typing triggers instantaneous server-side validation. Typing the name "José" produces an immediate inline error—"must be letters and numbers"—which updates in real time without refreshing the page. McCord recalls demonstrating the feature across continents: “and it was like indistinguishable from a local JavaScript application even from my laptop Wi-Fi away Nick hop to José.” As soon as an email address or phone number becomes valid, the error indicator vanishes without extra client-side tooling.
McCord demonstrates cross-client reactivity by opening a second browser tab displaying a full CRUD user index view generated with standard EEx. When he saves the new user in the registration form, the user immediately registers, a flash message appears, and the user index view in the adjacent tab dynamically updates with the new record.
He then navigates to an edit screen to change the user's name from "José" to "José Valim." Saving the edit updates the user list in the adjacent browser tab instantly. To test deletion, McCord jokes about José trolling him too much and needing a "perma-ban," and clicks delete. The open user page immediately redirects while displaying a flash message stating the user has been removed, demonstrating coordinated real-time state across views with zero custom JavaScript.
---
[35:05](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2105s) Real-Time Updates via Phoenix PubSub and Contexts
McCord reveals the implementation behind the live show view, showing that the entire real-time experience requires fewer than twenty lines of code. The view subscribes via Phoenix PubSub through an `Accounts` context to receive notifications whenever a user is modified or deleted.
```elixir def handle_info({:user_updated, user}, socket) do {:noreply, assign(socket,:user, Accounts.get_user!(user.id))} end
def handle_info({:user_deleted, _user}, socket) do {:noreply, socket |> put_flash(:info, "User deleted.") |> redirect(to: Routes.live_path(socket, UserIndexView))} end ```
Whenever the view receives a `:user_updated` message, it handles the event by refreshing the socket data. While broadcasting updated payloads directly is viable, the demo naively refetches from the database. McCord points out the architectural implications: if thousands of concurrent users view the same record, refetching on every update could quickly overwhelm the database. He mentions ongoing discussions with Ben Wilson from the Absinthe project about applying DataLoader batching techniques and Absinthe subscription patterns to mitigate query load in LiveView architectures. When a `:user_deleted` message arrives, the process sets a flash message and redirects, terminating the view:
> “the model of this real-time application is like I said simpler than for me then the actual CRUD HTML that we generate it's like fewer files fewer conceptual leaps and you get this real-time experience that is insane in my opinion”
---
[36:47](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2207s) Exploring Boundaries and Phoenix Presence Without JavaScript
McCord addresses the boundaries and constraints of server-driven UI, acknowledging that the Phoenix team is still discovering where the paradigm works best and where it reaches its limits. LiveView excels at scoped, rich UI interactions: real-time form validation, background job progress indicators, and live operational dashboards receiving server-pushed stats. For full-blown client applications like complex chat systems, McCord remains cautious, stating that they need to explore the architecture further before declaring it a complete solution for high-frequency client state. The team's approach is to start with simpler use cases that the server can solve cleanly, identifying exactly when developers should bite the bullet and adopt client-side frameworks, though McCord believes: “I think we can go a lot further than most people think.”
To demonstrate the extent of what is possible, McCord revisits Phoenix Presence. In Phoenix 1.3, the Presence JavaScript API was purely functional, which inadvertently introduced race conditions when client state shifted mid-sync. Phoenix later revised the JavaScript client to a stateful API, significantly reducing client boilerplate and resolving the timing issue. However, LiveView eliminates the client code altogether. By backing the LiveView with Phoenix Presence on the server, active users appear and disappear from the page in real time across browser tabs with zero custom JavaScript written by the developer.
- **Primary LiveView sweet spots:** Inline form validation, multi-step wizards, background task progress meters, and dynamic server-driven dashboards. - **Under evaluation:** High-frequency, heavy-state interactions like full-scale chat interfaces and highly asynchronous offline-first clients. - **Phoenix Presence integration:** Eliminates custom client tracking code by maintaining presence collections entirely within the server-side LiveView process.
[38:59](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2339s) Live Presence Tracking Without Client-Side Code
Chris McCord demonstrates a real-time presence tracking feature built entirely without JavaScript. In the template, the code simply iterates over a list of users with a standard `for user <- @users` comprehension. When he opens a second browser tab, the UI instantaneously reflects that the user is now connected across two tabs. Closing one tab drops the count back to one, and closing that tab removes the user from the screen entirely. The interface responds with the same immediacy expected from a dedicated client-side JavaScript application, yet every change is driven by server-side rendering over standard Phoenix Channels subscriptions.
```mermaid flowchart LR accTitle: Phoenix Presence Live View Data Flow accDescr: Browser tabs connect to the LiveView process, which subscribes to Presence topics and diffs state to the DOM. subgraph Clients["Browser Clients"] T1["Tab 1"] T2["Tab 2"] end subgraph Server["Server Runtime"] LV["Phoenix LiveView Process"] PT["Phoenix.Tracker / Presence"] end T1 <-->|"WebSocket"| LV T2 <-->|"WebSocket"| LV LV <-->|"track & subscribe"| PT PT -->|"presence_diff event"| LV LV -->|"Morphdom HTML patch"| T1 ```
McCord candidly admits to cutting corners in this early prototype. Phoenix Tracker and Phoenix Presence were originally architected around client-side libraries that reconcile replicated presence events directly in JavaScript. Because an equivalent client for pure server-rendered Elixir state had never been necessary before LiveView, McCord took a temporary shortcut: on any presence state change, the server simply refetches and re-renders the complete list of presences. While this unoptimized approach is unsuitable for high-volume production deployments, he confirms the team will build a dedicated client abstraction to handle presence event stitching cleanly on the BEAM.
> “So in a few lines of server code I have Phoenix Presence features on a server rendered application which is kind of ridiculous.”
- Demonstrates instant multi-device presence tracking with zero custom JavaScript written. - Initial implementation naively refreshes the full presence list on each state change because no Elixir-side data-stitching client existed previously. - Underneath, LiveView leverages `Phoenix.Tracker` and standard PubSub subscriptions.
---
[40:41](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2441s) The Absurd 60 FPS Rainbow Animation Stress Test
Addressing the inevitable question of whether server-side rendering can realistically scale, McCord notes that rendering on the server will inherently burn more CPU cycles than offloading presentation logic to the user's browser. However, the performance characteristics of Elixir and the BEAM make the trade-off viable. To prove just how fast server rendering can be, he presents a stress-test demo conceived with José Valim.
While researching client-side DOM diffing tools, Valim came across Marko.js—a UI library written by the authors of morphdom. Marko’s marketing demo showcased a silky-smooth, 60-frame-per-second rainbow animation that did not rely on CSS animations or hardware acceleration. Instead, it continuously re-rendered 85 `<div>` tags at 60 FPS, calculating hue, rotation, and transform styles purely in JavaScript templates. Valim challenged McCord to port the entire benchmark into an Elixir LiveView.
```mermaid flowchart TD accTitle: 60 FPS Server Render Loop accDescr: A recursive 16ms timer triggers LiveView re-renders that stream JSON-encoded HTML diffs to the browser. Timer["Process Timer (:timer.send_interval 16ms)"] -->|"tick"| LV["LiveView Process"] LV -->|"Ported math calculations"| State["Update hue & CSS transform"] State -->|"render/1"| HTML["85 <div> tags generated"] HTML -->|"JSON over WebSocket"| Browser["Client (morphdom diff & patch)"] Browser -->|"phoenix-click"| LV ```
McCord ported the math and trigonometry routines directly into Elixir and configured a server process to send itself an `:update` message every 16.6 milliseconds using `:timer.send_interval`. On every tick, the LiveView updates its internal state, re-renders all 85 dynamic elements, and pushes the diff across the WebSocket to the browser. To their astonishment, the animation rendered smoothly at 60 FPS directly from the server. Furthermore, adding interactivity—reversing the rotation direction via a `phx-click="switch"` binding—required only three additional lines of code to multiply the animation step by `-1`.
> “I’m not saying use this for animations, but can it scale? Yes, it can scale, like it’s absurd, but that this worked.”
- Ported directly from a Marko.js marketing benchmark built by the creators of morphdom. - The server computes math and style transforms across 85 dynamic `<div>` tags every 16.6 milliseconds. - Currently unoptimized: converts I/O data to an intermediate binary before JSON serialization, leaving significant room for performance improvements. - Reversing animation direction dynamically on user click required only three lines of Elixir.
---
[45:35](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2735s) Trade-offs, Pragmatism, and Productivity
While optimistic about LiveView's potential, McCord tempers expectations and emphasizes that server-driven UI is not a universal replacement for JavaScript frameworks. Single-page application (SPA) architectures remain essential for applications requiring offline capability, desktop-like native device integrations, or complex interfaces that demand zero-latency optimistic UI updates. High-latency edge connections will inherently feel slower if every minor micro-interaction must traverse the network back to the BEAM.
```mermaid flowchart TD accTitle: Architecture Selection Guide accDescr: Decision tree outlining when to choose client-side JavaScript frameworks versus Phoenix LiveView. Decision{"App Requirements?"} Decision -->|"Offline support / zero-latency optimistic UI"| Client["Client-Side SPA (React, Vue, Ember)"] Decision -->|"Standard CRUD / Real-time forms / Rapid time-to-market"| Live["Phoenix LiveView"] Live --> Win1["~60 lines of client JS"] Live --> Win2["Native SEO without hydration"] Live --> Win3["Seconds to build vs days"] ```
At the same time, McCord argues that the vast majority of web applications operate on standard client-server patterns where users naturally submit forms and await responses. In these scenarios, LiveView offers unmatched developer velocity. Form validations that might take hours or days to wire up across client-side state managers, REST endpoints, and schema validators can be built in thirty seconds using standard Elixir code. Additionally, shipping roughly 60 lines of client-side integration JavaScript avoids multi-megabyte bundle downloads, delivering near-instant initial page loads and effortless search engine optimization out of the box.
> “If you want like great productivity or a great time to market, I think we’re going to be unbeatable in that regard.”
- Not suitable for offline-first applications or environments demanding client-side optimistic UI updates. - Radically improves time to market by eliminating redundant client/server state orchestration and schema duplication. - Extremely lightweight client footprint: initial prototype required only ~60 lines of client-side glue JavaScript. - Automatic SEO compatibility, as the initial request returns standard server-rendered HTML before establishing the WebSocket connection.
---
[48:18](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2898s) Rendering in Microseconds
McCord highlights that LiveView is made practical by Phoenix's ability to render templates in microseconds rather than milliseconds. He credits core team member Jason Stiebs for introducing the microsecond (`µs`) unit into Phoenix's console logging. Prior to that change, rendering durations would display as awkward fractional milliseconds like `0.4ms`.
Displaying render times explicitly in microseconds became a standout marketing asset for the framework, consistently astonishing developers outside the ecosystem and underscoring the raw rendering speed that enables LiveView to push continuous server diffs without degrading system performance.
> “Jason on the Phoenix core team was the one that actually added the microsecond character... and I think this is like the gift that keeps on giving, because people see this like, ‘What’s this micro character?’ and they’re like, ‘Oh my god.’”
- Phoenix template rendering times are measured and logged in microseconds (`µs`). - Introduced by Jason Stiebs to replace awkward sub-millisecond representations like `0.4ms`. - Sub-millisecond execution speeds serve as the foundational bedrock enabling real-time server diff streaming.
[48:59](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=2939s) Performance Beyond Bragging Rights and Advancing the State of the Art
Chris McCord tackles the skepticism surrounding microsecond-level response times, acknowledging the counterargument that end users cannot perceive the difference between a page responding in 40 milliseconds versus 400 microseconds. While he admits that raw speed can serve as a convenient marketing badge, he insists it has to be about something deeper than mere boasting. Reflecting on a blog post that compared web framework performance—specifically Ruby versus Elixir—McCord notes that he actually agreed with their premise questioning whether a web application could simply be "fast enough" for the types of apps built over the past decade. If developers are merely building traditional applications, user-perceived speed differences at that scale are negligible.
However, McCord sharply distinguishes between legacy paradigms and pushing the frontier forward. When choosing a programming language or web framework, high performance and low overhead become pivotal because they unlock entirely new architectural models that were previously impractical. By leveraging a high-performance, concurrent platform, development teams can deliver richer real-time features, iterate faster than market competitors, and expand developer productivity. McCord summarizes this imperative directly: “If we're trying to build applications that we've always built then it doesn't matter, but if we want to advance the state of the art, if we want to beat other competitors to market, produce features faster than them, then absolutely the choice of framework based on performance is critical.”
```mermaid flowchart TD accTitle: Performance Impact on Web Development Paradigms accDescr: Contrasts traditional web applications with advanced real-time platforms.
subgraph Legacy["Traditional Web Paradigms"] direction TB A["Standard Web Request"] -->|"40 ms vs 400 µs"| B["Negligible User Impact"] B --> C["Performance Treated as Mere Bragging Rights"] end
subgraph Modern["Next-Gen State of the Art"] direction TB D["High-Throughput Elixir / BEAM Core"] --> E["Eliminates Architectural Overhead"] E --> F["Enables Rich Real-Time Models (LiveView)"] F --> G["Faster Time-to-Market & Competitive Edge"] end ```
[50:56](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=3056s) "The Future Is Yours to Build"
Building on José Valim's opening keynote remark that "the future is in your hands" regarding Elixir adoption and core evolution, McCord adds his own rallying cry: the future is yours to build. With the BEAM and Phoenix, developers have an environment capable of achieving things fundamentally out of reach for other runtimes. He challenges the audience to reject the status quo of modern web development and consider what is now possible across the entire spectrum of Elixir tooling.
As a primary example, McCord highlights Nerves and IoT deployments. Referencing an earlier presentation by Justin Schneck, he describes how connected hardware devices running in the field communicate back to Phoenix servers over Phoenix Channels, updating their firmware on the fly simply by receiving a backend message: “Justin gave uses Phoenix Channels on the server, and it completely blew my mind that we were able to have devices just update their firmware based on getting a message from a server on the backend.” Expanding into these diverse environments proves that the BEAM ecosystem is poised to disrupt multiple markets if the community actively embraces building ambitious software.
[52:16](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=3136s) Q&A: Client vs. Server State and Durability in LiveView
Opening the floor to questions, McCord fields an inquiry regarding client-side state handling and durability, using a multi-step form wizard as an example. When a user progresses through steps, the questioner asks what happens if a network interruption occurs, the server process crashes, or the user leaves the page. McCord points out that in LiveView, state is kept strictly on the server. To avoid race conditions and complex debouncing issues caused by network latency, event bindings like `phx-change` and `phx-submit` serialize and transmit the whole form rather than just a single delta value.
Regarding state durability, McCord notes that there is no magic mechanism built directly into LiveView; rather, each connection is an ordinary, stateful Elixir process. Developers can apply the same persistence patterns they would use in standard controller-based architectures or GenServers. For long-running flows like wizards, developers can: - Persist the serialized form state to the database on every valid step advance (e.g., clicking "Next"). - Periodically dump process state to a datastore every few seconds. - Rehydrate the state when the user returns or reconnects, mirroring conventional transactional endpoints.
[54:54](https://www.youtube.com/watch?v=Z2DU0qLfPIY&t=3294s) Q&A: Broadcast Coalescing, Release Timeline, and Multi-Node Deployments
The discussion shifts to performance optimization when many clients view identical dynamic content simultaneously. An audience member asks whether LiveView can coalesce rendering when hundreds of users view the exact same HTML fragment. McCord acknowledges that in early iterations, each client renders independently, but points to Phoenix Channels' existing "fast-laning" architecture as a proven blueprint. In standard Phoenix Channels, JSON payloads broadcast to thousands of connected chat users are encoded a single time rather than once per recipient, unless explicitly intercepted for customization. A comparable optimization pattern is planned for template fragments in LiveView.
An attendee then asks when LiveView will be publicly available. McCord replies that it will arrive soon because it is maintained outside of Phoenix core, allowing him to push early `0.0.1` preview releases and iterate rapidly without waiting on Phoenix framework release cycles. He jokingly cautions the audience: “I need to get Phoenix 1.4 out first, so don't let me focus on something else and then I can just claim like, 'Oh, well I promised it would be out in two weeks so I can't release Phoenix.'” He cautions that early adopters should expect significant changes to the public API and interfaces.
```mermaid flowchart LR accTitle: Distributed Multi-Node LiveView Architecture accDescr: Shows how a load balancer, distributed Erlang, and Phoenix PubSub route a client WebSocket to a server PID.
User["Client Browser"] -->|"WebSocket Connection"| LB["Load Balancer"] LB --> NodeA["Phoenix Node A"]
subgraph Cluster["Distributed Erlang Cluster"] NodeA <-->|"Phoenix PubSub"| NodeB["Phoenix Node B (LiveView PID)"] end
User -.->|"Serialized PID Token"| NodeB ```
Addressing a final technical question about routing sessions across multiple servers behind a load balancer, McCord explains that LiveView works seamlessly across clusters. Because client connections use WebSockets, load balancers maintain sticky connections per socket. Furthermore, Phoenix PubSub is inherently distributed across BEAM nodes, and the client holds a serialized token referencing its corresponding process identifier (`pid`) on the server. If distributed Erlang is configured across the cluster, cross-node communication operates automatically without requiring custom session stickiness hacks from developers.
McCord wraps up the session by clarifying a conference discount code question (noting that the code applies to The Pragmatic Bookshelf site rather than Amazon), directs attendees to find him for follow-up questions, and hands the stage over to conference organizer Jim Freeze.
## Mentioned Chris McCord, José Valim, Jason Stiebs, Justin Schneck, Ben Wilson, Jim Freeze, DockYard, Plataformatec, Erlang Solutions, The Pragmatic Bookshelf, Phoenix, Phoenix LiveView, Phoenix Channels, Phoenix Presence, Phoenix PubSub, Telemetry, Ecto, Plug, Absinthe, Nerves, Sync, React, Marko.js, morphdom, Ember, Angular, TypeScript, Webpack, Babel, Ruby on Rails, StatsD, Prometheus, New Relic, Programming Phoenix
[Source](https://www.youtube.com/watch?v=Z2DU0qLfPIY)