37signals Debuts Lexxy to Replace Trix as Default Rails Text Editor

Lexxy: a new text editor for Action Text - Jorge Manrubia Díez — Ruby on Rails

Ruby on Rails

Built on Meta's open-source Lexical engine after rejecting venture-backed rivals, Lexxy resolves a decade of browser contenteditable breakages to become the new standard editor for Ruby on Rails.

AI-assisted summary of Lexxy: a new text editor for Action Text - Jorge Manrubia Díez — original source. Check the original for full context.

Source published:

Key ideas

  • 37signals introduced Lexxy 1.0, an open-source rich text editor designed to replace Trix as the official default editor for Action Text in Ruby on Rails. (27:49)
  • Trix's flat document model inherently blocked nested elements like tables, driving 37signals to adopt Meta's dependency-free Lexical framework and its virtual DOM reconciliation model. (0:06)
  • Lexxy adds roughly 13,000 lines of vanilla JavaScript on top of Lexical, delivering sub-50-millisecond keystroke responsiveness and native Action Text canonical HTML storage. (11:44)
  • The team scaled bug fixing by running 10 to 15 concurrent AI agents on Playwright-based test suites, paired with an automated PR validation agent that cleared a 300-card backlog. (25:17)

Detailed notes

## Background Published on YouTube by the Ruby on Rails channel on October 1, 2026, this talk features Jorge Manrubia Díez of 37signals presenting at Rails World 2026. The description notes that Jorge introduces Lexxy, the company's new open-source rich text editor for Action Text, and details the reasons and engineering journey behind its development.

## TL;DR Addressing the structural limitations of Trix's flat document model and the persistent instability of browser contenteditable implementations, 37signals built Lexxy on top of Meta's Lexical framework. The presentation walks through the editor's architectural foundation, its deep accessibility work, and its seamless adapter integration with Action Text in Rails. Jorge also outlines how adopting Playwright enabled the team to deploy swarms of parallel Claude AI agents with automated verification pipelines to clear a 300-bug backlog. The talk culminates in the announcement of Lexxy 1.0, positioned as a frictionless upgrade and the slated default editor for Rails.

## Atmosphere & style The presentation carries an earnest, technically lucid keynote vibe that blends pragmatic software craftsmanship with palpable excitement for modern AI-augmented workflows. Jorge candidly recounts years of frustration navigating browser updates, failed prototypes, and architectural dead ends before shifting into an exhilarating breakdown of team breakthroughs and parallel agent execution. It feels both celebratory and grounded, moving from an honest post-mortem of past pain points to a triumphant, confident rollout of a major Rails ecosystem milestone.

## Bulletin - [27:49](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1669s) 37signals introduced Lexxy 1.0, an open-source rich text editor designed to replace Trix as the official default editor for Action Text in Ruby on Rails. - [00:06](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=6s) Trix's flat document model inherently blocked nested elements like tables, driving 37signals to adopt Meta's dependency-free Lexical framework and its virtual DOM reconciliation model. - [11:44](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=704s) Lexxy adds roughly 13,000 lines of vanilla JavaScript on top of Lexical, delivering sub-50-millisecond keystroke responsiveness and native Action Text canonical HTML storage. - [25:17](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1517s) The team scaled bug fixing by running 10 to 15 concurrent AI agents on Playwright-based test suites, paired with an automated PR validation agent that cleared a 300-card backlog.

## Key takeaways - [00:06](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=6s) Trix relies on a flat list of text blocks with metadata labels, making hierarchical structures like tables architecturally impossible to represent. - [03:29](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=209s) Frequent mobile OS and browser updates break contenteditable implementations, prompting an internal 'code red' at 37signals after a 2024 iOS update broke Trix. - [06:33](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=393s) 37signals rejected VC-backed editor alternatives like TipTap to prevent future risks of paywalled features or restrictive commercial licensing, choosing Meta's Lexical instead. - [06:33](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=393s) Lexical decouples state from the browser DOM by treating contenteditable as an I/O surface and managing updates via immutable snapshots and a reconciler. - [11:44](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=704s) Building Lexxy required writing around 13,000 lines of vanilla JavaScript to manage complex edge cases such as Microsoft Word clipboard pasting and multi-image caret placement. - [12:39](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=759s) Lexxy followed an accelerated timeline from its first pull request in May 2025 to production deployment in Fizzy in December 2025 and Basecamp 5 in May 2026. - [15:00](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=900s) Lexxy natively supports tables, Prism-based code syntax highlighting for over 20 languages, markdown formatting, attachment previews, and customizable prompt APIs. - [15:00](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=900s) A clean Action Text adapter architecture introduced in Rails 8.2 decouples rich text storage from specific frontend editors while preserving canonical attachment formats. - [19:02](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1142s) Accessibility was prioritized through deep keyboard navigation support, focus management, and Alt+F10 toolbar toggles developed in collaboration with blind Rails programmer Bruno Prito. - [25:17](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1517s) Migrating editor tests from Capybara to Playwright provided low-level keyboard and focus primitives that enabled AI coding agents to write reliable browser tests. - [25:17](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1517s) Jorge orchestrated 10 to 15 concurrent Claude agents working simultaneously to clear a backlog of nearly 300 reactive bug reports and polish cards. - [26:34](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1594s) A custom validation agent evaluated PRs by reproducing bugs against production and confirming fixes locally, attaching a 'validated' label to streamline human review. - [27:49](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1669s) Lexxy 1.0 is set to become the standard editor in Ruby on Rails, providing an essentially seamless migration path for legacy Trix applications.

## Detailed walkthrough ### [00:06](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=6s) Introducing Lexxy and the Limits of Trix

Jorge Manrubia Díez introduces Lexxy, a brand-new open-source rich text editor created and released by 37signals. To contextualize why the company built Lexxy, Jorge steps back to examine Trix, the editor 37signals released in 2015 that later shipped as the default editor bundled with Action Text in Rails 6. Trix is battle-tested, robust, and served millions of users reliably for over a decade. However, in recent years, 37signals felt Trix began falling short of evolving product requirements. Customers routinely requested features—most notably tables inside Basecamp—that the engineering team struggled or outright failed to implement.

```mermaid flowchart TD accTitle: Trix Flat Document Model Limitation accDescr: Demonstrates how Trix flattens nested elements into sequential blocks with label attributes.

subgraph UserView["Rendered HTML View"] Blockquote["Blockquote container"] Bullet["Nested Bullet Item"] Blockquote --> Bullet end

subgraph TrixModel["Internal Trix Model (Flat)"] B1["Block 1: Text chunk + [blockquote]"] B2["Block 2: Text chunk + [blockquote, bullet]"] B1 --> B2 end ```

The root cause of these limitations lies in Trix’s internal document model. Trix models rich text as a strictly flat list of blocks, where each block is a text fragment annotated with metadata labels. If a user intends to display a bulleted item nested within a blockquote, Trix does not store a nested hierarchy; instead, it stores one block tagged with a blockquote attribute, immediately followed by another block tagged with both blockquote and bullet attributes. Trix only reconstructs the visual nesting at rendering time. While this flat structure delivers significant advantages—document cursor positions can be modeled with just two numbers, and clean HTML is practically guaranteed—it makes hierarchical structures like tables fundamentally impossible to represent, as tables require nested structures where rows contain cells, and cells hold arbitrary HTML.

- Trix was released in 2015 and bundled with Action Text in Rails 6. - Trix uses a flat list of text blocks with attribute labels rather than a hierarchical node tree. - Cursor positions in Trix require only two integers to represent, keeping serialization straightforward. - True nesting (such as table rows holding cells with nested markup) cannot be expressed inside Trix's flat block model.

[03:29](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=209s) The Contenteditable Nightmare and the Chronology of Spikes

Beyond document model limits, maintaining a modern text editor on the web presents an ongoing engineering struggle against `contenteditable`. Jorge characterizes `contenteditable` as profoundly unstable ground: it behaves inconsistently across different browsers and frequently breaks when underlying operating systems update. In 2024, a succession of iOS update releases broke Trix's handling of autocompletion, dictation, and cursor positioning. When the 37signals team discovered on an early iOS beta that Trix was completely broken, it triggered an internal "code red" to avert widespread breakage across their production apps before the official mobile OS release.

The pursuit of an alternative had been ongoing across multiple iterations:

- **2022:** 37signals spent one to two weeks spiking table support inside Trix, ultimately abandoning the effort after confirming the flat document model made an appealing implementation impossible. - **2023:** Jorge explored an integration spike with TipTap inside HEY to solve incoming and outgoing email formatting, but the team set it aside due to the sheer complexity of arbitrary email formatting. - **2024:** 37signals launched Writebook featuring HouseMD, a "what you see is what you mean" Markdown editor rather than a WYSIWYG editor. While HouseMD was well-suited for long-form books and documentation, early 2025 experiments proved it was not the right fit for mainstream, general-purpose productivity tools where users expect a true WYSIWYG experience.

[06:33](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=393s) Rejecting VC-Backed Open Source and Finding Meta's Lexical

In early 2025, Brian Baily (Head of Product Strategy at 37signals) reopened the strategic discussion around replacing Trix. While TipTap resurfaced as a candidate, David Heinemeier Hansson (DHH) and the team firmly rejected it due to governance and business model risks. They refused to rely on an open-source project backed by venture capital, where business tension often leads to moving open-source features behind proprietary paywalls or gating critical security patches behind commercial licenses—an open-source model failure 37signals had experienced previously with Chef.

```mermaid flowchart LR accTitle: Lexical Document Architecture accDescr: Lexical treats contenteditable as I/O while maintaining an immutable internal snapshot resolved by a reconciler.

subgraph InputOutput["Browser DOM Layer"] CE["contenteditable (I/O & render surface only)"] end

subgraph LexicalCore["Lexical Core Engine"] State["Immutable Document Snapshots"] Reconciler["Reconciler (Virtual-DOM style diff)"] Cmds["Command Bus"] Trans["Node Transformers"] end

CE -->|"User event"| Cmds Cmds -->|"Dispatches update"| State State -->|"Snapshot diff"| Reconciler Reconciler -->|"Patches minimal mutations"| CE ```

Later in 2025, the team evaluated Lexical, an open-source rich text framework developed by Meta, and immediately adopted it as their foundational framework. Lexical features an ultra-lean core with zero third-party dependencies. Like Trix a decade before, Lexical treats `contenteditable` strictly as an input/output rendering surface rather than the source of truth. Internal document state is modeled as immutable snapshots. Changes are calculated via an internal reconciler—similar to the virtual DOM approach popularized by React—which applies minimal, optimized updates directly to the browser DOM. The core engine is complemented by an internal command event bus and transform hooks, with extended capabilities (rich text formatting, markdown shortcuts, tables, clipboard handling) packaged as modular satellite libraries.

- Meta powers high-volume flagship apps like WhatsApp and Instagram on Lexical, ensuring device-level keyboard and mobile OS bugs are surfaced and resolved before affecting downstream adopters. - Meta's incentives align with keeping Lexical fully open and robust without needing to monetize the editing framework itself via dual-licensing or paid enterprise add-ons. - Lexical's immutable snapshots and virtual DOM-like reconciler prevent browser-induced state corruption.

[11:44](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=704s) The Reality of Building Lexxy on Lexical

Initial assumptions that 37signals could simply assemble Lexical’s existing modules, wrap them in a custom toolbar, and ship the product quickly proved overly optimistic. Crafting a polished, resilient editing experience required managing immense edge-case complexity. Rich text editors represent an extraordinarily volatile state space where document states undergo permutations in countless directions multiple times per second. Delivering the final polished experience demanded writing roughly 13,000 lines of vanilla JavaScript directly on top of Lexical's foundation, which together form the Lexxy codebase.

[12:39](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=759s) Technical Hurdles and Development Timeline

The engineering complexities of building a robust rich text editor are immense, involving tricky edge cases like managing cursor blinking between two adjacent images when DOM space is tight, or handling messy copy-and-paste inputs from applications like Microsoft Word that use non-standard markup. Jorge Manrubia outlines the key release milestones for Lexxy: development kicked off with a first pull request in May 2025, followed by the first real-world customer usage in the "Fizzy" app in December 2025, and a broader rollout in May 2026 with Basecamp 5.

Jorge expresses deep gratitude to team members Sultan Hotsu and Sam Pesher at 37signals, who took a very green prototype of Lexxy and handled the immense complexity of building features, fixing countless bugs, and polishing it for release in Basecamp 5. Rather than settling for a "Trix with tables," the team aimed high, leveraging the power of the Lexical editing framework combined with AI agents as productivity multipliers to deliver the full package: speed, accessibility, security, documentation, extensibility, and rich configuration APIs.

- **May 2025:** First pull request for Lexxy. - **December 2025:** First production usage with Fizzy. - **May 2026:** Widespread adoption with Basecamp 5. - **Key Contributors:** Sultan Hotsu and Sam Pesher.

---

[15:00](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=900s) Feature Tour and Action Text Integration

Lexxy packs a comprehensive set of features, including a color highlighter (previously proprietary to Basecamp in Trix), beautifully designed tables, Markdown syntax support, and real-time code highlighting for over 20 languages powered by Prism. It also supports image galleries with vastly improved drag-and-drop and keyboard handling, automatic URL link creation, attachment previews for PDFs and movies, and a powerful prompt API for features like emoji pickers and company user mentions.

A crucial architectural achievement is Lexxy's integration with Action Text. Action Text uses a normalized canonical HTML storage format for attachments (like image galleries, file attachments, and custom mentions) that remains independent of any specific editor. While Trix required cumbersome back-and-forth conversions, Lexxy leverages Lexical's customization capabilities to natively manage this canonical format. Furthermore, the team created a clean adapter architecture in Rails (landing in Rails 8.2 and already in the main branch) that allows different editors to plug into Action Text. Jorge credits Sean Doyle from ThoughtBot for picking up an early pull request for this adapter and driving it across the finish line.

---

[19:02](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1142s) Extensibility, Performance, and Accessibility

Lexxy is built to be fully extendable via a robust API that exposes Lexical's underlying extension capabilities, allowing developers to define new node types, create custom commands, and add toolbar buttons. Battle-tested across roughly 10 internal extensions in Lexxy and another 9 or 10 in Basecamp, this architecture powers complex proprietary features like Basecamp's voice notes. Performance-wise, Lexxy stays well under the crucial 50-millisecond threshold from keypress to UI update, rendering it vastly more responsive than Trix.

Accessibility was treated as a top-tier priority, spearheaded by Michael Dallesio (QA team lead and accessibility champion) alongside Bruno Prito—an outstanding Rails and frontend programmer who is blind. Drawing on his lived experience suffering through inaccessible editors, Bruno ensured Lexxy generates impeccably structured, accessible HTML with robust keyboard support, focus management, and specialized conventions like `Alt+F10` to effortlessly toggle between the editor and specific toolbars or sort images using arrow keys. Security was similarly rigorous, enlisting experts Jeremy Dailey and Mike Dallesio to implement dedicated DOMPurify sanitization, URL sanitization, and strict node-type controls against modern AI-discovered vulnerabilities.

- **Performance Threshold:** Under 50 milliseconds response time. - **Accessibility Champions:** Michael Dallesio and Bruno Prito. - **Security Experts:** Jeremy Dailey and Mike Dallesio.

---

[23:47](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1427s) Building with AI Agents and Testing Evolution

Reflecting on the development process, Jorge shares that Lexxy was the first major project where he built everything from scratch using Claude, noting that like every developer in 2025, he was utterly blown away by the productivity multiplier of AI agents. His testing strategy evolved during the build: he started with Capybara for system tests to exercise Action Text boundaries and server payloads, but eventually introduced Playwright into the suite. While Capybara remained anchored to server-side tests, Playwright provided superior cross-browser testing robustness for intricate text-editing interactions.

- **AI Integration:** Built from scratch leveraging Claude as an agentic coding assistant. - **Testing Stack:** Capybara for server-side Action Text payload tests; Playwright for cross-browser text-editing interactions.

<FollowUp label="Want to know more about how Bruno Prito and the team implemented keyboard accessibility features in Lexxy?" query="Explain how Bruno Prito and the 37signals team implemented keyboard accessibility and focus management in Lexxy."/>

[25:17](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1517s) Migrating to Playwright and Scaling Bug Fixes with Claude

Switching the test suite over to Playwright marked a dramatic turning point for automated development on Lexxy. Jorge admits that the shift felt almost miraculous when combined with AI agents: "it was wonderful for Claude. It was like if Claude was saying, 'finally!' like it blossomed." The core reason Playwright unlocked such high agent performance was its robust set of low-level browser primitives, especially around keyboard management and focus handling. Writing tests for a rich text editor is notoriously fiddly and error-prone, but with Playwright, Claude and automated agents genuinely shined, making the migration easily the single best decision of the entire project from an AI agent tooling perspective.

Armed with this testing foundation, Jorge experimented for the first time with deploying massive concurrency—orchestrating 10 to 15 autonomous agents working on bug fixes simultaneously. After the initial release and leading up to Basecamp, the team had amassed a queue of roughly 300 bug reports, polish tasks, and general cards. None of these were major new feature designs; they represented the intense, reactive stabilization work required to get Lexxy production-ready across edge cases. Watching swarms of parallel agents churn through this mountain of polish proved both exhilarating and transformative for the team's velocity.

- Playwright provided the low-level focus and keyboard manipulation primitives that AI agents needed to reliably script rich text editor tests. - 10 to 15 agents were deployed in parallel to tackle reactive polish and edge-case fixes. - The team cleared an accumulated backlog of nearly 300 bug cards leading into Basecamp.

---

[26:34](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1594s) Automated PR Verification Workflows with AI Agents

Running massive batches of parallel agents immediately exposed a downstream bottleneck: how does a human maintain code quality and review so many pull requests without drowning? To solve this, the team turned agents back onto the review process itself by creating a dedicated verification skill. When an agent opens a pull request for a bug fix or user-facing change, a validation agent spins up with a completely clean context window. It executes a test script against the Lexxy production sandbox on the homepage to confirm the bug actually exists in production, runs the exact same reproduction steps against the local branch with the proposed fix, and checks whether the issue is resolved.

If both conditions pass—reproduced in production, fixed locally—the validation agent applies an automated `validated` label to the pull request on GitHub. This visual signal fundamentally alters the mental load of code review. When an engineer sits down to review a queue of 15 incoming pull requests and sees that 11 of them already carry the `validated` badge with reproducible before-and-after proof, they can review and merge the changes at unprecedented speed.

```mermaid flowchart TD accTitle: Automated PR Verification Workflow accDescr: Flowchart illustrating how an AI agent validates bug fix pull requests against production and local environments before labeling.

subgraph Evaluation ["Evaluation in Fresh Context"] A["Agent submits PR"] --> B["Validation Skill initialized"] B --> C["Reproduce bug on production sandbox"] C --> D["Run same test script on local fix branch"] end

subgraph Verification ["Result & Triage"] D -->|Both checks pass| E["Apply 'validated' label to PR"] D -->|Fails check| F["Flag for developer investigation"] E --> G["Accelerated human review and merge"] end ```

- A custom skill launches with clean context to independently reproduce the issue against the live production sandbox. - The same verification script runs against the local branch containing the proposed patch. - Successful verification automatically marks the PR as `validated`, allowing reviewers to breeze through the majority of pull requests with high confidence.

---

[27:49](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1669s) Announcing Lexxy 1.0 and the Future of Action Text

Jorge officially announces the release of Lexxy version 1.0 on stage at Rails World. While the editor has already enjoyed stability in real-world usage for several months, the team deliberately saved the milestone 1.0 version number for this presentation. Crucially, Lexxy is slated to become the official default rich text editor in Ruby on Rails, replacing Trix for Action Text applications.

For developers building greenfield Rails applications today, Jorge strongly recommends starting immediately with Lexxy, calling it "absolutely the future." For teams maintaining legacy applications powered by Trix, the transition is designed to be remarkably frictionless. Unless an application relies on intricate custom patches or deeply coupled extensions to Trix's internal architecture, upgrading to Lexxy should be completely seamless—the exact migration path 37signals verified while upgrading Basecamp. Jorge concludes with confidence that Lexxy stands as a top contender among the absolute best web editors available today, inviting the Rails community to embrace it in their own projects.

- Lexxy 1.0 is officially released, having already achieved production stability over several months. - Lexxy is slated to replace Trix as the out-of-the-box default rich text editor for Action Text in Ruby on Rails. - Migration from Trix is largely seamless out of the box, matching the frictionless upgrade path proven in Basecamp.

## Notable quotes > [03:29](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=209s) contenteditable is profoundly unstable ground — Jorge Manrubia Díez

> [25:17](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1517s) it was wonderful for Claude. It was like if Claude was saying, 'finally!' like it blossomed. — Jorge Manrubia Díez

> [27:49](https://www.youtube.com/watch?v=UIXwabQ9jIU&t=1669s) absolutely the future — Jorge Manrubia Díez

## Mentioned Jorge Manrubia Díez, 37signals, Lexxy, Trix, Action Text, Ruby on Rails, Rails World 2026, Basecamp, Basecamp 5, HEY, Writebook, HouseMD, TipTap, Meta, Lexical, React, WhatsApp, Instagram, Brian Baily, David Heinemeier Hansson (DHH), Chef, Sultan Hotsu, Sam Pesher, Fizzy, Prism, Sean Doyle, ThoughtBot, Rails 8.2, Michael Dallesio, Bruno Prito, Jeremy Dailey, DOMPurify, Claude, Capybara, Playwright, Shopify

## Video description At Rails World 2026, Jorge Manrubia Díez of 37signals introduces Lexxy, the new open-source rich text editor for Action Text, and explains why the team built it.

#RailsWorld #RubyOnRails #ActionText #Lexxy #37signals #OpenSource

Thank you Shopify for sponsoring the editing and post-production of these videos. Check out insights from the Engineering team at: https://shopify.engineering/

[Source](https://www.youtube.com/watch?v=UIXwabQ9jIU)

中文简报

37signals推出Lexxy以取代Trix成为Rails默认文本编辑器 在放弃风投支持的竞品后,37signals基于Meta的开源Lexical引擎构建了Lexxy,解决了浏览器contenteditable长达十年的破损问题,成为Ruby on Rails的新标准编辑器。 为了解决Trix扁平文档模型的结构性限制以及浏览器contenteditable实现长期存在的不稳定性,37signals基于Meta的Lexical框架构建了Lexxy。演讲介绍了该编辑器的架构基础、深入的无障碍访问适配工作,以及其与Rails中Action Text的无缝适配器集成。Jorge还概述了引入Playwright如何使团队能够部署多组并行Claude AI智能体并结合自动化验证流水线,从而清空了包含300个缺陷的积压工作。演讲最后宣布推出Lexxy 1.0,该版本定位为一次无痛升级,并预定成为Rails的默认编辑器。 37signals推出了开源富文本编辑器Lexxy 1.0,旨在取代Trix成为Ruby on Rails中Action Text的官方默认编辑器。 (27:49) Trix的扁平文档模型从本质上阻碍了表格等嵌套元素的支持,促使37signals采用了Meta无依赖的Lexical框架及其虚拟DOM协调模型。 (0:06) Lexxy在Lexical之上增加了约13,000行原生JavaScript,实现了低于50毫秒的击键响应速度以及原生Action Text规范HTML存储。 (11:44) 团队通过在基于Playwright的测试套件上运行10到15个并发AI智能体,并配合自动化PR验证智能体来扩展缺陷修复效率,清空了300个卡片的积压任务。 (25:17)

Reading summary

37signals introduced Lexxy 1.0, a new open-source rich text editor slated to replace Trix as the default editor for Action Text in Ruby on Rails. Presenter Jorge Manrubia Díez explained that the project addresses structural limits in Trix's document model and frequent browser regressions by building on Meta's Lexical framework. Document Model Limits and the Move to Lexical (0:06) Trix served as Rails' default editor since Rails 6, but its flat document model presented fundamental structural barriers. Rather than using a hierarchical tree, Trix modeled rich text as sequential blocks tagged with metadata labels, reconstructing nesting only during rendering. While this simplified cursor positioning to two numbers, it made hierarchical elements like tables impossible to represent. Furthermore, reliance on browser contenteditable implementations created recurring stability issues; in 2024, iOS operating system updates broke cursor positioning, dictation, and autocompletion in Trix, triggering an internal emergency at 37signals. After failed spikes with table hacks in 2022, TipTap in 2023, and the Markdown-based HouseMD in 2024, 37signals revisited the editor space in early 2025. Leadership rejected venture-backed tools like TipTap to avoid commercial licensing pivots seen in past ecosystem experiences like Chef. Instead, the team selected Meta's Lexical, which features zero dependencies, an immutable snapshot architecture, and a virtual DOM-style reconciler that treats contenteditable strictly as an I/O surface. Meta's use of Lexical in WhatsApp and Instagram also ensured mobile OS edge cases were addressed upstream. Action Text Integration, Performance, and Accessibility (15:00) Lexxy acts as a specialized layer of roughly 13,000 lines of vanilla JavaScript built on top of Lexical. The editor natively integrates with Action Text's canonical HTML storage format for attachments, galleries, and mentions. To support this cleanly across Rails, contributor Sean Doyle of Thoughtbot helped finalize an editor adapter architecture slated for Rails 8.2. Lexxy ships with built-in table support, Markdown shortcuts, Prism-powered syntax highlighting across more than 20 languages, and image gallery management. Performance benchmarks keep Lexxy's latency below a 50-millisecond threshold from keypress to UI update. Accessibility was coordinated by QA lead Michael Dallesio and blind developer Bruno Prito. Their work focused on generating clean HTML, strict focus management, keyboard shortcuts like Alt+F10 to toggle between toolbars and the editor, and arrow-key image sorting. Security features include DOMPurify-based HTML and URL sanitization along with strict node-type controls reviewed by Jeremy Dailey. Agent-Driven Development and Playwright Testing (25:17) Developing Lexxy served as 37signals' first project built from scratch using Claude AI agents. The team initially tested using Capybara for server payloads, but migrated its text-editing test suite to Playwright. Jorge Manrubia noted that Playwright's low-level browser primitives for keyboard events and focus states transformed agent performance, calling the framework change the project's single best tooling decision. With Playwright in place, 37signals orchestrated 10 to 15 autonomous agents operating concurrently to address a backlog of roughly 300 bug reports, polish tasks, and edge cases prior to deployment in Basecamp 5. The parallel agents resolved complex browser-level behaviors, such as managing cursor positioning between adjacent inline images and handling non-standard markup pasted from desktop word processors. Automated Verification Workflows and Rails Adoption (26:34) To prevent code review bottlenecks from large volumes of agent-generated pull requests, 37signals implemented an automated verification skill. For every incoming PR, a separate verification agent initialized with a clean context runs a test script against the production sandbox to confirm the bug's existence, executes the same test against the local patch branch, and applies a 'validated' label to GitHub only if both checks succeed. Manrubia reported that this workflow allowed human engineers to merge large PR batches with high confidence. Lexxy 1.0 was officially announced following real-world production runs in Fizzy (December 2025) and Basecamp 5 (May 2026). Manrubia confirmed that Lexxy will replace Trix as the out-of-the-box Action Text default, advising new Rails applications to adopt Lexxy immediately while noting that legacy Trix applications should experience a smooth upgrade unless tied to custom internal Trix monkey-patches. While 37signals reports that transitioning from Trix to Lexxy was seamless in Basecamp, the true test of the migration path will depend on how cleanly third-party Rails applications with heavily customized Action Text setups adapt to Lexical's underlying node model.

Source quotes

[3:29] Jorge Manrubia Díez: contenteditable is profoundly unstable ground [25:17] Jorge Manrubia Díez: it was wonderful for Claude. It was like if Claude was saying, 'finally!' like it blossomed. [27:49] Jorge Manrubia Díez: absolutely the future

Original transcript

[0:06] [music] [0:13] Thank you. [0:16] >> Thank you, Fernando. [0:18] So, my name is Jorge. I work at 37 [0:21] Signals and today I'm going to talk [0:23] about Lexi. So, Lexi is an open-source [0:27] uh rich text editor that we have [0:29] released. Um, it's a a project we are [0:32] super excited about and today I'm going [0:35] to tell you everything about it. I'm [0:37] going to try to explain you why we are [0:39] so excited. So, um, let me start with [0:42] the motivation. Why did we create Lexi? [0:44] And to do that, we need to start with [0:47] Trixs. So [snorts] Trixs is uh a rich [0:50] text editor that we released uh um in um [0:54] 2015. Um [0:57] Trix is was also bundled with action [1:00] text in this first uh version of action [1:02] text um in real 6. And Trix is a is a [1:07] wonderful um editor. It's simple. Uh [1:10] it's battle tested. It's um robust and [1:14] millions of uh users have used it uh for [1:18] well over a decade. So um in recent [1:22] years we at 37 signals in the company [1:25] we've been uh feeling that tweaks had [1:28] started to fall uh short uh for our [1:31] expectations. So customers essentially [1:34] uh were requesting features that we [1:37] struggled to to implement or that we [1:39] directly couldn't implement. things like [1:41] tables for example in basecam customers [1:44] wanted to use tables um and we didn't [1:47] manage to implement those and there were [1:49] several of those fe of those features um [1:52] that made us reconsider the the whole [1:55] situation. So um to understand the [1:59] problem we need to talk a little bit [2:00] about the tricks document model. So uh [2:03] the trick document model is quite [2:06] simple. It's a flat list of blocks. Uh a [2:09] block being uh a text fragment with a [2:12] series of attributes or or labels that [2:15] characterize it. So for example, if you [2:18] think of having a valid item inside a [2:22] block quote, which looks like nested [2:24] information, uh, TRX internally stores [2:27] that as a block with not a label uh, [2:32] signaling the block quote followed by [2:35] another block with uh, three labels [2:39] block quote, ballot, ballot item for [2:42] example. So at rendering time trix is [2:45] going to render the information nested [2:47] but internally there is no nesting. [2:50] Okay. And this is u this is a um [2:53] essential to understand why it's so hard [2:56] to or impossible to implement things [2:58] like tables where you need table node [3:00] containing uh table rows. Uh a row can [3:03] can contain cells. A cell can contain [3:07] arbitrary HTML. It's impossible to [3:09] represent with this model. On the other [3:11] hand, this model is great because it's [3:14] simple. So, for example, you can [3:15] represent a position in a document with [3:17] two numbers. Uh, HTML is clean by [3:20] definition because the the the model can [3:22] contain arbitrary HTML. So, it has some [3:24] benefits but also some trade-offs. And [3:28] um, [3:29] another problem we had uh with tricks is [3:32] maintenance. See uh these modern editors [3:36] are like engineering wonders that are [3:39] built on top of content editable and [3:42] content editable is unstable ground. Uh [3:45] content editable um behaves differently [3:48] depending on the browser and content [3:50] editable sometimes um breaks or or [3:53] changes uh in ways you don't expect when [3:57] uh operating systems update. And we know [4:00] this very well. Uh 2024 uh with iOS [4:04] there was there were a series of [4:05] releases that broke tricks in different [4:09] ways like for example regarding autocomp [4:11] completion or dictation or cursor [4:14] management. Uh this one in particular [4:16] was uh a problem where where was close [4:18] to a code road at 30 sorry a code red at [4:21] 37 signals because the we detected on an [4:24] iOS beta that our products were about to [4:28] break badly with the official release [4:31] because tricks wasn't working at all. Um [4:36] [clears throat] [4:38] so uh one second. [4:46] Okay. So uh to give you a little bit of [4:49] chronology here. Um we've been talking [4:52] about this in the company uh for for [4:55] years. Uh 2022 [4:58] we started a project to add tables to [5:00] tricks. uh we spent like one or two [5:03] weeks on that before dropping the effort [5:05] because as I said it was quite [5:07] impossible to implement tables in a way [5:09] that was appealing to us. Uh 2023 [5:13] I uh worked on a spike to use tiptop in [5:17] hey uh again a very quick effort because [5:20] in hey we had the problem of composing [5:22] emails and the the world of of email [5:25] format is wild. So how you reply to an [5:28] email that is for from formatted in [5:30] arbitrary ways is is a complex problem. [5:32] Trixs wasn't delivered in there. We [5:35] didn't pursue the effort. Uh was an [5:38] interesting one but we moved on. Then in [5:41] 2024 [5:43] we released right book and with right [5:45] book we created uh house MD uh which is [5:50] um an an a markdown editor. It's not a [5:53] wizzywig editor. There is a what you see [5:55] is what you mean editor meaning you get [5:57] to see the markdown syntax with some [6:00] visual formatting sugar on the top uh [6:03] which works it works wonderfully well [6:05] for writing books or for writing long [6:07] form documentation [clears throat] [6:10] but um uh when we try to use housemd in [6:15] general purpose products early in 2025 I [6:18] participated in a project where we tried [6:20] to do that um and it wasn't feeling [6:23] right? Uh at all like the general [6:25] audience want like a wizzywig editor [6:28] like in general uh for for the general [6:30] use case. So [clears throat] [6:33] with these scenarios like 2025 early in [6:37] 2025 uh Brian Bailey um our head of [6:41] product strategy started the discussion [6:43] again what do we do about the editor [6:45] which path should we follow for the you [6:48] know for for a product and uh that was [6:51] when we started to evaluate options [6:53] again. Tiptop was a contender again, but [6:57] we discarded it because um uh and David [7:01] was uh pretty clear that we didn't want [7:03] a setup where there were like an [7:06] open-source product with a VC backed [7:09] company behind so a sales time behind [7:12] and with this tension of how does this [7:15] company make money out of this product [7:17] because the setups where you end up with [7:19] is for example with features that are [7:22] maybe part of the open source or Maybe [7:24] they got moved to the proprietary part [7:27] or maybe the company decides that moving [7:29] forward uh we are going to release [7:31] patches only if you pay a license or a [7:35] certain fee and this this is an [7:37] structure that had uh beaten us in the [7:39] past uh for example with chef and uh we [7:42] didn't want to invest uh on on such a [7:45] structure uh thinking in the in the long [7:47] term. So it was then uh 2025 when we [7:52] discovered uh lexical by meta which is a [7:56] text editing framework that we evaluated [7:58] and we quickly like fall in love uh as [8:01] as the [8:03] technical foundation we wanted to to use [8:06] uh moving forward. [8:09] [clears throat] [8:09] So let me tell you a little bit about [8:11] lexical how lexical is designed. Okay, [8:14] so Lexical has a very tiny core with no [8:17] dependencies [8:19] uh that interestingly [8:21] implements the same pattern uh or the [8:24] same approach uh that tricks used like [8:27] uh I don't know 12 years earlier which [8:30] is treating content content editable as [8:33] a as an input output device okay and as [8:36] a rendering surface but not as at the [8:39] source of truth okay the source of truth [8:41] in the editor is a document model. So [8:44] whenever you want to modify the [8:46] document, you don't add on content [8:49] editable directly but you perform an [8:51] update where you get a new document uh [8:54] snapshot. [8:55] Uh so the state itself is immutable is [8:58] you you get new snapshots that are [9:00] themselves immutable and uh the core has [9:04] several primitives. One of them is a [9:07] reconciler that uh let's say compare the [9:11] snapshots to calculate the difference [9:13] between them and represents them in the [9:16] dome in the real dome very efficiently [9:18] kind of what the the virtual dome [9:20] technique that React populariz [9:22] popularized. [9:24] Um other primitives in the in the core [9:28] are uh commands which is like a global [9:31] uh event bus uh where you can subscribe [9:34] to commands and react to them. It has [9:37] transformers which let you um uh listen [9:41] to node changes and intervene and uh in [9:45] a way that plays very well with the [9:46] reconciler [9:48] and and pretty much that that is like [9:51] the core of of uh of [snorts] lexical. [9:54] small core with no dependencies of [9:56] anything else. Then in the orvit what [9:58] you have is a series of packages [10:01] implementing uh the user the more user [10:05] userf facing features like for example [10:07] uh rich text formatting markdown tables [10:11] uh the clipboard and such. So it's a [10:13] it's a phenomenal design that we've [10:15] tested empirically that I mean the folks [10:19] from Meta who designed uh uh Lexical [10:22] they they knew what they were doing. [10:24] It's a it's a fantastic design. Lexical [10:26] also solved the maintenance problem we [10:29] had because Lexical is sorry uh Meta is [10:32] using Lexical [clears throat] in their [10:34] products meaning that we have literally [10:37] hundreds of millions of users using this [10:40] editor. So if there is some kind of [10:41] obscure bug in some keyboard or some [10:45] device, Android, iOS, whatever, they are [10:47] going to cut it like before it hits us, [10:50] right? And we've seen this like in this [10:52] year and a half plus we've been working [10:54] with Lexical. We've seen this happening [10:56] like several times where where the the [10:59] lexical team fixes something uh uh which [11:02] is something we super appreciate coming [11:04] from from from tricks and from our [11:06] current position and uh also the [11:09] structure of incentives with this setup [11:11] is so much better for what we wanted [11:13] because now you have meta is making [11:16] money out of uh their products like [11:19] WhatsApp or or Instagram [11:22] uh and then it's in the best interest to [11:24] maintain saying Lexical so that their [11:27] those products are great but they don't [11:29] have to you know struggle to make money [11:31] out of out of Lexical which from our [11:34] perspective is a much better setup. Of [11:36] course you never know how things are [11:37] going to go but we are much happier with [11:40] this uh with this approach and and and [11:43] position. [11:44] Um so Lexical is packed with features. [11:50] So the plan was uh grab lexical prepare [11:53] a nice package with uh with the packages [11:57] we want and add a toolbar and then we're [12:00] done with it. Right? So it didn't work [12:03] exactly like that. Uh it turns out that [12:06] [clears throat] creating a great editing [12:08] experience is super hard. It's super [12:11] hard. You need to handle like 1 million [12:13] details. Uh Lexi alone is uh I think [12:18] 13,000 lines of vanilla JavaScript [12:21] that's on top of lexical. Um [12:24] um an editor is essentially I mean [12:27] managing a state in software is very [12:29] hard. An editor is a thing where you can [12:31] change the state in one million [12:32] different directions. Uh all the [12:35] permutations you can think of multiple [12:37] times per second. So an editor is a [12:39] complex thing um to get right. And also [12:43] you need to take care of things like for [12:44] example uh if you have two images next [12:47] to each other and you want to represent [12:49] the cursor blinking between them. How do [12:51] you do that if you don't have room in [12:53] the dome for example? Or what happens if [12:55] you copy and paste content from a [12:58] Microsoft word where paragraphs or [13:01] whatever format is not using standard uh [13:04] markup like you need to take care of a [13:06] lot of those uh details. Um [13:10] so in terms of chronology uh we released [13:15] um the first version of Lexi with um [13:19] sorry of Fizzy sorry of Lexi with Fizzy [13:23] uh in May 2025. Later in December we um [13:29] sorry in May 25 sorry May of 25 was the [13:32] first pull request. [13:34] In December, we released Fizzy, which [13:37] was the first time where c where [13:38] customers were using uh Lexi. And then [13:42] um in May of 2026, we released uh let's [13:46] say BCAM 5, which is where when Lexi [13:49] started being used by a lot of folks. [13:51] Okay. So, um I want to recognize these [13:54] two folks here who are uh uh Sultan [13:58] Hotsu and Sam Pesher from 37 Signals. [14:01] They were uh the guys who took care of a [14:04] lot of that complexity in the isobar uh [14:07] creating uh building major features, [14:10] fixing countless bugs, a lot of polish [14:12] and they took a very green prototype of [14:15] Lexi to something we could release with [14:17] with Space Cam 5. So my my recognition [14:19] to them and this is important you know [14:22] we didn't want to create a tricks with [14:25] tables here. [14:28] uh we wanted to do like something very [14:30] very good. We wanted to be ambitious [14:32] with Lexi. The reason is that Lexical is [14:34] a fantastic editing framework and also [14:36] that we had agents to help uh as [14:39] productivity multipliers for for [14:41] everyone in the team. So we wanted the [14:42] full package. Okay, we wanted uh the [14:45] features of course but also the speed, [14:47] the accessibility, uh the security, uh [14:50] the documentation, the extensibility, [14:53] the configuration APIs, the full [14:55] package. Okay, so in terms of features, [15:00] uh a quick tour. Uh Lexi supports for [15:03] example a color highlighter which was a [15:05] feature we only had available uh in Twix [15:08] uh in Basecam as a proprietary thing. [15:09] Now it's uh a standard feature. It has [15:12] tables of course with a wonderful uh [15:15] user interface. It has uh markdown [15:19] supports markdown syntax. Uh it has code [15:22] real-time code highlighting supporting [15:25] like more than 20 languages uh thanks to [15:27] Prism. Um it has um [15:32] also image galleries of course with [15:34] support for much better support for drag [15:37] and drop than tricks and also uh for the [15:39] keyboard. [15:42] It has you can create links by pasting [15:45] URLs. Uh we have a wonderful API for [15:48] creating prompts like an emoji picker uh [15:52] to to offer mentions to mention people [15:55] in your company or any kind of uh [15:57] prompts you can think of that we've [15:59] designed you know APIs for the all the [16:02] scenarios we have detected in in both fy [16:05] and basecam. So it's an API that is uh [16:08] fantastic. It will also show previews of [16:10] attachments like PDFs or movies which [16:14] was another proprietary feature we had [16:16] in Basecam but is now like part of the [16:18] the editor [16:21] and um I want to talk about you know uh [16:25] the integration with action text okay [16:27] because it's interesting uh so action [16:29] text took a made a decision early on [16:32] which was um it normalizes the HTML it [16:37] stores regarding attachments ments with [16:39] attachments being things like image [16:41] galleries um or images uh file [16:45] attachments and also custom attachments [16:48] like for example mentions or bits of ed [16:51] editable information that reference [16:53] things in your in your application. Um [16:56] so action text took the took the made [16:59] the decision of making um that kind of a [17:02] canonical uh markup format to store uh [17:06] so that it's not tied to any editor in [17:09] particular. So Trix does some conversion [17:12] back and forth between the editor and [17:14] the database. What we did with Lexical [17:17] was um using um sorry with Lexi was like [17:22] leveraging the fact that Lexical is very [17:24] good at letting you customize uh how to [17:27] emit HTML. uh we are managing like uh [17:31] that native uh canonical format uh so [17:35] that if you graph an Lexi editor [17:38] instance and you grab the value you're [17:40] going to see that uh HTML uh normalize [17:45] and another wonderful thing uh that that [17:48] uh this design offered is that we could [17:52] extend action text to make uh the editor [17:56] configurable. Okay. So, so far action [17:59] text was only supporting triggs. We [18:01] created an adapter for this back and [18:03] forth between the editor and the server. [18:05] We created an implementation for triggs. [18:08] Uh, another implementation for for Lexi. [18:11] And well, if I want to recognize also [18:13] Son Doyle from ThoughtBot, he was uh he [18:16] actually had created a pull request for [18:18] doing this uh way before we started with [18:21] with Lexi. And with then with our input [18:24] after releasing Lexi, he he took it to [18:26] the finish line. He did a a phenomenal [18:29] job there. [18:32] And now in in in Rails, uh I think this [18:35] going to be official in Rails 8.2, but [18:37] this already part of of of the main [18:40] branch. Uh you can do things like this. [18:42] And hopefully uh this will offer the [18:45] option so that other editors using other [18:48] editing frameworks or maybe other [18:50] editing philosophies like house uh you [18:52] know to be plugged in a standard way. [18:54] Okay, this this support is is already [18:56] there. [18:58] So um Trix is um Lexi is um also [19:02] extendable. So what we did was uh we uh [19:06] created an API to uh offer extensions uh [19:09] to implement extensions. This API [19:12] leverages like the extensions uh uh [19:15] capability that uh Lexical has. So it [19:18] exposes uh all those capabilities so [19:20] that you can do things like defining new [19:23] note types or creating new commands, [19:25] adding new buttons to the toolbar. Uh [19:28] and extending you know the editor in any [19:32] way you want. Um this is absolutely [19:35] battle tested. uh we've been I think [19:38] Lexi itself has like uh 10 internal [19:41] extensions. We have like nine or 10 [19:43] extensions also in in Basecam. So this [19:46] is not like a theoretical API or [19:48] something we designed in the abstract. [19:50] It's something that absolutely work [19:52] absolutely works. And my favorite [19:55] example is in basecam we have a [19:56] proprietary extension which is voice [19:59] notes which is created with this uh [20:02] extension API and it's pretty complex as [20:04] you can imagine. So essentially you can [20:07] really really build whatever uh you want [20:11] uh you can extend the editor in any way [20:13] you want. [20:16] Uh Lexi is fast okay because Lexical is [20:20] very fast. Um the the chart we show then [20:24] you can see like that line is like 50 [20:27] millisecond threshold which is the time [20:29] that elapses and you press the keyboard [20:33] until you uh see the editor update. 50 [20:36] millisecond is like uh the threshold [20:39] beyond which you will notice [20:41] slaggginess. You can see in the chart [20:43] how you know uh Lexi is so much faster [20:46] than Trixs. Um and beyond the the [20:49] numbers like you can perceive this if [20:51] you start using Lexi. If you open tricks [20:53] in the sandbox, open Lexi in the [20:55] sandbox, you start typing them, you will [20:57] see how Lexi is way more responsive [21:02] [clears throat] [21:03] accessibility. [21:05] So um we really wanted to make Lexi [21:08] accessible. Okay, it turns out that [21:10] content editable making content editable [21:13] editors accessible is very very uh [21:16] challenging [21:18] um tricks is not great accessibility [21:22] wise. So what we did well we got Bruno [21:26] Prito and uh Michael Burgerer working on [21:29] this. Michael is the QA team lead at 37 [21:32] signals and our accessibility champion. [21:35] Uh Bruno Prito, I'm sure uh many of you [21:37] know him. He's an outstanding programmer [21:40] who knows everything about Rails and uh [21:43] hot wire front end the web and also [21:45] happens to be a blind person and uh well [21:49] Bruno took this I mean we hired Bruno [21:51] took this like uh kind of [21:53] enthusiastically because he's been [21:55] suffering the problems of uh not [21:57] accessible editors his whole life and [22:00] and he really delivered here. Um we uh [22:05] um Lexis uh is going to generate uh [22:08] accessible HTML. It's using accessible [22:11] HTML uh in terms of structure and [22:14] annotations. It's also offer an amazing [22:18] uh keyboard support, focus management [22:21] support. Uh you can do for example [22:23] things like switching between the editor [22:25] and the toolbar, manage the toolbar with [22:27] the arrow keys. If you are editing a [22:30] table or a or an image, you have an the [22:33] alt f10 convention to switch between the [22:36] specific toolbar and the editor back and [22:38] forth. You can do things like sorting [22:40] images uh with arrow keys with alt uh [22:44] shift. So, uh we really work hard hard [22:48] on this and it's something I'm uh we are [22:51] super proud of. [22:53] Uh security same story. Uh I don't know [22:57] if you have heard that AI has [22:59] represented like an unprecedented [23:01] explosion in terms of vulnerabilities [23:04] discovered [23:05] and we took that quite seriously. Uh we [23:08] put uh we we put parameters of the [23:11] caliber of Jeremy Dy and Mike Dallesio [23:13] uh to help us with with this and uh you [23:16] know we've really taken care of things [23:18] like sanitization. Lexi comes with its [23:20] own dome purify instance and uh we've [23:24] taken care of sanitizing URLs uh of [23:26] course the markup itself whenever you [23:29] modify it um also the attachment types [23:32] you can uh the editor support the node [23:36] types it support like we've taken care [23:38] of a lot of details here because um we [23:42] know how important it is [23:45] [clears throat] [23:47] and then um I I want to talk a little [23:50] bit about uh agents. So, Lexi is very [23:54] special to me because you know I think [23:55] every developer on planet earth [23:57] discovered uh in 2025 that uh you know [24:00] agents were mind-blowing. Um Lexi was [24:04] the first project with I started using [24:06] clot. Uh the first big project where I [24:08] started using clot uh from scratch and [24:11] uh of course uh I was blown away uh like [24:16] everybody else. I want to drop a couple [24:19] of notes there. Uh one of them is that [24:23] see when I started uh working with Lexi [24:27] I started with capara for system tests. [24:30] So I was using capara because I wanted [24:33] to exercise the testing at the action [24:36] text boundaries. So that uh to to test [24:38] how um Lexi behaved, you know, saving [24:42] action text payloads in the server, but [24:45] also was using Capivara for uh text [24:47] editing interactions [24:50] and uh at some point uh I introduced ply [24:54] in the suite. Uh so ply is uh [24:58] initially my motivation was that ply was [25:01] supporting multiple uh browsers when [25:04] testing. So um I wanted that for Lexi to [25:07] to make it more robust. So we kept like [25:10] the server side tests on on a on capara [25:14] and the text editing interactions we [25:17] moved those to ply right but to my [25:19] surprise this was uh wonderful for for [25:22] agents it was wonderful for clot it was [25:25] like if clot was saying finally like it [25:29] it blossomed uh and I think it's because [25:31] uh plyrite offers like better primitives [25:34] for low-level interaction like focus [25:36] management keyboard management and It [25:39] really cloud and agents really uh shine [25:42] like writing tests for for an editor a [25:45] rich a rich text editor uh with BL write [25:48] and uh it was probably the best uh [25:51] decision we made in the in the project [25:53] uh agent agents wise. So um it was also [25:58] my first time working in a project where [26:01] I would put like I don't know uh 10 15 [26:04] agents fixing bugs in parallel. Uh, you [26:07] know, we collected a lot of bugs after [26:10] the fizzy release preparing for Basecam [26:12] 5 and after releasing the first version [26:15] of BE Basecam 5, we tackled like almost [26:18] 300 uh bugs and cards in in general. Uh, [26:23] big bucks, small bugs, uh, polish, but [26:27] not this is not features, okay? This is [26:29] like kind of reactive uh, lexi work. [26:34] And um you know another lesson here was [26:37] that uh you know when you start working [26:41] with agents uh in in you know such large [26:46] batches uh something you the problem you [26:49] have is how do I validate and I review [26:51] so many pull requests and something we [26:54] tried and that worked pretty well was to [26:57] you know we use agents to do that. So um [27:01] we have an skill that is going to when [27:04] it's going to it's looking into a bug [27:06] fix or into uh something that is userf [27:08] facing it's going to try to reproduce [27:10] with a fresh context uh that back in [27:14] production using the lexi product [27:16] production sandbox in the homepage then [27:18] it's going to try to reproduce uh with [27:20] the same script uh the fix with lexi [27:23] working locally and if it checks both [27:26] then it's going to label the pull [27:28] request with is uh uh validated label. [27:34] So when you imagine that if you have to [27:36] review 15 pull requests and you know 11 [27:39] of those have this label then you can go [27:43] uh much faster over those that has have [27:45] been validated like like this. [27:49] And um to finish um we are going to [27:53] release uh version one of Lexi today. Uh [27:57] Lexi has been stable for for uh a few [28:00] months already. Uh but we were saving [28:02] the the number for this uh wonderful [28:05] stage. Uh we are going to make Lexi the [28:08] new Rails default. Uh this is already in [28:12] the works. Uh so uh you know race [28:15] applications in the future are going to [28:17] start with with Lexi instead of tricks. [28:20] I for for for for all of you who are [28:22] listening to this I recommend you to [28:24] start with if you are starting a race [28:26] application right now today go with Lexi [28:28] okay because it's absolutely the future [28:31] [snorts] and uh if you are actually [28:34] running an application that is using [28:36] tricks right now uh probably unless you [28:38] are doing like very complex uh [28:40] extensions or or patches uh to extend [28:43] the functionality of tricks the change [28:45] should be pretty seamless okay because [28:47] that that's exactly the scenario we at [28:49] uh with Basecam and we've made sure that [28:52] that's uh possible. I do believe um that [28:56] Lexi is uh like uh right now a top [28:59] contender to be one of the best web [29:02] editors there is in the in the market. [29:04] So I really encourage you to to use it. [29:07] And uh that was all. Uh thank you so [29:11] much. [applause] [29:18] >> [music]