AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
A self-hosted, full-stack network management platform for MikroTik devices. Monitor, configure, and manage your entire MikroTik infrastructure — routers, switches, and wireless access points — from a single web interface.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A self-hosted control plane for your entire MikroTik fleet.
Monitor, configure, and safely change routers, switches, and access points — from one web interface.
• What it is
• What makes it different
• Screenshots
• Get running in five minutes
• Features
• Safety and change protection
• Monitoring and operations
• Switching, VLANs and wireless
• Firewall and network services
• Visibility and troubleshooting
• Fleet operations
• Access control and platform
• Documentation
• Contributing
• LicenseREADME 전문 보기 ↗[!IMPORTANT] 1.0 release candidate: testing until Saturday 31 October. v1.0.0-rc.9, the latest release candidate for the first stable release, is out, and the feature freeze is in effect. Stable 1.0.0 is planned for Sunday 1 November if testing turns up nothing serious.
- Updating: if you update from
mainor run the:latestimages, your normal update brings the RC. Take a platform backup first (Settings → Backup & Restore).- Testing: please report anything that looks wrong as an issue. The plan and the discussion are in #316.
- What's in it: release notes.
- From 1.0, two release channels:
mainand:latestare the stable line (1.0.x, fixes only);devand:betacarry the next version's betas. See release channels.
MikroTik Manager gives a whole fleet of RouterOS devices a single management surface: live monitoring, client tracking, VLAN and wireless configuration, firewall management, firmware rollouts, backups, and traffic analytics — without logging into WinBox on each box in turn.
It runs entirely on your own hardware via Docker Compose, talks to devices over the RouterOS API (and SSH where RouterOS requires it), and stores nothing outside your network.
Plenty of tools can show you a MikroTik fleet. The hard part is changing one safely.
RouterOS applies every command immediately and independently. There is no transaction, no rollback, and no cross-object validation — so it will accept a change that severs the very path you are managing it over. MikroTik's own documented advice for enabling VLAN filtering is, literally, to have a serial console ready.
That is the problem this project takes seriously. Three layers address it, and they are the reason this platform exists rather than another dashboard.
Before applying a risky change, the device saves a restore point and arms a scheduler to reapply it. The change goes in, then reachability is proven on a brand-new connection. Confirmed, and the scheduler is disarmed. Unreachable, and the device restores itself and comes back — unattended, with nobody driving to the site.
Verified end to end on a CRS running RouterOS 7.23.3 by deliberately deleting a switch's own management address:
T+0 restore point saved, revert scheduler armed, change applied
T+0s device drops off the network
T+40s manager gives up after 4 fresh connection attempts and reports back
T+120s device restores its own backup and reboots
T+3m device is back, change undone, scheduler and restore point gone
It runs entirely over the RouterOS API, so it works on devices with no SSH credentials configured, and it covers twelve change types — bridge VLAN filtering, port PVID and tagging, bridge VLAN add/update/ delete, IP address add/remove, route add/remove, bond create/delete, and management service toggles.
Rather than blocklisting operations someone once thought were dangerous, the platform reads live device state, works out how the manager actually reaches the device, simulates your change against it, and reports any invariant that flips from satisfied to violated.
The ingress port comes from the bridge forwarding table and the manager's own address from the device's connection tracking, so the warning is specific enough to act on:
This change is predicted to cut management access to 2GT-NW-100G. Management arrives untagged on
sfp28-1(PVID 1) — the gateway's MAC is learned there — but VLAN 1 has no bridge VLAN entry listingbridge1as an untagged member.
A predicted lockout is refused outright. Overriding a critical verdict means typing the device name, and the change still runs under Change Guard.
A standing, read-only audit for configurations RouterOS takes without complaint and then quietly
ignores. It encodes MikroTik's documented Layer 2 misconfigurations — an IP address or VLAN interface
on a bridge slave port, a bond slave that is also a bridge port, MTU above L2MTU, a PVID that
frame-type=admit-only-vlan-tagged renders inert, management surviving only on a dynamic VLAN entry,
and more.
Every finding explains what it does to your network, how to fix it, how long it has been there, and links the relevant MikroTik documentation.
| Staged firmware rollouts | Canary waves, pre-upgrade backup, reboot verification, and halt-on-failure so a bad build never reaches the fleet |
| Built-in NetFlow collector | Traffic analytics with per-client attribution and application breakdown — no external collector to run |
| CAPsMAN aware | Centrally provisioned APs are recognised, grouped under their controller, and protected from local writes the controller would discard |
| Rogue AP detection | A foreign BSSID broadcasting one of your SSIDs is flagged as an evil twin |
| Anomaly insights | Client counts and CPU compared against each device's own same-hour 14-day baseline, not a fixed threshold |
| Multi-site | Group devices into sites and view each one's clients, events and topology separately, with an all-sites map. One install, many customer networks |
| Enterprise auth | OIDC/SSO, TOTP two-factor, role-based access, and scoped API tokens |
You need Docker with Compose v2, and MikroTik devices running
RouterOS 6.x or 7.x reachable on their API port (8728, or 8729 for API-SSL).
No source checkout, no build toolchain.
# 1. Grab the compose file and environment template
curl -O https://raw.githubusercontent.com/2GT-Media-Group-LLC/mikrotik-manager/main/docker-compose.ghcr.yml
curl -O https://raw.githubusercontent.com/2GT-Media-Group-LLC/mikrotik-manager/main/.env.example
mv .env.example .env
# 2. Set your domain in .env (secrets auto-generate if you leave them unset)
# CORS_ORIGIN=https://manager.example.com
# 3. Start
docker compose -f docker-compose.ghcr.yml up -d
Open https://localhost (or your server's hostname) and sign in with admin / admin.
Change that password immediately under Settings → Users.
Updating:
docker compose -f docker-compose.ghcr.yml pull && docker compose -f docker-compose.ghcr.yml up -d. This follows the stable channel (:latest); addMTM_TAG=betato.envfor betas of the next version. See release channels.
git clone https://github.com/2GT-Media-Group-LLC/mikrotik-manager.git
cd mikrotik-manager
cp .env.example .env # edit CORS_ORIGIN for production
docker compose up -d
First run builds the frontend and backend, initialises PostgreSQL and InfluxDB, and generates a self-signed TLS certificate. Accept the browser warning, or upload a real certificate under Settings → TLS Certificate.
Updating:
git pull && docker compose up -d --build backend nginx. Migrations run automatically on startup.mainis the stable channel;git checkout devfor betas of the next version. See release channels.
API access is usually enabled already. If not:
/ip service enable api # port 8728
/ip service enable api-ssl # port 8729, TLS
Devices on the SSL port are reached over TLS automatically — RouterOS's default self-signed certificates are accepted, so credentials are encrypted in transit with no manual trust step.
The layers described above, plus the surrounding machinery.
input-chain drop/reject that would lock you out, requiring explicit confirmationPOST /api/devices/:id/change-guard/probe reports what safety mechanisms a device actually supports, tested rather than assumed, and leaves nothing behindcommitted, reverted, or failedFor the full behaviour — what the API returns when contact is lost, how binary and script modes differ, and how to choose a timeout — see Change Guard and Config Health.
ntfy.sh, with severity mapped onto ntfy priority so outages break through do-not-disturb and recoveries stay quiet)wifi package and the legacy wlan packageA Meraki/UniFi-grade firewall experience on the full RouterOS feature set.
LAN, Trusted, Blocklist once and reference them anywhereEach network service supports multi-device management with conflict detection:
| Service | Capabilities |
|---|---|
| DHCP | IPv4 & IPv6 servers, address pools, static leases, live lease table |
| DNS | Upstream servers, static records (A/AAAA/CNAME/MX/NS/PTR/TXT/SRV), cache flush, DoH |
| NTP | Server (broadcast/manycast), client (unicast/multicast), sync status |
| WireGuard | Interface management, peer configuration, public keys, RX/TX stats |
| Logging | Syslog actions and routing rules, single-device or push-to-all with per-entry coverage |
| NetFlow | One-toggle Traffic Flow export per device, pointed at the built-in collector |
| Discovery & SNMP | Fleet-wide LLDP toggle and SNMP v1/v2c/v3, scoped to all devices, routers, or switches |
/export, deduplicated by content hash so only real changes are stored, with side-by-side line diffs, a change summary, and one-click rollback through the proven restore path| Tool | Description |
|---|---|
| Ping | ICMP reachability with RTT and loss |
| Traceroute | Hop-by-hop path trace |
| IP Scan | ARP sweep of a subnet to find live hosts |
| Wake-on-LAN | Magic packet sent from the MikroTik device |
| Packet Capture | RouterOS sniffer for 5–60s, downloaded as a .pcap for Wireshark (requires SSH) |
| Bandwidth Test | Throughput between two devices; the target's test server is enabled and disabled automatically |
/export text, not opaque blobs. Config snapshots and their restorable .rsc are one artifact: delete either and both go, so they never drift apart, and a bulk delete says how many snapshots it will take with it192.168.88.1/24 with no DHCP client and no route, so adding it used to mean Winbox and a MAC address. Adopt Device borrows a managed neighbour on the same broadcast domain, reaches the new device through it, and gives it an address on your network — static or DHCP, optionally on a tagged management VLAN. The platform decides from the device's own address and identity whether it is new or already in service, and re-checks properly after connecting so a wrong choice cannot rewrite a switch that is already carrying traffic. A chosen address is verified free by both ARP and ping, operations are additive so a failure leaves the device as reachable as it was, and the borrowed neighbour is returned untouched on every path. See the adoption guidemtm_… tokens with read or write scope and optional expiry, shown once and stored only as a SHA-256 hash. No token can perform admin actions or manage other tokensDeeper reference material lives at the documentation site, published per release so it matches the version you are running. The same pages are in docs/ if you would rather read them here.
| Document | Covers |
|---|---|
| Release notes (1.0) | What 1.0 includes, upgrading from a beta, release channels, known issues |
| Configuration | Environment variables, secret management, key rotation, TLS, release channels |
| Devices | The device list, device tabs, ports and VLANs, per-device tools |
| Clients | Where client data comes from, identification, history, per-port clients |
| Topology | How links are discovered, spanning-tree resolution, manual links |
| Traffic analytics | The NetFlow collector, top talkers, application breakdown, retention |
| Wireless | Radios and SSIDs, RF health, signal bands, rogue APs, guest WiFi |
| Network services | DHCP, DNS, NTP, WireGuard, logging, discovery and SNMP |
| Adopting devices | Adding configured devices, and configuring factory-default ones so they can be managed |
| Change Guard and Config Health |
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS |
| State / data | TanStack Query v5, React Router v6, Zustand |
| Charts / topology / maps | Recharts, @xyflow/react, Leaflet |
| Backend | Node.js, Express, TypeScript |
| Data stores | PostgreSQL 15, InfluxDB 2.7, Redis 7 + BullMQ |
| Real-time | Socket.IO |
| Device comms | RouterOS API (8728 / 8729), SSH2 |
| Proxy / container | nginx, Docker Compose |
Contributions are welcome. Please open an issue before submitting a pull request so we can discuss the approach — several recent features started as exactly that conversation.
git checkout -b feature/your-featureLicensed under the GNU Affero General Public License v3.0 — see LICENSE for the full text.
This license keeps improvements — including those deployed as a service — open and available.
This project was designed and built with the help of Claude by Anthropic. AI assistance was used throughout: architecture, backend services, frontend components, the CI/CD pipeline, security configuration and unit tests.
We believe in being transparent about how software is made. The code is reviewed and tested with AI assistance and maintained by the project authors.
Not affiliated with or endorsed by MikroTik. MikroTik and RouterOS are trademarks of SIA MikroTīkls. Use at your own risk, and always test configuration changes outside production first.
| How the safety system works, its settings, and what to expect when it fires |
| Sites | Grouping devices into sites, switching between them, and what each site scopes |
| Firmware rollouts | Waves, the upgrade pipeline, and what upgrading several at once costs |
| Backups | Finding, reading, comparing and deleting configuration backups |
| Alerting | Rules, channels, ntfy priority mapping, webhooks, maintenance windows |
| Single sign-on (OIDC) | Identity provider setup, group-to-role mapping, break-glass behaviour |
| CAPsMAN | How centrally provisioned APs are modelled, and current limits |
| API and automation | Scoped tokens, preflighting a change, driving the platform from scripts |
| Architecture | Data stores, polling model, and where the interesting logic lives |