Pick-up ticket. SMTP is the last broken auth path. Everything is diagnosed, the API key is already saved, and the only blocker is 3 DNS records that must be added by hand at Squarespace. Blocked 2026-07-15 because the owner couldn't get into Squarespace at the time — not a technical unknown.
Split out of #287 so that ticket can close (Google + GitHub OAuth are both fixed and verified).
TL;DR to resume
- Log into Squarespace (the registrar — see "Where DNS actually lives" below).
- Add the 3 DNS records shown in the Resend dashboard (https://resend.com/domains →
scripthammer.com).
- Click "I've already added the records" in Resend; wait for Verified.
- Tell Claude — it can verify propagation via DNS-over-HTTPS and then wire Supabase SMTP + test a real password-reset email end-to-end.
Est. 15 min, most of it waiting on DNS.
Current state (verified 2026-07-15)
| Thing |
State |
| Supabase SMTP |
Entirely unset — smtp_host, smtp_port, smtp_user, smtp_pass, smtp_sender_name, smtp_admin_email all null |
| Fallback sender |
Supabase's built-in testing sender, rate_limit_email_sent = 2/hour → signup returns 429 over_email_send_rate_limit |
mailer_autoconfirm |
false (correct for prod — email confirmation required, which is exactly why this matters) |
| Resend API key |
✅ Saved in gitignored .env as RESEND_API_KEY — validated working (test email sent, id 6a554316-4638-4a47-871b-62dc86645554) |
scripthammer.com in Resend |
Added but NOT verified — DNS records not yet placed |
| Resend DNS records live? |
❌ none — resend._domainkey, send TXT, send MX all return NXDOMAIN |
Why the shared resend.dev sender is NOT a usable stopgap
Verified by direct API test:
from: noreply@scripthammer.com → 403 The scripthammer.com domain is not verified
from: onboarding@resend.dev → to the account owner (jonpohlner@gmail.com) → ✅ works
from: onboarding@resend.dev → to anyone else → 403 "You can only send testing emails to your own email address… verify a domain"
Do NOT wire Supabase to resend.dev. It would deliver only to the owner and silently fail for every real user — a configured-looking system that's broken for everyone else. Strictly worse than today's honest 2/hr limit. Domain verification is mandatory, not optional.
The 3 records to add
⚠️ Copy the exact values from https://resend.com/domains → scripthammer.com. The dashboard truncates them on screen with [...] — click each to expand. They are NOT recorded here on purpose: a transcribed/truncated DKIM key fails silently and wastes another session.
| Type |
Host / Name |
Value |
Priority |
| TXT |
resend._domainkey |
p=MIGfMA…QIDAQAB (long DKIM public key) |
— |
| TXT |
send |
v=spf1 include:amazonses.com ~all |
— |
| MX |
send |
feedback-smtp.<region>.amazonses.com |
10 |
DMARC (_dmarc TXT) is listed as Optional in Resend — skip it.
⚠️ Do not disturb the existing records
scripthammer.com already has live DNS that must be left alone:
A scripthammer.com → 185.199.108.153 / .109 / .110 / .111 (GitHub Pages)
CNAME www → tortoisewolfe.github.io.
TXT scripthammer.com → "v=spf1 include:mailgun.org ~all" (apex SPF — LEAVE)
TXT scripthammer.com → "google-site-verification=70XuW09…" (LEAVE)
MX scripthammer.com → 10 mxa.mailgun.org / mxb.mailgun.org (apex MX — LEAVE)
The Resend records all live on subdomains (send, resend._domainkey), so they do not collide with the apex Mailgun SPF/MX. Changing the apex MX would break anything currently receiving mail at @scripthammer.com.
Where DNS actually lives (this cost an hour — read it)
Registrar: Squarespace Domains II LLC (confirmed via RDAP against Verisign).
The nameservers are NS-CLOUD-A1..A4.GOOGLEDOMAINS.COM, which looks like Google Cloud DNS but is not. Google Domains was sold to Squarespace in 2023; the googledomains.com nameserver hostnames persisted through the migration.
Dead ends already ruled out — do not repeat:
- ❌ Google Cloud DNS (
console.cloud.google.com/net-services/dns/zones?project=scripthammer) — the console says "Cloud DNS API has not been used in project scripthammer before or it is disabled" and No rows to display. There is no zone there. Checking other GCP projects is a waste of time; the SOA is Google-hosted legacy infrastructure, not a zone you own in GCP.
- ❌ Mailgun (
app.mailgun.com) — the apex MX/SPF point at Mailgun from some prior setup, but the owner's login fails with "Bad username or password." Account is inaccessible. The records are orphaned leftovers.
- ✅ Squarespace is correct. Resend's own "Go to Squarespace" button on the domain page had it right from the start.
Link: https://account.squarespace.com/domains (if that 404s, sign in from https://www.squarespace.com/ and use the account menu → Domains → scripthammer.com → DNS). Note login.squarespace.com does not resolve.
After the domain verifies — what Claude does (no owner action)
Supabase → Project Settings → Authentication → SMTP (or via Management API)
host smtp.resend.com
port 587
username resend
password <RESEND_API_KEY from .env>
sender noreply@scripthammer.com
sender name ScriptHammer
Then:
Knock-on effects when this lands
Not blocking anything
All three sign-in paths work today: email+password ✅, Google ✅ (verified — google identity row), GitHub ✅ (verified — github identity row). SMTP only affects password-reset and new-user-confirmation email. It has been broken for months; nothing regressed.
Tracked under #280 (criterion 3: production operations posture). Related: #287 (OAuth — resolved), #288 (the testing gap that hid all of this).
Pick-up ticket. SMTP is the last broken auth path. Everything is diagnosed, the API key is already saved, and the only blocker is 3 DNS records that must be added by hand at Squarespace. Blocked 2026-07-15 because the owner couldn't get into Squarespace at the time — not a technical unknown.
Split out of #287 so that ticket can close (Google + GitHub OAuth are both fixed and verified).
TL;DR to resume
scripthammer.com).Est. 15 min, most of it waiting on DNS.
Current state (verified 2026-07-15)
smtp_host,smtp_port,smtp_user,smtp_pass,smtp_sender_name,smtp_admin_emailallnullrate_limit_email_sent = 2/hour → signup returns429 over_email_send_rate_limitmailer_autoconfirmfalse(correct for prod — email confirmation required, which is exactly why this matters).envasRESEND_API_KEY— validated working (test email sent, id6a554316-4638-4a47-871b-62dc86645554)scripthammer.comin Resendresend._domainkey,sendTXT,sendMX all return NXDOMAINWhy the shared
resend.devsender is NOT a usable stopgapVerified by direct API test:
from: noreply@scripthammer.com→ 403The scripthammer.com domain is not verifiedfrom: onboarding@resend.dev→ to the account owner (jonpohlner@gmail.com) → ✅ worksfrom: onboarding@resend.dev→ to anyone else → 403 "You can only send testing emails to your own email address… verify a domain"Do NOT wire Supabase to
resend.dev. It would deliver only to the owner and silently fail for every real user — a configured-looking system that's broken for everyone else. Strictly worse than today's honest 2/hr limit. Domain verification is mandatory, not optional.The 3 records to add
scripthammer.com. The dashboard truncates them on screen with[...]— click each to expand. They are NOT recorded here on purpose: a transcribed/truncated DKIM key fails silently and wastes another session.resend._domainkeyp=MIGfMA…QIDAQAB(long DKIM public key)sendv=spf1 include:amazonses.com ~allsendfeedback-smtp.<region>.amazonses.comDMARC (
_dmarcTXT) is listed as Optional in Resend — skip it.scripthammer.comalready has live DNS that must be left alone:The Resend records all live on subdomains (
send,resend._domainkey), so they do not collide with the apex Mailgun SPF/MX. Changing the apex MX would break anything currently receiving mail at@scripthammer.com.Where DNS actually lives (this cost an hour — read it)
Registrar:
Squarespace Domains II LLC(confirmed via RDAP against Verisign).The nameservers are
NS-CLOUD-A1..A4.GOOGLEDOMAINS.COM, which looks like Google Cloud DNS but is not. Google Domains was sold to Squarespace in 2023; thegoogledomains.comnameserver hostnames persisted through the migration.Dead ends already ruled out — do not repeat:
console.cloud.google.com/net-services/dns/zones?project=scripthammer) — the console says "Cloud DNS API has not been used in project scripthammer before or it is disabled" andNo rows to display. There is no zone there. Checking other GCP projects is a waste of time; the SOA is Google-hosted legacy infrastructure, not a zone you own in GCP.app.mailgun.com) — the apex MX/SPF point at Mailgun from some prior setup, but the owner's login fails with "Bad username or password." Account is inaccessible. The records are orphaned leftovers.Link: https://account.squarespace.com/domains (if that 404s, sign in from https://www.squarespace.com/ and use the account menu → Domains →
scripthammer.com→ DNS). Notelogin.squarespace.comdoes not resolve.After the domain verifies — what Claude does (no owner action)
Then:
rate_limit_email_sentoff the testing default of2.Knock-on effects when this lands
RESEND_API_KEY → send-payment-emailbacklog item — the edge function already exists (supabase/functions/send-payment-email/index.ts) and readsRESEND_API_KEY; the key just needs adding to Supabase's edge-function secrets (pnpm supabase:secrets --apply). Currently 14 secrets are set;RESEND_API_KEYis not among them.Not blocking anything
All three sign-in paths work today: email+password ✅, Google ✅ (verified —
googleidentity row), GitHub ✅ (verified —githubidentity row). SMTP only affects password-reset and new-user-confirmation email. It has been broken for months; nothing regressed.Tracked under #280 (criterion 3: production operations posture). Related: #287 (OAuth — resolved), #288 (the testing gap that hid all of this).