{"id":50455847,"url":"https://github.com/rdrkr/openwrt-printing","last_synced_at":"2026-06-01T02:30:44.284Z","repository":{"id":351373657,"uuid":"1210724709","full_name":"rdrkr/openwrt-printing","owner":"rdrkr","description":"AirPrint for GL.iNet Flint 3","archived":false,"fork":false,"pushed_at":"2026-04-14T17:55:36.000Z","size":21,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-14T19:28:31.916Z","etag":null,"topics":["cups","openwrt"],"latest_commit_sha":null,"homepage":"https://github.com/rdrkr/openwrt-printing","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rdrkr.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":null,"dco":null,"cla":null}},"created_at":"2026-04-14T17:38:16.000Z","updated_at":"2026-04-14T18:00:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rdrkr/openwrt-printing","commit_stats":null,"previous_names":["rdrkr/openwrt-printing"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/rdrkr/openwrt-printing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rdrkr%2Fopenwrt-printing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rdrkr%2Fopenwrt-printing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rdrkr%2Fopenwrt-printing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rdrkr%2Fopenwrt-printing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rdrkr","download_url":"https://codeload.github.com/rdrkr/openwrt-printing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rdrkr%2Fopenwrt-printing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33757790,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["cups","openwrt"],"created_at":"2026-06-01T02:30:43.271Z","updated_at":"2026-06-01T02:30:44.278Z","avatar_url":"https://github.com/rdrkr.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- Copyright (c) 2026 Ronen Druker. --\u003e\n\n\u003c!-- markdownlint-disable-next-line MD041 MD033 --\u003e\n\u003ch1 align=\"center\"\u003eAirPrint for GL.iNet Flint 3 (GL-BE9300)\u003c/h1\u003e\n\n\u003c!-- markdownlint-disable-next-line MD033 --\u003e\n\u003cdiv align=\"center\"\u003e\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![OpenWrt 23.05](https://img.shields.io/badge/openwrt-23.05-00b5e2)](https://openwrt.org/releases/23.05/start)\n[![Target: aarch64](https://img.shields.io/badge/target-aarch64__cortex--a53-F37626)](https://openwrt.org/docs/techref/targets/ipq807x)\n[![Toolchain: GCC 12.3](https://img.shields.io/badge/toolchain-gcc%2012.3.0%20%2B%20musl%201.2.4-7952B3)](https://openwrt.org/docs/guide-developer/toolchain/start)\n[![Platform: Docker](https://img.shields.io/badge/platform-docker-2496ED)](https://www.docker.com/)\n\n**Cross-compile CUPS + cups-filters + Poppler/Ghostscript for a GL.iNet Flint 3 router,\nturning a USB-connected printer into an AirPrint-discoverable network printer for iOS and macOS.\nShips a reference **foo2zjs** driver validated end-to-end against an HP LaserJet 1022 — swap it\nfor any other CUPS driver (`hplip`, `splix`, `gutenprint`, …) to target a different printer.**\n\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable-next-line MD013 --\u003e\n[Pipeline](#-print-pipeline) • [Quick Start](#-quick-start) • [Build](#-build) • [Install](#-install-on-router) • [Configure](#-configure) • [Troubleshooting](#-troubleshooting)\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c/div\u003e\n\n---\n\n## ✨ What This Is\n\nOpenWrt's official feeds don't ship CUPS, cups-filters, Ghostscript, Poppler, or foo2zjs for the\n`aarch64_cortex-a53` target used by the Flint 3. This project provides a reproducible Docker-based\ncross-compile pipeline that produces installable `.ipk` packages plus a foo2zjs tarball, then installs\nand configures them on the router for AirPrint.\n\nThe target router is a **GL.iNet GL-BE9300 (Flint 3)** running GL.iNet firmware v4.8.4 (OpenWrt 23.05-SNAPSHOT,\nQSDK v12.5) on a Qualcomm IPQ5332 (4× Cortex-A53, 1 GB RAM).\n\n### Printer-agnostic by design\n\nEverything in the print pipeline except the final driver is printer-agnostic — CUPS, cups-filters\n(including the project's `pdftops` shim), Ghostscript, Poppler, Avahi, and the AirPrint advertisement\nscripts work unchanged for any USB printer that has a CUPS PPD. The reference build has been validated\nend-to-end on an **HP LaserJet 1022** (ZjStream protocol) using the **foo2zjs** driver, but foo2zjs is\nthe only printer-family-specific component. To target a different printer:\n\n- **HP PCL/PostScript**: install `hplip` from the upstream printing feed and use its PPD.\n- **Samsung / Xerox Phaser (QPDL)**: use **splix** instead of foo2zjs.\n- **Canon / Epson / Brother inkjet**: use **gutenprint** (the feed ships it).\n- **Any PostScript-native printer**: no driver needed — ship its PPD directly.\n\nThe only files you need to change are `scripts/build-foo2zjs.sh` (swap the driver source) and\n`scripts/install-foo2zjs.sh` (swap the tarball payload); `configure-cups.sh` and\n`configure-airprint.sh` are printer-agnostic apart from the Avahi TXT-record strings, which are\nsourced from environment variables (`PRINTER_NAME`, `PRINTER_MODEL`, etc.).\n\n---\n\n## 🖨️ Print Pipeline\n\n\u003c!-- prettier-ignore --\u003e\n```markdown\niOS / macOS device\n  → AirPrint (IPP + mDNS discovery via Avahi)\n    → CUPS (print server, port 631)\n      → pdftops shim (PDF → PostScript via Ghostscript) ──┐  printer-agnostic\n      → cups-filters (PostScript / raster conversion)     │\n        → foomatic-rip (PPD-driven filter chain)        ──┘\n          → printer driver (foo2zjs / hplip / splix / …)  ← printer-specific\n            → USB backend (/dev/usb/lp0 or usb:// URI)\n              → physical printer (e.g. HP LaserJet 1022)\n```\n\nPoppler is the primary PDF backend (\"Plan A\"). Ghostscript is attempted but treated as optional —\nits aarch64 cross-compile is historically fragile, and cups-filters works with Poppler alone.\nBecause cups-filters 1.0.37 does not build its own `pdftops` against Poppler 23.x on this target,\n`configure-cups.sh` installs a small Ghostscript-based `pdftops` shim — see\n[Troubleshooting](#-troubleshooting) for the full diagnosis.\n\n---\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- **Docker** — works with Docker Desktop, Colima, or any Docker daemon.\n- **An x86_64 Linux host** is _strongly_ recommended. The OpenWrt SDK ships only x86_64 binaries;\n  on Apple Silicon they run under Rosetta, and shell-heavy host-tool builds (especially\n  `gettext`/`gnulib-tool`) become the bottleneck — expect hours instead of minutes.\n- **SSH key access to the router** — `ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.8.1`.\n\n### Router Specs\n\n| Detail          | Value                                              |\n| --------------- | -------------------------------------------------- |\n| Model           | GL.iNet GL-BE9300 (Flint 3)                        |\n| SoC             | Qualcomm IPQ5332                                   |\n| Architecture    | `aarch64_cortex-a53_neon-vfpv4` (runtime)          |\n| CPU / RAM       | 4× Cortex-A53 / 1 GB                               |\n| Firmware        | GL.iNet v4.8.4 (OpenWrt 23.05-SNAPSHOT, QSDK 12.5) |\n| Toolchain match | GCC 12.3.0, musl 1.2.4                             |\n\n---\n\n## 🏗️ Architecture\n\nThe build runs inside a long-lived Docker container (`openwrt-build`, `ubuntu:22.04`, `--platform linux/amd64`).\nAll SDK state lives in a named Docker volume (`openwrt-sdk-vol`) rather than a bind mount — this avoids\nmacOS virtiofs permission issues with the SDK's symlinks and restricted files. The project directory\nis bind-mounted at `/host` for the scripts directory and for writing output artifacts.\n\n\u003c!-- prettier-ignore --\u003e\n```markdown\nHost (Mac or Linux)\n  scripts/*.sh       ─┐\n  output/*.ipk       ◄│──  /host   ┐\n                     │              │\n                     │              │  openwrt-build  (ubuntu:22.04 linux/amd64)\n                     │              │\n  openwrt-sdk-vol  ──┴──  /workspace ┴─►  OpenWrt SDK 23.05.6 ipq807x\n                                          + feeds (base, packages, printing, luci)\n                                          + build_dir/, staging_dir/, bin/\n```\n\n### Project Layout\n\n\u003c!-- prettier-ignore --\u003e\n```markdown\nopenwrt-printing/\n├── scripts/\n│   ├── bootstrap.sh              # One-shot wrapper: build + install + configure\n│   ├── setup-container.sh        # Create openwrt-build container + named volume\n│   ├── fetch-sdk.sh              # Download + extract OpenWrt 23.05.6 ipq807x SDK\n│   ├── patch-sdk.sh              # Overlay full gnulib tree onto SDK snapshot (gettext fix)\n│   ├── prepare-feeds.sh          # Wire Vladdrako printing feed, update + install\n│   ├── configure-sdk.sh          # Write SDK .config for cups/filters/poppler/gs\n│   ├── build-stack.sh            # Cross-compile poppler + cups + gs + cups-filters\n│   ├── build-foomatic-rip.sh     # Cross-compile foomatic-rip (missing from cups-filters 1.0.37)\n│   ├── build-foo2zjs.sh          # Cross-compile foo2zjs binary + wrapper + PPD\n│   ├── install-on-router.sh      # scp *.ipk → opkg install on router\n│   ├── install-foomatic-rip.sh   # scp tarball → extract on router\n│   ├── install-foo2zjs.sh        # scp tarball → extract on router\n│   ├── configure-cups.sh         # Write cupsd.conf, pdftops shim, open firewall\n│   └── configure-airprint.sh     # Write Avahi service file for _ipp._tcp\n├── output/                       # Produced .ipk + foo2zjs tarball (gitignored)\n├── build/                        # Cached SDK tarball (gitignored)\n├── CLAUDE.md                     # Agent context: plan, URLs, troubleshooting\n├── LICENSE                       # MIT\n└── README.md                     # This file\n```\n\n---\n\n## 📦 Build\n\nAll scripts are idempotent and resume-friendly. Re-running after a failure is safe.\n\n### One-shot deploy (recommended)\n\n`scripts/bootstrap.sh` wraps the full pipeline — build, install, configure, `lpadmin`, AirPrint\npublish — behind a single CLI. Every printer-facing input is a flag; defaults target the reference\nHP LaserJet 1022. Run with `--help` for the full flag list.\n\n```bash\n# Reference HP LaserJet 1022 setup (defaults for all flags):\n./scripts/bootstrap.sh\n\n# Different printer — override the identity + driver wiring:\n./scripts/bootstrap.sh \\\n  --router root@192.168.8.1 \\\n  --printer-name Brother_HLL2350DW \\\n  --printer-model \"Brother HL-L2350DW\" \\\n  --printer-duplex T \\\n  --device-uri usb://Brother/HL-L2350DW \\\n  --ppd /usr/share/cups/model/Brother-HL-L2350DW.ppd\n\n# Re-run only the router-side steps (the build output is still in output/):\n./scripts/bootstrap.sh --skip-build\n\n# Re-push only the Avahi / CUPS config (packages already installed):\n./scripts/bootstrap.sh --skip-build --skip-install\n```\n\n### Running the stages manually\n\nIf you prefer to drive each stage yourself — for debugging or when re-using pieces of the pipeline\nin another project — the stage scripts are designed to be called directly, in this order:\n\n```bash\n# First-time environment bootstrap (~5 min on Linux amd64, ~15 min under Rosetta)\n./scripts/setup-container.sh\n./scripts/fetch-sdk.sh\n./scripts/patch-sdk.sh        # gnulib overlay — see Troubleshooting\n./scripts/prepare-feeds.sh\n./scripts/configure-sdk.sh\n\n# Cross-compile the stack (single `make -jN` invocation with all four targets —\n# poppler, cups, ghostscript, cups-filters — so sibling packages run in parallel\n# under one jobserver).\n./scripts/build-stack.sh\n\n# Cross-compile foomatic-rip (cups-filters 1.0.37 doesn't ship it).\n./scripts/build-foomatic-rip.sh\n\n# Cross-compile foo2zjs (direct toolchain invocation — not wrapped as .ipk;\n# produces a tarball that unpacks straight into /usr/lib/cups/filter/ and\n# /usr/share/cups/model/ on the router).\n./scripts/build-foo2zjs.sh\n```\n\n### Watching the Build\n\nThe build logs to `/workspace/build.log` inside the container. Stream it from a second terminal:\n\n```bash\ndocker exec openwrt-build tail -F /workspace/build.log\n```\n\n### Expected Output\n\n```bash\noutput/\n├── cups_*.ipk\n├── cups-client_*.ipk\n├── libcups_*.ipk\n├── openprinting-cups-filters_*.ipk\n├── libpoppler_*.ipk\n├── ghostscript_*.ipk            # if the GS build succeeded\n├── liblcms2_*.ipk, libpng_*.ipk, libtiff_*.ipk, ...\n└── foo2zjs-hp-lj1022.tar.gz\n```\n\n---\n\n## 🔌 Install on Router\n\nThe router's DISTRIB_ARCH is `aarch64_cortex-a53_neon-vfpv4` (note the `_neon-vfpv4` suffix), but the\nupstream OpenWrt SDK emits packages tagged `aarch64_cortex-a53`. `install-on-router.sh` handles this\nby adding an extra `arch aarch64_cortex-a53 200` line to `/etc/opkg.conf` so opkg accepts both arch\ntags. ABI-wise this is safe — NEON + VFPv4 are mandatory parts of ARMv8-A, so the cortex-a53 build\nruns identically on the Flint 3.\n\n```bash\n# SSH key must be in place first:\nssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.8.1\n\n# Install the .ipk stack + foo2zjs:\n./scripts/install-on-router.sh\n./scripts/install-foo2zjs.sh\n```\n\n---\n\n## ⚙️ Configure\n\n```bash\n# CUPS: bind to 0.0.0.0:631, allow LAN, open firewall, install pdftops shim\n./scripts/configure-cups.sh\n\n# AirPrint: Avahi _ipp._tcp._universal service record. All printer-facing\n# strings are env-overridable; defaults target the reference HP LJ 1022.\nPRINTER_NAME=My_Printer \\\nPRINTER_MODEL=\"Brother HL-L2350DW\" \\\nPRINTER_DESCRIPTION=\"Brother HL-L2350DW on GL-BE9300\" \\\n./scripts/configure-airprint.sh\n```\n\nThen add the printer through the CUPS admin UI at `http://192.168.8.1:631/admin`, or via\n`lpadmin` on the router. Example (reference HP LaserJet 1022 setup):\n\n```bash\nssh root@192.168.8.1 \\\n  lpadmin -p HP_LaserJet_1022 -E \\\n  -v usb://HP/LaserJet%201022 \\\n  -P /usr/share/cups/model/HP-LaserJet_1022.ppd\n```\n\nFor a different printer, substitute the queue name, USB URI (see `lpinfo -v` on the router), and\nPPD path. The printer then appears on iOS and macOS as an AirPrint destination named\n**\"AirPrint \\\u003cPRINTER\\_MODEL\\\u003e @ \\\u003chostname\\\u003e\"**.\n\n---\n\n## 🔧 Troubleshooting\n\n### Build is slow / looks stuck\n\nIf you're building on Apple Silicon via Rosetta, `gettext-full`'s host build runs `gnulib-tool` —\na shell script that spawns thousands of short-lived processes. Each fork roundtrips through Rosetta,\nso a single gnulib import can take over an hour. The build _isn't_ stuck; it's emulation-bound.\nMove the build to a native x86_64 Linux host and it finishes in under an hour.\n\nVerify it's still progressing:\n\n```bash\ndocker exec openwrt-build bash -c '\n  L1=$(wc -c \u003c /workspace/build.log); sleep 10\n  L2=$(wc -c \u003c /workspace/build.log)\n  echo \"bytes added in 10s: $((L2 - L1))\"'\n```\n\n### `gnulib-tool: module root-uid doesn't exist`\n\nThe SDK's bundled `staging_dir/host/share/gnulib/` is a curated 2017 snapshot and omits a handful of\nmodules that `gettext-0.21.1`'s `autogen.sh` imports (notably `root-uid`). `scripts/patch-sdk.sh`\nfixes this by overlaying Ubuntu's `gnulib` package (apt-installed inside the container) with\n`rsync --ignore-existing`, adding the missing module descriptors without touching the SDK's own\nfiles. It also clears `build_dir/hostpkg/gettext-0.21.1` so gettext reimports with the patched tree.\nIdempotent — re-running is a no-op after the first pass.\n\n### poppler CMake: `Boost recommended for Splash. Use ENABLE_BOOST=OFF to skip.`\n\nVladdrako's poppler 23.11.0 Makefile does not pass `ENABLE_BOOST=OFF`, so CMake hard-fails when\nBoost ≥ 1.71 is not installed. The Splash backend isn't needed — cups-filters uses poppler's core\nAPI — so `scripts/patch-sdk.sh` appends `-DENABLE_BOOST=OFF` to the CMake options and clears the\nstale `.configured` stamp. Idempotent.\n\n### cups configure: `--with-tls=openssl was specified but neither OpenSSL nor LibreSSL were found`\n\nThe Vladdrako cups Makefile has its `--with-tls` conditional inverted:\n`--with-tls=$(if $(LIBCUPS_OPENSSL),gnutls,openssl)` — so selecting GnuTLS in menuconfig\nactually passes `openssl` to configure. `scripts/patch-sdk.sh` swaps the two branches so the\nselected TLS backend is respected. We default to GnuTLS because `libgnutls` is pre-staged by the\nSDK; OpenSSL requires also selecting `libopenssl`.\n\n### `nspr` fails with \"write jobserver: Bad file descriptor\"\n\nThis is a known GCC 12 LTO/jobserver fd bug triggered at high parallelism. `build-stack.sh`\nautomatically retries failed packages at `-j1` when the parallel build fails.\n\n### Ghostscript fails to cross-compile\n\nKnown-fragile. The pipeline uses Poppler as the primary PDF backend; Ghostscript failure is treated\nas non-fatal (cups-filters works with Poppler alone).\n\n### Printer not discovered by iOS / macOS\n\n1. Check Avahi is running: `ssh root@192.168.8.1 pgrep avahi-daemon`\n2. Verify mDNS traffic is allowed on the LAN side: `ssh root@192.168.8.1 nft list chain inet fw4 input_lan`\n3. Confirm the service advertises: `dns-sd -B _ipp._tcp local` (from macOS)\n\n### CUPS: `No filter to convert from application/pdf` / iOS shows online but never prints\n\ncups-filters 1.0.37 does not build its `pdftops` / `pdftopdf` / `pdftoraster` filters against\nPoppler 23.x on aarch64 — the Poppler C++ headers moved enough that those filter sources fail to\ncompile, so the `.ipk` ships without them. Without `pdftops`, CUPS has no chain from\n`application/pdf` to `application/vnd.cups-postscript` (which every foomatic-rip-driven PPD expects\nas input). The first visible symptom is that `application/pdf` and `image/urf` are missing from\n`ipptool … document-format-supported` — and because iOS AirPrint probes that list before submitting\na job, **the printer shows \"online\" but no Create-Job ever reaches CUPS** (`tcpdump` shows only\n`Get-Printer-Attributes` requests, no job data). `configure-cups.sh` fixes this by installing a\nsmall Ghostscript-based `/usr/lib/cups/filter/pdftops` shim and registering it in\n`/etc/cups/mime.convs` at cost 50, which makes PDF and URF appear in `document-format-supported`\nand unblocks iOS job submission. Verify after `configure-cups.sh` with:\n\n```bash\nssh root@192.168.8.1 \\\n  cupsfilter -m application/vnd.cups-postscript \\\n    -p /etc/cups/ppd/\u003cQUEUE\u003e.ppd -i application/pdf --list-filters /dev/null\n# Expected output: pdftops\n```\n\n### `opkg install` refuses packages — architecture mismatch\n\nConfirm `/etc/opkg.conf` on the router contains `arch aarch64_cortex-a53 200`. `install-on-router.sh`\nadds this line idempotently on every run.\n\n---\n\n## 🛡️ Notes on ABI and Source Compatibility\n\n- **SDK target `ipq807x`** is used as the closest upstream match for the router's `ipq53xx`. Both\n  use Cortex-A53 with identical ABI (NEON + VFPv4 + crypto extensions); packages compiled for\n  ipq807x run unchanged on ipq53xx.\n- **Runtime linker mismatch risk**: the router uses `ld-musl-aarch64.so.1` from its shipped musl\n  1.2.4 build; the SDK produces binaries linked against the same. Confirmed compatible.\n- **Kernel version** on the router (5.4.213) affects only kernel modules. This project ships\n  userspace only — no kmods — so kernel skew is irrelevant.\n\n---\n\n## 📚 Key References\n\n- **Vladdrako printing feed**: \u003chttps://github.com/Vladdrako/openwrt-printing-packages\u003e\n- **OpenWrt SDK (23.05.6, ipq807x)**: \u003chttps://downloads.openwrt.org/releases/23.05.6/targets/ipq807x/generic/\u003e\n- **OpenPrinting / foo2zjs**: \u003chttps://github.com/OpenPrinting/foo2zjs\u003e\n- **HP LaserJet 1022 on OpenPrinting**: \u003chttps://www.openprinting.org/printer/HP/HP-LaserJet_1022\u003e\n- **TheMMcOfficial — CUPS for OpenWrt**: \u003chttps://themmcofficial.github.io/cups-for-openwrt/\u003e\n\n---\n\n## 📄 License\n\n[MIT](LICENSE) — see `LICENSE` for full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frdrkr%2Fopenwrt-printing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frdrkr%2Fopenwrt-printing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frdrkr%2Fopenwrt-printing/lists"}