<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Vinayak · 6G Dev]]></title><description><![CDATA[Vinayak · 6G Dev]]></description><link>https://vinayak6g.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6803ab35f0a630bf61bef6ac/ba1426f5-1f0d-43c1-a163-9e5fb0db112c.png</url><title>Vinayak · 6G Dev</title><link>https://vinayak6g.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 00:11:16 GMT</lastBuildDate><atom:link href="https://vinayak6g.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Day 31: LaTeX Parameter Table Generator — From Config to Paper in One Step]]></title><description><![CDATA[Subtitle: Because rewriting parameters is a waste of time
After fixing the export pipeline, one thing became obvious:
Figures are ready.
But something is still missing.
👉 The parameters behind those ]]></description><link>https://vinayak6g.hashnode.dev/day-31-latex-parameter-table-generator-from-config-to-paper-in-one-step</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-31-latex-parameter-table-generator-from-config-to-paper-in-one-step</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:54:46 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because rewriting parameters is a waste of time</p>
<p>After fixing the export pipeline, one thing became obvious:</p>
<p>Figures are ready.</p>
<p>But something is still missing.</p>
<p>👉 The parameters behind those figures.</p>
<p>Every research paper includes a table like this:</p>
<ul>
<li><p>Modulation scheme</p>
</li>
<li><p>SNR range</p>
</li>
<li><p>Channel model</p>
</li>
<li><p>Number of iterations</p>
</li>
<li><p>Bandwidth</p>
</li>
</ul>
<p>And today, that table is created manually.</p>
<p>Day 31 starts fixing that.</p>
<hr />
<h2>The Problem</h2>
<p>Right now, the workflow looks like this:</p>
<ul>
<li><p>Run simulation</p>
</li>
<li><p>Open config</p>
</li>
<li><p>Copy parameters</p>
</li>
<li><p>Write LaTeX table manually</p>
</li>
<li><p>Fix formatting</p>
</li>
<li><p>Double-check values</p>
</li>
</ul>
<p>This is slow and error-prone.</p>
<p>👉 One small mistake = wrong paper.</p>
<hr />
<h2>The Idea</h2>
<p>Instead of writing tables manually:</p>
<p>👉 Generate them automatically.</p>
<h3>Introducing:</h3>
<p><strong>LaTeX Parameter Table Generator</strong></p>
<hr />
<h2>What It Does</h2>
<p>Every simulation now has a structured configuration.</p>
<p>From that config, the system generates:</p>
<ul>
<li><p>Clean LaTeX table</p>
</li>
<li><p>Proper alignment</p>
</li>
<li><p>Ready-to-use format</p>
</li>
</ul>
<p>Example output:</p>
<pre><code class="language-id=&quot;latex1&quot;">\begin{tabular}{ll}
\toprule
Parameter &amp; Value \\
\midrule
Modulation &amp; QPSK \\
SNR Range &amp; 0–20 dB \\
Iterations &amp; 10000 \\
Channel Model &amp; AWGN \\
\bottomrule
\end{tabular}
</code></pre>
<p>👉 Copy → paste into Overleaf → done.</p>
<hr />
<h2>How It Works — Backend</h2>
<p>Spring Boot extracts simulation parameters from stored JSON.</p>
<p>A formatter service:</p>
<ul>
<li><p>Maps keys → readable names</p>
</li>
<li><p>Formats values properly</p>
</li>
<li><p>Generates LaTeX string</p>
</li>
</ul>
<p>This is returned via API.</p>
<hr />
<h2>Frontend — Simple but Powerful</h2>
<p>Angular adds:</p>
<ul>
<li><p>“Generate LaTeX Table” button</p>
</li>
<li><p>Copy-to-clipboard option</p>
</li>
</ul>
<p>User doesn’t see complexity.</p>
<p>Just clicks → gets table.</p>
<hr />
<h2>One Challenge</h2>
<p>Not all parameters are simple.</p>
<p>Some are:</p>
<ul>
<li><p>Arrays</p>
</li>
<li><p>Nested configs</p>
</li>
<li><p>Derived values</p>
</li>
</ul>
<p>Fix: → Flatten + normalize before formatting</p>
<p>Ensures clean output.</p>
<hr />
<h2>Why This Matters</h2>
<p>This feature removes a repetitive task.</p>
<p>Instead of:</p>
<p>→ Writing tables manually</p>
<p>You get:</p>
<p>→ Automatic, consistent output</p>
<p>Across multiple experiments — this saves hours.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>Now the pipeline is forming:</p>
<ul>
<li><p>Figures → ready ✅</p>
</li>
<li><p>Tables → ready ✅</p>
</li>
</ul>
<p>Next:</p>
<p>👉 Reproducibility</p>
<p>Because a paper is not complete without it.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 32: Reproducibility Package — One Click to Recreate Everything</p>
<p>From simulation → to complete experiment bundle.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 31</p>
]]></content:encoded></item><item><title><![CDATA[Day 30: Fixing Export Edge Cases — Making It Reliable, Not Just Working]]></title><description><![CDATA[Subtitle: Because a feature is only complete when it doesn’t break
Yesterday, the export pipeline was working.
Today was about something different:
👉 Making sure it works every time.
Because “it work]]></description><link>https://vinayak6g.hashnode.dev/day-30-fixing-export-edge-cases-making-it-reliable-not-just-working</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-30-fixing-export-edge-cases-making-it-reliable-not-just-working</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:53:42 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because a feature is only complete when it doesn’t break</p>
<p>Yesterday, the export pipeline was working.</p>
<p>Today was about something different:</p>
<p>👉 Making sure it works every time.</p>
<p>Because “it works on my machine” is not enough — especially for a research tool.</p>
<hr />
<h2>The Reality After Implementation</h2>
<p>Once the export feature was in place, small issues started showing up:</p>
<ul>
<li><p>Some charts exported with wrong dimensions</p>
</li>
<li><p>Font sizes looked different in PDF</p>
</li>
<li><p>Background was not always pure white</p>
</li>
<li><p>Large datasets caused slight rendering lag</p>
</li>
</ul>
<p>Individually small.</p>
<p>Together — they break trust.</p>
<hr />
<h2>The Goal for Today</h2>
<p>Not adding new features.</p>
<p>👉 Making the existing one stable.</p>
<hr />
<h2>Fix 1 — Consistent Dimensions</h2>
<p>Problem: Charts were exporting with inconsistent sizes depending on screen resolution.</p>
<p>Fix:</p>
<ul>
<li><p>Defined fixed export dimensions</p>
</li>
<li><p>Standardized width/height ratio</p>
</li>
<li><p>Decoupled export size from UI size</p>
</li>
</ul>
<p>Now exports look identical across devices.</p>
<hr />
<h2>Fix 2 — Font Consistency</h2>
<p>Problem: Fonts looked correct on screen but different in exported files.</p>
<p>Cause: Browser rendering vs export rendering mismatch.</p>
<p>Fix:</p>
<ul>
<li><p>Forced font override before export</p>
</li>
<li><p>Explicit font embedding in PDF</p>
</li>
<li><p>Standardized font scaling</p>
</li>
</ul>
<p>Now exported figures match expected formatting.</p>
<hr />
<h2>Fix 3 — Background Control</h2>
<p>Problem: Some exports had transparent or slightly tinted backgrounds.</p>
<p>Fix:</p>
<ul>
<li><p>Explicit white background layer added before export</p>
</li>
<li><p>Removed all UI overlays during export</p>
</li>
</ul>
<p>Now every export is clean and paper-ready.</p>
<hr />
<h2>Fix 4 — Handling Large Data</h2>
<p>Problem: Heavy simulations caused slow export or lag.</p>
<p>Fix:</p>
<ul>
<li><p>Optimized rendering before capture</p>
</li>
<li><p>Reduced unnecessary redraw cycles</p>
</li>
<li><p>Ensured export happens after render completion</p>
</li>
</ul>
<hr />
<h2>One Important Lesson</h2>
<p>Building a feature is step one.</p>
<p>Stabilizing it is step two.</p>
<p>👉 And step two is where real quality comes from.</p>
<hr />
<h2>What’s Working Now</h2>
<ul>
<li><p>PNG export (high quality, consistent) ✅</p>
</li>
<li><p>PDF export (proper scaling, fonts fixed) ✅</p>
</li>
<li><p>Styling override stable ✅</p>
</li>
<li><p>No UI artifacts in export ✅</p>
</li>
</ul>
<p>SVG still being refined.</p>
<hr />
<h2>Why This Matters</h2>
<p>This feature is now:</p>
<p>👉 Not just usable 👉 But dependable</p>
<p>And for research tools, reliability matters more than features.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>From: → “Feature works”</p>
<p>To: → “Feature is trustworthy”</p>
<p>That’s the difference between a demo and a product.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 31: LaTeX Parameter Table Generator — Turning Config into Paper-Ready Tables</p>
<p>Because figures are only half the story — parameters matter just as much.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 30</p>
]]></content:encoded></item><item><title><![CDATA[Day 29: Implementing the Export Pipeline — Turning Design into Reality]]></title><description><![CDATA[Subtitle: From idea to actual downloadable figures
Yesterday was all about designing the IEEE Figure Wizard.
Today was different.
👉 Today, the goal was simple: Make export actually work.

The First S]]></description><link>https://vinayak6g.hashnode.dev/day-29-implementing-the-export-pipeline-turning-design-into-reality</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-29-implementing-the-export-pipeline-turning-design-into-reality</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:52:41 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: From idea to actual downloadable figures</p>
<p>Yesterday was all about designing the IEEE Figure Wizard.</p>
<p>Today was different.</p>
<p>👉 Today, the goal was simple: Make export actually work.</p>
<hr />
<h2>The First Step — Getting Data Out of the Chart</h2>
<p>At first glance, exporting a chart sounds easy.</p>
<p>But internally, charts are rendered on a canvas.</p>
<p>Which means:</p>
<ul>
<li><p>What you see ≠ what you can directly export</p>
</li>
<li><p>You need to extract it properly</p>
</li>
</ul>
<p>The starting point was:</p>
<pre><code class="language-id=&quot;exp1&quot;">canvas.toDataURL("image/png")
</code></pre>
<p>This gives a PNG image of the chart.</p>
<p>Simple — but not enough.</p>
<hr />
<h2>PNG Export — The Easy Win</h2>
<p>PNG was the first format to get working.</p>
<p>Steps:</p>
<ul>
<li><p>Capture chart canvas</p>
</li>
<li><p>Convert to data URL</p>
</li>
<li><p>Trigger download</p>
</li>
</ul>
<p>This worked immediately.</p>
<p>But quality mattered.</p>
<p>So:</p>
<ul>
<li><p>Set maximum resolution</p>
</li>
<li><p>Ensured clean white background</p>
</li>
<li><p>Removed UI artifacts</p>
</li>
</ul>
<p>Now PNG export is stable and usable.</p>
<hr />
<h2>The Real Challenge — PDF and SVG</h2>
<p>PNG solves screenshots.</p>
<p>But research requires:</p>
<p>👉 Vector formats</p>
<hr />
<h3>PDF Export</h3>
<p>For PDF:</p>
<ul>
<li><p>Integrated jsPDF</p>
</li>
<li><p>Embedded the chart image</p>
</li>
<li><p>Ensured correct scaling</p>
</li>
</ul>
<p>Problem faced:</p>
<p>👉 Scaling mismatch — chart looked stretched</p>
<p>Fix: → Maintain aspect ratio + controlled dimensions</p>
<hr />
<h3>SVG Export</h3>
<p>SVG is trickier.</p>
<p>Canvas doesn’t directly export SVG.</p>
<p>So options explored:</p>
<ul>
<li><p>Chart.js plugins</p>
</li>
<li><p>Manual conversion</p>
</li>
<li><p>Alternative rendering strategies</p>
</li>
</ul>
<p>This part required deeper experimentation.</p>
<hr />
<h2>Styling Before Export</h2>
<p>One key thing implemented:</p>
<p>👉 Export styling override</p>
<p>Before exporting:</p>
<ul>
<li><p>Font → Times New Roman</p>
</li>
<li><p>Font size adjusted</p>
</li>
<li><p>Grid cleaned</p>
</li>
<li><p>Background forced white</p>
</li>
</ul>
<p>After export: → Original UI restored</p>
<p>User never sees the change — only the result.</p>
<hr />
<h2>Backend Role (Small but Important)</h2>
<p>A basic export metadata endpoint was added.</p>
<p>Purpose:</p>
<ul>
<li><p>Store export-related configuration</p>
</li>
<li><p>Prepare for LaTeX integration</p>
</li>
</ul>
<p>This becomes useful in next features.</p>
<hr />
<h2>What’s Working Now</h2>
<ul>
<li><p>PNG export ✅</p>
</li>
<li><p>PDF export (basic) ✅</p>
</li>
<li><p>Styling override logic ✅</p>
</li>
<li><p>Export trigger from UI ✅</p>
</li>
</ul>
<p>SVG still under refinement.</p>
<hr />
<h2>Why This Matters</h2>
<p>This is the first feature where:</p>
<p>👉 A user can take output directly from the platform 👉 And use it outside the platform</p>
<p>That changes how the tool is used.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>Before: → View results</p>
<p>Now: → Extract results</p>
<p>Next: → Publish results</p>
<hr />
<h2>What’s Next</h2>
<p>Day 30: Fixing Edge Cases and Improving Export Quality</p>
<p>Because export is only useful if it works reliably every time.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 29</p>
]]></content:encoded></item><item><title><![CDATA[Day 28: Designing the IEEE Figure Export System — From Chart to Paper]]></title><description><![CDATA[Subtitle: Because screenshots are not a research workflow
Yesterday I defined the Publication Pipeline.
Today I focused on the first and most important part of it:
👉 Figure generation
Not just export]]></description><link>https://vinayak6g.hashnode.dev/day-28-designing-the-ieee-figure-export-system-from-chart-to-paper</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-28-designing-the-ieee-figure-export-system-from-chart-to-paper</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:51:37 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because screenshots are not a research workflow</p>
<p>Yesterday I defined the Publication Pipeline.</p>
<p>Today I focused on the first and most important part of it:</p>
<p>👉 <strong>Figure generation</strong></p>
<p>Not just exporting charts — but making them <strong>publication-ready</strong>.</p>
<hr />
<h2>The Problem</h2>
<p>Right now, exporting a chart is easy.</p>
<p>But using it in a research paper?</p>
<p>Not so easy.</p>
<p>Researchers usually:</p>
<ul>
<li><p>Take a screenshot</p>
</li>
<li><p>Paste into PowerPoint or LaTeX</p>
</li>
<li><p>Adjust font sizes</p>
</li>
<li><p>Fix alignment</p>
</li>
<li><p>Increase resolution manually</p>
</li>
</ul>
<p>This is repetitive and inconsistent.</p>
<hr />
<h2>What Makes a Figure “Publication Ready”?</h2>
<p>After digging into IEEE and research paper standards, a few requirements stood out:</p>
<ul>
<li><p>Font: Times New Roman</p>
</li>
<li><p>Font size: 8–10 pt</p>
</li>
<li><p>Clean white background</p>
</li>
<li><p>Proper axis labeling</p>
</li>
<li><p>High resolution (300 DPI+)</p>
</li>
<li><p>Vector formats preferred (SVG/PDF)</p>
</li>
</ul>
<p>👉 Most dashboards don’t follow these.</p>
<hr />
<h2>The Design Decision</h2>
<p>Instead of letting users manually fix everything, the system should:</p>
<p>👉 Automatically apply publication standards during export</p>
<p>So I defined the feature as:</p>
<h3>👉 “IEEE Figure Wizard”</h3>
<p>A one-click export system that converts any chart into:</p>
<ul>
<li><p>PNG (high resolution)</p>
</li>
<li><p>PDF (ready for papers)</p>
</li>
<li><p>SVG (vector format)</p>
</li>
</ul>
<p>With correct styling applied.</p>
<hr />
<h2>How It Will Work</h2>
<p>The export process will have three steps:</p>
<h3>1. Temporary Style Override</h3>
<p>Before exporting, chart styling is adjusted:</p>
<ul>
<li><p>Font → Times New Roman</p>
</li>
<li><p>Font size → standardized</p>
</li>
<li><p>Grid → minimal</p>
</li>
<li><p>Background → white</p>
</li>
</ul>
<hr />
<h3>2. Format Conversion</h3>
<p>Depending on export type:</p>
<ul>
<li><p>PNG → Canvas export</p>
</li>
<li><p>PDF → jsPDF integration</p>
</li>
<li><p>SVG → vector conversion</p>
</li>
</ul>
<hr />
<h3>3. Download Ready File</h3>
<p>User gets a file that can go directly into:</p>
<ul>
<li><p>LaTeX</p>
</li>
<li><p>Word</p>
</li>
<li><p>Research papers</p>
</li>
</ul>
<p>No manual fixes needed.</p>
<hr />
<h2>One Key Challenge</h2>
<p>Charts in web apps are optimized for screens — not print.</p>
<p>That creates issues like:</p>
<ul>
<li><p>Scaling problems</p>
</li>
<li><p>Font mismatch</p>
</li>
<li><p>Pixelation in exports</p>
</li>
</ul>
<p>So the export system must treat <strong>display and export differently</strong>.</p>
<hr />
<h2>Why This Matters</h2>
<p>This feature directly saves time.</p>
<p>Instead of:</p>
<p>→ 10 minutes per figure</p>
<p>You get:</p>
<p>→ 1 click → ready to use</p>
<p>Across multiple experiments, that’s hours saved.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>This is the first feature where:</p>
<p>👉 The output is not just for viewing 👉 It’s for publishing</p>
<p>That’s a major transition.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 29: Implementing the Export Pipeline</p>
<p>From design → actual working feature.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 28</p>
]]></content:encoded></item><item><title><![CDATA[Day 27: Defining the Publication Pipeline — Where Research Actually Ends Up]]></title><description><![CDATA[Subtitle: Every simulation eventually becomes a paper
After understanding how researchers work yesterday, one thing became obvious:
👉 Everything leads to publication.
No matter how complex the simula]]></description><link>https://vinayak6g.hashnode.dev/day-27-defining-the-publication-pipeline-where-research-actually-ends-up</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-27-defining-the-publication-pipeline-where-research-actually-ends-up</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:50:30 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Every simulation eventually becomes a paper</p>
<p>After understanding how researchers work yesterday, one thing became obvious:</p>
<p>👉 Everything leads to publication.</p>
<p>No matter how complex the simulation is — its final destination is usually a figure, a table, or a result inside a paper.</p>
<p>But the path to get there?</p>
<p>Messy.</p>
<hr />
<h2>The Current Reality</h2>
<p>Right now, the workflow looks like this:</p>
<ul>
<li><p>Run simulation</p>
</li>
<li><p>Take screenshot of chart</p>
</li>
<li><p>Adjust labels manually</p>
</li>
<li><p>Fix font sizes</p>
</li>
<li><p>Recreate tables in LaTeX</p>
</li>
<li><p>Double-check parameters</p>
</li>
<li><p>Hope everything is consistent</p>
</li>
</ul>
<p>This process is repeated again and again.</p>
<hr />
<h2>The Core Problem</h2>
<p>The issue is not lack of tools.</p>
<p>It’s lack of <strong>integration</strong>.</p>
<p>Simulation tools and publication tools live in completely different worlds.</p>
<p>👉 There is no direct bridge between them.</p>
<hr />
<h2>The Idea: Publication Pipeline</h2>
<p>Today I defined a clear direction:</p>
<h3>👉 Build a “Publication Pipeline”</h3>
<p>A system where:</p>
<ul>
<li><p>Simulation → automatically becomes figure</p>
</li>
<li><p>Parameters → automatically become table</p>
</li>
<li><p>Results → automatically become reproducible</p>
</li>
</ul>
<p>No manual steps in between.</p>
<hr />
<h2>Breaking It Down</h2>
<p>The pipeline will have three core parts:</p>
<h3>1. Figure Generation</h3>
<p>Export charts in publication-ready format (IEEE, Nature standards)</p>
<hr />
<h3>2. Parameter Tables</h3>
<p>Auto-generate LaTeX tables directly from simulation config</p>
<hr />
<h3>3. Reproducibility Package</h3>
<p>Bundle everything needed to recreate the result</p>
<ul>
<li><p>Config</p>
</li>
<li><p>Random seeds</p>
</li>
<li><p>Environment info</p>
</li>
</ul>
<hr />
<h2>Why This Matters</h2>
<p>This is not a “nice-to-have” feature.</p>
<p>This is where real time is lost.</p>
<p>Researchers spend hours:</p>
<ul>
<li><p>Formatting figures</p>
</li>
<li><p>Rewriting tables</p>
</li>
<li><p>Reproducing results</p>
</li>
</ul>
<p>👉 Automating this saves real effort.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>This is the first true “moat” feature.</p>
<p>Because:</p>
<ul>
<li><p>Simulation tools don’t handle publishing</p>
</li>
<li><p>Publishing tools don’t understand simulations</p>
</li>
</ul>
<p>This sits exactly in the gap.</p>
<hr />
<h2>What Changes Now</h2>
<p>From this point forward:</p>
<p>Every simulation result should be:</p>
<p>👉 Ready to publish 👉 Ready to share 👉 Ready to reproduce</p>
<hr />
<h2>What’s Next</h2>
<p>Day 28: Designing the IEEE Figure Export System</p>
<p>The first part of the publication pipeline — turning charts into paper-ready figures.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 27</p>
]]></content:encoded></item><item><title><![CDATA[Day 26: Thinking Like a Researcher — Before Writing Code]]></title><description><![CDATA[Subtitle: Because building the wrong thing fast is still wrong
Yesterday marked the start of Phase 3.
Today was different.
No major feature. No new chart. No visible output.
Just thinking.

The Real Q]]></description><link>https://vinayak6g.hashnode.dev/day-26-thinking-like-a-researcher-before-writing-code</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-26-thinking-like-a-researcher-before-writing-code</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:49:25 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because building the wrong thing fast is still wrong</p>
<p>Yesterday marked the start of Phase 3.</p>
<p>Today was different.</p>
<p>No major feature. No new chart. No visible output.</p>
<p>Just thinking.</p>
<hr />
<h2>The Real Question</h2>
<p>If Sionna Visualizer is going to become a research platform, then one thing becomes critical:</p>
<p>👉 <em>How do researchers actually work?</em></p>
<p>Not how I think they work. Not how tutorials show it.</p>
<p>But real workflows.</p>
<hr />
<h2>What I Observed</h2>
<p>After going through discussions, papers, and tools, a pattern became clear:</p>
<p>A typical research workflow looks like this:</p>
<ol>
<li><p>Run simulation</p>
</li>
<li><p>Adjust parameters</p>
</li>
<li><p>Run again</p>
</li>
<li><p>Compare results</p>
</li>
<li><p>Export figures</p>
</li>
<li><p>Write paper</p>
</li>
<li><p>Re-run everything for verification</p>
</li>
</ol>
<p>This loop repeats multiple times.</p>
<hr />
<h2>The Hidden Problems</h2>
<p>The simulation itself is not the hardest part.</p>
<p>The real friction is here:</p>
<ul>
<li><p>No structured way to track experiments</p>
</li>
<li><p>Parameters are often lost or scattered</p>
</li>
<li><p>Reproducing results becomes difficult</p>
</li>
<li><p>Exporting for papers is manual work</p>
</li>
</ul>
<p>👉 The process is fragmented.</p>
<hr />
<h2>What This Means for the Product</h2>
<p>This changed how I think about features.</p>
<p>Instead of asking:</p>
<p>→ “What can I build next?”</p>
<p>I now ask:</p>
<p>→ “Where is the friction in the workflow?”</p>
<hr />
<h2>A Key Realization</h2>
<p>A dashboard shows results.</p>
<p>A platform supports a workflow.</p>
<p>That’s the difference.</p>
<hr />
<h2>What I’m Optimizing For</h2>
<p>From this point forward, every feature should:</p>
<ul>
<li><p>Reduce manual work</p>
</li>
<li><p>Improve reproducibility</p>
</li>
<li><p>Make sharing easier</p>
</li>
<li><p>Fit naturally into research flow</p>
</li>
</ul>
<p>If it doesn’t do at least one of these — it’s noise.</p>
<hr />
<h2>Why Today Matters</h2>
<p>This might not look like progress.</p>
<p>But this is the kind of thinking that decides:</p>
<p>👉 Whether a project becomes useful or 👉 Just another demo</p>
<hr />
<h2>What’s Next</h2>
<p>Day 27: Defining the Publication Pipeline</p>
<p>Now that the workflow is clear, the next step is to attack the biggest pain point — publishing.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 26</p>
]]></content:encoded></item><item><title><![CDATA[Day 25: Phase 3 Begins — From Dashboard to Research Platform]]></title><description><![CDATA[Subtitle: This is where the direction changes
Up until now, Sionna Visualizer has been about one thing:
👉 Making simulation results visible.
Charts, comparisons, exports — all focused on understandin]]></description><link>https://vinayak6g.hashnode.dev/day-25-phase-3-begins-from-dashboard-to-research-platform</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-25-phase-3-begins-from-dashboard-to-research-platform</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:48:42 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: This is where the direction changes</p>
<p>Up until now, Sionna Visualizer has been about one thing:</p>
<p>👉 Making simulation results visible.</p>
<p>Charts, comparisons, exports — all focused on understanding output.</p>
<p>But today, I stepped back and asked a bigger question:</p>
<p><strong>Is this just a dashboard… or can it become something more?</strong></p>
<p>Day 25 is where that answer starts to change.</p>
<hr />
<h2>The Realization</h2>
<p>While building and interacting with the community, one pattern became clear:</p>
<p>Researchers don’t struggle with <em>running simulations</em>. They struggle with everything around it.</p>
<ul>
<li><p>Preparing figures for papers</p>
</li>
<li><p>Reproducing results later</p>
</li>
<li><p>Sharing experiments with others</p>
</li>
<li><p>Managing simulation history</p>
</li>
</ul>
<p>👉 The problem is not simulation. 👉 The problem is the workflow.</p>
<hr />
<h2>The Shift</h2>
<p>Phase 3 is not about adding more charts.</p>
<p>It’s about solving <strong>real research problems</strong>.</p>
<p>From this point forward, the goal is:</p>
<p>👉 Turn Sionna Visualizer into a <strong>research workflow platform</strong></p>
<hr />
<h2>The First Direction</h2>
<p>The first focus area is clear:</p>
<h3>📄 Publication Pipeline</h3>
<p>Because every simulation eventually ends up in a paper.</p>
<p>And right now, that process is completely manual.</p>
<p>Researchers:</p>
<ul>
<li><p>Take screenshots</p>
</li>
<li><p>Adjust formatting</p>
</li>
<li><p>Recreate tables</p>
</li>
<li><p>Re-run simulations for reproducibility</p>
</li>
</ul>
<p>This is slow. Repetitive. Error-prone.</p>
<hr />
<h2>What’s Coming Next</h2>
<p>Phase 3 will introduce features like:</p>
<ul>
<li><p>IEEE/Nature figure export</p>
</li>
<li><p>LaTeX parameter table generation</p>
</li>
<li><p>Reproducibility packages</p>
</li>
</ul>
<p>Not as add-ons — but as core functionality.</p>
<hr />
<h2>Why This Matters</h2>
<p>This is where differentiation begins.</p>
<p>NVIDIA provides the simulation engine. Sionna provides the algorithms.</p>
<p>But the <strong>workflow layer</strong> is still missing.</p>
<p>That’s the gap I’m building for.</p>
<hr />
<h2>The Bigger Picture</h2>
<p>This is no longer just:</p>
<p>→ “Visualizing simulation results”</p>
<p>It’s becoming:</p>
<p>→ “Helping researchers go from simulation → publication → collaboration”</p>
<hr />
<h2>What Changes From Today</h2>
<p>Every feature from now on will be judged by one question:</p>
<p>👉 <em>Does this help a researcher do real work faster?</em></p>
<p>If not — it doesn’t get built.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 26: Thinking Like a Researcher</p>
<p>Before building new features, I need to understand how researchers actually work.</p>
<p>Because building the right thing starts with asking the right questions.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 25</p>
]]></content:encoded></item><item><title><![CDATA[Day 24: Custom Colormaps — Making Simulation Data Actually Readable]]></title><description><![CDATA[Subtitle: Because bad colors hide good data
This feature didn’t start with a bug. It started with a realization.
Even when the simulation was correct — sometimes the visualization wasn’t helping.
Colo]]></description><link>https://vinayak6g.hashnode.dev/day-24-custom-colormaps-making-simulation-data-actually-readable</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-24-custom-colormaps-making-simulation-data-actually-readable</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:46:23 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because bad colors hide good data</p>
<p>This feature didn’t start with a bug. It started with a realization.</p>
<p>Even when the simulation was correct — sometimes the visualization wasn’t helping.</p>
<p>Colors were there. But clarity was missing.</p>
<p>Day 24 fixes that.</p>
<hr />
<h2>The Problem</h2>
<p>Most default charts use generic color schemes.</p>
<p>They work — but not for research.</p>
<p>Issues I noticed:</p>
<ul>
<li><p>Hard to distinguish values in dense regions</p>
</li>
<li><p>Poor contrast in certain ranges</p>
</li>
<li><p>Not accessible for colorblind users</p>
</li>
<li><p>No consistency across different charts</p>
</li>
</ul>
<p>👉 The data was right, but the interpretation was harder than it should be.</p>
<hr />
<h2>What’s New</h2>
<p>Sionna Visualizer now supports <strong>custom colormaps</strong>.</p>
<p>Users can switch between multiple palettes:</p>
<ul>
<li><p>Viridis (scientific standard)</p>
</li>
<li><p>Plasma</p>
</li>
<li><p>Inferno</p>
</li>
<li><p>Cool/Warm</p>
</li>
<li><p>Grayscale</p>
</li>
<li><p>Colorblind-safe palette</p>
</li>
</ul>
<p>Each palette is designed to improve readability for different scenarios.</p>
<hr />
<h2>How It Works — Color Mapping Layer</h2>
<p>Instead of hardcoding colors, charts now use a mapping function:</p>
<pre><code class="language-id=&quot;cmap1&quot;">value → normalized range → color scale → rendered output
</code></pre>
<p>Every data point passes through this pipeline.</p>
<p>This allows:</p>
<ul>
<li><p>Smooth gradients</p>
</li>
<li><p>Better contrast</p>
</li>
<li><p>Consistent visual meaning</p>
</li>
</ul>
<hr />
<h2>Frontend — Dynamic Palette Switching</h2>
<p>Angular now includes a colormap selector.</p>
<p>When the user switches palette:</p>
<ul>
<li><p>Charts re-render instantly</p>
</li>
<li><p>No need to rerun simulation</p>
</li>
<li><p>Same data, different perspective</p>
</li>
</ul>
<hr />
<h2>One Subtle Challenge</h2>
<p>Not all colormaps behave the same.</p>
<p>Some exaggerate differences. Some compress them.</p>
<p>Fix: → Normalized value mapping before applying color</p>
<p>This ensures consistency across all palettes.</p>
<hr />
<h2>Why This Matters</h2>
<p>In research, visualization is not decoration.</p>
<p>It’s interpretation.</p>
<p>A poor colormap can:</p>
<ul>
<li><p>Hide patterns</p>
</li>
<li><p>Mislead analysis</p>
</li>
<li><p>Reduce clarity</p>
</li>
</ul>
<p>A good one can:</p>
<ul>
<li><p>Reveal trends instantly</p>
</li>
<li><p>Highlight anomalies</p>
</li>
<li><p>Improve understanding</p>
</li>
</ul>
<hr />
<h2>The Bigger Shift</h2>
<p>This feature moves Sionna Visualizer from:</p>
<p>→ “Displaying results” to → “Helping interpret results”</p>
<p>That’s a big difference.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 25: Starting Phase 3 — The Shift to a Research Platform</p>
<p>Because visualization alone is not enough anymore.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 24</p>
]]></content:encoded></item><item><title><![CDATA[Day 23: Simulation Time Estimation — Knowing the Cost Before You Run]]></title><description><![CDATA[Subtitle: Because waiting blindly is not a workflow
This feature started from a simple frustration.
You click “Run Simulation” — and then you wait.
Sometimes it finishes in seconds. Sometimes it takes]]></description><link>https://vinayak6g.hashnode.dev/day-23-simulation-time-estimation-knowing-the-cost-before-you-run</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-23-simulation-time-estimation-knowing-the-cost-before-you-run</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:44:07 GMT</pubDate><content:encoded><![CDATA[<p>Subtitle: Because waiting blindly is not a workflow</p>
<p>This feature started from a simple frustration.</p>
<p>You click “Run Simulation” — and then you wait.</p>
<p>Sometimes it finishes in seconds. Sometimes it takes minutes. Sometimes… you’re not even sure if it’s stuck.</p>
<p>There was no way to know.</p>
<p>Day 23 fixes that.</p>
<hr />
<h2>The Problem</h2>
<p>As simulations get more complex:</p>
<ul>
<li><p>Higher SNR ranges</p>
</li>
<li><p>More Monte Carlo iterations</p>
</li>
<li><p>Larger antenna configurations</p>
</li>
</ul>
<p>The execution time increases — but unpredictably.</p>
<p>For researchers, this creates a real issue:</p>
<p>👉 You can’t plan your experiments efficiently.</p>
<hr />
<h2>What’s New</h2>
<p>Before running any simulation, Sionna Visualizer now shows:</p>
<ul>
<li><p>Estimated execution time</p>
</li>
<li><p>Complexity level (Low / Medium / High)</p>
</li>
</ul>
<p>This estimate updates dynamically as parameters change.</p>
<hr />
<h2>How It Works — Estimation Logic</h2>
<p>The estimation is based on three key factors:</p>
<pre><code class="language-id=&quot;z81n3k&quot;">Estimated Time ∝ (Number of SNR points) 
               × (Monte Carlo iterations) 
               × (Model complexity)
</code></pre>
<p>Each simulation type has a base cost.</p>
<p>That base cost is scaled depending on:</p>
<ul>
<li><p>Modulation scheme (BPSK vs 64QAM)</p>
</li>
<li><p>Number of samples</p>
</li>
<li><p>Channel conditions</p>
</li>
</ul>
<hr />
<h2>Backend — Lightweight Prediction Layer</h2>
<p>A new estimation service was added in Spring Boot.</p>
<p>Before the simulation runs:</p>
<ul>
<li><p>Request parameters are analyzed</p>
</li>
<li><p>A heuristic model calculates expected time</p>
</li>
<li><p>Response is sent instantly to frontend</p>
</li>
</ul>
<p>No actual simulation is triggered here — only prediction.</p>
<hr />
<h2>Frontend — Immediate Feedback</h2>
<p>Angular displays a small card before execution:</p>
<ul>
<li><p>⏱️ Estimated Time: ~2.3 seconds</p>
</li>
<li><p>⚙️ Complexity: Medium</p>
</li>
</ul>
<p>This updates live as users change parameters.</p>
<p>So instead of guessing, you now know.</p>
<hr />
<h2>One Small Detail That Matters</h2>
<p>During testing, one issue came up.</p>
<p>Very small simulations were showing <strong>0 seconds</strong> — which felt broken.</p>
<p>Fix: → Added minimum threshold + rounding logic</p>
<p>Now even fast runs feel intentional, not random.</p>
<hr />
<h2>Why This Matters</h2>
<p>This is not just a UI improvement.</p>
<p>It changes how people use the tool.</p>
<p>Before: → Trial and error → Run and wait</p>
<p>Now: → Plan first → Run with intent</p>
<hr />
<h2>The Bigger Shift</h2>
<p>This feature moves Sionna Visualizer closer to:</p>
<p>👉 A <strong>research workflow tool</strong>, not just a simulator</p>
<p>Because in real research:</p>
<ul>
<li><p>Time matters</p>
</li>
<li><p>Planning matters</p>
</li>
<li><p>Efficiency matters</p>
</li>
</ul>
<hr />
<h2>What’s Next</h2>
<p>Day 24: Custom Colormaps</p>
<p>Because once the data is correct — how you see it becomes just as important.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program Building in Public — Day 23</p>
]]></content:encoded></item><item><title><![CDATA[Day 22: Path Loss Breakdown — Making Every Signal Path Visible]]></title><description><![CDATA[ntify late or weak paths.
3. Data Table
For exact numeric inspection — useful for researchers.
Together, these views answer a simple but critical question:
👉 Where is the signal actually going?

Why ]]></description><link>https://vinayak6g.hashnode.dev/day-22-path-loss-breakdown-making-every-signal-path-visible</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-22-path-loss-breakdown-making-every-signal-path-visible</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 14 Apr 2026 04:40:39 GMT</pubDate><content:encoded><![CDATA[<p>ntify late or weak paths.</p>
<h3>3. Data Table</h3>
<p>For exact numeric inspection — useful for researchers.</p>
<p>Together, these views answer a simple but critical question:</p>
<p>👉 <em>Where is the signal actually going?</em></p>
<hr />
<h2>Why This Matters</h2>
<p>Wireless communication is not just about final results.</p>
<p>It’s about understanding propagation.</p>
<p>Before this, a researcher could see a weak signal — but not explain it.</p>
<p>Now:</p>
<ul>
<li><p>You can identify dominant paths</p>
</li>
<li><p>Spot weak reflections</p>
</li>
<li><p>Understand delay spread</p>
</li>
<li><p>Debug unexpected attenuation</p>
</li>
</ul>
<p>This turns Sionna Visualizer from a <strong>result viewer</strong> into an <strong>analysis tool</strong>.</p>
<hr />
<h2>The Bigger Shift</h2>
<p>This feature changes how simulations are interpreted.</p>
<p>From:<br />→ “What is the result?”</p>
<p>To:<br />→ “Why is this the result?”</p>
<p>That difference is everything in research.</p>
<hr />
<h2>What’s Next</h2>
<p>Day 23: Simulation Time Estimation<br />Before running a simulation — estimate how long it will take.</p>
<p>Because once you start thinking like a researcher,<br />time becomes as important as accuracy.</p>
<hr />
<p>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer<br />Live: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>NVIDIA AI Aerial / 6G Developer Program<br />Building in Public — Day 22</p>
]]></content:encoded></item><item><title><![CDATA[Day 21: Simulation Performance Metadata — Now Every Result Shows How Long It Took and What Ran It]]></title><description><![CDATA[Subtitle: Built directly from a real researcher question on Sionna GitHub

This feature started with a GitHub thread.
A researcher asked about Sionna's performance bottlenecks — how long path computat]]></description><link>https://vinayak6g.hashnode.dev/day-21-simulation-performance-metadata-now-every-result-shows-how-long-it-took-and-what-ran-it</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-21-simulation-performance-metadata-now-every-result-shows-how-long-it-took-and-what-ran-it</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Thu, 02 Apr 2026 03:26:46 GMT</pubDate><content:encoded><![CDATA[<p><strong>Subtitle:</strong> Built directly from a real researcher question on Sionna GitHub</p>
<hr />
<p>This feature started with a GitHub thread.</p>
<p>A researcher asked about Sionna's performance bottlenecks — how long path computation takes, what hardware is involved, whether it scales. The thread had replies. No solution. Just researchers agreeing the information wasn't visible anywhere.</p>
<p>Day 21 makes it visible.</p>
<p><strong>What Gets Tracked Now</strong></p>
<p>Every simulation in Sionna Visualizer now returns four performance fields alongside the result:</p>
<ul>
<li><p><strong>Duration</strong> — exact milliseconds from computation start to finish</p>
</li>
<li><p><strong>Memory</strong> — peak RAM consumed during simulation, in MB</p>
</li>
<li><p><strong>Compute type</strong> — CPU or GPU, detected automatically via <a href="http://torch.cuda.is"><code>torch.cuda.is</code></a><code>_available()</code></p>
</li>
<li><p><strong>Sionna version</strong> — the exact library version that produced the result</p>
</li>
</ul>
<p>These aren't estimates. They're measured during the actual run using Python's <code>tracemalloc</code> for memory and <code>time.perf_counter()</code> for duration.</p>
<p><strong>How It Works — Three Layers</strong></p>
<p>The Python FastAPI bridge now wraps every simulation endpoint in a <code>run_with_performance()</code> helper. Before the Sionna math runs — tracemalloc starts, timer starts. After it finishes — everything stops, peak values extracted, packaged into a <code>PerformanceMetadata</code> object attached to the response.</p>
<p>One bug showed up during implementation: <code>tracemalloc</code> returns raw bytes. Converting to MB requires careful float handling — a rounding edge case was causing crashes. Fixed before it could affect anyone.</p>
<p>Java receives the nested performance JSON, maps it through a dedicated <code>PerformanceDto</code>, and saves all four fields to PostgreSQL alongside the simulation result. Every run from today onwards has permanent performance history.</p>
<p>Angular displays a 2x2 card beneath every chart — duration, compute type, memory, Sionna version. When GPU acceleration is detected, the card gets a teal left border. A small visual signal with real meaning for researchers who care about hardware.</p>
<p>The card also appears on shareable links. A researcher sharing results with a colleague can now show not just what the simulation produced — but exactly how it was produced.</p>
<p><strong>Why This Matters for the Community</strong></p>
<p>Sionna is used for research. Research requires reproducibility. Reproducibility requires knowing your compute environment.</p>
<p>Until today, a researcher sharing a Sionna Visualizer link could show their BER curves but not the conditions that generated them. Now both travel together.</p>
<p>When I reply to the GitHub thread that inspired this feature, I'll link directly to a shared result showing the performance card. That's the complete loop — researcher asks question, tool answers it, researcher sees the answer live.</p>
<p>Day 22 is next. Path loss breakdown chart — the most requested feature on Sionna GitHub with 9 replies on a single thread.</p>
<hr />
<p><em>Sionna Visualizer — github.com/Vinu2111/sionna-visualizer</em> <em>Live: [your Vercel URL]</em> <em>NVIDIA AI Aerial / 6G Developer Program</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 20: Performance Optimization — Caching, Cold Start Fix, and the README That Should Have Existed Earlier]]></title><description><![CDATA[Subtitle: Making a production tool feel like a production tool

Building features is the exciting part. But Day 20 was about something different — making everything already built feel fast, reliable, ]]></description><link>https://vinayak6g.hashnode.dev/day-20-performance-optimization-caching-cold-start-fix-and-the-readme-that-should-have-existed-earlier</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-20-performance-optimization-caching-cold-start-fix-and-the-readme-that-should-have-existed-earlier</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Thu, 02 Apr 2026 03:25:42 GMT</pubDate><content:encoded><![CDATA[<p><strong>Subtitle:</strong> Making a production tool feel like a production tool</p>
<hr />
<p>Building features is the exciting part. But Day 20 was about something different — making everything already built feel fast, reliable, and professional.</p>
<p>Three things shipped today. All of them invisible to the end user. All of them essential.</p>
<p><strong>The Problem With No Cache</strong></p>
<p>Every simulation request in Sionna Visualizer followed the same path: Angular → Java → Python → back to Java → PostgreSQL → response. That chain works. But what happens when a researcher runs the same parameters twice?</p>
<p>Without caching: full round trip. Python computes again. Database writes again. User waits again.</p>
<p>Today I added a <code>ConcurrentHashMap</code>-backed cache inside <a href="http://SimulationService.java"><code>SimulationService.java</code></a>. The logic is simple — hash the incoming request parameters into a key, check the map before calling Python. Hit? Return instantly and log it. Miss? Proceed normally and store the result. Cache size capped at 100 entries with timestamp-based eviction when full.</p>
<p>No Redis. No external dependency. Just Java doing what Java does well.</p>
<p><strong>The Cold Start Problem on Railway</strong></p>
<p>Railway free tier is generous. But it has one behavior that can frustrate first-time visitors: services spin down after inactivity. The first request after a quiet period wakes everything up — and that wake-up can take 10-15 seconds.</p>
<p>For a research tool, a 15-second spinner on first load is a trust problem.</p>
<p>The fix: a <code>/warmup</code> endpoint in the Python FastAPI bridge that runs a minimal 3-point BPSK simulation. Fast. Lightweight. Just enough to force the container active. Java now calls this endpoint automatically via <code>@PostConstruct</code> on startup — so Python is warm before any real user arrives.</p>
<p>The Spring Actuator health endpoint now reports <code>"python-bridge": "warm"</code> or <code>"python-bridge": "cold"</code> so you can see the bridge state at any time.</p>
<p><strong>The README That Should Have Existed Earlier</strong></p>
<p>47 features. Live deployment. NVIDIA Forums post. Sionna GitHub Show and Tell. And the README was still basic.</p>
<p>That changes today. The new README has: one-line description, live demo links, plain English explanation of what the tool does, features organized in three columns, tech stack table, 3-step Docker quick start, three curl examples for the public API, screenshot placeholders, and a proper author section.</p>
<p>It won't win a design award. But it will tell a Nokia engineer everything they need to know in 30 seconds.</p>
<p><strong>What Day 20 Taught Me</strong></p>
<p>The features you can see get built first. The infrastructure underneath them — caching, warmup, documentation — feels less exciting to build. But it's the difference between a project that works and a project that's ready.</p>
<p>Day 21 is next. Phase 2A begins — simulation performance metadata, built directly from a real researcher question on Sionna GitHub.</p>
]]></content:encoded></item><item><title><![CDATA[Day 19: Export and Download — Getting Sionna Visualizer Into Research Papers]]></title><description><![CDATA[PNG for figures. CSV for analysis. JSON for Python scripts. Bulk export for entire simulation history. The bridge between a web dashboard and a research workflow.


Quick Links
🔗 Live Demo: https://s]]></description><link>https://vinayak6g.hashnode.dev/day-19-export-and-download-getting-sionna-visualizer-into-research-papers</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-19-export-and-download-getting-sionna-visualizer-into-research-papers</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Thu, 02 Apr 2026 03:23:44 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>PNG for figures. CSV for analysis. JSON for Python scripts. Bulk export for entire simulation history. The bridge between a web dashboard and a research workflow.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 📚 <strong>API Docs:</strong> <a href="https://sionna-visualizer.vercel.app/api-docs">https://sionna-visualizer.vercel.app/api-docs</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>Why Export Matters More Than Features</h2>
<p>A researcher can run a beautiful BER vs SNR simulation on Sionna Visualizer. They can see the two-curve logarithmic chart. They can share it with a public link.</p>
<p>But if they cannot get that data out of the browser and into their paper — the tool stops at the browser. Day 19 removes that boundary.</p>
<p>Every simulation result can now leave the dashboard in four formats. Each format serves a different research workflow.</p>
<hr />
<h2>The Four Export Formats</h2>
<h3>PNG — For Paper Figures</h3>
<p>One click. The exact chart as rendered — dark theme, teal and coral curves, logarithmic axes, legend — downloads as a high-quality PNG.</p>
<p>Filename is automatically generated with simulation parameters:</p>
<ul>
<li><p><code>sionna-ber-snr-QPSK-2026-03-21.png</code></p>
</li>
<li><p><code>sionna-beam-pattern-16ant-2026-03-21.png</code></p>
</li>
<li><p><code>sionna-channel-capacity-2026-03-21.png</code></p>
</li>
</ul>
<p>Using Chart.js <code>toBase64Image()</code> at full quality. No server round-trip. Instant download.</p>
<h3>CSV — For Excel and MATLAB Analysis</h3>
<p>Every data point exported as a clean CSV with metadata headers:</p>
<pre><code class="language-csv"># Sionna Visualizer — BER vs SNR
# Modulation: QPSK, Code Rate: 0.5, SNR Range: -5 to 20 dB
snr_db,ber_theoretical,ber_simulated
-5.0,0.21322,0.21422
-3.96,0.18497,0.18419
...
</code></pre>
<p>BOM character at the start ensures the file opens cleanly in Excel without encoding issues. Works on Windows, Mac, Linux.</p>
<h3>JSON — For Python Scripts</h3>
<p>The complete raw simulation result with a metadata header:</p>
<pre><code class="language-json">{
  "_metadata": {
    "exported_from": "Sionna Visualizer",
    "export_date": "2026-03-21T10:30:00Z",
    "live_url": "https://sionna-visualizer.vercel.app",
    "github": "https://github.com/Vinu2111/sionna-visualizer",
    "simulation_type": "BER_SNR"
  },
  "modulation": "QPSK",
  "snr_db": [-5.0, ...],
  "ber_theoretical": [0.2132, ...],
  "ber_simulated": [0.2142, ...]
}
</code></pre>
<p>A researcher downloads this, loads it in Python with <code>json.load()</code>, and has all the data ready to plot with matplotlib in seconds.</p>
<h3>Copy JSON — For Jupyter Notebooks</h3>
<p>Faster than downloading. Click Copy JSON. The full result is on the clipboard. Paste directly into a Jupyter notebook cell. No file management.</p>
<hr />
<h2>History Page Bulk Export</h2>
<p>For researchers who run many simulations in a session:</p>
<p><strong>Export Selected</strong> — check any simulations in history, click Export Selected, choose CSV or JSON, all files download with 200ms delay between each to prevent browser blocking.</p>
<p><strong>Export All</strong> — one click downloads a single combined JSON file containing every simulation in history:</p>
<pre><code class="language-json">{
  "_metadata": { ... },
  "total_simulations": 12,
  "simulations": [
    { BER_SNR result },
    { BEAM_PATTERN result },
    ...
  ]
}
</code></pre>
<p>This file is the complete research session. Load it once. Process all results.</p>
<hr />
<h2>Export on the Share Page</h2>
<p>The public shareable results page now shows three export buttons visible to everyone — no login required.</p>
<p>A researcher shares a simulation link with a colleague. The colleague opens it, sees the chart, and downloads the raw data directly. No account needed. No barriers.</p>
<p>This is what makes shareable links genuinely useful for collaboration rather than just screenshot sharing.</p>
<hr />
<h2>The Export Service Architecture</h2>
<p>All export logic lives in a single Angular service: <code>ExportService</code>.</p>
<p>Four methods — one per simulation type:</p>
<ul>
<li><p><code>generateBerCsv(result)</code> — formats BER data</p>
</li>
<li><p><code>generateBeamCsv(result)</code> — formats angle/pattern data</p>
</li>
<li><p><code>generateModComparisonCsv(result)</code> — formats four modulation columns</p>
</li>
<li><p><code>generateCapacityCsv(result)</code> — formats capacity curves per bandwidth</p>
</li>
</ul>
<p>Plus two utility methods:</p>
<ul>
<li><p><code>downloadCSV(filename, content)</code> — triggers browser download</p>
</li>
<li><p><code>downloadJSON(filename, data)</code> — triggers browser download</p>
</li>
</ul>
<p>No backend changes needed. All exports generated client-side in Angular. Zero server load.</p>
<hr />
<h2>Why This Gets You Citations</h2>
<p>Here is the research workflow that Day 19 enables:</p>
<ol>
<li><p>Researcher opens Sionna Visualizer</p>
</li>
<li><p>Runs QPSK BER vs SNR simulation</p>
</li>
<li><p>Downloads JSON result</p>
</li>
<li><p>Loads JSON in Python script</p>
</li>
<li><p>Generates plot for their paper</p>
</li>
<li><p>Paper gets submitted</p>
</li>
<li><p>Paper cites the tool that provided the baseline simulation data</p>
</li>
</ol>
<p>That citation is what builds academic reputation. That citation is what NVIDIA notices. That citation is what Nokia engineers see when they read papers.</p>
<p>Export features are not convenience features. They are the path to academic recognition.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<ol>
<li><p>Run any simulation</p>
</li>
<li><p>Click Download PNG — save the chart</p>
</li>
<li><p>Click Download CSV — open in Excel</p>
</li>
<li><p>Click Download JSON — load in Python</p>
</li>
<li><p>Go to History — click Export All</p>
</li>
<li><p>Open the JSON — your complete research session</p>
</li>
</ol>
<hr />
<h2>Tech Stack</h2>
<p>Angular 17 · Chart.js · Angular Material · Java 17 · Spring Boot 3 · PostgreSQL · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 20</h2>
<p>Performance optimization and README update. Caching frequent simulations, optimizing Railway cold starts, and updating the GitHub README with all new features, screenshots, and API documentation. After Day 20 the GitHub repo looks complete and impressive to anyone who discovers it.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[ Day 18: Shannon Channel Capacity is Now Interactive — The Most Important Equation in 6G]]></title><description><![CDATA[C = B × log₂(1 + SNR). Four bandwidth curves. Two charts. Four insight cards. The theoretical foundation of all wireless communications — now live on the dashboard.


Quick Links
🔗 Live Demo: https:/]]></description><link>https://vinayak6g.hashnode.dev/day-18-shannon-channel-capacity-is-now-interactive-the-most-important-equation-in-6g</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-18-shannon-channel-capacity-is-now-interactive-the-most-important-equation-in-6g</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Mon, 30 Mar 2026 03:37:07 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>C = B × log₂(1 + SNR). Four bandwidth curves. Two charts. Four insight cards. The theoretical foundation of all wireless communications — now live on the dashboard.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 📚 <strong>API Docs:</strong> <a href="https://sionna-visualizer.vercel.app/api-docs">https://sionna-visualizer.vercel.app/api-docs</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>The Equation Behind Every 6G Design Decision</h2>
<p>In 1948, Claude Shannon proved that every communication channel has a theoretical maximum data rate. No matter how clever your modulation or coding scheme — you cannot exceed this limit.</p>
<p>The formula:</p>
<pre><code class="language-plaintext">C = B × log₂(1 + SNR)
</code></pre>
<p>Where:</p>
<ul>
<li><p><strong>C</strong> = channel capacity in bits per second</p>
</li>
<li><p><strong>B</strong> = bandwidth in Hz</p>
</li>
<li><p><strong>SNR</strong> = signal to noise ratio (linear)</p>
</li>
</ul>
<p>This single equation determines:</p>
<ul>
<li><p>Why 6G uses mmWave frequencies (more bandwidth = more capacity)</p>
</li>
<li><p>Why 5G/6G base stations are placed closer together (higher SNR)</p>
</li>
<li><p>What the absolute maximum throughput of any wireless link is</p>
</li>
<li><p>Why increasing bandwidth by 10x matters more than increasing SNR</p>
</li>
</ul>
<p>Every 6G system designer works with this equation daily. Today I made it interactive.</p>
<hr />
<h2>What the Dashboard Shows</h2>
<h3>Chart 1 — Capacity vs SNR</h3>
<p>Four curves — one per bandwidth:</p>
<ul>
<li><p><strong>10 MHz</strong> (white) — Sub-6GHz basic</p>
</li>
<li><p><strong>100 MHz</strong> (teal) — Sub-6GHz 6G baseline</p>
</li>
<li><p><strong>400 MHz</strong> (yellow) — mmWave 6G</p>
</li>
<li><p><strong>1000 MHz</strong> (coral) — mmWave wide channel</p>
</li>
</ul>
<p>Two horizontal reference lines at 1 Gbps and 10 Gbps show the 6G design targets. The intersection of each bandwidth curve with these lines tells you exactly what SNR you need to hit those targets.</p>
<h3>Chart 2 — Spectral Efficiency</h3>
<p>A single curve showing bits/s/Hz vs SNR — bandwidth independent. This is the fundamental efficiency limit of any modulation scheme. At SNR = 20 dB, the maximum spectral efficiency is approximately 6.66 bits/s/Hz. No modulation can exceed this — not BPSK, not 64QAM, not anything invented in the future.</p>
<hr />
<h2>The Four Insight Cards</h2>
<p>Below the charts, four cards answer the exact questions 6G system designers ask:</p>
<p><strong>SNR for 1 Gbps @ 100 MHz</strong> The minimum SNR needed to achieve the 6G baseline throughput target on a standard sub-6GHz channel. This is the design floor for 6G base station placement.</p>
<p><strong>SNR for 10 Gbps @ 1 GHz</strong> The minimum SNR needed to achieve peak 6G throughput on a wide mmWave channel. This is why 6G mmWave cells need line-of-sight conditions.</p>
<p><strong>Spectral Efficiency @ SNR 20 dB</strong> The theoretical maximum bits per Hz at a comfortable SNR. Every real modulation scheme operates below this line.</p>
<p><strong>10x Bandwidth Gain</strong> How much capacity multiplier you get from increasing bandwidth by 10x vs increasing SNR. Bandwidth wins every time — this is why 6G went to mmWave.</p>
<hr />
<h2>The Python Math</h2>
<pre><code class="language-python">import numpy as np

def channel_capacity(snr_db, bandwidth_mhz):
    # Convert SNR from dB to linear
    snr_linear = 10 ** (snr_db / 10)
    # Shannon formula
    capacity_bps = bandwidth_mhz * 1e6 * np.log2(1 + snr_linear)
    # Convert to Gbps
    return capacity_bps / 1e9
</code></pre>
<p>Four lines. The most important formula in telecommunications. Running in 94ms on Railway free tier.</p>
<hr />
<h2>What Changed Across the Stack</h2>
<p><strong>Python Bridge</strong></p>
<ul>
<li><p>New file: channel_capacity.py</p>
</li>
<li><p>Shannon formula for 4 bandwidth curves simultaneously</p>
</li>
<li><p>Spectral efficiency computation</p>
</li>
<li><p>Automatic insight calculation</p>
</li>
<li><p>New endpoint: POST /simulate/channel-capacity</p>
</li>
</ul>
<p><strong>Java Backend</strong></p>
<ul>
<li><p>ChannelCapacityRequestDto and ResultDto</p>
</li>
<li><p>3 new JSON columns on SimulationResult entity</p>
</li>
<li><p>simulation_type = CHANNEL_CAPACITY</p>
</li>
<li><p>New endpoint: POST /api/simulations/channel-capacity</p>
</li>
<li><p>Public API: POST /v1/api/simulate/channel-capacity</p>
</li>
</ul>
<p><strong>Angular 17</strong></p>
<ul>
<li><p>Fourth tab on dashboard: Shannon Capacity</p>
</li>
<li><p>Bandwidth checkboxes to toggle curves</p>
</li>
<li><p>Two Chart.js charts side by side</p>
</li>
<li><p>Four insight cards with real 6G values</p>
</li>
<li><p>Blue history badge: Capacity</p>
</li>
<li><p>API docs updated with new endpoint</p>
</li>
</ul>
<hr />
<h2>The Dashboard Now Has Four Simulation Types</h2>
<p><strong>Tab 1 — BER vs SNR:</strong> Error performance. AWGN + Monte Carlo. <strong>Tab 2 — Beam Pattern:</strong> Antenna directivity. ULA model. <strong>Tab 3 — Modulation Comparison:</strong> Spectral efficiency tradeoff. <strong>Tab 4 — Shannon Capacity:</strong> Theoretical maximum throughput.</p>
<p>These four cover the four most important concepts in 6G physical layer research. Any researcher working on 6G needs all four regularly.</p>
<hr />
<h2>Use It Via the API</h2>
<pre><code class="language-python">import requests

response = requests.post(
    "https://sionna-visualizer-production-50ae.up.railway.app/v1/api/simulate/channel-capacity",
    headers={"X-API-Key": "sk-sionna-your-key"},
    json={
        "snr_min": -10,
        "snr_max": 30,
        "snr_steps": 50,
        "bandwidths_mhz": [100, 400, 1000]
    }
)
result = response.json()
print(f"SNR for 1Gbps on 100MHz: "
      f"{result['insights']['snr_for_1gbps_100mhz']:.1f} dB")
</code></pre>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<ol>
<li><p>Login and click the Shannon Capacity tab</p>
</li>
<li><p>Keep all 4 bandwidths checked</p>
</li>
<li><p>Click Compute Capacity</p>
</li>
<li><p>Watch the logarithmic curves appear</p>
</li>
<li><p>Read the insight cards</p>
</li>
<li><p>Uncheck 10 MHz and 100 MHz</p>
</li>
<li><p>See only the mmWave curves</p>
</li>
<li><p>Notice how much more capacity mmWave provides</p>
</li>
</ol>
<hr />
<h2>Tech Stack</h2>
<p>Python 3.10 · NumPy · FastAPI · Java 17 · Spring Boot 3 · PostgreSQL · Angular 17 · Chart.js · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 19</h2>
<p>Export and Download features. Let researchers download their simulation results as PNG, CSV, and PDF. One click. No copy-paste. This is what makes the tool useful for writing papers.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 17: Sionna Visualizer Now Has a Public REST API]]></title><description><![CDATA[Any researcher can now call real 6G simulations directly from their Python script. No browser. No login. Just an API key and one HTTP request.


Quick Links
🔗 Live Demo: https://sionna-visualizer.ver]]></description><link>https://vinayak6g.hashnode.dev/day-17-sionna-visualizer-now-has-a-public-rest-api</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-17-sionna-visualizer-now-has-a-public-rest-api</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Mon, 30 Mar 2026 03:35:07 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Any researcher can now call real 6G simulations directly from their Python script. No browser. No login. Just an API key and one HTTP request.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 📚 <strong>API Docs:</strong> <a href="https://sionna-visualizer.vercel.app/api-docs">https://sionna-visualizer.vercel.app/api-docs</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>The Shift From Website to Platform</h2>
<p>Days 1 through 16 built a web dashboard. You open a browser, run simulations, see charts. That's useful. But researchers don't live in browsers. They live in Python scripts, Jupyter notebooks, and terminal windows.</p>
<p>Day 17 meets them where they are.</p>
<p>Sionna Visualizer now has a public REST API. Any researcher with an API key can call real 6G simulations programmatically and get results back as JSON in milliseconds.</p>
<hr />
<h2>What You Can Do Right Now</h2>
<pre><code class="language-python">import requests
import matplotlib.pyplot as plt

API_KEY = "sk-sionna-your-key-here"
BASE_URL = "https://sionna-visualizer-production-50ae.up.railway.app"

# Run a real BER vs SNR simulation
response = requests.post(
    f"{BASE_URL}/v1/api/simulate/ber-snr",
    headers={"X-API-Key": API_KEY},
    json={
        "modulation_order": 4,
        "code_rate": 0.5,
        "snr_min": -5.0,
        "snr_max": 20.0,
        "snr_steps": 25
    }
)

result = response.json()

# Plot directly in your research script
plt.semilogy(result['snr_db'], result['ber_theoretical'],
             '--', label='Theoretical')
plt.semilogy(result['snr_db'], result['ber_simulated'],
             '-', label='Simulated')
plt.xlabel('SNR (dB)')
plt.ylabel('BER')
plt.title(f"BER vs SNR — {result['modulation']}")
plt.legend()
plt.grid(True)
plt.show()
</code></pre>
<p>That's it. One API call. Real simulation. Ready to plot in your paper.</p>
<hr />
<h2>The Three API Endpoints</h2>
<p><strong>POST /v1/api/simulate/ber-snr</strong> Real AWGN simulation. Returns theoretical and Monte Carlo BER curves for BPSK, QPSK, 16QAM, or 64QAM.</p>
<p><strong>POST /v1/api/simulate/beam-pattern</strong> Real ULA antenna simulation. Returns beam pattern data for 8 to 128 antenna elements at any frequency from 1 to 100 GHz.</p>
<p><strong>POST /v1/api/simulate/modulation-comparison</strong> All four modulations simultaneously. Returns crossover points and spectral efficiency data.</p>
<p><strong>GET /v1/api/health</strong> No auth required. Returns API status and available simulations.</p>
<hr />
<h2>How Authentication Works</h2>
<p>The API uses API key authentication — simpler than OAuth, appropriate for research use.</p>
<ol>
<li><p>Register at <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
</li>
<li><p>Go to Dashboard → API Keys tab</p>
</li>
<li><p>Click Generate Key — give it a description</p>
</li>
<li><p>Copy your key: <code>sk-sionna-xxxxxxxxxxxxxxxx</code></p>
</li>
<li><p>Add it to every request as a header: <code>X-API-Key: sk-sionna-xxx</code></p>
</li>
</ol>
<p>Each key allows 100 requests per day on the free tier. Keys can be revoked from the dashboard at any time.</p>
<hr />
<h2>What Was Built</h2>
<p><strong>Java Backend</strong></p>
<ul>
<li><p>ApiKey entity — stored in PostgreSQL with usage tracking</p>
</li>
<li><p>ApiKeyRepository and ApiKeyService</p>
</li>
<li><p>ApiKeyAuthFilter — validates X-API-Key header on all /v1/api/** routes</p>
</li>
<li><p>PublicApiController — three simulation endpoints plus health check</p>
</li>
<li><p>ApiKeyController — generate, list, and revoke keys (JWT protected)</p>
</li>
<li><p>Bucket4j rate limiting — 100 requests per day per API key</p>
</li>
<li><p>HTTP 401 for invalid keys with docs link in response</p>
</li>
</ul>
<p><strong>Angular Frontend</strong></p>
<ul>
<li><p>/api-docs page — publicly accessible, no login required</p>
</li>
<li><p>Python code examples with syntax highlighting</p>
</li>
<li><p>Endpoint reference tables with request/response schemas</p>
</li>
<li><p>API Keys tab on dashboard — generate, view stats, revoke</p>
</li>
<li><p>API link added to navigation</p>
</li>
</ul>
<hr />
<h2>The API Docs Page</h2>
<p>Every serious API needs documentation. The /api-docs page at <a href="https://sionna-visualizer.vercel.app/api-docs">https://sionna-visualizer.vercel.app/api-docs</a> is publicly accessible — no login required.</p>
<p>It includes the Python quick start example, full endpoint reference with parameter tables, authentication guide, and live API key management for logged-in users.</p>
<hr />
<h2>Why This Matters for Researchers</h2>
<p>A researcher using Sionna for their paper now has two options:</p>
<p><strong>Before Day 17:</strong> Install Python, install Sionna, write simulation code, debug GPU dependencies, generate plot manually.</p>
<p><strong>After Day 17:</strong> <code>pip install requests</code> → one API call → results in 94ms.</p>
<p>For baseline AWGN simulations — which appear in virtually every 6G paper as the reference point — this saves hours of setup work.</p>
<hr />
<h2>Get Your API Key</h2>
<p>📚 Full docs: <a href="https://sionna-visualizer.vercel.app/api-docs">https://sionna-visualizer.vercel.app/api-docs</a> 🔗 Register: <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<hr />
<h2>Tech Stack</h2>
<p>Java 17 · Spring Boot 3 · Bucket4j · Spring Security · PostgreSQL · Python FastAPI · Angular 17 · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 18</h2>
<p>Channel Capacity Visualization. Shannon's theorem — C = B × log2(1 + SNR). A fourth simulation type showing the theoretical maximum data rate vs SNR for different bandwidths. Every 6G researcher knows this formula. Seeing it interactive on a dashboard is genuinely useful.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> *GitHub: github.com/Vinu2111/sionn</p>
]]></content:encoded></item><item><title><![CDATA[Day 16: Production Hardening — Making Sionna Visualizer Ready for Real Research Traffic]]></title><description><![CDATA[Rate limiting. Circuit breaker. Input validation. Security headers. Health checks. The unglamorous work that keeps a server running when real users arrive.


Quick Links
🔗 Live Demo: https://sionna-v]]></description><link>https://vinayak6g.hashnode.dev/day-16-production-hardening-making-sionna-visualizer-ready-for-real-research-traffic</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-16-production-hardening-making-sionna-visualizer-ready-for-real-research-traffic</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Fri, 27 Mar 2026 14:25:30 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Rate limiting. Circuit breaker. Input validation. Security headers. Health checks. The unglamorous work that keeps a server running when real users arrive.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>Why Day 16 Happened</h2>
<p>Yesterday I posted Sionna Visualizer in the NVIDIA Aerial Developer Forums. 2,000+ researchers and engineers from Nokia, Ericsson, Samsung, IIT, and MIT are active there.</p>
<p>If even a fraction of them open the link and start sharing it with their labs — the server needs to handle that. Before Day 16, it couldn't. A handful of simultaneous simulation requests could slow Railway to a crawl.</p>
<p>Day 16 fixed that. No new features. Just making the server robust.</p>
<hr />
<h2>What Was Hardened</h2>
<h3>Rate Limiting</h3>
<p>Using Bucket4j, every IP address is now limited to 10 simulation requests per minute. If the limit is exceeded, the server returns HTTP 429 with:</p>
<pre><code class="language-plaintext">"Too many requests. Please wait before running another simulation."
</code></pre>
<p>Three response headers tell the client exactly where they stand:</p>
<ul>
<li><p>X-RateLimit-Limit: 10</p>
</li>
<li><p>X-RateLimit-Remaining: [remaining]</p>
</li>
<li><p>X-RateLimit-Reset: [seconds until reset]</p>
</li>
</ul>
<p>This prevents a single user from accidentally or intentionally hammering the Python bridge.</p>
<h3>Input Validation</h3>
<p>Before today, sending <code>snr_min: 999</code> or <code>num_antennas: -5</code> to the API would cause unpredictable behavior in the Python simulation. Now every request is validated before it reaches the Python bridge:</p>
<ul>
<li><p>SNR range: -20.0 to 40.0 dB</p>
</li>
<li><p>SNR steps: 10 to 100</p>
</li>
<li><p>Antenna count: 2 to 128</p>
</li>
<li><p>Steering angle: -90.0 to 90.0 degrees</p>
</li>
<li><p>Frequency: 1.0 to 100.0 GHz</p>
</li>
</ul>
<p>Invalid input returns HTTP 400 with the exact field that failed. No stack traces exposed. No internal errors leaked.</p>
<h3>Circuit Breaker</h3>
<p>Using Resilience4j, the Java backend now has a circuit breaker wrapping every call to the Python bridge.</p>
<p>If the Python bridge fails 5 out of 10 consecutive calls, the circuit opens. For the next 30 seconds, Java stops calling Python entirely and immediately returns HTTP 503:</p>
<pre><code class="language-plaintext">"Simulation engine is temporarily unavailable.
Please try again in 30 seconds."
</code></pre>
<p>This prevents the Java backend from hanging on every request while Python is recovering. The circuit tries again after 30 seconds automatically.</p>
<h3>Request Timeout</h3>
<p>The Python bridge now enforces a 30-second timeout on every simulation. If computation exceeds that, it returns HTTP 408:</p>
<pre><code class="language-plaintext">"Simulation timed out. Try reducing the number of SNR steps."
</code></pre>
<p>All FastAPI endpoints converted to async using anyio for proper timeout handling.</p>
<h3>Security Headers</h3>
<p>Every HTTP response now includes:</p>
<ul>
<li><p>X-Content-Type-Options: nosniff</p>
</li>
<li><p>X-Frame-Options: DENY</p>
</li>
<li><p>X-XSS-Protection: 1; mode=block</p>
</li>
<li><p>Referrer-Policy: strict-origin-when-cross-origin</p>
</li>
</ul>
<p>CORS updated from wildcard <code>*</code> to explicitly allow only:</p>
<ul>
<li><p><a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
</li>
<li><p><a href="http://localhost:4200">http://localhost:4200</a></p>
</li>
</ul>
<h3>Health Checks</h3>
<p>Java backend exposes <code>/actuator/health</code> — Railway uses this to monitor the service and restart it automatically if it goes down.</p>
<p>Python bridge exposes <code>/health</code> returning:</p>
<pre><code class="language-json">{
  "status": "healthy",
  "service": "sionna-python-bridge",
  "version": "1.0.0"
}
</code></pre>
<h3>Angular Error Handling Update</h3>
<p>The Angular interceptor now shows specific snackbar messages for each new error type:</p>
<ul>
<li><p>429: "Too many simulations. Please wait 1 minute."</p>
</li>
<li><p>503: "Simulation engine temporarily unavailable. Try in 30 seconds."</p>
</li>
<li><p>408: "Simulation timed out. Try fewer SNR points."</p>
</li>
<li><p>400: Shows the specific validation error from the backend</p>
</li>
</ul>
<hr />
<h2>The Principle Behind Day 16</h2>
<p>Features get people to try your product. Polish gets people to trust your product. Hardening keeps your product running when people actually use it.</p>
<p>All three matter. In that order.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<hr />
<h2>Tech Stack</h2>
<p>Java 17 · Spring Boot 3 · Bucket4j · Resilience4j · Jakarta Validation · Python FastAPI · anyio · Angular 17 · PostgreSQL · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 17</h2>
<p>REST API for researchers. A public endpoint that lets anyone POST simulation parameters and get results back as JSON — no login required. Researchers can integrate Sionna Visualizer directly into their Python scripts.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 15: Simulation Comparison Tool — Compare Any Two 6G Simulations on One Chart]]></title><description><![CDATA[Run two configurations. Select both from history. Click Compare. See which one wins — automatically.


Quick Links
🔗 Live Demo: https://sionna-visualizer.vercel.app 🐙 GitHub: https://github.com/Vinu]]></description><link>https://vinayak6g.hashnode.dev/day-15-simulation-comparison-tool-compare-any-two-6g-simulations-on-one-chart</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-15-simulation-comparison-tool-compare-any-two-6g-simulations-on-one-chart</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Wed, 25 Mar 2026 15:29:00 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>Run two configurations. Select both from history. Click Compare. See which one wins — automatically.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>The Feature Researchers Actually Need</h2>
<p>Every 6G researcher faces the same problem constantly. They run a simulation with one configuration. Then they change one parameter — different modulation, more antennas, different frequency — and run it again. Then they need to compare both results.</p>
<p>Before today, that comparison happened manually. Export the data, open Excel or Python, plot both curves on the same axes, visually inspect which is better. That's 10 minutes of work every single time.</p>
<p>Today I added a comparison tool that does it in 3 clicks.</p>
<hr />
<h2>How It Works</h2>
<p><strong>Step 1:</strong> Run any two simulations from the dashboard.</p>
<p><strong>Step 2:</strong> Go to the History page. Select both using the checkboxes. The first selection highlights teal. The second highlights coral.</p>
<p><strong>Step 3:</strong> Click the purple "Compare Selected" button.</p>
<p><strong>Step 4:</strong> The comparison page loads with both results overlaid on one chart and a winner card at the bottom.</p>
<p>That's it.</p>
<hr />
<h2>The Overlay Chart</h2>
<p>For BER vs SNR comparisons, the chart shows four lines simultaneously:</p>
<ul>
<li><p><strong>Teal dashed</strong> — Simulation A theoretical BER</p>
</li>
<li><p><strong>Teal solid</strong> — Simulation A simulated BER</p>
</li>
<li><p><strong>Coral dashed</strong> — Simulation B theoretical BER</p>
</li>
<li><p><strong>Coral solid</strong> — Simulation B simulated BER</p>
</li>
</ul>
<p>Both simulations share the same logarithmic Y axis and SNR X axis. The visual separation between teal and coral makes it immediately obvious which configuration performs better at any given SNR.</p>
<p>For beam pattern comparisons, both ULA patterns overlay on the same polar chart. Teal for Simulation A. Coral for Simulation B. Narrower main lobe = better beamforming = immediately visible.</p>
<hr />
<h2>The Winner Card</h2>
<p>Below the chart, a winner card computes the result automatically.</p>
<p>For BER vs SNR: the algorithm compares both theoretical BER arrays at SNR = 20 dB. Lower BER at high SNR = better performance. The card shows: <em>"Simulation A achieves lower BER at high SNR"</em></p>
<p>For beam patterns: the algorithm compares main_lobe_width values. Narrower beam = more focused signal = better beamforming. The card shows: <em>"Simulation B has narrower main lobe — 8.0° vs 14.2°"</em></p>
<p>No manual calculation. No spreadsheet. The answer is right there.</p>
<hr />
<h2>What Changed Across the Stack</h2>
<p><strong>Java Backend</strong></p>
<ul>
<li><p>New endpoint: GET /api/simulations/compare?id1=X&amp;id2=Y</p>
</li>
<li><p>ComparisonResponseDto with ComparisonMetadata</p>
</li>
<li><p>can_overlay flag: true when both simulations are same type</p>
</li>
<li><p>Security validation: users can only compare their own simulations</p>
</li>
</ul>
<p><strong>Angular Frontend</strong></p>
<ul>
<li><p>New page: /compare with three sections</p>
</li>
<li><p>Selection panel: dual MatSelect dropdowns from history</p>
</li>
<li><p>Dynamic overlay chart: 4 lines for BER, 2 lines for beam</p>
</li>
<li><p>Side by side metrics grid for all parameters</p>
</li>
<li><p>Winner computation card at bottom</p>
</li>
<li><p>Share This Comparison button copies URL to clipboard</p>
</li>
<li><p>Empty state when no simulations exist yet</p>
</li>
</ul>
<p><strong>History Page Upgrade</strong></p>
<ul>
<li><p>MatCheckbox column with maximum 2 selections</p>
</li>
<li><p>Teal highlight for Simulation A selection</p>
</li>
<li><p>Coral highlight for Simulation B selection</p>
</li>
<li><p>Purple Compare Selected button — enabled only when exactly 2 selected</p>
</li>
<li><p>Compare icon button on each row for quick single-click compare</p>
</li>
<li><p>Snackbar warning if user tries to select a third simulation</p>
</li>
</ul>
<p><strong>Navigation</strong></p>
<ul>
<li>Compare link added to nav menu with compare_arrows icon</li>
</ul>
<hr />
<h2>Shareable Comparison Links</h2>
<p>The comparison page URL itself is the share link:</p>
<pre><code class="language-plaintext">https://sionna-visualizer.vercel.app/compare?id1=42&amp;id2=67
</code></pre>
<p>Copy it. Send it to a colleague. They open it and see the exact same comparison chart. No login required if both simulations have public share UUIDs enabled.</p>
<p>This is what makes the tool genuinely useful for research collaboration.</p>
<hr />
<h2>The Complete Dashboard — Day 15 State</h2>
<p><strong>Three simulation types:</strong></p>
<ul>
<li><p>BER vs SNR — real AWGN + Monte Carlo</p>
</li>
<li><p>Beam Pattern — real ULA antenna math</p>
</li>
<li><p>Modulation Comparison — all four modulations</p>
</li>
</ul>
<p><strong>Full UX polish:</strong></p>
<ul>
<li><p>Loading states on every action</p>
</li>
<li><p>Error handling for all failure modes</p>
</li>
<li><p>Empty states for new users</p>
</li>
<li><p>Mobile responsive layout</p>
</li>
</ul>
<p><strong>Comparison tool:</strong></p>
<ul>
<li><p>Any two saved simulations</p>
</li>
<li><p>Overlay chart with winner computation</p>
</li>
<li><p>Shareable comparison URLs</p>
</li>
</ul>
<p>All saving to PostgreSQL. All generating shareable links. Live on Railway + Vercel.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<ol>
<li><p>Register and run a QPSK simulation</p>
</li>
<li><p>Run a 16QAM simulation</p>
</li>
<li><p>Go to History</p>
</li>
<li><p>Select both using checkboxes</p>
</li>
<li><p>Click Compare Selected</p>
</li>
<li><p>See which modulation performs better at high SNR</p>
</li>
</ol>
<hr />
<h2>Tech Stack</h2>
<p>Angular 17 · Angular Material · Chart.js · Java 17 · Spring Boot 3 · Spring Security · JWT · PostgreSQL · Python FastAPI · Railway · Vercel</p>
<hr />
<h2>What's Next</h2>
<p>Days 11 through 15 are complete. The core product is done.</p>
<p>Next focus: getting real researchers to use it. NVIDIA Aerial Forums post with live URL. GitHub stars. First external user feedback.</p>
<p>The build phase is complete. The distribution phase begins.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 14: UI Polish — Making Sionna Visualizer Feel Like a Real Product]]></title><description><![CDATA[No new simulation features today. Loading states, error handling, empty states, mobile layout, visual consistency. This is what separates a demo from a product.


Quick Links
🔗 Live Demo: https://sio]]></description><link>https://vinayak6g.hashnode.dev/day-14-ui-polish-making-sionna-visualizer-feel-like-a-real-product</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-14-ui-polish-making-sionna-visualizer-feel-like-a-real-product</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Tue, 24 Mar 2026 03:55:33 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>No new simulation features today. Loading states, error handling, empty states, mobile layout, visual consistency. This is what separates a demo from a product.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>Why UI Polish Matters More Than Features</h2>
<p>Days 11, 12, and 13 were about features. Real AWGN simulation. Beam pattern visualization. Modulation comparison. The core simulation engine is now solid.</p>
<p>But features alone don't make a product feel complete. When a researcher lands on your site and clicks Run Simulation — what happens during the 2 seconds it takes to compute? Before today: nothing. The button just sat there. The user had no idea if it was working.</p>
<p>That's not a feature problem. That's a trust problem. Day 14 fixed every trust problem.</p>
<hr />
<h2>What Was Built</h2>
<h3>Loading States</h3>
<p>Every simulation button now shows a MatProgressSpinner while the Python bridge is computing. The button text changes to "Running..." and disables to prevent double-clicks. The dashboard page shows skeleton loader cards on initial load. The history page shows a centered spinner while fetching from PostgreSQL.</p>
<p>Small change. Massive difference in how the product feels.</p>
<h3>Error Handling</h3>
<p>Four types of errors now handled gracefully:</p>
<p><strong>Simulation errors</strong> — MatSnackBar notification at bottom center. Red background. "Simulation failed. Please try again." Dismissable. 5 seconds.</p>
<p><strong>Backend unreachable</strong> — Error card replaces the chart area with a wifi_off icon and a Retry button. No more silent blank screen.</p>
<p><strong>Session expired</strong> — Auth interceptor catches every 401/403 response automatically. Logs the user out, shows "Your session expired. Please log in again." and redirects to login.</p>
<p><strong>Form validation</strong> — SNR Min must be less than SNR Max. Inline red hint text appears if invalid. Run button disabled until form is valid.</p>
<h3>Empty States</h3>
<p>When a researcher registers for the first time and has no simulation history — they now see a proper empty state with a large icon, a friendly message, and a "Run First Simulation" button that navigates directly to the dashboard.</p>
<p>The dashboard tabs each show a dashed placeholder before any simulation has been run. The shareable link page shows a clean 404 state if the UUID doesn't exist.</p>
<p>Empty states tell the user what to do next. Without them, blank pages feel broken.</p>
<h3>Mobile Responsive Layout</h3>
<p>The entire dashboard now works on a 375px mobile screen:</p>
<ul>
<li><p>Hamburger menu with MatSidenav — nav links collapse into a side drawer</p>
</li>
<li><p>Tab labels shortened: "BER/SNR", "Beam", "Compare"</p>
</li>
<li><p>Charts resize responsively, minimum 300px height</p>
</li>
<li><p>Parameter forms stack vertically, full width inputs</p>
</li>
<li><p>History table scrolls horizontally, important columns always visible</p>
</li>
</ul>
<h3>Visual Consistency</h3>
<p>Global CSS tokens defined in styles.scss:</p>
<ul>
<li><p>Primary: #64ffda</p>
</li>
<li><p>Error: #ff6b6b</p>
</li>
<li><p>Warning: #f7b731</p>
</li>
<li><p>Background: #0a0e1a</p>
</li>
<li><p>Card background: #0d1117</p>
</li>
</ul>
<p>All cards now have 12px border radius, subtle teal border, and a hover effect that brightens the border. Page transitions use a 200ms fade-in animation on every route change.</p>
<h3>Landing Page</h3>
<p>Three feature cards added below the hero:</p>
<ul>
<li><p>Real 6G Simulations</p>
</li>
<li><p>Share with One Link</p>
</li>
<li><p>Full History</p>
</li>
</ul>
<p>Stats bar: "3 Simulation Types · Real 6G Mathematics · Powered by NVIDIA Sionna · Free to Use"</p>
<p>Footer with GitHub, Hashnode, and Twitter links.</p>
<hr />
<h2>The Principle Behind Day 14</h2>
<p>Features get people to try your product. Polish gets people to trust it.</p>
<p>A researcher who runs a simulation and sees a smooth loading spinner trusts the tool more than one who stares at a frozen button. A researcher who gets a clear error message knows the tool is working — even when something goes wrong. A researcher who opens the site on their phone and it works perfectly will use it again.</p>
<p>None of these are simulation features. All of them matter.</p>
<hr />
<h2>Current Dashboard State</h2>
<p><strong>Tab 1 — BER vs SNR:</strong> Real AWGN + Monte Carlo. Theoretical and simulated curves. <strong>Tab 2 — Beam Pattern:</strong> Real ULA antenna math. Polar chart. <strong>Tab 3 — Modulation Comparison:</strong> All four modulations on one chart.</p>
<p>All three polished with loading states, error handling, and mobile layout.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<p>Open it on your phone. Run a simulation. Watch the loading spinner. Check the history page. See the empty state if you're a new user. This is what production quality UX feels like.</p>
<hr />
<h2>Tech Stack</h2>
<p>Angular 17 · Angular Material · Chart.js · Java 17 · Spring Boot 3 · PostgreSQL · Python FastAPI · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 15</h2>
<p>Simulation Comparison Tool. Run two different simulation configurations side by side and compare results on the same chart. This is the feature researchers need when testing different antenna configurations or modulation schemes against each other.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 13: Modulation Comparison Chart — BPSK vs QPSK vs 16QAM vs 64QAM on One Chart]]></title><description><![CDATA[The fundamental 6G spectral efficiency tradeoff. Four curves. Three crossover numbers. Visible instantly.


Quick Links
🔗 Live Demo: https://sionna-visualizer.vercel.app 🐙 GitHub: https://github.com]]></description><link>https://vinayak6g.hashnode.dev/day-13-modulation-comparison-chart-bpsk-vs-qpsk-vs-16qam-vs-64qam-on-one-chart</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-13-modulation-comparison-chart-bpsk-vs-qpsk-vs-16qam-vs-64qam-on-one-chart</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Mon, 23 Mar 2026 07:52:16 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>The fundamental 6G spectral efficiency tradeoff. Four curves. Three crossover numbers. Visible instantly.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>The Question Every 6G Researcher Asks</h2>
<p>When designing a 6G wireless link, one of the first decisions is modulation scheme. Do you use BPSK, QPSK, 16QAM, or 64QAM?</p>
<p>Higher modulation order means more bits per symbol — more data throughput. But it also means more sensitivity to noise — you need a stronger signal to maintain the same error rate.</p>
<p>Researchers call this the spectral efficiency tradeoff. And they visualize it with one specific chart — BER vs SNR curves for all modulations on the same plot. Today I added that chart to Sionna Visualizer.</p>
<hr />
<h2>What the Chart Shows</h2>
<p>Four lines on a logarithmic chart:</p>
<ul>
<li><p><strong>BPSK</strong> — white line. 1 bit per symbol. Most robust.</p>
</li>
<li><p><strong>QPSK</strong> — teal line. 2 bits per symbol. Same BER as BPSK.</p>
</li>
<li><p><strong>16QAM</strong> — yellow line. 4 bits per symbol. Needs more SNR.</p>
</li>
<li><p><strong>64QAM</strong> — coral line. 6 bits per symbol. Needs the most SNR.</p>
</li>
</ul>
<p>As SNR increases all curves drop toward zero BER — the waterfall region. But they drop at different rates depending on their modulation order.</p>
<hr />
<h2>The Three Numbers That Matter</h2>
<p>The Python simulation computed exact crossover points:</p>
<p><strong>BPSK and QPSK are identical in BER performance.</strong> QPSK carries twice the data at zero BER cost. This is why QPSK is the default choice in most 6G baseline systems.</p>
<p><strong>16QAM needs 6.8 dB more SNR than QPSK</strong> to achieve the same BER. You pay 6.8 dB of signal strength to double your data rate again.</p>
<p><strong>64QAM needs 5.5 dB more SNR than 16QAM</strong> to achieve the same BER. Another 5.5 dB for 50% more bits per symbol.</p>
<p>This is the tradeoff every 6G system designer navigates daily. Strong signal environment — use 64QAM, maximize throughput. Weak signal or edge of cell — fall back to QPSK, maintain reliability.</p>
<hr />
<h2>The Curl Test Result</h2>
<pre><code class="language-json">{
  "snr_db": [-5.0, -4.39, ..., 25.0],
  "bpsk":  [0.08259, 0.07185, ..., 1e-07],
  "qpsk":  [0.08259, 0.07185, ..., 1e-07],
  "qam16": [0.18029, 0.17094, ..., 1e-07],
  "qam64": [0.20760, 0.20152, ..., 1e-07],
  "crossover_points": {
    "bpsk_qpsk_same": true,
    "qpsk_advantage_over_16qam_at_snr": 6.8,
    "qam16_advantage_over_64qam_at_snr": 5.5
  }
}
</code></pre>
<p>50 SNR points. All four modulations. Crossover points computed automatically.</p>
<hr />
<h2>What Changed Across the Stack</h2>
<p><strong>Python Bridge</strong></p>
<ul>
<li><p>New file: modulation_comparison.py</p>
</li>
<li><p>erfc equations for all four modulations simultaneously</p>
</li>
<li><p>Automatic crossover point detection</p>
</li>
<li><p>New endpoint: POST /simulate/modulation-comparison</p>
</li>
</ul>
<p><strong>Java Spring Boot</strong></p>
<ul>
<li><p>ModulationComparisonRequestDto and ResultDto</p>
</li>
<li><p>New columns on SimulationResult entity</p>
</li>
<li><p>simulation_type = MOD_COMPARISON</p>
</li>
<li><p>New endpoint: POST /api/simulations/modulation-comparison</p>
</li>
</ul>
<p><strong>Angular 17</strong></p>
<ul>
<li><p>Third tab added to dashboard: Modulation Comparison</p>
</li>
<li><p>Four colored lines on logarithmic Chart.js chart</p>
</li>
<li><p>Insight cards showing crossover points dynamically</p>
</li>
<li><p>Orange history badge: Mod. Compare</p>
</li>
</ul>
<hr />
<h2>The Dashboard Now Has Three Complete Simulation Types</h2>
<p><strong>Tab 1 — BER vs SNR:</strong> Real AWGN + Monte Carlo. Theoretical and simulated curves. Single modulation deep dive.</p>
<p><strong>Tab 2 — Beam Pattern:</strong> Real ULA antenna math. Polar chart. 8 to 64 antenna elements. 28 to 77 GHz.</p>
<p><strong>Tab 3 — Modulation Comparison:</strong> All four modulations simultaneously. Crossover points. Spectral efficiency tradeoff visible instantly.</p>
<p>All three save to PostgreSQL. All three generate shareable links. All three show in history with color coded badges.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<ol>
<li><p>Login and click the Modulation Comparison tab</p>
</li>
<li><p>Set SNR range from -5 to 25 dB</p>
</li>
<li><p>Click Compare All Modulations</p>
</li>
<li><p>Watch four curves appear simultaneously</p>
</li>
<li><p>Read the insight cards below the chart</p>
</li>
<li><p>Share the result with one public link</p>
</li>
</ol>
<hr />
<h2>Tech Stack</h2>
<p>Python 3.10 · NumPy · SciPy · FastAPI · Java 17 · Spring Boot 3 · PostgreSQL · Angular 17 · Chart.js · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 14</h2>
<p>Dashboard UI polish. Loading states, error handling, empty states, mobile responsive layout. The features are complete — now we make the experience feel production quality for every user who lands on the site.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item><item><title><![CDATA[Day 12: Beam Pattern Visualization is Live. The Chart That Makes Sionna Visualizer Look Like a 6G Tool]]></title><description><![CDATA[A polar antenna beam pattern chart. 16-element ULA. 8° main lobe. -13.15 dB side lobe level. Real antenna mathematics running in your browser.


Quick Links
🔗 Live Demo: https://sionna-visualizer.ver]]></description><link>https://vinayak6g.hashnode.dev/day-12-beam-pattern-visualization-is-live-the-chart-that-makes-sionna-visualizer-look-like-a-6g-tool</link><guid isPermaLink="true">https://vinayak6g.hashnode.dev/day-12-beam-pattern-visualization-is-live-the-chart-that-makes-sionna-visualizer-look-like-a-6g-tool</guid><dc:creator><![CDATA[Vinayak Gote]]></dc:creator><pubDate>Sun, 22 Mar 2026 04:20:01 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>A polar antenna beam pattern chart. 16-element ULA. 8° main lobe. -13.15 dB side lobe level. Real antenna mathematics running in your browser.</p>
</blockquote>
<hr />
<h2>Quick Links</h2>
<p>🔗 <strong>Live Demo:</strong> <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a> 🐙 <strong>GitHub:</strong> <a href="https://github.com/Vinu2111/sionna-visualizer">https://github.com/Vinu2111/sionna-visualizer</a> 📖 <strong>Full Series:</strong> vinayak6g.hashnode.dev</p>
<hr />
<h2>What Is a Beam Pattern — Plain English</h2>
<p>In 4G networks, antennas broadcast signal in all directions equally — like a light bulb. Every device nearby gets signal regardless of where it is.</p>
<p>In 6G networks, antennas are smarter. They focus signal energy in a specific direction — like a flashlight. This is called beamforming. The antenna knows where you are and points its signal directly at you.</p>
<p>A beam pattern chart shows this. It is a polar chart — circular — where the angle represents direction in space and the radius represents signal strength in that direction. The sharp peak in the center is the main lobe — where the antenna is pointing. The smaller peaks around it are side lobes — unavoidable signal leakage in other directions.</p>
<p>This chart appears in virtually every 6G and 5G research paper ever published. It is one of the most recognizable visualizations in wireless communications.</p>
<p>Today I added it to Sionna Visualizer.</p>
<hr />
<h2>The Math — Uniform Linear Array</h2>
<p>The simulation uses the Uniform Linear Array (ULA) model — the standard antenna model in 6G research.</p>
<p>The Array Factor formula:</p>
<pre><code class="language-plaintext">AF(θ) = |Σ exp(j × 2π × n × d × sin(θ) / λ)| for n = 0 to N-1
</code></pre>
<p>Where:</p>
<ul>
<li><p>N = number of antenna elements</p>
</li>
<li><p>d = spacing between elements (in wavelengths)</p>
</li>
<li><p>θ = angle in radians</p>
</li>
<li><p>λ = wavelength at the carrier frequency</p>
</li>
</ul>
<p>The result is normalized to 0 dB at the peak and converted to dB scale. Side lobes appear naturally from the mathematics — they are not added artificially.</p>
<hr />
<h2>The Curl Test Result</h2>
<p>16 antennas. 15° steering angle. 28 GHz (mmWave 6G).</p>
<pre><code class="language-json">{
  "steering_angle": 15.0,
  "num_antennas": 16,
  "frequency_ghz": 28.0,
  "main_lobe_width": 8.0,
  "side_lobe_level": -13.15,
  "array_gain_db": 12.04
}
</code></pre>
<p>Three numbers that validate the simulation is correct:</p>
<p><strong>Main lobe width: 8.0°</strong> — a 16-element ULA at 28 GHz produces approximately 6-8° beamwidth. This is correct.</p>
<p><strong>Side lobe level: -13.15 dB</strong> — this is the famous -13.26 dB first side lobe of a uniform aperture, slightly shifted by the steering angle. Any RF engineer will recognize this number immediately.</p>
<p><strong>Array gain: 12.04 dB</strong> — exactly 10×log10(16) = 12.04 dB. Perfect.</p>
<hr />
<h2>What Changed Across the Stack</h2>
<p><strong>Python Bridge</strong></p>
<ul>
<li><p>New file: beam_pattern.py — ULA Array Factor computation</p>
</li>
<li><p>181 angle points from -90° to 90°</p>
</li>
<li><p>Accurate 3dB beamwidth detection</p>
</li>
<li><p>Side lobe masking to find true SLL</p>
</li>
<li><p>New endpoint: POST /simulate/beam-pattern</p>
</li>
</ul>
<p><strong>Java Spring Boot</strong></p>
<ul>
<li><p>BeamPatternRequestDto and BeamPatternResultDto</p>
</li>
<li><p>8 new columns on SimulationResult entity</p>
</li>
<li><p>simulation_type field — BER_SNR or BEAM_PATTERN</p>
</li>
<li><p>New endpoint: POST /api/simulations/beam-pattern</p>
</li>
</ul>
<p><strong>Angular 17</strong></p>
<ul>
<li><p>Dashboard now has two tabs — BER vs SNR and Beam Pattern</p>
</li>
<li><p>Polar Chart.js radar chart with -40 to 0 dB range</p>
</li>
<li><p>Teal fill with rgba(100, 255, 218, 0.1) glow</p>
</li>
<li><p>Parameters: antenna count, steering angle, frequency, spacing</p>
</li>
<li><p>Metrics cards: main lobe width, side lobe level, array gain</p>
</li>
<li><p>History page now shows type badges — teal for BER/SNR, purple for Beam Pattern</p>
</li>
</ul>
<hr />
<h2>The Dashboard Now Has Two Complete Simulation Types</h2>
<p>Tab 1 — BER vs SNR: real AWGN simulation, theoretical + Monte Carlo curves, BPSK/QPSK/16QAM/64QAM</p>
<p>Tab 2 — Beam Pattern: real ULA simulation, polar chart, 8/16/32/64 antenna elements, 28/39/60/77 GHz</p>
<p>Both save to PostgreSQL. Both generate shareable public links. Both show in history with type badges.</p>
<hr />
<h2>Try It Right Now</h2>
<p>🔗 <a href="https://sionna-visualizer.vercel.app">https://sionna-visualizer.vercel.app</a></p>
<ol>
<li><p>Login to your account</p>
</li>
<li><p>Click the Beam Pattern tab</p>
</li>
<li><p>Set antennas to 32, steering angle to 30°, frequency to 28 GHz</p>
</li>
<li><p>Click Run</p>
</li>
<li><p>Watch a real ULA beam pattern render</p>
</li>
<li><p>Change antennas to 8 — watch the beam widen</p>
</li>
<li><p>Change to 64 — watch it sharpen to a razor</p>
</li>
</ol>
<hr />
<h2>Tech Stack</h2>
<p>Python 3.10 · NumPy · FastAPI · Java 17 · Spring Boot 3 · PostgreSQL · Angular 17 · Chart.js · Railway · Vercel</p>
<hr />
<h2>What's Next — Day 13</h2>
<p>Multiple modulation comparison. Run BPSK, QPSK, 16QAM, and 64QAM simultaneously and compare all four BER curves on one chart. This is the visualization researchers use when choosing which modulation scheme to use for a given SNR target.</p>
<hr />
<p><em>Building Sionna Visualizer in public — 2 hours/day.</em> <em>Follow the full journey at vinayak6g.hashnode.dev</em> <em>GitHub: github.com/Vinu2111/sionna-visualizer</em> <em>Twitter: @gote_vinayak</em></p>
]]></content:encoded></item></channel></rss>