Werefox Software

A collection of self-hosted services and software

Specifically, this will be a guide outlining how to make an account on the Matrix instance at https://matrix.werefox.dev, but the same general instructions should work for any instance of Matrix.

Open the Client App

This can be any of the different variations of clients for Matrix. In this example, I'll be showing the process for the Riot web client.

Set the Instance URL

Once you open your client of choice, you should generally be presented with this screen. If you're attempting to create an account on a specific instance other than the default “matrix.org”, you will want to select “Other” in Riot, for instance, to be given the option to change the instance you're creating an account on. (If you're using https://riot.werefox.dev, you will not need to do this step)

Fill out Registration Form

Once you change the instance to the desired URL, fill in the credential information as normal.

After you have the registration form connected to the correct instance, you should fill in the necessary registration info.

Recovery Passcode / Recovery Codes

After you successfully create an account, you will be prompted to create a recovery passcode, and you should certainly copy the resulting recovery codes.

If you are using Riot, you will be prompted to create a recovery passcode. This and the recovery codes will be used to recover your encrypted messages should you lose access to your account.


A sample image of the Riot web client after a successful login.

Once you've copied the recovery codes, you should be successfully logged in with your new account. Congratulations!

Using Matrix

These instructions will be made later... In general, if you have questions you can ask me directly. I'm available at:

  • @shadow8t4:matrix.werefox.dev
  • @shadow8t4 on Mastodon at masto.werefox.dev

I'm gonna be honest, I kinda didn't realize it had already been a month. With the current state of things in quarantine, time kinda passes without you really thinking about it. However, a few things were definitely accomplished this past month, so let me get into that.


Since it's kind the end of April and I never gave an April update, this will pretty much serve as a summary for that as well. I'm still working from home at this point, and things are going relatively smoothly for the most part. Overall, I've been really thankful to have my friends on the fediverse and close friends that keep up with me to help me feel less alone (along with my family, of course).

Summary of the month

Development Server Get!

I was able to purchase the parts for a set up a build server for myself, finally. I've been using a really old Dell Optiplex as a NAS/Gitea server and an Intel NUC as more of a “production” server for my various bots/projects/other services. Now I have an ASUS MINIPC to add to that server setup.

Here's a picture of the box it came in

I don't intend to have it do anything other than be a sandbox for development of projects, but it has already become a welcome addition so far!

Here's a picture of the device opened up, with all the additional internals already added

This will likely be used for when I set up a CI/CD with the Gitea instance. That way the “production” server doesn't have to handle building the projects when updates are pushed.

COVID-19 Discord Bot

While I've been quarantined, a friend of mine has been trying to track the numbers of new cases, deaths, etc. for a while and sending us updates in our friend group's Discord server. I thought I'd take the opportunity to make something useful, and wrote a simple bot that sends reports on a timed basis, and on command, with selections available to a specified channel or in response to that command. If you want to see more about that or take a look at the code, it's being hosted on my gitea instance, here.

Twitter Media Tool

Additionally, I got pretty tired of manually updating my various social media platforms and archiving the media uploads from my Nintendo Switch since Animal Crossing New Horizons came out. In order to remedy that, I decided to write a tool that would use Tweepy's streaming API to listen for new Tweets on my account, download any new media posts, and echo them to various services.

Currently, I have the implementation set up to echo posts to Mastodon and a Nextcloud instance I host for myself. However, I intend on having it echo to Discord and maybe other platforms in the future as well.

EB Games Guy

I started an account over on gamestop.store, a new instance that started up this past month full of users that are making pretty awesome parody accounts. I have an upcoming project that I've been working really hard on and hope to release soon. Once I get that out, I also plan on writing an article on the blog talking about the process and some of my ideas and thought process behind it.

Migration to Linode VPS

This last week I also migrated VPS providers from Vultr VPS to Linode VPS. Vultr had been experiencing some weird issues, and I have been meaning to move to a closer VPS solution (the current one was hosted in New Jersey), so I asked for suggestions and settled on Linode. Now, the round time trip for network connections to these services should be much shorter.

Previously, connections would roughly have to travel like this:

[Origin] -> New Jersey -> Texas -> New Jersey -> [Origin]

With the current VPS location, it's closer to this:

[Origin] -> Texas -> [Origin]

Sysadmin Updates to Mastodon

Finally, after quite a while of fumbling about, I was able to give my own account Admin access to the Mastodon instance, and prompty set up a list of instances that we will no longer federate with. Additionally, using the power of the Wayback Machine, I was able to recover the /about/more blurbs from my previous setup of the instance! Hooray!

Further Updates

In addition to setting up the CI/CD pipeline for my Gitea instance, I'm planning on expanding the Twitter Media Tool's functionality a bit more. Past that, plans are a bit up in the air. I'm really glad with how productive I've been able to be the past month, all things considered.

If anyone follows my blog or my updates on social media, they may be interested in knowing how things are where I'm at. I'll give a summary of that and some slightly vague descriptions of what I do and where I am, since I am not very keen to the thought of publicly posting my location or place of work.

Southern “Withdrawl”

Currently, I'm somewhere in Central/Southern Texas. A lot of places have either shut down or shortened their hours and only allowed to-go/drive-thru orders at this point in time to try and combat spreading of the virus. I'm in an area of Texas where there's a bit of an abundance of medical centers, so I don't think we're in a huge danger of not being able to provide for care for the outbreak, that is if people can afford it...

Self-quarantining isn't exactly a popular method it seems. I personally, and my family, have been doing what we can to limit any outside exposure during this time, but I can say with confidence this isn't the social norm down here. A lot of the population seem generally unafraid or uncaring about the disease spreading, and a decent population are still going out regularly. The streets are still somewhat crowded with cars, and the only thing stopping people are the various businesses shutting down, which mainly have been happening because of limitations imposed federally and by our governor.

State of work

Thankfully, the management at my place of employment has been adamant and welcoming of working remotely. I'm not personally in much danger of contracting the virus during work hours, and this seems to be a direction that the customer is working actively towards accomplishing across the board as well, at least over here. There are still a few issues here and there with getting used to this workflow from everyone, but overall things seem to have transitioned fairly smoothly.

Forced Separation – Public Pandemonium

Grocery stores have been constantly out of stock and have long lines. The local ones are even trying to hire more employees to deal with the huge demand. While the public generally seems to act like they don't care much about the virus spreading, they certainly don't reflect that in this case. Additionally, we're already seeing the closure of business bring a lot of people to start applying for unemployment. A bill attempting to help pay for sick leave as well can't come soon enough for us.

On an adjacent note, I'd like to bring up that a lot of the population here lives paycheck to paycheck and has family to support. They cannot handle a month of no business, smaller paychecks, or outright being laid off. It's something that I wish I could help more with, and that I really want to bring attention to in this article.

Stay at home. Stay decentralized.

To conclude this piece, I want to talk about what I think this isolation is going to affect that seems to not be covered much yet in the general media – the unintentional DDOS of centralized services. In an attempt to not use this as a way to say “look how great decentralized services are! Stop using X service!” I want to clarify that this section is more about spreading awareness of a possible future issue and less about trying to advertise a solution.

As we continue to see more and more cities, countries, and nations close their borders and encourage citizens to self-quarantine and isolate themselves, it is inevitable that those citizens will turn to the internet to satiate their social and entertainment needs. Be aware, reader, that the infrastructures created to maintain most internet services are not equipped to handle most or all possible internet traffic at all hours all the time. I would encourage everyone to use decentralized options when possible. Watch a movie on Plex instead of Netflix, post on Mastodon instead of Twitter, Chat on Riot/Matrix instead of Telegram, make a phone call instead of a Discord VC.

This period of time is going to not only be a test of society's ability to distance themselves from others and isolate, but a test of the general Internet's infrastructure capabilities as a whole. And of course, most importantly: – Wash your hands – Stay inside

Hope you all stay safe, see you on the fediverse.

I'm officially back living with my parents temporarily. This was of my own volition, since I am actively looking for a job in the Austin area. Because of that, it would save me quite a bit of money and time to have everything already packed and not be making monthly rent payments. Let's get into the updates.

Summary of the month

More Projects?

Hopefully I'll be able to soon reveal a little web app project I'm working on. I hope people will enjoy it. Otherwise, I don't have a whole lot to say on the progress of personal projects I've been working. Having to pack everything up and move while applying to jobs has really stolen a lot of time from me.

Server Status

I've been slowly migrating most of the services that are being hosted on this domain to Docker containers. This was evident by the recent nuking of the Mastodon instance in order to fix an elusive database error that had been persisting throughout a few upgrades and was slowly making the instance unusable.

Currently, the following services has been containerized and running smoothly for the past few weeks:

Further Updates

I'm still planning on setting up a Gitea CI at some point, but that progress has been a little slowed due to all of the other things I'm trying to tackle at the same time. It's been difficult to keep up with everything, but I'm trying my best. I really am hopeful that I can find something soon in Austin and get back on track to focusing on work, social life, and hopefully some video games (I haven't really played anything other than Pokemon for months).

Effectively, it seems I took a hiatus from posting on the blog. I had to take some time to get thinks straight on my own end. Hopefully, I will be back to doing some awesome projects to write about on here soon.

Summary of the month(s)

A Love Letter from Werefox Software


New Mastodon Who Dis?

As you may have noticed, the Mastodon instance was “nuked” last week in order to fix some issues with the database that couldn't be pinpointed. All previous features should be up and running just fine, but registration is currently closed until I can fill out the about section and ToS once again.

Raspberry Pi LCD

I did another article about the process of setting up a programmable display that could be controlled remotely through a VNC connection in an SSH tunnel. You can read more about it here.

New Year

It has come to my attention that I haven't made a monthly update post since the previous decade. Happy New Year!

It would seem all of the servers were readily “2020 compatible”.

(Alexis laughs, believing herself to be funny by making an old 1990's reference no one her age should even get in the first place)

Future Updates

In the process of the effort of re-establishing Mastodon, the instance was converted to a Docker container instance of glitch-soc. I plan on migrating the rest of the services provided (or as much as possible) to containerized versions as well within the upcoming months, along with establishing a CI pipeline for the Gitea instance using either BuildBot or Kubernetes.

After quite a long pause in content, I have another article! This time I'll be documenting my process for setting up a programmable LCD display of sorts.

The original idea for this was that I wanted some kind of display small enough to be at my desk that could be used to show whatever kind of content I wanted to display for the time being. I received a new Raspberry Pi 4 for Christmas, so I quickly got to work planning how it would be used.

Parts Used

As with the previous article, this project doesn't necessarily have to be completed using a Raspberry Pi 4. The particular display I used works fine with the 2/3/3b(+) models as well.Raspberry Pi 4USB Type C CableUSB Power Brick AdapterMicro SD Card for the OS* – Longrunner Raspberry Pi Touch Screen with Case Holder – An extra computer with access to a microSD card adapter

* As with the last article, it doesn't matter how big the SD card is. Just find a good deal on a good brand and use those. I've recommended the same ones.

Software Used

  • Raspbian (OS image)
  • OpenSSH
  • RealVNC
  • Fail2Ban
  • Remmina (Optional, client for VNC)

OS Installation

If you're following along, I recommend installing the OS and getting the Raspberry Pi up and running before you start assembly of the case and LCD. You can use the cables provided to power the display and connect it via HDMI to the Raspberry Pi when testing.

Using dd on Linux, I flashed the OS image onto the microSD cards each individually. After flashing, I made sure to test the installation by inserting the microSDs into each of the Pis and powering them on. The command was something like: dd -if=/path/to/raspbian.img -of=/dev/sdx && sync

In order to be able to reliably access the device, I once again recommend you go to your router's settings if possible and ensure the device has been given a static IP address. If you are unsure how to do this, try looking up your router's instruction manual.

In order to test the OS, I plugged in the device to an alternate display to ensure that it was working properly. This is because the LCD may require some system settings tuning before it will display properly.

If I remember correctly, Raspbian should already have an SSH server running once it boots. I connected the device to a wired ethernet connection to ensure I could access both it and the internet.

Since this is the first boot of the image, it was set to the default username and password. I followed these directions to change the defaults to my liking.

Once the defaults were changed, I configured my other device that I wanted to use to manage the Pi so that it would be able to connect via SSH using an SSH key. I then configured the SSH server to only allow users to log in using SSH keys, and changed the listening port for good measure.

After my SSH server was configured, I got to work setting up a simple firewall and Fail2Ban. This was configured so that I would only allow connections through ports 80, 443, and my custom SSH port.

I also set Fail2Ban to be fairly strict with the number of attempts when connecting via SSH. This was mainly to prevent snooping from coworkers, staff, or others that may be connected to the same network as the device wherever I took it.

Finally, since this was meant to be a display, I set up a RealVNC server on the Pi to enable remote desktop control.

Screenshot of the active VNC connection to the display.

If you recall, I didn't configure my firewall to allow incoming connections on the default VNC port. This is because I planned on using the Remmina client to connect to the Pi, using an SSH tunnel. That way, I ensure the connection is encrypted and I don't have to open anymore unnecessary ports.


An image of the LCD sitting on my desk at work.

An image showing the back of the LCD with the Raspberry Pi mounted.

This turned out to be a pretty fun little project! I had some difficulty trying to find a way to remotely connect to the display, but eventually found what I think was a pretty elegant solution. I've included some pictures of the device in use, and I think overall it went really well.

Nothing is permanent, it seems. I've been a little busy this month trying to get myself out of the house, dealing with personal issues, and spending time with family for Thanksgiving. I don't really have much to report because of that.

Keeping Things Stable

The most I've been doing is just trying to ensure things on my end are stable as far as the services go. Everything is still up, but upgrading to Mastodon 3.0.0 has proven to be a real challenge for some reason. I'm sure when I bring myself to sit down for a few days and try again I'll figure it out, but otherwise, it's staying on 2.9.3+glitch until further notice.

What I've Been Up To

Mainly, I've just been focusing on my own life. Trying to figure out where to go with my job, where I'm going to go in 2020. It's a little rough right now to be honest, but it's exciting. I'm anxious to see where life takes me in the upcoming year.

Future Updates

I'm still attempting to make some time to do personal projects in my spare time, but I'll admit the latest Pokemon release has taken up a lot of my time! I'll make another update at the end of the year, or whenever something develops. Until then, that's all for this update.

This is a first to me on this blog, I'll be writing an article documenting my process for setting up a security camera system using two Raspberry Pis and a separate storage system.

Parts Used

A note before continuing further: This project can be accomplished using a Raspberry Pi 3 and a Raspberry Pi Zero W. You could also use a Raspberry Pi 4, but seeing as the extra computing power isn't strictly necessary, I'd advise against it unless you're certain you want to invest the extra money.Raspberry Pi 3 (B/B+) (x2) – CanaKit 5V 2.5A Raspberry Pi 3 B+ Power Supply / Adapter (x2) – Micro SD Card for the OS* (x2) – Flirc Raspberry Pi 3B CaseMakerFocus Raspberry Pi Camera Night Vision Camera for Raspberry Pi 3B/3B+ and Pi 2B B+ModMyPi – PIR Night Vision Camera Box Bundle – B+/2/3/3B+ – An extra computer with access to a microSD card adapater

* It doesn't really matter how big the SD cards are, I don't really remember which exact ones I'm using. Just find a good deal on a good brand and use those. I've gone ahead and linked some I recommend

Software Used

Device Setup and OS Installation

I'm going to split the following into two parts, as they can be completed independent of each other. This is the process I did it in while waiting for some parts and logistics to be worked out.

Device Setup

Each of the two devices has a unique job. One will be position inside the house as a storage/hub server, and the other will have the camera module attached and be positioned outside.

Raspberry Pi Hub

For the hub device, I installed the Flirc Raspberry Pi 3B Case. The installation process is fairly straightforward, so I won't go into detail.

Raspberry Pi Camera

For the camera, I had to install the camera and case individually, as the camera came much earlier than the case (the exact model I needed had to be shipped from out of the country). The camera installation is simply an attachment of a ribbon cable and a few screw to hold the IR sensors in place. The case case with its own set of instructions for setup, and was mainly a few pieces of plastic that fit together to form a sealed-enough case. I'd recommend assembling the case with some glue or epoxy to give more of a waterproof seal for anyone attempting this same project.

Note: The only reason I'm using two Raspberry Pi 3s is because I already had them lying around, so it would have just been extra expense for me to buy another one specifically for the camera, and I didn't have anything else for these to do.

OS Installation

I took each of my microSD cards and my downloaded latest release of MotionEyeOS. For the purposes of this project, I used just the “raspberry-pi-3” version.

Using dd on Linux, I flashed the OS image onto the microSD cards each individually. After flashing, I made sure to test the installation by inserting the microSDs into each of the Pis and powering them on. The command was something like: dd -if=/path/to/motioneyeos-raspberrypi3.img -of=/dev/sdx && sync

In order to be able to reliably access each device, I went to my local router's settings and ensured that they had been set to static IP addresses. If you are unsure how to do this part, try looking up your router's instruction manual.

Once it was powered on and I navigated to the IP of each device, I was greeted with a login screen. Login page for MotionEyeOS After logging in, I recommend immediately changing the admin passwords for each device, as well as setting up a surveillance user account for each.

After changing some camera settings on the raspberry pi with the camera, I configured it to be set up to stream the video on the local network.

Video Streaming settings on the Camera Video Streaming settings on the Hub On the hub side, I went to the settings and configured it to view the video stream as pictured above, then set up the stream to be stored on a local SFTP share I had previously configured.

File Storage settings on the Hub I also went and set up some optional motion detection settings and set a time period for how long to keep archived recordings.

Physical Installation

Since the Hub merely needs to be plugged in to be installed (I recommend using a hardwire ethernet connection if possible), I won't be going through how I set it up.

For the camera, I only wanted a front door camera to mainly track package theft. I went through a few different methods of mounting the camera. For my situation, I'm currently renting this house, so I didn't want to screw any bolts or nails that I'd have to pay cover up later. Additionally, the front door area where I wanted to install the camera is mostly brick. This made it difficult to find a way to attach the camera (especially before I ordered the optional case mount).

Eventually, I settled on using some construction adhesive to attach the camera mount to the brick wall I wanted it to be set up on.

Here are some pictures of the completed setup:

An image of just the camera with a bit of the cable. Here's another image a bit more zoomed out... I'm planning on cleaning up that cable management in the future.


I'm really pleased overall with this set up after finishing it. It took quite a while with a few points where I thought it was going to be ready, but encountered minor setbacks. Regardless, this is a fairly inexpensive and useful project. I'll be giving a progress update after a month or so to follow up.


It's going to be another short update for this month. Most of my focus shifted away from the servers and more to things involving my personal life. I installed a new audio rack, which I repurposed as a mini server rack to host the machines running the Werefox Software set of services. Otherwise, it's been a pretty uneventful month.

Summary of the month

GitLab Removal

As noted in the previous update, GitLab has been removed. I became incredibly frustrated attempting to set up a CI pipeline with it, and decided it would be best to only have Gitea be up and running for now.


After the previous update, I managed to get Halcyon up and running again with a simple update of the config.ini file.


I've taken up streaming over the past week or so. My happy schedule seems to revolve around Tuesdays and Thursdays at 7:30 PM CST. If you're interested in stopping by, here's the link again: https://twitch.tv/Shadow8t4_Games


Delving slightly into my personal life, I went ahead and set up Pi-Hole on my local network at home. It's awesome, highly recommend it.

Future Updates

I'm actually hesitant to say that I have any future updates on my mind at the moment. Mainly concerned with doing some maintenance here and there, and continuing to keep up my blog, streams, and personal life habits. It's been difficult to balance the free time I have and find some more time to flesh out my portfolio work (and my portfolio site), so hopefully that can be my next shift of focus once I settle into more of a rhythm with this month's changes. That's all for this update.

Enter your email to subscribe to updates.