Blume: Open-source, Markdown-first documentation powered by Astro and Vite

handfuloflight1 pts0 comments

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...

comet message webhooks search send first

Related Articles