Demo sites
In addition to the various open source projects I have contributed to over the years, I have a portfolio of demo sites available to show my work. These range from a legacy project which was years in the making, to projects which I have thrown together in a few days which I continue to improve upon, to projects which are ongoing and involving much work. These projects include:
- NIXBase - An advanced legacy PHP/Zend/DataTables project years in the making.
- Job Application Tracking App - An application which grew out of my keeping track of jobs for which I had applied, replacing a Google spreadsheet.
- Heimdallr - A long term vision of mine, which I hope will simplify some of my system/network administration tasks.
- MEDUSA - A membership management site I help support as a volunteer.
As if I don't have enough to do, here is a project currently trying to escape my brain through my fingers to see daylight.
And since software development does not take place in a vacuum:
In addition, I have written a number of blog posts on this site which can often talk about my software development efforts.
NIXBase demo
The start of this project was actually an Intranet site which I wrote for a previous employer, the source code of which I was able to keep and adapt due to the agreement we signed when the project started. This is a site is an adaptation of that code, which ripped out all the visible structure and data models/presentation of the original project, and which myself as Chief Development Officer, with some assistance of another developer worked on as a proof-of-concept for a startup a group of us tried to get off the ground in the mid 2010s. It is written using PHP, Zend Framework 1.11, jQuery 2.03/jQuery-UI 1.10.3 including a number of plugins including jQuery DataTables and chosen, and uses PostgreSQL with custom plugins on the backend to combine data from multiple sources including the now defunct Yahoo Finance API and other database servers including MicroSoft's SQL Server and MySQL, allowing for joins across those data sources.
The site itself features access control lists with site definable roles/resources/actions to control what you can see and do, a customizable menu, the ability for individuals with the correct privileges to become another user and more, along with those custom plugins. Sadly, development on project ceased a number of years ago with some features incomplete, and major work would be needed to bring the site up-to-date in terms of software versions.
This site runs on a KVM virtual host on an isolated subnet, which was derived from a development VM which contains an Apache web server, both a MySQL and PostgreSQL server to go along with the Zend server backend to run the legacy PHP 5.3 code.
So if you would like to take the Nickle tour, please contact me for the credentials. As noted, it was implemented with access control lists, and the beauty is hidden behind that login.
Job Application Tracking app
I have long used Python for system utilities, as well as working with Zope/Plone, a content management system written in Python, and cobbler, which is a Linux based network installation server which originally used the Django framework. I even maintained the NetBSD pkgsrc packages for the former for several years, and have contributed to both projects. This is a copy of a site I initially threw together in a few hours over a couple of days as a side project to use for tracking job applications, rather than using a Google spreadsheet, which was becoming increasingly difficult given the width of each row, the number of lines in the table, and issues such as searching, pasting being prone to copying formatting as well, and not being easy to click on links. And so, I threw this together as a simple tool to use, and even added a feature to import the Google spreadsheet I had been using to initially populate the database. And from its initial creation, I have occasionally picked it back up to add some new features, such as most recently productionizing it to be able to deploy securely in multiple environments with a CI/CD process in addition to being able to develop it.
The backend code is written in Python 3.11.14, Django 5.1.3, with the django-ajax-datatable package, and uses jQuery 3.71/jQuery-UI 1.14.1 and jQuery DataTables on the client side, making AJAX requests to the backend to take a empty table and turn it into something useful. The backend code is deployed in a Docker container which runs on a Docker Swarm, serving the dynamic content using a Gunicorn WSGI server, along with an nginx container which proxies the WSGI interface along with serving the static content. A PostgreSQL database server running in my DMZ and an Apache web server also running there for handling the HTTP and HTTPS connections to the containers rounds out the deployment. The Apache server is used rather than embedding the certificates into the containers for ease of refreshing the certificates.
As noted below, each swarm serves a "secret" .env file for this application, with the exterior facing version pointing to a demo copy of the database, while the version running on an interior network has the actual up-to-date information I use. Combined with my Jenkins server mentioned below, this application is deployed using a CI/CD pipeline when I push updates to GitHub. I will be regularly be reloading the external facing database using a script, and will eventually make a Jenkins job of it.
Development of this application takes place on a Linux virtual machine where I have PyCharm installed and use Python 3.13 (the latest packaged version available) along with a lightweight venv virtual environment to allow me to use multiple versions of Python with the Python packages installed via pip not polluting up my overall system environment.
Source code can be viewed here on GitHub.
Heimdallr
Heimdallr is a long-term project of mine, which is intended to look into several areas to provide a unified view of my network, and to reach out to automate some provisioning tasks using its unified view. It gets its name from the Norse god of the same name, because of its vision and it acting as a bridge between the various systems, and was born as an idea I had while working on a similar project at a previous job. It started out with Python and Django, but when the SQL queries and advanced searching for the DataTables grew as troublesome as Loki and the jötunn, it crossed a bridge to become a PHP 8.2 (the version installed by default on RHEL9 systems) application using the Laravel 12. More details and a mention of this dual version development can be seen in the GitHub repository here, which talks about how to access the alternate main branch to see where I got to on the Python version.
NOTE: I currently only have this running on my internal network. I am going to put an externally facing version of this application up soon, after I finish up with some updates to the CI/CD pipeline for my Job Application Tracking App.
MEDUSA
One of my biggest time sinks over the past couple of years besides learning and brushing up on my professional skills has been working on MEDUSA. It is an PHP/Laravel application originally developed by a friend, David L. Weiner and others starting in late 2014, to support the need for a membership management website to track information about the 7,000+ international members of The Royal Manticoran Navy: The Official Honor Harrington Fan Association, Inc. The organization is a 501c7 dedicated to David Weber's Honor Harrington MilSciFi series. As such, we track the accrual of what we define as promotion points earned by activities participated in as a part of the organization, courses for which members have taken, which along with promotion points are the gateway to advancement within the organization, awards earned, and to wrap it all together, the organizational hierarchy which is modeled upon the various militaries written about in the books. But loving SciFi, David Weiner first introduced me to the book series, then being the friend he is (we go back decades in The Society for Creative Anachronism), he "twisted my arm" to get me to join to grow the local chapter he led, then later to help out with MEDUSA.
Hosted in the cloud, the legacy version of MEDUSA has grown organically and is currently running on PHP 7.3.8 and Laravel 5.7, with a MongoDB 3.6 NoSQL to store the data other than things such as images, and it acts as the OAUTH2 authentication server for our other websites such as our forums. It provides most individuals with a view of their own service record, there service history, their promotion points and academic record, as well as a tool for displaying their ribbon rack of awards they have earned. Since access requires a login, here are a couple of screen shots from my personal page.
This past fall, after working on a number of trouble tickets, I discussed the need to upgrade things with David Weiner (cannot just say David or even David W. in the organization), and I began a project to bring the site up-to-date. Currently, I am migrating the code from the legacy GitHub repository to a new repository (with a +2 bump in the major version number to indicate the jump) bringing it up to now PHP 8.5 and Laravel 12, along with the latest version of MongoDB and all the PHP and other packages which we use. And as if this were not enough, I am slowly placing all the code under test and trying to clean up the database schema while doing the updates. Complicating things is the fact that MongoDB is a second class database within the Laravel space, since it has not supported ACID transactions in it's integrations with PHPUnit, PHP and Laravel. As such, the tests which would be relatively fast on say a PostgreSQL or MariaDB database are extremely slow, since they involve dropping the database and recreating it with all of the migrations. I have been researching this problem, and even wrote a few blog posts about this, but progress of late has been as slow as the test.
As if I do not have enough on my plate, here is a project I have been thinking about.
Resume Creator
I manually keep multiple versions of my resume around, with at least three major versions active right now, a short two-page version which primarily focuses on PHP, a slightly longer three page version, and a much longer four page version which I send out when I am applying for positions involving C/C++ and UN*X/Linux OS internals. And each of the longer versions is a super-set of the shorter one, just adding older work experience. And like many developers, I have been thinking of how to automate the process. I have in mind a Laravel application running the latest and greatest, with a relational database running on PostgreSQL complete with join tables to store the data, with a PHP front end to display a draft, and a PHP library such as PHPWord or phpdocx to allow saving it to Word or PHP format.
Hosting environment
As you can see in the About This Site block on the home page, I have a fairly beefy physical host in my home network. It runs KVM to support multiple virtual hosts on a number of KVM virtual networks which are bridged to a managed gigabit ethernet switch to connect to a firewall. This firewall is configured for minimal trust, with the default rule being to drop network packets which do not match rules allowing packets through to other subnets or to my ISP. And all external connections go through bastion hosts on a DMZ network.
The Docker Swarm serving my exterior facing sites is one of two swarms running in my environment, with another serving interior facing sites. Each swarm maintains a set of secrets for that particular environment. I also run a private Docker registry locally, and use a Jenkins server which is triggered by GitHub webhooks to do the builds and deployments.
To help support the numerous machines, both physical and virtual which mostly run either Rocky 9 Linux or actual RHEL 9 which are on my network, some of the things I run include:
- Multiple database servers, including
- TrueNAS Scale for a multi-terabyte storage system running on a dedicated Dell R720.
- Cobbler installation server, originally developed by Michael DeHaan and released by RedHat and written in Python/Django, which helps manage:
- ISC DHCP Server
- ISC BIND 9 Name Servers
- My Kickstart configuration files for totally automated RHEL installations.
- KOAN, the Kickstart Over A Network took for firing off installations, primarily for creating and installing virtual machines (though it supports reinstalls of physical machines as well).
- Ansible, an automation platform originally developed by Michael DeHaan and now largely supported by RedHat, which allows me to write code to do administrative tasks ranging from simple ones like pushing a update to a configuration file to all my machines, to complex ones where I build out a complex server by creating filesystems, installing software, manipulating database servers and more.
- Jenkins, for running my CI/CD processing.