Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 06/07/2026I just realised you can actually configure this and then you can press `cmd-w` twice to close the file you just opened. 020
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 06/07/2026I do this to prevent quitting the app unintentionally too. 010
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 01/07/2026I think we should make it a convention to use the `"$type"` property with a const to model discriminated unions in JSON. The JSON Schema shape would be `oneOf` with each object shape discriminated by this const. 270
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 18/06/2026Brilliant! @mu.social has syntax highlighting AND you can edit posts. 070
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 28/05/2026How do you solve this problem? Basic tools and a tiny prompt. Here’s mine. 010
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 28/05/2026Oh my god, what?! Ruby can’t explain string theory to me? hahahaha Wow, so bad. Can’t believe it. 130
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 27/05/2026I updated my GitHub sponsors page with a specific goal of unlocking an OpenAI Pro subscription. Adding the Anthropic sub brings this up to about $600 just to access the largest models from both leading companies. 020
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 22/05/2026Holy shit how have they not rolled this back already? This is the kind of fuck up you need to put on your status page while you mitigate. 0142
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 30/03/2026Ruby Central *really* don’t want you to see this video. They’re now going after Reddit comments linking to it. archive.org/details/gmt-... 011
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 13/03/2026Ruby Central got YouTube to take down the recording of the final meeting between Ruby Central and the RubyGems maintainers before the takeover. I’ve appealed this decision. 070
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 13/03/2026I don’t always agree with DHH but this is spot on. 👌 030
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 12/03/2026I posted this *months* ago. joel.drapper.me/p/ruby-centr... 000
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/03/2026Fuck every one of these companies that have now had at least four months to disassociate themselves. And fuck these ones that sponsored their new conference too. 130
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 26/02/2026This was fun to put together. Our existing type system made it pretty easy. For example, since serializers need to be able to reference the type and kind of serializable objects for the context, we can give them a deferred type initially. 000
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 17/02/2026Look at this border drawing. Note: there is no background on the draggable so you’re meant to be able to see through it. 020
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 17/02/2026Phlex::TUI is not just a component system. It’s a layout engine, a rendering engine and a reactive component framework all in one. And it’s 100% Ruby with no dependencies. 6202
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 16/02/2026Tech stack: Svelte, Tailwind, Bun, Vite, MaskIcons. Deployed to Cloudflare Pages. Built in collaboration with Codex 5.3 which did most of the heavy-lifting. 010
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 15/02/2026This is interesting. RubySchema serves about 3.5k requests a day during the week and about 1k a day over the weekend. The audience is mostly Rubocop users so I guess about a third of them build things on weekends. www.rubyschema.org 230
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 14/02/2026Side quest: trying to play the Succession theme. 250
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 12/02/2026Here’s the code I used to render this, by the way. 120
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 12/02/2026But I kind of expect gap: 0 to look like this. This can be achieved with borders and gap of -1 but I wonder if there should be a way to draw a border around an element such that it collapses with other borders. 110
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 12/02/2026If I highlight one of the border characters, you can see that they’re right up next to each other. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 12/02/2026TUIs are tricky. What is the gap between these boxes? Answer: 0 151
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 11/02/2026RubyConf sponsors 🤮 These companies actively decided to sponsor a Ruby Central conference after what Ruby Central did. Absolutely horrible and gross. 150
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026With this technique, we can automatically draw adjoining line characters. I’ve highlighted the replaced character in these images. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026Using 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. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026Now 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]. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026Then we can create a map for each box drawing character that describes it in terms of top, right, bottom, left. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026We 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. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026The 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. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026But 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. ┸ 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026Draw the vertical line first and the output looks like this. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 03/02/2026In 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. 110
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 29/01/2026Another preview. You can specify colours with alpha. 120
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 27/01/2026What if we had Phlex::TUI as well as Phlex::HTML, Phlex::SVG and Phlex::CSV? 3231
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 22/01/2026It’s not just large code reviews that crash GitHub. I can’t even load the comment thread on this PR because it’s got 74 comments and GitHub probably has some N+1 query in there. 🤦♂️ 5144
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026This frame shows the first shot from a different angle. The front of the car has passed him and visually blocks his body from view. You can see from the angle of the ground and where his legs meet the ground that he is next to the vehicle (from our perspective here, behind it) not in front of it. 020
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026ICE themselves actually gave us an example of what happens when a car travelling at about 7mph strikes a pedestrian. This is more than twice the speed that Renee’s car was doing when the shooter fired his first shot. 110
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026The angle of the first shot is consistent with this photograph. If you line up the hole with the headrest, the camera is positioned in about the same position that the shooter would have been standing relative to the car. Ahead of the car but to the side, not in directly in front of it. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026The shooter chased the car, firing a second shot in this frame, 439ms after the above frame. The car was now travelling at ~3.8mph. 110
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026This outline shows the approximate location of the shooter who could not from this position have been struck by the wheel or any other part of the car and was not at this point standing in the direction of travel. 110
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026The first shot is fired in this frame 35ms later. At this point, the shooter is completely clear of the vehicle, which is steering hard right and travelling at about 2mph. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026The shooter steps back away from the vehicle which is now steering hard right 438ms later. 100
Joel Drapper 🇬🇧❤️🇺🇦 @joel.drapper.me · 08/01/2026The car continues to steer to the right. By this frame, 639ms after the frame above, the car is properly steering right. It has accelerated to about 1.25mph. 100