docs: humanize and rewrite the documentation#128
Conversation
Fix stale facts and strip AI-generated phrasing from the core docs: - The package ships 23 adapters, not 20; update every count. - Resend is not the only adapter that forwards idempotency keys: JetEmail, Lettermint, and Primitive also send Idempotency-Key. - The routing-name list was missing jetemail, lettermint, primitive. - The auth page claimed every adapter accepts baseUrl/headers/fetch; headers exists on five adapters and SMTP takes none of the three. - Replace bold-lead bullet marketing on the landing page with prose, cut em-dash chains and "never X" tails throughout. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
Every adapter page opened with the same "over fetch — no extra dependency" sentence and closed with the same "that is the only check that proves" line. Vary both per provider and lead with each provider's actual quirks instead. Accuracy fixes: - Resend page claimed it is the only adapter with native idempotency keys; JetEmail, Lettermint, and Primitive forward the header too. - Field-support matrix marked Unosend and SparkPost tags as "Values", but both preserve full name/value pairs. - Adapters index said 22 adapters; there are 23. - Note that Lettermint's 50-recipient cap is enforced provider-side, not pre-checked by the adapter. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
Same pass as the core pages: cut em-dash chains, negative parallelisms, and filler, and keep the substance. Accuracy fixes: - Production pipeline and message reference repeated the "only Resend transmits idempotency keys" claim; list all four adapters that forward the header, plus SMTP's Message-ID behavior. - Message reference now names Lettermint among the single-tag adapters. - Adapter contract no longer hardcodes "the 20 adapters". - Clarify the Convex component supports 20 provider kinds (it does not wrap jetemail/lettermint/primitive yet). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
Both READMEs were missing Lettermint, and the root README also dropped AWS SES from its adapter list. Update the count to 23, drop the emoji bullets, and tighten the package README intro. Badges and sponsor sections are untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Greptile SummaryThis PR is a documentation overhaul across all 56 MDX files and both READMEs. Every factual claim was verified against source code (
Confidence Score: 5/5Documentation-only PR with no source code changes; every factual claim was verified against adapter source files and utils.ts before being updated. All corrections checked out against the implementation: adapter count is exactly 23, idempotency-key header injection is present in jetemail/lettermint/primitive, SparkPost and Unosend both preserve tag names, the five-adapter headers option list matches source, and CLI table env vars match cli.ts line-for-line. The only executable change adds the missing fallback: ["ses"] to fix a dead-code example. No files require special attention. The changes are entirely in MDX documentation files; no production logic was touched. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["PR #128: Docs overhaul"] --> B["Factual corrections"]
A --> C["Missing adapter entries"]
A --> D["Prose/style cleanup"]
A --> E["Broken example fix"]
B --> B1["Adapter count: 22→23 everywhere"]
B --> B2["Idempotency-Key: Resend only→\nResend+JetEmail+Lettermint+Primitive"]
B --> B3["SparkPost/Unosend tags:\nValues→Yes (name+value preserved)"]
B --> B4["Tag-name semantics: One-tag providers\nPostmark=name:value, Mailtrap/Lettermint=value only"]
B --> B5["Auth page: headers option\nlimited to 5 adapters, not all"]
B --> B6["Convex: 20 provider kinds\nnot all 23 SDK adapters"]
C --> C1["CLI adapters/env table:\njetemail, lettermint, primitive rows added"]
C --> C2["CLI credential-flags table:\nlettermint own row (--api-token)"]
C --> C3["Adapter-model routing names:\njetemail, lettermint, primitive added"]
C --> C4["README adapter lists:\nAWS SES + Lettermint re-added"]
E --> E1["authentication.mdx example:\nfallback: ['ses'] was missing"]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A["PR #128: Docs overhaul"] --> B["Factual corrections"]
A --> C["Missing adapter entries"]
A --> D["Prose/style cleanup"]
A --> E["Broken example fix"]
B --> B1["Adapter count: 22→23 everywhere"]
B --> B2["Idempotency-Key: Resend only→\nResend+JetEmail+Lettermint+Primitive"]
B --> B3["SparkPost/Unosend tags:\nValues→Yes (name+value preserved)"]
B --> B4["Tag-name semantics: One-tag providers\nPostmark=name:value, Mailtrap/Lettermint=value only"]
B --> B5["Auth page: headers option\nlimited to 5 adapters, not all"]
B --> B6["Convex: 20 provider kinds\nnot all 23 SDK adapters"]
C --> C1["CLI adapters/env table:\njetemail, lettermint, primitive rows added"]
C --> C2["CLI credential-flags table:\nlettermint own row (--api-token)"]
C --> C3["Adapter-model routing names:\njetemail, lettermint, primitive added"]
C --> C4["README adapter lists:\nAWS SES + Lettermint re-added"]
E --> E1["authentication.mdx example:\nfallback: ['ses'] was missing"]
Reviews (4): Last reviewed commit: "merge main after telemetry (#141); keep ..." | Re-trigger Greptile |
…rom review - reference/cli.mdx: add jetemail, lettermint, primitive to the env and credential-flags tables so both match the detection order in cli.ts - authentication.mdx: set fallback: ["ses"] in the multi-provider example so SES is actually a fallback route - rewrite the six near-identical adapter-page closers (jetemail, lettermint, primitive, sequenzy, unosend, zeptomail) around what a live send proves for each provider - README: drop the em-dash + never construction on the server-side note - restructure the worst semicolon-swapped sentences in convex-email.mdx and production-send-pipeline.mdx Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Merge brings in delivery status tracking (#126), recipient variables (#125), scheduled sends (#127), the fumadocs SSR README (#121), AGENTS.md updates, and Homebrew 0.6.5. Conflicts resolved by keeping the humanized prose and main's feature facts; the field-support matrix re-verified cell-for-cell against SUPPORTED_MESSAGE_FIELDS, including the new Send at column. Also: clarify one-tag semantics (Postmark keeps name:value, Mailtrap and Lettermint keep only the value), document sendBulk in the adapter contract, add all_recipients_failed to the errors page, note per-recipient idempotency suffixing and per-recipient hook firing, cross-link recipientVariables and sendAt from the quickstart and landing page, and pre-add the telemetry disclosure sections to both READMEs ahead of the telemetry PR. Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
* docs: telemetry page, Homebrew install tab, convex typed returns Ports the real gaps from the Tembo draft PRs (#134, #136, #144) onto post-#128 main: - New /docs/telemetry page covering collected events, error-report redaction, storage/transport, CI detection, and every opt-out, verified against packages/email-sdk/src/telemetry.ts and core.ts. Adds the telemetry option to the client reference and a meta.json entry. - Homebrew tab on the install page plus a pointer from the CLI reference, matching Formula/email-sdk.rb and the release automation (which opens a formula-bump PR rather than pushing to main). - One-line notes that convex-email status/listEvents returns are typed and the ConvexEmailDoc/ConvexEmailEventDoc/ConvexEmailDeliveryStatus types are exported. Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e * docs(agents): live-check scripts also load .env after .env.local Generated-By: PostHog Code Task-Id: ec2538f2-5c80-4142-b4b3-b1a53394862e
Closes #105
What this does
A full pass over every current docs page (
apps/fumadocs/content/docs/**) and both READMEs, with two goals: make the docs read like a maintainer wrote them, and fix everything the docs get wrong about the code. All claims were verified againstpackages/email-sdk/src(types.ts, core.ts, utils.ts, every adapter, cli.ts) andpackages/convex-email. Routes, slugs, meta.json, versioned doc archives, the blog, and generated files are untouched.Factual errors corrected
Idempotency-Key; all four are now listed, along with SMTP'sMessage-IDbehavior.jetemail,lettermint, andprimitive.baseUrl/headers/fetch. Only five adapters takeheaders, and SMTP takes none of the three; the section now says which adapters take what.Slop removed
fetch— no extra dependency") and closer ("Drop--dry-runfor one real send — that is the only check that proves…") stamped across all 23 adapter pages. Each page keeps a uniform one-line opener (endpoint plusfetch), puts the provider's actual quirks in the sentence right after it, and closes with what a live send specifically proves for that provider.Review fixes
Follow-up commit addressing adversarial-review findings:
jetemail,lettermint, andprimitivein both the adapters/env table and the credential-flags table, which also made the auto-detection order wrong. Both tables now matchcli.tsrow for row (jetemail/lettermint/primitive sit betweensequenzyandplunkin detection order; Lettermint gets its own flags row for--api-token/--base-url/--route).fallback: ["ses"], leaving SES as dead code. Fixed.accepted/rejectedand async delivery for Primitive,jobIdand slug lookup for Sequenzy, Mail Agent scoping for ZeptoMail, and so on.components/convex-email.mdxandguides/production-send-pipeline.mdx, where several sentences were the old em-dash constructions with a semicolon swapped in. The most conspicuous ones were restructured into genuinely different sentences.Merge with main + new feature docs
Main moved a lot under this branch (#126 delivery status tracking, #125 recipient variables, #127 scheduled sends, #121 fumadocs README, #120/#122 AGENTS.md, #129 Homebrew). The merge keeps main's feature facts and this PR's prose:
SUPPORTED_MESSAGE_FIELDSinutils.ts.reference/message.mdx, the batch sections on the Mailgun/SendGrid pages, thesendAtsentences on all seven scheduling adapters, and the delivery-tracking +setConfig-replace sections on the Convex page (severity/Type-gated bounce mapping and sticky semantics verified againstlib.ts/worker.ts).sendBulkdocumented in the adapter contract,all_recipients_failedadded to the errors page, per-recipient idempotency-key suffixing noted in fallbacks-and-retries, and the per-recipientafterSend/onErrorfiring exception noted on the hooks page. The Iterable page now distinguishes its adapter-configsendAtfrom the rejected message-level field.Greptile P2 fixes
name:valuestring, Mailtrap and Lettermint forward only the value (verified against all three adapter sources).apps/fumadocs/README.md): already accurate on main as merged — the table, "How it works", and "Publishing cadence" all state the/og/blog/*max-age=86400(~1 day) window separately from the ~60s blog pages. No change needed.Telemetry pre-integration
Both READMEs already carry the telemetry disclosure section from the telemetry branch, rewritten in this PR's voice with identical facts (collected properties including recipient-variables/scheduling usage and delivery path, redaction rules,
~/.config/email-sdk/telemetry.json,EMAIL_SDK_TELEMETRY=0/DO_NOT_TRACK=1/telemetry: false/NODE_ENV=testopt-outs), so the post-merge rebase for that PR is near-clean.privacy.tsxis untouched here and merges cleanly from that branch. README feature lists now mention batch personalization and scheduled sends.Validation
bun run types:checkinapps/fumadocs(fumadocs-mdx + tsc): passes.bun run buildinapps/fumadocs: exit 0, all doc routes prerender.SUPPORTED_MESSAGE_FIELDSinutils.ts; CLI tables re-checked againstcli.tsafter the review fixes.Created with PostHog Code