Co-authored by
Hayden Bleaselnext-forge
Nikolas BurkPrisma

Here’s how to switch from Neon to Prisma Postgres — a serverless database with zero cold starts and a generous free tier. You can learn more about its architecture that enables this here.

1. Create a new Prisma Postgres instance

Start by creating a new Prisma Postgres instance via the Prisma Data Platform and get your connection string. It will look something like this:

prisma+postgres://accelerate.prisma-data.net/?api_key=ey....

2. Update your environment variables

Update your environment variables to use the new Prisma Postgres connection string:

apps/database/.env
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=ey...."

3. Swap out the required dependencies in @repo/database

Uninstall the existing dependencies…

Terminal
pnpm remove @neondatabase/serverless @prisma/adapter-neon ws @types/ws

… and install the new dependencies:

Terminal
pnpm add @prisma/extension-accelerate

4. Update the database connection code

Update the database connection code to use the new Prisma Postgres adapter:

packages/database/index.ts
import 'server-only';

import { env } from '@repo/env';
import { withAccelerate } from '@prisma/extension-accelerate';
import { PrismaClient } from '@prisma/client';

export const database = new PrismaClient().$extends(withAccelerate());

Your project is now configured to use your Prisma Postgres instance for migrations and queries.

5. Explore caching and real-time database events

Note that thanks to the first-class integration of other Prisma products, Prisma Postgres comes with additional features out-of-the-box that you may find useful:

Caching

To cache a query with Prisma Client, you can add the swr and ttl options to any given query, for example:

page.tsx
const pages = await prisma.page.findMany({
  swr: 60, // 60 seconds
  ttl: 60  // 60 seconds
});

Learn more in the Accelerate documentation.

Real-time database events

To stream database change events from your database, you first need to install the Pulse extension:

Terminal
pnpm add @prisma/extension-pulse

Next, you need to add your Pulse API key as an environment variable:

apps/database/.env
PULSE_API_KEY="ey...."

You can find your Pulse API key in your Prisma Postgres connection string, it’s the value of the api_key argument and starts with ey.... Alternatively, you can find the API key in your Prisma Postgres Dashboard.

Then, update the env package to include the new PULSE_API_KEY environment variable:

packages/env/index.ts
export const server = {
  // ...
  PULSE_API_KEY: z.string().min(1).startsWith('ey'),
};

export const env = createEnv({
  client,
  server,
  runtimeEnv: {
    // ...
    PULSE_API_KEY: process.env.PULSE_API_KEY,
  },
});

Finally, update the database connection code to include the Pulse extension:

packages/database/index.ts
import 'server-only';
import { withPulse } from '@prisma/extension-pulse';
import { withAccelerate } from '@prisma/extension-accelerate';
import { PrismaClient } from '@prisma/client';
import { env } from '@repo/env';

export const database = new PrismaClient()
  .$extends(withAccelerate())
  .$extends(withPulse({ apiKey: env.PULSE_API_KEY })) ;

You can now stream any change events from your database using the following code:

page.tsx
const stream = await prisma.page.stream();

console.log(`Waiting for an event on the \`Page\` table ... `);

for await (const event of stream) {
  console.log('Received an event:', event);
}

Learn more in the Pulse documentation.