Code Migrations

Dependabot bumps the version number. That's the easy part. The hard part is every repo that uses the old API, the deprecated method, or the removed import, and needs actual code changes to compile again. That work multiplied across hundreds of repos is what turns a routine upgrade into a multi-month project.

Deep dive
  • Migrating from deprecated APIs to new versions (e.g., Kubernetes API updates)
  • Updating import statements when package structures change
  • Replacing deprecated method calls with new APIs
  • Adapting code to framework breaking changes
  • Rolling out internal library upgrades that require code changes
  • Updating error handling patterns for new library versions
163 files refactored
package.json
- "@redis/client": "^1.5.0",
+ "@upstash/redis": "^1.28.0",
src/api/handler.ts
- import { createClient } from "@redis/client"
+ import { Redis } from "@upstash/redis"
- const client = createClient({ url: REDIS_URL })
- await client.connect()
+ const redis = new Redis({
+ url: REDIS_URL, token: REDIS_TOKEN
+ })
src/cache/session.ts
- await client.set(key, val, { EX: ttl })
+ await redis.set(key, val, { ex: ttl })
- const data = await client.get(key)
+ const data = await redis.get<string>(key)

Config Standardization

CI pipelines, YAML manifests, and build configs diverge across services over time. One team updates their GitHub Actions workflow, the rest don't. Security configs get added to new repos but never backfilled. By the time you notice the inconsistency, it's already caused a failed deploy or a compliance gap.

Deep dive
  • Updating CI/CD pipeline YAML configurations
  • Standardizing CODEOWNERS files
  • Updating GitHub Actions workflow definitions
  • Injecting or updating monitoring and observability configs
  • Standardizing build configuration files
  • Adding or updating security configuration files
247 repos updated
.github/workflows/ci.yml
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
CODEOWNERS
+ # Global ownership
+ * @platform-eng
+ /infra/ @infra-team
+ /.github/ @platform-eng @security

CI/CD Migrations

Moving to a new platform means touching every service. You know what needs to change, but getting it done means filing tickets, chasing teams, reviewing hundreds of PRs, and managing a spreadsheet of who's done and who isn't. The technical work is straightforward. The coordination is what kills you.

Deep dive
  • Updating container image references in Dockerfiles and deployment configs
  • Converting CI pipelines when switching platforms (Jenkins → GitHub Actions)
  • Updating GitHub Actions runner OS versions and pinned action versions
  • Removing references to deprecated infrastructure and legacy configurations
  • Updating Kubernetes deployment manifests during platform migrations
89 services migrated
Dockerfile
- FROM node:18-alpine
+ FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
- RUN npm ci --production
+ RUN npm ci --omit=dev
k8s/deployment.yaml
spec:
containers:
- image: node:18-alpine
+ image: node:22-alpine
- - name: NODE_OPTIONS
- value: "--openssl-legacy-provider"

Security & Compliance

A CVE drops and 67 services are affected. An audit is in three weeks and SECURITY.md files are missing from half your repos. Both scenarios require the same thing: touching hundreds of services fast, without pulling your team off real work.

Deep dive
  • Patching vulnerable dependencies across all affected repos when a CVE drops
  • Injecting and maintaining SECURITY.md files org-wide
  • Adding SOC 2 and compliance sections to README files
  • Pinning dependencies and GitHub Actions to prevent silent upgrades to vulnerable versions
  • Documenting access control, encryption, and data handling per service
312 repos documented
SECURITY.md
+ ## Data Handling
+ This service processes PII under encryption
+ at rest (AES-256) and in transit (TLS 1.3).
+
+ ## Access Control
+ RBAC enforced via OPA policies. See /policies.
README.md
## Getting Started
+ ## Compliance
+ This service is SOC 2 Type II compliant.
+ See [SECURITY.md](./SECURITY.md) for details.
+

Eliminate coordination overhead

Beyond being a distraction for your development teams, these use cases all share the same pain points: coordinating across teams, tracking status, chasing reviews, and managing conflicts is a massive time sink. With Tidra, define the change once, review generated code, and track everything in one place.

Coordinate in days, not weeks.