[
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-x86_64",
        "name": "npanel-0.6.2-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "5ae82fa89feb4e7b0751a2ff4c22265c8b17b28be8ca1334f1bb89504c030e73",
        "size": 36166624
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-aarch64",
        "name": "npanel-0.6.2-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "49ab48484cd4ddfdbf5a45b5018809df367441daf864aa16a86ec280faff9d03",
        "size": 32890288
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-x86_64.deb",
        "name": "npanel-0.6.2-linux-x86_64.deb",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "09b030333c44a3fc35771bf99c280c5166af57d67febf9909f0c0117c66ea131",
        "size": 16335430
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-aarch64.deb",
        "name": "npanel-0.6.2-linux-aarch64.deb",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "e9632119afaf8c651f4b214336559af39437cb681f916e72500f3714819999b8",
        "size": 15821564
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-x86_64.rpm",
        "name": "npanel-0.6.2-linux-x86_64.rpm",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "33791858e25e571f7d96be1701d18d0c4976f669b90ce00d15986f303ef1b517",
        "size": 16248667
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.2/npanel-0.6.2-linux-aarch64.rpm",
        "name": "npanel-0.6.2-linux-aarch64.rpm",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "ad3c461df7e0067f2ea0a40c53ee248f8fbbbcbabf2a72c479e6ce48363f7325",
        "size": 15682276
      }
    ],
    "channel": "stable",
    "notes": "- Onion addresses stay reachable. Arti, the Tor built into npanel, now comes\n  from Soapbox's fork with two fixes. Choosing a relay compared every member\n  of the network's large relay families in constant time, ~0.4 s of CPU per\n  relay picked; with a dozen sites that kept Tor's threads busy until its\n  connections and circuits timed out, and the onions were unreachable most of\n  the time. And each descriptor upload now waits at least 120 seconds: Arti\n  gave up on slow directory relays after 30 and never published to them, so\n  sites whose descriptors belonged on several of those stayed unreachable.",
    "prerelease": false,
    "published_at": "2026-10-13T16:10:06Z",
    "version": "0.6.2"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-x86_64",
        "name": "npanel-0.6.1-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "720b9bf734a1a556c2983007c21f71defe8b23d87557987753d30ab3c68e43cb",
        "size": 36171744
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-aarch64",
        "name": "npanel-0.6.1-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "821ee389de33080053fc61780a9dcbe5ccf333545223ae782dfdb78f7ecb8c04",
        "size": 32882872
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-x86_64.deb",
        "name": "npanel-0.6.1-linux-x86_64.deb",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "0f00233cd62e5f01a1c229a593260adcaadd8cd8917abd05368ba126201a4cfd",
        "size": 16346738
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-aarch64.deb",
        "name": "npanel-0.6.1-linux-aarch64.deb",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "193e1d4fa41d729a5103ab57e0865979133e7d70c13b8ede1ad3c6506f144c9d",
        "size": 15802948
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-x86_64.rpm",
        "name": "npanel-0.6.1-linux-x86_64.rpm",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "2532d47137b61b2be99f51d419bde3cc918210d843245d24b84b2ab5d13d9ac4",
        "size": 16260284
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.1/npanel-0.6.1-linux-aarch64.rpm",
        "name": "npanel-0.6.1-linux-aarch64.rpm",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "2e6c8dcafd72e0775d28ba80a9e61f4243609d10a1f34a1cb1af7311559317e8",
        "size": 15661955
      }
    ],
    "channel": "stable",
    "notes": "- A preview script can name the page's canonical URL with `canonical`, for\n  sites where several paths show one thing — `/npub1…`, `/nprofile1…` and\n  `/name@domain` for one profile. It's written as `<link rel=\"canonical\">`\n  and `og:url`, and must be on the same site.\n- Links in a preview's article to the site's own pages are no longer\n  `nofollow`, so a crawler can follow them to the rest of the site. Links\n  elsewhere still are.",
    "prerelease": false,
    "published_at": "2026-10-11T06:48:48Z",
    "version": "0.6.1"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-x86_64",
        "name": "npanel-0.6.0-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "1c02be8d26b1e3ef150ef1e1b993b1da9fb991b0446c00c7ff89813a4513dcad",
        "size": 36160272
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-aarch64",
        "name": "npanel-0.6.0-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "912cfac92cdba452fc4fa484845fa9963305cea3e1a59cb39ed72a6124bcf7d9",
        "size": 32877680
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-x86_64.deb",
        "name": "npanel-0.6.0-linux-x86_64.deb",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "5f0e4cf8f35d315965cbcc23988a52610ba56ab72a7ecc9dddca4946ccff7210",
        "size": 16332492
      },
      {
        "content_type": "application/vnd.debian.binary-package",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-aarch64.deb",
        "name": "npanel-0.6.0-linux-aarch64.deb",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "db0918477dab7246489ea019d528d1c61503ef8063560f3c5b086712409a5f06",
        "size": 15802530
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-x86_64.rpm",
        "name": "npanel-0.6.0-linux-x86_64.rpm",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "efec2a7ce80d43d3ad3a5b916dfb8814a17d009c2910d540dba173db528a64c6",
        "size": 16244035
      },
      {
        "content_type": "application/x-rpm",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.6.0/npanel-0.6.0-linux-aarch64.rpm",
        "name": "npanel-0.6.0-linux-aarch64.rpm",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "38e8fb5f63c683709d42a7a1020cbb89cbac4a6030a668261c56a8dcb714d7a2",
        "size": 15660998
      }
    ],
    "channel": "stable",
    "notes": "- **Breaking:** npanel reads its configuration from a TOML file instead of\n  `.env` and the environment. It uses the file `--config` names, or else\n  `~/.config/npanel/npanel.toml` or `/etc/npanel/npanel.toml`, and refuses to\n  start with none. The settings are the same seven, named in lowercase:\n  `DASHBOARD_HOST=\"panel.example.com\"` becomes\n  `dashboard_host = \"panel.example.com\"`, and ports are numbers. A key npanel\n  doesn't know is refused. `npanel.example.toml` replaces `.env.example`, and\n  \"From `.env` to `npanel.toml`\" in docs/deployment.md says how to move an\n  install across. The sample unit names the file with `--config` and no\n  longer sets a working directory, so `sudo -u npanel npanel make-admin`\n  works from anywhere.\n- **Breaking:** with no `data_dir`, data goes in `/var/lib/npanel` as root\n  and `~/.local/share/npanel` otherwise, rather than `./data`. A relative\n  `data_dir` is relative to the config file.\n- On Docker, `compose.yaml` writes npanel's config file, from `DASHBOARD_HOST`\n  and `LOG_LEVEL` in compose's `.env` as before; the image sets no environment\n  variables, and the health check moved from the image to `compose.yaml`.\n- Each release publishes `.deb` and `.rpm` packages for x86_64 and aarch64,\n  which install the binary, the systemd unit and `/etc/npanel/npanel.toml`,\n  and create the `npanel` user and `/var/lib/npanel`. `SHA256SUMS` and the\n  sample unit are no longer published as assets: the release's asset events\n  carry each file's SHA-256, and the unit is `contrib/npanel.service`.\n- `npanel --help` and `npanel --version`, and help for each command.\n- Tor's warnings about onion services are debug lines: each was one failure\n  Tor retries on its own, and a gateway with a dozen sites logged hundreds an\n  hour while every one stayed reachable. In their place, npanel warns with\n  `tor_onion_unreachable` when a site's onion has been unreachable for ten\n  minutes, saying why, and logs `tor_onion_reachable` when it is back.\n- The Docker image runs the same static binary a release publishes, built by\n  the same script, `contrib/release/build.sh`, with the dashboard compiled in.\n  That script, with `contrib/release/tools.sh` for its pinned tools, is how to\n  build npanel for a server by hand too.",
    "prerelease": false,
    "published_at": "2026-10-08T22:09:04Z",
    "version": "0.6.0"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.5.0/npanel-0.5.0-linux-x86_64",
        "name": "npanel-0.5.0-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "533b4c954a92b150adc78c302ef05656da2068cac29f1b19cba65b85a43cb74d",
        "size": 35658544
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.5.0/npanel-0.5.0-linux-aarch64",
        "name": "npanel-0.5.0-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "de95dc237c395399577243374f972645381c9ee54bbe772cc37e9782138a5d2c",
        "size": 32475472
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.5.0/SHA256SUMS",
        "name": "SHA256SUMS",
        "platforms": [],
        "sha256": "bea4d43c130a4c26287aab87375115c8cd6296cf61855e26cd37d89424c44b4a",
        "size": 185
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.5.0/npanel.service",
        "name": "npanel.service",
        "platforms": [],
        "sha256": "1495a314dbb2cbc06de8aa326e6de4dc998cddb72a17fb6a8ed20c93c1d4f80d",
        "size": 831
      }
    ],
    "channel": "stable",
    "notes": "- Analytics can be counted on the server instead of by a script. Turn off\n  **Tracking script** under a site's Analytics switch, and its pages go out as\n  published, with nothing added: npanel counts each page a browser opens as it\n  serves it, under the same cookieless, daily-salted visitor hash. Visits,\n  sources, locations and devices are counted as before; moves within a\n  single-page app, time on page and scroll depth can't be, and only requests a\n  browser marks as opening a page (`Sec-Fetch-Mode: navigate`,\n  `Sec-Fetch-Dest: document`, not a prefetch) count. Each site is counted one\n  way or the other, never both.",
    "prerelease": false,
    "published_at": "2026-10-07T23:21:03Z",
    "version": "0.5.0"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.4.2/npanel-0.4.2-linux-x86_64",
        "name": "npanel-0.4.2-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "5dc5f9c92b7895166d32e611516678007845f77c991b50e981773c470b14dfc4",
        "size": 35642864
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.4.2/npanel-0.4.2-linux-aarch64",
        "name": "npanel-0.4.2-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "8bde847e3d1eeb6b9d2073ffb2da68189f8c7c7aa5523f1b2b617d694f68e4bd",
        "size": 32460496
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.4.2/SHA256SUMS",
        "name": "SHA256SUMS",
        "platforms": [],
        "sha256": "78237f23f1a5df35742de0cbd83cecb53c5c178f0ecbd47a79d04031d8859ec2",
        "size": 185
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.4.2/npanel.service",
        "name": "npanel.service",
        "platforms": [],
        "sha256": "1495a314dbb2cbc06de8aa326e6de4dc998cddb72a17fb6a8ed20c93c1d4f80d",
        "size": 831
      }
    ],
    "channel": "stable",
    "notes": "- Files of 64 KiB and up are sent with `sendfile(2)` on Linux, straight from\n  the page cache to the socket, when npanel serves plain HTTP behind a proxy:\n  30–55% more requests a second for files of 128 KiB and up. The socket is\n  corked while a file goes out, as nginx's `tcp_nopush` does, so the head and\n  the file share whole segments. Smaller files, and connections over TLS or\n  Tor, are sent as before.\n- npanel raises its soft limit on open files to the hard limit at startup,\n  since large files being served are now kept open.",
    "prerelease": false,
    "published_at": "2026-10-07T22:20:46Z",
    "version": "0.4.2"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.1/npanel-0.3.1-linux-x86_64",
        "name": "npanel-0.3.1-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "fc9977090ccb29615a49de076bc77a0836db25428f4772b9e67996fdb31a21e6",
        "size": 34877456
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.1/npanel-0.3.1-linux-aarch64",
        "name": "npanel-0.3.1-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "5273dd2cbf6a830b90813cc73721703871abb863cb3741f78bcc0931767249fd",
        "size": 31783672
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.1/SHA256SUMS",
        "name": "SHA256SUMS",
        "platforms": [],
        "sha256": "39462f8648a93e3b8f5dc5c1b3a24f8f881545b5aa82edcb57b18dda0ddf7bb9",
        "size": 185
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.1/npanel.service",
        "name": "npanel.service",
        "platforms": [],
        "sha256": "1495a314dbb2cbc06de8aa326e6de4dc998cddb72a17fb6a8ed20c93c1d4f80d",
        "size": 831
      }
    ],
    "channel": "stable",
    "notes": "- A preview script can change a `URL`: its `href`, `pathname`, `search` and\n  the rest set as they do in a browser, and `url.searchParams.set`, `append`,\n  `delete` and `sort` change the URL they came from. Both threw before.\n  `URLSearchParams` also writes a space as `+` and reads a stray `%` as it is,\n  as a browser does.",
    "prerelease": false,
    "published_at": "2026-10-06T02:12:25Z",
    "version": "0.3.1"
  },
  {
    "assets": [
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.0/npanel-0.3.0-linux-x86_64",
        "name": "npanel-0.3.0-linux-x86_64",
        "platforms": [
          "linux-x86_64"
        ],
        "sha256": "7d92caffe9b2cd7c439f022a122dbcbf4c208630d8925bc46686cc0e544ed208",
        "size": 34868752
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.0/npanel-0.3.0-linux-aarch64",
        "name": "npanel-0.3.0-linux-aarch64",
        "platforms": [
          "linux-aarch64"
        ],
        "sha256": "43ec90143cf1bad64ced3bb20a00f4fb60c88b4f914045d3987dbfb92eb68cf4",
        "size": 31770168
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.0/SHA256SUMS",
        "name": "SHA256SUMS",
        "platforms": [],
        "sha256": "c2fa9ac3e0c130d8d55582d16edc034b734b289b618514ba91060b86b53a536e",
        "size": 185
      },
      {
        "content_type": "application/octet-stream",
        "download_url": "https://pkg.soapbox.pub/releases/soapbox.pub/npanel/download/0.3.0/npanel.service",
        "name": "npanel.service",
        "platforms": [],
        "sha256": "1495a314dbb2cbc06de8aa326e6de4dc998cddb72a17fb6a8ed20c93c1d4f80d",
        "size": 831
      }
    ],
    "channel": "stable",
    "notes": "- Link previews drawn by the site. A site whose pages a crawler can't read by\n  itself — a Nostr client showing `/npub1…` or `/nevent1…` from relays in the\n  browser, say — publishes one self-contained script at\n  `/.well-known/npanel/preview.js` and turns on **Link previews from the site's\n  script**. The script lists the pages it previews as URLPattern `routes`, or\n  previews every page. Crawlers then get whatever it makes of a page: its\n  title, description and image as Open Graph, Twitter and schema.org tags, and\n  an article a search engine can index. Everyone else gets the page as\n  published. This replaces routing crawlers to a separate server from the\n  proxy.\n- The script is handed the crawler's request and a read-only Nostr relay,\n  shaped like Nostrify's, and can draw its image on an `OffscreenCanvas`, which\n  npanel serves at `/_npanel/preview/…`. The page never waits for its image.\n  Each run is metered and given a deadline, in a process of its own that on\n  Linux can't open a file, make a socket or start a program (Landlock and\n  seccomp), and that is killed if it overruns: a preview that can't be had\n  within a couple of seconds sends the page as published, never an error. A\n  script runs only on a site with link previews on, deploy checks included. A deploy's log says whether the script\n  loads. See \"Link previews\" in `docs/architecture.md`.\n- Previews draw text in the fonts installed on the system, emoji included. The\n  Docker image comes with DejaVu and Noto Color Emoji; a systemd install\n  should `apt install fonts-dejavu-core fonts-noto-color-emoji`.\n  `docs/deployment.md` says how to add others.\n- Previews and their images are cached in `DATA_DIR/previews.sqlite3` and\n  `DATA_DIR/preview-images/`, scripts' queries are batched into one\n  subscription per relay, and runs are capped per minute.\n- **Settings → Link Previews** shows what is cached and how lookups have gone,\n  runs one page's script again from its URL, clears the cache, and sets which\n  User-Agents count as crawlers.\n- A single-page app now gets its shell for a path like `/@bob@example.com`,\n  which was a `404` because `.com` read as a file extension.\n\n- npanel can serve HTTPS itself, no proxy needed. Set `HTTPS_PORT=443` and\n  `PORT=80`, and it gets a certificate from Let's Encrypt for the dashboard and\n  every site it serves, `www` redirects included, the moment each is added, and\n  renews them on its own. Plain HTTP answers challenges and redirects to HTTPS.\n  The Caddy setup is unchanged and still the default.\n- With it, HTTP/2, certificates and the ACME account kept in the database, a\n  backoff per name that keeps a misconfigured domain inside Let's Encrypt's\n  limits across restarts, and **Settings → Certificates** for the CA (with a\n  switch for Let's Encrypt's staging CA), a contact email, and every name that\n  is failing and why. Each site's page shows its certificates.\n- `/api/status` has a `tls` field and each host a `certificates` field, both\n  `null` behind a proxy.\n\n- Files under `/.well-known/` are served with the content type their spec\n  requires, so `apple-app-site-association` is JSON and Universal Links work.\n  WebFinger, `host-meta`, NodeInfo, Matrix, OpenID/OAuth discovery, `lnurlp`\n  and others are covered too. A `/.well-known/` path the site has no file for\n  is now a plain `404`, never its `404.html` or SPA shell.\n\n- npanel cleans up after itself. Once a day it keeps the newest 20 ready\n  versions of each site, forgets the versions of sites no host points at, and\n  deletes every stored file nothing uses. **Settings → Deploys → Versions kept\n  per site** sets how many; 0 keeps them all. It is safe beside deploys in\n  progress, so there is no `prune-blobs` timer to set up.\n- `prune-blobs` now runs that same prune on demand. It applies the setting\n  unless given `--keep N`, and `N` counts ready versions only: failed and\n  superseded ones no longer take up places meant for versions you can roll\n  back to.\n- The dashboard shows each version's size and what a site stores, and\n  **Settings** shows what is waiting to be cleaned up and what the last cleanup\n  freed. Disk used now counts compressed copies too.\n\n- Tor is built in. npanel runs Arti, the Tor Project's Rust implementation of\n  Tor, on a thread of its own, so onion addresses need no Tor daemon, no control\n  port and no `tor` container. Turning on **Settings → Tor** is the whole setup.\n  Every site keeps the onion address it had.\n- The `tor_control_url` and `tor_control_password` settings are gone. On Docker,\n  `docker compose up -d --remove-orphans` takes down the old `tor` container,\n  and the `npanel_tor-data` volume can be deleted. Tor's state now lives in\n  `DATA_DIR/tor`.\n- An onion only answers for its own address. A request arriving at one site's\n  onion whose `Host` header names another site's onion now gets a 404 rather\n  than that site.\n- `/api/status` reports `tor.progress` while npanel joins the Tor network.\n- The gateway's default Content Security Policy now allows WebAssembly\n  (`'wasm-unsafe-eval'`), fonts from `blob:` and `data:`, and media from `blob:`\n  and `data:`, as Isolated Web Apps' policy does. Sites that declare their own\n  policy are unaffected.\n- Building from source uses the Rust named in `rust-toolchain.toml`, which\n  rustup installs on its own. Production builds use `--profile dist`; plain\n  `--release` now rebuilds in seconds rather than minutes.\n- The release binary is stripped and built with full LTO: 29 MB, down from 42.\n- Releases include a static `aarch64` Linux binary as well as the `x86_64` one,\n  and a `SHA256SUMS` for both.\n- The dashboard loads in a fraction of the bytes. npanel serves its files\n  brotli- or gzip-compressed itself, with `ETag`s so a reload revalidates\n  rather than downloads, and each page is its own chunk: opening the site list\n  fetches 900 KB of scripts and styles, 235 KB with brotli, where the whole\n  1.75 MB bundle used to come first, uncompressed unless a proxy did it.",
    "prerelease": false,
    "published_at": "2026-10-06T01:15:13Z",
    "version": "0.3.0"
  }
]
