Releases: wijnberg-net/osprey
Release list
Osprey 1.3.2
Osprey 1.3.2. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
A correctness release. Five independent audits — the database, the EIGRP module, the BGP tables against the routers' own output, and the HTTP API — drove this work, and every fix below was verified against live equipment rather than assumed. The theme throughout: a number that cannot be measured is now shown as unmeasured instead of as a plausible-looking wrong answer.
Highlights since 1.3.1
EIGRP accuracy
- The hop metric now means what the label says. EIGRP's Feasible Distance is the lowest distance seen since a route last went passive — a feasibility threshold, not today's cost — yet it was labelled "the router's own composite metric". The two only diverge when something interesting happens, which is exactly when you are looking. Osprey now reads the router's current computed distance and the successor's reported distance, and every metric surface (hop table, path bar, hop diagram, stitched segments, RIB view) shows the current distance with a self-labelled fallback for older data.
- Unreachable is no longer a four-billion metric. When DUAL has no feasible successor the MIB reports a saturated sentinel; it was stored and rendered as a distance. Such destinations are now marked unreachable — the route still shows, because "known but currently unreachable" is real DUAL state — paths terminate with a named
route_unreachableoutcome, and an uninstalled route can no longer win a routing decision with a fabricated metric. - The RIB view stopped serving a bystander's numbers. For a destination reached over several paths, the metric shown could belong to a path the router does not even use, and only one next hop appeared where the router installs several. The view now shows the per-destination distance and the full installed next-hop set — a third of IPv4 prefixes on a variance-configured network have more than one.
- Paths stay inside their routing context. An observed EIGRP path could hop from the global table into a VRF on prefix length alone, or compare two EIGRP processes by a metric no router compares. The walk now pins the VRF end-to-end (
?vrf=on the path API), stops with a named boundary result when a destination continues only in another context, and picks between processes by administrative distance first. - The neighbour "Hold" column reads "Hold left". It is a decaying countdown sampled mid-cycle, not the configured hold time — which is why healthy neighbours looked like they were seconds from expiry.
BGP and BMP
- Withdrawn prefixes no longer accumulate. Prefixes withdrawn while the collector was down were never deleted, so per-peer tables could drift far above reality — one session reported 70× the router's own count, with entries three weeks stale. Each completed table dump now reconciles the session: anything the peer no longer advertises is removed, which is safe precisely because a completed dump re-touches everything still live.
- Sessions carrying IPv6 over IPv4 transport are visible. Hundreds of sessions carried an IPv6 address family that was silently narrowed to IPv4 in the inventory. Every address family a session carries is now inventoried in its own right, with its own prefix count, and disappears again when it leaves the session.
- Prefix counts are measured or absent, never fabricated. Sessions discovered over the plain BGP MIB had no counter available and reported zero — sorted to the top of "fewest prefixes" and exported as data. Unmeasured now renders as a dash with its reason, sorts last in either direction, and exports empty; Cisco-agent sessions get genuine per-address-family counts instead. A flap no longer resets a measured count.
- Best paths decided by a coin flip say so. Where candidates tie through the entire decision process, Osprey and a router can legitimately disagree — different vendors break the tie differently. Winning paths now carry the decision step they resolved at, and the routes panel badges the ones settled at the final tiebreak, so a difference from your router is explained rather than mysterious.
- Historical questions no longer answer with phantoms. Asking about peers "as of" a date before recording began returned sessions that were not up at that moment, and a stale-clock class could write history intervals that closed before they opened. Both are repaired, with database constraints so the shape cannot come back.
Detection and alerting
- A persistent multiple-origin finding alerts once per episode. It re-alerted every fifteen minutes for as long as the condition lasted; it now opens, holds, and clears as one episode.
- Idle interfaces no longer freeze silently, and interface records gained the lifecycle timestamps that let stale ones be recognised and reaped.
- Topology events are joinable again. Three quarters of the event log — every stub-network addition — recorded no entity reference, so those events could not be tied back to the object they described.
Reliability and API behaviour
- "Not found" answers as not found. Four endpoints returned a server error for an absent or malformed identifier, which is indistinguishable from a broken server. They now answer
404and400correctly, and identifier validation was extended to route subtrees where it silently did not apply — malformed input no longer reaches the database. - Deleting part of the hierarchy is robust. Optional bookkeeping inside a delete (recording tombstones, cleaning history, stopping collectors) is now genuinely optional: a failure is logged and the delete proceeds, instead of aborting the whole operation with an error that pointed nowhere near the cause.
- Database privilege drift is detected at startup. A table left owned by the wrong role after an out-of-band migration silently disabled a feature and blocked its writes. Services now audit ownership and privileges on every table at startup and log a precise, actionable error — the drift is visible immediately instead of surfacing weeks later as an unexplained failure.
- Empty list responses are consistently empty lists, not
null, across the L2 topology API. - The topology canvas no longer mislabels EIGRP. Hovering an EIGRP node described its autonomous system as if it were an OSPF area.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/docs/
Osprey 1.3.1
Osprey 1.3.1. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
This release turns the BGP evidence Osprey already collects into security findings, decision explanations, and peer-quality answers: a BGP security report with alerting, operator-imported ROA validation, a selection funnel that names the RFC 4271 step behind every winning path, churn classification, a peer scorecard, and a new radial AS-flow lens whose zoom reveals detail instead of magnifying ink.
Highlights since 1.3.0
BGP security
- Security report (Reports → Routing): three deterministic checks over what your BMP sessions were offered — prefixes offered with multiple distinct origins, more-specifics announced under another origin's covering prefix, and paths that already contain your own AS (which the router provably can never select). Findings state presence ("this path was offered on this session"), never acceptance and never "hijack"; each names its observing sessions. When the live feed or the historical recording does not cover the requested scope, the report says so — an empty report under refusal is a coverage statement, not an all-clear.
- Security alerting. The same findings now flow into events, incidents, and alert rules: multiple-origin observed/cleared pairs and own-AS-offered events carry per-prefix identity (so the second affected prefix is not deduplicated away), recoveries resolve the alert from any vantage, and the rail brakes itself with per-prefix debounce and a storm ceiling that never drops a recovery. A new BGP Security group appears in the alert rule manager.
- ROA validation, honestly scoped. Import an authorization set from flat RPKI-style JSON (the DN42 registry export works as-is; AS0 authorizations supported) and every received path is badged valid/invalid/unknown per RFC 6811 at read time — on live views and in the replay, where historical paths validate against the set as of their moment, so updating the registry never rewrites what an old path was. With zero ROAs loaded there are no badges at all, and a coverage summary states what the set actually covers — a session showing no invalids may simply have them filtered upstream.
BGP insight
- The selection funnel. Clicking any observed adjacency now answers "why do paths win here": for the prefixes whose winning path traverses that hop, the RFC 4271 §9.1 step at which the decision actually resolved — LOCAL_PREF, AS-path length, ORIGIN, MED, eBGP-over-iBGP, IGP cost, router-ID tiebreak — shown as winner versus strongest runner-up with the median margin ("±1" next to AS-path length reads as one prepend from flipping). The comparator is the same code the best-path selection runs, so the explanation cannot disagree with the selection; anything the funnel cannot honestly attribute lands in an explicit undetermined bucket.
- Churn shapes. Session churn is classified by what actually changed: selection flips, next-hop re-homes inside the same neighbour, path hunting, cosmetic attribute noise, and genuine announce/withdraw — plus each session's hot prefixes, the small minority that dominates the flapping. The BGP Peers panel shows the dominant shape per peer.
- Peer scorecard. The dependency report's Peer AS tab now answers "is this peer worth it" over a chosen window: flaps, recorded uptime, churn share, and median path lifetime, plus a per-session block with the last table-dump timing and an observability line covering gaps in Osprey's own vantage — without which a monitoring outage reads as an exceptionally stable peer. Everywhere in it, "not measurable" renders as a dash with its reason, never as a fabricated zero.
- Vantage evidence. Per-peer policy-reject counters (the router's own "I refused N of your paths") persist with a sparkline; path half-life is queryable per peer and per origin AS; a blind-spot ledger records when each peer was not observable; best-path edges carry a presence barcode over the timeline window; and a what-if action on every peer row previews the blast radius of losing that peer.
AS-flow radial lens
- A second layout. Next to the columns, a radial lens puts your AS — or any AS you re-root on — at the centre with one ring per AS-path hop and an explicit ≥5-hops outer ring. It is honest about not being a tree: nesting follows each AS's dominant upstream, other observed parents draw as chords, and the view states the off-tree share instead of silently misfiling it. Three ranking axes: origin count, the transit spine (the few ASes carrying most of the feed), and unique originated address space — computed as an interval union, never a sum, so covering aggregates and their more-specifics count once. A ⌕ Find control pins arbitrary ASNs; the AS dossier gained upstream, origination, deaggregation, and transit-reach blocks.
- Zoom builds detail, ink does not grow. Strokes, labels, and badges hold their screen size while positions scale; names appear the moment their slot earns the room, and unnamed origins materialise out of the fold bands as zoom makes space for them — then fold back on the way out. Dense feeds shed decorative overdraw, and opening the dossier no longer resizes the canvas.
- Counting discipline. Merged fold tooltips use exact distinct rollups instead of sums that double-count multi-anchor origins; bubble and edge sizes encode share of the feed, not absolute volume, so a full-table feed draws sanely.
Reliability and accuracy
- BMP prefix counts stay truthful. A flapped peer's prefix count no longer sticks at 0 until the next reconnect, per-address-family counts come from the real per-connection sets, and a flap no longer permanently inflates the RIB gauges.
- BGP next-hop resolution hardened. The peer-session fallback is gated to eBGP with a deterministic order, definitive misses are negative-cached, and cross-AS path stitching's primary peer-to-device step works again for peers whose addresses live outside any IGP area.
- Dependency ranking on real address space. The dependency report's per-AS space columns use the same interval union as the new lens — on a full-table feed the old sum inflated results enough to reorder the top of the list.
Packaging and dependencies
- Dependency refresh, including gopacket 1.7.1 — an upstream security release fixing decoder panics on crafted packets. Osprey's capture paths use the panic-recovering decode API and were not crashable, but a packet-parsing daemon does not stay on a version with known decoder CVEs.
- Third-party attribution is now deterministic. Regenerating the bundled license file could nondeterministically omit a transitively-shipped package; the generator is fixed and regression-tested, and the shipped file is complete.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/docs/
Osprey 1.3.0
Osprey 1.3.0. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
This release extends the BGP AS-flow view: a candidate-path mode that shows every path a router knows, zoom and pan navigation, branch-based layout for dense graphs, and clickable adjacencies.
Highlights since 1.2.3
BGP & AS-flow
- All-candidates mode. Alongside best-path mode, the AS-flow view can draw every AS-path learned from every peer: live from the per-peer RIB on any BMP feed, or as of a past instant when full RIB history recording is enabled. If the recording does not cover the requested instant or scope, the view reports not available instead of an empty graph. The response labels its counting unit (candidate entries), indicates when a feed's session types make candidates identical to best paths, and warns about the cost of an unbounded whole-AS read.
- Top-N folding preserves transit structure. Only the origin bubble folds into the "other" cloud; a folded path's transit edges stay drawn, so the transit weave no longer depends on which origins made the cut. Prepended origins fold correctly, and a directly peered origin never folds.
- Validated at scale against a live DN42 feed: a single BMP session carrying roughly a thousand ASes and five thousand candidate entries.
AS-flow navigation and layout
- Camera controls. Wheel-zoom to the cursor, drag-pan,
+/−/0keys, double-click-to-fit, and on-canvas buttons with a zoom readout. The drawing surface tracks the panel one-to-one, so maximize adds real drawing space and fills the canvas region edge-to-edge. Dense columns grow the world instead of overlapping bubbles. Zoom and pan reset on AS or mode switches, never during timeline scrubbing. - Semantic zoom. Zooming out sheds edge counts, then sublabels, then all text. Graphs above a density threshold disable glow and flow animations to cap GPU load.
- Branch layout. Each column's ASes group under their dominant upstream, with gaps between groups; same-depth peerings arc sideways instead of overlapping the column axis.
- Clickable adjacencies. Clicking a flow line opens a card with both AS numbers and names (where known), the entries traversing the hop, and each side's share — noting that adjacency in received AS-paths is observed, not a verified peering session. Per-edge counts appear only on own exit flows, the selected AS, and a clicked adjacency.
- Readability controls. An "AS numbers" toggle (own AS, selection, and fold cloud keep their labels; hover always identifies a bubble), a Top-N origin control, and tooltips plus an on-canvas legend explaining the ±N badges shown during timeline events.
Packaging
- Upgrades no longer leave
osprey.targetinactive. The package now starts the target after restarting the services. On hosts upgraded with older packages, a one-timesystemctl start osprey.targetclears the state without touching running services.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/docs/
Osprey 1.2.3
Osprey 1.2.3. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
The theme this time is BGP honesty. A router can no longer be shown holding a path it actually refused, and the AS-flow view no longer flattens a multi-hop internet into a single row. Alongside that: a dedicated frontend audit, a fourth round of protocol correctness work, and a rebuilt user administration surface.
Highlights since 1.2.2
BGP you can take at face value
- A router is no longer credited with a path it rejected. BGP monitoring feeds deliberately include the paths a router declined to install — that is what a pre-policy feed is. Osprey was treating them as candidates, so a router could be shown reaching a destination through a route it had thrown away on arrival. In the clearest case a router was shown reaching its own directly connected subnet by way of two other autonomous systems, a full lap around the internet, while the router itself reported no such route at all. Loop rejection now runs exactly where the standard puts it, the "what if this peer fails" and traffic-shift analyses apply the same rule, and any such phantom already recorded is removed on upgrade — including from history, so time travel is corrected too. Paths a router genuinely did install with
allowas-inare untouched. - The AS-flow view lays out the internet in layers. Autonomous systems were grouped by their role in the path, which put every intermediate network in one column no matter how far away it was — so real structure collapsed into a tangle of crossing lines. Systems are now placed by how many hops away they are, one column per hop, which is what an AS-path graph is supposed to show. Positions still stay put while you scrub the timeline, so a network that moves is a routing change and not a redraw.
- An autonomous system that appears twice in one graph is drawn twice. Where a network legitimately shows up in two roles at once, the two were collapsed onto one spot with contradictory figures, the system count was overstated, and a leftover bubble could linger after switching to a different network. This is also the shape a route leak makes, so it is now shown rather than swallowed.
- Return paths across a domain boundary resolve again. A path leaving one routing domain and coming back could stop after two hops with "entry point unknown" while the traffic itself flowed fine. The border router was being identified as the one that selected the route rather than the one that owns the address it points at.
- Long cross-domain paths keep their labels. On a path stitched across protocols, an entire routing domain's worth of interior hops could render as anonymous dots.
Correctness, found on purpose
- Nineteen new randomised test targets found six real defects, all fixed. These target the decision layers between parsing and storage, where the existing protocol-level testing did not reach. Among them: a bulk device query could stop halfway and present the partial result as complete; equal-cost BGP path selection could depend on the order the database happened to return rows, so the same question had more than one answer; two textually different identifiers could collapse onto one entry; a directory group name containing an escaped comma silently dropped a user's group membership, which is what role mapping runs on.
- A fourth audit round, this time on the web interface, closed six primary findings and seventeen secondary ones in a single pass.
- A third round on IGP correctness closed sixteen findings across OSPFv3, IS-IS and the passive recorders — including link-state records that were incomplete over IPv6, parallel point-to-point links being merged, and two places where the recorders put a non-conformant value on the wire.
- Security hardening ahead of enterprise deployments. Three findings closed in the provisioning-token and two-factor paths, plus a self-review pass over those very fixes that caught three further defects in them before any of it shipped.
Administration
- The Users panel was rebuilt after two independent design reviews reached the same conclusion about the previous version. Accounts are now row-cards with clear grouping, showing at a glance how each account signs in — local password, directory, or single sign-on — and whether two-factor is on.
- The account shield became a real self-service page: identity, sign-in method, password and two-factor management, active sessions, and recovery codes in one place.
- The Dashboard's device and link counts no longer drop to zero when the topology is unchanged since your last view.
- A fresh installation is told the correct evaluation limit. The packaged configuration file claimed 16 devices where the software has granted 32 for some time. Existing installations were never actually limited; only the shipped file was wrong.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/docs/
Osprey 1.2.2
Osprey 1.2.2. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
This release is the result of a deliberate hunt for wrong answers. Two independent audits went looking for places where Osprey was confidently telling you something untrue — a path metric, an alert that never cleared, an area quietly modelled from a partial database — and this version fixes what they found. Alongside that, path answers are now both router-exact and several times faster.
Highlights since 1.2.1
Answers that match the routers
- A path to a prefix now returns what the router itself computes. Asking how a router reaches a subnet could return a metric several times too cheap, a first hop the router does not use, and a route type that contradicted the explanation shown beside it — with nothing marking the answer as approximate. Summary routes are now examined only where the standard permits, transit-link subnets are priced from the interfaces that form them, and a BGP path learned by another router is weighed at the distance the receiving router would actually apply. Validated against every router's own routing table: 13,824 of 13,824 answers now match on metric, first hop and route type.
- Identical questions return identical answers. Among equal-cost paths, the one presented as primary could differ between two identical requests, and between restarts. Equal-cost selection is now deterministic end to end.
- IS-IS links drained for maintenance are excluded from path computation, as the standard requires, instead of still being offered as viable.
- Link-state ages count time. LSA age and IS-IS remaining lifetime were frozen at the moment of capture; they now age on read, and the browser marks a database whose retrieval was incomplete instead of presenting it as whole.
Alerts you can trust
- A Device Down alert can clear itself again. Recovery was gated on a condition that was the exact opposite of the one that raised the alert, so an alert could stay red for days on a healthy device — and because of alert de-duplication, that stuck alert silenced every future alert for the same device. Existing stuck alerts are also swept up and resolved.
- Alert rules honour the scope you gave them. A rule limited to one network, routing domain or protocol instance was silently applied everywhere, including across tenants. Scoping is now enforced on both the event path and the SNMP path.
- Maintenance windows suppress SNMP-side alerts too, and a device that stops answering during a planned window is no longer auto-disabled into needing a manual re-enable.
- Alerts name the device again on IS-IS networks. A single IS-IS event in a batch could blank the device names for that entire evaluation round, leaving bare identifiers in alert summaries.
Discovery and protocol accuracy
- OSPFv3 areas are no longer modelled from a partial database. Some agents silently drop oversized responses over IPv6, which left areas running on a fraction of their link-state database with no indication anything was missing. Retrieval now adapts and resumes, and an area that still cannot be read completely is marked as incomplete rather than published as authoritative.
- Standards-compliant pseudowire equipment reports its pseudowires. Every value was being read from the wrong position in the standard table, so compliant devices reported none at all.
- BGP AS path reconstruction follows the standard. In four-byte AS deployments a supplementary attribute could replace the real AS path exactly when the standard says to ignore it, corrupting the origin of a route — which matters most when you are triaging a hijack.
- EIGRP topologies stop going stale, and IPv6 EIGRP links connect to their interfaces instead of remaining unattached.
- Dual-stack BGP ports count once. A port carrying both address families was recorded as two interfaces, inflating per-device interface counts and traffic roll-ups.
- Time travel and the live view agree on BGP session counts. Sessions that ended during a restart could be left open in history forever.
Faster, and lighter on the database
- Path, routing-table and simulation answers are several times faster. Each request used to reload the whole scope from the database before computing anything; that data is now cached per area and invalidated on change, so response time is dominated by the computation rather than the size of your topology.
- Around 93 % of pointless database writes are gone. An unchanged topology was rewritten continuously; write volume and write-ahead log traffic dropped by an order of magnitude, and the recurring deadlocks that came with it are gone.
- Log volume dropped by roughly 96 % on an idle system, with the actionable lines kept and a rate limiter that reserves capacity for warnings and errors — and reports it when anything is shed.
Administration
- Deleting part of the hierarchy no longer resurrects it. A delete whose areas are still fed by a recorder is now refused, naming the recorder responsible, with an explicit override available. Deleted areas leave a record so their history stays identifiable and can be purged afterwards.
- Editing one field no longer clears the others. Renaming an autonomous system, routing domain, protocol instance or area could blank sibling fields that were not part of the edit.
- The Device Sessions panel shows the device and the user, which had never been populated, and its columns sort and search correctly.
- Application log streaming is restricted to administrators, matching the equivalent REST endpoint.
- Single points of failure are reported for your network only — Osprey's own passive recorders are no longer counted as network dependencies.
- New installations get a PostgreSQL connection and memory budget that matches the services, and existing installations are told when theirs is too small instead of being changed underneath them.
- The bundled third-party license inventory is generated from the actual build, so what ships is what is listed.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs
Osprey 1.2.1
Osprey 1.2.1. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
One theme runs through this release: time travel is now trustworthy. Rewinding the clock used to quietly erase things that still existed, and several views simply ignored the clock altogether. Alongside that, a round of correctness work on route labelling, the link-state database and per-interface traffic.
Highlights since 1.2.0
Time travel
- The past no longer loses data that is still there. Historical reads filtered on a refresh timestamp rather than an end of validity, so a topology from an hour ago could drop most of its inter-area routes and report a working path as unreachable. Reconstruction now asks whether something existed at that moment, which is the question you meant.
- The LSDB browser, the area-cloud overview and the BGP route table follow the clock instead of silently answering for now. Where a value genuinely is not historised — LSA age, sequence number and checksum — the view says so rather than presenting live numbers as historical.
- Multi-AS paths survive the clock. A stitched cross-domain path used to vanish the moment time travel was activated; it now rebuilds from recorded session and routing history, and names any evidence that is not historised instead of quietly dropping it.
- Historical topologies no longer duplicate devices once per area snapshot, and a device keeps its name in a historical view instead of falling back to a bare router ID.
Paths and routing tables
- The hop table shows each router's own installed route — its route type and the metric that router itself reports — with a mark distinguishing a proven hop from a modelled one, and a flag where the per-hop metric legitimately rises.
- IS-IS routes are labelled by level. Level-1 and level-2 routes were being described using OSPF's intra/inter-area vocabulary, which does not apply; they now carry their own labels, take part in administrative-distance selection at the correct value, and a prefix a router advertises but is not attached to is identified as an advertisement rather than a forwarding entry.
- An IPv6 path question gets an IPv6 answer. Selecting a protocol that cannot carry the address family of your question is now refused with an explanation instead of quietly answering in the other family, and the panel switches the protocol for you when the address you pick requires it.
- The routing table opens for EIGRP-only routers, which previously returned an error, and shows internal and redistributed EIGRP routes alongside everything else.
- Cross-tenant path segments are drawn on the canvas instead of ending at the edge of the current scope.
Link-state database
- Live LSA header fields now reach the entries they belong to. Age, sequence number and checksum were missing from every summary, external and NSSA entry because of a key mismatch, and could attach to the wrong entry across areas or address families. Coverage is stated as a count rather than implied.
- Network-LSAs are reconstructed per segment rather than per subnet mask, so a router that is designated router on several segments no longer collapses them into one fictional entry.
- OSPFv2 transit interfaces record their designated router, which several views and the dual-stack link merge depend on.
- External routes survive when the advertising router sits outside the reporting area — the normal case, and previously they were dropped.
- Corrected an interface-index assignment that could move an OSPFv2 interface onto an OSPFv3 interface's index, leaving one port without an index and mislabelling another. Affected rows repair themselves on the next discovery cycle.
BGP
- Peer history no longer trusts a missing timestamp. Routers may report "time not available" on the initial session dump; those entries were recorded as beginning in the year 1, so the session answered "up" for any point in the past. New entries use arrival time, and existing poisoned rows are repaired and marked so the correction stays auditable.
Traffic and reports
- Implausible interface rates are rejected instead of stored. A counter discontinuity on an interface that reports no speed could be recorded as an enormous, permanently stuck traffic figure; the sanity check now covers that case.
- The IGP Prefixes report shows which area carries each row, and the header states the unique prefix count next to the row count where they differ — the same prefix legitimately appears once per area whose database carries it.
Topology view
- Node and label size controls in the menu bar shrink or enlarge the drawing in place, keeping positions and zoom, which frees room on the links for cost, interface and address labels. Saved layouts remember the size.
- Link line width scales with node size, and several link styles that had stopped taking effect work again.
Documentation
- The user guide is illustrated — 21 screenshots covering sign-in, the hierarchy, the dashboard, the canvas and its menus, device and link details, reports, path analysis, simulation, time travel, alerts, the terminal and administration. They appear in the guide built into the product and in the public wiki.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs
Osprey 1.2.0
Osprey 1.2.0. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
Three themes since 1.0.0: EIGRP joins the supported protocols, path analysis now shows what the packet actually does rather than what the source router wishes it did, and enterprise sign-on arrives — OpenID Connect, LDAP / Active Directory, SAML 2.0, SCIM provisioning and two-factor authentication.
Highlights since 1.0.0
EIGRP support (new protocol)
- Passive discovery over CISCO-EIGRP-MIB — neighbours and interface state for IPv4 and IPv6, classic and named mode, per VRF and AS. Read-only: Osprey never forms an adjacency.
- EIGRP adjacencies are drawn on the topology and stitched onto the L2 fabric, so an EIGRP domain sits alongside your OSPF and IS-IS areas in one view.
- Observed forwarding paths follow each router's installed successor and report the real composite metric (FD) — no borrowed OSPF cost, no placeholder numbers. Equal-cost brothers installed in the RIB are shown as variants.
- Administrative distance, neighbour-down alerting, and an EIGRP recorder you add and switch on like any other protocol.
- An EIGRP domain participates in cross-AS path analysis in both directions, including from a third-party vantage point.
Path analysis you can trust
- Hop-by-hop forwarding chain — every hop is that router's own routing-table decision. Where the old view drew a source-rooted shortest path, the panel now draws the path the packet takes, with each hop's metric, route type and installed equal-cost set. Validated hop-by-hop against the live routing tables of every router in a multi-AS reference lab — metric, path type and full equal-cost set matching exactly on every device pair.
- Costs anchored to the advertising area — inter-area and external routes are priced against the router that advertises them, matching what
show ip routeprints on the box. - The complete equal-cost set — variant tabs now list every distinct equal-cost path instead of a partial selection, and say so when more exist than can be shown.
- Cross-domain and multi-tenant paths — paths that leave a routing domain are stitched across ASes and tenants from BGP evidence, with per-segment costs and honest confidence: resolved, inferred, or an explicit opaque cloud. No invented hops.
- Address-family correctness end to end — an IPv6 question gets an IPv6 answer: hop addresses in the family you asked for, BGP evidence matched in-family, and a clear explanation when IPv6 reachability simply does not exist between two domains instead of an IPv4 path presented as the IPv6 one.
- Where a forwarding chain cannot be reconstructed, the answer says so and explains why, rather than presenting an approximation as fact.
Enterprise sign-on
- Single sign-on via OpenID Connect, LDAP / Active Directory, and SAML 2.0 — bring your existing identity provider.
- SCIM 2.0 user provisioning and de-provisioning.
- Two-factor authentication (TOTP) for local accounts, at no extra cost.
- All of it on the existing session model, with a recovery CLI for the case where your IdP is the thing that is down.
Security
- Fixed a signature-validation bypass in the XML signature library used to validate SAML responses, and patched a TLS privacy issue reachable through e-mail notifications. Both were found by vulnerability scanning, which now reports no advisories affecting Osprey code — one upstream advisory remains open with no fix released and no reachable call path from Osprey.
Also in this release
- MPLS discovery is a plain on/off switch, off by default.
- An EIGRP adjacency and the OSPF or IS-IS link on the same wire merge into a single topology link.
- Path mode dims the off-path topology and badges the protocol deciding each hop.
- Numerous correctness fixes across the node drawer, sidebar, system health and topology refresh.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs
Osprey 1.0.0
Osprey 1.0.0. Network Topology Intelligence for OSPF, IS-IS, BGP, and MPLS — passive discovery, protocol-accurate modeling, simulation, time travel, and incident correlation in one pane of glass.
The 1.0 milestone. Every feature line is complete, every known issue triaged to a fix or an explicitly documented behavior, and the release was exercised end-to-end by a full operational dress rehearsal — twelve live drills covering failover, re-homing, MAC mobility, PE isolation, alerting, audit, and traffic — before this build was cut.
Highlights since 0.9.9
Paths across domains — the network as one fabric
- Cross-domain path stitching: when source and destination live in different ASes (or different tenants), the path tool now draws the actual chain of IGP segments along the BGP AS path — per-segment costs, instance labels, and an honest confidence per segment. Reverse paths render even without BGP telemetry on the far side.
- eBGP transitions carry their physical reality: the actual port pair from LLDP/CDP, session-address-to-port binding, shared switch fabrics between borders (named, with attachment ports), and route-server transits recovered from the RS's own RIB. Every claim is evidence-gated — ambiguity is stated, never guessed. Transitions are drawn on the canvas, so a multi-domain path no longer visually breaks at the border.
- Administrative-distance correct, everywhere: path-to-prefix decisions now honor AD exactly as routers do — across protocols, for externals, and on dual-IGP devices — with the cheaper road-not-taken called out when protocols disagree.
- Tenant-aware verdicts: querying across tenant boundaries yields a clear, honest diagnosis instead of a confusing partial path.
MPLS L2VPN — complete
- VPWS wires and VPLS instances (introduced in 0.9.9) are now feature-complete: dual-driver support hardened with a strict parity gate between the standard PW-MIB and the pre-standard dialect real routers ship, signalling surfaced for every class (LDP / static / EVPN), and the full layer documented in the user guide.
Sharper diagnostics
- Consistent-but-wrong timers are now visible: OSPF requires both ends of a link to agree on hello/dead — so a link-wide template mistake always agrees with itself and was structurally invisible to pairwise checks. The timer-consistency report now flags agreeing non-default pairs.
- The LSDB browser is RFC-exact per area type: stub and NSSA areas are discovered as such from the router's own configuration, and protocol-impossible LSAs that some agents replicate into every area are filtered rather than displayed.
EVPN correctness
- Member counts survive monitoring gaps: a MAC that ages out while the BGP telemetry session is down is reconciled the moment the reconnect dump completes — counts can no longer freeze at pre-outage values.
- A dying BGP session now sweeps its EVPN state: losing a peer is an implicit withdrawal of everything it advertised; EVPN memberships now drop and the PE-lost symptom fires within seconds of a session death, matching what the prefix side always did.
Reliability
- BGP sessions on routers that cannot export BMP are now discovered via SNMP, so session-level visibility no longer depends on telemetry support.
- Fresh SNMP targets without pollable interfaces no longer count phantom failures and back themselves into a corner — discovery reaches them immediately.
- OSPFv3 interface timers are now read from the correct MIB columns (previously every v3 interface showed a plausible-but-wrong 40/120).
- Alert cooldowns survive service restarts, and L2 topology merging is hardened: neighbors resolve on chassis identity and globally-unique hostnames, eliminating phantom and duplicate entries.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs
Osprey 0.9.9
Osprey 0.9.9.
Real-time network visibility & engineering for OSPF, IS-IS, BGP, MPLS, and EVPN. Passive topology discovery via GRE, SNMP, and BMP; multi-protocol SPF; what-if simulation; time travel; and incident correlation — a single binary backed by PostgreSQL.
A service-visibility release: Osprey now sees the Layer-2 service overlay. MPLS L2VPN (VPWS point-to-point wires and VPLS emulated LANs) and BGP EVPN (E-LAN and EVPN-VPWS, VXLAN or MPLS) are discovered, browsed, drawn on the topology, and correlated into incidents — and every service overlay now shares one visual language with path visualization.
Highlights since 0.9.8
EVPN visibility (new)
- EVPN via BMP: EVPN instances (EVIs) are discovered straight from the BGP feed — E-LAN and EVPN-VPWS, with VXLAN or MPLS encapsulation. Observations from redundant route reflectors collapse into one canonical instance, so a dual-RR fabric shows each EVI once, with member counts deduplicated rather than doubled.
- A new Reports → EVPN browser appears the moment the feed carries EVPN routes: every EVI lists its service kind, encapsulation, member PEs with per-PE MAC and IP counts, its Ethernet Segments (multihoming), and honest on-map / off-view placement. Clicking an EVI highlights its member PEs on the canvas and draws membership edges.
- MAC mobility and PE loss as correlated symptoms: a host moving between PEs (detected via the standard MAC-Mobility sequence, with an all-active multihoming guard so normal redundancy never fires false moves) and a PE dropping out of an EVI both become symptom events that attach to the co-incident device or link failure — they enrich the incident, never open one of their own. Storm-guarded, so a broadcast storm cannot become an event flood. The EVI drill-down lists the instance's recent moves and losses.
MPLS L2VPN visibility (new)
- Pseudowire discovery: VPWS wires and VPLS instances are walked per PE via the standard PW MIBs (with a per-device fallback driver), paired into end-to-end wires — including honest half-wires when the far end is outside the monitored network — and grouped into VPLS instances with a mesh-completeness badge (full / partial / unknown).
- Two new Reports entries ("VPWS Wires", "VPLS Instances") with live-updating browsers and canvas overlays: a focused wire draws as one endpoint-to-endpoint arc, a focused VPLS highlights its PE sites with membership edges.
- Pseudowire failures correlate into incidents: a PW going down attaches to the failure at either end of the wire, so a core failure that takes L2VPN services down shows those services under the one incident. Service symptoms that surface on the polling tick minutes after a failure now still attach to the incident — closing a correlation gap that also benefits MPLS-TE tunnel and L3VPN symptoms.
UI
- One visual language for services and paths: MPLS-TE tunnels, VPWS wires, VPLS/L3VPN/EVPN membership edges now share the route-path stroke — same weight, same marching-ants animation (with a subtle periodic hitch in the motion fixed), full opacity. Down and partial states stay clearly distinct, and motion never claims traffic that isn't flowing.
- Reports → Routing reordered along the protocol stack: IGP state first, then routes, then BGP, then a dedicated MPLS-services block that only appears when a service is actually discovered.
Reliability & API correctness
- Malformed or empty IDs in API paths now return a clean 400 naming the parameter (previously a 500), and an invalid protocol on a protocol instance is rejected up front with the allowed values.
- EVPN robustness end-to-end: an EVI whose member PEs haven't resolved yet renders as a neutral "not yet resolved" state instead of erroring the panel; mobility events stay accurate when the BMP exporter is identified after the feed starts; MAC/IP counts self-heal after transient database errors; and high-volume EVPN feeds ride the same sharded pipeline as BGP, so a full table dump cannot stall ingestion. Label/VNI decoding is encapsulation-aware for mixed VXLAN/MPLS fabrics.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Production licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs
Osprey 0.9.8
Osprey 0.9.8.
Real-time network visibility & engineering for OSPF, IS-IS, BGP, and MPLS. Passive topology discovery via GRE, SNMP, and BMP; multi-protocol SPF; what-if simulation; time travel; and incident correlation — a single binary backed by PostgreSQL.
A stability and correctness release: a large batch of IS-IS, OSPF, and BGP protocol-hardening fixes, health signals that react in seconds and stop reporting a dead network as healthy, and topology enrichment that converges — and surfaces its results — on its own.
Highlights since 0.9.6
Protocol correctness & hardening (IS-IS / OSPF / BGP)
- IS-IS: a same-sequence purge now withdraws the LSP immediately instead of lingering to MaxAge; a newer LSP arriving within the minimum-arrival window is stored rather than dropped; point-to-point links acknowledge received LSPs with a PSNP instead of firing a full-database retransmit at every adjacency-up; and adjacency flapping no longer storms the engine.
- OSPF: neighbors in NSSA areas now form correctly; the collector no longer strands a monitored router mid-DBD exchange; parallel OSPFv3 point-to-point links with crossed interface IDs no longer collapse (fixing an ECMP undercount); and topology no longer draws phantom stub networks or router self-loops.
- BGP: unknown address families are skipped cleanly instead of mis-parsed, and the device-address resolver is network-scoped for multi-tenant correctness.
- Resilience to malformed input: protocol parsers and in-memory tables are now bounded throughout — LSP checksums are verified over the PDU length, PSNP responses are capped and de-duplicated, neighbor and link-state-request tables are bounded, and transit fan-out is limited — so crafted or malformed protocol data cannot exhaust memory or flood logs.
Topology & enrichment
- Enrichment converges on its own. After a discovery crawl, a single interface-discovery pass now runs automatically, and you can trigger one on demand from the network Enrichment panel — so dual-stack OSPFv2/OSPFv3 links merge into one edge and interface names/hostnames appear without waiting for the next cycle.
- The canvas refreshes itself when enrichment lands: merged links and newly resolved names appear without a manual reload.
- MPLS-TE and L3VPN report entries appear the moment discovery finds them — the Reports entries surface as soon as the first tunnel or VRF is discovered, with no reload.
- MPLS discovery is an explicit control — an "MPLS Discovery" card in the network Enrichment panel with a per-network auto | on | off toggle, so only the routers that actually run MPLS are walked.
Health & incidents
- A dead network no longer shows a "Healthy" chip. Losing all adjacencies now surfaces within seconds as a degraded collector status — amber in the sidebar and counted against overall health — and freshness no longer reports a network as current when every poll to it is failing.
Reliability
- Removing a BGP instance that still has active BMP exporters now completes cleanly instead of erroring.
- Topology persistence is more robust to device-identity changes across upgrades.
- Log bursts can no longer flood the journal or disk.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Production licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/osprey/docs