How Zine Was Vibe-Coded with Claude Code: Stack and First Users

October 7, 2026 · 1380 words

FactZine
What it isAI chat and search over your own tools: Gmail, Drive, Slack, Notion, GitHub, Jira and more
BuilderDeveloper (Kirk Marple, founder of the Graphlit platform)
AI toolClaude Code (Opus 4.1, then Sonnet 4.5); Factory Droid added later
StackNext.js 15, TypeScript, HeroUI + Tailwind, Clerk auth, Upstash Redis, Vercel, Graphlit SDK
Time to launch~8 weeks to MVP (first code March 15, 2025); first paying customer at ~4 months
RevenueNot disclosed; first paying customer ~4 months in (self-reported)
SourceZine blog post

Built with Claude Code SaaS illustration: an AI search hub in the middle connected to mail, chat, documents and ticket icons, with a single search bar pulling answers together

Zine went from its first line of code to a working MVP in about eight weeks. Its first paying customer arrived about four months in. One developer built it, and he says Claude Code did the coding for the whole build through September 2025.

He has not published revenue figures. What he did publish is a very clear account of how the build worked.

The founder, Kirk Marple, also has an unfair advantage, and he says so. Zine sits on top of Graphlit, the AI data platform he had spent two years building. The one point: the fastest vibe-coded products are often thin apps on top of infrastructure that already exists.

A note on timing: this story is from October 2025, about a year old. The product may have changed since; the current homepage pitches it a little differently.

The problem it solves

Your knowledge is scattered across email, chat, docs and tickets. Search inside each tool is weak, and nothing searches across all of them.

Zine connects to those tools and lets you chat with an AI that knows your stuff. The blog post lists Slack, Gmail, Google Calendar, GitHub, Notion, Linear, Jira, Google Drive "and 20+ others." It offers search across sources, AI chat with citations, real-time sync and an MCP server. MCP is a standard that lets AI tools, like your code editor's assistant, pull data from other apps.

The current homepage pitches it as "The AI that actually knows your stuff," with access to many AI models.

How it was built

How Zine is layered: a thin Next.js app written with Claude Code on top, the Graphlit data platform in the middle handling search and connectors, and hosted services like auth and caching underneath

Marple wrote the first line of code on March 15, 2025. His tool was Claude Code, Anthropic's coding agent that works in your terminal and edits your project. He started on the Claude Opus 4.1 model and later moved to Sonnet 4.5. He added Factory Droid, another AI coding agent, for wiring complex systems together.

His workflow is simple enough to copy tomorrow:

  1. Describe the feature in product terms, not code.
  2. Let Claude Code write the implementation.
  3. Review it.
  4. Test it in the browser.
  5. Ship.

He describes the shift as going from writing code to reviewing it. He puts the speed gain at 5 to 10 times.

The stack:

  • Next.js 15 with TypeScript, plus HeroUI and Tailwind for the interface
  • Next.js API routes for the backend
  • Clerk for sign-in
  • Upstash Redis for caching
  • Vercel for hosting
  • Graphlit's TypeScript SDK for everything data-heavy

That last line is the key. He lists what he did not have to build: vector databases, embedding pipelines, search, OAuth flows, webhook handling, transcription and entity extraction. Graphlit already did all of it. He estimates that saved four to five months of pure infrastructure work.

The post doesn't say which payment provider Zine uses.

How it makes money

This is the thin part of the story.

The blog post describes Zine as "free to start." It does not list paid plan prices. At the time of writing, zine.ai/pricing returns a "page not found" error, and the homepage shows no plans.

What we know for sure is the milestone he reported: a first paying customer about four months after the first line of code. He doesn't say how much they pay or how many customers followed.

So treat this as a build case study, not a revenue one.

How it got its first users

Marple doesn't describe a channel-by-channel launch. Two things are visible:

  • A Show HN post in October 2025, titled "I built a SaaS in 8 weeks, solo, using our own AI platform."
  • The build-in-public blog post itself, which doubles as marketing for both Zine and Graphlit.

That second point matters. Zine is a product and also a demo of what Graphlit can do. Every Zine user is proof for Graphlit's developer customers.

What to copy

  1. Build on something that already works. You may not own a platform, but you can pick services that do the hard parts. Auth, search, file handling and payments are all available as services.
  2. Describe features in product terms. Let the AI pick the code; you judge whether the result does the job.
  3. Become a reviewer. His speed-up came from reading code, not writing it. Learn enough to spot logic bugs.
  4. Be honest about your head start. He opens with it. Readers trust the rest of the story more because of it.

In his own summary, product sense now matters more than engineering chops. I'd add a caveat: that's easier to say after two years of building the engine underneath.

If you vibe-code this

Zine is the example here, not an audit subject. For any app that connects to users' Gmail, Drive or Slack and lets an AI search it, I'd check:

  1. Ask for the smallest OAuth scopes. OAuth is the "Allow access to your Google account" flow. Read-only beats full access. Store tokens encrypted on the server. See secure authentication.
  2. Scope every search to the signed-in user on the server. Never take a user or workspace ID from the browser. See IDOR authorization.
  3. Assume ingested content is hostile. An email can contain instructions aimed at your AI. See prompt injection.
  4. Lock down your MCP server. Per-user tokens, no shared keys. See MCP security tools.
  5. Check auth in each route, not only in middleware. See middleware auth bypass.

A search route that takes identity from the session, never the request body:

// app/api/search/route.ts
import { auth } from "@clerk/nextjs/server";
import { z } from "zod";

const Body = z.object({ query: z.string().min(1).max(500) });

export async function POST(req: Request) {
  const { userId } = await auth();
  if (!userId) return new Response("Unauthorized", { status: 401 });

  const parsed = Body.safeParse(await req.json());
  if (!parsed.success) return new Response("Bad request", { status: 400 });

  // searchIndex is your retrieval helper. The owner comes from the session only.
  const results = await searchIndex({ query: parsed.data.query, ownerId: userId });
  return Response.json(results);
}

Building something that reads people's inboxes? I review vibe-coded Next.js apps for data-isolation and OAuth issues. Email [email protected] with a link and your stack.

Key takeaway

Zine shows how fast a solo developer can ship when Claude Code writes the app and an existing platform handles the hard infrastructure. The revenue side is still undisclosed, so copy the build method, not an income expectation.

More case studies: Vibe-coded apps making money · The security checklist: Vibe coding security

Sources