commits
Swap hand-rolled fetch+DOMParser+replaceContents for HTMX attributes on the
forms and sections, return OOB HTML fragments from /apply, /propose, and
/mark-all-read instead of JSON/redirects, and render toasts server-side. The
earlier custom client was the interview cheatsheet's "essentially a hand-rolled
subset of HTMX" — replacing it cuts ~200 lines of duplicated infra.
- HTMX 2.0.4 from unpkg, defer-loaded
- Per-endpoint: /apply and /mark-all-read return a toast OOB + OOB controls
(and OOB subscriptions for /apply), with HX-Trigger: refreshQueue to drive
#queue-root re-fetch. /propose returns only the ask-root OOB since proposal
generation is read-only. /queue includes an OOB #queue-count titlebar so the
count and body swap together — avoids the "updating…" ghost next to a
populated queue.
- render/toast.ts renders toasts as HTML with a data-toast-dismiss attr; a
MutationObserver in client.ts wires auto-dismiss when HTMX inserts them.
- HTMX error path: the outer server catch returns an OOB error toast for
HX-Request:true instead of a plain-text 500, so failures still surface.
- Kept custom JS where HTMX doesn't apply: @ typeahead + mention nav,
selected-actor chips, dialog open/close, guidance save (inline feedback).
- Fixed a subtle regression the custom JS had hidden: #queue-count now
updates with every /queue swap, not just after custom loadQueue() calls.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Drop-in compatible with app.bsky.actor.searchActorsTypeahead; public endpoint,
no auth. Removes a createAgent() call from every @-typeahead keystroke, which
was burning the Bluesky 10/day login rate limit during iteration. Overridable
via TYPEAHEAD_URL if the community service is down.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Captures the add-one-Bluesky-SDK-method workflow so future me (or Claude) can follow the same path: METHOD_DEFS is single source of truth, record-based ops need dispatch overrides and PDS-level verification, and verification must read from the same layer the write went to.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
- user-authored guidance steers recommendation generation (in-memory)
- host-side replay wraps each dispatch so one failure doesn't skip later calls or bypass verification; toasts report ok / partial / failed per call
- safeGetActorProfiles falls back to DID labels when a failed call's input DID is malformed
- UI: subscriptions and settings moved to header-dialog controls, main body is just ask-noti + recommended actions
- client.ts re-transpiles per request in dev so edits no longer require a server restart
- regression tests for the replay contract
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Add ATPROTO_APPVIEW_PROXY env var to route app.bsky.* calls through an
alternate appview via AT Protocol service proxying. Login still goes to
the user's PDS. Set to did:web:api.blacksky.community#bsky_appview to
use Blacksky's independent appview when bsky.social's is flaky.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Replace AsyncFunction eval with QuickJS WASM sandbox for code execution.
Generated code now runs in an isolated interpreter with no host globals —
the only capabilities are four injected SDK method stubs that queue calls
for host-side replay. Adds execution timeout via interrupt handler.
Also: inline favicon, drop external Google Fonts dependency, refine
actor resolution flow and client-side typeahead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rebuild noti as a Bun + TypeScript code-mode prototype. The model writes
SDK mutation code against a narrow typed surface, the user reviews it,
and the server verifies the outcome against live Bluesky state.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Swap hand-rolled fetch+DOMParser+replaceContents for HTMX attributes on the
forms and sections, return OOB HTML fragments from /apply, /propose, and
/mark-all-read instead of JSON/redirects, and render toasts server-side. The
earlier custom client was the interview cheatsheet's "essentially a hand-rolled
subset of HTMX" — replacing it cuts ~200 lines of duplicated infra.
- HTMX 2.0.4 from unpkg, defer-loaded
- Per-endpoint: /apply and /mark-all-read return a toast OOB + OOB controls
(and OOB subscriptions for /apply), with HX-Trigger: refreshQueue to drive
#queue-root re-fetch. /propose returns only the ask-root OOB since proposal
generation is read-only. /queue includes an OOB #queue-count titlebar so the
count and body swap together — avoids the "updating…" ghost next to a
populated queue.
- render/toast.ts renders toasts as HTML with a data-toast-dismiss attr; a
MutationObserver in client.ts wires auto-dismiss when HTMX inserts them.
- HTMX error path: the outer server catch returns an OOB error toast for
HX-Request:true instead of a plain-text 500, so failures still surface.
- Kept custom JS where HTMX doesn't apply: @ typeahead + mention nav,
selected-actor chips, dialog open/close, guidance save (inline feedback).
- Fixed a subtle regression the custom JS had hidden: #queue-count now
updates with every /queue swap, not just after custom loadQueue() calls.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Drop-in compatible with app.bsky.actor.searchActorsTypeahead; public endpoint,
no auth. Removes a createAgent() call from every @-typeahead keystroke, which
was burning the Bluesky 10/day login rate limit during iteration. Overridable
via TYPEAHEAD_URL if the community service is down.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Captures the add-one-Bluesky-SDK-method workflow so future me (or Claude) can follow the same path: METHOD_DEFS is single source of truth, record-based ops need dispatch overrides and PDS-level verification, and verification must read from the same layer the write went to.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
- user-authored guidance steers recommendation generation (in-memory)
- host-side replay wraps each dispatch so one failure doesn't skip later calls or bypass verification; toasts report ok / partial / failed per call
- safeGetActorProfiles falls back to DID labels when a failed call's input DID is malformed
- UI: subscriptions and settings moved to header-dialog controls, main body is just ask-noti + recommended actions
- client.ts re-transpiles per request in dev so edits no longer require a server restart
- regression tests for the replay contract
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Add ATPROTO_APPVIEW_PROXY env var to route app.bsky.* calls through an
alternate appview via AT Protocol service proxying. Login still goes to
the user's PDS. Set to did:web:api.blacksky.community#bsky_appview to
use Blacksky's independent appview when bsky.social's is flaky.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Replace AsyncFunction eval with QuickJS WASM sandbox for code execution.
Generated code now runs in an isolated interpreter with no host globals —
the only capabilities are four injected SDK method stubs that queue calls
for host-side replay. Adds execution timeout via interrupt handler.
Also: inline favicon, drop external Google Fonts dependency, refine
actor resolution flow and client-side typeahead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>