Send 50 handwritten emails after your event.

A tiny CLI that drafts one sentence per recipient with a Claude Code slash command, ships a signed PDF link, and tracks every click. Built for the kind of follow-up worth pressing a seal into.

sig prompt — sigil 0.1.0 1/23 Ai <[email protected]> tone=bạn Subject: Slides PDF + lời cảm ơn Chào Ai, Cảm ơn bạn đã đến Sài Gòn AI · May hôm thứ Bảy. Slides bản PDF mình gửi qua link bên dưới — link riêng cho bạn: → https://pdf.mtri.me/p/Kqdq…2qbrr Actions: <Enter>=keep · /default · ?<prompt> · /quit ?reference her question about RAG retrieval latency QUEUE 8 queued for /email-rewrite kept=4 · default=9 · overwritten=2 y/N
Install
$ git clone https://github.com/blacklogos/sigil ~/Documents/sigil $ cd ~/Documents/sigil && npm install && npm link $ sig --version # 0.1.0

Why sigil?

The follow-up tool for the people who care about what they sign. Not bulk. Not Mailchimp. Just one email per recipient, written like it came from someone, because it did.

01

One sentence per recipient

The body is a template; the one line in the middle isn't. Every email has a sentence written specifically for that person — drafted with you, by you.

02

Claude Code in the loop

Run /email-rewrite in chat. Per-row diff, keep / regenerate / skip, writes accepted sentences back. Same flow on Antigravity and Codex.

03

Signed PDF link per recipient

Each recipient gets their own URL. Cloudflare Worker streams the PDF from R2, logs the click to KV. You see who actually clicked.

04

Click-rate, not open-rate

No tracking pixel. No "did they open it" guesswork. Click-rate on a real link is honest signal — and we don't pretend otherwise.

05

Vietnamese-first, multi-lang

The default template handles anh / em / bạn pronouns out of the box. English template included. Fork for any language with a simple {{var}} syntax.

06

Agent-callable CLI

Every subcommand has --json, exit codes that mean things, a confirm gate on real sends, and respects NO_COLOR. Human-first AND script-friendly.

How it works

Four steps from a Google Forms export to 30 emails in the right inbox.

1

Onboard

sig init writes .env, drops agent shims, validates your CF token.

2

Ingest

Drop CSV at data/leads.csv or pipe gog | sig ingest --stdin.

3

Handcraft

In Claude Code chat: /email-rewrite walks the queue with per-row approval.

4

Send

sig send --test first, then sig send. Confirm y/N before shipping live.

Email
Cloudflare Email Service
Storage + tracking
R2 + KV
Runtime
tsx + Node 22+
Built with
Claude Code
Companion to

cc4.marketing — Claude Code for marketers

The free interactive course where you learn the agent-loop patterns sigil ships. Module 3's capstone walks you through running a real campaign end-to-end. ~75 min hands-on.

Take the course

Frequently Asked Questions

Everything you need to know about sigil before you clone it.

sigil is a small open-source command-line tool for sending personalized follow-up emails after a talk, meeting, or event. Each recipient gets a single email with one sentence written specifically for them and a per-recipient signed PDF link served by a Cloudflare Worker. It is designed for VIP-list size sends of 50 or fewer recipients, not bulk marketing campaigns.

Run sig init to onboard a campaign workspace, drop your attendee CSV at data/leads.csv, run sig ingest, then sig prompt to walk each row and queue a one-line draft hint with the ? prefix. In Claude Code chat, run /email-rewrite; it walks the queue with per-row approval and writes the accepted sentences back to leads.json. Then run sig prep, deploy the Cloudflare Worker, send a test with sig send --test, and ship with sig send. The whole flow takes about 75 minutes for 30 recipients.

sigil's CLI runs in any terminal and does not require Claude Code. Every step except the sentence-drafting can be done by hand or scripted. The /email-rewrite slash command for handcrafting per-row sentences is designed for Claude Code, Antigravity, and Codex, but you can edit data/leads.json directly with any editor instead. If you script sigil without a chat agent, use the agent-callable flags --json, --yes, and exit codes 0/1/2/3.

Bulk email tools optimize for throughput and merge-tag templating; sigil optimizes for per-recipient craft. sigil writes one real sentence per row instead of substituting first names into a templated body. It tops out at around 50 recipients per send because that is the largest list a human can still review by hand. There is no segmentation engine, no A/B testing, no SaaS dashboard, and no contact-list-as-product model. You own the data as a single JSON file in your own repo.

sigil itself runs entirely on your machine. The CLI reads your local CSV and writes a local JSON file. Email sending happens via the Cloudflare Email Service API using your own Cloudflare account and your own verified sender domain. The per-recipient PDF link is served by a Cloudflare Worker that you deploy under your own custom domain. No data is sent to a sigil-operated server because there is no sigil-operated server.

When running sig init, choose the agents to install via --agents=claude,antigravity. The init wizard drops a thin shim file at .claude/commands/email-rewrite.md and .antigravity/commands/email-rewrite.md that points at the canonical agent-neutral instructions in prompts/email-rewrite.md. Codex reads sigil's AGENTS.md directly and does not need a separate shim. Every agent runs the same /email-rewrite verb and behaves consistently.

sigil is positioned for VIP-list size sends of 50 recipients or fewer. The technical cap from Cloudflare Email Service is 1,000 emails per day on the Workers Paid plan, but the practical cap is much lower because the value of sigil comes from a human handcrafting one sentence per recipient. Past 50 recipients, you cannot honestly review every row in one sitting and the per-row craft model breaks. For larger sends, use a bulk email tool.

Yes. sigil is open source under the MIT License. The source code lives at github.com/blacklogos/sigil. You can clone it, fork it, modify it, and ship something with it. The only running costs are your own Cloudflare Email Service plan (free tier covers 1,000 sends per day with Workers Paid at $5 per month) and a domain you control for the sender address and PDF link.

Yes. sigil ships with two templates: templates/body.md is the Vietnamese default with anh, em, and bạn pronoun handling, and templates/body.en.md is an English example. Set BODY_TEMPLATE=templates/body.en.md in your .env to switch. You can also fork either template file and write your own body shell in any language. The mustache {{var}} syntax for variables like name, personal_sentence, and event_name works in any language.

Yes. A done-with-you setup session is available: 90 minutes over Zoom, you bring your attendee list and PDF deck, and you leave with the first campaign sent to your test inbox. This covers the parts where sigil is opinionated (Cloudflare onboarding, sender domain DNS, the slash command flow) and is meant for marketers and event organizers who would rather pair on the first run than learn it solo. Reach out at mtri.me.