{"id":19218898,"url":"https://github.com/openprinting/pappl-retrofit","last_synced_at":"2025-05-13T00:22:46.825Z","repository":{"id":65767994,"uuid":"399007073","full_name":"OpenPrinting/pappl-retrofit","owner":"OpenPrinting","description":"PPD/Classic CUPS driver retro-fit Printer Application Library","archived":false,"fork":false,"pushed_at":"2025-03-01T16:01:15.000Z","size":447,"stargazers_count":12,"open_issues_count":11,"forks_count":12,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-01T05:02:06.053Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OpenPrinting.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-23T07:10:21.000Z","updated_at":"2025-03-04T06:24:25.000Z","dependencies_parsed_at":"2023-02-19T20:15:49.790Z","dependency_job_id":"08f5e334-d52f-44a4-b8d3-68e5c4437eca","html_url":"https://github.com/OpenPrinting/pappl-retrofit","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenPrinting%2Fpappl-retrofit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenPrinting%2Fpappl-retrofit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenPrinting%2Fpappl-retrofit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenPrinting%2Fpappl-retrofit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OpenPrinting","download_url":"https://codeload.github.com/OpenPrinting/pappl-retrofit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249958632,"owners_count":21351683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-09T14:28:39.832Z","updated_at":"2025-04-20T20:32:09.013Z","avatar_url":"https://github.com/OpenPrinting.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# PPD/Classic CUPS driver retro-fit Printer Application Library\n\n\n## INTRODUCTION\n\nThis library together with [PAPPL](https://www.msweet.org/pappl),\n[libcupsfilters 2.x](https://github.com/OpenPrinting/libcupsfilters),\nand [libppd](https://github.com/OpenPrinting/libppd) allows to convert\nclassic [CUPS](https://github.com/OpenPrinting/cups) printer drivers\ninto Printer Applications. This way the printer appears as an emulated\nIPP printer and one can print on it from practically any operating\nsystem, especially also mobile operating systems and IoT platforms,\nwithout need of any client-side driver.\n\nIt also makes printers needing a classic CUPS driver available to the\n[CUPS Snap](https://github.com/OpenPrinting/cups-snap) and to CUPS 3.x\n([library](https://github.com/OpenPrinting/libcups), [local\nserver](https://github.com/OpenPrinting/cups-local), [sharing\nserver](https://github.com/OpenPrinting/cups-sharing)) which do not\nsupport installing and using classic CUPS drivers.\n\nThe basic framework for making up a Printer Application comes from\nPAPPL, many resources to cope with PPD files, CUPS filters, job data\nformat conversions, and even CUPS backends are provided by\nlibcupsfilters, libppd, and cups-filters.\n\nWith this library a Printer Application is simply made up by defining\na configuration of basic properties and data conversion rules, and\nalso add some own functions for auto-assignment of drivers, test page,\n... in a small C program stub, and packaging this together with the\nPPD files, CUPS filters, and CUPS backend out of which the classic\nCUPS filter is composed. The resulting Printer Application can also be\neasily packaged in a Snap to be available for a wide range of Linux\ndistributions.\n\nYour contributions are welcome. Please post [issues and pull\nrequests](https://github.com/OpenPrinting/pappl-retrofit).\n\n\n### Properties\n\n- A classic CUPS printer driver consists of PPD files, CUPS filters,\n  and sometimes also CUPS backends. All this is supported by this\n  library.\n\n- The PPD files can be provided in all forms which CUPS supports:\n  Individual files, compressed files, tar archives, driver information\n  files (`.drv`), executables which generate PPDs on-the-fly.\n\n- Even more complex filters and backends which use the side and back\n  channel communication are supported.\n\n- All user-settable options of the PPD file are made available in the\n  web interface of the Printer Application, under \"Printing\n  Defaults\". All paper input trays are listed under \"Media\" and one\n  can assign the loaded paper size and type, and also whether\n  borderless printing should be done (if the printer supports it).\n\n- To be able to get best printing results from any client platform the\n  PPD options are mapped to standard job IPP attributes, not only\n  paper sizes, types, trays, duplex, but especially \"print-color-mode\"\n  (color/monochrome), \"print-quality\" (draft/normal/high), and\n  \"print-content-optimize\" (auto/photo/graphics/text/text\u0026graphics)\n  are auto-selecting the best possible PPD option settings, and that\n  for ~10000 PPD files without any manually created database of option\n  presets (no one will take the time for that).\n\n- If you want to get the last bits out of your printer and therefore\n  want to override the automatic settings done by the standard job IPP\n  attributes you can always move the option settings on the \"Printing\n  Defaults\" web interface page away from \"Automatic Selection\" and get\n  all the choices from the original PPD. Remember to go back to\n  \"Automatic Selection\" when done with the special job.\n\n- If \"print-content-optimize\" is set to \"auto\" the job data is\n  pre-checked for the content. Images (JPEG, PNG) are considered as\n  photos, on PDF files it is determined by which application they were\n  created and the content type selected by that.\n\n- Some printers have hardware accessories which can be installed, like\n  extra trays, a duplex unit, finishers, or more RAM. If the PPD file\n  describes these accessories and what extra settings get available by\n  them, a \"Device Settings\" web interface page will appear in the\n  Printer Application. There you can configure what is installed amd\n  the options under \"Media\" and \"Printing Defaults\" get updated\n  appropriately.\n\n- If the Printer is a PostScript printer and appropriate commands are\n  defined in the PPD file, both option default settings and the\n  configuration of installable accessories can be polled from the\n  printer and the settings in the Printer Application get\n  automatically adjusted. In this case you have a \"Device Settings\"\n  web interface page for your printer and there are \"Poll\" buttons to\n  do the polls.\n\n- With this library any arbitrary amount of PPD files included in a\n  single Printer Application is supported, it even does not slow down\n  with ~10000 PPDs. Naturally only PPDs work for which the appropriate\n  CUPS filters are available. Only PostScript printer PPDs can\n  alternatively be used without the CUPS filter specified in them (but\n  most PostScript PPDs do not specify a CUPS filter anyway).\n\n- One can create Printer Applications which allow the user to add\n  their own PPD files via \"Add PPD file\" web interface page.\n\n- The full functionality of PAPPL is supported, including the\n  emulation of a highly standards-conforming driverless IPP printer\n  (IPP Everywhere, AirPrint) and streaming of Raster jobs (if the\n  printer and driver support it), which saves resources on the server\n  and allows even infinite jobs.\n\n- Drivers can be assigned to the discovered printers automatically or\n  manually by selecting the driver (a PPD file) from the menu on the\n  \"Add Printer\" web interface page. The implementor of the Printer\n  Application can use their own auto-assignment function. The library\n  contains some functions for common operations, like finding the best\n  PPD for a printer or checking which PDLs (Page Description\n  Languages) the printer supports.\n\n- The included Legacy Printer Application allows to easily check\n  whether a CUPS driver works inside a Printer Application. Simply\n  install the driver normally (into the system's conventionally\n  installed CUPS) and the Legacy Printer Application looks for the\n  driver's files in the usual CUPS directories. It can also be used to\n  make classically installed printer drivers available to the CUPS\n  Snap or to CUPS 3.x, especially proprietary legacy drivers which do\n  not exist in a Snap in the Snap Store. In addition, it serves as\n  example to create your own driver-retro-fitting Printer Application.\n\n\n### Remark\n\n- This library is derived from the [PostScript Printer\n  Application](https://github.com/OpenPrinting/ps-printer-app), but\n  note that when you are looking into its GIT repository now, you will\n  only see a little code stub as it is now using this library. Go back\n  in the GIT history to see the last pre-libpappl-retrofit state of\n  it. The current state is also a nice example for using this library.\n\n\n### To Do\n\n- On the \"Add PPD files\" page in the list of already added user PPD\n  files mark which ones are actually used by a printer which got set\n  up in the Printer Application, to avoid that the user removes these\n  files.\n\n- Internationalization/Localization\n\n- SNMP Ink level check via ps_status() function\n\n- In the C files some places can be marked with `TODO`. These are\n  points to be improved or where functionality in PAPPL is still\n  needed.\n\n- Build options for cups-filters, to build without libqpdf and/or\n  without libppd, the former will allow to create the Snap of some\n  Printer Applications without downloading and building QPDF\n\n\n## SNAP\n\nThis is a library and not a Printer Application, so there will be no\nSnap for this, but Printer Applications created with the help of this\nlibrary are available in the [Snap\nStore](https://snapcraft.io/search?q=OpenPrinting).\n\nThe included Legacy Printer Application is also not suitable to get\nsnapped, as it simply points its search directories to the PPD,\nfilter, and backend locations of a conventionally (not the Snap)\ninstalled CUPS, to make all installed drivers available in a Printer\nApplication. Out of a fully constrained Snap you cannot simply access\nthe system's files and so this does not work (otherwise the CUPS Snap\nwould support claasic printer drivers).\n\nPlease have a look at the [PostScript Printer\nApplication](https://github.com/OpenPrinting/ps-printer-app), the\n[Ghostscript Printer\nApplication](https://github.com/OpenPrinting/ghostscript-printer-app),\nthe [HPLIP Printer\nApplication](https://github.com/OpenPrinting/hplip-printer-app), and\nthe [Gutenprint Printer\nApplication](https://github.com/OpenPrinting/gutenprint-printer-app)\nfor examples on how Snaps of Printer Applications are created. All\nthese Printer Applications use this library, retro-fitting PostScript\nprinter PPD files, [Ghostscript](http://www.ghostscript.com/) drivers\nwith [Foomatic](https://github.com/OpenPrinting/foomatic-db) PPD files\n(and many other printer drivers), HPLIP, and Gutenprint. Practically\nevery free software printer driver which is available as Debian\npackage is now also available as a Printer Application Snap. They can\nbe all installed from the [Snap\nStore](https://snapcraft.io/search?q=OpenPrinting).\n\nThe HPLIP Printer Application is especially an example of how to add\ndriver-specific functionality which is beyond the pappl-retrofit\nlibrary and control this functionality through extra pages in the web\ninterface. Here a feature for downloading HP's proprietary plugin is\nadded.\n\n\n## INSTALLATION\n\nTo install this library, you need libcups (of\n[CUPS](https://github.com/OpenPrinting/cups) 2.2.x or newer),\n[PAPPL](https://www.msweet.org/pappl) 1.3.x or newer,\n[libcupsfilters](https://github.com/OpenPrinting/libcupsfilters) 2.0b1\nor newer, and [libppd](https://github.com/OpenPrinting/libppd) 2.0b1\nor newer.\n\nWith this installed, you do the usual\n```\n./configure\nmake\nsudo make install\n```\nNote that if you are using a GIT snapshot you have to run\n```\n./autogen.sh\n```\nbefore the above-mentioned commands.\n\nThen have a look at\n```\nlegacy/legacy-printer-app.c\n```\nas a coding example and\n```\npappl-retrofit/pappl-retrofit.h\n```\nfor the full public API to get a feeling how to create a Printer\nApplication in your desired configuration.\n\nIf you have a systemd-based system and want to run the Legacy Printer\nApplication (see below) as a permanently running system daemon to make\nyour classic CUPS drivers available to CUPS 3.x or to the CUPS Snap,\ndo the same as above but run the `./configure` command as follows:\n```\n./configure --enable-legacy-printer-app-as-daemon\n```\nThis installs the `legacy-printer-app` in `/usr/(local/)sbin/` and\ninstalls a systemd service file to make the Printer Application\nautomatically start during boot.\n\n\n## Setting up your Printer Application\n\nIf you have your Printer Application, start it as a server, for\nexample (using the name of our Legacy Printer Application in the\nexamples):\n```\nsudo legacy-printer-app server \u0026\n```\n\nEnter the web interface\n```\nhttp://localhost:8000/\n```\nUse the web interface to add a printer. Supply a name, select the\ndiscovered printer, then select make and model. Also set the loaded\nmedia and the option defaults.\n\nThen print PDF, PostScript, JPEG, Apple Raster, or PWG Raster files\nwith\n```\nlegacy-printer-app FILE\n```\nor print with CUPS, CUPS (and also cups-browsed) discover and treat\nthe printers set up with this Printer Application as driverless IPP\nprinters (IPP Everywhere and AirPrint).\n\nYou can also add PPD files, either by using the \"Add PPD files\" button\nin the web interface or by manually copying PPD files:\n```\nsudo cp PPDFILE /var/lib/legacy-printer-app/ppd/\n```\n\nAfter manually copying (or removing) PPD files you need to restart the\nserver or in the web interface, on the \"Add PPD files\" page click the\n\"Refresh\" button at the bottom. This adds the changes to the internal\ndriver list.\n\nOn the \"Add Printer\" page in the drop-down to select the driver,\nuser-added PPD files are marked \"USER-ADDED\". When setting up a\nprinter with automatic driver selection, user-added PPD files are\npreferred.\n\n`PPDFILE` in the command line above cannot only be a single PPD file\nbut any number of single PPD files, `.tar.gz` files containing PPDs\n(in arbitrary directory structure), driver information files (`.drv`),\nand PPD-generating executables which are usually put into\n`/usr/lib/cups/driver`. You can also create arbitrary sub-directory\nstructures in `/var/lib/legacy-printer-app/ppd/` containing the\nmentioned types of files. Only make sure to not put any executables\nthere which do anything else than listing and generating PPD files.\n\nNote that with the web interface you can only manage individual PPDs\n(uncompressed or compressed with `gzip`) in the\n`/var/lib/legacy-printer-app/ppd/` directory itself. Archives, driver\ninformation files, executables, or sub-directories are not shown and\nappropriate uploads not accepted. This especially prevents adding\nexecutables without root rights.\n\nAny added PPD file must be for printers supported by the Printer\nApplication (its included filters and backends). The \"Add PPD files\"\npage shows warnings if unsuitable files get uploaded.\n\nSee\n```\nlegacy-printer-app --help\n```\nfor more options.\n\nUse the `--debug` argument for verbose logging in your terminal\nwindow.\n\n\n## LEGACY PRINTER APPLICATION\n\nThe Legacy Printer Application simply points to the directories of the\nCUPS installed conventionally (not the CUPS Snap) on your system. So\nit makes all of your installed printer drivers available in a Printer\nApplication. Some drivers may not work in the different environment\n(for example if a filter or backend tries to communicate with the CUPS\ndaemon), but such cases are rare.\n\nThis especially makes the drivers available to the [CUPS\nSnap](https://github.com/OpenPrinting/cups-snap) ([Snap\nStore](https://snapcraft.io/cups)) and to CUPS 3.x\n([library](https://github.com/OpenPrinting/libcups), [local\nserver](https://github.com/OpenPrinting/cups-local), [sharing\nserver](https://github.com/OpenPrinting/cups-sharing)) which do not\ndirectly support classically installed printer drivers. So the CUPS\nSnap/CUPS 3.x can be used as the system's standard printing\nenvironment keeping the classically installed printer drivers. This\nworks but is generally not recommended, as most free software printer\ndrivers are already available as Printer Applications ([Snap\nStore](https://snapcraft.io/search?q=OpenPrinting)), but there could\nbe some drivers which are not yet converted, especially many\nproprietary legacy drivers from printer manufacturers. Here the Legacy\nPrinter Application comes in handy.\n\nSo the best way for a Linux distribution using the CUPS Snap or CUPS\n3.x as its printing system it is recommended not to install the\nstandard drivers classically but use the appropriate Printer\nApplication (Snaps) instead, but also install the Legacy Printer\nApplication classically to catch any drivers for which we do not have\na Printer Application.\n\nYou can also use this Printer Application to test the driver which you\nwant to retro-fit before you start to configure your Printer\nApplication executable and package everything into a Snap (or other\npackaging/containerization format). This library and the functions of\n[libcupsfilters](https://github.com/OpenPrinting/libcupsfilters) and\n[libppd](https://github.com/OpenPrinting/libppd) used by it try to\nresemble the CUPS environment for the filters and backends as well as\npossible: Environment variables, command lines, even side and back\nchannels. But it is always better to test whether the driver behaves\ncorrectly, whether the PPD options are represented well on the \"Device\nSettings\", \"Media\", and \"Printing Defaults\" pages of the web\ninterface, and whether the printer reacts correctly to IPP attributes\nsupplied with the job, especially `print-color-mode`, `print-quality`,\nand `print-content-optimize`.\n\nThe Legacy Printer Application uses the (classically installed) CUPS\nbackends for communication with the printer hardware by default and\nnot the backends built into PAPPL, to get the best compatibility with\nthe CUPS drivers. To make the PAPPL backends also available, the\nLegacy Printer Application has to be built with the\n`--enable-pappl-backends-for-legacy-printer-app` for `./configure`.\n\nThe Legacy Printer Application searches for PPDs, PPD archives, driver\ninformation files (`.drv`), and PPD-generating executables on\n\n```\n/usr/share/ppd/\n/usr/share/cups/model/\n/usr/lib/cups/driver/\n/usr/share/cups/drv/\n/var/lib/legacy-printer-app/ppd/\n```\nThe last one is where the web interface drops user-uploaded PPD files.\n\nIt uses the following directories for its files:\n```\n/var/lib/legacy-printer-app\n/var/spool/legacy-printer-app\n/usr/share/legacy-printer-app\n/usr/lib/legacy-printer-app\n```\nThe last directory is linked to `/usr/lib/cups` so that the Printer\nApplication sees the filters and backends of CUPS.\n\nThe test page\n```\n/usr/share/legacy-printer-app/testpage.ps\n```\nis the good old 21-year-old PostScript test page of CUPS, but you can\neasily use any other test page for your Printer Application.\n\nConfigured print queues and job history is saved in\n```\n/var/lib/legacy-printer-app/legacy-printer-app.state\n```\n\nYou can set the `PPD_PATHS` environment variable to search other\nplaces instead:\n```\nPPD_PATHS=/path/to/my/ppds:/my/second/place ./legacy-printer-app server\n```\n\nSimply put a colon-separated list of any amount of paths into the\nvariable, always the last being used by the \"Add PPD files\"\npage. Creating a wrapper script is recommended.\n\nFor an alternative place for the test page use the TESTPAGE_DIR\nenvironment variable:\n```\nTESTPAGE_DIR=`pwd` PPD_PATHS=/path/to/my/ppds:/my/second/place ./legacy-printer-app server\n```\nor for your own creation of a test page (PostScript, PDF, PNG, JPEG,\nApple Raster, PWG Raster):\n```\nTESTPAGE=/path/to/my/testpage/my_testpage.ps PPD_PATHS=/path/to/my/ppds:/my/second/place ./legacy-printer-app server\n```\n\nIf anything behaves wrongly and you cannot get it working by modifying\nthe configuration of your Printer Application, your callbacks, regular\nexpressions, conversion rule selections, ... please report an [issue\non\nlibpappl-retrofit](https://github.com/OpenPrinting/pappl-retrofit/issues)\n(we move it to cups-filters if it is actually there).\n\nIf you want the Legacy Printer Application to be permanently run as a\nserver, being auto-started during boot, build the package with the\n`--enable-legacy-printer-app-as-daemon` option for `./configure`. This\nway an appropriate systemd service file gets installed.\n\n\n## ALREADY AVAILABLE PRINTER APPLICATIONS\n\nPlease also have a look at the [PostScript Printer\nApplication](https://github.com/OpenPrinting/ps-printer-app), the\n[Ghostscript Printer\nApplication](https://github.com/OpenPrinting/ghostscript-printer-app),\nthe [HPLIP Printer\nApplication](https://github.com/OpenPrinting/hplip-printer-app), and\nthe [Gutenprint Printer\nApplication](https://github.com/OpenPrinting/gutenprint-printer-app)\nfor examples on how Printer Applications and their Snaps are\ncreated. All these Printer Applications use this library,\nretro-fitting PostScript printer PPD files,\n[Ghostscript](http://www.ghostscript.com/) drivers with\n[Foomatic](https://github.com/OpenPrinting/foomatic-db) PPD files (and\nmany other printer drivers), HPLIP, and Gutenprint. Practically every\nfree software printer driver which is available as Debian package is\nnow also available as a Printer Application Snap. They can be all\ninstalled from the [Snap\nStore](https://snapcraft.io/search?q=OpenPrinting).\n\nThe HPLIP Printer Application is especially an example of how to add\ndriver-specific functionality which is beyond the pappl-retrofit\nlibrary and control this functionality through extra pages in the web\ninterface. Here a feature for downloading HP's proprietary plugin is\nadded.\n\n\n## HISTORY\n\nMy work on making Printer Applications out of classic CUPS drivers\npractically started when [PAPPL](https://www.msweet.org/pappl) got\nborn. I already saw the need for this before, especially for the [CUPS\nSnap](https://github.com/OpenPrinting/cups-snap) and have opened GSoC\nprojects on that, but PAPPL was the real start for it.\n\nI first started with PostScript printers, the simplest approach of\nonly PPD files without CUPS filters or backends, writing the\n[PostScript Printer\nApplication](https://github.com/OpenPrinting/ps-printer-app) derived\nfrom Michael Sweet's first working model, the [HP PCL Printer\nApplication](https://github.com/michaelrsweet/hp-printer-app). When I\nsaw the code of the PostScript Printer Application growing and also\nwhen I added CUPS filter support as some PostScript PPDs use CUPS\nfilters to manage the password for secure printing options, I decided\non creating this library.\n\nYou can see the sections about the **PostScript Printer Application**\nand about **Retro-fitting of CUPS printer drivers into Printer\nApplications** in my [monthly news\nposts](https://openprinting.github.io/news/) on the OpenPrinting web\nsite.\n\nI also wrote up my ideas on the design and the inner workings of this\nlibrary in the weeks of development before putting up a GitHub\nrepository for it on [this thread in the PostScript Printer\nApplication\nGitHub](https://github.com/OpenPrinting/ps-printer-app/discussions/8).\nThe thread has ended now and further write-ups will appear in the\ncommit messages of this library's GIT, as I am already doing with the\n[CUPS Snap](https://github.com/OpenPrinting/cups-snap/commits/master).\n\n\n## LEGAL STUFF\n\nThe CUPS driver retro-fit library is Copyright © 2021-2022 by Till\nKamppeter.\n\nIt is derived from the PostScript Printer Application and this one\nderived from the [HP PCL Printer\nApplication](https://github.com/michaelrsweet/hp-printer-app), a first\nworking model of a raster Printer Application using PAPPL.\n\nThe HP PCL Printer Application is Copyright © 2019-2020 by Michael R\nSweet.\n\nThis software is licensed under the Apache License Version 2.0 with an\nexception to allow linking against GPL2/LGPL2 software (like older\nversions of CUPS). See the files \"LICENSE\" and \"NOTICE\" for more\ninformation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenprinting%2Fpappl-retrofit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenprinting%2Fpappl-retrofit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenprinting%2Fpappl-retrofit/lists"}