<?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: Datum Games</title>
    <description>The latest articles on DEV Community by Datum Games (@datum_games).</description>
    <link>https://dev.to/datum_games</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%2F1966436%2F3ab602ff-784b-43b0-ade3-20b8243f661c.jpg</url>
      <title>DEV Community: Datum Games</title>
      <link>https://dev.to/datum_games</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datum_games"/>
    <language>en</language>
    <item>
      <title>Your Inertia SSR server is down and your site still returns 200</title>
      <dc:creator>Datum Games</dc:creator>
      <pubDate>Sat, 19 Sep 2026 22:29:38 +0000</pubDate>
      <link>https://dev.to/datum_games/your-inertia-ssr-server-is-down-and-your-site-still-returns-200-3hc7</link>
      <guid>https://dev.to/datum_games/your-inertia-ssr-server-is-down-and-your-site-still-returns-200-3hc7</guid>
      <description>&lt;p&gt;The site looked fine. Every page loaded, every blog post rendered, the styling was&lt;br&gt;
right, nothing in the logs. What was wrong was that Search Console had crawled two&lt;br&gt;
pages out of the entire sitemap, and the rest sat in &lt;em&gt;Discovered – currently not&lt;br&gt;
indexed&lt;/em&gt;. Dozens of posts, almost nothing indexed, and no broken page anywhere to&lt;br&gt;
point at.&lt;/p&gt;

&lt;p&gt;The cause turned out to be a process that had stopped running. Not crashed loudly —&lt;br&gt;
just stopped. And because of how Inertia handles that case, the only clients that&lt;br&gt;
noticed were the ones we could not see.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on &lt;a href="https://bunfolio.com" rel="noopener noreferrer"&gt;Bunfolio&lt;/a&gt;, a free portfolio-site&lt;br&gt;
builder for freelancers. This happened to us, and the diagnosis is the useful part.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The failure mode
&lt;/h2&gt;

&lt;p&gt;The stack is Laravel 12, Inertia.js and React 19, with server-side rendering enabled.&lt;br&gt;
In that setup, &lt;code&gt;php artisan inertia:start-ssr&lt;/code&gt; runs a small Node server (port 13714 by&lt;br&gt;
default) that loads your built server bundle, &lt;code&gt;bootstrap/ssr/ssr.js&lt;/code&gt;. On each request&lt;br&gt;
Laravel POSTs the page object to it, gets back HTML, and the &lt;code&gt;@inertia&lt;/code&gt; Blade&lt;br&gt;
directive prints that HTML inside &lt;code&gt;&amp;lt;div id="app"&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When that Node process is not answering, Laravel does not fail the request. It falls&lt;br&gt;
back to client-side rendering: it emits an empty &lt;code&gt;&amp;lt;div id="app" data-page="{…}"&amp;gt;&lt;/code&gt;&lt;br&gt;
with the page props serialised into the attribute, and ships the response with a 200.&lt;br&gt;
Your browser downloads the JavaScript, reads &lt;code&gt;data-page&lt;/code&gt;, renders the app, and&lt;br&gt;
everything looks completely normal.&lt;/p&gt;

&lt;p&gt;So the failure is invisible to exactly the people checking for it, and visible only&lt;br&gt;
to clients that do not execute JavaScript. That is a decent chunk of the things you&lt;br&gt;
care about: crawlers that do not render, link unfurlers, anything reading your page&lt;br&gt;
with an HTTP library. Google does render JavaScript, but rendering is queued and&lt;br&gt;
budgeted separately from crawling, and on a new site with essentially no inbound&lt;br&gt;
links you should assume that budget is close to zero. An empty &lt;code&gt;#app&lt;/code&gt; is a page with&lt;br&gt;
no prose in it, and a page with no prose in it is not a page worth indexing.&lt;/p&gt;

&lt;p&gt;The part that makes this a genuine trap rather than an ordinary outage: &lt;strong&gt;you cannot&lt;br&gt;
detect it by looking at the site.&lt;/strong&gt; Uptime checks pass. Status codes are 200.&lt;br&gt;
Screenshots are perfect. The failure only exists in the response body, and only in&lt;br&gt;
the part of it that a browser immediately overwrites.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the process stops
&lt;/h2&gt;

&lt;p&gt;Three ways we found to end up here, all of them quiet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It was never supervised.&lt;/strong&gt; Someone started &lt;code&gt;inertia:start-ssr&lt;/code&gt; by hand over SSH to&lt;br&gt;
test it. It works, the page renders, everyone moves on. The shell closes, the process&lt;br&gt;
dies with it, and the app keeps serving 200s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The server bundle throws at render time.&lt;/strong&gt; Our own version of this: twenty-two&lt;br&gt;
components called a bare global &lt;code&gt;route()&lt;/code&gt;, which the &lt;code&gt;@routes&lt;/code&gt; Blade directive&lt;br&gt;
defines in the browser. Node has no such global, so every server render died with&lt;br&gt;
&lt;code&gt;route is not defined&lt;/code&gt; — and Inertia treated that the same way it treats a dead&lt;br&gt;
process, by falling back to the client. The fix was a shim at the top of &lt;code&gt;ssr.jsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;routeFn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ziggy-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Ziggy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ziggy&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;ziggyConfig&lt;/span&gt; &lt;span class="o"&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;Ziggy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APP_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;Ziggy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nb"&gt;global&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ziggyConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;routeFn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Taking the host from &lt;code&gt;APP_URL&lt;/code&gt; at run time rather than from the value baked into&lt;br&gt;
&lt;code&gt;ziggy.js&lt;/code&gt; at build time matters too, otherwise the markup React hydrates against&lt;br&gt;
does not match what the client would have produced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is running the wrong code.&lt;/strong&gt; More on that below — it is the second trap and it&lt;br&gt;
is worse than the first.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detecting it properly
&lt;/h2&gt;

&lt;p&gt;There is a built-in health check, and you should run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan inertia:check-ssr    &lt;span class="c"&gt;# must print: Inertia SSR server is running.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But be clear about what it proves. It opens a connection to the configured SSR URL&lt;br&gt;
and confirms something answers. It does &lt;strong&gt;not&lt;/strong&gt; prove your public site is using that&lt;br&gt;
process, that the bundle it loaded renders your pages without throwing, or that the&lt;br&gt;
HTML reaching a crawler contains anything. A green &lt;code&gt;check-ssr&lt;/code&gt; with an empty &lt;code&gt;#app&lt;/code&gt;&lt;br&gt;
in production is entirely possible, and is precisely the state we were in.&lt;/p&gt;

&lt;p&gt;The real test is to be the crawler. Fetch the page over HTTP, find &lt;code&gt;&amp;lt;div id="app"&amp;gt;&lt;/code&gt;,&lt;br&gt;
strip the scripts and tags out of everything after it, and count what is left:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;u &lt;span class="k"&gt;in&lt;/span&gt; / /blog /blog/teaching-portfolio /tools /case-studies&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%-32s '&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://example.com&lt;/span&gt;&lt;span class="nv"&gt;$u&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import re,sys
h=sys.stdin.read()
m=re.search(r'id=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;app&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;[^&amp;gt;]*&amp;gt;',h)
inner=h[m.end():] if m else ''
t=re.sub(r'&amp;lt;[^&amp;gt;]+&amp;gt;',' ',re.sub(r'&amp;lt;script.*?&amp;lt;/script&amp;gt;','',inner,flags=re.S))
print(len(re.sub(r'&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="s2"&gt;+',' ',t).strip()), 'chars rendered')"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every line should report thousands of characters. A &lt;code&gt;0&lt;/code&gt; means SSR is not reaching&lt;br&gt;
that page, and the deploy has failed for search purposes even though the site works&lt;br&gt;
perfectly in a browser.&lt;/p&gt;

&lt;p&gt;Stripping &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; blocks before counting is the load-bearing detail. Without it&lt;br&gt;
you are counting the serialised &lt;code&gt;data-page&lt;/code&gt; JSON, which is large and present in&lt;br&gt;
&lt;em&gt;both&lt;/em&gt; the working and the broken case — so the check would pass either way. That is&lt;br&gt;
the same reason "view source and eyeball it" does not work: the broken response is&lt;br&gt;
not empty, it is full of JSON that looks reassuringly like your content.&lt;/p&gt;

&lt;p&gt;For the authoritative version, use &lt;em&gt;Test live URL&lt;/em&gt; in Search Console and open &lt;em&gt;View&lt;br&gt;
tested page → HTML&lt;/em&gt;. That is Google telling you what Google got.&lt;/p&gt;
&lt;h2&gt;
  
  
  The second trap: a stale bundle
&lt;/h2&gt;

&lt;p&gt;This one cost more time than the outage, because nothing at all appears wrong.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;inertia:start-ssr&lt;/code&gt; reads &lt;code&gt;bootstrap/ssr/ssr.js&lt;/code&gt; &lt;strong&gt;once, at boot&lt;/strong&gt;. If you rebuild&lt;br&gt;
assets and do not restart the process, it carries on rendering the previous bundle&lt;br&gt;
indefinitely. Your browser fetches the new client build and hydrates over the old&lt;br&gt;
server HTML, so the page you are looking at is correct and current. Meanwhile &lt;code&gt;curl&lt;/code&gt;&lt;br&gt;
— and every crawler — gets markup from whatever your code looked like at the last&lt;br&gt;
restart.&lt;/p&gt;

&lt;p&gt;The page is not broken. It is just old. You can stare at a diff for an hour&lt;br&gt;
wondering why a change you can see in your browser is not in the HTML, and there is&lt;br&gt;
no error anywhere to find. Restart the SSR process after every build, locally as well&lt;br&gt;
as in production.&lt;/p&gt;
&lt;h2&gt;
  
  
  A deploy that cannot skip the restart
&lt;/h2&gt;

&lt;p&gt;The shape that works is boring, and the ordering matters — build, then restart, then&lt;br&gt;
verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull &lt;span class="nt"&gt;--ff-only&lt;/span&gt; origin main
composer &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-dev&lt;/span&gt; &lt;span class="nt"&gt;--optimize-autoloader&lt;/span&gt;
npm ci &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
npm run build:ssr                      &lt;span class="c"&gt;# builds client AND server bundles&lt;/span&gt;
php artisan migrate &lt;span class="nt"&gt;--force&lt;/span&gt;
php artisan config:cache &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php artisan route:cache &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; php artisan view:cache
&lt;span class="nb"&gt;sudo &lt;/span&gt;supervisorctl restart inertia-ssr &lt;span class="c"&gt;# the step that gets missed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our &lt;code&gt;build:ssr&lt;/code&gt; also regenerates the Ziggy route file first, so the server bundle&lt;br&gt;
cannot drift from &lt;code&gt;routes/web.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"build:ssr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"php artisan ziggy:generate resources/js/ziggy.js &amp;amp;&amp;amp; vite build &amp;amp;&amp;amp; vite build --ssr"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A route added in PHP but missing from the bundle's route table is another way to&lt;br&gt;
throw inside the server render and silently fall back, so tying the two together in&lt;br&gt;
one command removes a whole category of this bug.&lt;/p&gt;

&lt;p&gt;And the process must be supervised. Started by hand it dies with your shell;&lt;br&gt;
supervised it comes back on its own after a crash, a deploy or a reboot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[program:inertia-ssr]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/php /var/www/example/artisan inertia:start-ssr&lt;/span&gt;
&lt;span class="py"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/www/example&lt;/span&gt;
&lt;span class="py"&gt;autostart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;autorestart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;user&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;www-data&lt;/span&gt;
&lt;span class="py"&gt;redirect_stderr&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;stdout_logfile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/log/inertia-ssr.log&lt;/span&gt;
&lt;span class="py"&gt;stopwaitsecs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;autorestart=true&lt;/code&gt; is doing real work here. A server render that throws can take the&lt;br&gt;
Node process down; without this you get one bad request followed by permanent silent&lt;br&gt;
client-side rendering.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two smaller things worth stealing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pin SSR off in your test suite.&lt;/strong&gt; We set &lt;code&gt;INERTIA_SSR_ENABLED=false&lt;/code&gt; in&lt;br&gt;
&lt;code&gt;phpunit.xml&lt;/code&gt;, so the suite never depends on a Node process being up. A test run that&lt;br&gt;
fails because you forgot to start the SSR server teaches you to ignore the failure,&lt;br&gt;
which is the opposite of useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Own your meta server-side anyway.&lt;/strong&gt; We render title, description, canonical, OG and&lt;br&gt;
JSON-LD from controller view data in the Blade layout rather than from React's&lt;br&gt;
&lt;code&gt;&amp;lt;Head&amp;gt;&lt;/code&gt;. That started as a workaround from before SSR existed, and it is worth&lt;br&gt;
keeping: it means a broken SSR server costs you the body copy but not the metadata.&lt;br&gt;
It also means you have to filter the title React collects out of the SSR response, or&lt;br&gt;
you ship two &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; elements per page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rendered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;title&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;h2&gt;
  
  
  The check to actually keep
&lt;/h2&gt;

&lt;p&gt;If you take one thing: &lt;code&gt;inertia:check-ssr&lt;/code&gt; answers "is the process alive". The curl&lt;br&gt;
loop answers "does prose reach a client that does not run JavaScript". Only the&lt;br&gt;
second question is the one your search traffic depends on, and it is the only one&lt;br&gt;
that catches a stale bundle as well as a dead process.&lt;/p&gt;

&lt;p&gt;Put it at the end of your deploy script, where skipping it takes effort.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>seo</category>
      <category>webdev</category>
      <category>react</category>
    </item>
  </channel>
</rss>
