<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jam.dev</title>
    <description>The latest articles on DEV Community by Jam.dev (@jamdotdev).</description>
    <link>https://dev.to/jamdotdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9637%2F6eea0096-447a-454d-b5fa-4fdd5b4d7714.jpeg</url>
      <title>DEV Community: Jam.dev</title>
      <link>https://dev.to/jamdotdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jamdotdev"/>
    <language>en</language>
    <item>
      <title>Recording Links: The Nitty Gritty Details Behind Today's Launch</title>
      <dc:creator>Aidan Nulman</dc:creator>
      <pubDate>Wed, 04 Jun 2025 19:19:37 +0000</pubDate>
      <link>https://dev.to/jamdotdev/recording-links-the-nitty-gritty-details-behind-todays-launch-3bdp</link>
      <guid>https://dev.to/jamdotdev/recording-links-the-nitty-gritty-details-behind-todays-launch-3bdp</guid>
      <description>&lt;p&gt;Earlier today we announced Recording Links, the easiest way for Product teams to capture screen recordings, repro steps, and user feedback directly inside their app, without requiring a Chrome extension or install.&lt;/p&gt;

&lt;p&gt;To do so, we had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design a simple + attractive recorder UX you’d happily send to your users&lt;/li&gt;
&lt;li&gt;Make sure it works &lt;em&gt;reliably&lt;/em&gt; and &lt;em&gt;in every major browser vendor&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Keep the install process as simple as it can be, and no simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As one of the authors on this project I’m &lt;em&gt;clearly&lt;/em&gt; biased, but I think the solution we’ve shipped is just shy of magic. And although magicians never reveal their secrets, I write software and have been asked to cook for a minute about our work. So I’ll just tell you: we did it all with &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k4gkfimjp1aw3h862v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k4gkfimjp1aw3h862v7.png" alt="The capture frame our scripts inject on your website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But before we go too deep: try Recording Links yourself, or check out this demo Ian recorded!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GP0SBqWU-58"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Prior Art
&lt;/h2&gt;

&lt;p&gt;Recording Links builds on Jam’s core extension and more-recent Jam for Customer Support (Intercom) products. Both of these are built on Jam’s core object model and capture stack, which allow us to deliver a consistent debugging experience in our own app and the others we integrate with.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3woqzyy3mc1df0q3wg4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3woqzyy3mc1df0q3wg4c.png" alt="Example from a Jam's "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While each of our products have somewhat different feature sets, Jam’s customers expect a few core promises from our products: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can easily start, stop, restart, and submit recordings&lt;/li&gt;
&lt;li&gt;Events must be captured between start of recording and end of recording&lt;/li&gt;
&lt;li&gt;We can’t lose data along the way, lest our users (or worse, yours!) lose trust in us&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fulfilling these promises in the extension can sometimes be a challenge. But, since users’ data is local, it’s at least reasonably straightforward to fulfill our promises.&lt;/p&gt;

&lt;p&gt;This was comparatively difficult in our Intercom product. Specifically, that product sends users to a Recorder hosted at &lt;code&gt;recorder.jam.dev&lt;/code&gt;, which—due to browser security constraints—uses a websocket to communicate with event capture scripts installed on our users’ sites.&lt;/p&gt;

&lt;p&gt;The websocket approach works fine enough, but has room for improvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If our socket server is unavailable—e.g. briefly during deploys, or a user is recording while offline—created Jams may be corrupted or missing data; there is no way for the recorder script to recognize this state and inform the user.&lt;/li&gt;
&lt;li&gt;Common Internet chaos—e.g. slow connections, out-of-order packets, unexpected user and/or script interactions—requires mitigation, thereby increasing code complexity and ongoing maintenance&lt;/li&gt;
&lt;li&gt;It literally doesn’t work in Safari—and may someday not work in other browsers—because it relies on third-party cookies to establish a shared identifier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of our design goals for Recording Links was to remove this network dependency altogether. The only time we expect to hear from your users is when they’re explicitly submitting a Jam.&lt;/p&gt;

&lt;h2&gt;
  
  
  State Partitioning
&lt;/h2&gt;

&lt;p&gt;This lofty design goal introduces a classic problem: “&lt;em&gt;how do we communicate between tabs locally?”&lt;/em&gt;. Most browser primitives (e.g. localStorage, BroadcastChannels…) are restricted to same-origin communication. Only Safari is so strict (Chrome and Firefox restrict to same-domain), but since same-origin is our lowest-common denominator let’s stick with it.&lt;/p&gt;

&lt;p&gt;Our earlier architecture—a Jam-hosted &lt;code&gt;recorder.jam.dev&lt;/code&gt; URL—can’t communicate directly with scripts on pages you host, because it’s a different origin. But what if we put an &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; on your pages from the same-origin as our &lt;code&gt;recorder&lt;/code&gt;? Well, that’s not so simple. Here are &lt;a class="mentioned-user" href="https://dev.to/kentcdodds"&gt;@kentcdodds&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/ryanflorence"&gt;@ryanflorence&lt;/a&gt; discussing the issue in Oct 2023:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8fpu0zp7g5cq9ds5m4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8fpu0zp7g5cq9ds5m4d.png" alt="@kentcdodds and @ryanflorence discussing iframe peculiarities [[x.com](https://x.com/ryanflorence/status/1709602360845324544)]"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All browsers use a technique called “State Partitioning” to prevent cross-site tracking. What this means practically is that recorder.jam.dev frames embedded on example.com belong to a “state partition” keyed by the top-frame’s origin (i.e. example.com:recorder.jam.dev), whereas our top frame is in the top-level partition (i.e. recorder.jam.dev).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsh6sabltsr1d00qjj8y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsh6sabltsr1d00qjj8y.png" alt="The top-level  raw `recorder.jam.dev` endraw  cannot communicate with the embedded one"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We started by exploring how to bring your origin to our contents, e.g. by asking installers to set up a recorder.example.com subdomain and point it to our content. But since Safari is strictly same-origin, we cannot assume that recorder.example.com can natively communicate with example.com. In fact, doing so would fail our expectation of supporting all major browser vendors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For9ful0fq1v87xtjpr9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2For9ful0fq1v87xtjpr9a.png" alt=" raw `recorder.example.com` endraw  is same-domain but _not_ same-origin to  raw `example.com` endraw "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next idea was to bring our contents to your origin, by embedding both the Capture and the Recorder scripts onto your pages via iframe. This way, both capture.js and recorder.js scripts would live in the example.com:recorder.jam.dev partition, and could communicate to each other!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihr5vw0gvkm8aj283vl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihr5vw0gvkm8aj283vl8.png" alt="Both scripts embedded from  raw `recorder.jam.dev` endraw  are in the same state partition"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The rest of the work was not easy—try building an app that works equally well in embedded vs. non-embedded states, or reliably streaming video content across an iframe boundary in all major desktop browsers—but it was mostly app work, on top of infrastructure we could trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managed Embeds
&lt;/h2&gt;

&lt;p&gt;Having determined our architecture requirements, we also prioritized figuring out exactly how we would distribute our iframes. We had previously considered a few other mechanisms—the CNAME approach of course, and a “proxy recorder” where embedders’ servers fetched and served our content directly—but there were only two meaningful mechanisms in our iframe bucket:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DIRECT EMBED—&lt;/strong&gt;where embedders directly embed an iframe with a URL we provide:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Recorder Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- YOUR PAGE'S `&amp;lt;head&amp;gt;` --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://recorder.jam.dev/recorder/PASS-THE-ID"&lt;/span&gt;
      &lt;span class="na"&gt;sandbox=&lt;/span&gt;&lt;span class="s"&gt;"allow-scripts allow-same-origin allow-popups"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MANAGED EMBED—&lt;/strong&gt;where embedders use a script we provide to mount our iframe:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- on all capture-able pages --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.jam.dev/capture.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- at least on recorder pages --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.jam.dev/recorder.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also wanted to make sure that Jams recorded on your pages only get sent to you—you don’t want someone from &lt;a href="http://evil.com" rel="noopener noreferrer"&gt;&lt;code&gt;evil.com&lt;/code&gt;&lt;/a&gt; to spoof an &lt;a href="http://example.com" rel="noopener noreferrer"&gt;&lt;code&gt;example.com&lt;/code&gt;&lt;/a&gt; Recording Link and steal the privileged network and console logs from an unsuspecting user.&lt;/p&gt;

&lt;p&gt;To achieve this, we needed to design a domain verification strategy. We considered three options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over DNS—&lt;/strong&gt;configure a TEXT record with a value we expect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp6o2xen6ga11iaxtvsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp6o2xen6ga11iaxtvsj.png" alt="Example DNS setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Over HTTP—&lt;/strong&gt;return a response we expect from a configured endpoint
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/PROVIDED-URL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PROVIDED-BODY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In HTML—&lt;/strong&gt;attest the teams you allow wherever you load the recorder script
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.jam.dev/recorder.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"jam:team"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"TEAM-ID-COPIED-FROM-SETTINGS"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"jam:team"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"ANOTHER-TEAM-ID-FROM-SETTINGS"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- more head content --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- body content --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consider the above options with regards to three criteria we’d set out while spec’ing the work:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Prefer copy/paste-able solutions vs. ones that require config&lt;/li&gt;
&lt;li&gt;Prefer solutions implementable by lower-authority personnel&lt;/li&gt;
&lt;li&gt;Prefer solutions that look familiar and obvious vs. strange and opaque&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Managed Embeds w/ In-HTTP Domain Verification is just… cleaner. There’s only one line that requires config, and we don’t have to ask users to update their site code should we need different iframe attributes, for example. Additionally, neither of these require the implementer have permission to edit DNS settings. And everyone recognizes script embeds and meta tags!&lt;/p&gt;

&lt;p&gt;As with above, the rest of the work was not easy—coordinating state across multiple frame boundaries is challenging!—but we thought it much more convenient for users and maintainable for us to own this complexity. I’m still impressed we managed to pack such a powerful product into three lines of HTML!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;We have ambitious plans for Recording Links: new ways to create them, new ways to consume them, new ways to make them even easier to use. Today, we celebrate how far we’ve come; Recording Links has surpassed many of our expectations internally, and we hope it delivers you not just the value but the &lt;em&gt;wows&lt;/em&gt; we’ve been experiencing.&lt;/p&gt;

&lt;p&gt;Have you tried Recording Links yet? If not, what are you waiting for? It’s &lt;a href="https://jam.dev/docs/product-features/recording-links" rel="noopener noreferrer"&gt;only 3 lines of HTML to get started&lt;/a&gt;; I’d order you a coffee while you work, but let’s be real—if you made it this far, by the time the coffee was ready you’d already be done.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introducing The Valentines Day Debugger – AI debugging hints for your relationship problems</title>
      <dc:creator>Dani Grant</dc:creator>
      <pubDate>Fri, 14 Feb 2025 20:19:55 +0000</pubDate>
      <link>https://dev.to/jamdotdev/introducing-the-valentines-day-debugger-ai-debugging-hints-for-your-relationship-problems-32m4</link>
      <guid>https://dev.to/jamdotdev/introducing-the-valentines-day-debugger-ai-debugging-hints-for-your-relationship-problems-32m4</guid>
      <description>&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1890423272875196896-601" src="https://platform.twitter.com/embed/Tweet.html?id=1890423272875196896"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1890423272875196896-601');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1890423272875196896&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Now you can capture all the debug details of your relationship problems. Diagnose &amp;amp; fix issues faster, complete with AI hints!&lt;/p&gt;

&lt;p&gt;Software engineers are telling us this is saving hours of their time.&lt;/p&gt;

&lt;p&gt;Let us give you a tour!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1-click send to friend chat&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg74fc0horx6w4pzd6q6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg74fc0horx6w4pzd6q6q.png" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant replay for critical moments&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlk4d19uny8z2qqdn03q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlk4d19uny8z2qqdn03q.png" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI helpfully offers suggestions&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8gb4r3fmhqeaq54kfej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8gb4r3fmhqeaq54kfej.png" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're just kidding, but we hope this made you smile! Happy Valentine's Day from your friends at Jam.dev 💜&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>jokes</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We built an AI bug reporter with Gemini 2.0</title>
      <dc:creator>Dani Grant</dc:creator>
      <pubDate>Thu, 06 Feb 2025 16:04:49 +0000</pubDate>
      <link>https://dev.to/jamdotdev/we-built-an-ai-bug-reporter-with-gemini-20-1l4j</link>
      <guid>https://dev.to/jamdotdev/we-built-an-ai-bug-reporter-with-gemini-20-1l4j</guid>
      <description>&lt;p&gt;It’s insane that bug reporting is still done by hand. People are terrible at writing bug reports. That’s how you end up with hours of back-and-forth for a 5 min fix. "What browser?" “Is it still happening?”&lt;/p&gt;

&lt;p&gt;But this is a problem you can fix with tools. Humans are inherently error-prone when it comes to reporting bugs, but computers aren’t. Imagine a tool that plugs into devtools and grabs: session recording + network logs + error traces + AI that writes a summary and repro steps. &lt;/p&gt;

&lt;p&gt;A few years ago, we built a tool that captures all the information you’d get in a HAR file plus screen recording and packages it into a link for engineers. (Like a screen recorder plus DevTools). It’s called jam.dev and people use it to capture more than half a million bugs each month now (which we are really excited about!)&lt;/p&gt;

&lt;p&gt;Today we added an AI inside that analyzes all of the session data and errors/traces in the console and network logs and writes a concise description of the bug and lists out the exact repro steps, complete with timestamps mapped to the screen recording. It’s built with Gemini 2.0 which we used while in experimental mode. We chose Gemini because of Gemini’s native ability to process videos (which other LLMs don’t have).&lt;/p&gt;

&lt;p&gt;I’d love for you to try it out and let me know your thoughts. My email is &lt;a href="mailto:dani@jam.dev"&gt;dani@jam.dev&lt;/a&gt; and I hope to hear from you.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://jam.dev/ai" rel="noopener noreferrer"&gt;jam.dev/ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://x.com/jamdotdev/status/1887523689518014891" rel="noopener noreferrer"&gt;https://x.com/jamdotdev/status/1887523689518014891&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think people are going to have a large role in testing software for a long time (as long as humans are the users, humans need to be testers too), but what doesn’t need to be manually done is collecting debug information and writing it up into a ticket. Like Kasparov and Deep Blue, the strongest collab is human + computer paired together –– humans to their strengths, computers to theirs. &lt;/p&gt;

&lt;p&gt;By the way, we’re hiring engineers and working on building AI for debugging, de-duplication and auto-resolution and if these are problems that excite you, we’d love to chat: &lt;a href="https://jam.dev/careers" rel="noopener noreferrer"&gt;jam.dev/careers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>9 lessons we learned building Jam in 2024</title>
      <dc:creator>Dani Grant</dc:creator>
      <pubDate>Thu, 02 Jan 2025 17:36:55 +0000</pubDate>
      <link>https://dev.to/jamdotdev/9-lessons-we-learned-building-jam-in-2024-1j0</link>
      <guid>https://dev.to/jamdotdev/9-lessons-we-learned-building-jam-in-2024-1j0</guid>
      <description>&lt;p&gt;Thank you for being a part of Jam this year! We crossed 6 million Jams, 170k users, shipped 31 new features and an entirely new Jam for your helpdesk, saved engineers 50+ years of debugging time (!) and got to meet 2,000 of you at a Jam meetup.&lt;/p&gt;

&lt;p&gt;Everyone who Jams is a builder trying to make some corner of the world better through software. Y'all are awesome.&lt;/p&gt;

&lt;p&gt;So, we wanted to end the year by sharing with you — builder to builder — 9 lessons we learned at Jam this year. And if you feel inspired, I'd love for you to let me know a lesson you learned building your product.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/KFOo0w2sk-M"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Small teams, high ownership&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This year we grew from 11 to 20 people, and split from one team into specialized pods. And… small teams with true ownership run faster and do more than I ever thought possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Quality requires engineering discipline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a practice you have to keep. You don't just work on performance "this quarter". It's a mindset and a practice you stick to every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Getting over our process allergy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're small, it's important to be allergic to process. But as you grow, a bit of process is needed so you can do more things than anyone can keep in their head. This year we added just a few templates, checklists and weekly reviews. At first I was resistant, but now can't imagine how else we could manage so many parallel projects going on at any given time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 Treat everything as user experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if it's an email, it's still a user experience. It takes longer to craft everything when you think like that. But, you end up shipping things that you're excited for users to experience! And that's super fun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Great dev teams do the boring things well&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Investing in the boring things unlocks you to move on to new problems. Docs, testing, deployment, infra. It's really boring to upgrade your servers, but all that investment means we get to go even faster now ("and sleep better" says the currently on-call engineer).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. 1 + 1 designers = 3 designers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used to worry that adding a second designer would slow us down, because instead of one person having all the context, they would need to coordinate. But actually, when we grew the design team, we were able to do even more because they had thought partners to think through our hardest design challenges. That was really cool to see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. The simple version is better&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When in doubt, ship the simplest thing. The live Jam product today started as an internal project called "Simple Jam". The live Jam pricing started as an internal project called "Simple pricing". The simplest version is simply better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Hire people who awe you&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hire people who love what they do. Hire people who care so darn much, you can't help but smile when they share. The joy of building things happens in moments, day to day, week to week. The people you get to build with are everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Time moves really fast in a startup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of things change in a year. Things grow up quickly. Cherish the moments :)&lt;/p&gt;

&lt;p&gt;Now, onto 2025! Excited to continue the Jam journey with all of you. Thanks for being a part of it. Happy new year!&lt;/p&gt;

&lt;p&gt;💜, the Jam team:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F364z1ukk1jp473lek2p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F364z1ukk1jp473lek2p7.png" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>productivity</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Startup Lessons We Learned in 2024</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Fri, 27 Dec 2024 13:27:44 +0000</pubDate>
      <link>https://dev.to/jamdotdev/startup-lessons-we-learned-in-2024-19lo</link>
      <guid>https://dev.to/jamdotdev/startup-lessons-we-learned-in-2024-19lo</guid>
      <description>&lt;p&gt;Our startup is changing! This year we went from 11 to 20 people, launched a new product (+30 features!), and learned a lot along the way. So we recorded our biggest lessons of the year. We’re excited to share them with you all, hope you enjoy!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/KFOo0w2sk-M?start=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What we learned:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=21s" rel="noopener noreferrer"&gt;0:21&lt;/a&gt; Irtefa, co-founder&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=89s" rel="noopener noreferrer"&gt;1:29&lt;/a&gt; Chris, designer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=290s" rel="noopener noreferrer"&gt;4:50&lt;/a&gt; Cyrus, engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=414s" rel="noopener noreferrer"&gt;6:54&lt;/a&gt; Tomasz, engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=468s" rel="noopener noreferrer"&gt;7:48&lt;/a&gt; Aidan, engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=605s" rel="noopener noreferrer"&gt;10:05&lt;/a&gt; Ivanha, marketer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=692s" rel="noopener noreferrer"&gt;11:32&lt;/a&gt; Ian, creator&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=800s" rel="noopener noreferrer"&gt;13:20&lt;/a&gt; Rui, engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=910s" rel="noopener noreferrer"&gt;15:10&lt;/a&gt; Oskar, engineer&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=KFOo0w2sk-M&amp;amp;t=981s" rel="noopener noreferrer"&gt;16:21&lt;/a&gt; Dani, co-founder&lt;/p&gt;

&lt;p&gt;P.S. If you’d like to share what you learned building your product, drop it in the comments, we’d love to know.&lt;/p&gt;

&lt;p&gt;Subscribe to Building Jam on &lt;a href="https://youtube.com/playlist?list=PLtQrebgNo7dIJOLpiiqAg-LUL2QJA-f6W&amp;amp;si=mkIOschbqfWqiItl" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://open.spotify.com/show/7s55TAjknbXw9zOROGSsmQ" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;, and &lt;a href="https://podcasts.apple.com/us/podcast/building-jam/id1743414087" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;. New episodes drop every Friday at 10AM ET. See you there!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>startup</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How We Rebuilt Our Extension for Manifest V3</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Sun, 01 Dec 2024 20:12:09 +0000</pubDate>
      <link>https://dev.to/jamdotdev/how-we-rebuilt-our-extension-for-manifest-v3-2iga</link>
      <guid>https://dev.to/jamdotdev/how-we-rebuilt-our-extension-for-manifest-v3-2iga</guid>
      <description>&lt;p&gt;Every week we share the story behind building our startup, &lt;a href="https://jam.dev" rel="noopener noreferrer"&gt;Jam&lt;/a&gt;. This week, Jam eng, Aidan shares how we handled migration to MV3! Dig into all the technical details with us, and the challenges of doing a complete refactor of our browser extension + rolling it out to 150k users.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4cyAedZEXkA?start=1"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;We discuss:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=40s" rel="noopener noreferrer"&gt;0:40&lt;/a&gt; The biggest challenge of the MV3 refactor&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=243s" rel="noopener noreferrer"&gt;4:03&lt;/a&gt; How MV3 changed our product roadmap&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=290s" rel="noopener noreferrer"&gt;4:50&lt;/a&gt; Why getting Jam’s idle states for version updates was harder in MV3&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=596s" rel="noopener noreferrer"&gt;9:56&lt;/a&gt; The capture eng team &amp;amp; the support flows they took over&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=679s" rel="noopener noreferrer"&gt;11:19&lt;/a&gt; Balancing the scope &amp;amp; urgency of MV3 w/ building new features our users want&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=766s" rel="noopener noreferrer"&gt;12:46&lt;/a&gt; Now that we’re on MV3 - what’s next for capture?&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=4cyAedZEXkA&amp;amp;t=1026s" rel="noopener noreferrer"&gt;17:06&lt;/a&gt; Come work w/ us! New open role for Technical Support &amp;amp; QA!&lt;/p&gt;

&lt;p&gt;See Support/QA + more open roles at &lt;a href="https://jam.dev/careers" rel="noopener noreferrer"&gt;Jam careers&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>extensions</category>
      <category>architecture</category>
      <category>api</category>
    </item>
    <item>
      <title>Our ex-cloudflare team built a tool that extracts debug data from screen recordings</title>
      <dc:creator>Dani Grant</dc:creator>
      <pubDate>Mon, 25 Nov 2024 18:07:26 +0000</pubDate>
      <link>https://dev.to/jamdotdev/our-ex-cloudflare-team-built-a-tool-that-extracts-debug-data-from-screen-recordings-44ld</link>
      <guid>https://dev.to/jamdotdev/our-ex-cloudflare-team-built-a-tool-that-extracts-debug-data-from-screen-recordings-44ld</guid>
      <description>&lt;p&gt;Hey DEV Community! 4 years ago, an ex-Cloudflare team and I started building a product — trying to make bug reporting a lot less painful.&lt;/p&gt;

&lt;p&gt;Our tool is called &lt;a href="https://jam.dev" rel="noopener noreferrer"&gt;Jam&lt;/a&gt; and it makes it pretty much impossible to create vague bug reports (like I used to when I was a PM). It's really hard as a non-engineer to send useful debug info!&lt;/p&gt;

&lt;p&gt;If you care a lot, you'll take the time to include a screenshot or a screen recording of the bug. But, sometimes the important info is what's right outside the boundaries of the screenshot – or the developer needs to know what happened right before the video? Or needs to know some info like what account you're logged in with, and if there are any errors in the console, and you can't tell that from a screenshot or video.&lt;/p&gt;

&lt;p&gt;Debugging is the worst part of engineering - but it's not actually because of the fixing, it's all the back and forth required to reproduce &amp;amp; get to the debugging! This context gap should be filled by tools.&lt;/p&gt;

&lt;p&gt;Our goal was to make it really easy for people to log bugs in a format that gives developers all the context they need, right there in the bug report. &lt;/p&gt;

&lt;p&gt;We tried 7 different versions of Jam to solve this problem, until we landed on what it is today - a browser extension you click when you want to catch a bug.&lt;/p&gt;

&lt;p&gt;It's basically a screen recorder, except Jam auto-captures: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;console logs&lt;/li&gt;
&lt;li&gt;network requests&lt;/li&gt;
&lt;li&gt;repro steps&lt;/li&gt;
&lt;li&gt;session &amp;amp; user details&lt;/li&gt;
&lt;li&gt;device &amp;amp; OS&lt;/li&gt;
&lt;li&gt;backend logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's some extra debug tooling in there for websockets and graphql too (we love/hate graphql, but that's besides the point.)&lt;/p&gt;

&lt;p&gt;You can see an example of what the captured data looks like here: &lt;a href="https://jam.dev/c/96149346-3cb1-439a-b4d0-fed8181ea036" rel="noopener noreferrer"&gt;https://jam.dev/c/96149346-3cb1-439a-b4d0-fed8181ea036&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 years into this version of Jam, our tool is used by over 150,000 people to fix more than 5 million bugs! That's really awesome, but there's so much more to do.&lt;/p&gt;

&lt;p&gt;We really want to build something that makes this part of the job suck less. So, I wanted to open up for discussion here and get your feedback.&lt;/p&gt;

&lt;p&gt;Jam is free to use forever (we've got a paid plan for companies who need it, but we will always keep a large free plan - after all, we learned to build products at Cloudflare).  &lt;/p&gt;

&lt;p&gt;I hope you'll check it out and let us know what you think: &lt;a href="https://jam.dev" rel="noopener noreferrer"&gt;https://jam.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My email is &lt;a href="mailto:dani@jam.dev"&gt;dani@jam.dev&lt;/a&gt;, feel free to reach out anytime.&lt;/p&gt;

&lt;p&gt;By the way, we're hiring engineers and if making debugging a lot more efficient is a problem that excites you, we'd love to chat: &lt;a href="https://jam.dev/careers" rel="noopener noreferrer"&gt;jam.dev/careers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>frontend</category>
      <category>startup</category>
    </item>
    <item>
      <title>Our Startup Loves These AI Tools (we recorded a 14 min podcast ep. about why).</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Fri, 08 Nov 2024 17:09:12 +0000</pubDate>
      <link>https://dev.to/jamdotdev/our-startup-loves-these-ai-tools-cn8</link>
      <guid>https://dev.to/jamdotdev/our-startup-loves-these-ai-tools-cn8</guid>
      <description>&lt;p&gt;We’re so excited about AI - not just the AI features we’re building for Jam (can’t wait to show y'all!) but all the great tooling that helps us move faster at our startup. So, today we’re sharing the 13 AI tools we actually use — almost every day — how we use them, and why we love them.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/IFThiFovOAc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Timestamps: &lt;/p&gt;

&lt;p&gt;(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=7s" rel="noopener noreferrer"&gt;00:07&lt;/a&gt;) Gemini &amp;amp; OpenAI&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=62s" rel="noopener noreferrer"&gt;01:02&lt;/a&gt;) GLIF&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=212s" rel="noopener noreferrer"&gt;03:32&lt;/a&gt;) GitHub Copilot&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=273s" rel="noopener noreferrer"&gt;04:33&lt;/a&gt;) Promptfoo&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=320s" rel="noopener noreferrer"&gt;05:20&lt;/a&gt;) Wondercraft &amp;amp; Descript&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=437s" rel="noopener noreferrer"&gt;07:17&lt;/a&gt;) OpusClip&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=531s" rel="noopener noreferrer"&gt;08:51&lt;/a&gt;) Grain&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=591s" rel="noopener noreferrer"&gt;09:51&lt;/a&gt;) ChatPRD&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=634s" rel="noopener noreferrer"&gt;10:34&lt;/a&gt;) Perplexity&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=688s" rel="noopener noreferrer"&gt;11:28&lt;/a&gt;) Claude&lt;br&gt;
(&lt;a href="https://www.youtube.com/watch?v=IFThiFovOAc&amp;amp;t=706s" rel="noopener noreferrer"&gt;11:46&lt;/a&gt;) ChatGPT&lt;/p&gt;

&lt;p&gt;Episode links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;This Week in JS&lt;/strong&gt;: &lt;a href="https://thisweekinjavascript.com/" rel="noopener noreferrer"&gt;https://thisweekinjavascript.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt;: &lt;a href="https://ai.google.dev/" rel="noopener noreferrer"&gt;https://ai.google.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt;: &lt;a href="https://openai.com/api/" rel="noopener noreferrer"&gt;https://openai.com/api/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt;: &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;https://github.com/features/copilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promptfoo&lt;/strong&gt;: &lt;a href="https://www.promptfoo.dev/" rel="noopener noreferrer"&gt;https://www.promptfoo.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpusClip&lt;/strong&gt;: &lt;a href="https://www.opus.pro/" rel="noopener noreferrer"&gt;https://www.opus.pro/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grain&lt;/strong&gt;: &lt;a href="https://grain.com/" rel="noopener noreferrer"&gt;https://grain.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatPRD&lt;/strong&gt;: &lt;a href="https://www.chatprd.ai/" rel="noopener noreferrer"&gt;https://www.chatprd.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity&lt;/strong&gt;: &lt;a href="https://www.perplexity.ai/" rel="noopener noreferrer"&gt;https://www.perplexity.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt;: &lt;a href="https://chat.openai.com/" rel="noopener noreferrer"&gt;https://chat.openai.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt;: &lt;a href="https://claude.ai/" rel="noopener noreferrer"&gt;https://claude.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe to Building Jam on &lt;a href="https://youtube.com/playlist?list=PLtQrebgNo7dIJOLpiiqAg-LUL2QJA-f6W&amp;amp;si=mkIOschbqfWqiItl" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://open.spotify.com/show/7s55TAjknbXw9zOROGSsmQ" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;, and &lt;a href="https://podcasts.apple.com/us/podcast/building-jam/id1743414087" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;New episodes drop every Friday at 10AM ET. See you there!&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>ai</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>We made a horror movie inspired by spooky prod bugs 🎃</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Thu, 31 Oct 2024 17:52:39 +0000</pubDate>
      <link>https://dev.to/jamdotdev/we-made-a-horror-movie-inspired-by-spooky-prod-bugs-23cm</link>
      <guid>https://dev.to/jamdotdev/we-made-a-horror-movie-inspired-by-spooky-prod-bugs-23cm</guid>
      <description>&lt;p&gt;Dim the lights &amp;amp; grab your debugging buddy - it's a Jam Halloween video! 🍿&lt;/p&gt;

&lt;p&gt;It’s an extra special Halloween because today we crossed 5 million Jams created! 🤯&lt;/p&gt;

&lt;p&gt;So, we made y'all this video based on a real scary movie. Inspired by the spookiest thing out there – real software bugs in production.&lt;/p&gt;

&lt;p&gt;Hope you 🎃 it&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YY8M9O4Xjk8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Happy Halloween! And cheers to 5 million bugs caught with Jam!! We can’t believe it!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>halloween</category>
      <category>thebugpurge</category>
    </item>
    <item>
      <title>New eng ep. on Building Jam! How we're building AI features 🎧</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Sat, 05 Oct 2024 01:25:51 +0000</pubDate>
      <link>https://dev.to/jamdotdev/new-eng-ep-on-building-jam-how-were-building-ai-features-46kf</link>
      <guid>https://dev.to/jamdotdev/new-eng-ep-on-building-jam-how-were-building-ai-features-46kf</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Zz-ZKH3bFm4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;We’re getting ready to ship 3 new AI features! So, today, 2 engineers leading AI development at Jam, &lt;a href="https://dev.to/baransu"&gt;Tomasz&lt;/a&gt; and Oskar, join the podcast to give us an update.&lt;/p&gt;

&lt;p&gt;They did a demo at standup and wow - the future of AI debugging is 🌟&lt;/p&gt;

&lt;p&gt;We're so excited for you all to use Jam AI. And to share how we’re making it, how it’s going, and the tools we’re using. Hope you enjoy listening!&lt;/p&gt;

&lt;p&gt;We discuss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tools we’re using to build Jam AI&lt;/li&gt;
&lt;li&gt;Tomasz shares the challenges of non-deterministic software&lt;/li&gt;
&lt;li&gt;Jam’s process to build AI: data, validation &amp;amp; a lot of dogfooding&lt;/li&gt;
&lt;li&gt;Irtefa’s message to Jam users waiting for more AI features&lt;/li&gt;
&lt;li&gt;How we evaluate our prompts&lt;/li&gt;
&lt;li&gt;Unexpected LLM prompt hacks we’ve discovered&lt;/li&gt;
&lt;li&gt;What’s the experimentation stage of AI development like at Jam?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe to Building Jam on &lt;a href="https://youtube.com/playlist?list=PLtQrebgNo7dIJOLpiiqAg-LUL2QJA-f6W&amp;amp;si=mkIOschbqfWqiItl" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://open.spotify.com/show/7s55TAjknbXw9zOROGSsmQ" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;, and &lt;a href="https://podcasts.apple.com/us/podcast/building-jam/id1743414087" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;New episodes drop every Friday at 10AM ET. See you there!&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>ai</category>
      <category>llm</category>
      <category>learning</category>
    </item>
    <item>
      <title>19 Open-Source Utils for Conversion, Formatting + More (no ads, free, client-side)</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Tue, 01 Oct 2024 23:28:06 +0000</pubDate>
      <link>https://dev.to/jamdotdev/19-open-source-utils-for-conversion-formatting-more-no-ads-free-client-side-59kp</link>
      <guid>https://dev.to/jamdotdev/19-open-source-utils-for-conversion-formatting-more-no-ads-free-client-side-59kp</guid>
      <description>&lt;p&gt;We got annoyed with having to use those 1990s-looking websites covered in ads anytime we needed to convert data (e.g. PNG to data URI). So we set out to build a set of these tools with a better developer experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6lxudl01fwyv420ggwc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6lxudl01fwyv420ggwc.gif" alt="dev utils by jam.dev" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We started by making the tools we use ourselves. Any time a Jam engineer needed a tool, they'd send it in our #project-dev-utilities Slack channel. Eventually we had 14 tools!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F985t9krkh5u3kkem8irg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F985t9krkh5u3kkem8irg.png" alt="Jam Slack channel with utils requests" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we got our first community contribution! Thanks Cassidy Williams for an awesome &lt;a href="https://jam.dev/utilities/env-to-netlify-toml" rel="noopener noreferrer"&gt;.env to Netlify.toml converter&lt;/a&gt;. And a couple weeks ago, we launched &lt;a href="https://jam.dev/utilities" rel="noopener noreferrer"&gt;the site&lt;/a&gt; so anyone can use the tools, all client-side, free, and open-source. &lt;/p&gt;

&lt;p&gt;Since then OSS contributors have added 4 more dev utils 🔥 - so cool. If you'd like to contribute a tool, we will send you a hat and probably a pizza too! &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jam's Dev Utilities: &lt;a href="https://jam.dev/utilities" rel="noopener noreferrer"&gt;jam.dev/utilities
&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/jamdotdev" rel="noopener noreferrer"&gt;github.com/jamdotdev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  List of all available utilities:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/csv-to-json" rel="noopener noreferrer"&gt;CSV to JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/base-64-encoder" rel="noopener noreferrer"&gt;Base64 Encode/Decode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/json-formatter" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/yaml-to-json" rel="noopener noreferrer"&gt;YAML to JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/url-encoder" rel="noopener noreferrer"&gt;URL Encode/Decode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/timestamp-to-date" rel="noopener noreferrer"&gt;Timestamp to Date Converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/query-params-to-json" rel="noopener noreferrer"&gt;Query Parameters to JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/hex-to-rgb" rel="noopener noreferrer"&gt;HEX to RGB Converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/env-to-netlify-toml" rel="noopener noreferrer"&gt;Convert .env to netlify.toml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/image-to-base64" rel="noopener noreferrer"&gt;Image to Base64 Converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/json-to-csv" rel="noopener noreferrer"&gt;JSON to CSV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/har-file-viewer" rel="noopener noreferrer"&gt;HAR file viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/json-to-yaml" rel="noopener noreferrer"&gt;JSON to YAML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/number-base-changer" rel="noopener noreferrer"&gt;Number Base Changer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/css-inliner-for-email" rel="noopener noreferrer"&gt;CSS Inliner for Email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/regex-tester" rel="noopener noreferrer"&gt;Regex Tester&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/image-resizer" rel="noopener noreferrer"&gt;Image Resizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/css-units-converter" rel="noopener noreferrer"&gt;CSS Units Converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jam.dev/utilities/jwt-parser" rel="noopener noreferrer"&gt;JWT Parser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Our site is built with:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;NEXT.js&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;shadcn/ui&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://cmdk.paco.me/" rel="noopener noreferrer"&gt;cmdk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Are there any other tools that you wish existed or are there any other tools that you've made for yourself like this? Let us know! We'll be adding new tools regularly, so check back for more.&lt;/p&gt;

&lt;p&gt;P.S. We’re hiring engineers and if you like building dev tooling, that’s our Jam and we’d love to chat: &lt;a href="https://jam.dev/careers" rel="noopener noreferrer"&gt;jam.dev/careers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>tooling</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We started a podcast to share what it's like at our startup 🎧</title>
      <dc:creator>Ivanha Paz</dc:creator>
      <pubDate>Mon, 30 Sep 2024 19:53:25 +0000</pubDate>
      <link>https://dev.to/jamdotdev/we-started-building-jam-to-share-what-its-like-at-our-startup-5fjd</link>
      <guid>https://dev.to/jamdotdev/we-started-building-jam-to-share-what-its-like-at-our-startup-5fjd</guid>
      <description>&lt;p&gt;For years I’ve wanted a product podcast that feels like friends talking about interesting things. Like all my favorite non-SaaS ones...&lt;/p&gt;

&lt;p&gt;Back in April, during a team offsite in Bogotá, we had an idea. As we were single filing through the turnstile, onto the TransMilenio bus platform taking us to our next &lt;em&gt;tinto&lt;/em&gt; ☕️ - it clicked 💡&lt;/p&gt;

&lt;p&gt;What if we hit record on the conversations we're having each week? Decisions, moments, challenges. No fluff, just the unfiltered reality of &lt;a href="https://youtube.com/playlist?list=PLtQrebgNo7dIJOLpiiqAg-LUL2QJA-f6W&amp;amp;si=sHwy4Qdm3U6yLbF-" rel="noopener noreferrer"&gt;Building Jam&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Our hypothesis was simple: our community will enjoy listening &amp;amp; get value from what we learn along the way.&lt;/p&gt;

&lt;p&gt;Since we were together in-person, we decided to go for it right away! We recorded our first episode and launched the &lt;a href="https://open.spotify.com/show/7s55TAjknbXw9zOROGSsmQ?si=8f049dd52e404922" rel="noopener noreferrer"&gt;Building Jam podcast&lt;/a&gt; the next day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For those of you interested in podcasting, I've included the easy (mostly free) stack we've been using at the bottom of this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvabbswbvohco630kj2b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvabbswbvohco630kj2b.png" alt="Screenshot of Building Jam launch email - Episode 1: Live from Bogotá" width="671" height="851"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was a 12 week experiment, by the end we were supposed to make a "go-no-go" decision. We decided to keep going, even though our numbers weren't very high. We actually published our &lt;a href="https://youtu.be/Gs3FYzVQ7TI?si=ABCRJCr328thzT4S" rel="noopener noreferrer"&gt;real podcast retro&lt;/a&gt; as an episode. &lt;/p&gt;

&lt;p&gt;The TL;DR: we think the effort is worth it for those already tuning in, and we love doing it.&lt;/p&gt;

&lt;p&gt;So we kicked off Season 2 and today marks week 24 of the podcast 🤯. &lt;/p&gt;

&lt;p&gt;Part of the joy of growing a startup is getting to learn from the experts who've done it before - SO many unblocks happen thanks to these convos. For Season 2, we invited leaders from our favorite products (like Cloudflare, WorkOS, Warp, Campsite) to join us on the pod and get their advice on the challenges we're facing. &lt;/p&gt;

&lt;p&gt;Here's what I learned!&lt;/p&gt;

&lt;h3&gt;
  
  
  About building a product devs love:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design matters - a lot&lt;/strong&gt;. Dev tools should work, duh! But, it's not just about building something useful anymore, devs want tools that are easy to use, with beautiful UI, and attention to detail. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product-led engineering is the way&lt;/strong&gt;. Most of the eng leaders we've gotten to talk to (and from my own experience at Jam) - it's clear that developers are taking a more creative and strategic role in product development. And it starts as early as hiring, with top startups conducting PM style interviews for eng roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers are not a monolith&lt;/strong&gt;. Each dev community is its own thing. The vibes are super different depending on programming languages, stack, front-end/back-end, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The best dev advocates make friends&lt;/strong&gt;. You gotta be yourself, not just your “work self”. Building for builders is my dream job. It’s amazing to talk to people every day who are creating incredible products. But, we all have marketing teams and we all launch new features and we know the game. There are no shortcuts, just a lot of effort into trying to deliver a good experience that matches what your community wants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About podcasting:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It's harder than it looks because you want to be real &lt;em&gt;and&lt;/em&gt; relevant for other people.&lt;/li&gt;
&lt;li&gt;You gotta be in it for the long haul. &lt;/li&gt;
&lt;li&gt;It's totally worth it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Jam's Podcasting Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Riverside - recording&lt;/li&gt;
&lt;li&gt;Transistor - publishing&lt;/li&gt;
&lt;li&gt;Descript - editing/transcription&lt;/li&gt;
&lt;li&gt;Figma - design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can subscribe to Building Jam on &lt;a href="https://youtube.com/playlist?list=PLtQrebgNo7dIJOLpiiqAg-LUL2QJA-f6W&amp;amp;si=mkIOschbqfWqiItl" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://open.spotify.com/show/7s55TAjknbXw9zOROGSsmQ" rel="noopener noreferrer"&gt;Spotify&lt;/a&gt;, and &lt;a href="https://podcasts.apple.com/us/podcast/building-jam/id1743414087" rel="noopener noreferrer"&gt;Apple Podcasts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;New episodes drop every Friday at 10AM ET. See you there!&lt;/p&gt;

</description>
      <category>learning</category>
      <category>startup</category>
      <category>softwaredevelopment</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
