Releases

What's shipped.

Every PatchMap release with the narrative that matters to network engineers. What's new, what's changed, what's fixed. No commit hashes.

Changelog

All notable changes to PatchMap will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Scope

This is the customer changelog. It only covers changes a user running the PatchMap app would notice — new features, behaviour changes, and fixes inside the product itself.

[0.13.0] - 2026-09-24

Added

  • Rack diagrams now have a working Front and Rear view, and the Rear button is no longer “coming soon”. Every device records which face it’s mounted on — front or rear — and whether it reaches all the way through the cabinet (full depth, meaning visible from both sides). Two devices can now share one rack U, one on each side — which is how shallow rear-mounted gear such as power strips actually gets installed — and a full-depth device correctly shows as a solid block on the side it’s bolted to and a ghosted outline on the other, whichever side that happens to be. Every existing device is treated as full depth, so nothing in anyone’s rack moves or looks any different on upgrade — the front view looks exactly as it did before. A marker in the U-number column shows when something is mounted on the face you’re not currently looking at; hovering names it and clicking jumps straight to it. Mounting something behind a full-depth device asks you to confirm rather than refusing outright, because whether a shallow power strip leaves room behind a short server is a judgement you can make and the app cannot — two devices sharing the same face is still refused outright, no exceptions. Patch panels are unaffected — they keep their existing front and rear side labels. The Front/Rear choice is remembered per rack, and it’s available on each rack in the side-by-side comparison view as well as on a single rack.

Changed

  • Rack utilisation on the dashboard now counts a rack unit as used once, however many faces are occupied, so it can no longer read above 100 per cent. Previously, a U holding both a front and a rear device counted twice — a 10U rack fully occupied on both sides used to show as 200% used; it now correctly shows 100%. Separately, a rack whose only occupant was the back half of a two-cabinet patch panel used to report 0% used — those slots are, and always were, physically occupied, and the dashboard now counts them. No equipment or cabling has changed; only how the percentage is worked out — some racks will simply show a different number than they did before.
  • The device CSV export now records two extra facts about each device: which face it’s mounted on, and whether it’s full depth. Existing import files without them still import unchanged, so the round trip stays backward compatible — if you have a script that reads the exported file by column position rather than by column name, it will need to account for the two new columns at the end.

Fixed

  • Pressing Escape while a confirmation prompt was open no longer discards the form underneath it. If a prompt appeared on top of the device form and you pressed Escape, both used to close at once, losing everything you’d typed. Escape now closes only the topmost dialog, as expected.

[0.12.0] - 2026-09-17

Added

  • Three clearly-named permission levels, and a new read-only one. Roles are now Read only (can view everything, cannot change anything), Operator (can add and edit equipment, cabling, racks and sites) and Admin (everything, including people, licence and settings). Operator is what the old User role always did — renamed to say what it actually allows — and every existing account keeps exactly the access it had. Read only is new: you can now give someone a genuine view-only account, which was previously impossible. An ⓘ beside the Role picker spells out what each level can and cannot do, wherever you choose one. A read-only person can still sign in and change their own password, and anything that would change something is shown disabled with a note explaining why, rather than failing when pressed. Changing someone’s role now takes effect immediately rather than when their session next refreshes.
  • A getting-started guide for new instances. On a fresh instance the dashboard now opens a short checklist covering the four things that get you to a working estate: add a site, build a rack (inside a room and a row), add devices, then patch your first cable. Each step ticks itself off as you actually do it — so it reflects your real estate rather than a slideshow, and an estate built by CSV import opens already complete. It reappears from a Getting started button on the dashboard until you finish, and hides itself for good once you have. Each step carries a small diagram of what you are building.
  • Activity log can be filtered to exports. A new Exports option in the Activity page’s type filter shows only estate exports, separating “what left the building” from ordinary day-to-day edits.
  • See where a cable ends up when it runs through a patch panel. On a device’s page — and the topology device panel — a port patched into a patch panel now shows the end device it actually reaches, e.g. Connected → Core-SW-B · Gi1/0/24 · via FIB-PP-03 · 12, instead of just naming the panel. It’s a condensed Cable Path: the destination is the headline and the panel it passes through is a muted “via”. Direct links and cables that stop at an unpatched panel are unchanged.
  • Export a hand-picked selection of connections as CSV. In the Connections list, tick some rows and the toolbar now offers Export CSV (N) alongside Export PDF (N), so you can pull just the cables you selected into a spreadsheet — previously a selection could only be exported as a PDF.
  • Patch a specific group member through a panel. When either end of Patch Through is a stack, HA pair or multi-panel group, a Which unit? selector appears — defaulting to the device you’re sourcing from (or the group’s primary) — and the interface list below shows only that unit’s free ports. Pick a different unit to switch the list. This replaces the earlier subtle member filter, which could show just one member’s ports or, if the default missed, every unit’s ports mixed together. Previously the Patch Through pickers had no member awareness at all, so members could only be reached by name.
  • A “How does patch-through work?” explainer in the Patch Through wizard. A collapsible steps panel at the top of the wizard explains what a slot is, how to wire a device into each side, patching every device into its own cabinet’s local side on a split (dual-rack) panel, and leaving one side empty. Open by default; collapse it once you know the ropes.
  • A cable’s printed label now shows in its details. Open a cable (click it on the Topology map, or from the Connections list / a device) and a Cable label appears under the Cable Path — the same RACK-U#-PORT line per end as the CSV export’s label column, side-aware for split (dual-rack) panels (e.g. CAB14-U40-port1).
  • Tidy just a selection on the Topology page. ⌘/Ctrl-drag a box around some devices (or ⌘/Ctrl-click a few together) and a new Arrange selection button appears in the toolbar — it runs the layout engine over only those devices, keeps the tidied cluster where it sat on the canvas, saves the result, and leaves every other device exactly where it was. One press of Undo (or Cmd/Ctrl+Z) puts the selection back precisely where it came from, just like a full auto-arrange.
  • Groups now show where their kit lives — rack and U, everywhere groups appear. A collapsed stack or HA pair on the Topology canvas gains the same rack line devices got (R01 · U10, U12), and because a group’s members can sit in different cabinets it lists every rack the group touches (R01 U10, U12 · R02 U14). The Groups page carries the same summary on each row, and the group detail page and the group side panel show each member’s own position (R01 · U25-26, dual-rack panels as A: R01 U12 · B: R02 U40, side-mounted PDUs as R01 · left bay, or Unracked).

Changed

  • An admin resetting someone’s password now emails them directly. Previously Send reset link showed the link on screen for the administrator to copy and pass on by hand. The user now receives the same branded reset email they’d get from Forgot password, and the administrator simply sees confirmation of where it went — so a live sign-in link for someone else’s account no longer passes through a colleague’s screen. If the instance has no mail relay configured the link is still shown, clearly labelled as a fallback, so resets remain possible on an air-gapped install.
  • Fonts are now served by your own instance. The app previously fetched two typefaces from Google’s font CDN on every page load, which meant each page view reached out to a third party and the monospace font silently never loaded on an air-gapped install. Both are now served from the instance itself, so the app renders identically with no outbound internet access.
  • A licence key now activates only the instance it was issued for. Uploading a key issued for a different PatchMap instance is refused with a clear message, instead of being accepted. Your own key is unaffected, and a standalone install running without an instance name is unchanged.
  • Racks are capped at 100U. The rack height field now refuses values above 100 (48U is already a large cabinet). Very large values could previously be saved and would then make rack elevation PDFs enormous and slow to produce.
  • Model suggestions now match the device type you picked. When creating a device, the suggested models are filtered to the selected category — choose “Switch” and you only see switches, “Firewall” only firewalls, and so on (previously every type showed regardless). Because many switches also route, L3-capable switches (Catalyst 9300/9500, Nexus, Arista, Juniper EX/QFX, Aruba CX/2930/3810, Dell PowerSwitch, Huawei S-series, MikroTik CRS, …) also appear under “Router”, tagged L3 switch — and picking one keeps your Router choice. That L3 match is a best-effort guess from the model name (there’s no routing-capability data in the templates), so it won’t be perfect; you can always type any model name directly.
  • The rack picker shows each rack’s location. When creating or editing a device, the Rack dropdowns now label each rack with its site (and room/row) — e.g. R01 — London / DC1 / Row A — so two racks that share a name at different sites are no longer ambiguous.
  • The Cable Path is easier to read. Clicking a cable — on the Topology map or from a device — now lays its path out as a top-to-bottom route: one row per device, with the end devices marked distinctly (filled dot) from the patch panels it passes through (hollow dot, tagged “panel”), and each panel showing the two ports it bridges (05 → 12). Each device in the path is a link — click it to jump to that device. Previously it was a repeating list of deviceA · port → deviceB · port rows that named each panel twice.
  • Connections now read equipment-first, with patch panels in the middle. In the exported connections CSV, the printed PDF patching schedule, and the Cable Path shown when you open a cable, the end device (switch, server, firewall…) is now always on the From side and the patch panel on the To side — so a run reads Switch › panel › panel › Firewall end to end instead of flipping direction from row to row. Panel-to-panel trunks and direct device-to-device links keep their stored order. The PDF schedule is also grouped by the equipment side to match.
  • “Include trunks” now defaults off and applies to the CSV too. On the Connections page the Include trunks checkbox has moved to the left of Export CSV and starts unticked, so both the CSV and the PDF patching schedule export a front-of-rack working copy — inter-panel trunk cables left out — by default. Tick it for the full cable record. Exporting a hand-picked selection always includes exactly what you selected, regardless of the toggle.
  • PDUs now list their outlets like ordinary connections. Clicking a PDU on the Topology page shows every patched outlet as a normal row in the Connections list — alongside any data links such as a management port — instead of collapsing them into the bottom Power section. Every other device type keeps that section: power runs stay pinned below the data links, and a PDU’s outlet list still shows correctly even when the canvas media filter is hiding power cables.
  • Patching through a patch panel now speaks plain English. The Patch Through wizard’s two sides are labelled This end and Other end instead of Front/Rear (A-side/B-side); the slot list drops the Front/Rear badges and just shows each slot with whether it’s free or in use; and the review step and the success message read as one run — Server-A · eth0 ▸ Panel · slot 05 ▸ Server-B · eth0. Wiring only one side is now the clearer Leave this end empty.
  • A free panel slot’s Connect button now builds the whole run. Clicking Connect on a fully-free slot — on the patch panel’s own page or in the Topology device panel — opens Patch Through preset to that slot, so you wire device ▸ slot ▸ device in one step instead of accidentally leaving a slot half-patched. A slot that already has one side wired still connects its single remaining side exactly as before.
  • Patching through a split (dual-rack) panel now names each end by its cabinet. When a patch panel spans two cabinets, the Patch Through wizard labels its two ends with their actual rack and U — e.g. cab12 · U15 for This end and cab14 · U20 for Other end — instead of a generic “This end / Other end”. You wire each device to the side physically in its cabinet, and the exported cable label then reads the right cabinet automatically. Single-cabinet panels are unchanged.
  • Pick which end of a panel a dragged device lands on. When you drag a device onto a patch panel on the Topology map, the Patch Through wizard now shows a This end / Other end choice at the slot step so you place the cable on the side you meant — and for a split (dual-rack) panel the two choices carry their cabinets (e.g. This end · CAB12 / Other end · CAB14) — instead of always assuming the near side.
  • A dragged device now defaults to its own cabinet’s side of a split (dual-rack) panel. When you drag a device onto a patch panel that spans two cabinets, the Patch Through wizard pre-selects the end physically in that device’s cabinet, so the patch stays local and only the trunk crosses cabinets — instead of always starting on the near side. If a device ends up on the far cabinet’s side (via the This end / Other end pickers), an inline warning flags that the cable would cross cabinets and names the local end to use. Single-cabinet panels are unchanged.
  • The connection wizard’s group member picker is clearer. When a source or target device is a stack, HA pair or group, the standard connection wizard now shows a prominent Which unit? selector — defaulting to the device you picked (or the group’s primary) — and lists only that unit’s free ports, instead of a subtle Member Filter chip that could leave the list showing every unit’s ports at once. Same picker Patch Through now uses.

Fixed

  • The site map no longer has “API KEY REQUIRED” written across it. The company supplying PatchMap’s map imagery began stamping that message diagonally across every map tile. Nothing was wrong with your instance and no key was ever needed — the notice was printed into the map pictures themselves, which is why it appeared everywhere at once with no error anywhere. PatchMap now draws the map from a different, openly-licensed source that needs no account or key, in a style built to match the rest of the app: a dark wireframe showing motorways, coastlines, borders and place names, with your sites pinned on top. Nothing about how you add or geocode a site changes, and MAP_ENABLED=false still turns the map off completely for air-gapped installs.
  • The site map now appears on self-hosted installs. On instances installed with scripts/install.sh, the map area could come up empty even with MAP_ENABLED=true, because the instance’s own browser-security rules blocked part of the map renderer from starting. Hosted instances were unaffected.
  • Saving a topology layout no longer fails on larger estates. Auto layout, Arrange selection, Reset layout and Undo each saved every device’s position as its own separate request, all fired at once. On an instance with more than roughly fifty devices, the instance’s own request limits rejected the tail of that burst, so the action failed with “try again” — and trying again failed in exactly the same way, every time. The whole layout is now saved in one request, so it completes promptly however large the estate. This also removes a burst of requests that fired simply from opening the map of an estate whose devices had never been arranged.
  • Auto layout no longer fails on ordinary wiring. Pressing Auto layout — or Arrange selection — could report “Couldn’t apply auto layout — try again”, and retrying never helped. The layout engine was being given contradictory instructions whenever two devices of the same kind were cabled directly to each other: two routers, two servers, a server patched to storage, daisy-chained PDUs, or any two devices of the catch-all Other type. That covers most real estates, so for many instances the button could never succeed. Those particular devices now simply settle wherever the engine thinks best, and the arrangement completes; every other device keeps its usual position in the diagram.
  • A second cable between the same two devices now shows on the Topology map. Two switches wired together twice drew a single plain line — the second cable was absent from the map with nothing to hint it existed, even though it appeared correctly in the Connections list and on both devices’ pages. Repeated links now draw as one line carrying a ×N badge and a heavier stroke, the same way cables into a stack or HA pair already did; click it to list every cable in the bundle. Links of different media between the same two devices stay separate lines so each keeps its own colour — a 2×1G copper LAG plus a fibre uplink reads as a ×2 blue line beside a single aqua one.
  • Forgotten-password emails are now actually sent. Using Forgot password on the sign-in page produced no email at all, so the self-service reset could never be completed and an administrator had to issue a reset link by hand. It now sends a branded reset email to the account address, with a link that expires and can only be used once. The page’s response is unchanged — it still says the same thing whether or not the address is registered.
  • Changing your password no longer slows the app down for everyone else. Password hashing ran on the same thread that serves every other request, so a password change (or several at once, as on an onboarding day) could briefly stall the whole instance. It now runs off to one side.
  • Deleting a patch panel slot no longer silently destroys the cables patched through it. Removing a slot used to delete both its ports and every cable on them on one unconfirmed click, with nothing written to the Activity log. It now asks first, naming how many cables would go, and records each deleted cable and the slot removal in the Activity log. Slot deletion is also now restricted to patch panels, matching the other slot actions.
  • CSV import now applies the same placement rules as the app. Importing devices could previously commit placements the app itself refuses — a negative U, a position past the end of the rack, a zero-height device, or several devices stacked on the same U. Those rows are now reported as errors in the preview instead of being applied, including two rows of the same upload that collide with each other.
  • CSV import no longer double-books ports. A connection import could put a second cable on a port that already had one, or cable a port to itself. Both are now rejected in the preview.
  • One cable per port is now enforced by the database, not just by the app, so two people patching at the same instant can no longer both claim the same port. (On an instance where duplicates already exist, the upgrade leaves the data alone and logs a warning rather than failing — resolve the duplicates and the constraint applies on the next upgrade.)
  • The Activity log records more of what happens — slot and port deletion, and estate exports. Every export of your connections, devices or racks (CSV or PDF) now writes a line naming who exported it, how many rows left, and which filter was applied — so “someone took the whole estate” is a question the Activity page can answer. Export lines are kept for a year rather than the usual 30 days, on the assumption you go looking for them long after the fact.
  • Bundled cables on the Topology page now show the right details when you switch between them. In a stack of cables between two devices, clicking from one cable to another now updates the Notes and cable fields to match the cable you picked, instead of leaving the first cable’s details on screen.
  • Patch a device into a patch panel whose other side is already trunked. Patching a device through a panel on the Topology page now lets you use any slot that has one free side — so you can wire equipment into the device side of a high-density fibre panel whose cross-connect side is already patched panel-to-panel. The slot list shows which end is free (This end free / Other end free), only a slot with both sides already wired is marked In use and blocked, and the already-patched end is filled in for you — locked to Leave this end empty and naming what it’s patched to. Previously any slot with a single connected port was rejected on the panel, and wiring one only failed on submit with a “port already taken” error, which made fully-trunked fibre panels impossible to patch equipment into.
  • Cable labels and the patching schedule now show the correct cabinet for each side of a split (dual-rack) patch panel. When a panel spans two cabinets, a cable landing on its B-side is now labelled and exported with the B-side cabinet and U position, instead of always using the panel’s primary cabinet. Both the printable label column in the connections CSV export and the PDF patching schedule are corrected; single-cabinet panels are unaffected.

[0.11.0] - 2026-07-30

Added

  • Power gets its own section in the topology device pane. Clicking a device now shows data links under Connections and power runs in a separate red-dotted Power section pinned at the bottom — sourced from the device’s ports, so it stays accurate even when the canvas media filter is hiding power cables. Unpatched supplies show as free (a PDU’s outlet bank collapses to a free count instead of forty rows), and power rows click through to the cable just like data rows.
  • The connection wizard now guesses the cable type from the ports you pick. Two copper ports pre-select a copper patch, a PDU outlet or PSU pre-selects power, SM/MM fibre and DAC carry through from the port’s media — and if the two ends disagree (media-converter runs) it stays out of the way and leaves the picker untouched. Your own selection always wins: once you change the cable type by hand, the guess never overrides it. Works in both the standard wizard and each leg of Patch Through.
  • First-use tips across the app. Each page now opens with a one-line tip that teaches its non-obvious tricks — the drag-to-connect gesture and box-select on Topology, template autofill on Devices, 0U side channels on racks, the CSV round-trip on Import, ⌘K search, and more. The New Connection wizard and device form carry one too. Click Got it and that tip never comes back on this browser; every tip is dismissed independently.
  • Topology cards now show the rack unit next to the rack. A device’s card on the Topology page reads R01 · U25 — or U25-26 when it spans several units — instead of the rack name alone. Side-mounted PDUs show their bay (R01 · left bay), and dual-rack patch panels carry a position per side (A: R01 U12 · B: R02 U40).
  • Request a feature from inside the app. The bottom-right bug-report button is now a general Feedback button: the modal opens with two tabs — Report a bug (unchanged) and Request a feature, which asks what you’re trying to do and what PatchMap should add or change. Requests are emailed to support the same way bug reports are, with your name, email, page URL and browser attached automatically.
  • Add single ports to a custom device template. The template editor’s port input now has an Add port button alongside Add range, so ports a range can’t express — Console, Mgmt0, PSU-A — can be added one at a time with their own type and media. Pressing Enter does the right thing either way: a valid range expands as before, anything else is added as a single port.

Changed

  • The Topology page’s first-use tip now floats quietly over the bottom of the canvas instead of taking a strip above it — the map keeps its full height and the hint reads as a hint.

[0.10.0] - 2026-07-26

Added

  • PDUs can now be mounted in the rack’s side channels. The rack diagram gains two vertical PDU bays flanking the frame — the 0U side-mount channels a real rack carries (viewed from the rear). Drag a PDU from the unassigned panel (or straight out of a U slot) into a bay and it hangs there as a full-height strip, consuming no U space; drag it back into the grid, across to the other bay, into another rack, or out to the unassigned panel to move it. One strip per side per rack, PDUs only — anything else is politely refused, and the rules are enforced server-side too. While you’re dragging a PDU, every empty bay lights up as an inviting target and turns solid green under the cursor. The device form also offers the choice directly: a PDU assigned to a rack can be placed at a U position (horizontal) or in the left/right side bay (0U vertical). The device page shows the placement as “rack · left/right PDU bay (0U side-mount)”.

  • Filter the Connections page by site, rack and cable type — tickbox multi-selects. Three chip filters sit next to the device box — Site, Rack and Media type — each opening a tickbox list, so you can tick several sites, several racks, or several cable types at once (ticks within one chip always widen: rack A or rack B). A cable matches a filter when either of its ends touches it, and the chips combine as AND — each active filter narrows further (site + rack + device is the intersection). The rack list narrows to the ticked sites (racks carry their site name otherwise, since rack names repeat). Everything filters server-side across the whole estate (the device filter previously only searched the visible page), the row count reflects the filtered total, and both CSV and PDF exports honour the exact on-screen scope (the old grouped fibre/copper filter exported a superset). A Clear filters link — on the Devices, Connections and Groups pages alike — wipes the search and every tick in one click.

  • The Devices page gets the same treatment: Type, Site and Rack become tickbox multi-select chips. Tick two device types and three racks in one go — values within a chip widen, while the chips themselves intersect. Dual-rack patch panels now appear when filtering by either of their racks, and the CSV and PDF exports carry the full on-screen scope, including the search text (exports previously ignored it).

  • The Groups page gains its first filters. A name search plus Type, Site and Rack tickbox chips — a group counts as being in a site or rack when any of its member devices lives there, so “every stack with kit in Rack R01” is now one tick each.

  • Connections CSV export now includes a print-ready cable label column. Each row’s last column holds a two-line label — RACK-U#-PORT for the near end, then the same for the far end — with a real line-feed (char 10) between the lines inside one quoted cell, so label-printer software picks up the line break and prints a two-line flag label directly from the import. Unracked devices fall back to the device name, and 0U side-mount PDUs skip the U segment. Exported files still re-import into PatchMap unchanged (the importer ignores the extra column).

Changed

  • Device names stay readable when you zoom out on the Topology page. Node labels now counter-scale, map-style: as you zoom out, the device name grows inside its card to hold a near-constant on-screen size (the device-type icon grows with it) instead of shrinking into an unreadable smudge. Once you’re far enough out that the vendor/model and rack lines could never be legible, they get out of the way and the card shows just the name, icon, and (for groups) the member count. Cable-end port labels follow the same rule: they grow with the zoom while there’s room to read them, step aside at far zoom, and return — toggle untouched — as you zoom back in (the ×N bundle badges stay put and scale as well). Zoomed in close, everything renders exactly as before.

Fixed

  • New sites and racks no longer vanish from the Topology page. The topology filters used to remember “all sites and racks ticked” as an explicit list of every id that existed at the time — so a site or rack created afterwards arrived silently unticked and its devices were hidden from the diagram (on reorganised instances the page could open empty). Site and rack filters now start empty, which means exactly what it says in the new filter-menu hint: “Nothing selected — showing all”. Tick to narrow, untick to see everything again. Existing browsers migrate automatically on next visit; media- and device-type preferences are kept.
  • Licence expiry banner no longer crashes the app. When the trial/licence countdown entered its warning window while a page was open (or the licence status loaded mid-render), the banner hit a React hooks-order bug that took down the whole route with an error page. The banner now renders its warning tiers without breaking the page underneath.

[0.9.0] - 2026-07-20

Added

  • Move a cable without re-creating it. The connection panel has a new Endpoints section with a Move button on each end of the cable. Pick a free port — on the same device (the picker starts there) or any other device — and the cable is re-terminated in place: cable type, ID, colour, notes and history all survive, and the vacated port frees up instantly. The only rule, as before, is that a cable’s two ends can’t land on the same device. Moves appear in the Activity feed as “moved cable old port → new port”.

  • Select and move multiple devices together on the Topology page. Hold ⌘/Ctrl (or Shift) and drag on the canvas to box-select devices, or ⌘/Ctrl-click to add and remove them one at a time — then drag any selected device and the whole selection moves as one, with every position saved in a single batch (“Saved n device positions”). A plain click still opens the device panel as before, and Backspace can no longer accidentally remove nodes from the canvas.

  • Rename device groups. The group page header now has a Rename button — click, type, Enter (or Save). Group names were previously fixed at creation.

  • Trunks are labelled on the patching schedule — and can be left off. Inter-panel trunks (cables with both ends on patch panels) now carry a TRUNK tag on the PDF patching schedule so permanent structured cabling reads differently from working patches, and a new Include trunks toggle next to Export PDF lets you print a front-of-rack working copy without them (the filename notes no-trunks so copies are distinguishable). Hand-picked row selections always export exactly what you selected.

  • Device templates now include console ports. The bundled device templates (Alcatel-Lucent OmniSwitch models included) previously dropped the console port their source data defines — 161 templates across the library now create it (as a passive/copper serial port), so a switch added from a template arrives ready to patch into a console server.

Changed

  • Connections CSV export includes rack-U positions. Two new columns — u_a and u_b, sitting right after each end’s rack column — carry each end device’s U position, so an exported patching list places both ends in the rack without cross-referencing. Exported files still re-import unchanged (the importer ignores the informational columns).
  • MM fibre cables now draw in aqua on the Topology page — matching the real-world OM3/OM4 jacket colour and making them instantly distinguishable from amber single-mode runs.

Fixed

  • Port names like 1/1/42 no longer turn into dates in Excel. The connections CSV export now wraps date-lookalike values in Excel’s text form, so stack ports open as 1/1/42 instead of 1 Jan 1942 — and re-importing an exported file still works exactly as before (the importer strips the wrapper).
  • Cables without a type no longer vanish from the Topology page. A connection with no cable type set was silently hidden from the topology — including from the links list when clicking a bundled cable between two devices — because the media-type filter (whose default selects all data types) could never match an untyped cable. Untyped cables now show whenever the media filter isn’t narrowed; narrowing to specific types still excludes them.
  • Rack drag-and-drop now works in Edge and Chrome. Dragging a device in the rack planner silently did nothing in Chromium-based browsers (Edge, Chrome) — the drag started and instantly cancelled, while Firefox worked. Caused by a style change applied to the dragged block at the exact moment the drag began, which Chromium treats as a cancelled drag; the change now applies a moment later and dragging behaves identically in all browsers.
  • Stack ports now list in true numeric order. Port dropdowns for stacked/grouped devices (the connection wizard on the Topology page included) sorted names as plain text, so 1/1/10 and 1/1/11 appeared before 1/1/2. Ports now sort naturally — 1/1/1, 1/1/2, … 1/1/10 — member by member, lowest at the top.

[0.8.0] - 2026-07-19

Added

  • Clone a device and its ports in one click. Every device row on the Devices page (and the device page header) now has a Clone button. The copy is named clone_<original name> and keeps the hardware description — type, vendor, model, U-height, power draw — plus the complete port layout, including patch-panel front/rear slot pairing. It deliberately starts clean: no rack position, no group membership, no serial number or asset tag, and nothing cabled, so you can rename it and drop it into a rack. Clones appear in the Activity feed as “cloned source → copy”.
  • Reorder racks in the multi-rack view. Each rack column in the side-by-side view now has ← / → arrows in its header to shift that rack left or right — no more deselecting and re-selecting racks just to change the column order. The order still lives in the URL, so a shared link reproduces your arrangement.

[0.7.0] - 2026-07-16

Added

  • Create a patch panel with its slots in one step. The Add-device form now asks how many slots a new panel has (default 24) and creates them as numbered front/rear pairs (“01”…“24”) ready to patch through — no more adding slots one at a time or importing ports and pairing them afterwards.
  • One-click repair for scrambled Front/Rear sides. Panels built from imported A01/B01 port lists could show the wrong side labels (an upgrade assigned sides by creation order, not by name). A new Fix Front/Rear sides button on the panel’s device page re-derives every slot’s sides from its port names — A01 is Front, B01 is Rear again.

Changed

  • Design consistency pass across the whole app. Buttons, inputs, and selects now come in one shared size scale (no more one-off heights); dialog titles, modal headers/footers, slide-over headers, and table headers follow a single pattern; row-action Edit/Delete buttons look identical on every list page and are keyboard-focusable (most previously had no visible focus state); list-row icons, hint text, and timestamps use consistent sizes and colours throughout.

Fixed

  • Rack planner drops now land where the preview shows. Dragging a multi-U device within a rack could place it up to several U above the green preview (the grab-point correction was never applied at drop time).
  • A patch panel placed front-and-rear in the same rack can no longer be dropped onto its own other half, and the server now rejects any device placed over a panel’s rear block — previously rear-side slots were invisible to overlap checks, so devices could silently stack.
  • Dropping a device or filler onto an occupied or out-of-bounds slot no longer leaves the green/red hover band stuck on the rack.

[0.6.0] - 2026-07-15

Added

  • Pending invites on the Users page. Admins now see a “Pending invites” section listing invites that were sent but not yet accepted — email, role, when it was sent, and when it expires (with an Expired badge for stale ones) — and can revoke a pending invite, which kills the emailed accept link immediately. Works on both PatchMap-connected and air-gapped instances.
  • Device search. The Devices page has a search box that matches name, vendor, model, serial number, and asset tag — across the whole inventory, not just the visible page.
  • Filter the unassigned list in the rack planner. The Unassigned side panel (single-rack and side-by-side compare views) now has a filter box to find a device by name, vendor, model, or type, with an “x of y match” count.

Changed

  • Sessions now time out. You stay signed in while you’re active, but a session idle for 12 hours requires a fresh login (operators can tune this with SESSION_IDLE_TIMEOUT_HOURS), and even a continuously active session re-authenticates after 30 days. Previously a session could survive indefinitely.

Fixed

  • The floating “Report a bug” button no longer sits on top of the Previous/Next pagination buttons at the bottom of list pages (Connections, Devices, Users, Activity).
  • CSV import now works on real installations. The import wizard’s validate/apply calls and its “Download template” links were missing authentication and always failed outside development mode.
  • Changing or resetting a password now signs out every other session for that account. Previously an already-signed-in session (or a stolen token) survived a password change.
  • A mistyped password no longer counts twice against the login rate limits (the app was silently retrying failed logins).
  • The Invite user dialog no longer shows the previous attempt’s email or error message when reopened.

[0.5.1] - 2026-06-06

Added

  • Place each side of a patch panel independently from the unassigned list. In the rack planner, an unplaced patch panel now appears in the right-hand list as a single card with two draggable halves — Front (A) and Rear (B), using your side labels when set. Drag each half into whichever rack it belongs to. A half that’s already placed shows where it landed (rack + U position) while the other stays draggable, and the card stays in the list until both halves are placed.

Fixed

  • A patch panel with both sides placed in the same rack now shows both the front and rear blocks at their U positions (previously the rear block was hidden, and its slot wasn’t protected from overlap).
  • You can now drag a placed patch-panel half — including the rear side — back out of a rack to unplace it, in both the single-rack view and the side-by-side compare view.
  • Long device or rack names no longer wrap and inflate the patch-panel cards in the unassigned list.
  • On a 1U patch panel, the dual-rack cross-reference text (”↔ other rack U-n”) no longer overlaps the panel’s name in the rack diagram.
  • In the side-by-side compare view, the “drop to unassign” highlight on the shared list no longer stays stuck on after you drag a device out into a rack.

[0.5.0] - 2026-06-06

Added

  • One-shot patch-through. You can now document a cable that passes through a patch panel in a single step: pick the panel and slot once, then set the device and port on the front side and on the rear side. Both cable legs are created together and linked, so a trace runs straight through the panel end-to-end. Either side can be left open and wired later. The flow is available from the Connections tab, and in Topology by dragging a cable to or from a patch-panel node (the device you dragged is pre-filled as one leg) or by clicking a panel’s free slot side.
  • Front/Rear slot sides. Patch-panel slots now carry a clear Front (A) and Rear (B) identity with labels (using your side labels when set, otherwise “Front”/“Rear”), shown in the panel’s slots table. A Flip control swaps a side if it was auto-assigned the wrong way round.
  • Dual-rack patch panels. A single patch panel can now occupy a U slot in two different racks at once — set a Side A (Front) rack and a Side B (Rear) rack on the panel. It renders in both rack diagrams at its U position on each side, shows a cross-reference badge (”↔ other rack U-n”), is clickable from either rack, and counts toward each rack’s capacity. The device-location matrix and rack-layout PDF exports list both placements.
  • Connect a free panel port from Topology. Clicking a patch panel in the topology view now lists all its slots; clicking a free side opens the connection wizard to wire a device onto that exact port.

Fixed

  • Deleting a device that still has cables attached no longer fails with a server error. You now get a clear message naming how many connections are still attached, and the delete dialog offers to delete the device together with its connections in one step (or you can remove the connections first).

[0.4.0] - 2026-06-05

Added

  • A new Activity page shows a live, searchable history of who changed what across your workspace — who relocated a device into another rack, who deleted a device, who added or removed a connection, and who created, renamed, or deleted a rack. Filter by person, action, entity type, or date range, search by name, and watch it update automatically within a few seconds as colleagues make changes — no refresh needed. Activity is retained for 30 days, and every signed-in user can see it.
  • The sidebar now shows who you’re signed in as — your name (or email) and role — just above the Log out button, so it’s always clear which account you’re using.
  • Inviting a user now emails them a branded one-time invite link that names the organisation they’ve been invited to. You still see the link right after creating the invite, so you can copy and share it directly if you prefer — and if email delivery isn’t available on your instance, the screen tells you it couldn’t be sent so you can share the link yourself.
  • The device-creation form now recognises far more hardware out of the box. The built-in template library has grown to 318 switch, router, and firewall models across 18 vendors — including Cisco, Arista, Juniper, Palo Alto, Fortinet, HPE, Dell, Ubiquiti, MikroTik, Extreme, Check Point, and more, with deeper data-centre and enterprise coverage (Cisco Nexus/Catalyst, Arista 7050/7060/7280, HPE FlexFabric and Aruba CX, data-centre FortiGate/FortiSwitch, and Alcatel-Lucent OmniSwitch) — so the “Template available — Apply” prompt pre-fills the correct ports for many more devices without you having to build a custom template first.

Changed

  • Empty states, the dashboard onboarding card, the auth-loading splash, and the import-success affirmation now show the current PatchMap brand mark instead of the previous honeycomb ornament left over from an earlier design.

Fixed

  • The topology view now stays in sync when more than one person is editing it. Another user’s device moves, and connections they add or remove, now appear automatically within a few seconds — you no longer have to refresh the page to see them. While you’re dragging a device, incoming updates wait until you let go, so a teammate’s change can never snap a node out from under your cursor mid-drag.
  • The “Don’t see your model? Request it” link on the device-creation form was pointing at a placeholder GitHub repo (404). It now opens an in-app form (matching the bug-reporter pattern) that emails the request to support@patchmap.ai with the vendor, model, an optional data-sheet URL, and any notes you add.
  • Repeated wrong passwords now briefly lock an account. After several failed sign-in attempts the account is locked for a short period, and repeated attempts from one source are slowed down. If a colleague reports being unable to sign in shortly after mistyping their password, this is why — it clears on its own.

[0.3.0] - 2026-05-30

Added

  • Topology canvas: drag from the + indicator on any port to pull a new connection — the new-connection wizard opens with both endpoints pre-filled.
  • Topology canvas: pan and zoom now persist across reloads, so you return to exactly where you were last looking.
  • Workspace switcher in the sidebar for users with access to more than one PatchMap workspace — switch without re-authenticating.
  • Single-sign-on at the login screen, for instances that have been linked to an external identity provider. New users are created automatically on first sign-in.

Changed

  • Login screen redesigned around a primary sign-in button; the local-credentials form is reserved for admin break-glass.
  • Auth buttons standardised — full-width rounded boxes that match the surrounding form fields.
  • Updates page rebuilt with clearer running-version status and a single source of truth for the version across the app.

Fixed

  • Sign-in email collisions now return a graceful 409 instead of a server error — useful when an existing local account tries to sign in under a different identity.
  • The app’s shell HTML is no longer browser-cached, so a fresh deploy is picked up immediately without forcing a hard refresh.

[0.1.0] - 2026-05-07

Initial build covering Phases 1–22: network documentation core, authentication, single-sign-on, licensing, deployment, the UI overhaul, brand refresh, PDF exports, the dashboard, and the sites map view.