The platform for waitlists, emails and subscriptions.
A Turborepo monorepo with the API, the dashboard, the landing site and every public npm package.
zot.so · app.zot.so · Get an API key
Zot lets you capture emails, manage waitlists and automate onboarding without building your own database, admin panel, transactional emails and SDK from scratch. You integrate with Zot through four surfaces:
- A hosted UI at app.zot.so to create waitlists and inspect signups.
- An official SDK (
@zot-core/sdk) for Node, edge runtimes, React and Next.js. - A CLI (
@zot-core/cli) to create resources straight from the terminal. - An AI agent skill (
@zot-core/agents) that teaches Claude Code, Cursor, GitHub Copilot and anyAGENTS.md-aware agent how to integrate Zot correctly without hallucinating.
zot/
├── apps/
│ ├── api NestJS 11 · MongoDB · Passport JWT · Stripe · Resend
│ ├── client Next.js 16 · HeroUI · TanStack Query · Zustand
│ └── landing-page Next.js 16 · Three.js · GSAP · Framer Motion
└── packages/
├── SDK `@zot-core/sdk` — official TypeScript SDK (server + React)
├── cli `@zot-core/cli` — API CLI (oclif)
├── agents-cli `@zot-core/agents` — installs agent skills into any repo
├── skills/ canonical SKILL.md files consumed by `@zot-core/agents`
└── shared Zod schemas and utilities shared across apps
| App | Port | Stack | What it does |
|---|---|---|---|
apps/api |
3010 |
NestJS 11, MongoDB/Mongoose, Passport JWT (Google/GitHub/local), Stripe, Resend | Backend API. Swagger at /docs. |
apps/client |
3000 |
Next.js 16, HeroUI, Tailwind 4, TanStack Query, Zustand, React Hook Form + Zod | Authenticated dashboard. Proxies /api/* to the API. |
apps/landing-page |
3001 |
Next.js 16, Three.js, GSAP, Framer Motion | Public marketing site. |
| Package | Version | What it's for |
|---|---|---|
@zot-core/sdk |
Official SDK. new ZotSDK({ apiKey }) on the server, useAddUser hook on the client. |
|
@zot-core/cli |
CLI for the Zot API. npx @zot-core/cli waitlist create --name "Early Access". |
|
@zot-core/agents |
Installs the official integration guides into your repo so every AI agent integrates Zot the right way. |
The recommended path from zero to a working waitlist in a Next.js app:
# 1. Install the SDK
npm install @zot-core/sdk
# 2. Create the waitlist and persist its ID in .env.local
# (requires ZOT_API_KEY — grab one at https://app.zot.so/app/api-keys)
npx @zot-core/cli waitlist create --name "Early Access" --write-env .env.local --public
# 3. (Optional) Teach the AI agents in this repo how to use Zot
npx skills add launch-waitlist-zot/zot-skillsThen, in a client component:
"use client";
import { useAddUser } from "@zot-core/sdk/react";
export function WaitlistForm() {
const { addUser, isPending, isUserRegistered, error } = useAddUser({
apiKey: process.env.NEXT_PUBLIC_ZOT_API_KEY!,
waitlistId: process.env.NEXT_PUBLIC_ZOT_WAITLIST_ID!,
});
// ...
}The full guide (server, client, error handling, anti-patterns) lives at packages/skills/zot-waitlist/SKILL.md.
- Node.js
>= 18(22 recommended) - npm
>= 10 - MongoDB running locally or reachable via a URI (for the API)
- Environment variables per app (see
apps/*/.env.example)
git clone git@github.com:<org>/zot.git
cd zot
npm installnpm run dev # Run every app in parallel via Turborepo
npm run build # Build the entire monorepo
npm run lint # Lint every workspace
npm run check-types # Type-check every workspace# API (apps/api)
npm run -w api dev # nest start --watch (port 3010)
npm run -w api test # Jest
npm run -w api test:cov # Jest + coverage
# Client (apps/client)
npm run -w client dev # Next.js (port 3000)
npm run -w client build
npm run -w client start
# Landing (apps/landing-page)
npm run -w landing-page dev # Next.js (port 3001)npm run -w @zot-core/sdk build
npm run -w @zot-core/cli build
npm run -w @zot-core/agents buildAll three packages live under the @zot-core npm scope. Scoped packages need --access public on the first publish.
The order matters because @zot-core/cli depends on @zot-core/sdk:
# 1. SDK first
npm version patch -w @zot-core/sdk
npm publish --workspace @zot-core/sdk --access public
# 2. CLI (pin the new SDK version in packages/cli/package.json first)
npm version patch -w @zot-core/cli
npm publish --workspace @zot-core/cli --access public
# 3. Agents CLI (ships the bundled SKILL.md)
npm version patch -w @zot-core/agents
npm publish --workspace @zot-core/agents --access publicSmoke test from a clean directory:
mkdir /tmp/zot-smoke && cd /tmp/zot-smoke
npx skills add launch-waitlist-zot/zot-skills
npx @zot-core/cli@latest waitlist create --helpThe previous, unscoped package zot-sdk was published up to v0.0.7 and lives on in npm for historical reasons. New releases only go out under @zot-core/sdk. After publishing @zot-core/sdk@1.0.0, deprecate the old package so existing users see a migration notice:
npm deprecate zot-sdk "Moved to @zot-core/sdk. Run: npm install @zot-core/sdk"CLAUDE.md— repo-wide rules and conventions for Claude Code.apps/client/CLAUDE.md— dashboard-specific conventions (HeroUI, React Hook Form + Zod, TanStack Query, toasts, skeletons, paths, naming).packages/SDK/README.md— SDK reference.packages/cli/README.md— CLI reference.packages/agents-cli/README.md— available skills and how to publish new ones.packages/skills/zot-waitlist/SKILL.md— the canonical waitlist skill.
- Create a feature branch (
git checkout -b feature/<slug>). - Work inside
apps/*orpackages/*; move shared logic intopackages/sharedwhen it makes sense. - Before committing:
npm run lint && npm run check-types. - If you touched the SDK or a CLI, run
npm run buildin that workspace. - If you touched the skill (
packages/skills/zot-waitlist/SKILL.md), rebuild@zot-core/agentsso the bundled copy is regenerated. - Open a PR against
main.
Released under the terms of the LICENSE file.