Five minutes, no terminal
The button clones the starter template into your GitHub, provisions the storage, and deploys. You do not paste a connection string or generate a secret.
Step by step
After it lands
// app/api/perusta/[...route]/route.ts
import { perustaFromEnv } from 'perusta-server';
import { toRouteHandlers } from 'perusta-server/next';
export const { GET, POST, OPTIONS } = toRouteHandlers(perustaFromEnv());Then, from any client component:
import { createClient } from 'perusta';
const cloud = createClient();
await cloud.auth.ensureUser();
await cloud.fs.write('notes/todo.md', '# Hello');Local development
npm install
vercel link # connect to the project you deployed
vercel env pull .env.local # storage credentials + an OIDC token for AI
npm run devCookies are marked Secure everywhere except plain-HTTP localhost, which is detected automatically — so sign-in works locally without you turning anything off.
Read this part
On Pro and Team accounts Vercel switches on Deployment Protection, which puts a login wall in front of the generated *.vercel.app URL. The build succeeds, the dashboard is green, and every perusta call returns:
{"error":{"message":"Protected deployment","code":"401"}}Nothing is broken. The protection covers the generated URL but not a production custom domain, so either attach a domain, or turn it off under Project → Settings → Deployment Protection. Worth doing before you conclude the deploy failed — and worth knowing if your page is served from another origin, because that fetch gets the 401 too.
Vercel’s Deploy button can prompt for a variable but cannot generate one, so requiring a secret up front would mean opening a terminal before your first deploy finished. When it is unset, perusta derives a session signing key from your Blob token instead.
That means rotating your Blob token signs every user out, and anyone holding that token could forge a session — they would already have full read/write on your storage, so it grants no new reach, but it is one more thing that token can do. For real users, set it:
vercel env add SESSION_SECRET production
# paste the output of: openssl rand -hex 32The gateway’s free tier restricts things in two different ways, and it is worth knowing which you have hit.
The Anthropic models are blocked outright — including anthropic/claude-sonnet-5, which is perusta’s own default. That returns forbidden. Other models answer, but a modest number of requests exhausts the free allowance and you start seeing rate_limited.
The template’s demo page pins openai/gpt-4o-mini for exactly this reason, so a fresh deploy shows all four services green. Add credits and drop the model option to get the default back. Storage and auth never touch the gateway and are unaffected.
Money
Upstash is not free through the Marketplace. The deploy asks you to pick a plan, and the cheapest is Pay As You Go at $0.20 per 100,000 commands. Everything above it is fixed monthly pricing, starting at $10 for 250 MB. There is no free option in that list, so budget a few cents rather than nothing.
Blob is included in your Vercel plan’s storage allowance, and AI is per token through the gateway. A quiet app costs very little — but “very little” is not “zero”, and it is better to know that before you click than after the first invoice.
There is no perusta pricing, because there is no perusta service. Every resource belongs to you, and removing it is a matter of deleting a Vercel project and its two stores.