{"id":35824665,"url":"https://github.com/tikoci/mikropkl","last_synced_at":"2026-04-22T00:03:06.366Z","repository":{"id":283396154,"uuid":"942783764","full_name":"tikoci/mikropkl","owner":"tikoci","description":"`pkl` packaged UTM virtual machines, including RouterOS CHR","archived":false,"fork":false,"pushed_at":"2026-03-26T13:43:07.000Z","size":478,"stargazers_count":42,"open_issues_count":1,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-02T06:27:47.970Z","etag":null,"topics":["chr","mikrotik","pkl","pkl-lang","routeros","utm"],"latest_commit_sha":null,"homepage":"https://tikoci.github.io/chr-images.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tikoci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-03-04T17:05:54.000Z","updated_at":"2026-03-30T13:16:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"e6ad5a7f-33c6-4356-8142-f130acbf95e3","html_url":"https://github.com/tikoci/mikropkl","commit_stats":null,"previous_names":["tikoci/mikropkl"],"tags_count":55,"template":false,"template_full_name":null,"purl":"pkg:github/tikoci/mikropkl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikoci%2Fmikropkl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikoci%2Fmikropkl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikoci%2Fmikropkl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikoci%2Fmikropkl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tikoci","download_url":"https://codeload.github.com/tikoci/mikropkl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tikoci%2Fmikropkl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31876852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T07:36:03.521Z","status":"ssl_error","status_checked_at":"2026-04-16T07:35:53.576Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chr","mikrotik","pkl","pkl-lang","routeros","utm"],"created_at":"2026-01-07T19:14:07.375Z","updated_at":"2026-04-16T08:00:52.189Z","avatar_url":"https://github.com/tikoci.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# `mikropkl` — declarative RouterOS virtual machines with `pkl` \n\n\u003e _Describe a VM in [`pkl`](https://pkl-lang.org), run `make`, get a running RouterOS instance._\n\n`mikropkl` uses [pkl](https://pkl-lang.org) manifests to produce ready-to-run [MikroTik RouterOS CHR](https://help.mikrotik.com/docs/spaces/ROS/pages/18350234) virtual machine packages.  A few lines of pkl declare the architecture, backend, disk layout, and networking — everything else is computed.  Creating a new variant is a one-file `amends` away from an existing template; `make` handles the rest.\n\n\n\u003e [!TIP]\n\u003e\n\u003e #### \u003cmark\u003eNEW\u003c/mark\u003e [ CHR Image Download Picker](https://tikoci.github.io/chr-images.html) \n\u003e Pick a version, architecture, and type.  The page generates download links and setup instructions for both UTM and QEMU.  _Packages are always in [GitHub Releases](https://github.com/tikoci/mikropkl/releases) too._\n\n\nEach package is a `.utm` bundle — a folder that [UTM](https://mac.getutm.app) opens directly on macOS.  Inside the same bundle, `qemu.sh` + `qemu.cfg` let you run the VM under QEMU on macOS or Linux without UTM.  Pick what fits: GUI on Mac, headless on a server, CI in GitHub Actions. _The \"`.utm` bundle\" is really just a ZIP file, and on Linux, just a \u003cdel\u003efolder\u003c/del\u003e directory that ends in `.utm` when extracted._\n\n\u003e QEMU launch scripts were added in 7.22 to `mikropkl` builds.  Older releases do not have QEMU scripts, `qemu.sh` and `qemu.cfg`.  If one is needed, file an [GitHub issue](https://github.com/tikoci/mikropkl/issues) or [build locally](#build-locally) using `make`.\n\n\n## Getting Started\n\n\u003e [!NOTE]\n\u003e **Homebrew** is used to install both UTM and QEMU.  If you don't have it: [brew.sh](https://brew.sh).\n\n### macOS (UTM)\n\n```sh\nbrew install --cask utm\n```\n\nOpen a package from the [CHR Images](https://tikoci.github.io/chr-images.html) page — it provides both a **Download ZIP** button and an **Open in UTM** link that imports the VM directly.\n\n\u003e Alternatives: [UTM.dmg from GitHub](https://github.com/utmapp/UTM/releases/latest/download/UTM.dmg) (free, unsigned) or [Mac App Store](https://apps.apple.com/us/app/utm-virtual-machines/id1538878817?mt=12) (sandbox mode).  All editions run CHR identically.\n\nUTM supports two backends: **QEMU** (cross-architecture emulation, USB pass-through, wider networking) and **Apple Virtualization** (faster startup, native performance, macOS-only). _`*.apple.*` packages use EFI on X86, needed Apple's Virtualization.framework, but work under Linux and QEMU using EFI boot there too. `*.qemu.*` packages always use SeaBIOS and standard RouterOS image._\n\nDefault credentials: **admin** with an empty password.  All bundles default to **Shared** networking (NAT) with RouterOS on `192.168.64.0/24`.\n\n\u003e [!TIP]\n\u003e **New to UTM + RouterOS?**  The [UTM Guide](Files/UTM.md) covers networking modes, console access, multi-VM topologies, automation, and how UTM settings map to QEMU — oriented toward network admins who use RouterOS regularly.\n\n### macOS or Linux (QEMU)\n\n```sh\nbrew install qemu          # macOS\n# or: sudo apt-get install qemu-system-x86 qemu-utils   # Ubuntu/Debian x86_64\n```\n\nDownload a package from the [CHR Images](https://tikoci.github.io/chr-images.html) page, then:\n\n```sh\nunzip chr.x86_64.qemu.7.22.utm.zip\ncd chr.x86_64.qemu.7.22.utm\n./qemu.sh\n```\n\n`qemu.sh` auto-detects KVM, HVF, or TCG — no manual accelerator config needed.\n\n\u003e [!TIP]\n\u003e **Full QEMU details** — platform setup, networking (port forwarding, vmnet on macOS, bridge/tap on Linux), disk snapshots, multi-instance setups — are in the [QEMU Guide](Files/QEMU.md).\n\n## RouterOS CHR\n\nRouterOS documentation: [help.mikrotik.com](https://help.mikrotik.com/docs) · [Forum](https://forum.mikrotik.com)\n\n### CHR Licensing\n\nCHR packages ship unlicensed, running in **free** mode: all features enabled, 1 Mb/s upload cap per interface — permanently.  To activate a **trial** (up to 10 Gb/s, no feature restrictions, expires after 60 days for upgrades):\n\n```routeros\n/system/license/renew level=p10\n```\n\nThis requires a [mikrotik.com](https://www.mikrotik.com/client) account and internet access from the VM.  See MikroTik's [CHR licensing docs](https://help.mikrotik.com/docs/spaces/ROS/pages/18350234/Cloud+Hosted+Router+CHR#CloudHostedRouter%2CCHR-Freelicenses) for all tier details.\n\n\u003e `/ip/cloud` features (DDNS, BackToHome) require a paid perpetual license — they are not part of the free or trial tiers.\n\n### Extra Packages\n\nCHR images ship with a minimal package set.  MikroTik calls the optional ones \"extra packages\" — they're bundled inside the CHR image but disabled by default.  Enabling them follows the same pattern: check for updates (downloads the package index, requires internet), enable the package, and apply:\n\n```routeros\n/system/package { update/check-for-updates duration=10s; enable \u003cpackage-name\u003e; apply-changes }\n```\n\n\u003e [!IMPORTANT]\n\u003e The `check-for-updates` step downloads the package index from MikroTik and **requires internet access** from the VM.  With UTM Shared networking or QEMU user-mode networking (`./qemu.sh`), internet is available by default.  If you're using QEMU socket networking or an isolated bridge, you'll need to add a NATed interface first or install packages manually — see MikroTik's [package management docs](https://help.mikrotik.com/docs/spaces/ROS/pages/328129/Packages).\n\n**Common extra packages:**\n\n| Package | Enable command | Use case |\n|---|---|---|\n| `rose-storage` | `/system/package { update/check-for-updates duration=10s; enable rose-storage; apply-changes }` | BTRFS, RAID, SMB file sharing — requires ROSE variant with extra disks |\n| `container` | `/system/package { update/check-for-updates duration=10s; enable container; apply-changes }` | Run OCI containers inside RouterOS (see [tikoci/containers](https://github.com/tikoci?tab=repositories\u0026q=container)) |\n\nAfter enabling `container`, you also need to enable advanced device mode:\n\n```routeros\n/system/device-mode/update mode=advanced container=yes\n```\n\nRouterOS CHR machines needs be \"power cycled\" for `device-mode` changes, so either stopped or terminated - not `/system/shutdown`.  See MikroTik's [container docs](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) for the full walkthrough.\n\n### ROSE Variant\n\nThe `rose.*` packages add 4 × 10 GB blank qcow2 disks to a standard CHR image.  After enabling `rose-storage` (see above) and rebooting, format and optionally share the disks:\n\n```routeros\n:foreach d in=[/disk/find] do={/disk format $d file-system=btrfs without-paging }\n:foreach d in=[/disk/find] do={/disk set $d smb-sharing=yes smb-user=rose smb-password=rose }\n```\n\nBTRFS supports RAID 1 and RAID 10 across those four disks — test software RAID behaviour without touching real hardware.  See MikroTik's [ROSE docs](https://help.mikrotik.com/docs/x/HwCZEQ) for the full feature set.\n\n\u003e [!TIP]\n\u003e\n\u003e #### RouterOS employs a unique configuration language\n\u003e\n\u003e MikroTik RouterOS is built on the Linux kernel, but \"userland\" is neither GNU nor BSD — it's a proprietary system with a rich [scripting interface](https://help.mikrotik.com/docs/spaces/ROS/pages/47579229/Scripting).  **All router configuration is scripting** _(outside GUI tools like [WinBox](https://mikrotik.com/download))_.  There is no `/bin/sh` — the CLI is a REPL for the scripting language.\n\u003e\n\u003e Unlike a traditional shell, RouterOS has a full [type system](https://help.mikrotik.com/docs/spaces/ROS/pages/47579229/Scripting#Scripting-Datatypes): IP addresses and CIDR prefixes are first-class types, arrays can be multi-dimensional and contain functions, but there's no float — _`1.1` is an IP address (shorthand for `1.0.0.1` per early RFCs), not a decimal number._  RouterOS doesn't have anything like pkl's nifty [`DataSize`](https://pkl-lang.org/package-docs/pkl/0.26.0/base/DataSize.html) type, which does come up in networking.\n\u003e\n\u003e While unexplored here, RouterOS lends itself to pkl-generated configuration.  A pkl [Renderer](https://pkl-lang.org/main/current/language-reference/index.html#renderers) could output RouterOS scripts, or an [external resource reader](https://pkl-lang.org/main/current/language-reference/index.html#extending-resource-readers) could fetch data from RouterOS for use in `pkl` manifests.\n\n## Build locally\n\nBuilding from source lets you create CHR derivatives, test custom configurations, and run machines directly from the build directory.\n\n### Prerequisites\n\n**macOS:**\n```sh\nbrew install pkl qemu    # pkl + qemu-img (+ qemu-system-* for running)\n```\n\n**Ubuntu / Debian:**\n```sh\n# x86_64 host:\nsudo apt-get install make pkl git qemu-system-x86 qemu-system-arm qemu-efi-aarch64 qemu-utils\n# aarch64 host:\nsudo apt-get install make pkl git qemu-system-arm qemu-efi-aarch64 qemu-utils\n```\n\n\u003e `make` and `git` are typically pre-installed.  `qemu-img` (from `qemu-utils`) is only needed for ROSE variants (extra qcow2 disks).\n\n### Build\n\n```sh\ngit clone https://github.com/tikoci/mikropkl\ncd mikropkl\nmake                         # builds all machines (stable channel)\nmake CHR_VERSION=7.22        # pin a specific version\nmake CHR_VERSION=long-term   # use a release channel\n```\n\nOutput lands in `Machines/` — one `.utm` directory per manifest in `Manifests/`.\n\n### Run\n\n```sh\n# Interactive (foreground — serial console on stdio):\nmake qemu-run QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm\n\n# Headless (background — serial on Unix socket):\nmake qemu-start QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm\nmake qemu-stop  QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm\n\n# All machines at once (auto-assigned ports 9180, 9181, ...):\nmake qemu-start-all\nmake qemu-status       # PIDs, logs, sockets, CPU/memory\nmake qemu-stop-all\n```\n\nWebFig: `http://localhost:9180/` — REST API: `http://admin:@localhost:9180/rest/`\n\n### Rebuild\n\n```sh\nmake clean \u0026\u0026 make CHR_VERSION=7.22   # rebuild (reuses cached downloads)\nmake distclean \u0026\u0026 make                # full clean including download cache\n```\n\n\u003e Running `make` overwrites all machines in `Machines/`, including disk images.  Any RouterOS state from previous runs is lost.  See [QEMU.md — Disk Image Management](Files/QEMU.md#disk-image-management) for snapshot and overlay strategies.\n\n### UTM (macOS)\n\n```sh\nmake utm-install     # open all built .utm bundles in UTM\nmake utm-start       # start all VMs via AppleScript\nmake utm-stop        # stop all VMs\nmake utm-uninstall   # remove all from UTM\n```\n\n## Creating new machines\n\nEach file in `Manifests/` produces one machine in `Machines/`.  To create a new variant, copy an existing manifest and adjust:\n\n```sh\ncp Manifests/chr.x86_64.qemu.pkl Manifests/my-router.pkl\n# Edit my-router.pkl — change architecture, backend, disks, etc.\nmake\n# Output: Machines/my-router.7.22.utm/\n```\n\nManifests are short — typically 4–6 lines that `amend` a template:\n\n```pkl\namends \"../Templates/chr.utmzip.pkl\"\nimport \"../Pkl/CHR.pkl\"\nbackend = \"QEMU\"\narchitecture = \"aarch64\"\n```\n\nTo control the CHR version: `make CHR_VERSION=7.23beta2` or `make CHR_VERSION=long-term`.  MikroTik's `stable` channel is the default.\n\n\u003e **Tweaking** an existing configuration doesn't require deep `pkl` knowledge — just edit or copy a file in `Manifests/`.  The complexity lives in `Pkl/` and `Templates/`.  For new machine types beyond CHR, see the [pkl documentation](https://pkl-lang.org).\n\n\u003e [!TIP]\n\u003e\n\u003e #### Difference between _imported_ and _aliased_ machines in UTM\n\u003e\n\u003e The difference is the `utm://` will \"import\" the machine, and use its default store (i.e. `~/Library/Containers/UTM/Data`) along with other machines created from UTM's UI.  While downloading the `.utm` package \"manually\", the user controls where the machine lives on the file system.\n\u003e\n\u003e When a downloaded package is launched from Finder, UTM will create an \"alias\" in the UI when opened.\n\u003e This is indicated by a (subtle) small arrow in the lower right corner of the machine's icon in UTM.\n\u003e A machine **alias** can be removed in UTM using \"Remove\" on the machine, and only the _reference_ in UI is removed for an \"alias\" - **not** the machine nor disks.  \n\u003e\n\u003e But if `utm://` is used, a \"Remove\" in UTM will delete machine **and disks** -  since the machine is \"imported\" into UTM, it also manages the \"document\" stored, including deletion.\n\n## QEMU launch scripts\n\nEvery `.utm` bundle includes `qemu.sh` + `qemu.cfg` for running CHR directly under QEMU — no UTM required, works on macOS and Linux.  The script auto-detects the best accelerator (KVM, HVF, or TCG) and handles UEFI firmware, networking, and serial setup automatically.\n\nQuick start:\n\n```sh\ncd chr.x86_64.qemu.7.22.utm\n./qemu.sh                        # foreground — serial console on stdio\n./qemu.sh --background           # headless — serial on Unix socket\n./qemu.sh --port 8080            # custom host port for REST API / WebFig\n./qemu.sh --dry-run              # show the QEMU command without running it\n```\n\nThe `--port` flag (default `9180`) forwards to RouterOS HTTP port 80.  REST API: `http://admin:@localhost:9180/rest/`.  WebFig: `http://localhost:9180/`.\n\n\u003e [!TIP]\n\u003e **The full QEMU deployment guide is [Files/QEMU.md](Files/QEMU.md)** — covering platform setup, networking (port forwarding, vmnet on macOS, bridge/tap on Linux), disk snapshots, multi-instance setups, environment variables, and troubleshooting.\n\n### Makefile QEMU targets\n\nAfter [building locally](#build-locally), the Makefile wraps `qemu.sh` for managing machines from the project directory:\n\n```sh\nmake qemu-list                                                # machines + running state\nmake qemu-run   QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm   # foreground (interactive)\nmake qemu-start QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm   # background (headless)\nmake qemu-stop  QEMU_UTM=Machines/chr.x86_64.qemu.7.22.utm   # stop a background instance\nmake qemu-status                                               # debug info: PIDs, logs, sockets\nmake qemu-start-all                                            # start all (ports 9180, 9181, ...)\nmake qemu-stop-all                                             # stop all running machines\n```\n\n## UTM automation\n\nUTM offers several automation paths: the [`utm://` URL scheme](https://docs.getutm.app/advanced/remote-control/) for basic lifecycle (start, stop, pause), the [`utmctl` CLI](https://docs.getutm.app/scripting/scripting/#command-line-interface) bundled inside UTM.app, [AppleScript](https://docs.getutm.app/scripting/scripting/) for rich scripting, and [Shortcuts](https://docs.getutm.app/advanced/remote-control/) integration for login-item automation.  The Makefile wraps AppleScript with helpers like `make utm-start` and `make utm-stop`.\n\nFor the full walkthrough — including headless mode, pseudo-TTY serial, and auto-start at login — see [UTM Guide: Automation](Files/UTM.md#automation).\n\nRouterOS itself exposes the [REST API](https://help.mikrotik.com/docs/spaces/ROS/pages/47579162/REST+API), native TCP [API](https://help.mikrotik.com/docs/spaces/ROS/pages/47579160/API), SSH, and serial console.  See MikroTik's documentation for those.\n\n\n## Understanding the project's structure\n\n### Files and Folders\n\n#### `Makefile` - runs `pkl` and handles final package processing\n\nA classic Makefile is used to start `pkl`'s generation of virtual machine packages.  Since pkl-lang cannot deal with binary files, the Makefile also processes \"placeholder\" files, added by pkl code, to download disk and other files after `pkl` completes.  Running just `make` should build all packages, although it is recommended to run `make clean` before any fresh build.\n\n\u003e Running `make` multiple times is fine. However, it will rebuild all /Machines, and replace any disks.\n\u003e As the built machines are \"runnable\" from the build directory (`Machines`), any change will be lost on a `make`.\n\u003e `pkl` always produces files, even if unchanged, so `Makefile` mechanisms for partial rebuild are not\n\u003e supported.\n\n#### `./Pkl` - provides the basic framework needed by templates\n\n`utmzip.pkl` is the root module — it defines all output files for a `.utm` bundle, including `config.plist`, `qemu.cfg`, and `qemu.sh`.  `UTM.pkl` provides UTM-specific types (architectures, backends, network modes).  `QemuCfg.pkl` generates the QEMU launch scripts.\nAdditional \"application-specific\" modules, like `CHR.pkl`, know download locations, icons, and other details specific to that OS image.\nHelpers like deterministic MAC address generation live in `Randomish.pkl`.  \n\n#### `./Manifests` - defines the actual virtual machine images to be \"built\"\n\nEach \"manifest\" will result in a new \"machine\", on a one-to-one basis.  Typically, by `amends`ing a \"template\", which allows variants to reuse an existing template or even another manifest as the \"base\" to modify.\n\n#### `./Machines` - final output of images (_i.e._ \"dist\")\n\nThese are the ready-to-use packages produced.  GitHub Actions will make each a download item on a release.  Or, the machine can be added to UTM using `open ./Machine/\u003cmachine_name\u003e` if used locally.\n\n#### `./Templates` - provides `amends` \"wrapper\" around native types\n\nPkl code in `Templates` is \"glue\" between the .plist and a more \"amends friendly\" manifest.  The idea of a \"machine class\" is that it `extends` `./Pkl/utmzip.pkl`, adding OS/image specific details so that downstream manifests can use simple `amends` to a \"template\". For example, the `chr.utmzip.pkl` adds the downloading of a version-specific image, optional extra disks, and controlling colors in the SVG logo.\n\n#### `./Files` - non-Pkl files \u0026 media that may be needed in output (_i.e._ \"static files\")\n\nAny files that may need to be included in a UTM package, that are not downloadable.  Currently, just `efi_vars.fd` is needed for Apple-based virtual machines.\n\n#### `./Lab` - non-Pkl code uses for testing and experimentation \n\nUsed to store various scripts used to debug issues and try concepts, without effecting the core `pkl`-based scheme.  With one folder per experiment/mini-project.  The structure may vary, look for README.md or NOTES.md.  Any technical finding are summarized as documents in the root of `./Lab`.\n\n### `qemuOutput` and `libvirtOutput` controls\n\nBy default, QEMU scripts (`qemu.cfg` + `qemu.sh`) are generated for all machine backends — both QEMU and Apple.  Libvirt XML generation is experimental and disabled by default.  Control this with environment variables during `make`:\n\nIn `pkl` Templates, `libvirtOutput` and `qemuOutput` booleans control output of non-UTM formats.  `config.plist` for UTM is always generated.\n\n```sh\n# Disable QEMU scripts (just UTM bundles)\nQEMU_OUTPUT=false make CHR_VERSION=7.22\n\n# Enable experimental libvirt XML alongside QEMU scripts\nLIBVIRT_OUTPUT=true make CHR_VERSION=7.22\n```\n\n### Agentic Files\n\nBoth [AGENTS.md](https://github.com/tikoci/mikropkl/blob/main/AGENTS.md) and [CLAUDE.md](https://github.com/tikoci/mikropkl/blob/main/CLAUDE.md) are present.  The instruction system targets Claude Sonnet 4.6, via either CoPilot or Claude Code.  Other agents/models likely work, but not been tried (and likely require some steer to use CLAUDE.md for orientation).  Also not tired, but strongly recommended against using \"mini\" models with this project (e.g. less training data for **both** `pkl` and RouterOS).\n\n\n\u003e #### Disclaimers\n\u003e\n\u003e **Not affiliated, associated, authorized, endorsed by, or in any way officially connected with MikroTik, Apple, nor UTM from Turing Software, LLC.**\n\u003e While the code in this project is released to public domain (see LICENSE),  CHR image contains software subject to MikroTik's Terms and Conditions, see [MIKROTIKLS MIKROTIK SOFTWARE END-USER LICENCE AGREEMENT](https://mikrotik.com/downloadterms.html).\n\u003e **Any trademarks and/or copyrights remain the property of their respective holders** unless specifically noted otherwise.\n\u003e Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.\n\u003e MikroTik is a trademark of Mikrotikls SIA.\n\u003e Apple and macOS are trademarks of Apple Inc., registered in the U.S. and other countries and regions. UNIX is a registered trademark of The Open Group.\n\u003e **No liability can be accepted.** No representation or warranty of any kind, express or implied, regarding the accuracy, adequacy, validity, reliability, availability, or completeness of any information is offered.  Use the concepts, code, examples, and other content at your own risk. There may be errors and inaccuracies, that may of course be damaging to your system. Although this is highly unlikely, you should proceed with caution. The author(s) do not accept any responsibility for any damage incurred.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftikoci%2Fmikropkl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftikoci%2Fmikropkl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftikoci%2Fmikropkl/lists"}