<?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: Just_a_kumar</title>
    <description>The latest articles on DEV Community by Just_a_kumar (@just_kidding_973ff1ca549b).</description>
    <link>https://dev.to/just_kidding_973ff1ca549b</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%2F4036858%2F6de04f71-585e-461b-ba18-6d53c53683f1.png</url>
      <title>DEV Community: Just_a_kumar</title>
      <link>https://dev.to/just_kidding_973ff1ca549b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/just_kidding_973ff1ca549b"/>
    <language>en</language>
    <item>
      <title>Building an AI Subtitle App with Next.js and SigNoz (With Plenty of Docker Debugging Along the Way)</title>
      <dc:creator>Just_a_kumar</dc:creator>
      <pubDate>Sat, 25 Jul 2026 23:42:33 +0000</pubDate>
      <link>https://dev.to/just_kidding_973ff1ca549b/building-an-ai-subtitle-app-with-nextjs-and-signoz-with-plenty-of-docker-debugging-along-the-way-5h2j</link>
      <guid>https://dev.to/just_kidding_973ff1ca549b/building-an-ai-subtitle-app-with-nextjs-and-signoz-with-plenty-of-docker-debugging-along-the-way-5h2j</guid>
      <description>&lt;p&gt;My AI subtitle generator works. Right now, if I upload a video, Next.js processes it, OpenTelemetry captures every span along the way, and SigNoz shows me the whole thing as a live distributed trace. That part's real and it's done.&lt;/p&gt;

&lt;p&gt;What I didn't expect is that getting SigNoz itself to &lt;em&gt;behave&lt;/em&gt; would turn into its own separate project — one fought entirely in Docker volumes, a login screen that made no sense, and a PowerShell terminal that hated me personally. This is the honest version of that story: not a clean tutorial, but what actually happened.&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%2Fhq3iptm2cazcxj9nj5s7.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%2Fhq3iptm2cazcxj9nj5s7.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Success, Up Front
&lt;/h2&gt;

&lt;p&gt;Because I don't want this to read like a two-thousand-word bug report: it worked. The app takes a video upload, kicks off backend processing to generate cinematic AI-style subtitles, and every one of those steps — upload, processing request, whatever happens in between — shows up as a real trace in SigNoz's Traces Explorer. That was the actual goal of the hackathon submission, and I hit it.&lt;/p&gt;

&lt;p&gt;But I want to be upfront that the road there was not smooth, and I think the messy part is more useful to write about than the finished screenshot. If you're about to self-host SigNoz for the first time, the app code is not going to be your hard part. Your local environment is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built and Why Tracing Actually Mattered Here
&lt;/h2&gt;

&lt;p&gt;The project itself: a Next.js web app that takes a video upload and automatically generates cinematic, AI-style subtitles for it. Sounds like one feature, but it's really a pipeline — a file comes in, gets handed off for backend processing, something transcribes/times the audio, something else styles the subtitle output, and eventually a result comes back to the user. Every one of those steps can fail or slow down on its own, and without visibility into &lt;em&gt;which&lt;/em&gt; step, "my video is stuck processing" just means staring at a spinner and guessing.&lt;/p&gt;

&lt;p&gt;So the plan was straightforward: instrument the app with OpenTelemetry so every upload and processing request generates a real trace, run those traces into a local SigNoz stack, and actually &lt;em&gt;see&lt;/em&gt; the pipeline instead of adding console.log statements and hoping.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App layer:&lt;/strong&gt; Next.js, instrumented with OpenTelemetry so uploads and backend processing requests each produce spans and a trace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability backend:&lt;/strong&gt; SigNoz, self-hosted locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; ClickHouse for the telemetry data itself (traces/metrics/logs), PostgreSQL for user and metadata storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration:&lt;/strong&gt; Docker containers, spun up and managed through Foundry using a config file we named &lt;code&gt;casting.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We used Foundry as a wrapper around Docker Compose to easily orchestrate and manage our multi-container stack from a single casting.yaml file.&lt;/p&gt;

&lt;p&gt;For the instrumentation itself, I used the &lt;code&gt;instrumentation.ts&lt;/code&gt; convention Next.js picks up automatically, with &lt;code&gt;@vercel/otel&lt;/code&gt; handling the SDK wiring instead of me hand-rolling the whole OpenTelemetry setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// instrumentation.ts (project root)&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;registerOTel&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;@vercel/otel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;registerOTel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;serviceName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subtitle-studio&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env.local
&lt;/span&gt;&lt;span class="n"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;=&lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;localhost&lt;/span&gt;:&lt;span class="m"&gt;4318&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That part, honestly, was the easy part. It's well-documented, it's a known pattern, and it worked close to the first try. The infrastructure underneath it is where things got real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gritty Middle: When Your Own Local Environment Becomes the Boss Fight
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody really warns you about with local observability stacks: the app code is the &lt;em&gt;small&lt;/em&gt; problem. The stack running underneath it — the containers, the volumes, the state that quietly persists between runs — is where you actually lose your evening.&lt;/p&gt;

&lt;p&gt;I brought the SigNoz stack up through Foundry (&lt;code&gt;foundryctl.exe cast -f casting.yaml&lt;/code&gt;), fully expecting the standard first-run experience: a setup wizard, create an admin account, done. Instead I got bounced straight to &lt;code&gt;/login&lt;/code&gt; with a message telling me self-registration was disabled.&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%2Fxwe99gye2cg0iuhkerhy.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%2Fxwe99gye2cg0iuhkerhy.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to sit on that for a second because it's such a specifically confusing error to get on what I thought was a brand-new install. Self-registration disabled implies &lt;em&gt;someone already registered&lt;/em&gt;. I hadn't. Nobody had. Except — and this took me embarrassingly long to piece together — my Docker volumes disagreed. They were holding onto state from an earlier attempt at standing this stack up, an attempt where an org and an admin account had technically already been created. So SigNoz wasn't lying to me. It was correctly telling me it was already initialized. I just had zero credentials for the version of the world it remembered.&lt;/p&gt;

&lt;p&gt;This is the part of local infra work that I think is genuinely harder than writing application code: the bug isn't in front of you, it's &lt;em&gt;behind&lt;/em&gt; you, sitting in a volume you forgot existed from a run you forgot you did.&lt;/p&gt;

&lt;p&gt;My first instinct was to patch around it instead of admitting the environment was compromised — because tearing everything down and starting over felt like giving up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt one:&lt;/strong&gt; dig through environment variables related to auth/registration, on the theory there was a flag somewhere I could just flip back to "allow registration." No dice — the state causing the problem wasn't in an env var, it was already sitting in the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt two:&lt;/strong&gt; go straight into Postgres and manually &lt;code&gt;INSERT&lt;/code&gt; an admin row myself. This is where I properly hit a wall. SigNoz's schema has real relational constraints — an org, an admin, and a user aren't three independent rows you can fake into existence, they're expected to be created together through the app's own flow. My hand-written insert kept getting rejected by schema constraints it had every right to reject me on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt three, which somehow made it worse:&lt;/strong&gt; I was doing all of this from PowerShell, and trying to escape a multi-field SQL statement's quotes correctly through PowerShell's quoting rules turned into a fully separate debugging side-quest that had nothing to do with SigNoz at all. I burned real time just trying to get a single &lt;code&gt;INSERT&lt;/code&gt; statement to survive the terminal without PowerShell mangling the quotes.&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%2Fo7c9svim4guxpucdrkyt.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%2Fo7c9svim4guxpucdrkyt.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point I'd spent more time fighting my own terminal than I had setting up the actual tracing. That's the part I want other people attempting this to know going in: local debugging on a self-hosted observability stack can absolutely eat more time than the feature you're trying to observe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turn: Stop Patching, Wipe the Slate
&lt;/h2&gt;

&lt;p&gt;Eventually I stopped trying to be clever about it. If the environment itself was the problem, patching the environment wasn't going to fix it — I needed to actually reset it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;down&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prune&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;foundryctl.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cast&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;casting.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stopping the containers and pruning the volumes genuinely wiped the leftover ClickHouse and Postgres data instead of leaving ghosts behind for the next run to trip over. Re-casting the stack from &lt;code&gt;casting.yaml&lt;/code&gt; afterward gave me an actually-fresh instance — and this time SigNoz served up the real first-run setup wizard instead of bouncing me to a login screen for an account I didn't have.&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%2F7w8ei6fyco5rf3ax1abq.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%2F7w8ei6fyco5rf3ax1abq.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's a specific kind of relief in watching a setup wizard appear where a broken login screen used to be. It's a small thing, but after that stretch of fighting SQL constraints and PowerShell quoting, it felt like an actual win.&lt;/p&gt;

&lt;p&gt;I created my admin account, and — because this weekend clearly wasn't done testing me — SigNoz threw a ClickHouse metadata error on first boot while its container init scripts were still finishing structuring the schema. This time, though, I didn't panic and start patching. I recognized it for what it was: the database still setting itself up. I let it finish. It resolved on its own once ClickHouse had fully initialized its tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Relatable Win
&lt;/h2&gt;

&lt;p&gt;Then the actual payoff: I uploaded a test video through the Next.js app and watched a real trace land in SigNoz's Traces Explorer at &lt;code&gt;http://localhost:8080/traces-explorer&lt;/code&gt; — the upload request and the backend processing request, connected, with real timing data sitting right there on screen.&lt;/p&gt;

&lt;p&gt;Not going to pretend that wasn't a genuinely good moment. After a stretch of ghost data, schema constraint errors, and quoting fights that had nothing to do with the actual project, seeing a real trace show up — one that mapped to a video I'd just uploaded, seconds earlier — was the first time the whole weekend felt like it was working &lt;em&gt;for&lt;/em&gt; me instead of against me.&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%2Fuzaxh7phtoux8xj7wmf5.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%2Fuzaxh7phtoux8xj7wmf5.png" alt=" " width="800" height="450"&gt;&lt;/a&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%2Fsao4xg00toic9wdqj9pk.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%2Fsao4xg00toic9wdqj9pk.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A confusing auth error is often stale state, not broken config.&lt;/strong&gt; The self-registration message sent me looking at auth settings first, when the real issue was Docker volumes remembering a previous run. If a "fresh" deploy behaves like it isn't fresh, check the volumes before you touch any code or config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't hand-write inserts into a system with real schema relationships.&lt;/strong&gt; SigNoz expects org/admin/user creation to happen through its own flow. A manual &lt;code&gt;INSERT&lt;/code&gt; was never going to be a clean shortcut, and I lost real time learning that the hard way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell quoting is a tax on anything multi-field.&lt;/strong&gt; Next time I'd write inline SQL/JSON to a file and pipe it in rather than fight inline escaping in the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker volume prune&lt;/code&gt; + re-cast beat every "smart" fix combined.&lt;/strong&gt; The fastest debugging move was admitting the environment itself was the bug and rebuilding it, instead of trying to outsmart it in place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local infra debugging can genuinely be harder than the application code.&lt;/strong&gt; Writing the OpenTelemetry instrumentation was a known, documented pattern that mostly just worked. Getting the observability &lt;em&gt;backend&lt;/em&gt; into a clean, working state was where all the real friction lived — and I don't think that's talked about enough going into a project like this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It was worth it.&lt;/strong&gt; Once traces were flowing, "is the upload slow or is processing slow" stopped being a guess and became something I could just look at.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I did this again, I'd write down the "nuke it and re-cast" steps &lt;em&gt;before&lt;/em&gt; trying anything clever with env vars or manual SQL — because that's what I ended up doing anyway, just an hour later than I needed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The finished result: a working local SigNoz setup tracking real video-processing traces, with no errors, for an app that actually does what it's supposed to do. Getting there meant fighting through stale Docker state, a login wall I didn't expect, schema constraints, and a PowerShell quoting battle that had nothing to do with observability at all — and then winning that fight with a clean wipe and a re-cast. That's the real version of how this project came together, mess and all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/jElGmQRMbYY?si=kaG_rNgswtF09mdQ" rel="noopener noreferrer"&gt;https://youtu.be/jElGmQRMbYY?si=kaG_rNgswtF09mdQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Project repo: &lt;a href="https://github.com/justkidding998877665544332211/ai-subtitles-studio-signoz" rel="noopener noreferrer"&gt;https://github.com/justkidding998877665544332211/ai-subtitles-studio-signoz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenTelemetry docs (for anyone instrumenting Next.js themselves): &lt;a href="https://opentelemetry.io" rel="noopener noreferrer"&gt;https://opentelemetry.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SigNoz's own Next.js + OpenTelemetry guide: &lt;a href="https://signoz.io/docs/instrumentation/javascript/opentelemetry-nextjs/" rel="noopener noreferrer"&gt;https://signoz.io/docs/instrumentation/javascript/opentelemetry-nextjs/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Pushing SigNoz Foundry as a Complete DevOps Beginner Until My RAM Broke (and How I Fixed It)</title>
      <dc:creator>Just_a_kumar</dc:creator>
      <pubDate>Sun, 19 Jul 2026 18:29:07 +0000</pubDate>
      <link>https://dev.to/just_kidding_973ff1ca549b/pushing-signoz-foundry-as-a-complete-devops-beginner-until-my-ram-broke-3blp</link>
      <guid>https://dev.to/just_kidding_973ff1ca549b/pushing-signoz-foundry-as-a-complete-devops-beginner-until-my-ram-broke-3blp</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're a complete beginner, the backend of software feels like literal black magic. You click a single button on a sleek frontend interface, and suddenly a massive web of microservices starts yelling at each other, querying databases, and moving heavy data streams under the hood. Standard debugging tools rarely show you why a specific action is lagging or exactly where the architecture is screaming for help.&lt;/p&gt;

&lt;p&gt;When the WeMakeDevs team dropped the "Agents of SigNoz" hackathon, I saw the perfect excuse to step outside my comfort zone and dive into open-source observability. My mission was simple on paper: self-host SigNoz on my local machine using their brand-new CLI installer, Foundry.&lt;/p&gt;

&lt;p&gt;It did not go smoothly. Over the course of this deployment I hit a shell compatibility error, a broken Docker-to-WSL bridge, a permissions wall, and finally a hard out-of-memory crash that killed the whole process right as it was about to finish. But I didn't stop at the crash — I went back, found the actual root cause of each problem, fixed them properly instead of just working around them, and got SigNoz fully running with real trace data flowing into it. This post walks through every one of those failures in order, what actually caused each one, and exactly how I fixed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BBefore you break things the way I did, make sure you have this on your Windows machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Desktop&lt;/strong&gt;, with the engine actually running (not just installed)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WSL 2&lt;/strong&gt; with an active Ubuntu distro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt;, mainly for its terminal profile switcher&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Problem 1: The Wrong Shell&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hackathon explicitly required using SigNoz's new CLI tool, &lt;strong&gt;Foundry&lt;/strong&gt;. The official docs gave a one-line install command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;https://signoz.io/foundry.sh]&lt;span class="o"&gt;(&lt;/span&gt;https://signoz.io/foundry.sh&lt;span class="o"&gt;)&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I pulled up my VS Code terminal, pasted it, hit Enter — and got an error saying it couldn't find a parameter matching -fsSL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; My default VS Code terminal was PowerShell, not a Linux shell. PowerShell aliases curl to Invoke-WebRequest, which has no idea what -fsSL means because those are curl-specific flags from Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I switched the terminal profile in VS Code to &lt;strong&gt;Ubuntu (WSL)&lt;/strong&gt; and re-ran the exact same command. It worked immediately.&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%2Fe1by1bd71ktq5otzszbx.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%2Fe1by1bd71ktq5otzszbx.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2: The Broken Docker Bridge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With Foundry installed, I wrote a small YAML blueprint (casting.yaml) telling it to deploy SigNoz via Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: v1alpha1
kind: Installation
metadata:
  name: signoz
spec:
  deployment:
    flavor: compose
    mode: docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running foundryctl cast -f casting.yaml immediately failed — the terminal said it couldn't find docker-compose. Docker Desktop was running fine on the Windows side, but WSL had no idea it existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; Docker Desktop and WSL don't talk to each other by default. You have to explicitly bridge them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;Docker Desktop → Settings → Resources → WSL Integration → toggle on "Enable integration with my default WSL distro," enable Ubuntu specifically, then Apply &amp;amp; Restart.&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%2Flysvzh4hfasxesv9isy5.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%2Flysvzh4hfasxesv9isy5.png" alt=" " width="800" height="864"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 3: The Permission Wall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the bridge fixed, I re-ran the deploy and hit a new error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;unable to get image... permission denied &lt;span class="k"&gt;while &lt;/span&gt;trying to connect to the Docker API at unix:///var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; My Linux user didn't have permission to talk to the Docker daemon's socket. This is standard Docker behavior on a fresh Linux setup — only root or members of the docker group can use the Docker CLI without extra steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The quick-and-dirty fix I used at first:&lt;/strong&gt; I forced it through with sudo and the absolute path to the binary:&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="nb"&gt;sudo&lt;/span&gt; /home/idiot/.local/bin/foundryctl cast &lt;span class="nt"&gt;-f&lt;/span&gt; casting.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That got the deploy moving again, but it's not the right long-term fix — running Docker commands as root for every single call isn't something you want to make a habit of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 4: The Out-of-Memory Crash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Past the permission wall, the deploy connected to the Docker registry and started pulling the backend images — Postgres, the OpenTelemetry collector, ClickHouse. Right at the finish line, it stopped dead:&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="s2"&gt;"exception"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"message"&lt;/span&gt;: &lt;span class="s2"&gt;"signal: killed"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fn4dp57cw6j9z7c6w6tga.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%2Fn4dp57cw6j9z7c6w6tga.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cause:&lt;/strong&gt; My machine ran out of RAM trying to unpack all those container layers at once — ClickHouse especially is not lightweight. Windows killed the process to protect itself before I could kill it myself.&lt;/p&gt;

&lt;p&gt;At first I read this as a hardware limitation and wrote it off. It isn't. &lt;strong&gt;WSL 2 caps how much RAM it'll allocate to the Linux VM by default, and that cap is often too conservative for a multi-container stack like SigNoz's&lt;/strong&gt; — it's a configuration ceiling, not a physical one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real fix:&lt;/strong&gt; create (or edit) a .wslconfig file in the Windows user directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;notepad &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$env&lt;/span&gt;&lt;span class="s2"&gt;:USERPROFILE&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;wslconfig"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notepad will offer to create it — say yes, then paste:&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="o"&gt;[&lt;/span&gt;wsl2]
&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8GB
&lt;span class="nv"&gt;processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4
&lt;span class="nv"&gt;swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save, then restart WSL from PowerShell so the change actually applies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reopening the terminal and checking free -h confirmed the new memory ceiling had taken effect.&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%2Fl51m9dzc96pwll5d33jb.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%2Fl51m9dzc96pwll5d33jb.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixing Problem 3 Properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before re-running the deploy, I went back and fixed the permissions issue the right way instead of relying on sudo:&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="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Group membership changes don't apply to an already-open terminal session — I had to fully close the terminal tab and open a fresh one for it to take effect. After that, docker ps worked with no sudo and no permission error.&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%2Faf3k59qdhkmrr8tenafa.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%2Faf3k59qdhkmrr8tenafa.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Clean Re-Run&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the memory ceiling raised and permissions fixed properly, I cleared out any half-downloaded layers from the earlier crash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ran the deploy again, this time with no sudo and no workarounds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foundryctl cast &lt;span class="nt"&gt;-f&lt;/span&gt; casting.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time it completed cleanly — every image pulled, every container started or reported healthy, no OOM kill.&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%2F1nuvb4jxgjf56q9b53bm.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%2F1nuvb4jxgjf56q9b53bm.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Into the Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With everything running, I opened &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; and landed on SigNoz's account setup screen.&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%2Fi6jfl30ond9u56dcwacv.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%2Fi6jfl30ond9u56dcwacv.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating an account, I was in — but the dashboard was empty, with a message saying no data had been sent yet. Standing the tool up was only half the job; nothing shows up in an observability platform until something is actually instrumented and pointed at it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting Real Data Flowing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To generate real trace data without building a project from scratch, I used Jaeger's &lt;strong&gt;HotROD&lt;/strong&gt; demo app — a small pre-built microservices app made specifically for testing tracing setups. My first attempt at running it didn't send any data anywhere, because I hadn't told it where SigNoz's collector actually was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; hotrod &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; signoz-network &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  jaegertracing/example-hotrod:latest &lt;span class="se"&gt;\&lt;/span&gt;
  all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; HotROD needs to be told explicitly where to send its OTLP trace data. I found the right container name by listing what Foundry had actually deployed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s2"&gt;"table {{.Names}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and pointed HotROD at the ingester service on the same Docker network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop hotrod

docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; hotrod &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; signoz-network &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://signoz-ingester-1:4318 &lt;span class="se"&gt;\&lt;/span&gt;
  jaegertracing/example-hotrod:latest &lt;span class="se"&gt;\&lt;/span&gt;
  all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Worth being upfront about: HotROD is Jaeger's example app, not something built by or for SigNoz — I used it purely as a traffic generator to prove the pipeline actually works end to end, not as part of a custom project.)&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%2Femmdxyov0rtwgq7annqw.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%2Femmdxyov0rtwgq7annqw.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I opened &lt;a href="http://localhost:8081" rel="noopener noreferrer"&gt;http://localhost:8081&lt;/a&gt; and clicked through a few "call a car" requests for different customers to generate multiple traces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Payoff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Back in SigNoz's Traces Explorer, real spans had landed — service names like route and frontend, real durations, real HTTP status codes. Not a mock, not a placeholder. An actual working observability pipeline, built from a machine that had OOM-crashed on the exact same deployment less than an hour earlier.&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%2F3z5tqdy5k5piu1ipbiyi.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%2F3z5tqdy5k5piu1ipbiyi.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shell context matters more than the command itself.&lt;/strong&gt; The exact same string can fail or succeed depending on whether PowerShell or a real Linux shell is interpreting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker on WSL is really two systems shaking hands&lt;/strong&gt;, and either side — the bridge, or the socket permissions — can quietly block you without an error message that points at the real cause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Out of memory" isn't always a hardware problem.&lt;/strong&gt; On WSL 2 specifically, it's frequently a configuration default, not a physical limit. Checking .wslconfig costs two minutes and can save you from wrongly concluding your machine just isn't capable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sudo is a workaround, not a fix.&lt;/strong&gt; It got me unblocked in the moment, but usermod -aG docker is the version of that fix worth actually keeping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploying the tool and using the tool are two different milestones.&lt;/strong&gt; SigNoz being "up" and SigNoz actually showing you something are separated by one more step most tutorials skip past: getting real telemetry pointed at it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started this deployment expecting a quick CLI install and ended up debugging shell environments, Docker-to-WSL networking, Unix socket permissions, and a memory ceiling I initially mistook for a hardware wall — before finally watching real trace data land in a dashboard that, an hour earlier, hadn't even been able to finish installing. Every fix here came from actually reading the error instead of guessing, which is probably the most useful thing I'm walking away with — that, and a .wslconfig file I'm never deploying anything heavy without again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://signoz.io/docs/introduction/" rel="noopener noreferrer"&gt;SigNox documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/" rel="noopener noreferrer"&gt;OpenTelemetry documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/wsl-config" rel="noopener noreferrer"&gt;WSL advanced settings / .wslconfig reference — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jaegertracing/jaeger/tree/main/examples/hotrod" rel="noopener noreferrer"&gt;Jaeger HotROD example app&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
