Travis Zimmerman

Bloomington, IN 47408 · (812) 391-2973 ·

I find joy in creating custom web applications, managing systems and databases, and working with others to solve problems. I am driven and eager to learn new skills quickly!

Please take a look at some of my favorite projects below!

Servers and Admin


When you have a great deal of web applications you want/need to use, it is necessary to have a good server as a foundation to build on. That is where "Zerver" and "Zackup" come in. (I like Z's)

Both Servers are Arch linux machines with ZFS File systems. "Zerver" lives here in my Indiana apartment, and "Zackup" in the basement of my grandparents house in Ohio. "Zackup" is a direct copy of "Zerver", and that copy happens once per night. With my DNS provider I can load balance between the two sites at heavy traffic times, or send different domain names to different locations. My servers have had many iterations, but I have settled on the current configuration with ZFS for the ease of taking Virtual Machine Snapshots. (at least for the time being)

I use nginx as a reverse proxy, and Lets Encrypt as my ssl credential manager.


I use Docker for as many things as possible. It has been the perfect solution for "jailing" the many apps I host. It allows easy development of custom websites and tools, and even easier deployment.

I run a Gitlab site, located at that houses all the code for various project of friends and my own. For custom projects that are hosted or "live", I have set up a few gitlab-runners to auto build docker images via a CI Pipeline. These are auto pulled to my server on build for production use.

Virtual Machines

Since I try to use docker for most things because of it's simplicity and low resource requirements, I don't have many VM's anymore. I do use a windows VM with VFIO passthrough for rendering and gaming, but that's an entire project in itself.


I have started hosting my apps in a High Availability configuration with kubernetes. I use Rancher in a virtual machine to manage 3 K3S virtual machines. More on that as it evolves!

Hosted Services

This is just a list of hosted services / projects that aren't entirely my work or aren't my work at all that I host for either my family or friends.

  • Media Server - Emby media server with our home video, pictures, and other media.
  • Nextcloud and LibreOffice - A Google Drive and Google Docs Suite replacement for my family.
  • ChurchCRM - A church management software used by a small church in Ohio.
  • JupiterLab - A python processing and sharing platform. Used by myself and a few others to nerd out with math problems.
  • Databases - Mongodb, PostgreSQL, Mariadb, and MySQL. All for use with most of these apps.
  • Bookstacks - A wiki to keep track of my configurations and SOP's. (replaced by Gitlab Wiki)
  • ZBot - A server for managing my 3D printer via Klipper, Mainsail, and Fluidd softwares.
  • Codenames - A Codenames web game for quarantine, built by a close friend.
  • NFL - An NFL tracking site, built by same close friend.
  • Other small things not worth mentioning, but necessary for the major apps to function.



While I make a lot of applications, I also have other people creating apps that need to be hosted. That is where the powerful Gitlab comes in.

The Process

  • I or another user push changes to self hosted Gitlab.
  • Gitlab auto builds and tests the app using a custom CI/CD pipeline I created.
  • If all is good, it is published to my self hosted container registry.
  • Rancher auto pulls new images from the registry and assigns it to a VM.


When a user pushes a project update to my gitlab, it is checked for a few files that git instruction to the pipeline. If they are found, the project is a ssigned a "runner", which is just a VM that's only job is to execute commands for gitlab

Depending on the project these commands can be different, but for most they will build the application (usually as a docker image), test that a few basic things work such as database access and no crashes (pretty simple right now, as manual testing should have caught most), and if all is good publish to my container registry.

My cluster manager will check for new images and auto pull the latest from my registry. I then get an email that all is good!

But Travis, Why?

Yes the initial set-up is a lot of work, but it is all fun work! Not to mention all of the things that I have learned in the process. Containerization, Pipelines, and Kubernetes just to name a few. And that was all in just the past few weeks!

And now that it is done, all I have to do is simply push to Gitlab. No more making sure it works on the server, or needing to re-pull an image in the command line. It just happens!

Next Steps

Set up more detailed testing processes in the pipelines

Auto build Ruby on Rails project I am working on

Convert kubernetes VMS into physical machines to take full use of HA

H2O Indiana Website -


I am a member of a team that planted a collegiate church at Indiana University, and like most businesses or churches, we needed a website. But just a standard static site wasn't going to do, especially in the time of COVID. I needed to make a few custom tools that required a full stack of development, so I learned.

The Stack

  • Frontend - HTML with EJS (embedded javascript)
  • Backend - Nodejs with Express and Passport Authentication
  • Database - Document Oriented Database, MongoDB

Why not Static?

  • Live Streaming
    • For many reasons (stream quality, music takedowns, etc), most mainstream live streaming services (embedded facebook live) were out for us. So instead, I made my own streaming service.

      It has had many iterations, but is currently an Alpine Linux Docker Image with an Nginx RTMP Proxy Server running.

      It is accessible from anywhere, and it exports video streamed to it in both HLS and DASH formats. Finished streams are then saved in a folder that is served by my CDN (also an nginx proxy) and are viewable on the sermons page.

  • QR Code Creation
    • To give people quick access to our site and sign-ins (below), we needed a way to create QR Codes that didn't cost money, or redirect to weird sites with long links before redirecting back to the desired URL.

      Enter, the QR Code Generator. This is a simple tool that takes an entry (any text), and displays a QR Code for that text.

      It uses a QR Code Node Module to generate, and then the image can be exported.

  • Sign-In Sheets
    • For COVID tracing purposes, we needed some sort of sign-in to show who was there, and in which room they were. You may be thinking that a simple Embedded Google form would have sufficed, but you will see below why I did it this way.

      Before entering the room we have service in, all members must visit our site and login. This is a simple html form with name, phone number, and email.

      After POSTing the form, their info is saved in a mongo database and added to a google spreadsheet using the Google API for editing Google Sheets.

      The Google Sheet entry is for the University, and the Mongo Database entry is for the next implementation, The Text Tool.

  • The Text Tool
    • Another form of sign-in we have is called a connect card, and it is a way for students to get in contact with us. It is separate from the university sign-in, but we use the phone numbers from the room sign in to send a text with a link to the connect card form. (An actual embedded Google Form this time)

      Towards the end of service, we have a time to fill out these connect cards. Someone with a login to the site (below) sends a text to everyone in the database for that day.

      They have a dashboard with names populated from the database for that day, a message to change, and a send button.

      Clicking send makes an API call to a service called Twilio, which takes a list of numbers and sends a message to all on the list.

      People can then open the text and click a link to fill out the Connect Card form.

  • User Login
    • Of course, having a tool that can mass text a bunch of numbers requires some security. So I used passport to implement some logins.

      Users are stored in the mongodb with an encrypted password. They also have a flag for their access level.

      Only a handful of people have access to the text tool, and everyone has access to the QR Creation Tool.

      I (Admin) have access to a User Creation tool.

  • User Creation
    • When a user is created by me, they receive an email with a link to set up a password. The link they receive is a random generated string that is stored with their account in the Database.

      Clicking the link verifies the random string with the one stored in the DB, and allows them to set a password.

      Once they set a password, a flag is removed from their account allowing them to login.

  • To-Do
    • Single Sign On, using google business credentials in passport rather than account creation.

    • Adding archived sermon videos to speed up the site.

Did you make it this far?

If you have made it this far, thank you! This project has been one of the largest learning experiences thus far in my career, and it was/is all volunteer in my free time!

You can view the main site here!

Arcgis Web Apps


I was hired on at the city to migrate data from the old Genemap/Oracle system to Arcgis/PostgreSQL. This includes the entire city's water, sewer, and storm sewer systems stored as lines, points, and polygons. After completing the migration, my job became upkeep of the data and map creation. Rather than settling for that, I quickly started work on a web application in my free time at work. Below are a few examples.

Main GIS Viewer - Nodejs and Client JS

The main GIS viewer is a web application designed to best replace our old Genemap System. Think Google Maps, but with a focus on underground utilities. End users can query data stored in Postgres, and toggle different feature layers on and off.

For the most part, this process has a GUI to create maps, but their are a lot of limitations with it. The solution is a developer edition of the software.

Web App Builder Dev. Edition is a downloadable Node project that gives you complete control over the code, but can also work alongside already published datasets from Postgres.

I host a developer edition web app that ties into our city services, and I have added custom tools for easier printing, better navigation, and added features. (javascript)

Pipe Trace Tools - Python

Some end users need to trace the flow of sewage, either upstream from the plant, or downstream to the plant.

I wrote custom trace tools that take the input pipe number and select pipes up or down stream from the start pipe, then plots them on the map.

The tool works with database queries, by selecting pipes that have an entry in the DB that matches the selected pipe number.

It then uses the Arcgis library to plot them on a map.

Main Break Tool - Python

During a main break event, water crews need to know what valves need shut down and what hydrants need flushed. Similar to the Pipe Trace Tool, the Main Break Tool selects pipes out of the database. However, the criteria is different.

After inputting the main break pipe, the tool finds connected pipes by location and selects them. It continues to spider out until it dead ends at a valve.

It then shows the affected pipes, the valves that need shut off, and hydrants that need flushed on a map.

Leapland Manor


For Halloween last year, I wanted to put together a Murder Mystery Party. But I couldn't just buy a pre-made one. That's boring! One of my close friends from college and I put together a story, and I made an accompanying web app for the guests within a day.

The Stack

  • Frontend - HTML with EJS (embedded javascript)
  • Backend - Nodejs with Express and Passport Authentication
  • Database - Document Oriented Database, MongoDB

The Process

  • I bought the domain "". It was to be a play on words that hardly makes sense if it is verbally explained, so I won't try here.
  • Invitations were sent out with a link to the site.
  • Guests would RSVP for the Gala and just like the H2O login, users would receive an email to set up an account.
  • On the day of the party, all guests account page would update with info, triggered by myself. It included things like a map, goals, certain clues, and alibis for other players.


The party was a hit, except for the fact that my close friend and I never know when to stop with a story! The story was drawn out and confusing, but the app worked perfectly!

Clyde Young Farmers Raffle


Every year, my parents direct a fund raiser for the Clyde Young Farmers in the form of a Reverse Raffle. This consists of ticket purchasers being drawn out of a pool of tickets until the last one is left. With COVID, this year's needed to be moved online.

The Process

  • Video was streamed from a barn in rural Ohio to my server in the same way the H2O Church site worked.
  • Raffle participants (about 200 people) were given a link to the site.
  • Below the video, a grid of everyone's names was displayed, as well as special drawings like the 50/50 and a TV.
  • My parents had access to a separate dashboard allowing them to input who was still in and who won what.
  • Using AJAX calls, the names on the main page were updated in real time to show people their current status at a glance.


All in all, the project went well! However, internet connection issues at the farm as well as high traffic on the stream caused issues. Since we had no music to play and quality wasn't an issue, we quickly started a Facebook livestream and I embedded it into the page. Problem solved!



This section is for other projects I have worked on that don't necessarily need an entire section.

3D Printing

Custom Built 5 Tool Changer

Could have an entire website.

Computer Building