Dilīp Shukla (दिलीप शुक्ल) retweeted
Thank me later -> mkdir.directory
Dilīp Shukla (दिलीप शुक्ल) retweeted
If you work with graph data structures (you should), I built a seriously powerful open-source graph library for you: @statelyai/graph
- Plain JSON graphs
- Convert DOT, Mermaid, GraphML + more
- So many algorithms
- Visual + structural graph props
- Fully type-safe + FAST
github.com/statelyai/graph
Dilīp Shukla (दिलीप शुक्ल) retweeted
Introducing celld: a self-hosted, distributed Durable Objects and Workers implementation
- celld = V8 + S3 + SQLite + LTX+ Tokio
- programmed with exactly the Cloudflare Workers/DO JavaScript APIs and config
- order of magnitude cheaper at scale
- writes are durable before they're acknowledged, RPO=0
- only depends on an S3 compatible bucket - no other infrastructure
- ~4 MB memory per cell instance overhead
- hibernated cells cost ~nothing, just their S3 storage
- open source, Apache 2 licensed
Dilīp Shukla (दिलीप शुक्ल) retweeted
Today we are releasing Cloudflare OS, a chatbot with connectors, just like every other tech company is doing.
Except actually, it's different. This is a remake of Sandstorm[.]io, my startup from 10 years ago, except this time built on Cloudflare Workers (the platform I've spent the last 9 years building) and deeply leveraging AI. This is more or less the culmination of my secret 10-year master plan.
This is a full-on personal app vibe coding platform, in which the sandbox is so secure that you can pretty much go wild -- the AI cannot introduce a significant security bug. We believe a company's security team can feel comfortable giving non-technical users permission to vibe code and then sleep soundly at night.
How is that possible? It's the Sandstorm security model, revisited. A "Gadget" is the same thing as a Sandstorm "Grain": a fine-grained app instance. For example, if you have a document editor app, each document runs as a separate instance of the app, in a separate sandbox (one "Gadget").
This means two things, both of which I think are Big Deals:
1. The platform can manage all access control, by controlling who can access the Gadget at all. There is no way the Gadget can accidentally leak itself to an attacker -- even an attacker who has access to other Gadgets based on the same app.
2. Since everyone is running their own copy of the code, everyone can freely *modify* their copy of the code.
Think about #2 a bit more.
What if, when you wanted a new feature in the software you are using, you could just prompt your agent to add it?
This doesn't work in the cloud Software-as-a-Service model, because you are not running your own copy of the app.
Sandstorm tried to change that 10 years ago, but the world wasn't ready, because not enough people had the skills or patience to actually modify their software. AI has changed that. Now you just ask the agent -- the same agent that you are using to help you interact with the Gadget can also modify the code of the Gadget.
And it is so fun.
github.com/cloudflare/cloudf…
Dilīp Shukla (दिलीप शुक्ल) retweeted
SVG icons have been "solved" myriad ways, but I find them all lacking.
Inline SVGs? Bloated DOM.
<img> tags? Can't change colors.
Icon fonts? Blurry at certain sizes, a11y issues.
CSS background-image? Still can't change colors.
But, today there's actually a perfect solution...
Dilīp Shukla (दिलीप शुक्ल) retweeted
not really announced yet but we're developing a service for untrusted code execution
deno.com/deploy/sandboxes
Absolutely but somehow developers don't like standards until backed up by popular frameworks.
Use the standard Node.js "imports" field instead of TypeScript aliases:
![A side‑by‑side code comparison showing migration from TypeScript path aliases to Node.js imports. On the left, tsconfig.json defines `"paths": { "@/ *": ["./ *"] }`, used as `import "@/foo"`. On the right, package.json defines `"imports": { "#app/ *": "./ *" }`, used as `import "#app/foo"`. Red arrows point from the TS config to the package.json config and from the old import style to the new one.](https://pbs.twimg.com/media/G7VyfHfbsAEUHEr.jpg?name=small&format=webp)
ALT A side‑by‑side code comparison showing migration from TypeScript path aliases to Node.js imports. On the left, tsconfig.json defines `"paths": { "@/ *": ["./ *"] }`, used as `import "@/foo"`. On the right, package.json defines `"imports": { "#app/ *": "./ *" }`, used as `import "#app/foo"`. Red arrows point from the TS config to the package.json config and from the old import style to the new one.
Dilīp Shukla (दिलीप शुक्ल) retweeted
i've been using cloudflare a lot more recently and realised most explanations of their primitives are way too complex
so i made a simple primer: an introduction into cloudflare's primitives, starting with durable objects + kv
momito.co.uk/cloudflare-prim…
Dilīp Shukla (दिलीप शुक्ल) retweeted
📝 Importing vs fetching JSON
JSON imports are now supported cross-browser, but when would you use them rather than fetch()?
jakearchibald.com/2025/impor…
Dilīp Shukla (दिलीप शुक्ल) retweeted
React seems to be going through this moment where the mindset is flipping from "we are the memoization library" to "we are the everything is reactive library". They can do this because in both scenarios the base expectation is everything re-runs.
However, it encourages flipping the defaults. Like removing explicit dependencies (thank you compiler) and instead explicitly untracking (useEventEffect). I wonder how many other things are reversed. Like passing a function to `useState` lets initialization run once. Very useful in my stream with @rickyfm to let us fetch in our component.
But after doing @ryanflorence's cascading async drop-down example I started thinking how hard is it to initialize state multiple times? Do you unmount components each time (thanks key prop)? Do you synchronize state with an effect(NO!!!)? Do you synchronize state while you render and if so how do you store the previous values to compare? And can you guarantee everything is available with async timing?
Dilīp Shukla (दिलीप शुक्ल) retweeted
I was in chat during this stream, but watching the video made me want to talk about the limits of this framing.
It's easy to look at things of what you can do with a given tool. And because these are just tools you can always escape them. You can really do anything with anything.
So talking about what you can't do with a tool generally comes down to performance. Either from overhead of a tool or from the fact something becomes so hard to do you will probably give up before you can do it optimally. Like good luck hand-rolling Resumability. You will probably give up and just hydrate the whole thing. Anything less than that is probably doable.
So why do framework authors talk so much about that zone? Because if history has proven anything as time passes the "problems" will continue to grow if left unchecked. Expectations grow over time and so do your problems. They have to be forward facing.
The part this doesn't capture is that the impact of these decisions is not limited to that last 10%. It can make the whole bar better. These things tend to not be a cliff. Your individual threshold may be, but the reality is more gradual. This would be better visualized as a color spectrum.
The reason everyone gets so caught off guard with new technology is the average hue can start occupying way more than 50% of the graph before it hits that threshold where you draw the line. And its also why innovation is underappreciated. Because this is just a function of time. React developers like to use jQuery when showing React's initial impact here. But if they used Angular.js it wouldn't be nearly as prominent change.
So talking about what you can't do with a solution is not the right way. Something that is impossibly hard to do today is not going to be mainstream enough to be considered a general problem. It's only when those who start to push beyond the boundaries reach some level of success does it establish itself as important.
So getting past React's past success (and I mean this for the React ecosystem as well) is important for innovation. If we curb ambition and settle for good enough then things don't improve. And it isn't because of the availability of technology, but because we didn't try.
Dilīp Shukla (दिलीप शुक्ल) retweeted
LIFE Magazine had famous cartoonists draw their characters while blindfolded. It's fascinating!
Dilīp Shukla (दिलीप शुक्ल) retweeted
Computer use is the first step toward a completely new form of human-computer interaction.
In just a few years, the way we interface with computers will be completely different from today.
Let me explain:
any server-side code must narrow the gap to browser JavaScript thenewstack.io/ryan-dahl-fro…
Dilīp Shukla (दिलीप शुक्ल) retweeted
Introducing rcompat
primatejs.com/blog/introduci…


























