Skip to content

Releases: dougwithseismic/hogsend

hogsend@0.13.2

10 Jun 21:32
fcf0296

Choose a tag to compare

Patch Changes

  • f6ae542: Claim the bare hogsend npm name: a new alias package whose bin forwards to @hogsend/cli, so npx hogsend / pnpm dlx hogsend upgrade work without the scope. @hogsend/cli now exports ./bin (and ./package.json) to support it.
  • Updated dependencies [f6ae542]
    • @hogsend/cli@0.13.2

create-hogsend@0.12.0

10 Jun 15:36
95c9e26

Choose a tag to compare

Minor Changes

  • 4d605bd: Scaffold first-run polish: dev/worker:dev watch src/** explicitly so newly added journeys restart the worker; ships a hatchet.yaml for the hatchet worker dev path; migration output no longer leaks raw Postgres NOTICE objects; the post-setup summary prints once; template database credentials are neutral hogsend (not growthhog); env.example documents the first-boot ingest-key mint.

create-hogsend@0.11.0

10 Jun 07:52
a7c7d3e

Choose a tag to compare

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
    then hogsend dev takes 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 cached EngineDomainStatus snapshot 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=true busts the
      cache), POST /v1/admin/domain (register), POST /v1/admin/domain/verify
      (provider verification pass). 501 provider_unsupported when 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_EMAIL while the configured
      EMAIL_DOMAIN is unverified — subject prefixed [TEST → original@…], cc/bcc
      dropped, Resend from overridden to onboarding@resend.dev,
      email_sends.metadata.originalTo recorded, structured
      email.test_mode_redirect WARN 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. auto only arms when
      EMAIL_DOMAIN is 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
      every events send option). 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 when CLOUDFLARE_API_TOKEN / VERCEL_TOKEN is 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 so setup and dev share
      it). ensureAuthSecret now also treats REPLACE_ME… values as placeholders.
    • Two new skills: hogsend-integrate (wire an existing product codebase to
      a running instance via @hogsend/client) and hogsend-migrate (audit +
      dual-write cutover off Loops / Customer.io / Resend Broadcasts) — bringing
      the bundle to 14, with /llms.txt + a docs agents page as the stable
      agent entrypoints.

    Providers (@hogsend/plugin-resend, @hogsend/plugin-postmark): both
    implement the optional domains capability — Resend via its Domains API
    (create/get/records/verify), Postmark via the account-level Domains/DKIM API
    (requires POSTMARK_ACCOUNT_TOKEN; without it the provider still sends, it
    just reports supported: false).

    Studio (@hogsend/studio): a new /setup view renders the
    EngineDomainStatus — domain, per-record DNS state, and the test-mode block.

    Scaffold (create-hogsend): a --domain <domain> flag (and interactive
    prompt) writes EMAIL_FROM=hello@<domain> + EMAIL_DOMAIN=<domain> into
    env.example so the bootstrap-copied .env inherits them; with no app-name
    positional the name defaults to the first domain label. env.example gains
    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.

@hogsend/studio@0.13.2

10 Jun 21:32
fcf0296

Choose a tag to compare

Patch Changes

  • f6ae542: Claim the bare hogsend npm name: a new alias package whose bin forwards to @hogsend/cli, so npx hogsend / pnpm dlx hogsend upgrade work without the scope. @hogsend/cli now exports ./bin (and ./package.json) to support it.

@hogsend/studio@0.13.1

10 Jun 20:34
67bc94c

Choose a tag to compare

Patch Changes

  • d632763: Allow a display name in the configured from address: RESEND_FROM_EMAIL and EMAIL_FROM now accept Doug 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

10 Jun 15:36
95c9e26

Choose a tag to compare

Minor Changes

  • 4d605bd: First-run experience hardening, found by dogfooding a fresh create-hogsend app:

    • /v1/health gains a non-breaking activity section (24h failed/completed journeys, failed/sent emails) so silent failures are visible; check-alerts now surfaces recent failures even with zero alert rules configured; journey run failures get a proper error log line.
    • First boot with an empty api_keys table mints an ingest-scoped key and prints it once to the deploy log (opt out with HOGSEND_BOOTSTRAP_API_KEY=false) — a template deploy now has a working data-plane credential out of the box.
    • New hogsend hatchet token CLI 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=auto is 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

10 Jun 14:37
aa302ad

Choose a tag to compare

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

10 Jun 08:21
a0d25cb

Choose a tag to compare

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 status and 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

10 Jun 07:52
a7c7d3e

Choose a tag to compare

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
    then hogsend dev takes 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 cached EngineDomainStatus snapshot 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=true busts the
      cache), POST /v1/admin/domain (register), POST /v1/admin/domain/verify
      (provider verification pass). 501 provider_unsupported when 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_EMAIL while the configured
      EMAIL_DOMAIN is unverified — subject prefixed [TEST → original@…], cc/bcc
      dropped, Resend from overridden to onboarding@resend.dev,
      email_sends.metadata.originalTo recorded, structured
      email.test_mode_redirect WARN 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. auto only arms when
      EMAIL_DOMAIN is 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
      every events send option). 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 when CLOUDFLARE_API_TOKEN / VERCEL_TOKEN is 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 so setup and dev share
      it). ensureAuthSecret now also treats REPLACE_ME… values as placeholders.
    • Two new skills: hogsend-integrate (wire an existing product codebase to
      a running instance via @hogsend/client) and hogsend-migrate (audit +
      dual-write cutover off Loops / Customer.io / Resend Broadcasts) — bringing
      the bundle to 14, with /llms.txt + a docs agents page as the stable
      agent entrypoints.

    Providers (@hogsend/plugin-resend, @hogsend/plugin-postmark): both
    implement the optional domains capability — Resend via its Domains API
    (create/get/records/verify), Postmark via the account-level Domains/DKIM API
    (requires POSTMARK_ACCOUNT_TOKEN; without it the provider still sends, it
    just reports supported: false).

    Studio (@hogsend/studio): a new /setup view renders the
    EngineDomainStatus — domain, per-record DNS state, and the test-mode block.

    Scaffold (create-hogsend): a --domain <domain> flag (and interactive
    prompt) writes EMAIL_FROM=hello@<domain> + EMAIL_DOMAIN=<domain> into
    env.example so the bootstrap-copied .env inherits them; with no app-name
    positional the name defaults to the first domain label. env.example gains
    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.

@hogsend/plugin-resend@0.13.2

10 Jun 21:32
fcf0296

Choose a tag to compare

Patch Changes

  • f6ae542: Claim the bare hogsend npm name: a new alias package whose bin forwards to @hogsend/cli, so npx hogsend / pnpm dlx hogsend upgrade work without the scope. @hogsend/cli now exports ./bin (and ./package.json) to support it.
  • Updated dependencies [f6ae542]
    • @hogsend/core@0.13.2
    • @hogsend/email@0.13.2