NoPoint
Get started

Run it locally, then point your AI at your deck.

Two buttons. One copies a setup prompt for Claude Code / Cursor / Codex. The other opens the repo on GitHub. Pick whichever path fits.

Step 1

Clone and run

Paste the prompt below into Claude Code, Cursor, or Codex from any folder β€” your AI clones the repo, installs dependencies, and starts the dev server. Or do it manually.

Clone on GitHub
Set up the nopoint deck repo locally and start the dev server. Steps:

1. git clone https://github.com/drmrduck/nopoint.git nopoint
2. cd nopoint
3. bun install     (fall back to npm install if bun isn't available)
4. cp .env.local.example .env.local
5. bun dev         (or: npm run dev) β€” keep it running in the background
6. Open http://localhost:6829 in my browser when the server says it's ready

Then read README.md and AGENTS.md so you have context for what I ask next. Stop and tell me if any step fails β€” don't fix unrelated issues.
Prefer to run it by hand?
git clone https://github.com/drmrduck/nopoint.git nopoint
cd nopoint
bun install        # or: npm install
cp .env.local.example .env.local
bun dev            # or: npm run dev  β†’  http://localhost:6829
Step 2

Bring your existing deck

We don't process uploads here β€” the smart move is to attach your source material directly to the AI editor you just started. Drop the prompt below into Claude Code / Cursor / Codex, then attach what you've got. The AI rebuilds the deck from scratch as React components.

Option A β€” file

PDF, PPTX, Keynote export, or a markdown outline. Drag-drop the file straight into your editor's chat β€” Claude Code / Cursor / Codex all read attachments natively.

Option B β€” screenshots

One screenshot per slide, in order. Paste or drag them all in at once. Best route when the source is locked behind a viewer (Pitch, Beautiful, Google Slides without export rights).

Import prompt
Copy this, paste it into your editor, and attach the file or screenshots in the same message. The AI does the rest.
I want to recreate my existing pitch deck in this nopoint repo, slide for slide.

I'll attach the source in this same chat β€” either:
  β€’ the original file (PDF, PPTX, Keynote export, or a markdown outline), or
  β€’ a screenshot per slide (paste or drag them in, in slide order).

Read whatever I attach. Then:

1. Read AGENTS.md and components/decks/seed-2026/ first β€” match the SlideDefinition shape, the context field convention, and the 1280Γ—720 design canvas rules.
2. Pick a short slug for my deck (ask me if it's not obvious from the title).
3. Create components/decks/<slug>/ with:
   - slides/index.ts exporting SLIDES: SlideDefinition[]
   - one component per slide under slides/
   - DECK.md (principles, slide plan, hard rules)
   - REFERENCES.md (citation table β€” leave entries blank where I need to fill them)
4. Register the deck in components/decks/index.ts.
5. Add the slug to a credential's accessTo array in lib/investors/credentials.server.ts.
6. Open http://localhost:6829/investors/decks/<slug> when ready.

Constraints:
- Build it from scratch as React components β€” don't try to embed the source file. The source is reference material only.
- Lift the deck's voice and structure; don't pad. Keep slide copy tight.
- Author against the 1280Γ—720 design canvas. No sm:/md:/lg: breakpoints inside slide components.
- For each slide, fill context.nailsThis, context.goals, context.whatItIsNot, context.storyThread honestly.
- Stop and ask me before dropping, reordering, or inventing slides.
Step 3

Or fork a template

Every public deck below is a complete worked example you can copy and rewrite. Open one to see how slides, context, and DECK.md fit together.

Step 4

Extending data source pulling

Slides are React components, so a slide can render whatever data you can fetch. Two patterns cover almost everything: a managed embed for charts, or a Node route handler for anything else.

// app/api/stripe-mrr/route.ts
export async function GET() {
    const r = await fetch('https://api.stripe.com/v1/...', {
        headers: { Authorization: `Bearer ${process.env.STRIPE_KEY}` },
        next: { revalidate: 300 },
    })
    const data = await r.json()
    return Response.json({ mrr: data.mrr })
}

// components/decks/<deck-id>/slides/mrr-slide.tsx
export async function MrrSlide() {
    const { mrr } = await fetch('http://localhost:6829/api/stripe-mrr').then(r => r.json())
    return <div className="text-9xl font-bold">${mrr.toLocaleString()}</div>
}
Step 5

Read the conventions

Three short docs cover everything an AI agent needs to author slides without drift.

Step 6

Host it live

Push to your own GitHub repo, deploy to Vercel or Railway, and put it on a custom domain. No vendor lock-in, no hosted cloud, no per-investor pricing tier.

  1. Fork & commit

    Push your local clone to a private GitHub repo of your own. Decks live in git history β€” versioned with the rest of your code.

  2. One-click deploy

    Import to Vercel or Railway β€” both auto-detect Next.js. Set INVESTOR_SESSION_SECRET in the dashboard and you're live.

  3. Custom domain

    Point decks.yourcompany.com at the deployment. Send investors a link on your own domain β€” not a shared SaaS host.