Compiled entirely from public activity on meta.discourse.org, X, and GitHub.
💬 meta.discourse.org
Sam focused on extending Discourse AI, introducing reusable agent skills and improving the accuracy of AI-generated reports through validation. He also helped users configure workflow agents and their Gemini models, while shipping a fix for a media-review bypass involving images without size metadata.
🐦 On social
Social activity focused on experimenting with AI tooling: integrating Gemini’s Interactions and Code Execution APIs into Discourse, refining agent harnesses, and weighing search quality against cost. Notable posts covered Gemini-powered chess and image generation, improved term-llm help, and sandboxing Discourse image operations with Landlock. Replies were practical and conversational, often probing implementation details or sharing nuanced observations about model behavior, prompts, security, and API pricing.
- 19 posts and 14 replies captured in the last 7 days
- Top by engagement: Not really, it has taken me ages to hone it, the promp…, Handy Claw hack, Good news, I can lean on my Google AI Pro sub and use…
Most engaged tweets:
- reply to @he_jingkai — Not really, it has taken me ages to hone it, the prompt does carefully explain my prefs, way more than a “you are a helpful bot” it is about 9k tokens today
0 likes · 0 reposts · 0 replies - post — Handy Claw hack
0 likes · 0 reposts · 0 replies - post — Good news, I can lean on my Google AI Pro sub and use it in my own harness. Bad news, I need to binary patch agy. https:// gisthost.github.io/?894402dd97019 a313e6b12ac92c90cf9/in…
0 likes · 0 reposts · 0 replies - reply to @dhh — At @discourse we now landlock all image operations, https:// github.com/discourse/ruby -landlock … I have extreme confidence this is not the last CVE in image stacks and this defe…
0 likes · 0 reposts · 0 replies - post — Code execution in Gemini can let you generate cool images, but I got to stop now @OfficialLoganK this cost me a dollar :)
0 likes · 0 reposts · 0 replies
🛠️ GitHub — Sam’s Commits
samsaffron/term-llm
Over the last seven days, Sam focused heavily on reliability and state consistency across long-running sessions, streaming responses, queued interjections, skill invocations, transcript refreshes, agent handovers, and server/Telegram retries. He also expanded provider support with an isolated agy CLI integration and Parallel search, while improving session discovery, tool visibility, terminal rendering, and CLI help. Overall, the work aimed to make term-llm more resilient under retries, handoffs, network failures, and extended use.
Key commits:
ea12505— Update lifecycle test for resumeAndDrainb676a1d— Harden server retries and Telegram delivery3e13375— Fix agy credential isolation and server startup4749f91— Add isolated agy CLI providerda92760— Add Parallel search and harden process cleanup
discourse/discourse
Sam focused on closing security and content-moderation bypasses. He hardened Data Explorer’s SQL handling by stripping comments and preventing recursive parameter interpolation, and ensured embedded images or videos without dimension metadata still enter the review queue—backing both fixes with expanded tests.
Key commits:
3dc7f0d— SECURITY: Strip SQL comments and use non-recursive parameter interpolation in Data Explorer6ecbc17— FIX: Review media without image dimensions (#42079)
discourse/dv
Sam focused on making dv safer and more capable for day-to-day Discourse development: he overhauled the TUI with responsive inventory, logs, confirmations, and cancellable actions, while adding Rails console access and branch/worktree inspection to the CLI. He also tightened container provisioning security with temporary SSH-agent forwarding for private repositories and improved reset reliability by waiting for PostgreSQL before booting Rails.
Key commits:
2b395b6— feat(tui): overhaul dv tuibf741d9— feat(cli): add console and branch status9fd13a0— feat(new): add provisioning-only SSH forwardinge6a0602— fix(reset): wait for PostgreSQL before Rails
discourse/discourse-shared-edits
Sam focused on hardening shared-edit synchronization, preventing stale clients from merging incompatible Yjs state and adding explicit corruption recovery. He also improved session-aware compaction, draft isolation, cursor preservation, and rich-editor synchronization, backed by migrations and extensive lifecycle, network, and recovery tests.
Key commits:
dbb44fb— FIX: Harden shared edit synchronization (#173)
discourse/discourse_docker
Sam modernized the Discourse development image’s email-testing setup by replacing the aging MailHog binary with Mailpit v1.30.6. He preserved compatibility with existing Docker tooling through a legacy binary-name symlink while making the dependency reproducible via a pinned container image and digest.
Key commits:
2e71d1d— DEV: remove mailhog from image and upgrade to mailpit (#1097)
discourse/discourse-video
Sam focused on hardening Mux webhook security by rejecting signed requests when the configured signing secret is blank, preventing the default empty value from being treated as valid. He also added request-level regression coverage to ensure such events return 403 and cannot advance a waiting video’s state.
Key commits:
4bbdecf— FIX: Reject blank Mux webhook signing secret in verified_signature? (#100)
🤖 Jarvis — Public Repo Work
Agent-authored public commits, typically guided by Sam during implementation work.
SamSaffron/term-llm
Sam directed Jarvis to harden the web client against interrupted connectivity, wedged or stale streams, mobile page suspension, and inconsistent interjection state, backed by substantial recovery and regression testing. The work also brought the terminal runtime and renderer fully in-house under internal/, strengthening frame-lifecycle correctness and CI/release verification. Agent guidance was streamlined into a more actionable, task-oriented workflow with clearer verification steps.
Key commits:
c76ab4e— fix: recover from wedged web streams (#986)de14e91— fix(web): unify network recovery (#985)af3f71c— make agent guidance actionable (#979)98b2c69— fix: retire unowned interjection intents (#978)c178519— fix: update canonical interjection intent state (#977)
⤴️ GitHub — Pull Requests
15 PRs this week:
- ✅ SamSaffron/term-llm#971 (diff) — fix: A transient Telegram startup failure permanently disables the bot closed
- Supervise each non-web platform loop instead of invoking
Platform.Runonly once. - Retry unexpected returns with context-aware exponential backoff from 1 second to 30 seconds. - Reset the backoff after a platform has remained running for one minu…
- Supervise each non-web platform loop instead of invoking
- ✅ SamSaffron/term-llm#975 (diff) — fix: Transient completion-notification failures permanently silence queued jobs closed
- Retry asynchronous queued-job completion notifications up to three times for transient failures, with per-attempt timeouts and context-aware exponential backoff. - Stop immediately for permanent HTTP failures while honoring structured
Retry-After…
- Retry asynchronous queued-job completion notifications up to three times for transient failures, with per-attempt timeouts and context-aware exponential backoff. - Stop immediately for permanent HTTP failures while honoring structured
- ✅ SamSaffron/term-llm#976 (diff) — fix: Telegram final flush silently drops rate-limited response chunks closed
- Added a context-aware final Telegram delivery path that waits for the existing edit interval before flushing completed response chunks. - Final edits and continuation placeholders now retry bounded transient failures, including Telegram 429 respons…
- ✅ SamSaffron/term-llm#980 (diff) — fix: Single tool calls can leave sessions permanently busy after cancellation closed
- Added a cancellation-aware wrapper around
Tool.Executethat runs the invocation independently and selects its buffered result againstctx.Done(). - Applied the wrapper to normal tool execution and synchronous CLI-bridge tool execution while pre…
- Added a cancellation-aware wrapper around
- ✅ SamSaffron/term-llm#982 (diff) — fix: Scheduled autotitling can overwrite concurrent session metadata closed
- Persist scheduled autotitles through the existing generated-title-only store API instead of a full session-row update. - Update the in-memory title fields only after persistence succeeds. - Add a focused SQLite-backed regression test that captures …
- ✅ SamSaffron/term-llm#984 (diff) — fix: Slow side-question SSE clients can strand provider runs indefinitely closed
- Wrapped side-question SSE responses with the existing per-write streaming response writer and its 30-second deadline, matching chat and response-run streams. - Added a regression test with a writer that blocks unless a write deadline is installed. …
- 🟢 discourse/discourse#42206 (diff) — FEATURE: Add Gemini Interactions API support opened
Move default Gemini models to the Interactions API and add provider options for thinking, service tiers, and native Maps and code execution tools. Preserve generated-image attachments in model messages and ensure thinking blocks close cleanly before …
- ✅ discourse/discourse-shared-edits#173 (diff) — FIX: Harden shared edit synchronization merged
Track document identities across revisions so stale clients replace state instead of merging incompatible Yjs updates. Defer compaction while sessions are active, add explicit corruption recovery, and isolate shared-edit drafts from normal composer p…
- ✅ discourse/discourse_docker#1097 (diff) — DEV: remove mailhog from image and upgrade to mailpit merged
- ✅ discourse/discourse-video#100 (diff) — FIX: Reject blank Mux webhook signing secret in verified_signature? merged
Prevent forged Mux webhook callbacks by rejecting requests when
discourse_video_mux_webhook_signing_secretis blank. The fix returns early fromverified_signature?before any HMAC computation, defeating empty-key forgeries that bypass authenticat… - ✅ discourse/dv#25 (diff) — DEV: Add dv branch status subcommand closed
Shows the branch name and if any files are changed inside the container
$ dv branch status
Container: hades
Branch: issue/chat-browse
Changes: none (working tree clean)
- ✅ discourse/dv#24 (diff) — DEV: Add a dv console command closed
Running this will land you in the rails console in the container. For a bonus we set the pry prompt so you know you’re in a dv container:
$ dv console
Loading development environment (Rails 8.0.5)
[1] dv:hades(main)>
- ✅ discourse/dv#23 (diff) — DEV: Show help when no args are provided to a command closed
Currently when running a command that requires args, we get an unhelpful error message:
dv image add
2026/07/29 15:05:09 accepts 1 arg(s), received 0
Instead, we should show the help for the command when no args are provided, which is …
- ✅ discourse/discourse#42079 (diff) — FIX: Review media without image dimensions merged
Detect embedded images and videos from post content when image size metadata is absent. This prevents untrusted media posts from bypassing the review queue while leaving plain text and emoji unaffected.
- ✅ SamSaffron/term-llm#968 (diff) — perf: own and optimize the internal terminal subsystem merged
- Maintain the reduced, application-owned terminal event loop/runtime and cell/diff/output renderer under
internal/terminal/, with durable upstream bases, retained MIT attribution, and an explicit selective-sync/pruning contract. - Replace delayed …
- Maintain the reduced, application-owned terminal event loop/runtime and cell/diff/output renderer under
🐛 GitHub — Issues
No issue activity this week.
👀 GitHub — Reviews
5 reviews this week:
- discourse/docker-ruby#22 — DEV: Allow manually triggering builds approved
- discourse/discourse_docker#1099 — DEV: Bump Ruby to 3.4.10 approved
- discourse/docker-ruby#21 — DEV: Bump Ruby to 3.4.10 and 3.3.12 approved
- discourse/discourse_docker#1095 — FEATURE: Add vips CLI to the image approved
- discourse/discourse_docker#1092 — FIX: Add libvips build dependencies for safe_image approved