eworm-de/routeros-scripts

a collection of scripts for MikroTik RouterOS

1,826
Stars
about 8 years
Age
0
Published reviews
0
Questions

Reliability breakdown

What drives the reliability score

Component scores measured daily from GitHub activity (2026-07-15).

Continuity30% of headline16

Activity on 2 of 90 tracked days in the last 90 and 0 of 30 in the last 30.

Closure30% of headline45

Merged 0 of 2 PRs opened and closed 0 of 1 issues opened over the last 90 tracked days — PR flow carries 55% of this component, issue flow 45%.

Shipping20% of headline0

0 releases in the last 180 days, 0 in the last 90 and 0 in the last 30 — a steady cadence scores highest.

Liveness10% of headline100

Last push 3 days ago — freshness decays as pushes age (roughly halves every 83 days without a push).

Support burden10% of headline91

Open-issue load isn't tracked for this repo yet.

Adoption confidence51

Modeled — how confidently teams are adopting this repo. Stargazers

Maintenance quality39

Modeled from PR/issue responsiveness and upkeep signals. Activity pulse

Risk score32

Modeled — lower is better; adoption and continuity risk. Repository

Stays active (30d)12%

Modeled chance the repo stays active over 30 days. Activity pulse

Stays active (90d)41%

Modeled chance the repo stays active over 90 days. Activity pulse

Release rhythm (180d)0

Regularity of releases over the last 180 days. Releases

Maintainer bus risk (90d)79%

Modeled — lower is better; concentration of commits in few maintainers. Contributors graph

Topics

Explore related topics

Jump into the topic listings this repository belongs to.

Project Overview

Routeros Scripts is a collection of production-grade scripts for MikroTik RouterOS maintained by eworm-de on GitHub. The project targets network engineers and home lab operators who run MikroTik hardware and want reliable, automated management without reaching for a full external automation stack.

RouterOS has a built-in scripting environment (RouterScript), but writing robust, reusable automation on top of it is repetitive and error-prone. eworm-de's library solves that by shipping well-tested scripts that cover the most common operational tasks: certificate rotation, firmware updates, CAPsMAN wireless management, backup uploads, and multi-channel notification delivery.

The project is actively maintained as of 2026, with 16.2% star growth over the last ~6 months — a signal that more MikroTik shops are standardizing on it as part of their operational toolkit.

Key Challenges Addressed

Certificate management is painful on RouterOS. Let's Encrypt renewal on a router isn't built in — you either write brittle shell integration or skip TLS on your admin interface entirely. The letsencrypt-certificate script handles ACME challenges and automatic renewal so your Winbox and API endpoints stay covered without a separate renewal server.

Firmware updates carry real rollback risk. RouterOS supports update commands, but nothing in the base system validates that an update completed cleanly before removing the previous version. The update-routeros script adds pre-update backups and post-update validation so a bad firmware doesn't leave you locked out.

Notification routing is fragmented. If you want your router to alert you about events, you're writing custom email or Telegram code in every individual script. eworm-de's notification abstraction layer lets you configure one delivery channel and reuse it across all scripts without duplication.

CAPsMAN management is repetitive. Managing wireless configurations across many access points means repeating the same provisioning commands constantly. The capsman-* scripts automate provisioning and configuration sync across your wireless fleet.

Getting Started

The project ships a bootstrap that handles fetching the base module and the global configuration overlay. From a RouterOS terminal:

/tool/fetch url="https://raw.githubusercontent.com/eworm-de/routeros-scripts/main/global-config-overlay" dst-path="global-config-overlay";
/import file-name="global-config-overlay";

After importing the overlay, you configure your site-specific values — email credentials, Telegram bot tokens, your preferred notification channels — in a local overlay file before importing any functional scripts.

Sharp edges:

  • If you skip configuring global-config-overlay before importing individual scripts, those scripts silently fall back to defaults and send notifications nowhere. Set your notification config first, then import functional scripts.

  • The scripts target specific RouterOS versions. Running them on an unsupported build triggers parse errors in the RouterOS scripting engine that give no useful message. Check the CHANGELOG for the minimum supported version before importing on older hardware.

  • Scripts fetch from raw GitHub URLs at import time. If your router lacks outbound HTTPS to GitHub — common in strict production environments — pre-download scripts to an internal HTTP server and adjust the fetch URLs before deployment.

Features and Use Cases

Automated Let's Encrypt certificates — The certificate scripts integrate with your DNS provider to complete ACME challenges directly on the router. If you expose RouterOS API or Winbox over the internet, this keeps your TLS chain valid on a schedule without a separate renewal host.

Firmware update automation — You can schedule RouterOS updates to run during maintenance windows, with automatic backup before update and notification on success or failure. Staged rollout lets you test on a lab device before touching production routers.

CAPsMAN wireless fleet management — If you run a wireless network with multiple MikroTik access points under a CAPsMAN controller, the provisioning scripts push consistent configurations to new CAPs automatically at registration time.

Backup upload orchestration — Scripts push router backups to SMB shares, SFTP targets, or cloud storage on a schedule. You get notified on failure so you know before you need the backup that it's missing.

Multi-channel notification — Configure Telegram, email, or Matrix as your notification target once in the global overlay. All other scripts use that configuration transparently. Switching from email to Telegram means changing one config value, not editing every script.

Netwatch extensions — The monitoring scripts extend RouterOS's built-in netwatch with richer alerting logic, including retry logic to suppress flap noise before triggering notifications.

Ecosystem and Dependencies

The scripts run entirely within RouterOS — no external agent, Python runtime, or control node required on the router itself. That's a meaningful operational advantage: there's nothing to break between your control plane and the scripts.

For notification delivery, you need at least one working outbound channel:

  • Email: a working SMTP relay reachable from the router
  • Telegram: a bot token and chat ID from @BotFather
  • Matrix: a homeserver and bot account

If you want to trigger scripts from CI or external orchestration, RouterOS's API lets you execute scheduled tasks remotely. The scripts themselves don't require this, but it's a natural pairing for infrastructure-as-code shops that already have a Python-based control plane.

Architectural Overview

The project's design centers on a shared global module that every functional script imports. This module provides:

  • Notification dispatch (abstracting email, Telegram, and Matrix behind a single $SendNotification function)
  • Logging to RouterOS's internal log with consistent prefix formatting
  • Version checking that detects incompatible RouterOS builds at import time, not at runtime failure

Functional scripts are standalone .rsc files that import the global module and do one specific job. You include only what you need — no monolithic import pulling in code you don't use.

Configuration lives in two layers:

  1. global-config — upstream defaults; don't edit this directly because it's overwritten on updates
  2. global-config-overlay — your site-specific values; this file survives updates

The overlay pattern means you can safely pull upstream updates without merging config changes. Your local values always win over the defaults. This is one of the cleaner configuration designs you'll find in the RouterOS script ecosystem.

Scripts are versioned individually. When eworm-de releases updates, you fetch and re-import only the scripts that changed rather than replacing everything at once.

Pros and Cons

Pros

  • No external dependencies — runs entirely within RouterOS with no sidecar agent or control node
  • Clean overlay config pattern that survives upstream updates without merge conflicts
  • Notification abstraction means you configure delivery once and reuse it across all scripts
  • Actively maintained with consistent version discipline and a structured changelog
  • Modular design — import only the scripts you need, nothing else

Cons

  • RouterOS Script is a niche language — debugging is harder than Python or Ansible because the scripting engine's error messages are minimal and often unhelpful
  • GitHub-fetch-at-import means air-gapped environments need a mirroring step before deployment
  • No automated test infrastructure — you can't write unit tests for RouterScript the way you can for Python-based automation
  • Tightly coupled to MikroTik hardware — none of this transfers to Cisco, Juniper, or other vendors

Comparison and Alternatives

Measured 90-day trends for this project and its alternatives.

GitHub stars

Weekly star gains

763374-14
Full metrics details

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

Routeros Scripts

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

170 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.

175 observed daily rows. Missing days are not fabricated.

DateValue

Issues opened

Weekly total

950
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

Routeros Scripts

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue

Issues closed

Weekly total

26130
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

Routeros Scripts

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

131 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

178 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests opened

Weekly total

35180
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

Routeros Scripts

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests closed

Weekly total

41210
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

Routeros Scripts

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

131 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

178 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

143 observed daily rows. Missing days are not fabricated.

DateValue

Pull requests merged

Weekly total

29150
Full metrics details

GitHub API observation. Historical values render only when the source provides a real observation for that day.

Routeros Scripts

GitHub API observation. Historical values render only when the source provides a real observation for that day.

131 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub API observation. Historical values render only when the source provides a real observation for that day.

178 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub API observation. Historical values render only when the source provides a real observation for that day.

143 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed pull request ratio

Weekly average

100500
Full metrics details

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

Routeros Scripts

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

170 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue

Open/closed issues ratio

Weekly average

100500
Full metrics details

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

Routeros Scripts

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

170 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

180 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.

175 observed daily rows. Missing days are not fabricated.

DateValue

Releases

Weekly total

530
Full metrics details

GitHub release published_at events bucketed by UTC day; drafts are excluded.

Routeros Scripts

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
NAPALM

GitHub release published_at events bucketed by UTC day; drafts are excluded.

170 observed daily rows. Missing days are not fabricated.

DateValue
Nornir

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
Netmiko

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
Ansible

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
Batfish

GitHub release published_at events bucketed by UTC day; drafts are excluded.

175 observed daily rows. Missing days are not fabricated.

DateValue

Hotness score

Weekly average

100500
Full metrics details

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

Routeros Scripts

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
NAPALM

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

170 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
Nornir

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
Netmiko

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
Ansible

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score
Batfish

Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.

175 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.

  • Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
  • Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
  • Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
  • Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
  • Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
  • Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Weekly average

100500
Full metrics details

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

Routeros Scripts

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
NAPALM

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

170 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
Nornir

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
Netmiko

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
Ansible

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

180 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score
Batfish

Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.

175 observed daily rows. Missing days are not fabricated.

Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.

  • Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
  • Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
  • Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
  • Support burden = 100 − 2 × open issues per 1,000 stars
  • Liveness = 100 × exp(−pushed days ago ÷ 120)

Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored score

If your fleet is mixed-vendor or you want a centralized external control plane, general-purpose network automation tools are the right layer. Here's how routeros-scripts compares to the main alternatives:

Project Repo Hotness (~6mo) PRs merged (~6mo) Star growth (~6mo)
routeros-scripts https://github.com/eworm-de/routeros-scripts 39.34 0 253
NAPALM https://github.com/napalm-automation/napalm metrics pending 0 10
Nornir https://github.com/nornir-automation/nornir metrics pending 0 11
Netmiko https://github.com/ktbyers/netmiko metrics pending 0 16
Ansible https://github.com/ansible/ansible 23.62 648 4065
Batfish https://github.com/batfish/batfish metrics pending 0 31

NAPALM is a Python library that abstracts vendor-specific APIs behind a unified interface. It supports RouterOS through community drivers, but the abstraction is lossy — you give up RouterOS-specific features to get vendor portability.

Nornir is a Python-native automation framework with thread-based parallelism. It's better suited to running tasks across many devices concurrently, but requires an external Python runtime and a control node that routeros-scripts deliberately avoids.

Netmiko wraps SSH connections to network devices in a Python library. If you need to push ad-hoc commands to RouterOS from a Python script on a jump host, Netmiko is the right tool. For scheduled on-device tasks, it's the wrong layer.

Ansible has MikroTik modules in its community.routeros collection. It's the right choice if your organization already runs Ansible and wants unified playbook management across vendors. Running Ansible infrastructure for a pure-MikroTik environment is usually more overhead than it returns.

Batfish takes a different approach entirely — it analyzes network configuration statically to validate correctness before deployment. It's not a management tool; it's a correctness verification tool you'd use alongside routeros-scripts, not instead of it.

The best overall alternative is Ansible. Its community.routeros collection gives you MikroTik support, and the ecosystem maturity, documentation quality, and community size are significantly higher than any other option here — especially if you're managing routers alongside Linux servers or cloud infrastructure.

Conclusion

If you run a MikroTik-only network and want on-device automation without an external control node, routeros-scripts is the most practical starting point available. Network engineers maintaining RouterOS fleets — especially those handling certificate rotation and CAPsMAN deployments — get immediate operational value from the existing script library without standing up any additional infrastructure.

Do not import functional scripts before configuring global-config-overlay: without notification credentials set, failure events produce no alerts and you will miss them silently. Start by running /import file-name="global-config-overlay" and confirming at least one notification channel fires correctly before importing anything else.

Join the conversation

Reviews · Questions · Posts

Share what you know about routeros-scripts — write a review from your real experience, ask an implementation question, or publish a post about how you use it.

Share your experience

Write or update your review

Explain what worked, what broke down, and what another team should know before adopting routeros-scripts.

Write your review now — it saves locally and publishes automatically after you sign in.

Rating
Positive attributes
Negative attributes

Project Q&A

Questions and answers

Browse implementation threads tied directly to eworm-de/routeros-scripts. Each question links through to the full answer page.

Q&A No threads yet

Be the first to ask how teams run routeros-scripts in production. Every question you post becomes a durable, searchable answer page other developers can find.

Ask the first question

Related posts

Posts tagged with the same topics

These posts come from the same topic surface as this repo, so readers can move from project evaluation into practical writeups and migration notes without leaving context.

Posts No topic-linked posts yet

Share how your team uses routeros-scripts — a migration note, an architecture writeup, or a comparison. Your post reaches everyone browsing these same topics.

Write the first post
Get a weekly email with the hottest new projects in the Backup & Archival and Backup world.
No Spam. Unsubscribe easily at any time.

Copyright 2018-2026 Awesome Open Source.  All rights reserved.