πŸ‡ΊπŸ‡¦ We stand with Ukraine! πŸ‡ΊπŸ‡¦

Plugin compatibility in Plugin Manager

I finally upgraded my printers, had been ignoring them for a bit. I'll take a look.

Not in JS, but you could enrich the retrieved information with a call to octoprint.util.is_python_compatible:

plugins = webresponse.json()
for entry in plugins:
    to_check = entry.get("compatibility", dict()).get("python", ">=2.7,<3")
    entry["python_compat"] = octoprint.util.is_python_compatible(to_check, python_version="3.6")
return plugins

Do you want to take a look at this first before I merge it?

Gotta admit, I wish I could that as easily in the jekyll code used for serving the repository webpages, I'm currently simply doing string searches and it really makes me unhappy ^^

Making the compatibility information visible in the repository browser indeed makes sense (not only python, but also the OS and such), I'll get on it.

Hi all,

the plugins.json doesn't include the truth. E.g. in the screenshot above my DLP-Plugin is listed, because the plugin-repository information is not up to date. But the DLP-plugin works with python 3 and OP1.4.

IMHO: We need to improve the content of the plugins.json and not an additional plugin (don't get me wrong, the "Python3PluginCompatibilityCheck-Plugin" is helpful, but it is just a workaround)

Why not executing a shell-, nodejs-, python- or ruby-script to crawl the compatibility-information, before executing Jekyll.

script:
- python grapCompatibility.py
- bundle exec jekyll build

The script look into each single plugin-repository, parse the __init__.py file for compatibility-information (beside python, just add the other stuff, like OP-, OS-Version) and build the plugin.json file with that information.
Just add some default behaviour, if not all compatibility-information could be selected. Just grab the info from the plugin-markdown (but add a hint about the source of the information).
In the future the markdown compatibility-information should be deprecated.

Is this to complicated or did I missed something? (For 60request/h limit, we need to switch to auth-user, then we have 5000request/h) see https://developer.github.com/v3/#rate-limiting

What do you think?

@jneilliii Until this plugin is approved, updating seems to be just installing again from the posted URL. Am I correct?

I believe we are converging on the best possible solution. A short-term, very useful, plugin and a longer-term, probably enhanced, solution in the OctoPrint core.

Since I have one of my own plugins on the list, I'm motivated to get it off. The "oldest" one on my list is DisplayZ owned by none other than our fearless leader. I've looked at the plugin and I think the only change required is to add the compatibility string.

Yes, or in software update section of octoprint force a check for updates under the advanced options at the bottom.

Well, that would be here and here but it sounds like jneiliii's already done pretty much the same (minus the NodeJS).

@OllisGit, Why don't you fix that by submitting the correct information to the plugin repository? If you don't people will never find it in the Plugin Manager in the future anyway.

@foosel, I think it would be better to go ahead and get this merged and I'll investigate this option for a future version update. Need to figure out the best approach for supplying the Python version to check against, probably as part of the API call to the server side. That is of course, unless you decide to do something quick for the Plugin Manager and there is no need for this plugin at all.

1 Like

Because so far the page is being built by Github Pages and I have no control over the runtime environment and no way to execute additional things or add plugins or anything, so I'd need to change the whole build process, probably into utilizing Github Actions. Not impossible, but also not something done within a day.

Roger, will take care of that tomorrow.

I can't do anything quick because I'd need to put out 1.4.1 for that and I cannot do that yet (seriously, my days are nuts at the moment, ever since this whole pandemic escalated, no idea what's happening, sooo many requests and stuff....)

Where's the source/template/whatever that builds it?

Literally the OctoPrint/plugins.octoprint.org repository. Built by https://pages.github.com/.

Having that build automatically every couple of hours and involve a crawler step with an access key to get around the API restrictions would probably be the way to go. Would need something like GitHub Actions though. I just played around with that for the first time and it's kinda nice.

Great. I'll dig into it a bit in the next few days.

my work fell in love with it (versus AWS CodeBuild), it's fast and does really nice parallel builds.

Almost, thanks for the pointer though, I was able to figure it out and I think it's ready to go with the advanced python version checking. New 0.1.2 version released and should be available in Software Update for anyone that wants to test and already has it installed.

plugins = webresponse.json() for entry in plugins: 
	to_check = entry.get("compatibility", dict()).get("python", ">=2.7,<3") 
	entry["python_compat"] = octoprint.util.version.is_python_compatible(to_check, python_version="3.6") return plugins```

Quick question though @foosel, should this be limited to OctoPrint 1.4.0 compatibility, assuming that function was added in that version? If so, I can update the repo PR or you're more than welcome to change that compatibility flag on merge, just let me know.

Looks like I added that method back in 1.3.11, so if that's set as the lower limit it should be fine. I'll set it accordingly on the PR.

Side note: Can't help but find it kinda ironic that the Python3 checker plugin isn't Python 3 compatible :wink:

2 Likes

Yeah, figured if you are already in Python 3 you know what's not compatible.

Basically the halting problem- if this code fails, it must be py3 :slight_smile:

I read a couple of articles about dynamic generation with gh-pages.
Here are the links:

https://help.github.com/en/github/working-with-github-pages/setting-up-a-github-pages-site-with-jekyll and
https://developer.github.com/v3/repos/pages/#request-a-page-build

It looks like that you don't need gh-actions, you can continue using travis-ci.

  • Just create a travis-ci scheduler (e.g. once a day)
  • travis-script is executed
    -- execute the plugin-repo-crawling
    -- create json-file with compatible information (comp.json)
  • include comp.json in Jekyll-build
  • commit comp.json result to gh-pages to restart the normal Jekyll-Build page generation

What do you think?

I'm not using travis-ci for the actual page build, it's all github pages :wink: Travis on the plugin repo is just for link checking and making sure PRs by plugin authors don't nuke the JSON validity of the feeds.

First version of reporting:

l00ma/OctoPrint-roomTemp                                no compat line
mic159/octoprint-grbl-plugin                            missing metadata: None/1.0.2
kennethjiang/OctoPrint-Slicer                           no compat line
TheSpaghettiDetective/OctoPrint-TheSpaghettiDetective   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
plabric/Octoprint-Plabric                               {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Salandora/OctoPrint-EditorCollection                    no compat line
eliasbakken/octoprint_redeem                            no compat line
donovan6000/M33-Fio                                     no compat line
n3bojs4/octoprint-LCD1602                               no compat line
jim-p/Change_Filament                                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-UltimakerFormatPackage              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-YouTubeLive                         no compat line
jneilliii/OctoPrint-SideBarTempGraph                    {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
agrif/OctoPrint-InfluxDB                                {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
bruhmann/OctoPrint-EEprom-MPSelectMini                  no compat line
jneilliii/OctoPrint-Tasmota                             {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
cameroncros/OctoPrint-DiscordRemote                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-Slic3r                              no compat line
OctoPrint/OctoPrint-MQTT                                no compat line
adilinden-oss/octoprint-webcamstreamer                  no compat line
TheLongRunSmoke/OctoPrint-Filetypes                     no compat line
pastapojken/OctoPrint-Hardwarepwm                       no compat line
jneilliii/OctoPrint-TerminalCommandsExtended            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
tg44/OctoPrint-Prometheus-Exporter                      no compat line
eyal0/OctoPrint-MultipleUpload                          {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
bchanudet/OctoPrint-Octorant                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
FormerLurker/Octolapse                                  no compat line
jneilliii/OctoPrint-MyMiniFactory                       {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
christophschranz/OctoPrint-PrePrintService              no compat line
taxilian/OctoPrint-Twilio                               no compat line
frenchie4111/complicated-octoprint                      no compat line
amsbr/OctoPrint-EEprom-Marlin                           no compat line
banichow/OctoPrint-Atxpihat                             no compat line
OllisGit/OctoPrint-DisplayLayerProgress                 {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
fabianonline/OctoPrint-Telegram                         no compat line
jneilliii/OctoPrint-BLTouch                             {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
pwnbus/OctoPrint-Progress-Title                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
pokeimon/OctoPrint-ESPurnaRGB                           no compat line
kontakt/Octoprint-Filament-Reloaded                     no compat line
arhi/OctoPrint-gcodestatEstimator                       no compat line
malnvenshorn/OctoPrint-MetadataPreprocessor             no compat line
MoonshineSG/OctoPrint-MultiColors                       no compat line
OctoPrint/OctoPrint-Pushbullet                          no compat line
mikedmor/OctoPrint_MultiCam                             {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
markwal/OctoPrint-GPX                                   no compat line
sysadminsh/OctoPrint-M73ETAOverride                     no compat line
tobeca/OctoPrint-TobecaPlugin                           no compat line
scottrini/OctoPrint-PrusaLevelingGuide                  {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
ozgunawesome/OctoPrint-PCA9685LEDStripControl           no compat line
markwal/OctoPrint-SnapStream                            no compat line
google/OctoPrint-TemperatureFailsafe                    {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
ziirish/OctoPrint-TuyaSmartplug                         no compat line
LMS0815/OctoPrint-hueCommands                           {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
waltmoorhouse/OctoPrint-Filamentstorage                 no compat line
kantlivelong/OctoPrint-PSUControl                       {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-BedLevelVisualizer                  {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
mariolukas/OctoPrint-Hangprinter                        no compat line
amsbr/OctoPrint-Stats                                   no compat line
jasiek/OctoPrint-Cost                                   no compat line
OllisGit/OctoPrint-DeleteAfterPrint                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-RequestSpinner                      no compat line
markwal/OctoPrint-PolarCloud                            no compat line
RomainOdeval/OctoPrint-CrealityTemperature              no compat line
kennethjiang/OctoPrint-Anywhere                         no compat line
xyzaxyz/OctoPrint-Finetunerptr                          no compat line
jneilliii/OctoPrint-MQTTPublish                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-ipOnConnect                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
thijsbekke/OctoPrint-Pushover                           no compat line
quanticchaos/OctoPrint-Webcamsb                         no compat line
jneilliii/OctoPrint-M117NavBar                          {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
cprasmu/OctoPrint-OrviboS20                             no compat line
mtowara/OctoPrint-Gcodebar                              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
synman/OctoPrint-Bettergrblsupport                      no compat line
pkElectronics/OctoPrint-Octoremote                      no compat line
OctoPrint/OctoPrint-CuraLegacy                          no compat line
jneilliii/OctoPrint-M117PopUp                           {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-FixCBDFirmware                      {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
kantlivelong/OctoPrint-GCodeSystemCommands              no compat line
rlogiacco/UploadAnything                                {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OllisGit/OctoPrint-AutostartPrint                       no compat line
jneilliii/OctoPrint-FloatingNavbar                      {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
tjjfvi/OctoPrint-SlicerSettingsParser                   no compat line
dmalec/OctoPrint-OctoGlow                               no compat line
platsch/OctoPrint-Autocalibration                       no compat line
RomRider/Octoprint-Filament-Revolutions                 no compat line
jneilliii/OctoPrint-M117SpeechSynthesis                 {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
deadly667/Octoprint-Filament-Sensor-ng-OrangePi         no compat line
Salandora/OctoPrint-EEprom-Repetier                     no compat line
OctoPrint/OctoPrint-Autoselect                          no compat line
malnvenshorn/OctoPrint-FilamentManager                  no compat line
Patronics/OctoPrint-PrinterAlerts                       no compat line
google/OctoPrint-LEDStripControl                        {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
cesarvandevelde/OctoPrint-M73Progress                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Salandora/OctoPrint-SystemCommandEditor                 no compat line
jneilliii/OctoPrint-TPLinkSmartplug                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
kanocz/octopi_eta_override                              no compat line
jneilliii/OctoPrint-ActiveFiltersExtended               {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
svv2014/OctoPrint-xMatters-integration                  no compat line
EricHigdon/OctoPrint-RGB_status                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OutsourcedGuru/OctoPrint-GitFiles                       {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Salandora/octoprint-customControl                       no compat line
mmone/OctoprintKlipperPlugin                            no compat line
birkbjo/OctoPrint-Themeify                              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
pablogventura/Octoprint-ETA                             no compat line
ieatacid/OctoPrint-GcodeEditor                          {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-Remove-ttyS-Ports                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Sebclem/OctoPrint-SimpleEmergencyStop                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
AstroPrint/OctoPrint-AstroPrint                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-BedLevelingWizard                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
benlye/OctoPrint-ActionCommandsPlugin                   {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Salandora/OctoPrint-FileManager                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-FirmwareUpdater                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
b-morgan/OctoPrint-FanSpeedMirror                       {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OllisGit/OctoPrint-DryRun                               no compat line
bradcfisher/OctoPrint-ExcludeRegionPlugin               no compat line
juniorRubyist/OctoPrint-OctoFlat                        no compat line
chatrat12/layerdisplay                                  no compat line
OctoPrint/OctoPrint-MalyanConnectionFix                 {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
gdombiak/OctoPrint-OctoPod                              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
MrBreadWater/project-kronos-data-collector              no compat line
tjjfvi/OctoPrint-SlicerSettingsTab                      no compat line
malnvenshorn/OctoPrint-CostEstimation                   no compat line
electr0sheep/OctoPrint-Cr10_leveling                    no compat line
marian42/octoprint-preheat                              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
devildant/OctoPrint-ShutdownPrinter                     no compat line
OctoPrint/OctoPrint-Yamlpatcher                         no compat line
markwal/OctoPrint-PortLister                            no compat line
BillyBlaze/OctoPrint-FullScreen                         no compat line
jneilliii/OctoPrint-StatefulSidebar                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
celogeek/OctoPrint-ProgressBasedOnTime                  {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
OctoPrint/OctoPrint-AutomaticShutdown                   no compat line
dipusone/OctoPrint-Pushjet                              no compat line
OctoPrint/OctoPrint-Updatefix-1.2.7                     no compat line
Skiepp/GCodeSuperLaserController                        no compat line
markwal/OctoPrint-ScreenSquish                          no compat line
stefancandrea/OctoPrint-Thingiverse                     no compat line
OllisGit/OctoPrint-AutoLogout                           no compat line
MoonshineSG/OctoPrint-Filament                          no compat line
draagc/OctoPrint-FilamentEncore                         no compat line
MoonshineSG/OctoPrint-Mobile                            no compat line
soundstorm/OctoPrint-BookedScheduler                    no compat line
1r0b1n0/OctoPrint-Tempsgraph                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
richjoyce/OctoPrint-Slack                               no compat line
Renaud11232/OctoPrint-Resource-Monitor                  {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
MoonshineSG/OctoPrint-ActiveFilters                     no compat line
jneilliii/OctoPrint-TabOrder                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
vitormhenrique/OctoPrint-Enclosure                      no compat line
BillyBlaze/OctoPrint-TouchUI                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
aerickson/OctoPrint_RepeatingCommand                    no compat line
ryanneufeld/OctoPrint-EEprom-Marlin                     no compat line
ieatacid/OctoPrint-TerminalCommands                     no compat line
da4id/OctoPrint-MyStromSwitch                           no compat line
OctoPrint/OctoPrint-CommandSplitter                     no compat line
derPicknicker1/OctoPrint-Mmu2filamentselect             no compat line
malnvenshorn/OctoPrint-WebcamTab                        no compat line
jneilliii/OctoPrint-WemoSwitch                          {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
zeroflow/OctoPrint-PauseForUserEvent                    no compat line
aerickson/OctoPrint_Signal-Notifier                     {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Booli/OctoPrint-ActionTriggerPlugin                     no compat line
OctoPrint/OctoPrint-Growl                               no compat line
Peaches491/OctoPrint-Touchtest                          no compat line
drdelaney/OctoPrint-RepetierInformer                    no compat line
jslay88/OctoPrint-Dropbox-Timelapse                     no compat line
tjjfvi/OctoPrint-IFTTT                                  no compat line
jneilliii/OctoPrint-Domoticz                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
hashashin/OctoPrint-OpiTemp                             no compat line
paukstelis/OctoPrint-Cancelobject                       {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
StefanCohen/OctoPrint-Dashboard                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-CustomBackground                    {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
Renaud11232/OctoPrint-Marlin-Flasher                    no compat line
johnnyruz/OctoPrint-OctoVox                             {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
fraschetti/Octoslack                                    no compat line
OctoPrint/OctoPrint-DisplayProgress                     no compat line
jneilliii/Octoprint-STLViewer                           {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
AmedeeBulle/StatusLine                                  no compat line
Red-M/Octoprint-Filament-Reloaded                       no compat line
trunzoc/Octoprint_AutoRemote                            no compat line
jneilliii/OctoPrint-RTMPStreamer                        no compat line
gfk76/OctoPrint-Nexmonotifier                           no compat line
ABL_Expert                                              unsupported host: framagit.org
entrippy/OctoPrint-OctoHue                              {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
tjjfvi/OctoPrint-BetterHeaterTimeout                    no compat line
MoonshineSG/OctoPrint-Autoscroll                        no compat line
eyal0/OctoPrint-PrintTimeGenius                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-DragonOrder                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
ElectricSquid/OctoPrint-PrintTrack                      no compat line
dattas/OctoPrint-DetailedProgress                       no compat line
platsch/OctoPNP                                         no compat line
Pinaute/OctoPrint_FreeMobile-Notifier                   no compat line
MoonshineSG/OctoPrint-TitleStatus                       no compat line
google/OctoPrint-HeaterTimeout                          {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
jneilliii/OctoPrint-TasmotaMQTT                         {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
imrahil/OctoPrint-NavbarTemp                            {'2.6': False, '2.7': True, '3.3': True, '3.5': True, '3.7': True, '3.8': True}
foosel/OctoPrint-DisplayZ                               no compat line

1 Like

Looking good :grin:

Do you have plans to post / host this list somewhere? It would be useful to be able to sort / search.