@kurtbruns/kestrel 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/dist/public/dashboard/app.js +1 -1
- package/dist/public/dashboard/app.js.map +1 -1
- package/dist/public/dashboard/index.html +1 -1
- package/dist/worker/index.js +18 -18
- package/docs/get-started/02-deploy.md +3 -5
- package/docs/get-started/03-access.md +5 -3
- package/docs/get-started/04-ses.md +82 -115
- package/docs/get-started/05-verify.md +15 -19
- package/docs/guides/01-allow-claude.md +1 -1
- package/docs/guides/03-notifications.md +2 -2
- package/docs/publishing/02-sending-rules.md +2 -2
- package/docs/publishing/03-name-your-publication.md +1 -1
- package/docs/publishing/06-troubleshooting.md +29 -68
- package/docs/publishing/10-check-your-setup.md +1 -1
- package/docs/reference/01-configuration.md +4 -2
- package/docs/reference/02-sending-domain-dns.md +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,13 @@ To move a running instance from one version to another, follow [Upgrade to a new
|
|
|
10
10
|
|
|
11
11
|
<!-- Add entries under Added / Changed / Fixed / Breaking. One operator-facing line each; see .claude/rules/changelog.md. Upgrade steps (a migration, a new setting) go once, in the Upgrading paragraph, never on an entry. -->
|
|
12
12
|
|
|
13
|
+
## [1.17.0] - 2026-10-26
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- The setup guide's Connect Amazon SES page is rewritten for a newcomer. It stores each secret as soon as its value exists, makes the custom MAIL FROM domain a regular step, and checks that the From address has no inbox before forwarding it. The section on switching an instance that already sends is gone, and its caution moves to Configuration's `PROVIDER`. Its sections are renumbered, so a bookmark to one now lands at the page's top. Verify it works, Deploy the app, and Lock the dashboard with Access are tightened to match, and Verify's Send now steps follow the editor's order.
|
|
18
|
+
- The Troubleshooting docs page is organized around what you'd ask (a send is held, a reader never got a post, someone may have been mailed twice) instead of listing each on-screen message, since the screen already says each fix. It keeps the fixes made outside Kestrel, in Amazon SES or Cloudflare, and the decisions that are yours.
|
|
19
|
+
|
|
13
20
|
## [1.16.0] - 2026-10-26
|
|
14
21
|
|
|
15
22
|
**Upgrading from 1.15.1.** At the top level of your instance's `wrangler.jsonc`, outside `env`, add `"workers_dev": false` and `"preview_urls": false`, and change `triggers` to `{ "crons": [] }`, as a new instance now has, so a deploy without `--env production` answers on no address and never runs the send sweep. Keep the empty list rather than deleting the line, since only a list clears a schedule, and keep the `* * * * *` cron in `production`'s own `triggers`. If you ever deployed without `--env production`, that Worker is still live: remove it with `npx wrangler delete --name kestrel`. A log filter or alert on `auth.service` finds nothing now: filter on `principal` = `service` instead. Run `npm run check-context` in your instance's repository: this release changes the operator's Claude context, and a copy you've edited is merged by hand.
|
|
@@ -654,7 +661,8 @@ The first tagged release: a self-contained newsletter app on a Cloudflare Worker
|
|
|
654
661
|
- A build-version stamp: every instance reports its version, commit, and build time, read-only in the editor and at `GET /api/version`.
|
|
655
662
|
- This changelog and a semantic-versioning release process.
|
|
656
663
|
|
|
657
|
-
[Unreleased]: https://github.com/kurtbruns/kestrel/compare/v1.
|
|
664
|
+
[Unreleased]: https://github.com/kurtbruns/kestrel/compare/v1.17.0...HEAD
|
|
665
|
+
[1.17.0]: https://github.com/kurtbruns/kestrel/releases/tag/v1.17.0
|
|
658
666
|
[1.16.0]: https://github.com/kurtbruns/kestrel/releases/tag/v1.16.0
|
|
659
667
|
[1.15.1]: https://github.com/kurtbruns/kestrel/releases/tag/v1.15.1
|
|
660
668
|
[1.15.0]: https://github.com/kurtbruns/kestrel/releases/tag/v1.15.0
|
|
@@ -367,7 +367,7 @@
|
|
|
367
367
|
</div>
|
|
368
368
|
</div>
|
|
369
369
|
</div>
|
|
370
|
-
</section>`}function tl(e,t){let{state:n}=t,s=t.data.settings.confirmation_email_default,i={subject:c("#ceSubject",e),message:c("#ceMessage",e),button:c("#ceButton",e),footer:c("#ceFooter",e)},a={avatar:c("#cePvAvatar",e),from:c("#cePvFrom",e),subject:c("#cePvSubject",e),body:c("#cePvBody",e),button:c("#cePvButton",e),foot:c("#cePvFoot",e),mast:c("#cePvMast",e),mastLogo:c("#cePvMastLogo",e),mastName:c("#cePvMastName",e),mastTag:c("#cePvMastTag",e)},r=()=>{let p=n.confirmation;a.avatar.textContent=Rn(n.name,t.fromName),a.from.textContent=n.name||t.fromName,a.subject.textContent=p.subject.trim()||s.subject||"",a.body.textContent=p.body.trim()||s.body||"",a.button.textContent=p.button_label.trim()||s.button_label||"Confirm",a.foot.textContent=p.reassurance,a.foot.hidden=!p.reassurance.trim();let v=n.name||t.fromDisplay,x=!!n.logoUrl,M=x||!!v;a.mast.hidden=!M,M&&(a.mastLogo.hidden=!x,x&&h(a.mastLogo,o`<img src="${n.logoUrl}" alt="">`),a.mastName.textContent=v,a.mastName.hidden=!v,a.mastTag.textContent=n.tagline,a.mastTag.hidden=!n.tagline)},l=()=>{n.confirmation.subject=i.subject.value,n.confirmation.body=i.message.value,n.confirmation.button_label=i.button.value,n.confirmation.reassurance=i.footer.value,t.changed()};for(let p of Object.values(i))p.addEventListener("input",l);let d=c("#ceEditBody",e),u=c("#cePreviewBody",e),f=c("#ceTabEdit",e),S=c("#ceTabPreview",e),b=p=>{d.hidden=!p,u.hidden=p,f.setAttribute("aria-pressed",String(p)),S.setAttribute("aria-pressed",String(!p)),p&&i.subject.focus()};return S.onclick=()=>b(!1),f.onclick=()=>b(!0),c("#ceToPreview",e).onclick=()=>b(!1),c("#ceReset",e).onclick=()=>{i.subject.value=s.subject||"",i.message.value=s.body||"",i.button.value=s.button_label||"",i.footer.value=s.reassurance||"",l()},r(),{repaint:r,reset(){i.subject.value=n.confirmation.subject,i.message.value=n.confirmation.body,i.button.value=n.confirmation.button_label,i.footer.value=n.confirmation.reassurance,r()}}}var Fu={none:"No email provider connected",fake:"Fake (dev, dead-end)",ses:"Amazon SES"};function Os(e){return Fu[e]||e}function qu(e){return e.provider==="none"?o`${Os(e.provider)}. ${Ae("set-link")} to start sending.`:o`${Os(e.provider)}${e.simulation?o`<span class="set-pill">Simulating ${ju[e.simulation.profile]}${e.simulation.faults==="none"?", no failures":""}</span>`:null}`}var ju={generic:"a generic provider",ses:"Amazon SES"},Wu="#/docs/ses/
|
|
370
|
+
</section>`}function tl(e,t){let{state:n}=t,s=t.data.settings.confirmation_email_default,i={subject:c("#ceSubject",e),message:c("#ceMessage",e),button:c("#ceButton",e),footer:c("#ceFooter",e)},a={avatar:c("#cePvAvatar",e),from:c("#cePvFrom",e),subject:c("#cePvSubject",e),body:c("#cePvBody",e),button:c("#cePvButton",e),foot:c("#cePvFoot",e),mast:c("#cePvMast",e),mastLogo:c("#cePvMastLogo",e),mastName:c("#cePvMastName",e),mastTag:c("#cePvMastTag",e)},r=()=>{let p=n.confirmation;a.avatar.textContent=Rn(n.name,t.fromName),a.from.textContent=n.name||t.fromName,a.subject.textContent=p.subject.trim()||s.subject||"",a.body.textContent=p.body.trim()||s.body||"",a.button.textContent=p.button_label.trim()||s.button_label||"Confirm",a.foot.textContent=p.reassurance,a.foot.hidden=!p.reassurance.trim();let v=n.name||t.fromDisplay,x=!!n.logoUrl,M=x||!!v;a.mast.hidden=!M,M&&(a.mastLogo.hidden=!x,x&&h(a.mastLogo,o`<img src="${n.logoUrl}" alt="">`),a.mastName.textContent=v,a.mastName.hidden=!v,a.mastTag.textContent=n.tagline,a.mastTag.hidden=!n.tagline)},l=()=>{n.confirmation.subject=i.subject.value,n.confirmation.body=i.message.value,n.confirmation.button_label=i.button.value,n.confirmation.reassurance=i.footer.value,t.changed()};for(let p of Object.values(i))p.addEventListener("input",l);let d=c("#ceEditBody",e),u=c("#cePreviewBody",e),f=c("#ceTabEdit",e),S=c("#ceTabPreview",e),b=p=>{d.hidden=!p,u.hidden=p,f.setAttribute("aria-pressed",String(p)),S.setAttribute("aria-pressed",String(!p)),p&&i.subject.focus()};return S.onclick=()=>b(!1),f.onclick=()=>b(!0),c("#ceToPreview",e).onclick=()=>b(!1),c("#ceReset",e).onclick=()=>{i.subject.value=s.subject||"",i.message.value=s.body||"",i.button.value=s.button_label||"",i.footer.value=s.reassurance||"",l()},r(),{repaint:r,reset(){i.subject.value=n.confirmation.subject,i.message.value=n.confirmation.body,i.button.value=n.confirmation.button_label,i.footer.value=n.confirmation.reassurance,r()}}}var Fu={none:"No email provider connected",fake:"Fake (dev, dead-end)",ses:"Amazon SES"};function Os(e){return Fu[e]||e}function qu(e){return e.provider==="none"?o`${Os(e.provider)}. ${Ae("set-link")} to start sending.`:o`${Os(e.provider)}${e.simulation?o`<span class="set-pill">Simulating ${ju[e.simulation.profile]}${e.simulation.faults==="none"?", no failures":""}</span>`:null}`}var ju={generic:"a generic provider",ses:"Amazon SES"},Wu="#/docs/ses/9-receive-replies-at-your-from-address";function Vu(e){let t=String(e||"").match(/<([^>]+)>/);return t?.[1]?t[1]:String(e||"")}function nl(e){let t=e.data.deployment,{fromName:n}=e;return o`
|
|
371
371
|
<section class="set-sec">
|
|
372
372
|
${we("Email sender",ye("readonly","Read-only \xB7 set at deploy"))}
|
|
373
373
|
<div class="set-card sunken">
|