<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Opslane Changelog</title><description>New features, improvements, and fixes shipped in Opslane, newest first.</description><link>https://opslane.com</link><item><title>Digest replay links open at the moment the problem happens</title><link>https://opslane.com/changelog/#2026-09-15-digest-replay-moment</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-15-digest-replay-moment</guid><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Replay links on known-problem cards in the daily digest used to start at the beginning of the recording, so you had to scrub through a long session to find the part that mattered. They now open at the moment Opslane confirmed the problem.&lt;/p&gt;
&lt;p&gt;A card that fails Opslane’s own checks is also held back and written again the next day. Before, it went out as a rough fallback with a minified title and no Why line. And on a day with nothing to act on, the digest skips Slack entirely.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>Replays play back at the width your user saw</title><link>https://opslane.com/changelog/#2026-09-14-replay-recorded-width</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-14-replay-recorded-width</guid><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Until this fix, the session player squeezed every recording into its own width. Responsive apps replayed in a narrow layout the user never saw, clicks landed on the wrong element, and pages that scroll inside a container never showed the scrolled part.&lt;/p&gt;
&lt;p&gt;Replays now render at the recorded viewport and scale down to fit the player, so the cursor lands where the user actually clicked and the scroll position matches the recording. Links that open a replay partway through keep the right width too, even if the user resized their window earlier in the session.&lt;/p&gt;
</content:encoded><category>fixed</category></item><item><title>Numeric user IDs no longer turn off session recording</title><link>https://opslane.com/changelog/#2026-09-14-numeric-user-ids</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-14-numeric-user-ids</guid><pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If your app passed a number to &lt;code&gt;setUser&lt;/code&gt;, such as an autoincrement database ID, the server rejected the session. Recording stopped for those signed-in users, and their errors arrived without a user attached.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;setUser&lt;/code&gt; accepts user and account IDs as strings, safe integers, or bigints, and sends them as strings. Numbers too large for JavaScript to represent exactly are ignored, so pass those IDs as strings. Update to &lt;code&gt;@opslane/sdk&lt;/code&gt; 4.2.1 to get the fix.&lt;/p&gt;
</content:encoded><category>fixed</category></item><item><title>Problems found in recordings are confirmed before they reach you</title><link>https://opslane.com/changelog/#2026-09-13-known-problems</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-13-known-problems</guid><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opslane used to group findings from session recordings by category and page, and that was too loose. One digest reported a date-picker bug as affecting 91 users when only one recording showed it. The other recordings on that page had unrelated problems.&lt;/p&gt;
&lt;p&gt;Now each finding is matched to a specific known problem: a particular control, the action taken on it, and the symptom. After three recordings match, Opslane re-reads them against that exact description. The problem is published only when at least three recordings confirm it and at least 40% of the checks agree. If identified users are involved, it needs at least two of them.&lt;/p&gt;
&lt;p&gt;It shows up in your digest with a Create fix PR button once an investigation finds a code cause that explains at least half of the confirmed evidence. Fixes for these problems wait for you to ask, unless you turn on automatic fixes for the project. The &lt;a href=&quot;https://docs.opslane.com/guides/friction/&quot;&gt;friction guide&lt;/a&gt; has the full rules.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>Set up Opslane from your coding agent</title><link>https://opslane.com/changelog/#2026-09-12-agent-setup</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-12-agent-setup</guid><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Paste this into your coding agent:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Set up https://docs.opslane.com/INSTALL.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The agent installs the SDK, identifies signed-in users, checks that an error from your app reaches Opslane, and sets up source-map uploads. It stops when it needs you: to approve the project in your browser, and to choose whether to connect GitHub, Slack, CI secrets, and MCP. At the end it can open a pull request containing only the setup changes.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@opslane/sdk&lt;/code&gt; 4.2.0 shipped alongside it with two additions for Next.js apps. You can send SDK traffic through your own domain with a Next.js rewrite by setting &lt;code&gt;endpoint&lt;/code&gt; to a same-origin path like &lt;code&gt;/opslane&lt;/code&gt;. The new &lt;code&gt;opslane-sourcemaps&lt;/code&gt; command uploads source maps after &lt;code&gt;next build&lt;/code&gt;, Turbopack output included, and works with other bundlers too.&lt;/p&gt;
</content:encoded><category>new</category></item><item><title>Digest cards say what broke and why, in plain words</title><link>https://opslane.com/changelog/#2026-09-03-digest-plain-words</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-09-03-digest-plain-words</guid><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Early digest cards leaned on internal terms and walls of numbers. Each card now has a plain title, a short description of what users ran into, and a one-sentence Why line drawn from the stored root cause. Impact figures such as visits this week come straight from Opslane’s measurements; the model that writes the card never types a number.&lt;/p&gt;
&lt;p&gt;Every card ends with one of three asks: approve the proposed fix, review the fix PR, or decide how to handle the issue. Cards also stopped saying a fix attempt failed when no fix ever ran.&lt;/p&gt;
&lt;p&gt;If an issue has no recording from its current stretch of waiting, the Watch replay button falls back to an older complete recording of the same issue instead of disappearing.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>Coding agents get the session timeline and the full diagnosis</title><link>https://opslane.com/changelog/#2026-08-30-mcp-evidence</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-30-mcp-evidence</guid><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two new MCP tools hand your coding agent more of the evidence Opslane already stores about an issue.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;opslane_session_timeline&lt;/code&gt; returns the browser activity around an error: network calls with their status and duration, plus console errors. It also lists failing requests from up to a minute before and after, each with the user action that triggered it. &lt;code&gt;opslane_related_events&lt;/code&gt; counts the events and issues that share an error message and the people they reached, so an agent can see how far a bug spreads when it’s split across several issues.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;opslane_issue&lt;/code&gt; got more detail too. It lists the files the investigation identified as the cause, in ranked order, with the date and commit the diagnosis was made against. It shows up to three failing requests and a pointer to the session replay. And it returns the whole root cause instead of cutting it off partway.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>The daily digest is a native Slack message</title><link>https://opslane.com/changelog/#2026-08-26-slack-digest</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-26-slack-digest</guid><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The daily digest is now a native Slack message split into two sections, Needs a decision and Fixes ready to merge, with buttons to watch the replay, review the PR, or open the issue. Before, it arrived as one long block of text.&lt;/p&gt;
&lt;p&gt;An issue waiting on your decision also keeps appearing in each digest, with how long it has been waiting, until someone acts on it. Before this change, issues found in session recordings could wait for days without ever showing up in the digest.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>Work Opslane issues from Claude Code or Codex over MCP</title><link>https://opslane.com/changelog/#2026-08-23-remote-mcp</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-23-remote-mcp</guid><pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Opslane runs a remote MCP server. Connect Claude Code or Codex, and your agent can read your latest digest, open an issue with its evidence, and link the pull request that fixes it without leaving the terminal.&lt;/p&gt;
&lt;p&gt;Create an MCP key under Project settings → API keys (it starts with &lt;code&gt;opslane_ak_&lt;/code&gt;), then add &lt;code&gt;https://app.opslane.com/mcp&lt;/code&gt; to your agent with the key as a bearer token. On a self-hosted server, use your own Opslane address instead. The &lt;a href=&quot;https://docs.opslane.com/guides/mcp/&quot;&gt;MCP guide&lt;/a&gt; has the exact commands.&lt;/p&gt;
&lt;p&gt;There’s also a Claude Code skill for working through the digest. It fixes diagnosed errors on its own. For problems found in session recordings, where the right fix is a product call, it asks you which behavior you want before it writes any code.&lt;/p&gt;
</content:encoded><category>new</category></item><item><title>Errors now carry the timing of nearby network requests</title><link>https://opslane.com/changelog/#2026-08-07-network-timing</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-07-network-timing</guid><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;From &lt;code&gt;@opslane/sdk&lt;/code&gt; 4.1.0, error events include timing for the &lt;code&gt;fetch&lt;/code&gt; and XHR requests around them: which were still in flight, how long each took, and when the response headers arrived. For a timeout, that tells you whether the server never answered or the response stalled partway through.&lt;/p&gt;
&lt;p&gt;Since August 29, your coding agent can read these timings with the &lt;code&gt;opslane_session_timeline&lt;/code&gt; MCP tool.&lt;/p&gt;
</content:encoded><category>new</category></item><item><title>Environments are created from the SDK label</title><link>https://opslane.com/changelog/#2026-08-05-environments</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-05-environments</guid><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Set &lt;code&gt;environment&lt;/code&gt; in &lt;code&gt;init&lt;/code&gt;, and Opslane creates that environment the first time an event or recording uses it. You no longer create environments by hand.&lt;/p&gt;
&lt;p&gt;A missing or invalid label goes to the project’s default environment, which starts as &lt;code&gt;production&lt;/code&gt; and can be changed under Settings → Environments. Labels are case-sensitive, so &lt;code&gt;Staging&lt;/code&gt; and &lt;code&gt;staging&lt;/code&gt; are two different environments. If staging traffic shows up as production, check that every non-production build sets the label. The &lt;a href=&quot;https://docs.opslane.com/guides/environments/&quot;&gt;environments guide&lt;/a&gt; covers the details.&lt;/p&gt;
</content:encoded><category>improved</category></item><item><title>Readable stack traces from your Vite source maps</title><link>https://opslane.com/changelog/#2026-08-04-source-maps</link><guid isPermaLink="true">https://opslane.com/changelog/#2026-08-04-source-maps</guid><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Add the Opslane plugin to your Vite build and set &lt;code&gt;OPSLANE_SOURCEMAP_KEY&lt;/code&gt; in CI. On each production build, the plugin uploads your source maps and removes them from the output, so they never ship to the browser. Opslane uses them to turn minified stack traces back into your real file names and line numbers when it investigates an error. No API returns a map once it’s uploaded.&lt;/p&gt;
&lt;p&gt;This release also split API keys in two. The ingest key in your browser bundle starts with &lt;code&gt;opslane_pk_&lt;/code&gt;. The source-map key is a secret that stays in CI, and it starts with &lt;code&gt;opslane_sk_&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you’re upgrading from an earlier SDK: version 3.0 rejects the old &lt;code&gt;def_&lt;/code&gt; keys, so create a new ingest key and redeploy. Version 4.0 reads the upload address from the source-map key itself, so create a fresh source-map key and delete &lt;code&gt;OPSLANE_ENDPOINT&lt;/code&gt; from CI. The &lt;a href=&quot;https://docs.opslane.com/guides/source-maps/&quot;&gt;source maps guide&lt;/a&gt; has the setup.&lt;/p&gt;
</content:encoded><category>new</category></item></channel></rss>