I Switched My Operations to Caddy Web Server

Good Morning from my Robotics Lab! This is Shadow_8472, and today I am rebuilding my home server, Button Mash, from the operating system up. Let’s get started!

Caddy Over Nginx

I spent well over a month obsessing over Nginx, so why would I start over now? As far as I am concerned, Caddy is the piece of software for my use case. While I am sure Nginx is great at what it does, I keep slamming into its learning curve – especially with integrating Let’s Encrypt, a tool for automating SSL encryption (HTTPS/the green padlock). Caddy builds that functionality in while still doing everything I wanted Nginx for.

The official Caddy install instructions [1] for Fedora, Red Hat, and CentOS systems are as follows:

$ dnf install ‘dnf-command(copr)’
$ dnf copr enable @caddy/caddy
$ dnf install caddy

First of all, new command: copr. Background research time! COPR (Cool Other Package Repositories) is a Fedora project I feel comfortable comparing to the Arch User Repository (AUR) or Personal Package Archive (PPA): it lets users make their own software repositories.

Installation went smoothly. When I enabled the repository, I had to accept a GPG key that wasn’t mentioned in the instructions at all. From a user point of view, they appear to fill a similar purpose here to a SSH keys: special numbers use math to prove you are still you in case you get lost.

Caddy uses an HTML interface (a REST API – Don’t ask, I don’t understand myself) on the computer’s internal network known as loopback or localhost on port 2019. Caddy additionally serves everything over HTTPS by default. If it cannot convince Let’s Encrypt to give it a security certificate, it will sign one itself and tell the operating system to trust it. In other words, if I were not running ButtonMash headless (without a graphical interface), I’d be able to try connecting to localhost:2019 with a favorite browser, like at least one of the limited supply of Caddy tutorials did.

IP Range Transplant

I should have just done my experimentation on DerpyChips or something. Instead, I pressed on with trying to point a family-owned domain name at Button Mash. This side adventure sprouted into last week’s post. In short: ButtonMash’s static IP kept was in conflict with what my ISP-provided equipment kept trying to assign it, resulting in an estimated 50% downtime from a confused router. Upgrading to the next gateway may have allowed us to free up the IP range for the gaming router’s use, but it’s not out for our area yet. My father and I switched our network connections over to a “gaming router” we had laying about and enabled bridge mode on the gateway to supposedly disable its router part. I have my doubts about how it’s actually implemented.

Most of our computers gladly accepted the new IP range, but GoldenOakLibry and ButtonMash –having static IP’s– were holdouts. I temporarily reactivated a few lines of configuration on my laptop to set a static IP so I could talk with them directly and manually transfer them over to the new IP range, breaking NFS shares and Vaultwarden on them respectively.

In the confusion, ButtonMash lost its DNS settings; those were easy enough to fix by copying a config line to point those requests to the router. GoldenOakLibry took a bit longer to figure out because the NFS shares themselves had to accept traffic from the new IP range with settings buried deep within the web interface. Once that was sorted, I had to adjust the .mount files in or around /etc/systemd/system on several computers. Editing note: While trying to upload, I found I could not access GoldenOakLibry on at least a couple of my machines. Note 2: I had to change the DHCP settings to the new IP range on my Raspberry Pi reverse Wi-Fi router. Systemd on both goofed systems needed a “swift kick” to fix them.

sudo systemctl start <mount-path-with-hyphens>.mount

Repairs Incomplete

That left Vaultwarden. I was already in a it’s-broken:-fix-it-properly mentality from the modem/router spinoff project. I got as far as briefly forwarding the needed ports for an incompletely configured Caddy to respond with an error message before deciding I wanted to ensure Bitwarden was locked down tightly before exposing it to the Internet. That wasn’t happening without learning Caddy’s reverse proxy, as I put Vaultwarden exclusively onto a loopback port.

Speaking of loopback, I found the official Caddy tutorials lacking. They –like many others after them– never consider a pupil with a headless server. I have not yet figured out how to properly convince my other computers to trust Caddy’s self-signed certificates and open up the administration endpoint. That will come in another post. I did get it to serve stuff over HTTP by listing IP’s as http://<LAN address>, but Bitwarden/Vaultwarden won’t let me log in on plain HTTP, even over a trusted network and confine the annoying log to a file.

As far as I can tell, the administration API on port 2019 does not serve a normal web page. Despite my efforts, the most access I have gotten to it was for it to error out with “host not allowed.” I haven’t made total sense of it yet. I recognize some of the jargon being used, but its exact mechanics are beyond me for the time being.

Takeaway

Caddy is a powerful tool. The documentation is aesthetically presented and easy enough to understand if you aren’t skimming. But you will have a much better time teaching yourself when you aren’t trying to learn it over the network like I did.

Final Question

Do you know Caddy? I can tell I’m close, but I can’t know for sure if I’m there in terms of the HTTP API and just don’t recognize it yet. I look forward hearing from you in the comments below or on my Discord server.

Works Cited

[1] “Install,” Caddy Documentation. [Online], Available: https://caddyserver.com/docs/install. [Accessed: June 6, 2022].

Patience is a Virtue When Internet Breaks

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

It’s the last Monday of the month. I should have a larger project this week, but I had to split a step off into a prequel of sorts when it ballooned on me. For reasons I will go into next week, I ended up talking with tech support for my Internet provider.

It all started when I logged into my router’s off-site network settings (WHY??? is this a thing?) so I could forward a couple ports to Button Mash, my home server, when I noticed it alternating between two internal IP’s: the static IP I configured it to call itself and another one I thought was assigned to another [possibly decommissioned at present] Raspberry Pi – or it may have been a setting I never fully cleaned up. I have no way to tell.

Additionally, I learned that the online toy they’re having me use to try and manage the network is being retired. They want me to use their app I don’t want on the phone I don’t carry. No thanks. I’d rather move my whole network over to this 3rd party gaming router we have on hand.

Support Begins

Friday before posting: On my first session with support, I got a live agent after complaining to their help bot that it hated me. When I shared how I wanted to use my own router, the agent mentioned “bridge mode,” an option I had noted in the gateway’s admin panel. We continued by poking at my Manjaro workstation’s 10 Mbps connection speed with little luck because I was using a different computer.

Sunday: I got into chat with an agent on my now 3.5 Mbps connection. To not-my surprise, the obligatory reboot everything between me and the Internet didn’t change much. I told him no fewer than two or three times that I was on desktop, not phone; I do not have mobile data to remain connected; no, I do not think my family is interested in a coupon for this streaming service you’re offering; this is my one and only means of connecting to you. I followed my given instructions and pressed a button on the back of the gateway for an unusually long time. The Internet did not come back on.

Level 2

My father called a number given to me by the second chat agent, and we were connected with an awesome “Level 2” agent who could follow along as I described my unique home network while repairing the damage done by a factory reset. When bridge mode came up, I figured we might as well fix it how we want if it’s already broken and we have a professional on the line. He had some sudden technical issues of his own an hour plus into helping us.

We called back and got someone whom I had to remind a couple times that Debian 10 does not mean Windows 10. Nevertheless, he got the idea through to us that moving/disabling the default IP range was not a feature our gateway supports. I read something as much in a forum post; it said something about Layer 2 network devices, but that’s homework for a future topic.

The first guy called back just as I was giving into despair with the second guy. Long story short: our network is at around 80%; ButtonMash and GoldenOakLibry, our server and network storage, are configured with static IP’s and don’t show up at all right now. The awesome agent suggested upgrading to the next router, which might not be hard coded to serve its default IP range, allowing me to swap IP ranges between gateway and router. I don’t want to manually configure all my computers to find GoldenOakLibry at a new IP.

Takeaway

A lot of going through tech support as a customer is about explaining your exact situation to however many agents you may come into contact with.

Special thanks to Mr. E on my family’s personal Discord server for the suggestion of disabling the gateway’s integrated router.

Final Question

Have you ever had tech support struggling to keep up with you?

I look forward hearing your answers on in the comments below or on my Discord server.

I Battled My Sister’s Blinky Monitor

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

Did I Fix the Graphics Card or Not?

My sister’s computer has had its second monitor blinking intermittently. It’s been frequent enough to be annoying, but rare enough to be infuriating to diagnose. Over the months she’s had it, we’ve tested out the screens and cables. I’ve even booted it to one of my Linux drives for another project and it still blinked, so it’s not Windows’ fault. The next thing to test is the graphics card.

My sister’s graphics card has two HDMI ports for her screens and a DVI port she has set up with an HDMI adapter to a drawing tablet. I swapped it out for one of mine for a couple days, configuring one of my workstations for triple screens and played some games on it. As it continued to hold up, our theory evolved from the card being defective, to it not getting enough power in her computer as my power supply was a little stronger than hers.

We picked up a new power supply on discount, but I restored our original configuration for over the weekend to see if maybe something I wasn’t controlling for –but did nonetheless– was the cause, like a buggy driver (unlikely, given it was previously replicated in Linux).

The graphics card behaved without the new power supply up until just over an hour and a half before posting today. Our best guess was that the power cable wasn’t properly seated. Her card takes an 8-pin connection, but it’s being fed by a 6+2 connector. The extra two pin piece could easily have been dislodged slightly some time ago, causing these problems. The search continues. The next step is to replace the power supply and see if that helps. If the card continues to misbehave, we may try the card switch again for a longer period of time.

Takeaway

While swapping the cards to begin with, I didn’t keep track of the screws as well as I should have, but someone strongly recommended a bowl. While returning our cards to their proper towers, I relented and my dog decided to walk off with it while I wasn’t looking. It only had a couple screws for the outer case when he took it, and I found it in the other room with some new tooth marks and a wet spot. We recovered one screw off the floor, and the other from under the couch. Next time I mess with computer parts, the bowl goes out of his reach.

Final Question


Have you ever faced one of your creatures eating [part of] a project?

I look forward hearing your answers on in the comments below or on my Discord server.

My Father Hacked Discord onto Debian 11

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

Forcing Discord

I worked with my father on his Debian 11 (Bullseye) computer this week. The program he’s been missing the most has been Discord, the chat platform. The official .deb package relies on a library package called libappindicator (or similar) despite it being depreciated. Ironically, this happened so long ago, the change has now made it to the stable branch of Debian. Discord, PLEASE look into this!

Feeling optimistic, we redownloaded Discord and installed it with dpkg. The Apt package manager wasn’t happy with this arrangement, and wanted us to

sudo apt-get --fix-broken install

where it said it was going to remove Discord. We launched Discord anyway; it worked.

The missing dependency would still be a problem though, so I looked into reinstalling while telling apt to ignore it. Before I finished researching that solution though, I found a repository on GitHub set up by user Guna [1]. This individual replaced the dependency, a procedure I have tried and not succeeded at. You can read more about the repository’s precautions under in SECURITY.md under the project’s root level directory. Many thanks.

Projects Around LXDE

LXDE is a desktop environment aimed specifically at people who don’t want to spend excessive system resources on a flashy user interface. Our experience with it would suggest it is not for beginners as a few annoying tidbits require beating into submission.

The first annoyance we fixed was the panel along the bottom hiding itself. While looking through some the panel’s settings as part of an unrelated issue I spotted a relevant tic box to make it stay.

While multiple desktops may be a great way to organize a swarm of windows, not everyone thinks in terms of them. LXDE came configured with a mess of shortcuts you can accidentally trigger, leaving yourself stranded in the wrong desktop workspace. To fix this, we followed a guide [2] to a file called ~/.config/openbox/lxde-rc.xml and specified 1 desktop instead of 2.

Similarly, volume and mute keys are often taken for granted. While following a guide on wiki.lxde.org [3], we copied a block of configuration code into the same ~/.config/openbox/lxde-rc.xml file as above and modified it per instructions for PulseAudio. In theory, it links appropriate keyboard button presses to corresponding events within the system. Mute cooperated, but the volume keys refused to work until we were almost zeroed in on the problem. Our problem vanished while playing around with commands based off where the script was actually trying to set the volume. At least it sticks around through a reboot.

Takeaway

There remains one thing we have yet to figure out: getting Ctrl+Alt+t to open a terminal. A keyboard shortcut list from around 2020 listed it, but perhaps something changed since then.

Final Question

Let me know what you think: Why might LXDE have solved itself? What is with the terminal keyboard shortcut not working? I look forward to hearing from you in the comments below or over on my Discord server.

Works Cited

[1] Guna, “discord-debian-bullseye” github.com, Feb. 18, 2022. [Online]. Available: https://github.com/gunalabs/discord-debian-bullseye [Accessed: May 16, 2022].

[2] “Help:Configuration”openbox.org, May 1, 2018. [Online]. Available:http://openbox.org/wiki/Help:Configuration#Desktops [Accessed: May 16, 2022].

[3] “LXDE:Quesions”wiki.lxde.org, Feb 27, 2017. [Online]. Avalable: https://wiki.lxde.org/en/LXDE:Questions#How_do_I_make_my_special_keyboard_buttons_.28mute.2C_volume.2C_screen_brightness_….29_work.3F [Accessed: May 16, 2022].

My PopOS Upgrade was Surprisingly Smoothly

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

The Linux Development Cycle

System76 released PopOS 2022.04 LTS for April, 2022. Both PopOS and its upstream distributions Ubuntu and Debian, follow a release cycle where software changes accumulate over time until they are bundled and published together so end-users aren’t bothered with little updates potentially breaking sensitive applications all the time. Ubuntu (and subsequently PopOS) release new versions every six months with very little overlap.

LTS releases are special because support for them lasts far longer. This makes for a more stable platform for developers and end-users, and a larger base of compatible software grows as a result. All this is at the cost of some applications being sorely outdated toward the release’s end of life.

Derpy’s Upgrade

Derpy Chips, one of my desktop workstations, runs PopOS on an LTS release. While Canonical may support several Ubuntu LTS versions at once, System76 does not extend the same policy to PopOS. And so, I went along with the upgrade.

Based on my father’s difficulties installing Discord on Debian 11, I expected it might not work with the new PopOS either. My difficulties were elsewhere. MultiMC was all but gone, I had a few things to re-customize, and the sound stopped working for Nodecore a block game I’ve been playing that runs on the Minetest engine. I originally had to install it from a snap package for version compatibility reasons, but the new repositories had the same version I was already using before the upgrade, and moving away from the Snap fixed my sound issues. I moved my game files around, but it was nothing I wouldn’t trust an adventurous, new Linux user to figure out within a couple hours.

Changes to KDE, my desktop environment, were the most noticeable. The upgrade introduced a number of useful features I’ve been enjoying on Manjaro like split terminals and annotations for screenshots, while also bringing over a wider style of panel menu I don’t particularly care for, but don’t hate enough to revert myself.

Takeaway

Major upgrades carry the potential to break software, but this time has been painless besides reinstalling a couple programs. I was able to upgrade on my own terms

Final Question

Are there any features you’ve been excited to find after an update? I look forward to reading your answers in the comments or on Discord.

My Raspberry Pi 400 Runs Android

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

Android Practice

I have been going without a smartphone for a while because I don’t accept Google’s terms of service. Apple is no better. The only option I’ll be happy with is one with nothing but open source software at its heart.

Unfortunately, 3rd party Android builds like LineageOS are infamously difficult and potentially a little unforgiving to install yourself. I need practice, which is why I installed an unofficial LineageOS build for the Raspberry Pi a couple months ago – right before I made an incomplete mad dash for assembling Button Mash into a proper home server.

I used balena Etcher to safely install a build of Android made for the Raspberry Pi 4 lineup built by Konsta [1].

The initial boot was a bit longer than reasonable, and there were some impressive graphical glitches I have never been able to reproduce since. It was a little wired using a mouse with Android menus – especially since I had no way to switch the mouse buttons to a more comfortable lefty configuration. My greatest impression was that there was nothing to do besides browse settings and the file system.

I wanted something a little more to present today, so I installed F-Droid, an app store for open source apps. The challenge wasn’t so much installation, but loading the .apk installation file where the file browser could see it. I had to plant a directory from within LineageOS and use the find command to locate it. Before moving the SD card back to the Pi 400 again, I changed the owner from root to the number 0 and made sure it had the needed permissions. Installation was smooth after that.

Only while doing this writeup did I realize this build was Android TV based. I expect to revisit this project with the correct installation.

Takeaway

I have no idea if this is supported at all beyond the efforts of KonstaT, or if it’s even anything more than a tech demo. While I would not recommend using a setup like this long term, it is still an excellent learning tool for where I am at right now.

Final Question

Have you ever used Android on something other than a smartphone or tablet?

I look forward to hearing your answers in the comments below or on my Discord server.

Work Cited

[1] Konsta, “Raspberry” konstakang.com, 2022. [Online]. Available: https://konstakang.com/devices/rpi4/. [Accessed May 2, 2022].

I Built a Model Telegraph

Good Morning from my Robotics Lab! This is Shadow_8472, and today I am building a model telegraph. Let’s get started!

The First Telecommunications

The electric telegraph was invented not long after the discovery that electricity and magnetism were two faces of the same fundamental force of nature. While the image of someone tapping out a message in Morse Code may involve the more iconic piece of hardware –the key– the real heart of the technology is located in the sounder: an electromagnet controlled from miles away. This was what powered the first ever near-instantaneous telecommunications networks crossing America and later the world.

Only limited by the speed of an operator and final delivery, a message from the front lines of the American Civil War could reach Abraham Lincoln in hours or minutes instead of potentially days. It put the Pony Express out of business almost before it got started. It remained unchallenged until Alexander Graham Bell invented the telephone by sending enough information over the wire to reconstruct a human voice – and in fact, smartphones and other personal computing devices still contain the humble electromagnet to deliver convert electrically encoded messages into sounds we can understand.

3D Printed Telegraph Key and Sounder

This project was sparked a post by Mattosx on instructables.com[1]. I’ve already spoken about the issues I had printing this project. Between all the totally failed prints, a case of broken filament, and the slightly peeled pieces, I am lucky to have two sets of parts, though some may need reprinting.

Researching a Group

I have always been at least passively curious about learning Morse. I started seriously looking into it this month. Who all still uses dots and dashes to communicate? Ham radio operators, mostly. I neither have the equipment nor the desire to get the license I would need before participating in clubs using Morse over CW (communications waves).

While musing that I might connect my telegraph over the Internet, I came across Morse KOB on GitHub, apparently the only software tool out there for such a purpose. I reached out to Ed Silky, the only developer I could find contact information for. I figured I might as well so I eventually have a point of contact by the time I finish the Instructable. He responded by the next morning.

Ed shared a wealth of information I had only started piecing together. He called my attention to a critique in the Instructable’s comments, that the sounder doesn’t signal the end of a dot/dash clearly as or distinctly from the beginning of one. Ed warned, “Also, be aware of the differences in the alphabet between American (Landline/sounder) and International (Shortwave/tone / Light) code:” and listed eleven characters and all ten digits with their differing encodings; the earlier American Morse features such things as intra-character spaces and extended dashes – making a properly functioning sounder crucial to understanding American Morse in particular [2].

Assembling the Key and Sounder

Mattosx’s Instructable looks great… until you’re actually part way into assembling the thing. The first red flag is a privated video titled “3D Printed Telegraph Sounder Video” with no written instructions outside the parts list.

The Instructable I’m following is crippled, but I’m limping through it. The 3D modeling isn’t the cleanest on a couple parts – and in fact is missing a piece on closer inspection. I had to creatively chop the parts apart in Slic3r to get them to fit on my damaged bed. Without that video on the sounder assembly, we had to guess at the size of magnet wire, what direction the disks were pointing (in or out), even what order to assemble the different parts in. It’s an interesting idea to make the sounder handle its own electromagnet, but that optional part is unapproachable without any experience working with circuits.

My father and I wound the electromagnet over several sessions, with the internals getting progressively less tidy as mistakes compounded upon each other. By the end, I was just trying to fill in low spots. We hooked it up to two D cell batteries by hand and nothing. We tried a multimeter, but that turned up busted, so I’m left with a project to continue some time in the future.

Takeaway

Based on my incomplete attempt to build this thing, here are my recommended modifications (note that I have not actually tried these yet):

  1. Install magnets, using sandpaper to make the holes a little bigger if need be.
  2. Screw in and wire up the key base before installing the key.
  3. For the sounder electromagnet, search out some sort of spool winding tool to print.
  4. Start with the nubs facing outward instead of inward.
  5. Dry fit the spool so the upper plate lines up with the tops of the base’s posts.
  6. Use a power screwdriver to grab the screw right where the upper plate would otherwise land.
  7. Once you have the electromagnet wound, assemble the top of the sounder.
  8. If all the screws are so loose they fall out, use a snip or few of magnet wire to crowd the screw hole (untested, but this might be a good use for any lines of filament extruded as part of bed leveling prints).

This was my first larger monthly project. It didn’t meet my personal deadline of having a working model to post today because I failed to plan. I only had magnets in hand with a week to go, and I didn’t leave myself any time to diagnose problems as they came up. I now have another project to cycle through as time allows.

Final Question

Have you ever made an electromagnet by hand before? I look forward to hearing your answer in either the comments below or on my Discord server.

Works Cited

[1] Mattosx, “3D Printed Telegraph Key & Sounder,” instructables.com, (no later than March 12, 2019 [3]). [Online]. Available: https://www.instructables.com/3D-Printed-Telegraph-Key-Sounder/ [Accessed April 25, 2022].

[2] E. Silky. “Re: MorseKOB,” “Re: Telegraph Build,” Personal emails (April 7, 2022 to April 22, 2022).

[3] T. Nardi, “Old Meets New In 3D Printed Telegraph,” hackaday.com, March 12, 2022. [Online]. Avalable: https://ieee-dataport.org/sites/default/files/analysis/27/IEEE%20Citation%20Guidelines.pdf [Accessed April 25, 2022].

3D Printing: Trial of Errors

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

I have been 3D printing parts for this month’s large project, but things haven’t been easy.

Keeping my print bed level is probably chief among my challenges. I keep having adhesion issues from the bed being too low and squishing issues where there’s no room between the print head and the bed to lay down plastic – sometimes on the same piece. I’ve been using a pattern that prints concentric squares a test, but sometimes I follow up a successful test with a production print that only leaves a little residue so thin it doesn’t scrape up properly.

Even when the first layer sticks, prints can still peel part way through the print. One piece came out mostly fine except for one malformed corner that may be fine. I’m re-printing because I’m after a second set anyway.

The most exciting failure was when I had three black pieces successfully on their way, and I noticed when there was already a sizable gap between parts and print head. I aborted the print. The filament was stuck; it wouldn’t go in or come out, even at temperature.

I took the print head apart, I found the chewed up filament almost broken off. It refused to come out, even when I yanked on it with the pliers. I wound up trimming what I could get at and ramming the rest through with with an Allen wrench. I never got a positive identification on the clog, but as the plug gave way all at once, I remembered a fuzzle I spotted riding on the filament, and I thought nothing of at the time. I followed it up with a little cleaning filament for good measure.

I took the opportunity of the disassembled print head to at least check my flow rate. The machine wanted the extruder to be at least 160 degrees C. I advanced my e-steps ten times and got a 100 mm segment, give or take a millimeter. Assuming it was trying to advance a centimeter at a time, my printer is healthy in that regard without me having to do anything.

Final Question

What is your most entertaining manufacturing mishap?

I look forward hear your answers on in the comments below or on my Discord server.

Site Maintenance: Forums and Privacy Policies

Good Morning from my Robotics Lab! This is Shadow_8472 with a side project of the week. Let’s get started!

BbForums

This week, I took another look at this website. If I’m going to promote open source and privacy respecting software whenever possible, I best be prepared to lead by example. WPForums Lite was the forums plugin I was shepherded into along with Monster Insights and OptinMonster, two plugins I do not feel OK running. As effective as I hear they can be, it’s not worth my principles. I’m looking into alternatives.

Finding an analytics plugin is proving tricky – a side project for another time. Long story short: the most promising alternative needs me to arrange off-site data storage.

Forums, on the other hand, are now open for business. I’m currently working with bbPress, a forums plugin for WordPress developed by the same team using the same open source principles. You may have also noticed a new navigation bar I needed to expose a test forum. I expect it to change as I learn more about web development. Special thanks to Commander Stryker for helping me bug test it.

User Data Privacy

Since I started this blog, legislation to regulate the collection and sale of user data has been passed in the EU (GDPR) and California (CCPA). While I believe neither applies to me specifically because I’m not advertising in the EU and am not selling anything, respectively, I want to build my site to respect the principles of privacy anyway.

This week also saw me working over the privacy policy with another plugin. I believe I got it passable, but it’s still subject to further development.

Final Question

Do you know of a good open-source, privacy-respecting analytics plugin for WordPress?

I look forward hear your answers on in the comments below or on my Discord server.

A Brief Announcement

Good Morning from my Robotics Lab! This is Shadow_8472, and today I would like to talk. Let’s get started!

I want to interact with my readers and grow the community. That’s why I’m launching Shadow’s Robotics Lab on Discord, where you can talk about your tech projects, exchange help with Linux support, or just hang out.

On the flip side, I’ll be saving my main projects for the last Monday of every month with side projects other weeks.

If you want the nitty gritties about all my projects as I work on them, then join Shadow_8472’s Robotics Lab on Discord.

Final Question

How long have you been a reader?

I look forward to reading your answer on my Discord server.