While not talked about on HN as much, the big corps doing monorepo use something like Perforce which has "protects" tables allowing very granular access control
WHMCS is probably the easiest batteries-included tool for the job, giving billing, management, and a customer support portal. These could be unbundled or reinvented but for your average hosting company there's no point in doing so.
It's C++ programs in a Userscript format, which are compiled with a bundled instance of clang. Windhawk shows diffs of version changes, and most programs aren't much longer than a couple dozen lines, so pretty easy to visually verify
And it's not even all of the government, plenty of counties and even their departments have random domains leaving you wondering if it's just an elaborate phishing attempt
My hope is that once he figures out the CLR host for Mac that he'll also come out with a Linux version of LPRun, since I want to automate some of my scripts on a cheap Linux VPS instead of a local windows scheduled task on my PC
Many older .NET applications saved programmers from this by providing "C# scripts". The framework includes the compiler and then it's trivial to use the compiled artifact. You can still do it by including the Roslyn libraries. I don't see it as much anymore, or it's some half-baked Python or Lua interface.
The new Roslyn incremental generator API is pretty good these days but not well documented yet. I’ve been using it with json-schema to save a lot of boilerplate and provide a more intuitive declarative framework in a large side project.
As a fellow 2012 Denon owner (AVR 3313) you can probably remove the RPi and just use HTTP. Just use devtools on your browser to do an action in the web UI and see what request it sends, then replicate it in shortcuts.
And there's a internet radio capability built in - you have to pay $20 or so a year for it but it should be easy enough to set up a competing service since it uses unencrypted HTTP - probably just a matter of reimplementing the protocol and then DNS redirect.
What I originally wanted was just a better web interface. Mine is an AVR 1913, and the web page served by the receiver is kind of slow. The shortcuts came later.
I did indeed look at the requests the browser made when on the receiver's web pages. I also used packet sniffing to see what the Denon app on my phone did.
I then wrote a simple web page that just showed current status, and had big buttons for the three sources I use, and for mute/unmute, and for several volume levels, and used JavaScript on that page to send requests to the receiver.
That's when I learned about CORS. The receiver does not send CORS headers, and browsers take that to mean that scripts running on pages that do not come from the receiver should be blocked from receiving any data back.
For the commands to change source, mute, and volume that was OK. They are simple GET requests with the change as query parameters. They could be done without triggering a CORS preflight check. Whether or not the browser blocked the response didn't matter.
Not so for getting status.
That's when I switched the approach from the web page using JavaScript to talk to the receiver to having it be a form and having the web server talk to the receiver. The web page source looked like this:
<?php
...a bunch of functions to control the receiver
...code to process the form and invoke those functions
?>
...the HTML for the web page
Later when I realized being able to control the receiver from shortcuts would be nice, it was a simple matter to copy the web page source, delete the HTML, replace the form processing with command line processing, and have a command line script for controlling the receiver, and then use the run script via ssh shortcut action to invoke it. It never even occurred to me to consider issuing the commands directly to the receiver from the shortcut.
I just gave it a try, using the "Get Contents of URL" action to GET the URL http://ip_of_receiver/goform/formMainZone_MainZoneXml.xml and it worked. It gives back a blob of XML that includes the data I care about (source, mute, volume).
On my Mac I'd probably handle that by passing the XML off to a script to extract that data. I'm not sure how I'd do it on an iPhone or iPad.
There are commands to get individual data items such as the volume whose results might be easier to deal with, but I'm not sure they can be used from shortcuts. They are POST requests to /appCommand.xml, with the command (or commands if you want to batch commands) in XML in the body. For example to get the volume you post
The "Get Contents of URL" action does support POST, but the only options it gives for the post data are JSON, Form, and File. For JSON and Form you give it name/type/value triplets and have no direct control of how the post data is formatted. Maybe file would work to get the XML the receiver wants sent but it probably won't have the right content type. I have no idea if the receiver would be OK with that.