Changelog
Release history
Read live from GitHub Releases, which is where releases are actually written — this page cannot drift out of date because there is nothing here to forget to update.
## What's new in v1.6.2 A maintenance release, and one worth taking: it fixes a case where monitoring history stopped being recorded without saying so, and an HTTP/2 advisory this build was reachable through. ### Fixes - **Monitoring history could stop being written, silently.** A data point left buffered for a session that had been deleted is refused by the database. The batch is written as one transaction, so the refusal failed the whole batch, and a failed batch was kept to be retried — which is right for a busy database and wrong for a refusal that will never succeed. The same row then failed every flush after it, so **nothing was persisted again, for any session**, until the application was restarted. Charts kept drawing from memory and looked healthy throughout. Only the rows the database refuses permanently are now dropped; everything else is still kept and retried. - **An HTTP/2 advisory this build was reachable through.** GO-2026-6617, a crash from an HPACK encoder race, reached SnmpLens through the webhook delivery path and the update download. Fixed by Go 1.26.9 and `golang.org/x/net` 0.60.0; no SnmpLens code changed. - Two more advisories cleared on the way: `devalue` 5.9.4 (high severity, six advisories, reached through Svelte) and `source-map-js` 1.2.2 (CVE-2026-93749), carried by the Vite update. ### Under the hood - `modernc.org/sqlite` 1.60.1, `vite` 8.3.4, `@sveltejs/vite-plugin-svelte` 7.3.1, `github/codeql-action` 4.38.2. - Built with Go 1.26.9, and tested under `-race` on Windows, macOS and Linux. - CI now fails when one GitHub Action is pinned at two different commits. The CodeQL action is used twice, `init` and `analyze`, and the two compare versions at run time — so a bump that moves one and not the other fails in a way that reads like a flaky upgrade rather than a pair that cannot be split. ### On the site - A [comparison page](https://snmplens.com/comparison.html): SnmpLens against iReasoning MIB Browser, the ManageEngine free tool and SnmpB, with every cell taken from each product's own documentation and dated. --- Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the in-app auto-updater before anything is applied; the manifest names the tag it belongs to, so an older signed manifest cannot be replayed in place of this one, and every asset carries attested build provenance: ``` gh attestation verify SnmpLens-windows-amd64.exe --repo SnmpLens/SnmpLens ``` **Full changelog**: https://github.com/SnmpLens/SnmpLens/compare/v1.6.1...v1.6.2 ## What's Changed * Bake v1.6.1 into the site by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/99 * Compare SnmpLens with the three tools people reach for first by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/100 * Bump github/codeql-action from 4.38.1 to 4.38.2 by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/105 * Bump vite from 8.3.0 to 8.3.1 in /frontend by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/101 * Bump @sveltejs/vite-plugin-svelte from 7.3.0 to 7.3.1 in /frontend by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/102 * Fail when one action is pinned at two different commits by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/106 * Compare the rendering, not the line endings by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/107 * Clear the two advisories that turned Security audit red by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/110 * Bump modernc.org/sqlite from 1.59.0 to 1.60.1 by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/109 * Bump vite from 8.3.1 to 8.3.4 in /frontend by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/108 * Drop only the rows the database refuses for ever by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/112 **Full Changelog**: https://github.com/SnmpLens/SnmpLens/compare/v1.6.1...v1.6.2
## What's new in v1.6.1 A maintenance release — and the one that completes the release signing key rotation begun in v1.6.0. ### The signing key rotation is complete v1.6.0 added a second trusted signing key and was itself signed with the original one, so that every installed copy could take it. **v1.6.1 is the first release signed with the new key.** - **Running v1.6.0 or later** — nothing to do. Your copy already trusts the new key, and the in-app updater verifies this release as usual. - **Running v1.5.0 or earlier** — the in-app updater will refuse this release, because your copy trusts only the retired key. Install it by hand once from the assets below; updates resume normally afterwards. The rotation was deliberately staged over two releases so that no copy would be stranded by a key change delivered in one step. The retired key stays embedded for one more release, which is what keeps the switch reversible. ### Fixes - **The debug panel's redaction is now held to what gosnmp really prints.** SnmpLens strips the community string out of the SNMP debug log by matching gosnmp's own wording, and the community of a *received* packet is covered by that pattern alone — it is never a value SnmpLens was configured with. The pattern is now checked against gosnmp's real output on every build, instead of against a copy kept in a test, which had itself drifted out of date with nothing noticing. - Removed an unused import that was the repository's only open code-scanning alert. - `esbuild` is now declared as the development dependency seven test files import, rather than being present only because another package happened to pull it in. ### Under the hood - What SnmpLens relies on gosnmp doing — the wording of the debug log, the version strings the Traps tab filters by, a USM user table that accepts a user which can never authenticate — is asserted against gosnmp itself on every build, instead of being described in a comment beside a version number. What cannot be reached through its API is still cited, and a test now holds those citations to the version actually built against. - `github.com/gosnmp/gosnmp` 1.45.0, `github.com/wailsapp/wails/v2` 2.16.0, `modernc.org/sqlite` 1.59.0, `svelte` 5.57.1, `vite` 8.3.0, `github/codeql-action` 4.38.1. - Built with Go 1.26.7, and tested under `-race` on Windows, macOS and Linux. --- Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the in-app auto-updater before anything is applied; the manifest names the tag it belongs to, so an older signed manifest cannot be replayed in place of this one, and every asset carries attested build provenance: ``` gh attestation verify SnmpLens-windows-amd64.exe --repo SnmpLens/SnmpLens ``` **Full changelog**: https://github.com/SnmpLens/SnmpLens/compare/v1.6.0...v1.6.1 ## What's Changed * Declare esbuild, which seven test files import by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/95 * Bump github/codeql-action/analyze from 4.38.0 to 4.38.1 by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/94 * Bump modernc.org/sqlite from 1.58.0 to 1.59.0 by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/89 * Bump github.com/wailsapp/wails/v2 from 2.15.0 to 2.16.0 by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/92 * Bump vite from 8.2.2 to 8.3.0 in /frontend by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/88 * Bump svelte from 5.57.0 to 5.57.1 in /frontend by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/90 * Remove an import nothing uses by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/96 * Bump github.com/gosnmp/gosnmp from 1.44.0 to 1.45.0 by @dependabot[bot] in https://github.com/SnmpLens/SnmpLens/pull/91 * Assert what gosnmp does, and cite only what cannot be asserted by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/97 * Record that the updater key rotation reached step 3 by @Wasabules in https://github.com/SnmpLens/SnmpLens/pull/98 **Full Changelog**: https://github.com/SnmpLens/SnmpLens/compare/v1.6.0...v1.6.1
## What's new in v1.6.0
Larger again than v1.5.0. SnmpLens now brings its own equipment to practise on,
dashboards that describe themselves, and identifiers you name once and hand to
many targets.
### Features
**Simulated devices.** A whole SNMP agent lives in the application: v1, v2c and
v3 with the full USM, answering from a tree of objects on a loopback address, so
you can walk, poll, chart and receive traps with no hardware at all. The
**Simulator** in the header creates a device in two clicks, starts it, and adds
it as a target with the identifiers it answers to. Fourteen models ship with it —
a Linux server, a Windows server, an iDRAC9, a Catalyst 2960 in 24 and 48 ports,
an ISR 4331 with two eBGP sessions, a MikroTik RB4011, a FortiGate 60F, a UniFi
U6 Pro, a Synology NAS, a three-phase APC Smart-UPS, an APC rack PDU, an HP
LaserJet and an ENTITY-SENSOR-MIB probe — and each answers a whole agent's walk,
from about 300 objects to 5 600. A device is described once and every standard
MIB is built from that one description, so they agree the way a real agent's do:
an address sits on an interface `ifTable` lists, a route leaves through one,
`tcpCurrEstab` counts the sessions `tcpConnTable` lists, and a bridge port is an
interface with the stations learnt on it behind it.
**What a simulated device sends.** Traps and INFORMs in v1, v2c and v3, to up to
eight destinations anywhere on your network: at boot, on a refused request, on a
schedule, or on demand. Each version carries what a real agent's does — v2c and
v3 lead with `sysUpTime.0` and `snmpTrapOID.0`, v1 follows RFC 3584 — and a v3
trap goes as the device's own engine while an INFORM is localised to the
receiver's, which is what lets SnmpLens acknowledge its own.
**Writable devices.** A write community for v1 and v2c, or an SNMPv3 user allowed
to SET. A write changes what the device answers until it restarts, as a running
configuration does until it is saved; every varbind is checked before any is
applied, and a manager that may only read is answered `noAccess`, as net-snmp
answers a `rocommunity`. Rows are created and destroyed through their `RowStatus`
column, read from the MIBs you have loaded — so table editing can be exercised
end to end without touching a real switch.
**Shaping what a device answers.** A model may be given numbers — the Catalyst's
ports, the Synology's disks, the PDU's outlets, the Linux server's processors —
and a device may carry values of its own at any OID, in the same vocabulary
custom models use. The editor's **Data** tab previews what the device would
answer, named from your loaded MIBs, searchable by name or by subtree, with each
value saying whether it is static, a counter, a gauge, an uptime or computed, and
re-read every few seconds so that what moves is seen moving.
**Faults, on demand.** Latency and jitter, a share of requests lost, a mute
device, answers replaced by `genErr` or `tooBig`, and counters running ten, a
hundred or a thousand times faster — applied to the running agent without a
restart, so a test of reachability, of the overrun guardrail or of a rate across
a counter wrap watches the very uptime and counters a restart would have reset. A
speed change carries the counters on from where they are, never a jump.
**A bench that travels.** Export one device or all of them to a JSON file, with
or without their passwords — you are asked every time, and the file says which it
holds. Import makes every device new here, with its own ID and engine, so two
imports of one file are two devices no manager confuses. Devices can also be
duplicated, restarted, and started with the application.
**Your own models.** A model can be a JSON file you write, in a frozen vocabulary
the application reads the way it reads a preset, or a package of files — identity,
objects, notifications, an icon, and `walks/` holding what a real device actually
answered, in snmpsim's `.snmprec` format or `snmpwalk -On` output. And SnmpLens
can make one for you: **Record a device** walks real equipment and writes the
package, keeping the types the agent sent rather than the text it printed. What
is written wins over what was recorded, OID by OID, and the agent's own subtrees —
where a real device keeps its engine ID, its SNMPv3 users and its community
table — are never recorded and never served.
**Credential profiles.** A named set of identifiers — a community, or an SNMPv3
user with its protocols and passphrases — carrying its own version, given to
targets instead of the defaults. A target's identity comes from exactly one
place: its profile, its own overrides, or the defaults. Monitoring sessions
follow a profile when you rotate it, polling several targets splits into one
session per set of identifiers rather than asking them all with the default
community, and the trap listener now accepts **every** SNMPv3 user at once — the
default user and every profile — where it used to take one and silently drop
everything else. The Traps tab lists who is heard, and says so when a user is
refused.
**Dashboard presets.** A preset is a small JSON file describing what to poll on
one kind of equipment, how often, and how to draw it — meant to be shared. It
picks from a fixed vocabulary of widgets (values, rates, charts, a wall of
statuses, a grid, a map) and cannot describe one, so a file from a stranger
cannot carry anything that executes. Five examples ship with the application.
A preset can **discover its instances** with one walk at bind time — `{#}` where
the instance goes — so one file fits a 24-port switch and a 48-port one, and the
walked column names the ports as the equipment calls them. It can **place its
widgets** on a twelve-column grid, **say what it thinks is too much** with a
threshold band that becomes the session's own, and **draw a rack or a site** from
four shapes placed in percentages, coloured by live readings. Binding states what
it will cost — widgets, OIDs, requests per day, how many readings are watched —
before a single packet is sent, and one preset can be drawn across several
equipments at once. SnmpLens now also asks a device what it is (`sysObjectID`),
so the library can put the presets that match it first.
**MIB tooling.** The editor gained an outline of everything the buffer defines,
and its symbol catalogue is cached — 122 ms per analysis became 1.35 ms on a
vendor-sized corpus. A MIB is analysed when it opens rather than on the first
keystroke, so the outline is never empty. And a **dependency graph** draws what
imports what, naming the modules that are missing and the symbols that needed
them.
**The site and the documentation.** Every feature is documented on
[snmplens.com](https://snmplens.com/), with the screenshots taken from the real
application rather than drawn; the browser demo now includes the simulator, with
its catalogue and a small bench; and the home page says how many times SnmpLens
has been downloaded.
### Fixes
- The live event tail is registered once rather than on every render, and a list
is never keyed on a repeated id — the two together could duplicate or drop
events in the journal.
- A poll round can no longer end the process: a panic in one session is recovered
and journalled instead of taking the application with it.
- Cancelling a poll no longer stores a round of errors, which used to break every
series and read as a device that had stopped answering.
- One plan decides every chart colour, and a series dropped for want of a colour
is now said out loud rather than silently missing.
- Two injection defects an audit found: control characters are escaped in syslog
messages, and CSV exports escape the spreadsheet formula prefixes.
- The five things filming the dashboard showed, and the four that running the
application showed — including a map whose links were drawn with no stroke at
all, and five theme variables that were never defined anywhere.
### Under the hood
- The application moved out of the repository root into `internal/app`: the root
went from 68 entries to 19, and `main.go` now holds only what the binary
embeds.
- **The repository moved to [github.com/SnmpLens/SnmpLens](https://github.com/SnmpLens/SnmpLens).**
Every old link redirects, and installed copies keep updating.
- The updater now trusts **more than one signing key**, so the release key can be
rotated without stranding installed copies. This release is signed with the key
every copy already trusts. The release pipeline also verifies the signature it
has just made against the keys compiled into the same commit, and exercises a
staged key without publishing it.
- A community catalogue — [SnmpLens/snmplens-community](https://github.com/SnmpLens/snmplens-community) —
for simulator models and dashboard presets, whose pull requests are validated
by building each one with the application's own parser rather than a second
implementation.
- The integration tests now drive a real agent in-process on every platform,
which is what retired the Python test agent that used to ship and in practice
ran nowhere.
- `modernc.org/sqlite` 1.58.0, `golang.org/x/mod` 0.41.0, `golang.org/x/sys`
0.48.0, `github/codeql-action` 4.38.0.
- 1103 frontend assertions and 17 Go packages under `-race`, on Windows, macOS
and Linux.
---
Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the
in-app auto-updater before anything is applied; the manifest names the tag it
belongs to, so an older signed manifest cannot be replayed in place of this one,
and every asset carries attested build provenance:
```
gh attestation verify SnmpLens-windows-amd64.exe --repo SnmpLens/SnmpLens
```
**Full changelog**: https://github.com/SnmpLens/SnmpLens/compare/v1.5.0...v1.6.0
## What's new in v1.5.0 The largest release so far. SnmpLens keeps working with the window closed, tells somebody when something breaks, and lets you edit the MIBs it reads. ### Features **Background operation.** The poll clock now lives in Go, so monitoring, thresholds and alerts keep running when the window is closed — previously closing it silently stopped every session. A system-tray icon, a "start at login" entry (per-user only, so it never asks for elevation) and a close-to-tray preference come with it. **Alerting: an event journal and notification routing.** Traps, threshold breaches and reachability changes are recorded in a durable journal, then routed by rules you write — matched on category, severity, source and OID prefix, with priorities, a "stop here" flag and quiet hours evaluated in your own timezone. Destinations are syslog (UDP, TCP and TLS per RFC 5425), a webhook, or email. Deliveries go through a durable outbox with exponential backoff, so an alert survives a closed window or an unreachable collector, and a delivery log screen shows what was sent, what is waiting and what was given up on. **Message templates.** A destination can carry its own subject and body, over a fixed vocabulary the settings screen lists. A webhook can send its own JSON instead of the SnmpLens envelope — which is how you talk to Slack, Teams or Alertmanager — and the preview renders through the same code the sink uses, so what is on screen is what will be sent, with its size and its parse result. **A MIB editor.** A full editing tab for the MIBs in your configuration directory, or any file you open: syntax highlighting, find and replace, undo and redo grouped by edit rather than by keystroke, drafts that survive closing the window, automatic backups, and a "restore bundled" button. Diagnostics are two-tier — positioned syntax errors as you type, semantic analysis on a pause — and cover what neither the parser nor the loader reports on its own: unknown types, duplicate OIDs, unresolved parents, missing modules in `FROM`, undefined `INDEX`. A "Fix imports" button works out which symbol comes from which module and edits the IMPORTS clause as text, so comments and alignment survive. **Why a MIB did not load.** gosmi answers "Could not load module at X" for a missing file, a PDF, a syntax error on line 412 and an unsatisfiable IMPORTS clause alike. SnmpLens now reports the stage it reached, the located diagnostics with an excerpt and a caret, the imports it could not satisfy and the symbols each was needed for, and it recognises the files people actually download by mistake — an HTML page, a PDF, a zip, a UTF-16 file. **Conceptual tables, decoded and editable.** A table's INDEX is split per RFC 2578 §7.7 rather than shown as a raw sub-OID, so `tcpConnTable` reads as four columns instead of one opaque `10.0.0.5.161.192.168.1.9.50000`, name-keyed tables show names, and rows sort correctly. Tables with a `RowStatus` column can have rows created and destroyed, written in one PDU so the agent never sees a half-built row. **INFORMs.** Acknowledged notifications, sent and received, alongside traps. **IPv6.** Targets, the trap listener and traceroute all work over IPv6. **Credentials held by the operating system.** The community string and v3 passphrases are sealed with a key kept in DPAPI, the macOS Keychain or a protected file, rather than beside the ciphertext in localStorage. The settings banner names the backend rather than claiming more than it delivers. **Target labels everywhere.** A label given to a device now appears in SNMP operations, traps, history and events — not only in Monitor — with the address on hover. **A project site**, at https://snmplens.com, with documentation, a changelog and a browser demo that runs the real application on fixed data. ### Fixes - The routing rules list stopped rendering when any rule had a destination. - Restored monitoring sessions no longer lose the indicator showing which samples failed — the live and reloaded paths built points differently, and only the reloaded one was wrong. - A keyboard listener accumulated on every switch away from the MIB tab. - The MIB node panel shows Status, Units and Parent, which it had been laid out for but never received. Status matters: it tells you an object is `deprecated` or `obsolete` before you build monitoring on it. - The credential banner in SNMP settings renders its icon. - On macOS, the "runs at login" line shows the command rather than the entry's name. - The results table decodes enumerations again: `ethernetCsmacd(6)` rather than `6`. - A trap storm is no longer silently truncated by the socket receive buffer — measured, 417 of 2000 datagrams recorded before, 2000 after. - Stopping the trap listener no longer waits two seconds for a value another goroutine had already taken, and no longer leaves a socket bound when a stop lands while it is still binding. - Quiet hours are evaluated at the event's own time, converted to your timezone; they were rotating by the machine's UTC offset. - A notification is retried or given up on according to the reply CODE, not its text. A 503 reading "invalid upstream" was being discarded. - A webhook no longer follows redirects, which Go rewrites as a GET with no body — a receiver behind a 302 answered 200 having been sent nothing, and the delivery was recorded as successful. - A credential is scrubbed from any error a receiver hands back, so a debug endpoint that echoes headers cannot write it into the database. - Switching a destination off means silence, not an alarm on every event. - One unreachable relay no longer holds up a healthy webhook. - Mail: dot-stuffing, header folding, a subject over ~300 non-ASCII characters arriving as a bare ellipsis, and credentials being offered before the connection was encrypted. - A locked credential store no longer erases the credentials it could not read. - Several ways the MIB editor could lose work, wedge, resurrect undone text, or report a destroyed tree as healthy. - Find and replace worked on the wrong text in five ways. - "Fix imports" no longer breaks a correct MIB. - Anonymous Mode masks the sentence, not just the column. - Discovery no longer tries to expand a `/8` into 16.7 million strings, or an IPv6 `/64` for ever. - Screenshots on the site load in Firefox. ### Under the hood - The frontend is Svelte 5 (from 3.59), with Vite 8. Svelte 5 removed two compiler warnings this project relied on, so both are now checks of our own — one for a name nothing declares, one for a rendered expression that depends on state it does not name. Eight of the latter were live at migration time. - Go 1.26.7 and Wails v2.15.0. - Tests run on Windows, macOS and Linux rather than Linux alone. `pkg/autostart`, `pkg/secrets` and `pkg/network` are three implementations behind one interface each, and only one was ever exercised — the first multi-platform run found a macOS defect. - Release signing is mandatory rather than best-effort, the checksums manifest is bound to its tag so an older signed manifest cannot be replayed, and build provenance is attested: `gh attestation verify SnmpLens-windows-amd64.exe --repo Wasabules/SnmpLens`. - `govulncheck` now scans the whole tree. It had been silently skipping the main package on Linux and reporting a clean bill of health. - Event routing runs off the trap listener's goroutine in bounded batches, behind a durable watermark, so a crash replays rather than loses. Journal trimming went from 173 ms to 20 ms. Measured end to end: no loss at 2000 traps/s sustained. - Database contention is reported rather than hidden — a call waiting on a pooled connection blocked 748 ms and returned success with nothing in any log. - 449 frontend assertions and 13 Go packages under `-race`, on every platform. --- Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the in-app auto-updater before anything is applied. From this release the manifest also names the tag it belongs to, so an older signed manifest cannot be replayed in place of this one, and every asset carries attested build provenance: ``` gh attestation verify SnmpLens-windows-amd64.exe --repo Wasabules/SnmpLens ``` **Full changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.4.1...v1.5.0
## What's new in v1.4.1 ### Fixes - **SNMPv3 AuthNoPriv authentication failures** — in `AuthNoPriv` (and `NoAuthNoPriv`) mode the app still sent a privacy protocol (DES by default, since the disabled Privacy field keeps its value). The SNMP library then rejected the request (*"PrivacyPassphrase is required when a privacy protocol is specified"*) and authentication failed. The privacy protocol is now forced to `NoPriv` unless the security level is `AuthPriv` (and auth to `NoAuth` at `NoAuthNoPriv`), so a stale/default protocol coming from the global settings or a per-target override is ignored. This covers the global settings, per-target overrides, discovery and monitoring alike. Thanks to **@JessonJiang** for the detailed report and a proposed fix (#3). --- Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the in-app auto-updater before anything is applied.
## What's new in v1.4.0 ### Features - **History stored in SQLite** — the query history now lives in a local SQLite database instead of browser localStorage. This removes the 500-entry cap and the silent data loss that could happen on large walks. Existing history is migrated automatically on first launch. - **Sortable history** — sort entries by date, operation, target, duration or status. - **Multi-select** — select several history entries to delete or export them in bulk. - **Flexible export** — export history as **CSV or JSON**, scoped to **all / filtered / selected** entries, to the clipboard or a downloaded file. - **Central value badge** — each history row now shows its value (or "N results") as a clear central badge: blue for a value, red **"Error"** for a failed request, grey **"No result"** when empty — so you can read the outcome without expanding the row. - **Pagination** on the History tab, a **"View history"** shortcut, and click-through from Recent history that jumps to and highlights the matching entry. ### Fixes - Exports now honour **Anonymous Mode** — target IPs are masked in CSV and JSON output, matching the rest of the UI. - CSV export escapes spreadsheet **formula-injection** prefixes (`=`, `+`, `-`, `@`). - Guard against a crash when rendering a history entry with a missing operation (e.g. an imported entry). - History **import** now replaces the current history instead of merging into it. - History trimming and ordering use true insertion order (rowid), and trimming no longer runs on the per-operation write path. - Fixed a startup race that could drop a request run while the history was still loading, and a case where the highlight was lost when jumping from Recent history. - Removed the redundant OID copy button from history rows (the OID is still copyable from the expanded detail). ### Under the hood - Large Svelte components were split into focused, maintainable pieces (`HistoryEntry`, `HistoryExportModal`, `ResultsComparison`, `OperationTabs`, `SetConfirmModal`, and a reusable `ConfirmDialog`). - Centralised shared styles and tidied theme tokens. --- Binaries ship with an Ed25519-signed `SnmpLens-checksums.txt`, verified by the in-app auto-updater before anything is applied.
## What's new in v1.3.2 ### Features - **In-app auto-update** — SnmpLens now checks GitHub Releases and can download & install updates from within the app. Releases are signed (Ed25519) and their checksums verified before anything is applied. - **Table view — right-click menu** to copy a cell's value, OID, `OID = value`, the whole row, the index or the column name. - **Table view — "Copy for Word"** copies the table as HTML so it pastes as a real table into Word, Google Docs or Outlook. - **Refreshed UI** — emojis replaced by a consistent Lucide icon set throughout. ### Fixes - **Walk → Table view** now shows the rows (it previously displayed only the column headers). - **Column sorting** in the table view now actually reorders the rows. - **Binary values** such as MAC addresses (`ifPhysAddress`) are shown as hex (`00:11:22:33:44:55`) instead of garbled characters — in every view. - **Traps** — an expanded trap no longer collapses when a new one arrives. - **Layout** — settings fields no longer overflow their column, and the breadcrumb / favorites panels are no longer crushed when the tree is fully expanded. - The **Debug** panel toggle moved into Settings. **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.3.0...v1.3.2
## v1.3.1 **No code change.** This tag points at the same commit as v1.3.0 (`c1daf05`) and was published six minutes later to correct the release assets. Everything described in the v1.3.0 notes applies unchanged. If you are on v1.3.0 there is nothing here to update to. The first release with changes after this one is [v1.3.2](https://github.com/Wasabules/SnmpLens/releases/tag/v1.3.2). **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.2.0...v1.3.1
## What's new in v1.3.0 ### Features - **In-app auto-update** — SnmpLens checks GitHub Releases and can download and install an update from within the app. Release checksums are signed with Ed25519 and verified before anything is applied; a missing or invalid signature is a refusal, not a warning. - **Lucide icon set throughout**, replacing the emojis, so the interface renders the same on every platform and at every font setting. - **New application icon.** ### Fixes - Settings and MIB-tree layout issues. **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.2.0...v1.3.0
## What's new in v1.2.0 ### Features - **The standard MIBs now ship inside the binary.** SNMPv2-SMI, SNMPv2-TC, IF-MIB, IP-MIB, TCP-MIB, UDP-MIB and the rest are extracted to the per-user MIB directory on first run, so a fresh install resolves `sysDescr` and walks `ifTable` without downloading anything first. - **Import button in the target dialog**, next to drag and drop, for anyone who would rather pick a file. - **Targets can be edited** individually instead of removed and re-added. **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.1.1...v1.2.0
## What's new in v1.1.1 ### Fixes - **The Windows installer no longer asks for administrator rights.** It installs per user (`RequestExecutionLevel user`), which is all SnmpLens needs: it writes only to the user's own configuration directory and registers no service. An SNMP browser that demands elevation to install is one that does not get installed on a managed workstation. **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.1.0...v1.1.1
## What's new in v1.1.0 ### Features - **Anonymous Mode** — masks target addresses and other identifying values on screen, so a session can be shown or screen-shared without exposing the estate. Display masking only, and deliberately off again on restart. - **Drag and drop MIB import** — drop a file or a whole folder onto the window. Duplicates are detected rather than silently overwritten, and anything that fails to load is reported in a modal that says which file and why. - **Native OS notifications** — Windows toast, macOS and Linux, for traps arriving while the window is not in front. - **Value formatting** — typed SNMP values are rendered as what they are instead of as raw text. - **Bundled SNMP test agent** — `tools/snmp_test_agent.py` serves v1, v2c and v3 with realistic OIDs and periodic traps, so the app can be exercised without a device. ### Fixes - **The monitoring graph and the debug panel showed nothing.** Both are now driven by the polling store rather than by their own state. - **Traps mounted incorrectly** on arrival. - **Per-target overrides could not be bound dynamically** — Svelte does not allow a dynamic `bind:`, so the override form now dispatches instead. **Full Changelog**: https://github.com/Wasabules/SnmpLens/compare/v1.0.0...v1.1.0
## What's new in v1.0.0 The first release. SnmpLens is a desktop SNMP MIB browser in a single native binary — no runtime, no agent, no account — for Windows, macOS and Linux. ### Features - **MIB browser** — load MIB files from a persistent directory, browse the tree, and read a node's definition, syntax and access. Per-file load diagnostics report which module failed and why. - **SNMP operations** — GET, GETNEXT, GETBULK, SET and WALK over SNMPv1, v2c and v3, against one target or several at once. - **Traps** — a built-in listener that receives traps, and a sender for testing a collector. - **Discovery** — sweep a range and report which hosts answer SNMP. - **Monitoring** — poll an OID on a schedule and chart it, with the history kept in a local SQLite database. - **Network tools** — ping and traceroute in pure Go, with no elevated privileges. - **Working aids** — favourites, saved queries, recent history, a result diff, a breadcrumb over the tree, a context menu and a keyboard-shortcut reference. - **Five languages** — English, French, German, Spanish and Chinese. - **Debug panel** — the raw SNMP exchange, when a device does something unexpected.
This list is a snapshot, written into the page so that it can be read without scripts. With a working network it is replaced by the live one from GitHub Releases.
Versions follow semantic versioning. Each release carries a SHA-256 manifest and its signature; see verifying a download.