October 7, 2026

Refactoring The-Internet: Fork, Fix, Farewell to Heroku and hello to Render!

With this blog post, we will be taking Dave Haeffner's The-Internet, https://the-internet.herokuapp.com/, a ten-year old web app test site, fork it, investigate using Google AI how to modernize the server architecture, and port it over to a new home at Render.com. 
It finally happened. Dave Haefner's The-Internet, a test site I have been using ever since I first started blogging, is now failing to load half the time. It's not the test site's fault. It's Heroku. 


Heroku, a Platform-as-a-Service site, allowed developers to get web applications up and running very quickly, where they could experiment with the very popular free tier, before switching to one of their paid plans. But according to Gaurav Kheterpal, in his article, The Rise, Decline and Free Fall of Heroku — A Tale of What Could Have Been! (2/2026) Salesforce, which has owned the since 2011, decided to do away with the free tier four years ago. Things started going downhill. Since February 2026, Heroku is no longer going to be offered to new customers, according to Heroku's update, and it is now in maintenance mode. 

So I had to come to a decision: 
  • Do I pick a new test website to blog against... or do I figure out how to resurrect the old one? 
  • Source code for the site, https://github.com/saucelabs/the-internet, is under an Apache-2.0 and MIT License, with Sauce Labs encouraging people to update and change it. Could I figure out how to update it, modernize it, and find it a new home?  
I'm not a DevOps guy, or a SysAdmin: I'm an SDET, a software engineer who writes ui and api tests. How on earth could I figure this out? ... Maybe Google AI could direct me to some primary sources? I asked Google AI these questions... and it came up with a plan. 

Step 1: Copy the Source Code


Dave Haeffner developed the test site The-Internet when he was published the weekly newsletter Elemental Selenium (2013) and his Selenium Guidebook (2014). I remember reading both religiously when I was taking Alan Richardson's ( @eviltester ) online Selenium + Java course, coding against Dave's website, trying to figure out how to make the shift from manual testing to automation development. 

Now, the source code for The-Internet is maintained by Sauce Labs, living in their GitHub code repository. 

... And that source code? Sauce Labs has placed it under a Apache-2.0 and MIT License. 
  •  Apache-2.0: The Apache Software Foundation (apache.org), founded in 1999 by the Apache HTTP Server ("a patchy server") , put forth the 2nd version of their software license in 2004. [See License]. It allows users to use the software for any purpose, to distribute it, to modify it, and to distribute modified versions of the software under the terms of the license, without concern for royalties.
  • MIT License: According to the MIT Licensing Office article, Exploring the MIT Open Source License: A Comprehensive Guide, "grants permission to use, modify, and distribute the software, with the condition that the original copyright notice and the license text are retained in the redistributed software. This ensures proper attribution to the original authors while offering maximum freedom for developers".
This means that you are allowed to copy the code onto your personal account, such as in GitHub's Fork a repo doc.  
Once I had my very own copy of the site: https://github.com/tjmaher/the-internet, it was time to start updating it. Why? As you could see by looking at the original code, much of it is nine or ten years old! 

I opened up Google.com, switched to AI mode, and started examining the Gemfile, the configuration file of the Ruby project that lists all external libraries and frameworks (dependencies), version numbers of the product, and whether to download these files from RubyGems.org, or another source. 

Step 2: Review Gemfile with Google AI

Copying and pasting the Gemfile into Google AI, it had the following recommendations:

Change Default branch: MASTER -> MAIN

GitHub, back in 2020, changed the standard name of their default branches from "master" to "main". The code in the-internet is so old, the change hasn't yet been done in the original code. So in my copy:
  • Change MASTER to MAIN: git branch -m master main 
  • Select "Sync Fork" to update the branch. You can see that "main" is the most updated branch. 
  • Go to GitHub Settings --> Default Branch and switch it from "master" to "main". 

Gemfile Updates

With the original The-Internet it used:
  • source 'https://rubygems.org'
  • ruby '2.7.2'
  • gem sinatra, sinatra-flash, sinatra-contrib, shotgun, zurb-foundation, compass, rake, pony, faker, uuid
  • For group :test, use gem 'selenium-webdriver', '~> 3.4.0', gem 'rspec', '~> 3.5.0', gem 'sauce_whisk', '~> 0.1.0'
According to Google AI:
  • Replace gem 'shotgun' with gem 'rerun': "Shotgun relies on an aggressive forking mechanism that is completely broken and unmaintained on Ruby 3.x+. Replacing it with the rerun gem in your development group gives you seamless code reloading without the crashes".
  • Remove gem 'compass': "The Compass framework was officially deprecated years ago and does not support modern Sass compilation or modern versions of Ruby"
  • Remove gem 'uuid': "This gem is redundant. Modern Ruby provides cryptographically secure UUID generation out of the box in its standard library. You can safely delete this gem and use SecureRandom.uuid in your application without requiring any external packages".
Google AI also suggested that I upgrade the test environment locks: 
  • selenium-webdriver ~> "3.4.0 is severely outdated and will fail to communicate with modern versions of Chrome, Firefox, and Safari. Moving to ~> 4.0 is required".
  • rspec ~> "3.5.0 will throw a massive amount of keyword argument deprecation warnings on Ruby 3.2. Upgrading to ~> 3.13 ensures smooth, clean test outputs".
Google AI also mentioned: "Both Shotgun and Rerun are Ruby gems designed to solve the exact same headache: automatically reloading your application when you make changes to your code during development. Rerun is a highly efficient filesystem watcher.

"How it works: Instead of doing anything fancy inside the Ruby process itself, Rerun simply sits in your terminal and watches the folder you are working in. The moment you save a file (like a .rb, .erb, or .json file), Rerun intercepts the change, uses standard Unix signals (SIGINT/SIGKILL) to cleanly kill your web server, and immediately boots it back up in a fraction of a second". [Ubunto Man Pages / Rerun]. 

Good to know! 

After a lot of back and forth with Google AI, having it explain its findings, my updated Gemfile looked like:
  • source 'https://rubygems.org'
  • ruby '~> 3.4.2' 
  • gem sinatra, sinatra-flash, sinatra-contrib, shotgun, rackup, rake, pony, faker, puma
  • For group :development, use gem 'rerun'. 
  • For group :test, use gem 'selenium-webdriver', '~> 4.0', gem 'rspec', '~> 3.13', gem 'sauce_whisk', '~> 0.3'

About These RubyGems:

sinatra:
  • First Release: September 9, 2007.
  • Last Updated: October 10, 2025 (v4.2.1)
  • Creator: Blake Mizerany.
  • Sinatra is a lightweight, minimalist web application framework written in Ruby. It provides a simple domain-specific language (DSL) to quickly create web applications with minimal effort, mapping incoming HTTP requests directly to Ruby code blocks.
  • Official Docs: https://sinatrarb.com/
  • RubyGems.org: https://rubygems.org/gems/sinatra

sinatra-flash

  • First Release: April 26, 2010 (v0.1.0)
  • Last Updated: May 2, 2010 (v0.3.0)
  • Creator: Stephen Eley
  • A Sinatra extension for Rails-style flash messages. It supports hash operations on the flash and a styled_flash view helper that renders messages with CSS classes. Works only in Sinatra.
  • Official Docs: http://github.com/SFEley/sinatra-flash
  • RubyGems.org: https://rubygems.org/gems/sinatra-flash

sinatra-contrib

shotgun

  • First Release: February 20, 2009 (v0.1)
  • Last Updated: September 10, 2016 (v0.9.2)
  • Creator: Ryan Tomayko
  • A reloading development server for Rack applications. It loads the app fresh for each request, so code changes appear without a restart.
  • RubyGems.org: https://rubygems.org/gems/shotgun

rackup

rake

pony

  • First Release: October 29, 2008 (v0.1)
  • Last Updated: April 18, 2019 (v1.13.1)
  • Creator: Adam Wiggins.
  • A small gem for sending email in one call, for example Pony.mail(:to => ..., :body => ...). It depends on the mail gem.
  • RubyGems.org: https://rubygems.org/gems/pony

faker

puma


Rack was created as an interface to design a minimal API that sits between Ruby web servers, like Puma, so each developer did not need to create custom connectors. It comes with a config.ru file, which acts as a deployment script containing instructions on what to load and how to run the core application logic. This setup is executed locally using rackup, a command-line utility that parses the configuration file and boots the application. 

The Ruby gem Sinatra, is a minimalist DSL (Domain Specific Language) that simplifies mapping URLs to Ruby code incredibly simple. The Sinatra ecosystem: sinatra-contrib, common extensions offering automatic code reloading and configuration engines; sinatra-flash, a utility used to pass temporary message alerts between HTTP redirects. 

For the next part, we will cover Step 3: Setting up Render. Until then... 


Happy Testing!

-T.J. Maher
Software Engineer in Test

BlueSky | YouTube | LinkedIn | Articles

No comments:

Post a Comment