---
name: redis-nuxt
description: "Provisions a Redis database (Upstash-compatible, REST and TCP) for a Nuxt app with `npx extraorbital add redis` (no signup, no card) and wires it into Nuxt with `@upstash/redis`. Use when a Nuxt project needs Redis, a cache, rate limiting, sessions, a job queue, Upstash, Valkey or REDIS_URL, or when UPSTASH_REDIS_REST_URL is missing or unset in .env."
---

# Redis in Nuxt

<!-- Generated from ExtraOrbital's service registry by `pnpm skills:build` in platform/app. Edit the generator, not this file. -->

ExtraOrbital provisions a Redis database (Upstash-compatible, REST and TCP) in one command and writes the credentials into the project's env file. For anything this recipe does not cover, use the `extraorbital` skill or https://extraorbital.dev/llms.txt.

## 1. Provision

```bash
npx extraorbital add redis
```

Run it from the project root. It is idempotent (a second run returns the same resource) and writes to `.env.local` if the project has one, otherwise `.env`, keeping that file out of git. Add `--json` to parse the result; credential values are redacted there, and you should never print them either.

| Variable | |
| --- | --- |
| `UPSTASH_REDIS_REST_URL` | REST endpoint, for serverless and edge runtimes |
| `UPSTASH_REDIS_REST_TOKEN` | Its token |
| `REDIS_URL` | `rediss://` URL for any Redis-protocol client |

Free on the Prototype plan: 256 MB, 500K commands/mo.

## 2. Install the client

```bash
npm install @upstash/redis
```

## 3. Connect

`nuxi dev` loads `.env` only. If ExtraOrbital wrote `.env.local`, start with `nuxi dev --dotenv .env.local`, or provision with `--env-file .env`.

**`server/utils/redis.ts`**

```ts
import { Redis } from "@upstash/redis";

// Over REST: every command is an HTTP request, so there is no connection to manage.
export const redis = new Redis({
  url: process.env.UPSTASH_REDIS_REST_URL!,
  token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
```

## 4. Use it

**`server/api/redis.get.ts`**

```ts
// `redis` is auto-imported from server/utils/redis.ts.
export default defineEventHandler(async () => {
  const hits = await redis.incr("hits");
  return { hits };
});
```

## 5. Verify

```bash
npx extraorbital list        # the resource is listed as active
npm run dev
curl http://localhost:3000/api/redis
```

A JSON answer means the credentials, the client and the route all work. Delete the route afterwards if the app does not need it.

## Pitfalls

- A long-lived worker (BullMQ, `ioredis`, `node-redis`) connects with `REDIS_URL` instead; it is the same database. BullMQ needs `maxRetriesPerRequest: null` on its connection.
- Set an expiry on cache keys (`ex`/`EX`): the Prototype allowance is 256 MB and 500K commands a month, across the account.
- Keep the module in `server/utils/`: Nitro auto-imports its exports into server routes and never ships them to the browser. Export names are global across `server/utils`, which is why they are specific.
- A production build does not read `.env`: set the variables on the host (`npx extraorbital push` for Vercel).
- Only `runtimeConfig.public` reaches the browser; never put a credential there.
- Exit code 3 means the account is past its free allowance: show the human the link the command printed and wait. Do not retry or work around it.

Docs: https://extraorbital.dev/docs/resources/redis.md
