All work
In use at RideCheck

Waypoint

Paste anything. Ask Claude to sort it.

RideCheck’s Notion and Jira in one: docs, roadmap, meetings, partners, notes and a live whiteboard. Anyone pastes an idea, a bug or a rant; ask Claude to organise, and it labels each one, maps it to the product, and turns it into tasks for whoever owns that area.

Claude over MCP · 85 tools
Role
Most of the design and build
Built for
RideCheck’s team of four, and our mentor
Built
September 2026 — still growing
Stack
Next.js · Firestore · MCP

Commits ship under Tio’s account — it’s the one our Vercel deploy builds from.

01Why it exists

Our own Notion and Jira — one you can just talk to.

RideCheck is four of us — Tio, Dhafin, Fazry and me — with a mentor who looks in. Waypoint is where the company’s knowledge lives: the docs for every product and tool, the roadmap, the meetings, the partners, and a notebook anyone can write in.

It’s our own Notion and Jira, shaped around how we actually talk. Nobody has to decide where something goes before they write it down.

The heart of it is the paste bin. Anyone posts anything — an idea, a bug, a rant — in plain words. Later, someone asks Claude to organise it: each paste gets labelled, filed under the part of the product it touches and, when we ask, turned into a task for whoever owns that area.

It genuinely changed how we work. If one of us has something to say, we post it in Waypoint, or tell Claude: “I have this idea — post it in Waypoint and ask Dhafin, Tio and Fazry about it.”

  1. Docs, the paste bin, Firebase
  2. MCP server, whiteboard, map, organising over MCP, Schematic, inbox & presence
  3. Cheaper polling, Playwright tests
  4. Studio
  5. Partners & mentors
  6. Notes & Canvas
  7. Finance

02Try it

Paste first. Sort it later.

Four pastes from an ordinary day, written the way people actually write. Ask Claude to organise them, open the map, then hand out the work — everything Claude does here, it does through Waypoint’s own tools.

ClaudeWaypoint connector on
  1. Claude can read and write Waypoint through its MCP tools. Send the message below to start.

Waypoint
Paste bin4 pastes · 4 waiting
  1. 1Organise the paste bin
  2. 2See it on the map
  3. 3Hand out the work

Illustration rebuilt in HTML from Waypoint’s own colours and layout — not a screenshot. Every paste, task and product part is invented, and Claude’s replies are scripted. The map is placed by a port of the app’s own layout code, and Claude’s answer goes through a port of the same forgiving checks the real organiser uses.

03The connector

Claude has the keys. Every change is signed.

Waypoint is also an MCP server. Connect it to Claude once and the whole team can ask for things in plain words, on our own Claude plan — Claude reads and writes the same data the app does.

What one of us types

A

hey, I have an idea — a monthly recap for riders: (a) km ridden, (b) the next service due, (c) fuel spent, (d) one tip. Can you post it in Waypoint and ask Dhafin, Tio and Fazry about it?

create_paste
{ text: "Monthly recap for riders … @dhafin @tio @fazry",
  kinds: ["idea"], onBehalfOf: "adrian" }

Three Inbox notes

  • D

    Adrian mentioned youMonthly recap for riders · via Claude

  • T

    Adrian mentioned youMonthly recap for riders · via Claude

  • F

    Adrian mentioned youMonthly recap for riders · via Claude

85 tools in 12 modules

  • Schematic15
  • Studio15
  • Paste bin14
  • Docs8
  • Waypoints7
  • Whiteboard5
  • Partners5
  • Notes5
  • Finance4
  • Map3
  • Organise2
  • Team2

All over Streamable HTTP.

  • Signed and announced. Every write by Claude is credited “on behalf of” whoever asked, and the team gets told. A unit test fails if any write tool is missing those fields.
  • A secret that fails quietly. Two endpoints share one secret: a Bearer header, or a secret URL for claude.ai’s custom connectors. A wrong token gets a 404, not a 401, so clients don’t go hunting for a sign-in. Tokens are compared in constant time.
  • Errors that teach. A field a tool doesn’t take is rejected with an error naming the ones it does, so a misspelt argument gets fixed instead of silently ignored.
  • Pastes are data. The organiser is told never to follow instructions found inside a paste — whatever anyone writes, it’s something to file, not something to obey.

The message and the recap idea are invented; the tool call and the module counts are the real ones.

04What it does

Everything RideCheck knows, in one workspace.

Plus Studio for our content — inspiration, ideas from draft to posted, and a kit of captions — and a Finance tab that reads straight from our Google Sheet.

Docs you search first

A page for every product and tool, found by an in-house search that handles word stems, synonyms and typos. Claude edits them over MCP, and every edit is a saved revision.

Schematic, our own Notion

My tasks, a roadmap as a timeline, table or board, a task tree, sprints and recurring tasks. Statuses include In review, Denied, Backlog and Forgotten — plus our own.

Meetings that leave tasks

Minutes and action items on every meeting, a calendar with an iCal feed, and a pipeline for the partners we’re talking to.

A paste bin with manners

Twelve kinds plus our own, product labels, comments and linked threads. An @mention lands in that person’s Inbox, and deleting shows an Undo instead of asking “are you sure?”

A shared notebook

A rich editor that saves plain Markdown: tables, charts, callouts, [[links]] between notes, groups like folders, and PDFs in and out.

Whiteboard and map, one tab

A live whiteboard for stickies, shapes, arrows, drawings and images, with the product map next door. Named Waypoints pin any place; ⌘ K finds everything else.

05How it’s built

Next.js, Firestore, and a lot of polling.

A private web app on Vercel. The browser never talks to Firebase — every read and write goes through the server.

AppNext.js 16 App Router, React 19, TypeScript, Tailwind v4, Zod 4.
DataFirestore and Cloud Storage through the server-side admin SDK only. Attachments upload straight to storage with signed URLs.
Sign-inOne shared team password, a separate one for our mentor, then a “Who’s this?” picker. Private and noindex.
AIClaude over MCP, on the team’s own Claude plan. The organiser runs on demand, in batches of eight pastes.
CostInside Firebase’s free tier: single-read polls, idle throttling, images shrunk in the browser, and a daily cleanup job.
TestsAbout 278 unit cases across 32 files, and 35 Playwright tests in 10 specs.
lib/organizer/plan.ts — PlanSchema
export const PlanSchema = z.object({
  pastes: z.array(
    z.object({
      id: z.string(),
      kinds: z.array(z.string()).describe("Kind ids from the list, main one first. 1-3."),
      title: z.string().describe("A short, specific title, at most 8 words"),
      summary: z.string().describe("1-2 sentences: what this means for RideCheck, in plain words"),
      tldr: z.string().nullable().describe("Only for long pastes: one or two lines. null otherwise."),
      tags: z.array(z.string()).describe("1-4 short lowercase tags"),
      topic: z.string().nullable().describe("A topic grouping related pastes — reuse one from the list when it fits, or null"),
      products: z.array(z.string()).describe("Product slugs from the list it's about; [] when unsure"),
      parts: z.array(z.string()).describe("Map parts it's about, by exact name; [] when unsure"),
      // …
    }),
  ),
  newParts: z.array(z.object({ name: z.string(), emoji: z.string(), note: z.string() })).describe("Parts to add to the map"),
  links: z.array(z.object({ from: z.string(), to: z.string(), reason: z.string() })).describe("New links between parts that depend on each other"),
  announce: z.string().describe("The team notification"),
});

The shape Claude has to answer in, lightly trimmed: four lines are left out, and one description is shortened. Anything outside the lists — an unknown kind, a part nobody added — is dropped or filled in rather than failing the batch.

06Build notes

Small team, small bills, few surprises.

01

Live, without websockets

Everything polls. One meta/versions document says which collections changed, so a quiet poll costs a single read. Polling pauses in hidden tabs and slows to once a minute when nobody’s doing anything. Writes save the data first and the version second, so a poll never sees old data under a new version.

02

An undo that knows whose change it is

The whiteboard is 1,082 lines with no board library. Each tab sends only its own changes, applied in Firestore transactions; everyone else’s arrive by polling every 4 seconds. Every change Claude makes is logged with its inverse, so undo puts back only what it touched — and your own undo never reverts someone else’s work.

03

Placing things for a model that can’t see

Claude can’t look at the board, so when it adds stickies, the server works out how much room the text needs. The map lays itself out deterministically: new parts land next to what they’re connected to, and a part someone dragged by hand never moves.

04

Tested the way Claude uses it

In the Playwright suite, several teammates each get their own browser, and the tests call MCP tools exactly as Claude would. Each run gets its own isolated server, with JSON data wiped every time.