<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sumit Dhaka</title>
    <description>The latest articles on DEV Community by Sumit Dhaka (@tosumitdhaka).</description>
    <link>https://dev.to/tosumitdhaka</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3763376%2Fe5732a10-8442-4a4d-bbb4-176b093db048.jpg</url>
      <title>DEV Community: Sumit Dhaka</title>
      <link>https://dev.to/tosumitdhaka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tosumitdhaka"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Sun, 22 Feb 2026 13:02:51 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/-3dl</link>
      <guid>https://dev.to/tosumitdhaka/-3dl</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tosumitdhaka" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3763376%2Fe5732a10-8442-4a4d-bbb4-176b093db048.jpg" alt="tosumitdhaka"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-now-with-real-time-websocket-push-3782" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Built a Free, Self-Hosted SNMP Toolkit — Now With Real-Time WebSocket Push&lt;/h2&gt;
      &lt;h3&gt;Sumit Dhaka ・ Feb 22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#networking&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>networking</category>
      <category>python</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Free, Self-Hosted SNMP Toolkit — Now With Real-Time WebSocket Push</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Sun, 22 Feb 2026 13:01:01 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-now-with-real-time-websocket-push-3782</link>
      <guid>https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-now-with-real-time-websocket-push-3782</guid>
      <description>&lt;p&gt;If you've ever worked with SNMP — testing NMS integrations, debugging trap handlers, or validating MIB structures — you know the pain. You end up juggling Net-SNMP CLI commands you can never remember, &lt;code&gt;snmptrapd&lt;/code&gt; configs scattered everywhere, and a $500 MIB browser that still looks like it was designed in 2003.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Trishul SNMP&lt;/strong&gt; to fix that. One Docker container. Browser-based. Free.&lt;/p&gt;

&lt;p&gt;This post covers what's new in &lt;strong&gt;v1.2.4&lt;/strong&gt; — the biggest update yet — and why I built it this way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Trishul SNMP?
&lt;/h2&gt;

&lt;p&gt;It's a self-hosted SNMP dev toolkit that combines five tools into one clean web UI:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Instead of&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SNMP Simulator (UDP agent)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmpsim&lt;/code&gt; + CLI config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Walk &amp;amp; Parse → JSON&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmpwalk&lt;/code&gt; + manual OID lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trap Sender + Receiver&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmptrap&lt;/code&gt; + &lt;code&gt;snmptrapd&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIB Browser (tree view)&lt;/td&gt;
&lt;td&gt;iReasoning MIB Browser ($500+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIB Manager (upload/validate)&lt;/td&gt;
&lt;td&gt;Text editor + manual dependency hell&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python 3.11, FastAPI, pysnmp, pysmi, Bootstrap 5, Docker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install in one command&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:8080&lt;/code&gt;. Default login: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin123&lt;/code&gt; — change it immediately in Settings.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New in v1.2.4
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ Real-Time WebSocket Push — Polling Is Dead
&lt;/h3&gt;

&lt;p&gt;The biggest architectural change: the entire frontend is now event-driven.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Every page polled the backend on a &lt;code&gt;setInterval&lt;/code&gt; — dashboard every 30s, simulator every 5s. Stale data was common. Switching pages caused spinners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; A single persistent WebSocket connection at &lt;code&gt;/api/ws&lt;/code&gt;. The backend broadcasts state changes the moment they happen. Dashboard, Simulator status, and Trap Receiver all update instantly — no refresh needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser ←──── WS push ────── FastAPI /api/ws
                                    │
                              broadcasts on:
                              - trap received
                              - simulator start/stop
                              - MIB uploaded
                              - stats change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The navbar shows a live green dot when the WebSocket is healthy. On reconnect, the backend sends a &lt;code&gt;full_state&lt;/code&gt; message to re-seed everything — so you never see stale data after a network hiccup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for devs:&lt;/strong&gt; If you're building a trap handler and sending test traps from the UI, you now see the counter increment on the dashboard in real time. No F5 needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 Live Activity Stats Dashboard
&lt;/h3&gt;

&lt;p&gt;A new 8-counter row on the dashboard shows everything happening in your session:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SNMP Requests&lt;/strong&gt; — Total polls served by the simulator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDs Loaded&lt;/strong&gt; — OIDs currently in memory across all loaded MIBs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traps Received / Sent&lt;/strong&gt; — Live trap counters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walks Executed&lt;/strong&gt; — How many SNMP walks you've run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDs Returned&lt;/strong&gt; — Total OIDs returned across all walks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIBs Uploaded / Times Reloaded&lt;/strong&gt; — MIB management activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All counters update via WebSocket push. They're also &lt;strong&gt;file-backed&lt;/strong&gt; — they survive container restarts so you don't lose your session history.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Settings — Three New Cards
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;App Behaviour&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two toggles: auto-start Simulator and auto-start Trap Receiver on container boot. Plus a configurable session timeout (60s–86400s). Settings persist to &lt;code&gt;app_settings.json&lt;/code&gt; and take effect on next restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stats Management&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Export all counters as JSON (useful for logging test session results) or reset to zero for a clean baseline before a test run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Version, author, and description pulled live from the backend — always in sync with what's actually deployed.&lt;/p&gt;




&lt;h3&gt;
  
  
  🐛 Notable Fixes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Timestamp bug:&lt;/strong&gt; The Trap Receiver was showing &lt;code&gt;1970&lt;/code&gt; for &lt;code&gt;Last Received&lt;/code&gt; when the backend returned a Unix epoch &lt;code&gt;0&lt;/code&gt;. Now guarded and shown as &lt;code&gt;--&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traps Sent undercount:&lt;/strong&gt; Stats were only incremented in the frontend — if you sent traps via API directly, the counter never moved. Fixed by broadcasting stats from the backend after every successful trap send.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard spinners on page switch:&lt;/strong&gt; The WS &lt;code&gt;full_state&lt;/code&gt; event fires before &lt;code&gt;DashboardModule.init()&lt;/code&gt; registers its listener on page switch, so status tiles stayed as spinners until the next reconnect. Fixed by always seeding via REST on init, regardless of WS state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MIB Browser state conflict:&lt;/strong&gt; Navigating to the Browser from Walk &amp;amp; Parse (with a pre-filled OID) would sometimes log &lt;code&gt;Could not find node&lt;/code&gt; because the previous session's pending tree state conflicted. Fixed by clearing &lt;code&gt;pendingSelectedOid&lt;/code&gt; and &lt;code&gt;pendingExpandedNodes&lt;/code&gt; when a programmatic OID search is present.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NMS / backend developers&lt;/strong&gt; who need a real SNMP agent to poll without actual hardware, or need to fire specific trap OIDs to validate their handler code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps / integration engineers&lt;/strong&gt; who need to test SNMP monitoring integrations in CI/staging environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network engineers&lt;/strong&gt; who want to explore MIB structures interactively — search by OID, by name, or by description — and understand what traps a device can fire before it's on the floor.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It's NOT For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Production 24/7 monitoring → use Zabbix, LibreNMS, PRTG&lt;/li&gt;
&lt;li&gt;Enterprise NMS → use SolarWinds, Cisco Prime&lt;/li&gt;
&lt;li&gt;High-availability trap collection at scale → use dedicated platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trishul is a &lt;strong&gt;developer and testing tool&lt;/strong&gt;, not a production monitoring system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (8080)
    │ HTTP + WebSocket
    ▼
Nginx (static files + reverse proxy)
    │ REST + WS
    ▼
FastAPI Backend (8000)
    ├── MIB Service (parse, validate, search)
    ├── SNMP Simulator (UDP 1061)
    ├── Trap Manager (send + receive on UDP 1162)
    ├── Walker (SNMP walk client)
    └── WebSocket hub (/api/ws)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything runs in Docker with host network mode so the SNMP UDP ports (1061, 1162) are accessible directly from your local machine or test devices.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-command install&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash

&lt;span class="c"&gt;# Access at&lt;/span&gt;
http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp" rel="noopener noreferrer"&gt;GitHub — tosumitdhaka/trishul-snmp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp/discussions/20" rel="noopener noreferrer"&gt;v1.2.4 Announcement &amp;amp; Discussion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📋 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp/wiki/Changelog" rel="noopener noreferrer"&gt;Full Changelog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it's useful, a ⭐ on GitHub goes a long way — it helps other devs find the project.&lt;/p&gt;

&lt;p&gt;Happy to answer questions in the comments about architecture decisions, the pysnmp/pysmi integration, or the WebSocket implementation. 🔱&lt;/p&gt;

</description>
      <category>networking</category>
      <category>python</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Created OpenSource SNMP dev/testing tool for devs, please checkout and help improving it.</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:40:19 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/created-opensource-snmp-devtesting-tool-for-devs-please-checkout-and-help-improving-it-4mjh</link>
      <guid>https://dev.to/tosumitdhaka/created-opensource-snmp-devtesting-tool-for-devs-please-checkout-and-help-improving-it-4mjh</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tosumitdhaka" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3763376%2Fe5732a10-8442-4a4d-bbb4-176b093db048.jpg" alt="tosumitdhaka"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-that-replaces-500-tools-now-with-real-time-websocket-38p6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I Built a Free, Self-Hosted SNMP Toolkit That Replaces $500+ Tools — Now With Real-Time WebSocket Push&lt;/h2&gt;
      &lt;h3&gt;Sumit Dhaka ・ Feb 22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#networking&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>networking</category>
      <category>python</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:38:49 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/-11l3</link>
      <guid>https://dev.to/tosumitdhaka/-11l3</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tosumitdhaka" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3763376%2Fe5732a10-8442-4a4d-bbb4-176b093db048.jpg" alt="tosumitdhaka"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tosumitdhaka/building-trishul-snmp-a-modern-web-based-snmp-toolkit-to-replace-500-commercial-tools-3d53" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Building Trishul-SNMP: A Modern Web-Based SNMP Toolkit to Replace $500 Commercial Tools&lt;/h2&gt;
      &lt;h3&gt;Sumit Dhaka ・ Feb 10&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#snmp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#networking&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>snmp</category>
      <category>networking</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>I Built a Free, Self-Hosted SNMP Toolkit — Now With Real-Time WebSocket Push</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Sun, 22 Feb 2026 12:38:22 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-that-replaces-500-tools-now-with-real-time-websocket-38p6</link>
      <guid>https://dev.to/tosumitdhaka/i-built-a-free-self-hosted-snmp-toolkit-that-replaces-500-tools-now-with-real-time-websocket-38p6</guid>
      <description>&lt;p&gt;If you've ever worked with SNMP — testing NMS integrations, debugging trap handlers, or validating MIB structures — you know the pain. You end up juggling Net-SNMP CLI commands you can never remember, &lt;code&gt;snmptrapd&lt;/code&gt; configs scattered everywhere, and a $500 MIB browser that still looks like it was designed in 2003.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Trishul SNMP Studio&lt;/strong&gt; to fix that. One Docker container. Browser-based. Free.&lt;/p&gt;

&lt;p&gt;This post covers what's new in &lt;strong&gt;v1.2.4&lt;/strong&gt; — the biggest update yet — and why I built it this way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Trishul SNMP Studio?
&lt;/h2&gt;

&lt;p&gt;It's a self-hosted SNMP dev toolkit that combines five tools into one clean web UI:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Instead of&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SNMP Simulator (UDP agent)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmpsim&lt;/code&gt; + CLI config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Walk &amp;amp; Parse → JSON&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmpwalk&lt;/code&gt; + manual OID lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trap Sender + Receiver&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;snmptrap&lt;/code&gt; + &lt;code&gt;snmptrapd&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIB Browser (tree view)&lt;/td&gt;
&lt;td&gt;iReasoning MIB Browser ($500+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIB Manager (upload/validate)&lt;/td&gt;
&lt;td&gt;Text editor + manual dependency hell&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python 3.11, FastAPI, pysnmp, pysmi, Bootstrap 5, Docker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install in one command&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:8080&lt;/code&gt;. Default login: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin123&lt;/code&gt; — change it immediately in Settings.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New in v1.2.4
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ Real-Time WebSocket Push — Polling Is Dead
&lt;/h3&gt;

&lt;p&gt;The biggest architectural change: the entire frontend is now event-driven.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Every page polled the backend on a &lt;code&gt;setInterval&lt;/code&gt; — dashboard every 30s, simulator every 5s. Stale data was common. Switching pages caused spinners.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; A single persistent WebSocket connection at &lt;code&gt;/api/ws&lt;/code&gt;. The backend broadcasts state changes the moment they happen. Dashboard, Simulator status, and Trap Receiver all update instantly — no refresh needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser ←──── WS push ────── FastAPI /api/ws
                                    │
                              broadcasts on:
                              - trap received
                              - simulator start/stop
                              - MIB uploaded
                              - stats change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The navbar shows a live green dot when the WebSocket is healthy. On reconnect, the backend sends a &lt;code&gt;full_state&lt;/code&gt; message to re-seed everything — so you never see stale data after a network hiccup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for devs:&lt;/strong&gt; If you're building a trap handler and sending test traps from the UI, you now see the counter increment on the dashboard in real time. No F5 needed.&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 Live Activity Stats Dashboard
&lt;/h3&gt;

&lt;p&gt;A new 8-counter row on the dashboard shows everything happening in your session:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SNMP Requests&lt;/strong&gt; — Total polls served by the simulator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDs Loaded&lt;/strong&gt; — OIDs currently in memory across all loaded MIBs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traps Received / Sent&lt;/strong&gt; — Live trap counters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Walks Executed&lt;/strong&gt; — How many SNMP walks you've run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDs Returned&lt;/strong&gt; — Total OIDs returned across all walks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIBs Uploaded / Times Reloaded&lt;/strong&gt; — MIB management activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All counters update via WebSocket push. They're also &lt;strong&gt;file-backed&lt;/strong&gt; — they survive container restarts so you don't lose your session history.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Settings — Three New Cards
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;App Behaviour&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two toggles: auto-start Simulator and auto-start Trap Receiver on container boot. Plus a configurable session timeout (60s–86400s). Settings persist to &lt;code&gt;app_settings.json&lt;/code&gt; and take effect on next restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stats Management&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Export all counters as JSON (useful for logging test session results) or reset to zero for a clean baseline before a test run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Version, author, and description pulled live from the backend — always in sync with what's actually deployed.&lt;/p&gt;




&lt;h3&gt;
  
  
  🐛 Notable Fixes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Timestamp bug:&lt;/strong&gt; The Trap Receiver was showing &lt;code&gt;1970&lt;/code&gt; for &lt;code&gt;Last Received&lt;/code&gt; when the backend returned a Unix epoch &lt;code&gt;0&lt;/code&gt;. Now guarded and shown as &lt;code&gt;--&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traps Sent undercount:&lt;/strong&gt; Stats were only incremented in the frontend — if you sent traps via API directly, the counter never moved. Fixed by broadcasting stats from the backend after every successful trap send.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard spinners on page switch:&lt;/strong&gt; The WS &lt;code&gt;full_state&lt;/code&gt; event fires before &lt;code&gt;DashboardModule.init()&lt;/code&gt; registers its listener on page switch, so status tiles stayed as spinners until the next reconnect. Fixed by always seeding via REST on init, regardless of WS state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MIB Browser state conflict:&lt;/strong&gt; Navigating to the Browser from Walk &amp;amp; Parse (with a pre-filled OID) would sometimes log &lt;code&gt;Could not find node&lt;/code&gt; because the previous session's pending tree state conflicted. Fixed by clearing &lt;code&gt;pendingSelectedOid&lt;/code&gt; and &lt;code&gt;pendingExpandedNodes&lt;/code&gt; when a programmatic OID search is present.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NMS / backend developers&lt;/strong&gt; who need a real SNMP agent to poll without actual hardware, or need to fire specific trap OIDs to validate their handler code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps / integration engineers&lt;/strong&gt; who need to test SNMP monitoring integrations in CI/staging environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network engineers&lt;/strong&gt; who want to explore MIB structures interactively — search by OID, by name, or by description — and understand what traps a device can fire before it's on the floor.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It's NOT For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Production 24/7 monitoring → use Zabbix, LibreNMS, PRTG&lt;/li&gt;
&lt;li&gt;Enterprise NMS → use SolarWinds, Cisco Prime&lt;/li&gt;
&lt;li&gt;High-availability trap collection at scale → use dedicated platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trishul is a &lt;strong&gt;developer and testing tool&lt;/strong&gt;, not a production monitoring system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (8080)
    │ HTTP + WebSocket
    ▼
Nginx (static files + reverse proxy)
    │ REST + WS
    ▼
FastAPI Backend (8000)
    ├── MIB Service (parse, validate, search)
    ├── SNMP Simulator (UDP 1061)
    ├── Trap Manager (send + receive on UDP 1162)
    ├── Walker (SNMP walk client)
    └── WebSocket hub (/api/ws)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything runs in Docker with host network mode so the SNMP UDP ports (1061, 1162) are accessible directly from your local machine or test devices.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-command install&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash

&lt;span class="c"&gt;# Access at&lt;/span&gt;
http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🐙 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp" rel="noopener noreferrer"&gt;GitHub — tosumitdhaka/trishul-snmp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp/discussions/20" rel="noopener noreferrer"&gt;v1.2.4 Announcement &amp;amp; Discussion&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📋 &lt;a href="https://github.com/tosumitdhaka/trishul-snmp/wiki/Changelog" rel="noopener noreferrer"&gt;Full Changelog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it's useful, a ⭐ on GitHub goes a long way — it helps other devs find the project.&lt;/p&gt;

&lt;p&gt;Happy to answer questions in the comments about architecture decisions, the pysnmp/pysmi integration, or the WebSocket implementation. 🔱&lt;/p&gt;

</description>
      <category>networking</category>
      <category>python</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building Trishul-SNMP: A Modern Web-Based SNMP Toolkit to Replace $500 Commercial Tools</title>
      <dc:creator>Sumit Dhaka</dc:creator>
      <pubDate>Tue, 10 Feb 2026 08:45:14 +0000</pubDate>
      <link>https://dev.to/tosumitdhaka/building-trishul-snmp-a-modern-web-based-snmp-toolkit-to-replace-500-commercial-tools-3d53</link>
      <guid>https://dev.to/tosumitdhaka/building-trishul-snmp-a-modern-web-based-snmp-toolkit-to-replace-500-commercial-tools-3d53</guid>
      <description>&lt;h2&gt;
  
  
  Building Trishul-SNMP: A Modern Web-Based SNMP Toolkit
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Trishul-SNMP&lt;/strong&gt; 🔱, a free open-source web-based SNMP toolkit that replaces 5+ commercial tools. It includes an SNMP simulator, walker, trap manager, MIB browser, and more—all in one unified platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tosumitdhaka/trishul-snmp" rel="noopener noreferrer"&gt;https://github.com/tosumitdhaka/trishul-snmp&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;⭐ Star it if you find it useful!&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem: SNMP Tooling is Stuck in the Past
&lt;/h2&gt;

&lt;p&gt;As a network engineer, I was frustrated with the state of SNMP tooling:&lt;/p&gt;
&lt;h3&gt;
  
  
  What's Available Today:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Net-SNMP&lt;/strong&gt; 🐌&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Powerful but CLI-only&lt;/li&gt;
&lt;li&gt;Steep learning curve&lt;/li&gt;
&lt;li&gt;Need to memorize commands&lt;/li&gt;
&lt;li&gt;No visual feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;iReasoning MIB Browser&lt;/strong&gt; 💰&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Great GUI but costs &lt;strong&gt;$500+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Desktop app (not web-based)&lt;/li&gt;
&lt;li&gt;No trap receiver&lt;/li&gt;
&lt;li&gt;Closed source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;snmpsim&lt;/strong&gt; 🔧&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good simulator but no web interface&lt;/li&gt;
&lt;li&gt;CLI configuration&lt;/li&gt;
&lt;li&gt;Limited features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Custom Scripts&lt;/strong&gt; 📝&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scattered across repos&lt;/li&gt;
&lt;li&gt;Hard to maintain&lt;/li&gt;
&lt;li&gt;No unified workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What I Needed:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Web-based&lt;/strong&gt; (access from anywhere)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Free &amp;amp; open source&lt;/strong&gt; (no $500 license)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Unified platform&lt;/strong&gt; (one tool for everything)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Modern UI&lt;/strong&gt; (not from 2005)&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Easy deployment&lt;/strong&gt; (Docker one-liner)  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So I built it.&lt;/strong&gt; 🔱&lt;/p&gt;


&lt;h2&gt;
  
  
  Introducing Trishul-SNMP
&lt;/h2&gt;

&lt;p&gt;A web-based SNMP toolkit with &lt;strong&gt;6 integrated components&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  🖥️ 1. SNMP Simulator (Server Mode)
&lt;/h3&gt;

&lt;p&gt;Test SNMP agent responses without real hardware.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Start simulator with custom OIDs
curl -X POST http://localhost:8000/api/simulator/start \
  -H "Content-Type: application/json" \
  -d '{
    "port": 1061,
    "community": "public",
    "oids": {
      "1.3.6.1.2.1.1.1.0": "Test Device v1.0",
      "1.3.6.1.2.1.1.3.0": "12345"
    }
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Simulate devices for NMS development and testing.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚶 2. Walk &amp;amp; Parse (Client Mode)
&lt;/h3&gt;

&lt;p&gt;Test SNMP queries with automatic MIB resolution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Walk a device
curl -X POST http://localhost:8000/api/walker/walk \
  -H "Content-Type: application/json" \
  -d '{
    "host": "192.168.1.1",
    "community": "public",
    "oid": "1.3.6.1.2.1.1",
    "version": "2c"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Automatic OID → name resolution&lt;/li&gt;
&lt;li&gt;Export to JSON/CSV&lt;/li&gt;
&lt;li&gt;Bulk operations (GETBULK)&lt;/li&gt;
&lt;li&gt;Walk history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Test SNMP agent responses, validate walk implementations.&lt;/p&gt;




&lt;h3&gt;
  
  
  📡 3. Trap Manager (Client + Server)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Send Test Traps (Client):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Send trap to test receiver
curl -X POST http://localhost:8000/api/traps/send \
  -H "Content-Type: application/json" \
  -d '{
    "target": "192.168.1.100",
    "port": 162,
    "community": "public",
    "trap_oid": "1.3.6.1.6.3.1.1.5.3",
    "varbinds": [
      {"oid": "1.3.6.1.2.1.1.3.0", "value": "12345"}
    ]
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Receive Test Traps (Server):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time display on UDP 1162&lt;/li&gt;
&lt;li&gt;Automatic OID resolution&lt;/li&gt;
&lt;li&gt;Trap library with 24+ traps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Validate trap format/syntax for NMS development.&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 4. MIB Manager
&lt;/h3&gt;

&lt;p&gt;Upload and validate MIB files with dependency checking.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Drag-and-drop upload&lt;/li&gt;
&lt;li&gt;Syntax validation&lt;/li&gt;
&lt;li&gt;Dependency resolution&lt;/li&gt;
&lt;li&gt;Trap enumeration&lt;/li&gt;
&lt;li&gt;Statistics (objects, imports, traps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Validate MIBs before deployment, centralized MIB library.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌳 5. MIB Browser (NEW in v1.2.0!)
&lt;/h3&gt;

&lt;p&gt;Interactive tree explorer for MIB structures.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dual views:&lt;/strong&gt; By module or OID hierarchy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time search:&lt;/strong&gt; Find OIDs by name, numeric OID, or description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart filtering:&lt;/strong&gt; By module and type (scalars, tables, notifications)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tree navigation:&lt;/strong&gt; Expandable with configurable depth (1-5 levels)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Details panel:&lt;/strong&gt; Full metadata, descriptions, varbinds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; Jump to Walker/Trap Sender with pre-filled data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State persistence:&lt;/strong&gt; Remembers your position&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use case:&lt;/strong&gt; Explore MIB structures, understand OID relationships, find traps.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔐 6. Settings
&lt;/h3&gt;

&lt;p&gt;Manage authentication and preferences.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture: How It Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────┐
│                      Web Browser (Port 8080)                        │
│                                                                     │
│  ┌──────────┐ ┌──────────┐ ┌───────┐ ┌──────┐ ┌────────┐ ┌─────┐    │
│  │Dashboard │ │Simulator │ │Walker │ │Traps │ │Browser │ │MIBs │    │
│  └──────────┘ └──────────┘ └───────┘ └──────┘ └────────┘ └─────┘    │
└────────────────────────────┬────────────────────────────────────────┘
                             │ HTTP
                             │
              ┌──────────────▼──────────────┐
              │   Nginx (Frontend)          │
              │   • Serves static files     │
              │   • Reverse proxy to API    │
              └──────────────┬──────────────┘
                             │ REST API
                             │
┌────────────────────────────▼────────────────────────────────────────┐
│                  FastAPI Backend (Port 8000)                        │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐  │
│  │                      API Endpoints                            │  │
│  │  /api/simulator/*  /api/walker/*   /api/traps/*               │  │
│  │  /api/mibs/*       /api/browser/*  /api/settings/*            │  │
│  └───────────────────────────────────────────────────────────────┘  │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐  │
│  │                    Service Layer                              │  │
│  │                                                               │  │
│  │  ┌─────────────────────────────────────────────────────────┐  │  │
│  │  │              MIB Service (pysmi/pysnmp)                 │  │  │
│  │  │  • Parse &amp;amp; validate MIB files                           │  │  │
│  │  │  • Check syntax &amp;amp; dependencies                          │  │  │
│  │  │  • Build OID tree (module/hierarchy views)              │  │  │
│  │  │  • Resolve OID names ↔ numeric OIDs                     │  │  │
│  │  │  • Enumerate traps (24: 19 loaded + 5 system)           │  │  │
│  │  │  • Search &amp;amp; filter (name, OID, type, module)            │  │  │
│  │  └─────────────────────────────────────────────────────────┘  │  │
│  │                                                               │  │
│  │  ┌─────────────────────────────────────────────────────────┐  │  │
│  │  │              SNMP Service (pysnmp)                      │  │  │
│  │  │  • Simulator: Test SNMP agent responses                 │  │  │
│  │  │  • Walker: Test SNMP client queries                     │  │  │
│  │  │  • Trap Sender: Send test traps (client)                │  │  │
│  │  │  • Trap Receiver: Receive test traps (server)           │  │  │
│  │  └─────────────────────────────────────────────────────────┘  │  │
│  │                                                               │  │
│  │  ┌─────────────────────────────────────────────────────────┐  │  │
│  │  │              Auth Service                               │  │  │
│  │  │  • Session management (token-based)                     │  │  │
│  │  │  • User authentication                                  │  │  │
│  │  └─────────────────────────────────────────────────────────┘  │  │
│  └───────────────────────────────────────────────────────────────┘  │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐  │
│  │                    SNMP Network Layer                         │  │
│  │                                                               │  │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐       │  │
│  │  │Simulator │  │  Sender  │  │ Receiver │  │  Walker  │       │  │
│  │  │  (SVR)   │  │  (CLI)   │  │  (SVR)   │  │  (CLI)   │       │  │
│  │  │UDP: 1061 │  │ Dynamic  │  │UDP: 1162 │  │ Dynamic  │       │  │
│  │  │          │  │          │  │          │  │          │       │  │
│  │  │Test SNMP │  │Send test │  │Receive   │  │Test SNMP │       │  │
│  │  │agent     │  │traps to  │  │test traps│  │queries   │       │  │
│  │  │responses │  │dev/test  │  │from dev/ │  │to dev/   │       │  │
│  │  │          │  │targets   │  │test env  │  │test env  │       │  │
│  │  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘       │  │
│  │       │             │             │             │             │  │
│  └───────┼─────────────┼─────────────┼─────────────┼─────────────┘  │
│          │             │             │             │                │
│  ┌───────▼─────────────▼─────────────▼─────────────▼─────────────┐  │
│  │              Data Storage (Docker Volume)                     │  │
│  │  /app/data/                                                   │  │
│  │    ├── mibs/           (MIB files for validation)             │  │
│  │    ├── sessions.json   (Auth tokens)                          │  │
│  │    └── settings.json   (User config)                          │  │
│  └───────────────────────────────────────────────────────────────┘  │
│                                                                     │
└───────────────────────────┬─────────────────────────────────────────┘
                            │ SNMP Protocol (UDP)
                            │ Host Network Mode
                            │
             ┌──────────────┴──────────────┐
             │                             │
     ┌───────▼────────┐           ┌────────▼────────┐
     │ Test SNMP      │           │  Test Trap      │
     │ Clients/Agents │           │  Receivers      │
     │ (Dev/Test Env) │           │  (Dev/Test Env) │
     │                │           │                 │
     │ • Your NMS     │           │ • Your NMS      │
     │ • Custom apps  │           │ • Trap parsers  │
     │ • Test devices │           │ • Log servers   │
     │ • Simulators   │           │ • Test apps     │
     └────────────────┘           └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tech Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.11, FastAPI, pysnmp, pysmi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla JS, Bootstrap 5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Docker Compose, Nginx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; Docker volumes for persistence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Technical Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Host Network Mode for SNMP
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; SNMP uses dynamic UDP ports. Traps can come from any port, not just 162.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use Docker's host network mode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# docker-compose.yml
services:
  backend:
    network_mode: "host"
    ports:
      - "8000:8000"  # API
      - "1061:1061/udp"  # Simulator
      - "1162:1162/udp"  # Trap receiver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Less isolation, but necessary for SNMP's dynamic nature.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. MIB Parsing with pysmi
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; MIBs have complex dependencies (IMPORTS clause).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Use pysmi's MibBuilder with custom sources.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from pysmi.reader import FileReader
from pysmi.searcher import StubSearcher
from pysnmp.smi import builder, view

# Initialize MIB builder
mib_builder = builder.MibBuilder()

# Add custom MIB directory
mib_builder.addMibSources(
    FileReader('/app/data/mibs')
)

# Load MIB with automatic dependency resolution
mib_builder.loadModules('IF-MIB')

# Access MIB objects
mib_view = view.MibViewController(mib_builder)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Automatic dependency resolution—upload IF-MIB, and it automatically finds SNMPv2-SMI, SNMPv2-TC, etc.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. State Persistence Across Pages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Users lose context when switching between components (e.g., Browser → Walker).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; SessionStorage for UI state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Save state when leaving page
sessionStorage.setItem('browserState', JSON.stringify({
    view: 'module',
    module: 'IF-MIB',
    searchTerm: 'ifDescr',
    expandedNodes: ['1.3.6.1.2.1.2'],
    selectedOid: '1.3.6.1.2.1.2.2.1.2'
}));

// Restore state on page load
window.addEventListener('DOMContentLoaded', () =&amp;gt; {
    const state = JSON.parse(sessionStorage.getItem('browserState'));
    if (state) {
        // Restore view, search, expanded nodes, selection
        restoreState(state);
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Seamless navigation. Browse a trap in MIB Browser → click "Send this Trap" → Trap Sender opens with trap pre-filled → click "Browse" → returns to same position in tree.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Performance: Backend Caching
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Listing 24 traps on every dashboard load is slow (parses all MIBs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; In-memory cache with 60-second TTL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from time import time

class MibService:
    def __init__(self):
        self._trap_cache = None
        self._trap_cache_time = 0
        self._trap_cache_ttl = 60  # seconds

    def list_traps(self):
        current_time = time()

        # Return cached data if fresh
        if self._trap_cache and (current_time - self._trap_cache_time) &amp;lt; self._trap_cache_ttl:
            return self._trap_cache

        # Build fresh list
        traps = self._build_trap_list()

        # Update cache
        self._trap_cache = traps
        self._trap_cache_time = current_time

        return traps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Dashboard load time reduced from 2s → 0.2s (10x faster).&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Lazy Loading for MIB Tree
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Rendering 1000+ OIDs at once freezes the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Load children on-demand with configurable depth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async expandNodeRecursively(nodeEl, depth) {
    if (depth &amp;lt;= 0) return;

    const oid = nodeEl.dataset.oid;

    // Load only immediate children
    const res = await fetch(`/api/mibs/browse/tree/oid?root_oid=${oid}&amp;amp;depth=1`);
    const data = await res.json();

    // Render children
    const childrenContainer = nodeEl.querySelector('.tree-children');
    childrenContainer.innerHTML = data.children.map(child =&amp;gt; 
        this.buildTreeNodeHtml(child, 0)
    ).join('');

    // Recursively expand if depth &amp;gt; 1
    if (depth &amp;gt; 1) {
        const childNodes = childrenContainer.querySelectorAll('.tree-node');
        for (const childNode of childNodes) {
            await this.expandNodeRecursively(childNode, depth - 1);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;User selects depth: 1-5 levels (default: 3)&lt;/li&gt;
&lt;li&gt;Only visible nodes rendered&lt;/li&gt;
&lt;li&gt;Smooth expansion even with large MIBs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Can handle MIBs with 5000+ objects without lag.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Trap Count Inconsistency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Dashboard showed 24 traps, MIB Manager showed 19.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root cause:&lt;/strong&gt; System MIBs (SNMPv2-MIB, RMON-MIB) are built into pysnmp but not in the "loaded MIB" list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Visual distinction with badges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const knownSystemMibs = ['SNMPv2-MIB', 'RMON-MIB', 'IF-MIB'];
const loadedModules = new Set(loadedMibs.map(m =&amp;gt; m.module));

traps.forEach(trap =&amp;gt; {
    const isSystemMib = knownSystemMibs.includes(trap.module) 
                        &amp;amp;&amp;amp; !loadedModules.has(trap.module);

    // Gray badge for system MIBs, blue for loaded
    const badge = `
        &amp;lt;span class="badge ${isSystemMib ? 'bg-secondary' : 'bg-primary'}"&amp;gt;
            ${trap.module}
        &amp;lt;/span&amp;gt;
        ${isSystemMib ? '&amp;lt;span class="badge bg-secondary"&amp;gt;System&amp;lt;/span&amp;gt;' : ''}
    `;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Clear distinction—users understand which MIBs are built-in vs. uploaded.&lt;/p&gt;




&lt;h3&gt;
  
  
  Challenge 2: Docker Image Size
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Initial image was 1.2GB (too large for quick pulls).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Multi-stage builds + Alpine base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Build stage
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

# Runtime stage
FROM python:3.11-alpine
WORKDIR /app

# Copy only installed packages
COPY --from=builder /root/.local /root/.local

# Copy application
COPY . .

# Set PATH
ENV PATH=/root/.local/bin:$PATH

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Image size reduced to &lt;strong&gt;350MB&lt;/strong&gt; (70% smaller).&lt;/p&gt;




&lt;h3&gt;
  
  
  Challenge 3: MIB Browser Tree Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Expanding large MIBs (e.g., CISCO-SMI with 3000+ objects) caused browser freeze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solutions implemented:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lazy loading:&lt;/strong&gt; Load children only when node is expanded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth control:&lt;/strong&gt; User chooses 1-5 levels (prevents over-expansion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debounced search:&lt;/strong&gt; 500ms delay to avoid excessive API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual scrolling:&lt;/strong&gt; Only render visible nodes (future enhancement)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Debounced search
let searchTimeout;
searchInput.addEventListener('input', (e) =&amp;gt; {
    clearTimeout(searchTimeout);
    searchTimeout = setTimeout(() =&amp;gt; {
        performSearch(e.target.value);
    }, 500);  // Wait 500ms after user stops typing
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Smooth navigation even with 5000+ object MIBs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with MVP, Iterate Based on Feedback
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;v1.0.0&lt;/strong&gt; (June 2025):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 components: Simulator, Walker, Traps, MIB Manager&lt;/li&gt;
&lt;li&gt;Basic functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;v1.2.0&lt;/strong&gt; (Feb 2026):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added MIB Browser (most requested feature)&lt;/li&gt;
&lt;li&gt;Enhanced trap management&lt;/li&gt;
&lt;li&gt;State persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Ship early, listen to users, add features they actually need.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Documentation is as Important as Code
&lt;/h3&gt;

&lt;p&gt;I spent &lt;strong&gt;20% of development time&lt;/strong&gt; on documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comprehensive README&lt;/li&gt;
&lt;li&gt;Architecture diagrams&lt;/li&gt;
&lt;li&gt;API documentation (FastAPI auto-docs)&lt;/li&gt;
&lt;li&gt;Code comments&lt;/li&gt;
&lt;li&gt;Contributing guidelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 150+ stars in 2 months, active community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Good docs = more users = more contributors.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. One-Command Install is Crucial
&lt;/h3&gt;

&lt;p&gt;Users won't read complex setup instructions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Clone repo
git clone ...
cd trishul-snmp

# Install dependencies
pip install -r requirements.txt
npm install

# Configure
cp .env.example .env
vim .env

# Build
docker-compose build

# Run
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Lower barrier to entry = more users trying it.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Open Source ≠ Free Labor
&lt;/h3&gt;

&lt;p&gt;Be clear about support expectations:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Added:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code of Conduct&lt;/li&gt;
&lt;li&gt;Contributing guidelines&lt;/li&gt;
&lt;li&gt;Issue templates&lt;/li&gt;
&lt;li&gt;Pull request template&lt;/li&gt;
&lt;li&gt;License (MIT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Set boundaries:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response time: "Best effort, usually within 48 hours"&lt;/li&gt;
&lt;li&gt;Feature requests: "Vote on issues, no guarantees"&lt;/li&gt;
&lt;li&gt;Support: "Community-driven, use Discussions"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Protect your time while being welcoming.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Community Matters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What worked:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Discussions for Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;Twitter/LinkedIn posts&lt;/li&gt;
&lt;li&gt;Dev.to articles (like this one!)&lt;/li&gt;
&lt;li&gt;Responding to every comment/issue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What didn't:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discord server (too early, not enough users)&lt;/li&gt;
&lt;li&gt;Weekly newsletters (too much overhead)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Focus on platforms where your users already are.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (8 Months After Launch)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;150+ GitHub stars&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🍴 &lt;strong&gt;25+ forks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🐳 &lt;strong&gt;500+ Docker pulls&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Active community&lt;/strong&gt; in Discussions&lt;/li&gt;
&lt;li&gt;🏢 &lt;strong&gt;3 companies&lt;/strong&gt; using in production (for dev/test)&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;5 blog posts&lt;/strong&gt; by community members&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next? v1.3.0 Roadmap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🚧 In Progress:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔐 &lt;strong&gt;SNMPv3 authentication&lt;/strong&gt; (MD5, SHA, AES encryption)&lt;/li&gt;
&lt;li&gt;⏰ &lt;strong&gt;Scheduled SNMP walks&lt;/strong&gt; (cron-like syntax)&lt;/li&gt;
&lt;li&gt;📧 &lt;strong&gt;Notifications&lt;/strong&gt; (Email/Slack/Webhook for traps)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📋 Planned:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📊 &lt;strong&gt;Custom dashboards&lt;/strong&gt; (drag-and-drop widgets)&lt;/li&gt;
&lt;li&gt;🔑 &lt;strong&gt;API keys&lt;/strong&gt; (rate limiting, authentication)&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Bulk device management&lt;/strong&gt; (import/export CSV)&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Historical data&lt;/strong&gt; (time-series graphs)&lt;/li&gt;
&lt;li&gt;🌙 &lt;strong&gt;Dark mode&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Multi-language support&lt;/strong&gt; (i18n)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vote on features:&lt;/strong&gt; &lt;a href="https://github.com/tosumitdhaka/trishul-snmp/issues" rel="noopener noreferrer"&gt;https://github.com/tosumitdhaka/trishul-snmp/issues&lt;/a&gt;&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Quick Start:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default login:&lt;/strong&gt; &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin123&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Explore:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Upload a MIB file (try IF-MIB)&lt;/li&gt;
&lt;li&gt;Browse the MIB tree&lt;/li&gt;
&lt;li&gt;Walk a device (or use the simulator)&lt;/li&gt;
&lt;li&gt;Send a test trap&lt;/li&gt;
&lt;li&gt;Explore trap library&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;Trishul-SNMP is &lt;strong&gt;100% open source&lt;/strong&gt; (MIT License).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ways to contribute:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the repo&lt;/li&gt;
&lt;li&gt;🐛 Report bugs&lt;/li&gt;
&lt;li&gt;💡 Suggest features&lt;/li&gt;
&lt;li&gt;🔧 Submit PRs&lt;/li&gt;
&lt;li&gt;📝 Write tutorials&lt;/li&gt;
&lt;li&gt;💰 Sponsor development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tosumitdhaka/trishul-snmp" rel="noopener noreferrer"&gt;https://github.com/tosumitdhaka/trishul-snmp&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building Trishul-SNMP taught me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Modern web tech can revitalize old protocols&lt;/strong&gt; - SNMP is from 1988, but a good UI makes it accessible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source is about community, not just code&lt;/strong&gt; - Documentation, support, and engagement matter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Good UX matters, even for network tools&lt;/strong&gt; - Engineers appreciate beautiful, intuitive interfaces too&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start small, iterate fast&lt;/strong&gt; - MVP → feedback → features users actually want&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you work with SNMP, give it a try. If you find it useful, star the repo and share it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions? Comments?&lt;/strong&gt; Drop them below or open a GitHub Discussion.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the Author
&lt;/h2&gt;

&lt;p&gt;I'm &lt;strong&gt;Sumit Dhaka&lt;/strong&gt;, a devops &amp;amp; integration engineer who loves building tools that make life easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐙 GitHub: &lt;a href="https://github.com/tosumitdhaka" rel="noopener noreferrer"&gt;@tosumitdhaka&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💼 LinkedIn: &lt;a href="https://www.linkedin.com/in/sumit-dhaka-a5a796b3/" rel="noopener noreferrer"&gt;Sumit Dhaka&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📧 Email: &lt;a href="mailto:sumitdhaka@zohomail.in"&gt;sumitdhaka@zohomail.in&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Note: Its an AI generated article and may have some inconsistency.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #snmp #networking #opensource #python #fastapi #docker #devops #webdev #mib #networkengineering&lt;/p&gt;

</description>
      <category>snmp</category>
      <category>networking</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
