---
title: "CodeGiant: Ruby 3 Upgrade and Observability in a DevSecOps Platform"
description: "Case study: six months on codegiant.io, the 2024 DevSecOps platform. Helping build out and integrate Grafana as a service inside the product, taking the whole codebase from Ruby 2.7 to Ruby 3.3.6, rewriting the Project Planner UI, and adding Ruby and JavaScript linting."
doc_version: 1
last_updated: 2026-09-18
canonical: https://variable.team/projects/codegiant
---

<!--
  Source of truth: app/projects/codegiant/page.tsx. Keep the h1 in sync.
  scripts/check-markdown-drift.ts verifies this in pre-commit.
-->

# CodeGiant DevSecOps Platform

- **Company:** [CodeGiant](https://codegiant.io)
- **Industry:** Developer Tools / DevSecOps
- **Dates:** Jun 2024 to Dec 2024
- **Project link:** <https://codegiant.io>
- **Stack:** Ruby, Ruby on Rails, React, JavaScript, TypeScript, Grafana,
  Kubernetes, Observability, Linting, DevSecOps

### The platform this was in 2024

CodeGiant in 2024 was a DevSecOps platform: issue tracking, Git
repositories, CI/CD and observability in one product. I contracted there
for six months through Variable Software Consulting, my own consultancy.
The company has since moved to enterprise modernization, so codegiant.io
today is not the product described here.

### Grafana as a service inside the platform

Observability was sold as part of that platform: centralized log
management, live tailing, presence and absence alerts, error and APM
tracing. Grafana was my piece of it. It sits as the dashboard and query
layer over a data source, so this was the viewing end of that stack. I
helped build it out and integrate it so it was usable as a service from
inside CodeGiant.

### The whole codebase from Ruby 2.7 to 3.3.6

Ruby 2.7 went end of life in March 2023, and the 2.7.8 release announcement
said there would be no 2.7.9 even if a security vulnerability turned up. A
production Rails app still on 2.7 in mid-2024 was running an interpreter
with no upstream patch available for anything found in it after that date.
I took the entire codebase to 3.3.6. The expensive part is the 2.7 to 3.0
boundary, where the automatic conversion between keyword and positional
arguments that 2.7 only warned about is gone, which is wide-reaching work
on method signatures plus a full sweep of the gem dependencies. It was not
a drop-in version bump. 3.3 also ships YJIT, which 2.7 never had, though it
stays off until someone turns it on, so that is a separate decision from
the upgrade.

### A rewrite of the Project Planner UI

The Project Planner was CodeGiant's issue tracker: issues with parent and
child relationships, active sprints, kanban boards, roadmaps, reports, a
markdown editor, backlog and epics, all tied to Git activity and custom
workflows. I read it closely before changing anything. Then I rewrote the
UI and fully updated the React structure underneath it, so the board, the
backlog and the roadmap sat on one current structure. Story points, time
tracking and status surface in all three views at once, and all three have
to agree.

### Kubernetes, learned on the job

CodeGiant ran its systems on Kubernetes. I did not arrive with it. I
learned it on the job against a live cluster, and I worked within the
conventions the platform already had. Grafana as a service landed there
too. Six months was enough to do my own work in the cluster and nowhere
near enough to claim I designed it.

### Linting, and the case for TypeScript

I put linting in place for both Ruby and JavaScript, which settles a lot of
small review arguments before anyone has them. I also wrote the plan for
taking the JavaScript to TypeScript. It was not a runtime argument. Types
are erased at build, so the shipped bundle behaves the same as it did. The
case was that a class of shape error moves from a production incident to a
failed build, and that a large refactor becomes a list the compiler hands
you instead of a grep.

## Sitemap

[Full site index](/sitemap.md)
