Elyra · · 5 min read

A little squirrel, a big tree, and the desktop app you've been putting off published

Elyra Framework is a Rust + Svelte 5 framework for desktop apps with Laravel's ergonomics, and its CLI, Ratatosk, carries messages between your Rust backend and your Svelte frontend.

A little squirrel, a big tree, and the desktop app you've been putting off published

There is a desktop app you've been meaning to build. Maybe it's the tool your accountant colleague keeps asking for, or the internal dashboard that lives, for now, in a browser tab nobody can find. You know the web well. You may even know Laravel by heart. And every time you look at the desktop, it looks back at you like a different country, with its own language, its own customs and its own very large runtime.

Elyra Framework is an invitation to visit anyway, and to find that the furniture is where you'd expect it.

What it is, plainly

Elyra Framework is a Rust + Svelte 5 framework for desktop apps, with Laravel's ergonomics (a container, providers, a typed bridge), compiled and binary, with no runtime overhead. Your app ships as a single binary with no embedded runtime: fast to start, light on memory.

The CLI is called Ratatosk, rata for short. In Norse myth, Ratatosk is the squirrel who runs up and down the world tree carrying messages between the eagle at the top and the dragon at the roots. It's a fitting name for a tool whose whole job is to carry things between your Rust backend and your Svelte frontend, quickly, and without losing anything on the way.

Getting started is short.

rata new myapp
cd myapp && rata dev

rata dev gives you Vite's hot reload. Since 0.38.2 it does so on every platform, and it tidies up after itself when you close the app.

It feels like home, on purpose

If you've written Laravel, much of this will feel familiar:

  • Commands and middleware: commands come with a middleware pipeline. A command can require an ability, #[command(can = "...")], and when it refuses, the refusal names which gate said no.

  • Artisan-style generators: make:resource scaffolds a resource for you, and Laravel's validation reaches all the way to the form.

  • A typed bridge: rata codegen turns your Rust types into TypeScript with a typed api.* facade, so calling your Rust commands from Svelte is type-checked end to end. Since 0.37.0 a command's doc comment even follows it into bindings.ts, as JSDoc right where you'll read it.

It's a bit like moving to a new city and discovering your favourite café has opened a branch around the corner. The street names are different, but you know exactly what to order.

Components that already know your app

@elyra/ui is a set of desktop components that know the app they live in. On elyracode.com the component pages don't show screenshots: they run the real thing, now 70 live examples, beside their code.

Version 0.40.0 added three components that, as the changelog says, every app with a Laravel backend ended up building for itself:

  • NotificationBell: Laravel's notifications behind a bell with the unread count on it. A notification read on the web is read here too.

  • AccountSwitcher: the servers you're signed in to, in a menu. A click switches, and signing out asks before it drops changes that haven't been sent.

  • TreeView: for folders, categories and charts of accounts, with the keyboard you know from Finder and Explorer.

The TreeView's own example is, charmingly, a Norwegian chart of accounts, with 3000 Sales, high rate sitting quietly under 3 Sales revenue. It's the kind of detail that tells you someone actually built business software with this.

There is care in the small things too. Since 0.37.0 things move a little, and not at all for someone who has asked their Mac for less motion. Someone who has asked for more contrast gets it: 7:1 for muted text, 3:1 for borders and focus, in both themes.

A Laravel backend, kept the way the desktop expects

Many desktop apps are really a window onto a server. Elyra Framework takes that seriously:

  • Sign-in: the page never sees the token.

  • Live data: changes made on the web show up in the open windows.

  • Offline: you can work offline, and a write the server refuses waits for the user instead of vanishing.

  • Several servers: since 0.35.0 a user can be signed in to more than one server at once, for example their company's own and a customer's, and switch between them without signing out.

  • Updates from your own server: since 0.36.0 an app distributed from each customer's server can update from there, verified before anything is swapped.

An honest note: the Laravel half lives in a package, elyracode/elyra-backend, which isn't published on Packagist yet. The framework page says so plainly, and we'd rather tell you now than have you discover it at composer require.

Built with agents in the room

This is perhaps the most now part of the story.

  • Every app is an MCP server, and there's an MCP server for the coding agent that is writing the app, so the agent knows the framework it's working in.

  • Since 0.37.0 rata mcp dev lets a coding agent see the debug build it's working on and click in it: it can read the window as an accessibility tree, take a screenshot, click, type and navigate, then look at the page afterwards. This is for debug builds only. A release has no endpoint and no script in the page.

  • The in-app assistant works over the app's own commands. Since 0.38.0 it can write a small loop instead of taking one turn per record. That mode is off by default, because the results of those calls go to Anthropic's sandbox, and the framework says so up front.

There's something lovely about a framework that expects you to have help, and builds the doors for that help to come in through, with locks on them.

Where it runs

macOS is the primary target today. Linux and Windows compile and are covered by CI, but are less exercised in practice. That honesty was earned:

  • Linux, 0.38.0: CI started opening the example app's window on Linux and found that it didn't open. That was fixed.

  • Windows, 0.38.1: the same exercise on Windows found that the page couldn't reach its app. That was fixed too.

Not every project writes "we ran it for the first time and it was broken" in a changelog. This one does, and that is exactly why you can believe the rest of it.

So: the app you've been putting off

Perhaps this is the weekend. Run rata new, open the TreeView page and click through someone else's chart of accounts for a minute, then make your own window. The squirrel will carry the messages. You get to decide what they say.

Start here: elyracode.com/framework