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
I’m building a Ruby/SQLite serverlesslessness framework. I also maintain @phlex.fun.
Signal: joeldrapper.01
I’m sad it won’t be getting frozen string literals by default.
November 9, 2025 at 4:37 PM
I’m sad it won’t be getting frozen string literals by default.
It hits that branch of the case but then the second pattern should fails so the result should be false.
Looks like it is a regression.
Looks like it is a regression.
November 8, 2025 at 12:01 PM
It hits that branch of the case but then the second pattern should fails so the result should be false.
Looks like it is a regression.
Looks like it is a regression.
Bundler is happy to look for gems in .node_modules and being a node package means we can have it provide CSS and JavaScript too.
November 2, 2025 at 9:34 PM
Bundler is happy to look for gems in .node_modules and being a node package means we can have it provide CSS and JavaScript too.
I think it’s fine to keep them together. But it can make sense to separate them.
At work our generic components are shared between multiple apps so we keep them in a gem that we install as a node package. 😂
At work our generic components are shared between multiple apps so we keep them in a gem that we install as a node package. 😂
November 2, 2025 at 9:33 PM
I think it’s fine to keep them together. But it can make sense to separate them.
At work our generic components are shared between multiple apps so we keep them in a gem that we install as a node package. 😂
At work our generic components are shared between multiple apps so we keep them in a gem that we install as a node package. 😂
I dressed up as a deep fake.
November 2, 2025 at 9:03 PM
I dressed up as a deep fake.
Instead of morphing from top to bottom, Morphlex looks ahead to find the best matches in the old DOM.
This means if you’re morphing to a tree with one element removed, the only DOM operation will be to remove that element. Same with adding an element and sorting existing elements.
This means if you’re morphing to a tree with one element removed, the only DOM operation will be to remove that element. Same with adding an element and sorting existing elements.
November 1, 2025 at 11:42 AM
Instead of morphing from top to bottom, Morphlex looks ahead to find the best matches in the old DOM.
This means if you’re morphing to a tree with one element removed, the only DOM operation will be to remove that element. Same with adding an element and sorting existing elements.
This means if you’re morphing to a tree with one element removed, the only DOM operation will be to remove that element. Same with adding an element and sorting existing elements.
Related to this, there’s a library called ArkType that is a runtime type checker that helps your static type checker know what’s going on. This feels like a very good direction to me.
arktype.io
arktype.io
ArkType
TypeScript's 1:1 validator, optimized from editor to runtime
arktype.io
October 31, 2025 at 11:50 PM
Related to this, there’s a library called ArkType that is a runtime type checker that helps your static type checker know what’s going on. This feels like a very good direction to me.
arktype.io
arktype.io
In either case you’re having to work around the fact that your program doesn’t know anything about types and your type system doesn’t know much about your program.
October 31, 2025 at 11:47 PM
In either case you’re having to work around the fact that your program doesn’t know anything about types and your type system doesn’t know much about your program.
If you do that, someone else could unintentionally change this code in a way that calls your example method with undefined.
October 31, 2025 at 11:45 PM
If you do that, someone else could unintentionally change this code in a way that calls your example method with undefined.
You either have to give the type checker hints (e.g. by doing a runtime check that the type checker can see by hand). Or you say, “I know what I’m doing.” and add a bang to allow unsafe indexing into the array.
October 31, 2025 at 11:45 PM
You either have to give the type checker hints (e.g. by doing a runtime check that the type checker can see by hand). Or you say, “I know what I’m doing.” and add a bang to allow unsafe indexing into the array.
A simple example form TypeScript. One program knows that `list[0]` is a string. And you, the human also know. But the other program (the type checker) doesn’t.
October 31, 2025 at 11:38 PM
A simple example form TypeScript. One program knows that `list[0]` is a string. And you, the human also know. But the other program (the type checker) doesn’t.
One program is the type checker, the other program is your program. They both evaluate the same source code and do completely different things with it, and they cannot communicate with each other.
It’s why you have to keep giving the type checker hints about what it can’t know.
It’s why you have to keep giving the type checker hints about what it can’t know.
October 31, 2025 at 11:29 PM
One program is the type checker, the other program is your program. They both evaluate the same source code and do completely different things with it, and they cannot communicate with each other.
It’s why you have to keep giving the type checker hints about what it can’t know.
It’s why you have to keep giving the type checker hints about what it can’t know.
We plan to build a static component in the LSP that can give you auto completions and even catch some errors. But the main thing will be what is true at runtime. We can’t get away from Ruby being dynamic.
October 31, 2025 at 11:13 PM
We plan to build a static component in the LSP that can give you auto completions and even catch some errors. But the main thing will be what is true at runtime. We can’t get away from Ruby being dynamic.
My sense at the moment is that the disconnect here is that dynamic type systems have never felt integrated in the syntax, the language.
If you have that, it feels way more cohesive than a two-program static system.
If you have that, it feels way more cohesive than a two-program static system.
October 31, 2025 at 11:08 PM
My sense at the moment is that the disconnect here is that dynamic type systems have never felt integrated in the syntax, the language.
If you have that, it feels way more cohesive than a two-program static system.
If you have that, it feels way more cohesive than a two-program static system.
The other side to this is that static type systems are a second program that runs from the same source code but can’t directly communicate with the other program. That’s a lot of mental overhead.
October 31, 2025 at 11:07 PM
The other side to this is that static type systems are a second program that runs from the same source code but can’t directly communicate with the other program. That’s a lot of mental overhead.
In a language like TypeScript it works so well. I’m not convinced Ruby can get there or even should. TypeScript works because it’s universally adopted. Seems like it’s a bigger language than JavaScript.
October 31, 2025 at 9:58 PM
In a language like TypeScript it works so well. I’m not convinced Ruby can get there or even should. TypeScript works because it’s universally adopted. Seems like it’s a bigger language than JavaScript.
Yeah, that’s extremely helpful. 😅
That said, I’m pretty happy with the auto completions I get from Zeta (Zed’s copilot).
That said, I’m pretty happy with the auto completions I get from Zeta (Zed’s copilot).
October 31, 2025 at 9:58 PM
Yeah, that’s extremely helpful. 😅
That said, I’m pretty happy with the auto completions I get from Zeta (Zed’s copilot).
That said, I’m pretty happy with the auto completions I get from Zeta (Zed’s copilot).
You can’t statically type check a dynamic language unless 100% of it is annotated and no one does any meta-programming.
October 31, 2025 at 2:45 PM
You can’t statically type check a dynamic language unless 100% of it is annotated and no one does any meta-programming.
Thank you. Glad to hear you’re enjoying it. 😊
October 30, 2025 at 10:37 PM
Thank you. Glad to hear you’re enjoying it. 😊