> neon-serverless
You are an expert in Neon, the serverless Postgres platform. You help developers use fully managed PostgreSQL with instant database branching, autoscaling to zero, edge-compatible HTTP driver, connection pooling, and point-in-time recovery — enabling development workflows where each PR gets its own database branch and production scales automatically based on load.
curl "https://skillshub.wtf/TerminalSkills/skills/neon-serverless?format=md"Neon — Serverless Postgres
You are an expert in Neon, the serverless Postgres platform. You help developers use fully managed PostgreSQL with instant database branching, autoscaling to zero, edge-compatible HTTP driver, connection pooling, and point-in-time recovery — enabling development workflows where each PR gets its own database branch and production scales automatically based on load.
Core Capabilities
Connection
// Standard Postgres driver (Node.js)
import { Pool } from "@neondatabase/serverless";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const { rows } = await pool.query(
"SELECT * FROM users WHERE email = $1",
["alice@example.com"],
);
// HTTP driver (works on Edge/Serverless — no TCP needed)
import { neon } from "@neondatabase/serverless";
const sql = neon(process.env.DATABASE_URL);
// Tagged template queries
const users = await sql`SELECT * FROM users WHERE role = ${role} LIMIT ${limit}`;
const [user] = await sql`INSERT INTO users (name, email) VALUES (${name}, ${email}) RETURNING *`;
// Transaction
const results = await sql.transaction([
sql`INSERT INTO orders (user_id, total) VALUES (${userId}, ${total}) RETURNING id`,
sql`UPDATE users SET order_count = order_count + 1 WHERE id = ${userId}`,
]);
With Drizzle ORM
import { drizzle } from "drizzle-orm/neon-http";
import { neon } from "@neondatabase/serverless";
import { users, posts } from "./schema";
const sql = neon(process.env.DATABASE_URL);
const db = drizzle(sql);
// Type-safe queries
const allUsers = await db.select().from(users).where(eq(users.role, "admin"));
const userWithPosts = await db
.select()
.from(users)
.leftJoin(posts, eq(users.id, posts.authorId))
.where(eq(users.id, userId));
Database Branching
# Create branch for PR (instant, copy-on-write)
neonctl branches create --name pr-42 --parent main
# Each branch gets its own connection string
DATABASE_URL=$(neonctl connection-string pr-42)
# Run migrations on branch
npx drizzle-kit push --url $DATABASE_URL
# Delete after PR merge
neonctl branches delete pr-42
# Point-in-time restore
neonctl branches create --name recovery --parent main --restore-point "2026-03-12T10:00:00Z"
Installation
npm install @neondatabase/serverless
npm install -g neonctl # CLI for branch management
Best Practices
- HTTP driver on edge — Use
@neondatabase/serverlessHTTP driver on Vercel Edge, CF Workers; no TCP needed - Branch per PR — Create database branches for preview environments; instant, zero-cost copies
- Autoscale to zero — Neon suspends compute after inactivity; pay only when queries run
- Connection pooling — Use pooled connection string (
-poolersuffix) for serverless; prevents connection exhaustion - Drizzle integration — Use Drizzle ORM with Neon HTTP driver; full type safety, edge-compatible
- Point-in-time recovery — Branch from any point in history; debug production issues on isolated copy
- Postgres extensions — Use pgvector, PostGIS, pg_trgm; Neon supports standard Postgres extensions
- Free tier — 0.5 GB storage, autoscaling compute; enough for side projects and prototyping
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> xero-accounting
Integrate with the Xero accounting API to sync invoices, expenses, bank transactions, and contacts — and generate financial reports like P&L and balance sheet. Use when: connecting apps to Xero, automating bookkeeping workflows, syncing accounting data, or pulling financial reports programmatically.
> windsurf-rules
Configure Windsurf AI coding assistant with .windsurfrules and workspace rules. Use when: customizing Windsurf for a project, setting AI coding standards, creating team-shared Windsurf configurations, or tuning Cascade AI behavior.