Open Source
Shaping the tools I use every day, one pull request at a time
A hand-picked selection: only the contributions worth reading about, not every merged pull request. Articles about Magento and Adobe Commerce are on the blog.
Expand the Varnish tracking parameter strip list — on GitHub
Every marketing parameter Varnish does not strip in vcl_recv creates a separate cache entry for the same page, so Instagram, Matomo, HubSpot, Klaviyo, Pinterest or Ceneo traffic split the cache and lowered the hit ratio. The generated VCL now also strips parameters such as igshid, mtm_*, pk_*, hsa_*, _ke, epik, ef_id and ceneo_cid, along with common affiliate click IDs.
Accept the namespaced dictionary keys modules already seed — on GitHub
Fifteen of the seventeen dictionary keys modules declare are dot-namespaced, such as planner.unavailability-reasons.staff, yet the create route’s schema rejected them with an opaque 500, so staff unavailability reasons could not be created at all. The key pattern now allows dot-separated segments, each keeping the original slug rule, which matches the looser schema the update route already used and leaves the seeded rows untouched.
Let the message composer send from a connected mailbox — on GitHub
Messages to external addresses always went out through the platform sender, which writes none of the thread mapping rows inbound matching relies on, so a reply could never attach back to its thread. On an instance whose only email channel was an OAuth mailbox, those messages could not be sent at all. The composer gains a “Send from” selector that routes through the existing sendAsUser pipeline. The platform sender stays the default.
Stream assistant text into the cockpit as it is generated — on GitHub
Claude Code ran without --print and --include-partial-messages, so the cockpit only showed a reply once the whole block was complete, 17 to 20 seconds into a 300-word answer. Now content_block_delta frames map to item.delta events on the same item id the final block later completes, and text reaches the screen seven to eight seconds before the block finishes, with no cockpit change needed.
Coalesce app-event invalidations in the messages inbox — on GitHub
The inbox reloaded its message list on every messages.message.* broadcast, so one mail-poll cycle that ingested 52 messages triggered 52 full reloads, each a stack of decrypting queries straight to Postgres. Added useAppEventCoalesced, a leading-plus-trailing variant of useAppEvent: the first event still refreshes immediately, and the rest of a burst collapses into one trailing call.
Resolve the CRUD mutation guard in published builds — on GitHub
Awilix in CLASSIC mode reads dependency names from the factory’s source, and esbuild renamed a shadowed em parameter to em2, so every published build failed to resolve the guard and silently dropped optimistic locking on CRUD updates and deletes. The factory is now parameterless, and a new check:classic-di-injection CI step inspects the built dist output, since no source-level test can see this class of bug.
Implement history import for the Gmail channel — on GitHub
The import-history endpoint, worker and dialog all shipped, but only the IMAP adapter implemented importHistory, so Gmail users got an HTTP 400 after filling in the form. The Gmail adapter now walks users.messages.list with a cursor of a few hundred bytes regardless of mailbox size, and the hub’s 365-day and 5000-message clamps no longer make a multi-year import impossible.
Cache active webhook subscriptions per tenant — on GitHub
The wildcard outbound-dispatch subscriber ran a decrypting SELECT over webhooks for every event in the system, even for tenants with no webhooks at all, and under write load that query dominated the trace. Subscriptions are now cached per tenant and organization (an empty list counts as a hit), invalidated inline at every webhook write, and secrets and URLs never enter the cache.
Memoize information_schema table probes across requests — on GitHub
DefaultDataEngine and HybridQueryEngine queried information_schema.tables on every call, and both are built fresh per request container, so their instance state never helped. Added a module-scoped bounded TTL memo that keeps positive answers for an hour by default, with env knobs for the TTL and entry cap.
Only merged work is listed here, and only the parts worth a comment — the full history, including everything still in review, lives on GitHub.
When
opencode servenever printed its URL, the runner kept talking to a port nobody might have bound. The Codex RPC dropped responses with string JSON-RPC ids, which the spec allows, so those requests never settled. Claude’ssendMessagereported success after the child had already exited. The session now fails fast with a clear error, numeric string ids settle their request, and stdin counts as closed once the child exits.