Commit Graph

872 Commits

Author SHA1 Message Date
Jack Carter
c5e61c68bd Serve props JSON for /api data requests via middleware rewrite (#902)
* fix: serve props JSON for /api data requests via middleware rewrite

The /api/:path* -> /ipa/:path* rewrite in next.config.mjs is applied by
Vercel's routing to client-side props fetches
(/_next/data/<buildId>/api/....json), but the data-request context is
lost and the prerendered page HTML is returned instead of JSON
(vercel/next.js#39669). The router then never receives pageProps, so the
API sidebar stays collapsed and the tab title shows undefined until a
full reload. This half of the bug only occurs on Vercel infrastructure;
the dev server and next start resolve rewrites for data requests
correctly, and #900 fixed only the /ipa redirect half.

Middleware rewrites preserve data-request semantics, so rewrite /api/*
to /ipa/* in middleware for data requests only (x-nextjs-data header).
Regular page requests fall through to the existing config rewrites, and
the /ipa -> /api canonical redirect is unchanged.

* fix: move /api data-request rewrite into existing proxy.js

Next 16 uses proxy.js and rejects builds where both middleware.js and
proxy.js exist; this repo already had src/proxy.js for the
/docs-static/_next asset rewrite. Fold the /api -> /ipa data-request
rewrite into it and drop middleware.js. Verified the proxy intercepts:
data responses now carry x-middleware-rewrite: /ipa/... and JSON bodies.

* fix: map bare api.json data requests to ipa/introduction.json

The raw data-path fallback rewrote /_next/data/<build>/api.json to
/_next/data/<build>/ipa.json, but there is no /ipa index page; mirror
the /api -> /ipa/introduction rewrite instead.
2026-08-03 14:40:12 +02:00
Philip Laine
7df7793e0f Add documentation for NetworkEgress (#861)
* Add documentation for NetworkEgress

* Update src/pages/use-cases/kubernetes/routing-peer.mdx

Co-authored-by: dmitri-netbird <dmitri.external@netbird.io>

* Update src/pages/use-cases/kubernetes/routing-peer.mdx

Co-authored-by: dmitri-netbird <dmitri.external@netbird.io>

* Update network egress section in routing-peer.mdx

Clarified the explanation of network egress traffic and its configuration in Kubernetes.

* Update routing-peer.mdx

---------

Co-authored-by: Jack Carter <128555021+SunsetDrifter@users.noreply.github.com>
Co-authored-by: dmitri-netbird <dmitri.external@netbird.io>
2026-08-03 11:54:05 +02:00
Bruno Mercier Costa
fe16bcbfed List each supported IdP as a heading on the idp-sync page (#899)
The supported identity providers were a bullet list of links, so none of
them appeared in the "On this page" navigation. Make each one a
subsection heading with its setup link, and promote Generic SCIM to a
top-level section so it is a peer rather than a sub-item. Also fix a
typo (identify -> identity).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 11:19:46 +02:00
Jack Carter
63677de5a0 docs: update the Ansible IaC page for collection 1.3.0 behavior (#898)
The collection now warns instead of silently ignoring immutable
setup-key parameters, refuses to un-revoke a key, and can rotate a
key that cannot enrol peers. Name lookups fail on duplicates instead
of picking one, group deletion can resolve auto_groups pins, a zone
name defaults to its domain, and a network router masquerades by
default. Update the troubleshooting entries that described the old
behavior and add symptom-shaped entries for the new failure modes.
2026-08-03 10:51:22 +02:00
Jack Carter
3f02e402da docs: masquerade-off HA is achievable, not impossible (#893)
* docs: masquerade-off HA is achievable, not impossible

Both the routing-peers page and the masquerade page stated that high
availability "stops working" with masquerade off. That reads as a flat
impossibility and loses a legitimate use case (source IP preservation for
audit, per-user database rules, or firewall policy keyed on the real source).

What is actually true is narrower: NetBird's half of the failover still
works, clients move to the standby peer on their own. What is missing is the
return route inside the destination network following that move. State the
condition instead of the impossibility, and add a short section on what
meeting it takes: distinct metrics so the active peer is the same for every
client, plus a virtual IP or a router-moved route so the next hop follows.
Both live outside NetBird, so the section names the pattern rather than
shipping a third-party config we would then own.

Also:

- Soften "failover is automatic and immediate". Clients re-select within
  seconds, which is fast but not instant, and "immediate" invites a support
  ticket from anyone who measures it. Phrased so it does not assert whether
  the client or the management side detects the loss, which this change did
  not verify.
- Warn against pointing the return route at both peers, as two static routes
  or an equal-cost pair. It is the intuitive fix and it fails silently.
- Note that the second interruption on recovery cannot be avoided by pinning
  the virtual IP to the standby, since the client's switch back is automatic.
  Pinning the route while the client moves back strands the return path.
- The return route can live on the destination subnet's default gateway even
  when the gateway and the routing peer share that subnet, which is the only
  option when the destination host is not the customer's to configure. The
  page previously offered the gateway only for a different-subnet
  destination, and its persistent-config steps assume host access throughout.

* docs: health check must cross the path, not test the peer

A routing peer can stay enrolled and report healthy, with its WireGuard
interface present, while being unable to forward from the tunnel to the
destination subnet: a failed LAN interface, or a firewall change. Nothing
fails over in that state. NetBird sees a reachable peer, and a health check
that only looks for the interface sees a healthy one, so the return route
stays pointed at a peer that forwards nothing until someone intervenes.

Say that the check has to reach a destination through the tunnel.

* docs: held connections stall across a failover, they do not reset

Measured on a routing-peer pair with masquerade off: a held TCP connection
survives the switch. Four failovers, graceful shutdown and hard kill, all
showed the same signature — one round trip with multi-second latency, then the
same connection continuing with monotonic sequence numbers. No resets, and no
RST on the wire in any of them.

The reason is a property of masquerade being off: the addresses on the
connection do not change when another peer takes over, so the flow is portable
between peers, and the routed ACL accepts on addresses rather than on
connection state, so the standby forwards mid-stream packets it never saw a
handshake for.

Note this is specific to masquerade being off. The general high-availability
section still says established connections reset, which is the masquerade-on
default, where the standby would translate to a different source address.

Also trims the mechanism guidance to name the pattern rather than lean on any
one implementation, since which mechanism is right may change.

* docs: scope the reset claim to masquerade on, fix leftover contradiction

Review of the branch turned up three problems.

The Networks overview still said disabling masquerade 'breaks high
availability', one click from the page arguing it does not. Reworded to say it
makes high availability something you arrange rather than something you get.

Neither reset/stall sentence named its masquerade scope, so a reader with
masquerade off met both and they flatly disagreed. The general failover section
now scopes its reset claim to masquerade on, names the reason (the standby
translates to a different source address), and links onward.

'Stalls for the length of the failover' understated it. Measured stalls were 6
to 13 seconds against a 6 second failover, because the sender waits for its
next retransmit after the path returns. Says so, with the range, and keeps the
claim hedged to what was observed rather than asserting connections are never
broken.
2026-08-03 09:52:02 +02:00
Viktor Liu
18c3208d8e Document allow_match any/all mode for reverse proxy access restrictions (#884) 2026-08-01 15:59:46 +02:00
Viktor Liu
ddec3c2f3c Correct the profile removal and SSH authentication privilege wording (#895) 2026-08-01 15:57:30 +02:00
Misha Bragin
fc92ecc8f3 docs: document adding models not in the catalog (#896) 2026-08-01 15:56:52 +02:00
netbirddev
14375a0927 Update API pages with v0.76.1 2026-07-31 19:35:47 +00:00
Viktor Liu
cb6aa7b244 Document daemon IPC privilege requirements and the Windows named pipe (#894) 2026-07-30 13:51:23 +02:00
Jack Carter
0977b7e7b4 docs: add Commercial License Overview nav entry (#892)
Turn "Commercial License" into a plain nav group and add an "Overview"
child pointing at /selfhosted/enterprise, above "Getting Started". This
matches the pattern already used by Networks, Cloud Marketplaces,
Observability, and Troubleshooting, where the section index page is
reachable as its own "Overview" link rather than only via the group
label.
2026-07-28 12:26:22 +02:00
Maycon Santos
c53c0831a5 Correct Linux desktop app requirements and drop libappindicator (#888)
The Wails 3 desktop app links GTK 4.10+ (GtkFileDialog) and WebKitGTK 6.0,
verified against the shipped v0.75.0 netbird-ui binary. The previously
documented floor of Debian 12 / Ubuntu 22.04 is below that: both ship
WebKitGTK 6.0 but only GTK 4.8 and 4.6, where the app starts and then
crashes on the first file dialog.

- Document the real floor per distribution and mark RHEL 9, Amazon Linux 2
  and Amazon Linux 2023 as CLI only.
- Name the GTK 4 and WebKitGTK 6.0 packages in the install commands, since
  netbird-ui does not declare them as dependencies.
- Note that EPEL provides webkitgtk6.0 on RHEL/AlmaLinux/Rocky 10.
- Remove libappindicator from the RPM install lines. The tray is a D-Bus
  StatusNotifierItem and does not link libappindicator; keep the GNOME
  extension step, which is still required for the tray to appear.
- Note that Linux netbird-ui packages are x86_64 only.
2026-07-28 11:34:37 +02:00
netbirddev
302f76bd41 Update API pages with v0.75.1 2026-07-28 08:39:05 +00:00
Maycon Santos
8c862e1f91 Document Agent Network prompt-cache token and cost accounting (#886)
Co-authored-by: braginini <bangvalo@gmail.com>
2026-07-26 21:44:09 +02:00
Misha Bragin
1a6c7639fa Add commercial license links (#885) 2026-07-25 20:56:27 +02:00
Brandon Hopkins
24b4157011 Change cookie popup behavior (#849) 2026-07-24 08:28:04 -07:00
PizzaLovingNerd
8eaa109a1d Crowdsec Dashboard Protection docs (#831) 2026-07-24 07:45:41 -07:00
PizzaLovingNerd
b867aa85c8 Updates for the NetBird 0.75 update (#881) 2026-07-24 07:43:56 -07:00
Jack Carter
f6ee418c4b docs: use euros for plan pricing on billing page (#882) 2026-07-24 10:32:46 +02:00
Misha Bragin
03d15c3b62 Add Kimi (Moonshot AI) integration docs and Claude Code section (#878) 2026-07-23 19:52:09 +02:00
netbirddev
2dd6788def Update API pages with v0.75.0 2026-07-23 16:27:29 +00:00
Bruno Mercier Costa
24d6bf97d9 Document the iOS debug bundle and surface it in the client guide (#880)
The NetBird iOS app can now collect a debug bundle from Settings ->
Troubleshoot. Update the iOS troubleshooting page to use it and route
reports to Community Support, or NetBird Support for paying customers.
Also reference the iOS method from the canonical Debug bundle section
and update the iOS card on the client troubleshooting hub.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 16:36:43 +02:00
Jack Carter
a4e7c1df5c Add Windows GPO deployment guide (#879)
* new: Windows GPO deployment guide under MDM for Deployment

* new: point GPO guide at the full policy key reference

* new: bold the example-posture disclaimer in GPO guide

* new: grammar and readability pass on GPO guide

* new: clarify AUTOSTART=0 vs Disable Autostart policy

* new: address review feedback on GPO guide install script and pinning
2026-07-23 16:14:52 +02:00
Bethuel Mmbaga
f51e8ea987 Simplify enterprise setup steps (#877) 2026-07-23 12:41:26 +03:00
Jack Carter
706ad86b81 docs: add geo-based exit node routing use case to exit nodes page (#875)
* docs: add geo-based exit node routing use case to exit nodes page

Full tunnel outside a country via a Country and Region posture check on a
0.0.0.0/0 Network resource's access policy; split tunnel inside. Warns
against the Peers-page exit node variant, where the posture check only
blocks traffic after the default route installs and in-country devices
lose internet. Lab-verified (lab-2026-07-22-geo-exit-node).

* docs: drop unverified route-appearance delay claim

* docs: revert unintended package-lock churn from local npm install

* docs: clarify why the Peers-page exit node cannot be posture-gated

* docs: compress the exit-node posture warning to one line

* docs: rename step 2 heading to Create the Network Resource

* docs: drop incorrect ICMP peer-policy requirement from geo use case

Verified live: with the resource access policy alone (peer policy to the
routing peer disabled), internet forwarding through the Networks exit
node keeps working. The ICMP-minimum note applies to network-routes
exit nodes, not the Networks resource path.

* docs: explain why match-ALL DNS matters in the geo use case

Without it a full-tunnel device leaks its location via DNS to the local
resolver (verified: zero port-53 packets on the tunnel until the
match-ALL nameserver is set); with it, split-tunnel devices reach the
same nameserver directly and keep resolving.

* docs: grammar and readability pass on the geo exit node section

* docs: refer to Routes instead of Peers page in the posture warning

* docs: state the example's goal explicitly before the setup groups

* docs: name the network after its location, the resource internet-egress

* docs: make the resource group optional in the geo use case

* docs: note the API marks the fields required, defaults are current behavior

* docs: name the GeoLite2 database and link self-hosted setup
2026-07-23 10:41:39 +02:00
Brandon Hopkins
5ec38f9b58 Add Health checks section to CLI docs (#876) 2026-07-22 10:35:56 -07:00
Bruno Mercier Costa
0bbf69dad0 Add an Updating section to the pfSense install guide (#866)
* Add an Updating section to the pfSense install guide

Document upgrading in place: re-fetch the latest netbird and
pfSense-pkg-NetBird .pkg files from the latest GitHub release and re-run
pkg add -f on both (no pkg delete first, -f upgrades in place), then
netbird service restart and netbird status -d to verify. Matches the
Installation section's step style and the <RELEASE_TAG>/<VERSION>/<ARCH>
placeholders, and the Updating-before-Uninstallation layout used on the
Linux and Synology pages.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Point the pfSense upgrade step at the downloaded filenames

Mirror the Installation step wording so the pkg add commands use the
exact filenames downloaded from the release, which have independent
NetBird and pfSense package versions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 17:04:43 +02:00
Jack Carter
e4b4eb737c docs: add Enterprise Commercial License overview page (#869)
* docs: add Enterprise Commercial License overview page

Add a public, shareable overview of the NetBird Enterprise Commercial
License for teams evaluating self-hosted NetBird. Answers the questions
prospects ask most: in-place migration from the open source Community
Edition, zero-downtime control-plane upgrades via active-active HA,
control-plane behavior at scale, single-tenant boundaries and the
options for serving multiple customers, and how evaluation works.

Clarifies that the Cloud "Business plan" and the self-hosted commercial
license are different products, and lists what the license unlocks
(HA, SCIM, EDR/MDM integrations, traffic-flow logging, standard support).

Served at /selfhosted/enterprise and linked from the Self-Host sidebar.

* docs: qualify connection continuity by deployment topology

The single-server upgrade answer claimed all established connections
survive a restart. That holds only when Relay runs externally. In the
default combined deployment, netbird-server bundles Management, Signal,
and Relay, so recreating it restarts Relay and active relayed sessions
reconnect. Clarify that direct peer-to-peer connections continue either
way, while relayed-session continuity depends on whether Relay is
external or restarted with the combined server.

* docs: describe the commercial PoC as assisted, with 30-day default

"Managed proof of concept" overstated the offer. Per the EULA the
customer installs and runs the stack, with NetBird providing the license
and guidance, and a commercial PoC runs 30 days by default. Reword to
"assisted proof of concept" and state the default duration.
2026-07-22 16:50:06 +02:00
Bruno Mercier Costa
592d31c195 Expand Issue 8 (NRPT lingering GPO) with GPO-hunt and source-side fixes (#862)
* Expand Issue 8 (NRPT lingering GPO) with GPO-hunt and source-side fixes

Enrich the Windows NRPT lingering-GPO troubleshooting with the deeper
diagnosis and remediation the issue needs: the DnsPolicyConfig registry
check, finding the responsible GPO (gpresult plus a SYSVOL registry.pol
scan), and the source-side fixes (the dummy-rule trick for an empty
lingering container, and guidance when a GPO carries real NRPT rules).

Heading and anchor are unchanged, so existing links keep resolving.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Replace em dash with a period in Issue 8 (house style)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 16:46:48 +02:00
Nicolas Frati
35d562944b docs: add documentation for admin cli (#832) 2026-07-22 06:36:36 -07:00
Jack Carter
5acf494559 docs: add performance expectations section to exit nodes page (#873)
* docs: add performance expectations section to exit nodes page

* docs: qualify throughput figures and extend low-throughput checks
2026-07-22 12:22:53 +02:00
Riccardo Manfrin
accc461a7e Add Mdm auto start flag doc (#855)
* MDM disableAutoStart flag

* Added note on desktop only mode
2026-07-22 11:53:01 +02:00
PizzaLovingNerd
9516423b3f GRPC and JSON Socket docs. (#859)
* Documentation for GRPC and JSON Sockets

* improve gRPC and HTTP/JSON socket documentation

* Update src/pages/client/grpc-socket.mdx

Co-authored-by: Nicolas Frati <nicofrati@gmail.com>

---------

Co-authored-by: Nicolas Frati <nicofrati@gmail.com>
2026-07-22 08:00:38 +02:00
Bruno Mercier Costa
50d1699348 Ask for the JumpCloud console region in the SSO setup step (#871)
Step 10 now asks customers to tell us which region their JumpCloud
console is in (US, EU, or India) along with the Client ID and Client
Secret, so the connector is configured against the right endpoint.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:47:33 +02:00
Jack Carter
cd55c3d0cf docs: remove incorrect posture-check troubleshooting bullet in Zero Trust guide (#870)
The "Policy exists but connection is still blocked" entry told readers to look
for "blocked due to posture" or "no matching policy" entries in Traffic Events.
Those entries do not exist: a failed posture check or group mismatch is resolved
on the management server and never produces a Traffic Event. Drop the bullet;
the remaining checks (policy and posture checks under Access Control, group
membership under Peers) are the accurate guidance.
2026-07-21 16:13:37 +02:00
Bruno Mercier Costa
b37befc602 Reference the config-file bootstrap workflow from install and peer pages (#868)
* Reference the config-file bootstrap workflow from install and peer pages

Link Bootstrap peers via config file from the setup-key sections of the
Linux, Windows, macOS, and Docker install pages, from the Setup Keys
page, and from the Kubernetes routing-peers guide. The page was only
reachable from the sidebar, so this surfaces the unattended deployment
workflow where headless and at-scale enrollment is already discussed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* Clarify the Kubernetes example demonstrates setup-key enrollment

The manifest passes a setup key but does not mount a pre-populated
config, so reword the cross-link: the example enrolls with a setup key,
and the bootstrap guide covers the additional config-file step.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 15:36:19 +02:00
Bruno Mercier Costa
a6c4910479 Note that reverse proxy access rules combine with AND by default (#863)
Clarify in "Step 3b: Configure access control" that access restrictions
of different types (IP CIDR, country, CrowdSec) are combined with a
logical AND by default: a connection must satisfy all of them.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 09:42:01 +02:00
Bruno Mercier Costa
43b53a2aa5 Use colons for the per-browser lead-ins on the Record a HAR file page (#865)
The per-browser export steps led each bold browser label with an em
dash. Switch to a colon so each bullet reads as a clean
label-then-instruction, consistent with the other bullet lists in the
docs. Wording is otherwise unchanged.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:22:21 +02:00
Bruno Mercier Costa
b768ee6fd6 Add Windows SSO port-53000 (TCP) login troubleshooting (#864)
Document the two failure modes when the NetBird CLI SSO login can't bind
its loopback callback port on Windows: bind forbidden (WSAEACCES, port
inside a Hyper-V/winnat reserved range) and address in use
(WSAEADDRINUSE, a stale process). Note that the redirect port is a
configured, IdP-registered set (default 53000, often 54000), not a
single hardcoded value, and cover cases where AV/EDR or other software
blocks the bind invisibly.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:21:51 +02:00
Maycon Santos
50660d5f32 agent-network: identity metadata setting and Bedrock cost allocation (#857) 2026-07-20 14:46:49 +02:00
Riccardo Manfrin
313c6e0645 Adds doc for NB_SOCKS5_LISTENER_ADDRESS (#860) 2026-07-20 09:41:47 +02:00
Bruno Mercier Costa
31f2b6c7ad Surface the DC WireGuard port conflict in the troubleshooting flow (#853)
Link the existing "WireGuard port conflict on Domain Controllers"
guidance (on /manage/dns/internal-dns-servers) from two pages a
troubleshooting-hub user could not previously reach it from:

- Windows client troubleshooting: a bullet under Windows DNS scenarios
  for the "NetBird won't start on a DC" symptom.
- DNS troubleshooting: a note after the AD/DC issue, disambiguating the
  client-running-on-the-DC case.

No content duplicated; both are pointers to the one existing section.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 13:55:09 +02:00
Pascal Fischer
37d20b2a92 update management env vars with NB_PPROF_ADDR (#854) 2026-07-15 12:05:14 +02:00
Bruno Mercier Costa
32fcf94fb1 Link Reverse Proxy troubleshooting under Connectivity (#852)
Surface the existing /manage/reverse-proxy/troubleshooting page in the
Troubleshooting section: add it to the Connectivity sidebar group, and
move its hub chip from the Self-hosted card to Connectivity & networking
so the hub and sidebar agree.

The page covers reaching services exposed through routing peers, which
is a connectivity concern rather than self-hosted control-plane infra.
No new page and no duplicated content: both are pointers to the one
existing page.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-15 10:33:58 +02:00
netbirddev
d24d3a4bdb Update API pages with v0.74.5 2026-07-14 19:09:00 +00:00
Bruno Mercier Costa
3ab1e21f80 Add "Record a HAR file" troubleshooting page (#850)
New /help/recording-a-har-file how-to under Troubleshooting > Report a
bug, covering HAR capture in Chrome, Edge, Firefox, and Safari with the
"preserve log" gotcha and a security warning about tokens in HAR files.

Nest Community/NetBird Support under the Report a bug "Overview" item so
the new page reads as a sibling of the reporting cluster rather than a
fourth flat peer. Cross-link the HAR page from the two support pages and
the Report bugs overview, next to the existing debug-bundle mention.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 13:21:39 +02:00
netbirddev
ae352749f4 Update API pages with v0.75.0-rc.6 2026-07-13 17:30:20 +00:00
Eduard Gert
46e3e6b10f docs: remove experimental lazy connections wording (#842)
* docs: lazy connections are no longer experimental

Lazy connections have graduated from experimental status. Remove the
"experimental" framing from the feature guide, the zero-trust use case,
and the CLI flag reference.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* remove outdated routing peer limitation

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 14:29:21 +02:00
Jack Carter
67152df5b2 docs: add Ansible IaC guide for tenant configuration (#759)
Document the community.ansible_netbird collection for managing NetBird
resources (users, groups, setup keys, policies, networks, DNS, posture
checks) declaratively via the REST API. Adds a new Infrastructure as
Code subsection under Self-Host NetBird with room for future entries.

Cross-links from the Automated Setup PAT bootstrap page since the
collection is the natural next step after obtaining the first token.
2026-07-10 12:46:04 +02:00
Brandon Hopkins
25898dced9 Remove disc (#836) 2026-07-08 08:34:45 -07:00