You must think you're clever. Take a few days to think about what separates you (specifically) from the toxic "PC Master Race" evangelists, and maybe fornicate some greenery.
Install Termux, then use either the dig or nslookup command to query the DNS name, and check which DNS server is queried. If it's the private server's address, you might be having connectivity issues. If it's 100.100.100.100, the resolver is still trying to query Tailscale's MagicDNS.
Niri has a feature like that, but a little different since it's a scrolling tiler. A column that contains two or more windows can be switched to tabbed mode, which displays one window at a time with full height, but you can't have a tabbed group that is a member of a column, only full tabbed columns.
A while ago, I wanted to try Home Assistant. Then I realised that I didn't have a single thing to use it with. The locks are mechanical, the lights are simple LEDs, the irrigation system is manual, my car has push buttons, and I live in a safe enough area (by European standards) to not need doorbell or security cameras. Nothing I own depends on any external services other than the electric transformer down the street.
Probably. If that setting is enabled, Android (including Graphene) defaults to 8.8.8.8 if the higher-priority DNS servers (manual or received from DHCP) don't support DNS-over-TLS or DNS-over-HTTPS.
Proxmox is my number one choice. It's based on Debian, and has an excellent, extremely straightforward web UI for managing virtual machines and LXC containers.
It's perfectly reasonable from the perspective of corporate scum: take away a standard feature, then sell it back as an extra. As far as I know, the modem still had UPnP for applications that rely on it.
I finally got my ISP to enable bridge mode on my modem.
I also learned that I didn't lose port forwarding and related services because I had been moved behind CGNAT or transitioned to IPv6 -- they simply no longer offer port forwarding to residential customers. Ruminate on the implications of that statement so I'm not the only one with blood pressure in the high hundreds.
Even in the open source community, the libre-ness of a product is just one of many factors. The fitness for a purpose, the initial difficulty of the setup, the continuous difficulty of operation and maintenance, the pace of development (if applicable), the professional or community support structure, the projected longevity of the product or service, and the general insanity of the people involved are all important factors that can, and often do outweigh the importance of open software.
I think I see where your confusion comes from. Either that or you are writing programs with willful and reckless disregard to the importance of standards.
A process (or program) has multiple outputs. The return code is a one byte value that is set by the process when it ends, and often checked by the parent process (interactive shell, script, program) to make decisions regarding the flow of control. This value is severely restricted in its usefulness, to "provide data". The type (unsigned byte) limits the range and precision, and you can't write to it asynchronously or before you're ready to gracefully end the process. The name is deceptive: this is not the same kind of "return" as the return instruction in programming languages. It simply describes the way a process ended, nothing more. It should never contain meaningful data, and always adhere to the POSIX conventions.
Why? Because everybody does. More than that, everybody writes programs that expect a return code of zero to mean success, and a return code other than zero to mean failure. It was decided before I was even born. It's an implicit agreement that we adhere to (except Powershell because they're special). Deviation from this will only lead to compatibility issues and confusion.
If you want to convey meaningful data, you should use an output stream. The POSIX standard states that programs should communicate using strings, and that the standard input and output streams should be used for this unless other methods are needed. If your program produces meaningful data and you want to convey it to the parent process or another program, you have to write it to stdout, and the other program has to accept it via stdin. This exchange is facilitated by the shell through the pipe and redirection operators. It frees up the return code to meaningfully indicate the exit state of the program without mixing it up with the data produced by it, and once again, it's what everybody does, and what everybody expects.
To be pedantic: there is no such thing as a boolean value. It's all just bytes and larger numbers behind an abstraction that allows a higher-level programming language to implement Boolean algebra by interpreting numbers a certain way. One such abstraction is the POSIX convention of treating a return code of zero as success and everything else as a failure. This consequently defines how Boolean algebra is implemented in POSIX-compliant shells:
The if statement tests the return code of the command specified in the header, then executes the then branch if the return code is zero, the else branch otherwise.
The while loop similarly tests the command in the head and executes the body if its return code is zero.
The boolean && and || operators treat zero return values as true and nonzero return values as false. Go try it out.
Even the true and false commands are just programs that immediately return 0 and 1 respectively.
If you start treating nonzero return codes like a success value with meaning, the only thing you'll achieve is that your scripts won't be compatible with the shell. stdout exists. Use it.
Local Unbound with Tailscale's split DNS has been solid for me. I use it as an OPNsense service with the web GUI, but the standalone YAML config looks simple enough.
You must think you're clever. Take a few days to think about what separates you (specifically) from the toxic "PC Master Race" evangelists, and maybe fornicate some greenery.