• v1.0.0 0c97a17eb3

    v1.0.0
    All checks were successful
    test / test (push) Successful in 5m12s
    release / release (push) Successful in 25s
    Stable

    Ghost released this 2026-09-18 14:02:01 +00:00 | 0 commits to master since this release

    First stable release. The configuration format and the /routeros/index.json schema are now covered by
    Semantic Versioning: breaking changes only arrive with a new major version.

    Fixed

    • Truncated downloads were stored and served as complete files. When upstream dropped a connection
      mid-transfer the body simply ended early — no error — and the short file was renamed into place.
      MikroTik's CDN cuts long-running connections, so on a slow link this hit most large files: main
      routeros-*.npk packages, CHR images, netinstall archives, WinBox, and the all_packages bundles. A
      truncated bundle failed to unpack on every sweep (bundle <ver>/<arch> failed: File is not a zip file),
      so that arch never completed and stayed hidden — e.g. arm/arm64 and their zerotier package
      missing from a version — while being re-downloaded every sweep. Downloads are now verified against
      Content-Length and resumed with HTTP Range for as long as each request adds bytes (giving up
      after 3 consecutive requests without progress); nothing incomplete is ever written to the mirror.
      404s (package not built for an arch) are still not retried.
    • refresh left the sync worker down after the next reboot. It sent SIGHUP with docker compose kill,
      and Docker marks a container as manually stopped on docker kill with any signal; the
      unless-stopped restart policy then skipped sync at the next daemon start — e.g. the automatic
      reboot after security updates — while web and goaccess came back. refresh now signals the worker
      from inside the container. If you used refresh on an earlier version, run sudo ./src/deploy.sh start
      once (or check status) after the next reboot.

    Added

    • Integrity pass — deploy.sh verify (python -m packagemini --verify). Compares every mirrored
      file's size with upstream's Content-Length; a mismatch removes the file and reopens its arch
      (.complete / .size / "download all" zip) so the next sweep re-fetches it. Files whose upstream
      length can't be determined are left alone. The worker runs the pass once automatically on first
      start per mirror root (.verified marker), so mirrors filled by earlier releases repair themselves
      on upgrade. Upgrade note: expect affected arches to disappear from the listings and
      index.json until they have been re-fetched — on a slow link that can take hours.

    Changed

    • Terminology: "rootless" → "non-root containers" throughout the docs, README badge, compose
      comments and deploy.sh status. The containers run as uid:gid 1000, but the Docker daemon runs as
      root with no user-namespace remapping, which is not what "rootless Docker" means. No behaviour change;
      DESIGN.md now states the actual boundary.
    • README: removed the "under active development — feature-incomplete until v1.0" notice.
    • Default branch renamed main → master. The CI trigger, deploy.sh's no-tags fallback and the
      docs follow. Installs that track the branch tip must switch once: sudo ./src/deploy.sh update master
      (installs on release tags — the default — are unaffected).
    Downloads