Releases: dougwithseismic/hogsend
hogsend@0.13.2
create-hogsend@0.12.0
Minor Changes
- 4d605bd: Scaffold first-run polish:
dev/worker:devwatchsrc/**explicitly so newly added journeys restart the worker; ships ahatchet.yamlfor thehatchet worker devpath; migration output no longer leaks raw Postgres NOTICE objects; the post-setup summary prints once; template database credentials are neutralhogsend(notgrowthhog); env.example documents the first-boot ingest-key mint.
create-hogsend@0.11.0
Minor Changes
-
b84092d: feat: zero-to-verified-domain onboarding — create --domain, hogsend dev, domain verification, provider-neutral test mode, agent skills
The DX-onboarding train:
pnpm create hogsend@latest my-app --domain mysite.com
thenhogsend devtakes a developer from nothing to a running local loop with a
sending domain wired — and test mode keeps every send safe (redirected to your
own inbox) until the domain's DNS verifies.Core (
@hogsend/core):- Domains capability contract (
providers/domains.ts, new):DnsRecord,
DomainStatus,DomainVerificationState, and the optional
DomainsCapability(create/get/records/verify?).EmailProvider
gains one optional member —domains?— whose presence is the capability
gate; providers without it degrade gracefully everywhere.
Engine (
@hogsend/engine):- Domain-status service (
lib/domain-status.ts, exposed as
client.domainStatus): the cachedEngineDomainStatussnapshot every
surface consumes (admin route, CLI, Studio, mailer). In-memory cache —
10 min TTL once verified, 60 s while unverified (so test mode auto-exits
≤ 60 s after DNS verifies). The per-send path is sync + cache-only and
fail-open: a provider outage can never silently redirect production mail. - Admin domain routes:
GET /v1/admin/domain(?refresh=truebusts the
cache),POST /v1/admin/domain(register),POST /v1/admin/domain/verify
(provider verification pass). 501provider_unsupportedwhen the active
provider has no domains capability. Provider API keys never leave the server. - Provider-neutral test-mode sends (
lib/test-mode.ts+ the mailer): with
HOGSEND_TEST_MODE=auto(default), every send is redirected to
HOGSEND_TEST_EMAIL ?? STUDIO_ADMIN_EMAILwhile the configured
EMAIL_DOMAINis unverified — subject prefixed[TEST → original@…], cc/bcc
dropped, Resendfromoverridden toonboarding@resend.dev,
email_sends.metadata.originalTorecorded, structured
email.test_mode_redirectWARN per send plus a one-line banner per
activate/exit flip. Active-but-unaddressable sends are BLOCKED (recorded as
failed), never delivered to the real recipient.autoonly arms when
EMAIL_DOMAINis set AND the provider supports domains — existing deploys
are untouched. - New env:
EMAIL_DOMAIN,HOGSEND_TEST_MODE(auto|true|false, default
auto),HOGSEND_TEST_EMAIL,POSTMARK_ACCOUNT_TOKEN.
CLI (
@hogsend/cli):hogsend dev— the one-command local loop: detect/start infra, ensure
.env+ auth secret, migrate, spawn API + worker (line-prefixed), wait for
health, print the URL block (API / Studio / Hatchet / docs) and a
domain/test-mode status line. Flags:--cwd,--no-worker,--no-infra,
and--fire <event>(sends a test event to the running instance, accepting
everyevents sendoption). Ctrl+C tears down the whole process tree
(SIGTERM, SIGKILL after 5 s).hogsend domain add|check|status— register the domain through the
running instance's admin routes, print the DNS records formatted for YOUR
DNS host (NS-lookup detection: Cloudflare, Vercel, Route 53, GoDaddy,
Namecheap, Porkbun, Google Domains) with a panel deep link, auto-apply on
Cloudflare/Vercel whenCLOUDFLARE_API_TOKEN/VERCEL_TOKENis present
(CLI-side only), and poll verification every 15 s (--timeout,--once,
--json).- New libs:
lib/dns.ts,lib/dns-apply.ts,lib/proc.ts, and
lib/setup-steps.ts(the setup flow extracted sosetupanddevshare
it).ensureAuthSecretnow also treatsREPLACE_ME…values as placeholders. - Two new skills:
hogsend-integrate(wire an existing product codebase to
a running instance via@hogsend/client) andhogsend-migrate(audit +
dual-write cutover off Loops / Customer.io / Resend Broadcasts) — bringing
the bundle to 14, with/llms.txt+ a docsagentspage as the stable
agent entrypoints.
Providers (
@hogsend/plugin-resend,@hogsend/plugin-postmark): both
implement the optionaldomainscapability — Resend via its Domains API
(create/get/records/verify), Postmark via the account-level Domains/DKIM API
(requiresPOSTMARK_ACCOUNT_TOKEN; without it the provider still sends, it
just reportssupported: false).Studio (
@hogsend/studio): a new/setupview renders the
EngineDomainStatus— domain, per-record DNS state, and the test-mode block.Scaffold (
create-hogsend): a--domain <domain>flag (and interactive
prompt) writesEMAIL_FROM=hello@<domain>+EMAIL_DOMAIN=<domain>into
env.exampleso the bootstrap-copied.envinherits them; with no app-name
positional the name defaults to the first domain label.env.examplegains
the commented "Sending domain" + test-mode block; the README leads with
hogsend dev; the two new skills ship in.claude/skills/.The rest of the engine-line packages bump in lockstep to keep the version line
uniform (release-doctor invariant); they carry no functional change here. - Domains capability contract (
@hogsend/studio@0.13.2
Patch Changes
- f6ae542: Claim the bare
hogsendnpm name: a new alias package whose bin forwards to@hogsend/cli, sonpx hogsend/pnpm dlx hogsend upgradework without the scope.@hogsend/clinow exports./bin(and./package.json) to support it.
@hogsend/studio@0.13.1
Patch Changes
- d632763: Allow a display name in the configured from address:
RESEND_FROM_EMAILandEMAIL_FROMnow acceptDoug at Hogsend <doug@hogsend.com>as well as a bare address. Sending-domain derivation (test mode, domain status) parses either form.
@hogsend/studio@0.13.0
Minor Changes
-
4d605bd: First-run experience hardening, found by dogfooding a fresh create-hogsend app:
/v1/healthgains a non-breakingactivitysection (24h failed/completed journeys, failed/sent emails) so silent failures are visible;check-alertsnow surfaces recent failures even with zero alert rules configured; journey run failures get a proper error log line.- First boot with an empty
api_keystable mints an ingest-scoped key and prints it once to the deploy log (opt out withHOGSEND_BOOTSTRAP_API_KEY=false) — a template deploy now has a working data-plane credential out of the box. - New
hogsend hatchet tokenCLI command mints a Hatchet client token headlessly (register/login → tenant → token) against a hatchet-lite instance. - Restricted email-provider keys (can send, can't read domains) now warn once with a clear explanation that
HOGSEND_TEST_MODE=autois inert, then back off for 6h instead of warning every 40s; a real fetched domain status is never overwritten by the fail-open path. - Worker startup logs the registered journey ids (not just a count) so a stale dev worker is visible at a glance.
- Engine logger's default service name no longer leaks "growthhog-api" into consumer apps.
- New index on
journey_states.updated_at(migration 0022) backing the health activity counts.
@hogsend/studio@0.12.2
Patch Changes
- d9a1a47: Keep the engine version line uniform for the plugin-resend tag-sanitization patch — all engine-line packages move to the same patch version together.
@hogsend/studio@0.12.1
Patch Changes
-
ee5a10f: fix: surface provider domains-API failures as 502 with the provider message
GET/POST /v1/admin/domain(and/verify) let a provider error — e.g. a
send-only restricted Resend key that cannot read the domains API — escape as
an opaque 500. The routes now catch provider failures and return
502 { error: "domains request to provider \"resend\" failed: …" }, which
hogsend domain statusand Studio's Setup view render directly, so a
restricted key tells you exactly what to fix (use a full-access key) instead
of "Internal Server Error". Found by the live test-mode smoke; the send path
was already fail-open and unaffected.The rest of the engine-line packages bump in lockstep to keep the version
line uniform; they carry no functional change here.
@hogsend/studio@0.12.0
Minor Changes
-
b84092d: feat: zero-to-verified-domain onboarding — create --domain, hogsend dev, domain verification, provider-neutral test mode, agent skills
The DX-onboarding train:
pnpm create hogsend@latest my-app --domain mysite.com
thenhogsend devtakes a developer from nothing to a running local loop with a
sending domain wired — and test mode keeps every send safe (redirected to your
own inbox) until the domain's DNS verifies.Core (
@hogsend/core):- Domains capability contract (
providers/domains.ts, new):DnsRecord,
DomainStatus,DomainVerificationState, and the optional
DomainsCapability(create/get/records/verify?).EmailProvider
gains one optional member —domains?— whose presence is the capability
gate; providers without it degrade gracefully everywhere.
Engine (
@hogsend/engine):- Domain-status service (
lib/domain-status.ts, exposed as
client.domainStatus): the cachedEngineDomainStatussnapshot every
surface consumes (admin route, CLI, Studio, mailer). In-memory cache —
10 min TTL once verified, 60 s while unverified (so test mode auto-exits
≤ 60 s after DNS verifies). The per-send path is sync + cache-only and
fail-open: a provider outage can never silently redirect production mail. - Admin domain routes:
GET /v1/admin/domain(?refresh=truebusts the
cache),POST /v1/admin/domain(register),POST /v1/admin/domain/verify
(provider verification pass). 501provider_unsupportedwhen the active
provider has no domains capability. Provider API keys never leave the server. - Provider-neutral test-mode sends (
lib/test-mode.ts+ the mailer): with
HOGSEND_TEST_MODE=auto(default), every send is redirected to
HOGSEND_TEST_EMAIL ?? STUDIO_ADMIN_EMAILwhile the configured
EMAIL_DOMAINis unverified — subject prefixed[TEST → original@…], cc/bcc
dropped, Resendfromoverridden toonboarding@resend.dev,
email_sends.metadata.originalTorecorded, structured
email.test_mode_redirectWARN per send plus a one-line banner per
activate/exit flip. Active-but-unaddressable sends are BLOCKED (recorded as
failed), never delivered to the real recipient.autoonly arms when
EMAIL_DOMAINis set AND the provider supports domains — existing deploys
are untouched. - New env:
EMAIL_DOMAIN,HOGSEND_TEST_MODE(auto|true|false, default
auto),HOGSEND_TEST_EMAIL,POSTMARK_ACCOUNT_TOKEN.
CLI (
@hogsend/cli):hogsend dev— the one-command local loop: detect/start infra, ensure
.env+ auth secret, migrate, spawn API + worker (line-prefixed), wait for
health, print the URL block (API / Studio / Hatchet / docs) and a
domain/test-mode status line. Flags:--cwd,--no-worker,--no-infra,
and--fire <event>(sends a test event to the running instance, accepting
everyevents sendoption). Ctrl+C tears down the whole process tree
(SIGTERM, SIGKILL after 5 s).hogsend domain add|check|status— register the domain through the
running instance's admin routes, print the DNS records formatted for YOUR
DNS host (NS-lookup detection: Cloudflare, Vercel, Route 53, GoDaddy,
Namecheap, Porkbun, Google Domains) with a panel deep link, auto-apply on
Cloudflare/Vercel whenCLOUDFLARE_API_TOKEN/VERCEL_TOKENis present
(CLI-side only), and poll verification every 15 s (--timeout,--once,
--json).- New libs:
lib/dns.ts,lib/dns-apply.ts,lib/proc.ts, and
lib/setup-steps.ts(the setup flow extracted sosetupanddevshare
it).ensureAuthSecretnow also treatsREPLACE_ME…values as placeholders. - Two new skills:
hogsend-integrate(wire an existing product codebase to
a running instance via@hogsend/client) andhogsend-migrate(audit +
dual-write cutover off Loops / Customer.io / Resend Broadcasts) — bringing
the bundle to 14, with/llms.txt+ a docsagentspage as the stable
agent entrypoints.
Providers (
@hogsend/plugin-resend,@hogsend/plugin-postmark): both
implement the optionaldomainscapability — Resend via its Domains API
(create/get/records/verify), Postmark via the account-level Domains/DKIM API
(requiresPOSTMARK_ACCOUNT_TOKEN; without it the provider still sends, it
just reportssupported: false).Studio (
@hogsend/studio): a new/setupview renders the
EngineDomainStatus— domain, per-record DNS state, and the test-mode block.Scaffold (
create-hogsend): a--domain <domain>flag (and interactive
prompt) writesEMAIL_FROM=hello@<domain>+EMAIL_DOMAIN=<domain>into
env.exampleso the bootstrap-copied.envinherits them; with no app-name
positional the name defaults to the first domain label.env.examplegains
the commented "Sending domain" + test-mode block; the README leads with
hogsend dev; the two new skills ship in.claude/skills/.The rest of the engine-line packages bump in lockstep to keep the version line
uniform (release-doctor invariant); they carry no functional change here. - Domains capability contract (
@hogsend/plugin-resend@0.13.2
Patch Changes
- f6ae542: Claim the bare
hogsendnpm name: a new alias package whose bin forwards to@hogsend/cli, sonpx hogsend/pnpm dlx hogsend upgradework without the scope.@hogsend/clinow exports./bin(and./package.json) to support it. - Updated dependencies [f6ae542]
- @hogsend/core@0.13.2
- @hogsend/email@0.13.2