Calculators, config generators and reference sheets for network engineers.
Subnetting, Cisco IOS configs, port and protocol lookups, and a broadcast/AoIP section for Livewire and AES67.
Live demo · What it does · Install · Make it yours · Deploy · Add a tool · Made by
Warning
NetOps Toolkit is in active development and changes often. Every tool has now been ported over from an older single-script site, but expect rough edges and changes between versions while it settles. Check any generated config before you apply it, and please open an issue if something is wrong.
🔴 See it live: tools.tylerwoodward.me
A static site built with Astro, Tailwind CSS and Svelte. Every tool runs in your browser.
🧮 Calculators
Subnetting, VLSM planning, IP and number conversion, bandwidth. Results update as you type
⌨️ Cisco IOS config generators
VLAN, VRF, ACL, OSPF, BGP, DMVPN, VXLAN and more, plus a CLI reference
📚 References
Ports and protocols, the OSI model, WiFi, fiber and Ethernet cabling, SNMP, WAN services, a glossary and acronym list
🔐 Security
Attack references, a security checklist, and password and RSA key generators that run locally
🎙️ Broadcast and AoIP
Livewire and AES67: LWRP, multicast, ports and bandwidth
🔒 Private by default
Nothing is sent to a server except by the IP Checker, which you can turn off. A strict Content Security Policy (script-src 'self') with no inline code
🍴 Forkable
Rename it, recolor it, hide categories and add your own links from one small config file
On Debian 12 or Ubuntu 22.04 or newer, one line installs Node, builds the site and runs it as a systemd service:
curl -fsSL https://raw.githubusercontent.com/thetylerwoodwardproject/netops_toolkit/main/deploy/install.sh | sudo bashThat serves it on port 80. To put Caddy in front with automatic HTTPS, add your domain (point its DNS at the server and open ports 80 and 443 first):
curl -fsSL https://raw.githubusercontent.com/thetylerwoodwardproject/netops_toolkit/main/deploy/install.sh | sudo bash -s -- --domain tools.example.comRun the same line again to upgrade. Other options: --proxy none, --port, --dir, --ref; see deploy/install.sh --help.
git clone https://github.com/thetylerwoodwardproject/netops_toolkit && cd netops_toolkit
docker compose up -d --build # http://localhost:8080
SITE_ADDRESS=tools.example.com docker compose --profile caddy up -d --build # https://tools.example.comThe site is built into the image, so put your toolkit.config.local.ts (see Make it yours) in the checkout before you build.
git clone https://github.com/thetylerwoodwardproject/netops_toolkit && cd netops_toolkit
npm ci
npm run dev # http://localhost:4321Don't edit toolkit.config.ts. Create toolkit.config.local.ts next to it
(it is gitignored) with only the settings you want to change:
import { defineLocalToolkit } from './src/lib/toolkit-schema';
export default defineLocalToolkit({
name: 'Acme NetOps',
icon: 'tower-cell', // any Font Awesome Free icon; 'brands:github' for brand icons
accent: '#2f7cf6',
site: 'https://tools.example.com',
footer: {
note: 'Run by the Acme network team.',
links: [{ label: 'Acme', href: 'https://example.com', icon: 'building' }],
},
categories: { broadcast: false }, // hide a whole category
externalLookups: false, // drop the IP Checker; the site then makes no third-party requests
});| Setting | What it does |
|---|---|
name, tagline |
Header, page titles, share cards, web manifest |
icon |
Logo and favicon. A Font Awesome Free name; an unknown name fails the build |
accent |
Theme color for buttons, links, highlights and the favicon |
site |
Canonical URL, used by the sitemap and share links |
footer |
A line of text and a list of links, each with an optional icon |
categories |
net101, calculators, reference, cisco, security, operations, broadcast; set any to false to leave it out |
externalLookups |
false removes tools that call third-party services |
indexable |
false serves a robots.txt that refuses crawlers, e.g. for a staging copy |
tools/build # type-check, build into .build/, verify
tools/publish # the same into .releases/<stamp>/, then point `dist` at ittools/publish swaps the dist link only after the build and verification
pass, so a broken build never goes live.
Serve dist with node tools/serve.mjs, a small dependency-free server that
sends the Content Security Policy the site is built for (the installer and the
Docker image run it), or with any static server: deploy/nginx.conf.example is
a starting point for nginx.
tools/verify.mjs fails a build that contains any inline script, style or
event handler, because the site is meant to run under script-src 'self' and
style-src 'self'. It also checks that exactly the enabled tools have pages.
- Add it to
src/data/tools.ts: id, name, description, Font Awesome icon, category and search tags. - Create
src/tools/<id>/index.astro. Static reference content is plain Astro. For anything interactive, write a Svelte component, render it inside<div data-island="<id>" data-ssr>, and start it from a<script>withstart()fromsrc/lib/mount.ts(seesrc/tools/subnet-calc/). Don't use Astro'sclient:*directives: they add an inline script the CSP blocks. - Use the shared classes in
src/styles/global.css(panel,tip,ref-table,result-grid,form-input,btn…) and Tailwind utilities, neverstyle="". - Drop-downs inside a Svelte island use
src/components/SelectField.svelte(label,id,options,bind:value), a shadcn-svelte select. It matches theform-inputsizing. Don't use a native<select>for form input, and don't add shadcn components that open popovers without checking them under the CSP (see below).
components.json is set up, so npx shadcn-svelte@latest add <name> puts a
component in src/components/ui/. Its colour tokens are aliased onto this
site's palette in global.css, so it follows the theme. After adding one:
- Replace its icon imports with
Icon.svelte(Font Awesome). accentis the brand colour here, but shadcn uses it for hover highlights; usemutedfor those.- Check it with the CSP on: open it, use it, and look for console errors.
bits-ui's scroll lock restores the page with
setAttribute('style'), whichstyle-src 'self'blocks and leaves the page locked, soselect-contentdefaults topreventScroll = false. Other overlays (dialog, popover) need the same check.
NetOps Toolkit is made by Tyler Woodward, host of the podcast The Tyler Woodward Project.
MIT © 2026 Tyler Woodward. See LICENSE. Icons are Font Awesome Free (CC BY 4.0).
