CS Student · BYU–Hawaii · Dec 2026

Jackson Pike

Software Engineer  /  Systems Thinker  /  Builder

THIS SITE STILL IN DEVELOPMENT

I'm a CS senior at BYU–Hawaii. Since longer than I can remember, I have had an uncontrollable desire to understand how things work. The things we’ve built as humans continues to fascinate me, and instills in me an innate curiosity for the unknown. I've been building things with code since I was 14 — not because I was told to, but because I kept running into problems that needed solving.

View My Work Get In Touch
01

About me

This is still in progress, come back to find more later!

I work two jobs alongside school — CS tutor and teaching assistant for the department and part-time at McDonald's — because Laʻie is expensive and my wife Britlyn and I are making it work.

Currently
CS Senior @ BYU–Hawaii · Winter 2026
Graduating
December 2026
Courses
IT 327 · CS 301 · CS 210 · CS 320
Roles
CS Dept. Tutor · Lead Tourguide · Operations Supervisor
Interests
Systems design · OOP · Artificial Intelligence · Backend Development
Location
Laʻie, Hawaii
Seeking
Summer 2026 internship
02

Recent projects

A mix of coursework and self-directed builds. The pattern is the same in all of them: find something that doesn't work well, understand why, build something better.

Class Project · CS 401 Ruby on Rails (Rails 8) GitHub OAuth
Enrollr
A student enrollment system built from scratch in Ruby on Rails — modeled after real university course registration flows. Includes course pre-requisite enforcement, multi-section offerings, role-based access control, and optional GitHub OAuth for user accounts.
2025
THE PROBLEM
Our existing university registration system is notoriously clunky. The university has been working for years on migrating to a new system. However, for now the old remains. I wanted to understand the problems and challenges facing them, which could perhaps explain why its taken this long to modernize, so I chose Enrollr for my semester-long project for my senior-level Web App Design course. Enrollr has full CRUD application handling students, courses, sections, and enrollment records with role-based access for admins vs. students.

Features

  • Rails email/password auth | GitHub OAuth
  • Course catalog with section management
  • Enrollment / drop / capacity enforcement
  • Prerequisite enforcement
  • Avo Admin Portal

Stack

  • Ruby on Rails (MVC)
  • PostgreSQL
  • Rails 8 built-in auth (has_secure_password, Session model)
  • Bootstrap
  • Minitests / Rails system tests
03

Where it started

In 2016, I ran a modded Minecraft server. A dozen independent mods — none of which talked to each other. So I built a system to connect them: monitor dashboards for reactor output, ME storage status, plugin tutorials with touch-navigable pages, and a shared Lua library distributed across in-game computers via pastebin at runtime. I was 14. I didn't know what software engineering was. I was just solving problems.

PikeLib
Shared utility library — distributed via pastebin at runtime
2016
WHY IT MATTERS
Rather than copy-pasting utility functions across every script, I extracted them into a shared library with a consistent API. Scripts download it from pastebin at startup — primitive package management before I knew that term existed.
📄 PikeLib.lua  ·  pastebin: nXvVUSuw
-- Auto-detect: no hardcoded peripheral names
function fetchPeripheral()
    local names = peripheral.getNames()
    for i, name in pairs(names) do
        if peripheral.getType(name) == "monitor" then
            return peripheral.wrap(name)
        end
    end
end

-- Toggle redstone output (on/off)
function toggleRedstone(side)
    if redstone.getOutput(side) then
        redstone.setAnalogOutput(side, 0)
    else
        redstone.setAnalogOutput(side, 15)
    end
end

-- Draw a full-width colored bar at a given y position
function drawBars(color, yPos, mon)
    monX, monY = mon.getSize()
    mon.setBackgroundColor(color)
    mon.setCursorPos(1, yPos)
    mon.write(string.rep(" ", monX))
end
Turbine Control
Live energy dashboard for Big Reactors turbine with on/off toggle
2016
WHY IT MATTERS
Polled live peripheral data every second — RF/tick, rotor RPM, steam buffer. A second computer handled touch input independently, toggling the turbine by reading x/y coordinates against the button region.
📄 Turbine_Control.lua
local function getData()
  RFStored = math.floor(turb.getEnergyStored())
  RF       = math.floor(turb.getEnergyProducedLastTick())
  Rotor    = math.floor(turb.getRotorSpeed())
  poll     = turb.getActive()
end

local function homepage()
  if poll == true then
    drawMenus(colors.blue)
    writeText(8, 2, colors.black, colors.green, "ONLINE")
  else
    drawMenus(colors.gray)
    writeText(8, 2, colors.black, colors.red, "OFFLINE")
  end
end

while true do
  getData() homepage() sleep(1)
end
ME Storage Monitor
Applied Energistics 2 — live bytes used, energy level, auto peripheral discovery
2016
WHY IT MATTERS
Used automatic peripheral discovery — iterating all connected peripherals to find the ME controller by type rather than hardcoding names. Portable across setups with zero config changes.
📄 ME_Status.lua
function getControl()
  local names = peripheral.getNames()
  for i, name in pairs(names) do
    if peripheral.getType(name) ==
       "appeng_me_tilecontroller" then
      return peripheral.wrap(name)
    end
  end
end

while true do
  BUsed  = control.getUnusedBytes()
  BTotal = control.getTotalBytes()
  BPct   = math.floor((BUsed/BTotal)*100)
  mon.write("Storage: "..BPct.."%")
  sleep(1)
end
Plugin Tutorial Kiosks
Multi-page touch-navigable info displays for Towny and Jobs
2016
WHY IT MATTERS
A secondary monitor acted as a navigation sidebar, listening for touch events and routing between pages. Each page was a stateless render function — essentially components before I knew what components were.
📄 townyinfo2.lua
function page1()
  m.clearScreen(colors.black, colors.black)
  m.writeText(2, 3, colors.black, colors.red, "What is it?")
  -- ... render content

  mon2.write("------>") -- sidebar nav arrow

  event, side, x, y = os.pullEvent("monitor_touch")
  if side == "front" then page2() end
end

function page2()
  m.clearScreen(colors.black, colors.black)
  m.writeText(2, 2, colors.black, colors.red, "Commands:")
  -- ... render commands

  mon2.write("<------") -- arrow flips on page 2

  event, side, x, y = os.pullEvent("monitor_touch")
  if side == "monitor_4" then page1() end
end

page1()
The Through Line

The instinct to abstract

The most telling artifact isn't any individual script — it's that I built PikeLib at all. When I noticed I was rewriting the same monitor-drawing code in every file, I pulled it into a shared module with a consistent API. The idea that repeated code is a problem to be solved wasn't taught to me. I felt it. That instinct has followed me into every project since.

fetchPeripheral()
writeText(x, y, bg, fg, text, mon)
drawBars(color, yPos, mon)
clearScreen(color, ecolor, mon)
toggleRedstone(side)
04

Get in touch