Mar 31, 2026 | 7 min read
Building on Top of Microsoft Teams: Bot Events, Graph APIs, and the Mental Model That Helped
What helped while building a Teams integration for a real product, without pretending it is just one API and one happy path.
Notes from work that taught me something concrete: integrations, backend systems, and the awkward details that only show up once the product is live.
Mar 31, 2026 | 7 min read
What helped while building a Teams integration for a real product, without pretending it is just one API and one happy path.
Jan 19, 2026 | 7 min read
The confusing part about shared channels in Teams is that your bot setup can be correct, reads can work, and regular message events can still fail unless the bot is explicitly mentioned.
May 05, 2025 | ClearFeed
A practical guide I wrote at ClearFeed on how engineering teams can test Slack apps without stepping on each other.
Apr 28, 2025 | 7 min read
We had logs in CloudWatch, but not in a form CloudWatch could really use. This is the pattern that split local and production formatting, preserved structure, and made Sentry point back to the right logs.
Aug 22, 2024 | 6 min read
How a deployment process with too many AWS-specific paths turned into one Slack-first release flow that people could actually use.
Nov 17, 2023 | 5 min read
A debugging story about a poller that looked healthy for years, then started hanging forever when the network dropped at exactly the wrong moment.
Nov 14, 2023 | 8 min read
In a Slack Connect channel, installing the same app on both workspaces does not mean you will receive two Events API deliveries. The fix starts with the event envelope, not the business logic.
Apr 19, 2023 | 11 min read
Once scheduled work runs across multiple app instances and tenant data, the hard part stops being cron syntax and starts being coordination.
Feb 01, 2023 | 8 min read
Default Sentry alerts for outbound HTTP failures were too generic to act on quickly. This is a pattern that works well: group by method, URL, and status, carry over the useful response body, and scrub the sensitive parts before the event leaves the process.
Dec 14, 2022 | 9 min read
We wanted logs to carry business identifiers automatically, not just request IDs. The useful lesson was that async context propagation is also a lifecycle problem, and a naive map-based store can quietly turn observability code into a memory leak.
Sep 14, 2022 | 6 min read
A practical pattern for dangerous cron jobs: do not trust staging alone, start with a tiny allowlist, and widen the blast radius in phases.
Mar 18, 2021 | 6 min read
What it took to build a manufacturing quote flow that looked beyond the outer shape of a 3D model and priced the harder details too.