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.
$ git clone https://github.com/blacklogos/sigil ~/Documents/sigil
$ cd ~/Documents/sigil && npm install && npm link
$ sig --version # 0.1.0
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.
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.
Run /email-rewrite in chat. Per-row diff, keep / regenerate / skip, writes accepted sentences back. Same flow on Antigravity and Codex.
Each recipient gets their own URL. Cloudflare Worker streams the PDF from R2, logs the click to KV. You see who actually clicked.
No tracking pixel. No "did they open it" guesswork. Click-rate on a real link is honest signal — and we don't pretend otherwise.
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.
Every subcommand has --json, exit codes that mean things, a confirm gate on real sends, and respects NO_COLOR. Human-first AND script-friendly.
Four steps from a Google Forms export to 30 emails in the right inbox.
sig init writes .env, drops agent shims, validates your CF token.
Drop CSV at data/leads.csv or pipe gog | sig ingest --stdin.
In Claude Code chat: /email-rewrite walks the queue with per-row approval.
sig send --test first, then sig send. Confirm y/N before shipping live.
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.
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.