Next.js

Complete guide to integrate Redenv with Next.js from scratch.

A step-by-step guide to set up Redenv with Next.js 13+ App Router — from project creation to production deployment.

1. Create Your Next.js Project#

npx create-next-app@latest my-app
cd my-app

2. Install Dependencies#

npm install -g @redenv/cli && npm install @redenv/client
pnpm add -g @redenv/cli && pnpm add @redenv/client
bun add -g @redenv/cli && bun add @redenv/client

3. Set Up Redenv#

Connect to Upstash Redis#

redenv setup
? Upstash Redis REST URL: https://your-redis.upstash.io
? Upstash Redis REST Token: AXxxxxxxxxxxxxxxxxxxxxxxxxxxxx
✓ Configuration saved

Tip

Get your Upstash credentials from console.upstash.com.

Create a project#

redenv register my-app
? Master password: ********
? Confirm password: ********
✓ Project "my-app" created

Warning

Remember your master password! Redenv cannot recover it if lost.

4. Add Your Secrets#

redenv add DATABASE_URL "postgresql://user:pass@localhost:5432/mydb"
redenv add JWT_SECRET "your-super-secret-jwt-key"
redenv add STRIPE_SECRET_KEY "sk_test_..."

Or import from an existing .env file:

redenv import .env

Verify:

redenv list

5. Create a Service Token#

redenv token create -p my-app
? Token name: nextjs-token

✓ Service Token created
  Token ID:  stk_yYt2HXRprwYgpvwv
  Token Key: redenv_sk_8f3a9b2c...

⚠ Save the Token Key now — it won't be shown again!

6. Add Bootstrap Variables#

These are the only secrets in your .env.local:

.env.local
REDENV_PROJECT=my-app
REDENV_TOKEN_ID=stk_yYt2HXRprwYgpvwv
REDENV_TOKEN_KEY=redenv_sk_8f3a9b2c...
UPSTASH_REDIS_URL=https://your-redis.upstash.io
UPSTASH_REDIS_TOKEN=AXxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Everything else (DATABASE_URL, API keys, etc.) is stored encrypted in Redenv.

7. Create the Redenv Client#

lib/redenv.ts
import { Redenv } from "@redenv/client";

export const redenv = new Redenv({
  project: process.env.REDENV_PROJECT!,
  tokenId: process.env.REDENV_TOKEN_ID!,
  token: process.env.REDENV_TOKEN_KEY!,
  upstash: {
    url: process.env.UPSTASH_REDIS_URL!,
    token: process.env.UPSTASH_REDIS_TOKEN!,
  },
  environment: process.env.NODE_ENV || "development",
});

await redenv.init().require( 
  "DATABASE_URL", 
  "JWT_SECRET", 
); 

Tip

Validating here ensures your app crashes on startup if secrets are missing — not later when a route tries to use them.

8. Use Secrets in Your App#

Server Components#

app/page.tsx
import { redenv } from "@/lib/redenv";

export default async function HomePage() {
  const secrets = await redenv.load();
  const apiKey = secrets.API_KEY;

  return <h1>Welcome</h1>;
}

Server Actions#

app/actions.ts
"use server";

import { redenv } from "@/lib/redenv";

export async function sendEmail(formData: FormData) {
  const secrets = await redenv.load();

  await fetch("https://api.sendgrid.com/v3/mail/send", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${secrets.SENDGRID_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ to: formData.get("email") }),
  });
}

API Routes#

app/api/users/route.ts
import { redenv } from "@/lib/redenv";

export async function GET() {
  const secrets = await redenv.load();
  // Use secrets.DATABASE_URL, secrets.API_KEY, etc.
  return Response.json({ users: [] });
}

Middleware#

middleware.ts
import { redenv } from "@/lib/redenv";
import { NextResponse, type NextRequest } from "next/server";

export async function middleware(request: NextRequest) {
  const secrets = await redenv.load();

  if (secrets.get("MAINTENANCE_MODE").toBool()) {
    return NextResponse.redirect(new URL("/maintenance", request.url));
  }

  return NextResponse.next();
}

9. Database Integration#

With Prisma#

lib/prisma.ts
import { redenv } from "./redenv";
import { PrismaClient } from "@prisma/client";

let prisma: PrismaClient | undefined;

export async function getPrisma() {
  if (!prisma) {
    const secrets = await redenv.load();
    prisma = new PrismaClient();
  }
  return prisma;
}

10. Create Production Environment#

Before deploying, clone your development secrets to production:

# Clone dev secrets to a new production environment
redenv clone
✔ Select source environment: development
✔ Select destination environment: New environment
? Enter new environment name: production
✓ Cloned 3 secrets to production
# Switch to production and update values
redenv switch env production

redenv edit DATABASE_URL "postgresql://user:pass@prod-db:5432/mydb"
redenv edit STRIPE_SECRET_KEY "sk_live_..."