A backend you own, from the browser.

A filesystem, key-value store, AI and auth — called directly from client-side JavaScript, with no API keys in the page and no backend code to write. It runs on your own Vercel account, not ours.

Editor
Output
Press Run.
Network — real requests to this site’s own backend
No requests yet.

Edit the code and press Run, or ⌘↵. This is a real deployment — the same one the reference pages use.

What you get

Five namespaces, one session

Sign in once and every namespace is scoped to that user. The session is an httpOnly cookie, so the browser cannot read it and a stolen bundle reveals nothing.

Two ways in

There is no required toolchain

The client is a single file with no dependencies. Import it if you already have a bundler, or drop in a script tag if you do not — the API is identical, and so is everything above.

With a bundler

import { createClient } from 'perusta';

const cloud = createClient();

await cloud.auth.ensureUser();
await cloud.fs.write('notes/todo.md', '# Hello');

Without one

<script src="https://unpkg.com/perusta"></script>
<script type="module">
  await perusta.auth.ensureUser();
  await perusta.fs.write('notes/todo.md', '# Hello');
</script>

The script-tag build is 2.2 KB gzipped and installs one global. Both examples in the repository are real apps — one built with Next and React, and the same app again in one HTML file with no build step at all.

The awkward part, handled

Renaming a directory copies nothing

Vercel Blob is flat object storage. It has no directories and no rename, so most things built on it either fake directories with key prefixes — making a rename an O(n) copy of every descendant — or simply do not offer one.

perusta keeps the tree in Redis and addresses each blob by an immutable node id that never appears in a path. Renaming a directory holding ten thousand files is two Redis writes and zero bytes moved. Try it in the playground above.

Your infrastructure

There is no perusta service

No account to create, no dashboard, no per-seat pricing, no rate limit set by someone else. You deploy the template to your own Vercel project, the storage is billed to you, and you can hand the whole thing to another developer without involving anyone.

That is also the honest trade-off: no managed service means no one is on call for you. It is MIT-licensed, so forking it is a supported outcome.