<?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: Engin Blitz</title>
    <description>The latest articles on DEV Community by Engin Blitz (@engin_blitz).</description>
    <link>https://dev.to/engin_blitz</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%2Fuser%2Fprofile_image%2F3869847%2Fd176c60c-4f00-48be-9bc4-a4fe49d68995.jpg</url>
      <title>DEV Community: Engin Blitz</title>
      <link>https://dev.to/engin_blitz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/engin_blitz"/>
    <language>en</language>
    <item>
      <title>I built a status page with zero third-party requests. Here's what it took.</title>
      <dc:creator>Engin Blitz</dc:creator>
      <pubDate>Mon, 20 Apr 2026 11:58:54 +0000</pubDate>
      <link>https://dev.to/engin_blitz/i-built-a-status-page-with-zero-third-party-requests-heres-what-it-took-2636</link>
      <guid>https://dev.to/engin_blitz/i-built-a-status-page-with-zero-third-party-requests-heres-what-it-took-2636</guid>
      <description>&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%2Fq7hipqdlh4zoja1yi4v3.webp" 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%2Fq7hipqdlh4zoja1yi4v3.webp" alt=" " width="699" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most status pages I've audited load between 8 and 15 third-party resources: Google Fonts, analytics beacons, session recorders, icon CDNs, sometimes embedded chat widgets. For a page whose entire job is to communicate "something is broken, stay calm," that's a lot of attack surface — and a lot of DPA paperwork if you sell into the EU.&lt;/p&gt;

&lt;p&gt;I'm building &lt;a href="https://foundersdeck.dev" rel="noopener noreferrer"&gt;FoundersDeck&lt;/a&gt;, a GDPR-native monitoring toolkit. When I designed the status page, I set one hard constraint:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The page makes requests to exactly one domain. Its own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sounds trivial. It isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;p&gt;Here's what had to go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ Google Fonts     → self-hosted WOFF2, subset to Latin
❌ Analytics        → removed from status page entirely
❌ Icon CDN         → inlined SVG sprite
❌ External CSS     → bundled at build
❌ Tracking cookies → none set, no consent banner needed
❌ Session replay   → never added
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;SvelteKit with SSR, PostgreSQL, EU hosting, no US subprocessors in the request path. Uptime and heartbeat checks run from EU regions. Fonts are self-hosted and subsetted. Icons are a single inlined SVG sprite.&lt;/p&gt;

&lt;p&gt;The page renders server-side. First paint is the full page. No hydration needed to see the current status.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metrics that actually matter
&lt;/h2&gt;

&lt;p&gt;The old version used colored bars ("all green, all good"). Looked clean, communicated nothing. The new version shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MTTR&lt;/strong&gt; — mean time to recovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident count&lt;/strong&gt; for the period&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max downtime window&lt;/strong&gt; (worst single incident)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average response time&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptime percentage&lt;/strong&gt;
When something breaks, users want to know &lt;em&gt;how bad&lt;/em&gt; and &lt;em&gt;how fast you fix things&lt;/em&gt;. Color bars don't answer either question.&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%2Fta83fledj559pepkeiko.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%2Fta83fledj559pepkeiko.png" alt=" " width="800" height="938"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother
&lt;/h2&gt;

&lt;p&gt;A status page is the most-linked external page most SaaS products have. It shows up in outage emails, docs, partner dashboards, support tickets. If it leaks data to third parties, that leak is at maximum surface area &lt;em&gt;exactly&lt;/em&gt; when customers are already irritated.&lt;/p&gt;

&lt;p&gt;For EU buyers, it's also the first page their legal team opens during a DPA review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;FoundersDeck is live at &lt;a href="https://foundersdeck.dev" rel="noopener noreferrer"&gt;foundersdeck.dev&lt;/a&gt;. Open DevTools on any status page — you'll see one domain in the Network tab.&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the SvelteKit SSR setup, the font subsetting, or the EU hosting stack.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>svelte</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an EU-hosted monitoring toolkit with SvelteKit – here's how</title>
      <dc:creator>Engin Blitz</dc:creator>
      <pubDate>Thu, 09 Apr 2026 12:39:25 +0000</pubDate>
      <link>https://dev.to/engin_blitz/i-built-an-eu-hosted-monitoring-toolkit-with-sveltekit-heres-how-206j</link>
      <guid>https://dev.to/engin_blitz/i-built-an-eu-hosted-monitoring-toolkit-with-sveltekit-heres-how-206j</guid>
      <description>&lt;p&gt;Every SaaS founder needs monitoring. And every time I evaluated a tool, the same pattern emerged: US-hosted, US-hosted, US-hosted.&lt;/p&gt;

&lt;p&gt;As an EU-based developer, that's a problem. Not just philosophically – practically. Customers ask where their data lives. GDPR audits require documented data flows. And the US CLOUD Act means your monitoring provider can be compelled to hand over data without you even knowing.&lt;/p&gt;

&lt;p&gt;So I built FoundersDeck – an uptime monitoring and status page toolkit hosted entirely in Germany. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; Backend:&lt;/strong&gt; SvelteKit with TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build:&lt;/strong&gt; Vite 8 with Rolldown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js with adapter-node&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Netcup VPS in Nuremberg, Germany&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; Scaleway (French provider)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Polar.sh (European MoR)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS:&lt;/strong&gt; Cloudflare (DNS only, no proxy – no traffic through US servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total infrastructure cost: ~25€/month. One VPS runs everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: One Process, One Repo
&lt;/h2&gt;

&lt;p&gt;The entire application runs as a single Node.js process. No microservices, no message queues, no Redis. The monitoring worker lives inside the SvelteKit server process.&lt;/p&gt;

&lt;p&gt;On startup, the worker loads all active monitors from PostgreSQL and begins checking them at their configured intervals. Each check records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP status code&lt;/li&gt;
&lt;li&gt;Response time in milliseconds&lt;/li&gt;
&lt;li&gt;Full error details if the check fails (timeout, SSL error, DNS failure, connection refused)&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a check fails, the system doesn't immediately fire an alert. That would cause too many false positives. Instead, it waits for 2-3 consecutive failures before opening an incident. This prevents alerts from network blips or brief server restarts.&lt;/p&gt;

&lt;p&gt;When an incident opens, the configured alert channels fire: an HTTP POST to Slack and Discord webhooks, and an email via Scaleway's SMTP. Zero cost for webhooks – the customer brings their own Slack/Discord workspace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status Pages: Separate Layout, Same App
&lt;/h2&gt;

&lt;p&gt;The public status pages are served from the same SvelteKit application but with a completely separate layout. No dashboard CSS, no navigation, no FoundersDeck branding (on paid plans).&lt;/p&gt;

&lt;p&gt;Each status page has its own route at &lt;code&gt;/status/[slug]&lt;/code&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The customer's logo and brand color&lt;/li&gt;
&lt;li&gt;Current status of each assigned monitor&lt;/li&gt;
&lt;li&gt;90-day uptime bars per monitor&lt;/li&gt;
&lt;li&gt;Incident history with error details&lt;/li&gt;
&lt;li&gt;Zero cookies, zero tracking, zero third-party requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custom domains work via CNAME records pointing to the app. The SvelteKit server checks the incoming hostname and serves the correct status page.&lt;/p&gt;

&lt;p&gt;The status pages serve zero cookies and make zero third-party requests. That means no consent banner needed – which is a real differentiator for EU-conscious customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Retention as a Business Model
&lt;/h2&gt;

&lt;p&gt;Every check creates a row in the database. At 60-second intervals, one monitor generates 1,440 rows per day. Scale that to thousands of monitors and the database grows fast.&lt;/p&gt;

&lt;p&gt;The solution: tiered data retention. Free tier keeps 7 days of check history. Starter keeps 30 days. Pro keeps 90 days. Business keeps 365 days. A cleanup job runs daily and removes expired data.&lt;/p&gt;

&lt;p&gt;This is also the natural upsell trigger. Once a customer wants to see trends over months instead of days, they upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with one VPS.&lt;/strong&gt; I spent zero time on infrastructure decisions. No Kubernetes, no Docker Compose, no load balancer. Just &lt;code&gt;node build/index.js&lt;/code&gt; behind a reverse proxy. A single 4-core VPS can handle tens of thousands of monitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhooks are free infrastructure.&lt;/strong&gt; Slack and Discord webhooks cost nothing. The customer configures their own webhook URL, and you send a POST request. No Twilio bills, no SMS credits, no API keys on your side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The EU angle is real.&lt;/strong&gt; I built this primarily for myself, but the positioning as an EU-native tool resonated immediately. There's genuine demand from founders who want to know where their data lives – especially in 2026 with the digital sovereignty discussion accelerating across Europe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't over-engineer the MVP.&lt;/strong&gt; No AI, no machine learning, no external API dependencies. The entire app is SvelteKit + PostgreSQL + Node.js. If my VPS goes down, there's exactly one thing to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;FoundersDeck is live with a free tier (5 monitors, 1 status page, email alerts, no credit card).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://foundersdeck.dev" rel="noopener noreferrer"&gt;foundersdeck.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live status page (dogfooding): &lt;a href="https://status.foundersdeck.dev" rel="noopener noreferrer"&gt;status.foundersdeck.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Trust &amp;amp; compliance details: &lt;a href="https://foundersdeck.dev/trust" rel="noopener noreferrer"&gt;foundersdeck.dev/trust&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer any questions about the architecture or the EU hosting setup.&lt;/p&gt;

</description>
      <category>sveltekit</category>
      <category>typescript</category>
      <category>monitoring</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
