Juno’s latest move is bound to turn heads — and possibly convert a few purists along the way. Serverless functions can now be written in TypeScript, no infrastructure wrangling needed. It’s a quiet update with loud implications. The kind of thing that changes how developers work without requiring them to change how they think.
It’s not about fanfare, it’s about familiarity. TypeScript fits right in, behaving like a houseguest who already knows where the mugs are. If you’ve written JavaScript before, you’ll feel right at home defining backend behaviour without any fuss. The environment is secure, the setup is straightforward, and the mental overhead is practically nil. There’s no need to manage separate services or spin up extra infrastructure. You write the function, and Juno does the housekeeping.
This isn’t a new direction, it’s a reinforcement of an old one. From the outset, Juno promised a simpler route to building decentralised, secure apps — tools that feel like tools, not puzzles. Adding TypeScript brings it even closer to that promise. It’s clear this update was built with empathy: for people who want to get things working fast, without sacrificing structure, scale or sanity.
The similarity to Juno’s Rust implementation is no accident. The same lifecycle patterns apply, the structure is consistent, and the data handling feels identical. It’s not a duplication, it’s a reflection — a deliberate choice to let developers start quickly and scale without friction. For those building performance-heavy applications, Rust remains the weapon of choice. But when the goal is to iterate fast, test a feature, or ship something without a six-step deployment checklist, TypeScript now plays nicely.
The tools that come with this are no throwaway extras. Hooks are in place to catch document or asset events, and assertions let you enforce conditions before anything changes. You can validate data using readable, schema-based checks, thanks to Zod. The runtime is intentionally lean but already includes the essentials like console.log
, Math.random
, TextEncoder
, and Blob
. Node.js isn’t fully supported yet, but polyfills are being added in response to actual developer use. It’s a rare case of “lightweight” not meaning “incomplete”.
That compatibility between Rust and TypeScript isn’t skin-deep. The APIs are lined up, the flow is familiar, and moving from one to the other won’t feel like boarding a different train line. Developers can start small with TypeScript and shift to Rust when they’re ready, without ripping up everything they’ve built. It’s about removing the cliff edge between prototyping and scaling.
The example code is so short it almost feels wrong. Define a hook, specify your collection, and log a message when a new document arrives. That’s all. The logic is tucked neatly into a container and runs in an isolated environment. Need validation? Just decode the proposed data, run it through a schema, and you’re done. There’s no server to set up, no endpoints to expose, and nothing lurking in the background to trip you up later.
The development experience hasn’t been left behind either. Local-first is the new normal. With this update, you don’t get a stripped-back imitation of production — you get the real thing, in miniature. Your Satellite includes everything: a full Console UI, ready to run on your machine. Manage and test your project locally with all the tools you’d use on mainnet. There’s no guessing, and no adjusting your workflow when it’s time to go live.
What’s refreshing is how little is demanded of you. There’s no need to install Rust, or juggle Cargo, or get tangled in toolchains. All it takes is Node.js and Docker. The rest happens inside the container. It bundles your code, embeds metadata, and produces a deployable Satellite. The developer just writes the function. The container handles the rest. It’s the coding equivalent of setting the table and having the meal served to you.
This isn’t a roadmap announcement either. Serverless functions in TypeScript are already out there, doing real work. They’ve been used to power the backend of the ICP-to-cycles swap on cycles.watch. That means hooks, assertions, the whole shebang — built and deployed using the new TypeScript system. There’s even a YouTube playlist showing the build process, start to finish. For those wanting proof that this isn’t vapourware, the code is on GitHub.
The addition of TypeScript doesn’t mean a shift in identity for Juno. It’s more like adding a new instrument to the band. Rust is still the lead guitar — sharp, fast, and precise. But TypeScript adds rhythm, speed, and accessibility. It’s the choice you reach for when you want to test something fast, or just work with tools that feel familiar. There’s no pressure to switch, no penalty for staying in JavaScript-land, and no weird learning curves. You’re not locked into one language or one style of development.
The release feels like an honest nod to how developers actually work. Sometimes you want to prototype fast and clean up later. Sometimes you want to build in layers. Sometimes you’re juggling five tasks at once and just need something that works. This update makes space for all of that. It doesn’t penalise scrappiness, and it doesn’t make you pay for flexibility with complexity.
It’s a small change with wide impact. Developers now have more freedom to build the way they want, with less overhead and fewer detours. Whether you’re starting from scratch or adding features to an existing app, you can write in TypeScript and know you’re still on the right track. The promise here isn’t performance at all costs — it’s progress without the pain.
And maybe that’s the most interesting part. The update doesn’t shout. It doesn’t offer magic, or silver bullets, or dramatic claims. It just offers something better: a way to build that feels natural, efficient and consistent. A way to work that respects your time and doesn’t mess with your mental model. Juno isn’t trying to dazzle. It’s trying to make building things feel a little more human. And with TypeScript now in the mix, that job just got easier.
Read the full announcement here: https://juno.build/blog/announcing-serverless-functions-in-typescript