Blume — fast, AI-ready, markdown-first docsSkip to contentBlume is now publicly available.
Search⌘KEsc
↑↓navigate↵open⌘Jpreview
Latest update, v1.0.3World-class docs foreverything you ship.<br>Fast, AI-ready, and zero-config. Drop Markdown into a folder and ship a production-grade docs site, no app boilerplate to write or maintain. Free and open source, forever.<br>$npx blume init
Read the docsView the code
svg]:h-5 [&>svg]:w-auto">Comet<br>Search⌘K
Get started<br>Introduction<br>Quickstart<br>Authentication<br>SDKs
Sending<br>Messages<br>Templates<br>Batches<br>Scheduling<br>Attachments
Deliverability<br>Domains<br>Webhooks<br>Suppressions
Reference<br>API keys<br>Rate limits<br>Errors
Quickstart<br>Send your first transactional message in minutes. Comet's REST API works with any language — this guide uses the official TypeScript SDK.<br>:first-child]:mt-0! [&>:last-child]:mb-0!">Store your API key in an environment variable — never commit it to source control.<br>Install the SDK<br>Add Comet to your project with your package manager of choice. The SDK ships with TypeScript types and runs on Node, Bun, and Deno.<br>npm install comet
Send a message<br>Create a client with your API key, then call messages.send. Every request returns an id you can use to track delivery.<br>import { Comet } from "comet";
const comet = new Comet(process.env.COMET_API_KEY);
const { id } = await comet.messages.send({<br>to: "ada@example.com",<br>template: "welcome",<br>});
console.log(`Queued ${id}`);
Use a template<br>Reference a template by slug and pass variables — Comet renders the subject and body server-side, so your app never ships copy.<br>Track delivery<br>Poll the message endpoint, or subscribe to webhooks for real-time delivery, open, click, and bounce events as they happen.<br>Handle webhooks<br>Verify the signature on each request, then react to the event — here we mark a message delivered in our own database.<br>app.post("/webhooks/comet", (req, res) => {<br>const event = comet.webhooks.verify(req);
if (event.type === "message.delivered") {<br>markDelivered(event.data.id);
res.sendStatus(200);<br>});
Next steps<br>Authentication→Webhooks reference→API reference→
On this page<br>Install the SDK<br>Send a message<br>Use a template<br>Track delivery<br>Handle webhooks<br>Next steps
Batteries included.<br>Everything a production docs site needs — zero-config setup, AI, a component library, search, SEO, and i18n — without a plugin to install or a service to wire up.
Zero-config, even the template<br>A folder of Markdown is a complete project — there's no starter to clone and no template to keep in sync with upstream.<br>Navigation is inferred from your files<br>Search, theming, and OG images are on by default<br>Reach for configuration only when you need it
svg]:h-4 [&>svg]:w-auto">Comet<br>Search⌘K<br>Get started<br>Introduction<br>Quickstart<br>Authentication<br>Components
Sending<br>Messages<br>Templates<br>Webhooks
Platform<br>Logs<br>Search<br>Analytics
Get started<br>Introduction<br>Comet is a transactional email & SMS API. Send your first message in minutes, then add templates, webhooks, and analytics as you grow.<br>Quickstart<br>Send your first message
Authentication<br>API keys & scopes
Every request is idempotent — safely retry without sending twice.
What's included<br>Full-text searchOG images & SEODark mode36 locales (i18n)<br>Quickstart→Configuration→
On this page<br>Why Comet<br>What's included<br>Next steps
Interactive API references<br>Drop in an OpenAPI or AsyncAPI spec and Blume renders a full interactive reference — endpoints, schemas, and a live playground.<br>OpenAPI and AsyncAPI specs<br>Interactive “Try it” playground<br>Powered by Scalar, themed to match
svg]:h-4 [&>svg]:w-auto">Comet<br>Search⌘K<br>Messages<br>Send messagePOST<br>Get messageGET<br>Delete messageDEL
Templates<br>List templatesGET<br>Create templatePOST
API reference<br>Get a message<br>GET/messages/{id}<br>Returns a single message by its ID — rendered straight from your OpenAPI spec, with a live “Try it” playground.<br>Path Parameters<br>idstringrequiredThe ID of the message to return.
Responses<br>200successful operation<br>"id": "msg_01H8...",<br>"to": "ada@example.com",<br>"status": "delivered"
On this page<br>Parameters<br>Responses<br>Schema
A built-in changelog<br>Write each release as a Markdown entry — or point Blume at your GitHub Releases — and every one rolls up into a generated timeline at /changelog.<br>Timeline page and permalinks, newest-first<br>Source entries straight from GitHub Releases<br>RSS feed on by default
svg]:h-4 [&>svg]:w-auto">Comet<br>Search⌘K<br>Changelog<br>comet@2.1.0<br>July 8, 2026<br>Release<br>Minor Changes<br>a1f92c3: Add segments — broadcast a message to a saved audience straight from the API.<br>7c04b1e: Export delivery analytics from the new /analytics/export endpoint.
comet@2.0.4<br>June 26, 2026<br>Release<br>Patch Changes<br>9b3d5a7: Use exponential retry.backoff for webhook retries instead of a fixed interval.<br>04e8c2f: Fix templates.render dropping default variables.
comet@2.0.0<br>June 12, 2026<br>Release<br>Major Changes<br>f31c88a: The v2 API is generally available.
Components, included<br>30+ accessible components and a curated set of Markdown extensions, usable in any .mdx page...