Joel Drapper πŸ‡¬πŸ‡§πŸ‡ΊπŸ‡¦
banner
joel.drapper.me
Joel Drapper πŸ‡¬πŸ‡§πŸ‡ΊπŸ‡¦
@joel.drapper.me
I’m a Ruby/TypeScript/CSS engineer at @plane.com and based in the UK. https://joel.drapper.me

I’m building a Ruby/SQLite serverlesslessness framework. I also maintain @phlex.fun.

Signal: joeldrapper.01
Pinned
If the Rails Foundation tried to take Rails from its maintainers, I would stand up for the maintainers, despite my political differences.

Rails is not owned by the Rails Foundation in the same way RubyGems projects were not owned by Ruby Central.

And neither are legitimately owned by Ruby Core.
Yes, also most apps done need a separate database server.

Most production rails apps could scale 1000x and still comfortably run on a single machine with a local SQLite database and have better performance and reliability than alternative setups.
February 10, 2026 at 12:54 PM
I love being able to do fast N+1 queries too much to ever switch.
February 10, 2026 at 12:49 PM
SQLite on the same machine will be about the same but ns instead of ms.
February 10, 2026 at 10:02 AM
Please just fix PR code review. Please.
February 6, 2026 at 4:57 PM
We’ve just released Phlex 2.4.1, 2.3.2, 2.2.2, 2.1.3, 2.0.2 and 1.11.1 with fixes for three specific XSS protection bypasses. github.com/yippee-fun/p...
Phlex XSS protection bypass via attribute splatting, dynamic tags, and href values
### Impact During a security audit conducted with Claude Opus 4.6 and GPT-5.3-Codex, we identified three specific ways to bypass the XSS (cross-site-scripting) protection built into Phlex. 1....
github.com
February 6, 2026 at 1:29 PM
Unfortunately downloads is a poor proxy for performance, quality, stability or reliability. But I have no better ideas for how to compare those things.
February 4, 2026 at 1:07 PM
Looks like you’re going to need flex box-layout, table layout and keyboard events. Flex-box layout is almost done but I haven’t started implementing table layout yet. I don’t think it’s too difficult though. It can take constraints from flex-box logic and then normalize to align rows and columns.
February 3, 2026 at 1:48 PM
This looks like a fantastic project to test the capabilities of Phlex::TUI. Do you have any existing ideas about the interface/layout/design of the TUI?

github.com/sidekiq/side...
Implement TUI Β· Issue #6898 Β· sidekiq/sidekiq
Text UIs are seeing a renaissance with many new TUI libraries popping up, e.g. charm.land and ratatui.rs. I tried Charm's Ruby bindings from Marco but found that the Go dependency was flaky and cra...
github.com
February 3, 2026 at 1:33 PM
Also it doesn’t matter which order you draw them, because the canvas just looks at what’s already in place in the cell behind or around the cell you’re drawing. And this only applies to cells that were specifically drawn as line cells so it won’t unintentionally replace regular text output.
February 3, 2026 at 1:26 PM
Without the highlight, it looks beautiful.
February 3, 2026 at 1:20 PM
With this technique, we can automatically draw adjoining line characters. I’ve highlighted the replaced character in these images.
February 3, 2026 at 1:20 PM
Using this technique, when painting a line, we can look at each line cell we’re about to paint over or next to and find the appropriate adjoining character to replace it with.

Here’s the part where we look at the cell above, for example.
February 3, 2026 at 1:20 PM
Now given any line description, say [0, 1, 0, 0] we can combine it with another description [1, 0, 0, 0] to find the character that looks like [1, 1, 0, 0].
February 3, 2026 at 1:20 PM
Then we can create a map for each box drawing character that describes it in terms of top, right, bottom, left.
February 3, 2026 at 1:20 PM
We can create a data structure that stores these in a way that lets us easily look them up. First, we’ll make a key that mapsΒ border styles to numbers.
February 3, 2026 at 1:20 PM
The trick is to find these characters and put them in the right place. Each box-drawing character has four parts: top, right, bottom, left. This one it thin on the top, thick on the right, nothing on the bottom and thin on the left.
February 3, 2026 at 1:20 PM
But there’s a box drawing character β•‚ that can join these up. If the lines just met but didn’t cross, they might look like this. Again, there is a box drawing character that would join these up. β”Έ
February 3, 2026 at 1:20 PM
Draw the vertical line first and the output looks like this.
February 3, 2026 at 1:20 PM
In the terminal, if you draw a thin horizontal line and then draw a thick vertical line above it, you’ll get something that looks like this.
February 3, 2026 at 1:20 PM
All of this is because I want to build a TUI for Quickdraw so I can quickly navigate test results, rerun tests, jump to files in the stack trace, browse code coverage, etc.
February 3, 2026 at 12:51 PM
Currently the planned elements are:

table β€”Β a container for row/col elements
row β€” like <tr>
col β€”Β like <td>
box β€”Β like a <div> with flex box
text β€”Β like a Text node
canvas β€”Β a box with access to a low-level painting API
embed β€” a box that negotiates layout for rendering 3rd party ANSI components
February 3, 2026 at 12:12 PM
You’ll also have access to the low-level canvas drawing utilities that let you draw layered boxes and lines, use shading, etc.

Youβ€˜ll be able to select from any UTF-8 font when rendering text. All the layout is automatic and high level. Like using CSS. You can even specify light/dark variants.
February 3, 2026 at 12:06 PM
You’ll be able to define character animations for loading spinners, draw vertical and horizontal bars with 1/8th of a character precision. You’ll be able to embed ANSI blocks from other libraries, with β€œembed” blocks partaking in the layout flow, negotiating for space in the final layout.
February 3, 2026 at 12:06 PM
You’ll be able to control overflow, with scrolling elements and focus management. You’ll be able to create clickable elements. You’ll be able to use Phlex::Kits to define your own reusable, responsive components like buttons and cards. You’ll be able to respond to keyboard and mouse input too.
February 3, 2026 at 12:06 PM
Connecting borders will automatically join up with equivalent adjoining characters. For example, if a thin horizontal line crosses a thick vertical line, the character at the cross point will be automatically replaced with the appropriate adjoining box-drawing character. β•‚
February 3, 2026 at 12:06 PM