<?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: Patrick Kenneally</title>
    <description>The latest articles on DEV Community by Patrick Kenneally (@paddy-systems).</description>
    <link>https://dev.to/paddy-systems</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112800%2F3dafbcf5-7c64-41a3-aad8-d5fa79f76bc9.png</url>
      <title>DEV Community: Patrick Kenneally</title>
      <link>https://dev.to/paddy-systems</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paddy-systems"/>
    <language>en</language>
    <item>
      <title>A URL Is Not a Development Loop</title>
      <dc:creator>Patrick Kenneally</dc:creator>
      <pubDate>Tue, 08 Sep 2026 14:49:17 +0000</pubDate>
      <link>https://dev.to/paddy-systems/a-url-is-not-a-development-loop-fhc</link>
      <guid>https://dev.to/paddy-systems/a-url-is-not-a-development-loop-fhc</guid>
      <description>&lt;p&gt;Yesterday I wrote about why local development still feels strangely isolated.&lt;/p&gt;

&lt;p&gt;The obvious answer to that problem is usually some variation of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Just expose the port.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And technically, yes. Congratulations, the URL now works somewhere else.&lt;/p&gt;

&lt;p&gt;But that only solves the least interesting part of the problem.&lt;/p&gt;

&lt;p&gt;What I care about with &lt;strong&gt;Relay&lt;/strong&gt; is what happens after somebody connects.&lt;/p&gt;

&lt;p&gt;If I save a file locally, the connected client should update. If something breaks on their device, useful information should come back. If they move around the app, that context should not just disappear into the void.&lt;/p&gt;

&lt;p&gt;In other words, I don’t just want Relay to share a development server.&lt;/p&gt;

&lt;p&gt;I want it to preserve the development loop.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feamly6dfqnsa8q5gq9tb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feamly6dfqnsa8q5gq9tb.png" alt="A URL IS NOT A DEVELOPMENT LOOP" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The connection has to stay alive
&lt;/h2&gt;

&lt;p&gt;Modern development servers do a lot more than serve HTML and JavaScript.&lt;/p&gt;

&lt;p&gt;They keep long-lived connections open. They push updates. They expect the browser and the development server to keep talking to each other. Frameworks build their own assumptions on top of that, and they’re not always particularly shy about it.&lt;/p&gt;

&lt;p&gt;So if Relay is going to sit between a local development server and a connected client, it cannot just forward the first request and call it a day.&lt;/p&gt;

&lt;p&gt;HTTP needs to work.&lt;/p&gt;

&lt;p&gt;WebSockets need to work.&lt;/p&gt;

&lt;p&gt;Assets need to keep loading.&lt;/p&gt;

&lt;p&gt;Routes need to behave normally.&lt;/p&gt;

&lt;p&gt;HMR and Fast Refresh need to survive the connection.&lt;/p&gt;

&lt;p&gt;And when the developer saves a file, the person on the other side should see the result without waiting for another build, deployment, or the ceremonial “can you refresh?” message.&lt;/p&gt;

&lt;p&gt;That sounds simple when written as a paragraph.&lt;/p&gt;

&lt;p&gt;It is slightly less simple when several different frameworks all have their own ideas about how development traffic should behave.&lt;/p&gt;

&lt;h2&gt;
  
  
  HMR is one of the bits that matters most
&lt;/h2&gt;

&lt;p&gt;One of the easiest ways for a shared development environment to stop feeling like a development environment is for live updates to disappear.&lt;/p&gt;

&lt;p&gt;If every code change turns into a full reload, or worse, requires the other person to manually refresh, you’ve already lost a lot of the value.&lt;/p&gt;

&lt;p&gt;Relay keeps the normal development connection intact, so frameworks can continue doing what they already do.&lt;/p&gt;

&lt;p&gt;With Vite-based applications, HMR continues across the Relay gateway.&lt;/p&gt;

&lt;p&gt;With React, Fast Refresh still works.&lt;/p&gt;

&lt;p&gt;Next.js and Turbopack have their own quirks, because apparently one straightforward implementation across every tool would have been too generous, but the same principle applies.&lt;/p&gt;

&lt;p&gt;Relay stays out of the application and preserves the traffic the framework expects.&lt;/p&gt;

&lt;p&gt;That means the developer’s workflow does not change just because somebody else is connected.&lt;/p&gt;

&lt;p&gt;Save the file.&lt;/p&gt;

&lt;p&gt;The framework notices.&lt;/p&gt;

&lt;p&gt;The update travels through Relay.&lt;/p&gt;

&lt;p&gt;The connected client changes.&lt;/p&gt;

&lt;p&gt;That’s the loop.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5is2jatsfzwttv0o8a8b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5is2jatsfzwttv0o8a8b.png" alt="CODE CHANGE → HMR → CONNECTED CLIENT" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful information has to come back too
&lt;/h2&gt;

&lt;p&gt;Getting live updates to the connected client is only one half of it.&lt;/p&gt;

&lt;p&gt;The other half is knowing what actually happened over there.&lt;/p&gt;

&lt;p&gt;Suppose QA is using the app on a physical device and hits an issue.&lt;/p&gt;

&lt;p&gt;Without that feedback loop, the conversation tends to become something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It broke.”&lt;/p&gt;

&lt;p&gt;“What broke?”&lt;/p&gt;

&lt;p&gt;“The page.”&lt;/p&gt;

&lt;p&gt;“Any errors?”&lt;/p&gt;

&lt;p&gt;“Where?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is not the most advanced debugging protocol we’ve ever invented.&lt;/p&gt;

&lt;p&gt;Relay sends useful diagnostics back from the connected client.&lt;/p&gt;

&lt;p&gt;That currently includes things like console output, JavaScript exceptions, failed HTTP requests and lower-level network failures.&lt;/p&gt;

&lt;p&gt;So while somebody is actually using the application, the developer can see what the client is reporting instead of trying to reconstruct it from screenshots and vague descriptions afterwards.&lt;/p&gt;

&lt;p&gt;The important part is that this diagnostic traffic stays separate from the application itself.&lt;/p&gt;

&lt;p&gt;Relay is not injecting a giant debugging runtime into the page or asking the app to send its own logs somewhere special.&lt;/p&gt;

&lt;p&gt;The application keeps behaving like the application.&lt;/p&gt;

&lt;p&gt;Relay handles the extra context around it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fskwwgr4478u3t92n7iqw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fskwwgr4478u3t92n7iqw.png" alt="APPLICATION OUT, DIAGNOSTICS BACK" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why that changes collaboration
&lt;/h2&gt;

&lt;p&gt;This is where Relay starts becoming more useful than a simple preview link.&lt;/p&gt;

&lt;p&gt;A designer can try an interaction while the developer is still changing it, and see updates as they happen.&lt;/p&gt;

&lt;p&gt;QA can reproduce an issue on a real device while the developer watches the relevant errors come back.&lt;/p&gt;

&lt;p&gt;A senior developer helping somebody else does not necessarily need to recreate the entire problem locally before they can start understanding it.&lt;/p&gt;

&lt;p&gt;A technician can interact with the real thing while the developer sees how the application is behaving underneath.&lt;/p&gt;

&lt;p&gt;The connected client is no longer just somewhere the app happens to be visible.&lt;/p&gt;

&lt;p&gt;It becomes part of the development session.&lt;/p&gt;

&lt;p&gt;That distinction is what I keep coming back to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boring plumbing is the product
&lt;/h2&gt;

&lt;p&gt;A lot of Relay is deliberately boring from the user’s point of view.&lt;/p&gt;

&lt;p&gt;That is a good thing.&lt;/p&gt;

&lt;p&gt;Nobody should have to care that WebSocket upgrade handling is working correctly.&lt;/p&gt;

&lt;p&gt;Nobody should need to know which headers a framework expects during HMR.&lt;/p&gt;

&lt;p&gt;Nobody should have to think about whether application cookies and Relay authentication are being kept separate.&lt;/p&gt;

&lt;p&gt;Those are Relay’s problems.&lt;/p&gt;

&lt;p&gt;The person using it should be able to start their app, connect another client, and keep working.&lt;/p&gt;

&lt;p&gt;The more invisible that plumbing becomes, the better the experience.&lt;/p&gt;

&lt;p&gt;Which is slightly unfortunate for me, because the invisible plumbing is where a fairly large amount of the engineering lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’m working on next
&lt;/h2&gt;

&lt;p&gt;The basic two-way loop is already there: application traffic out, diagnostics back.&lt;/p&gt;

&lt;p&gt;The next pieces build on top of that.&lt;/p&gt;

&lt;p&gt;Route visibility and navigation are getting more attention, so the development machine can know where a connected client is in the application and control navigation when needed.&lt;/p&gt;

&lt;p&gt;From there, the interesting problem becomes synchronisation: keeping multiple clients on the same route without creating a delightful infinite navigation loop and ruining everybody’s afternoon.&lt;/p&gt;

&lt;p&gt;There are also more device controls, screenshots and broader diagnostics to layer in.&lt;/p&gt;

&lt;p&gt;But the underlying principle stays the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A connected client should feel like part of the development environment, not just a browser that happens to know the URL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the bit I’m building Relay around.&lt;/p&gt;

&lt;p&gt;And, as ever, the apparently simple parts are doing an excellent job of finding increasingly creative ways not to be simple.&lt;/p&gt;

</description>
      <category>webtools</category>
      <category>devtools</category>
      <category>javascript</category>
      <category>debugging</category>
    </item>
    <item>
      <title>I’m Building Relay — and I’m Starting With the Problem</title>
      <dc:creator>Patrick Kenneally</dc:creator>
      <pubDate>Mon, 07 Sep 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/paddy-systems/im-building-relay-and-im-starting-with-the-problem-28bh</link>
      <guid>https://dev.to/paddy-systems/im-building-relay-and-im-starting-with-the-problem-28bh</guid>
      <description>&lt;p&gt;I’ve been working on something new called &lt;strong&gt;Relay&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This isn’t a launch post. It’s more of a starting point.&lt;/p&gt;

&lt;p&gt;I want to write about Relay while I’m still building it: what problem it solves, why certain technical decisions exist, what works, what breaks, and the bits where something that looked like a 20-minute task quietly steals half the day.&lt;/p&gt;

&lt;p&gt;Relay started from a frustration I’ve had for a long time.&lt;/p&gt;

&lt;p&gt;Local development is still weirdly isolated.&lt;/p&gt;

&lt;p&gt;You can have a website, API, service or database running perfectly on your own machine, but the moment somebody else needs to interact with it, things often become more complicated than they have any right to be.&lt;/p&gt;

&lt;p&gt;A designer wants to try the latest version. QA wants to reproduce something on a real device. A senior developer wants to quickly review somebody else’s work. A junior developer is stuck and could really do with someone seeing the actual behaviour and logs instead of receiving the timeless classic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It just doesn’t work.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A technician might need to understand how a physical device is interacting with a service. Or a colleague might simply need temporary access to an API or database you’re already running.&lt;/p&gt;

&lt;p&gt;None of those are unusual situations.&lt;/p&gt;

&lt;p&gt;And yet the normal answer is often some combination of waiting for CI, deploying unfinished work, setting up staging, opening ports, creating temporary tunnels, changing config, sending screenshots around, copying logs into chat, and asking someone to refresh one more time because this time it definitely should work.&lt;/p&gt;

&lt;p&gt;All because the thing they wanted to use was already running.&lt;/p&gt;

&lt;p&gt;That always felt slightly backwards.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6o9gqad1bc5ovcckb9oq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6o9gqad1bc5ovcckb9oq.png" alt="Local doesn’t have to mean isolated" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Local doesn’t have to mean isolated
&lt;/h2&gt;

&lt;p&gt;The principle behind Relay is simple: if something is already running locally, other people and devices should be able to interact with it without turning that into a deployment exercise.&lt;/p&gt;

&lt;p&gt;Relay does not require an SDK inside the application, framework-specific plugins, or changes to the project just to make the connection work.&lt;/p&gt;

&lt;p&gt;You start your application exactly as you normally do, start Relay alongside it, and carry on working.&lt;/p&gt;

&lt;p&gt;Relay handles the connection between that local environment and whatever needs access to it.&lt;/p&gt;

&lt;p&gt;That could be a real phone being used to test a web application. It could be a browser on somebody else’s machine so a designer or QA engineer can try the latest version. It could be another developer connecting through the CLI. The same idea also applies beyond websites to APIs and other local development services.&lt;/p&gt;

&lt;p&gt;The destination isn’t really the interesting bit.&lt;/p&gt;

&lt;p&gt;The source remains your development environment.&lt;/p&gt;

&lt;p&gt;You don’t have to turn unfinished work into a deployment just because somebody else wants to poke it.&lt;/p&gt;

&lt;p&gt;Relay extends the environment you already have rather than forcing you to rebuild your workflow around it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn74w0qlq89qzg6etxehb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn74w0qlq89qzg6etxehb.png" alt="Sharing it is only half the problem" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing it is only half the problem
&lt;/h2&gt;

&lt;p&gt;Simply getting an application from one machine to another isn’t especially interesting on its own. There are already plenty of ways to expose a port or generate a temporary URL.&lt;/p&gt;

&lt;p&gt;The more interesting part is what happens once somebody connects.&lt;/p&gt;

&lt;p&gt;Say QA reproduces an issue on a physical phone. Great. Now the developer gets to ask the traditional sequence of questions:&lt;/p&gt;

&lt;p&gt;“Any errors?”&lt;/p&gt;

&lt;p&gt;“What does the console say?”&lt;/p&gt;

&lt;p&gt;“Can you screenshot that?”&lt;/p&gt;

&lt;p&gt;“Can you try it again?”&lt;/p&gt;

&lt;p&gt;“Hang on, I’ve changed something.”&lt;/p&gt;

&lt;p&gt;“Try it again.”&lt;/p&gt;

&lt;p&gt;That whole loop is unnecessarily clumsy.&lt;/p&gt;

&lt;p&gt;Relay keeps the useful information flowing both ways.&lt;/p&gt;

&lt;p&gt;The application and its normal traffic travel towards the connected client, while diagnostics can come back: console output, JavaScript errors, failed requests, route information, screenshots and device state.&lt;/p&gt;

&lt;p&gt;A designer can try an interaction while the developer is still changing it. A senior developer can help somebody debug without recreating the entire setup first. QA can reproduce a problem on the real device while the developer sees what the application is actually reporting.&lt;/p&gt;

&lt;p&gt;And when the code changes, the connected client updates through HMR or Fast Refresh rather than waiting for another build, deployment, or ceremonial refresh button press.&lt;/p&gt;

&lt;p&gt;That is a much more interesting problem than simply sharing a URL.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw38ys3mrwp4wt8p6yi3y.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw38ys3mrwp4wt8p6yi3y.png" alt="Relay stays outside the application" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Relay stays outside the application
&lt;/h2&gt;

&lt;p&gt;One of Relay’s core architectural decisions is that it does not become part of the application itself.&lt;/p&gt;

&lt;p&gt;It would obviously make certain problems easier if every project installed a Relay package, added a plugin, and let Relay sprinkle a bit of magic through the app.&lt;/p&gt;

&lt;p&gt;It would also mean Relay becomes yet another thing living in the codebase, which rather defeats the point.&lt;/p&gt;

&lt;p&gt;Your application does not need to know Relay exists.&lt;/p&gt;

&lt;p&gt;That means Relay handles the awkward stuff externally.&lt;/p&gt;

&lt;p&gt;HTTP needs to behave correctly. WebSockets need to survive the journey. Cookies still need to belong to the application. Framework development servers need to keep doing whatever slightly cursed thing they normally do to make live updates work.&lt;/p&gt;

&lt;p&gt;Relay’s own authentication, device controls and diagnostics are kept separate from the application traffic.&lt;/p&gt;

&lt;p&gt;That separation makes the engineering harder, but it keeps the application clean and keeps Relay from becoming another framework-specific dependency.&lt;/p&gt;

&lt;p&gt;The best developer tools tend to fit around an existing workflow.&lt;/p&gt;

&lt;p&gt;The less good ones tend to introduce themselves with a 14-step migration guide.&lt;/p&gt;

&lt;p&gt;Relay is aiming firmly for the first category.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7t73xjyo8qk2nrif4l0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7t73xjyo8qk2nrif4l0.png" alt="Where it is now" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is now
&lt;/h2&gt;

&lt;p&gt;This isn’t all theoretical. Relay Local is already far enough along that the core loop works.&lt;/p&gt;

&lt;p&gt;Relay can run against a local development server, create a gateway, pair with a physical Android device, proxy HTTP and WebSocket traffic, preserve live updates and send useful diagnostics back from the device.&lt;/p&gt;

&lt;p&gt;The Android client can report console messages, JavaScript exceptions and failed network requests back to the CLI while the application is being used.&lt;/p&gt;

&lt;p&gt;A lot of the work recently has been around compatibility.&lt;/p&gt;

&lt;p&gt;Development servers all solve roughly the same problem, which of course means they’ve all found slightly different ways of making your life interesting.&lt;/p&gt;

&lt;p&gt;Vite-based projects have been a good starting point, and I’ve also spent time making Next.js and Turbopack behave correctly through Relay. I’m working through a much broader compatibility matrix rather than designing Relay around one ecosystem and hoping everybody else behaves themselves.&lt;/p&gt;

&lt;p&gt;There’s still plenty being built: route synchronisation, more device controls, screenshots, broader diagnostics, automated compatibility testing and the remote side of Relay are all at different stages.&lt;/p&gt;

&lt;p&gt;That’s one of the reasons I’m writing about it now instead of waiting until everything looks suspiciously polished and the development history has been conveniently forgotten.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea got bigger fairly quickly
&lt;/h2&gt;

&lt;p&gt;The first thing I built was the local real-device workflow.&lt;/p&gt;

&lt;p&gt;Then I started thinking about the underlying problem and realised it applies to quite a lot more than phones.&lt;/p&gt;

&lt;p&gt;Relay currently starts with the local side: connecting real devices, browsers and other clients to things already running on your machine.&lt;/p&gt;

&lt;p&gt;The next obvious step is a cloud-connected version that removes the same-network limitation.&lt;/p&gt;

&lt;p&gt;That means the person testing your work doesn’t need to be sat next to you, or even on the same Wi-Fi. A designer, tester, colleague or customer could connect securely over the internet while the thing they’re using is still running on your development machine.&lt;/p&gt;

&lt;p&gt;The same idea also applies beyond web pages. APIs and other local development services have exactly the same “it works here, but somebody else needs access to it” problem.&lt;/p&gt;

&lt;p&gt;Some of that is working, some of it is being built, and some of it is still in the category of “this should be straightforward”, which is a phrase software development has repeatedly taught me not to trust.&lt;/p&gt;

&lt;p&gt;But the direction is pretty clear: &lt;strong&gt;make the boundary around local development much less restrictive.&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fca061bgml20qjflpwov8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fca061bgml20qjflpwov8.png" alt="Why I’m writing about it now" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I’m writing about it now
&lt;/h2&gt;

&lt;p&gt;I could wait until Relay is finished, build a polished landing page, write the documentation, remove all evidence that anything was ever difficult, and then announce it as though the whole thing emerged fully formed one Tuesday afternoon.&lt;/p&gt;

&lt;p&gt;That would make for a cleaner story.&lt;/p&gt;

&lt;p&gt;It would also skip most of the interesting part.&lt;/p&gt;

&lt;p&gt;There are already technical decisions I’ve changed my mind about. There have been tasks I expected to take an hour that ate most of a day, and things I assumed would be horrible that worked first time and immediately made me suspicious.&lt;/p&gt;

&lt;p&gt;There will be plenty more of both.&lt;/p&gt;

&lt;p&gt;So I’m going to write about those parts as they happen: framework compatibility, HMR, WebSockets, real-device diagnostics, Android, tunnelling, security, remote connectivity, and whatever else decides to become the problem of the evening.&lt;/p&gt;

&lt;p&gt;The first Android testing group will come later this month, but I’m not treating this series as a countdown to that.&lt;/p&gt;

&lt;p&gt;It’s really just a record of building the thing while the interesting decisions are still fresh.&lt;/p&gt;

&lt;p&gt;Relay started with one fairly simple observation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Something being local shouldn’t mean everybody else has to wait until you deploy it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now I get to find out how far that idea goes.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>testing</category>
      <category>software</category>
    </item>
  </channel>
</rss>
