# Rails Fever — Full Content > Rails Fever provides long-term maintenance, support, upgrades, performance and security services for Rails apps. Rails Fever is a Ruby on Rails consultancy specializing in long-term maintenance, upgrades, performance, security, rescue, and fractional CTO services for SaaS apps. Book a consultation: https://calendly.com/wale/30-minute-consultation # Deploying Rails 8 with Kamal on a Single Server URL: https://railsfever.com/blog/deploying-rails-8-with-kamal-single-server/ Date: 2026-06-29 Author: Wale Olaleye A single server will take a Rails 8 app a long way. One reasonably-sized VPS — a few dedicated vCPUs and 8–16 GB of RAM from any commodity host — comfortably runs the web app, a background worker, Postgres, and Redis for a product doing real revenue. You do not need Kubernetes, a managed control plane, or a five-service cloud architecture to serve thousands of users. You need a box, a hardening pass, and a deploy tool that does zero-downtime releases without ceremony. That deploy tool now ships in the framework. Rails 8 includes Kamal out of the box, and Kamal 2 brought kamal-proxy — its own reverse proxy with automatic Let’s Encrypt certificates — so a single-server deploy no longer needs Traefik, nginx, or a separate load balancer in front of it. This guide is the path I actually use: harden the server first, then layer Kamal on top. It is platform-agnostic — everything here works the same whether your box is on Hetzner, Linode, DigitalOcean, Vultr, or bare metal in a closet. The only assumption is a fresh Ubuntu 24.04 LTS server you can SSH into as root. The Shape of the Setup Before any commands, here is the target architecture on the single host: Layer What runs it Exposed to the internet? TLS termination + routing kamal-proxy (container) Yes — ports 80/443 Rails web Puma in your app container No — proxy routes to it Background jobs Solid Queue / Sidekiq container No Database Postgres on the host No — Docker bridge only Cache / queue backend Redis on the host No — Docker bridge only The app and proxy run as Docker containers managed by Kamal. Postgres and Redis run as host services reachable only over the Docker bridge network. Nothing but 22, 80, and 443 is reachable from outside. Step 1: Harden the Server First The single biggest mistake I see is deploying the app first and securing the box “later.” A fresh VPS with a public IP is being scanned for weak SSH credentials within minutes. Do the hardening pass before anything else, and make it a script so it is repeatable and reviewable — not a sequence of ad-hoc SSH commands you can never reproduce. What a good bootstrap script does, in order: Update the system and install core packages Create an unprivileged deploy user with SSH-key access Install Docker (Kamal needs it on the host) Configure host Postgres and Redis to listen on the Docker bridge Harden SSH (no root login, no passwords) Lock down the firewall Add fail2ban and automatic security upgrades Raise file descriptor limits Run it as root on the fresh box: bash setup-server.sh. Below are the pieces that matter, adapted from a script I run on production single-server deploys. Make it idempotent — you will re-run it. The fragments in this section are assembled into a complete, runnable script in this GitHub gist — read it before running it, and adjust the config block at the top for your app. Tip: You do not have to copy the script onto the server first. Pipe it over SSH and run it in one shot, keeping the file version-controlled in your repo: ssh deploy@<server-ip> 'sudo bash -s' < bin/setup-server.sh On the very first run of a brand-new box the deploy user does not exist yet, so connect as root that one time — ssh root@<server-ip> 'bash -s' < bin/setup-server.sh — then use the deploy form for every re-run after that. Packages and the deploy user Start with a strict shell and install the essentials: #!/usr/bin/env bash set -euo pipefail export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get upgrade -y -qq apt-get install -y -qq \ fail2ban ufw unattended-upgrades \ curl git htop unzip \ postgresql postgresql-contrib libpq-dev \ redis-server logrotate Create a deploy user with passwordless sudo and copy root’s SSH keys to it. Kamal connects as this user, never as root: if ! id deploy &>/dev/null; then useradd --create-home --shell /bin/bash deploy fi usermod -aG sudo deploy echo "deploy ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/deploy chmod 440 /etc/sudoers.d/deploy # Reuse the key you already used to reach root install -d -m 700 -o deploy -g deploy /home/deploy/.ssh cp /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys chown deploy:deploy /home/deploy/.ssh/authorized_keys chmod 600 /home/deploy/.ssh/authorized_keys Install Docker Install Docker CE from the official repository and add deploy to the docker group so Kamal can drive it without sudo: apt-get install -y -qq ca-certificates gnupg install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ > /etc/apt/sources.list.d/docker.list apt-get update -qq apt-get install -y -qq docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-plugin usermod -aG docker deploy systemctl enable --now docker One non-obvious detail: give the Docker daemon an explicit public DNS resolver. Without it, containers sometimes cannot resolve external hosts — and kamal-proxy needs to reach Let’s Encrypt to issue your TLS certificate: mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "dns": ["8.8.8.8", "8.8.4.4"] } EOF systemctl restart docker Harden SSH Use a drop-in file rather than sed-editing the main sshd_config — it is cleaner and survives package upgrades. Disable root login and password auth entirely: cat > /etc/ssh/sshd_config.d/99-hardening.conf <<EOF PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes EOF # Validate BEFORE restarting — a bad config can lock you out if sshd -t; then systemctl restart ssh else echo "sshd config invalid, not restarting" >&2 exit 1 fi Keep your current session open until you have confirmed, from a second terminal, that you can ssh deploy@your-server-ip. Locking yourself out of a fresh box is an annoying way to start. Firewall, fail2ban, and automatic upgrades Default-deny everything inbound, then allow only SSH and HTTP(S): ufw default deny incoming ufw default allow outgoing ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw --force enable fail2ban to throttle SSH brute-force attempts: cat > /etc/fail2ban/jail.local <<EOF [DEFAULT] bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = true port = ssh backend = systemd EOF systemctl enable --now fail2ban Security-only unattended upgrades so the kernel and OpenSSL stay patched without you babysitting them: cat > /etc/apt/apt.conf.d/20auto-upgrades <<EOF APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; EOF Finally, raise the open-file limit for the deploy user — Puma plus background workers plus DB connections will blow past the default 1024: sed -i '/^deploy\s\+\(soft\|hard\)\s\+nofile/d' /etc/security/limits.conf echo "deploy soft nofile 65536" >> /etc/security/limits.conf echo "deploy hard nofile 65536" >> /etc/security/limits.conf That is the whole security baseline: an unprivileged deploy user, key-only SSH, a default-deny firewall, brute-force protection, and automatic patching. If you want a second set of eyes on a setup like this before it faces the internet, that is exactly what a Rails technical audit covers. Step 2: Decide — Host Services or Kamal Accessories Kamal can run your database and Redis as accessories (containers it manages), or you can run them as host services (installed directly on the box). For a single server, I default to host services for the stateful pieces, because: Postgres on the host uses the OS package, gets security updates through unattended-upgrades, and its data lives in a normal directory you can back up with pg_dump and a cron job. There is no container restart that can disrupt a database that should essentially never move. The cost is that you wire up the networking yourself. The app container has to reach Postgres and Redis on the host, and it does that across the Docker bridge (172.17.0.1 by default). Wiring host Postgres to the Docker bridge Make Postgres listen on the bridge interface in addition to localhost, and allow password auth from Docker’s subnet: PG_CONF="/etc/postgresql/18/main/postgresql.conf" PG_HBA="/etc/postgresql/18/main/pg_hba.conf" sed -i "s/^#\?listen_addresses.*/listen_addresses = 'localhost,172.17.0.1'/" "$PG_CONF" # Allow connections from any Docker network (covers the default bridge and Kamal's) grep -q "172.16.0.0/12" "$PG_HBA" || \ echo "host all all 172.16.0.0/12 scram-sha-256" >> "$PG_HBA" systemctl restart postgresql Redis needs the same treatment — bind to the bridge and, because UFW already blocks external access, turn off protected mode so bridge connections are accepted: REDIS_CONF="/etc/redis/redis.conf" sed -i 's/^bind .*/bind 127.0.0.1 ::1 172.17.0.1/' "$REDIS_CONF" sed -i 's/^protected-mode yes/protected-mode no/' "$REDIS_CONF" sed -i 's/^appendonly no/appendonly yes/' "$REDIS_CONF" systemctl restart redis-server Then — and this is the step people forget — explicitly allow the Docker subnet through UFW to reach those ports. Otherwise the firewall silently drops your app’s database connections: ufw allow from 172.16.0.0/12 to any port 5432 ufw allow from 172.16.0.0/12 to any port 6379 ufw reload Your app then connects with a DATABASE_URL pointed at the bridge IP: DATABASE_URL=postgres://myapp:PASSWORD@172.17.0.1:5432/myapp_production REDIS_URL=redis://172.17.0.1:6379/0 When to use an accessory instead If you prefer Postgres-in-a-container — for parity with development, or to keep the host minimal — Kamal accessories are clean. The critical detail is the port binding: publish to 127.0.0.1, never 0.0.0.0, or you have just exposed your database to the internet (more on why in Pitfalls). accessories: db: image: postgres:18 host: 203.0.113.10 port: "127.0.0.1:5432:5432" # bound to loopback, not the public IP env: clear: POSTGRES_DB: myapp_production POSTGRES_USER: myapp secret: - POSTGRES_PASSWORD directories: - data:/var/lib/postgresql/data Either approach is valid. Host services trade a little setup for operational simplicity; accessories trade a little exposure risk for dev/prod parity. Pick one and be deliberate about it. Step 3: Configure Kamal Rails 8 generates config/deploy.yml and .kamal/secrets for you. Here is a complete single-server config: # config/deploy.yml service: myapp image: myuser/myapp servers: web: - 203.0.113.10 job: hosts: - 203.0.113.10 cmd: bin/jobs proxy: ssl: true host: app.example.com app_port: 3000 healthcheck: path: /up interval: 3 registry: server: ghcr.io username: myuser password: - KAMAL_REGISTRY_PASSWORD builder: arch: amd64 env: clear: RAILS_ENV: production SOLID_QUEUE_IN_PUMA: false secret: - RAILS_MASTER_KEY - DATABASE_URL - REDIS_URL aliases: console: app exec --interactive --reuse "bin/rails console" shell: app exec --interactive --reuse "bash" logs: app logs -f dbc: app exec --interactive --reuse "bin/rails dbconsole" A few things worth calling out: proxy.ssl: true with a host is all it takes for kamal-proxy to request and renew a Let’s Encrypt certificate. Point your domain’s A record at the server IP first, or the ACME challenge fails. healthcheck.path: /up uses Rails 8’s built-in health endpoint. Kamal will not route traffic to a new container until it returns 200, which is what makes deploys zero-downtime. builder.arch: amd64 matters if you develop on an Apple Silicon Mac. Without it, Kamal builds an arm64 image your amd64 server cannot run. Choosing a Container Registry Kamal builds your image locally (or in CI), pushes it to a registry, then pulls it down on the server. You need a registry both ends can reach — but you do not need a paid plan. The config above uses GitHub’s, which is the option I reach for first: Registry server: value Private images Cost GitHub Container Registry (GHCR) ghcr.io Yes Free — unlimited public, and private images are free for personal accounts and included in GitHub plans Docker Hub (omit — it’s the default) 1 free private repo Free tier with pull rate limits GitLab Container Registry registry.gitlab.com Yes Free with a GitLab repo Self-hosted (registry:2) your host/IP Yes Free, but it’s one more thing to run and secure GitHub Container Registry (ghcr.io) is the pragmatic default for most teams, especially if your code already lives on GitHub. It is free for both public and private images, has no Docker Hub-style pull rate limits, and ties access to credentials you already manage. Authenticate with a personal access token (classic) that has the write:packages scope — that token becomes your KAMAL_REGISTRY_PASSWORD: registry: server: ghcr.io username: myuser password: - KAMAL_REGISTRY_PASSWORD # a PAT with write:packages scope For Docker Hub, drop the server: line entirely (it’s Kamal’s default) and use your Docker Hub username plus an access token. Be aware of the anonymous/free-tier pull rate limits — on a single server that re-pulls on every deploy, a busy day can bump into them. For an air-gapped or fully self-owned setup, you can run a registry:2 container, but for a single-server app that is usually more operational surface than it saves. Whichever you pick, the image name in deploy.yml must match: myuser/myapp for GHCR/Docker Hub, or your-registry-host:5000/myapp for a self-hosted registry. Secrets Secrets are resolved from .kamal/secrets, which should pull from your environment or a secrets manager — never commit real values: # .kamal/secrets KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY=$(cat config/master.key) DATABASE_URL=$DATABASE_URL REDIS_URL=$REDIS_URL In CI, set those as environment variables (GitHub Actions secrets, for example). Locally, a tool like 1password CLI or a git-ignored .env feeds them in. The point is that deploy.yml is safe to commit and secrets only references names. Step 4: First Deploy With the server hardened and deploy.yml in place, the first deploy is two commands. kamal setup installs kamal-proxy, logs in to your registry, builds and pushes the image, and boots the app: kamal setup Once it is up, prepare the database. Because Postgres lives on the host, run migrations through the app container: kamal app exec "bin/rails db:prepare" Every subsequent release is just: kamal deploy Kamal builds the image, pushes it, boots a new container alongside the old one, waits for /up to pass, switches kamal-proxy to the new container, and retires the old one. No downtime, no manual proxy juggling. A sane first-deploy checklist DNS A record for app.example.com points at the server IP ssh deploy@server works with your key (root login already disabled) DATABASE_URL / REDIS_URL point at 172.17.0.1 (host services) or the accessory RAILS_MASTER_KEY is available to .kamal/secrets builder.arch matches your server’s CPU architecture /up returns 200 locally before you rely on it as a healthcheck You can reach https://app.example.com and the certificate is valid Step 5: Backups and Ongoing Operations A deploy is not done until the data is backed up. For host Postgres, a nightly pg_dump piped to object storage via cron is enough for most single-server apps: # /home/deploy/bin/backup-db.sh (sketch) set -euo pipefail STAMP=$(date -u +%Y%m%d-%H%M%S) pg_dump myapp_production | gzip > "/tmp/myapp-${STAMP}.sql.gz" # upload to your object store of choice, then clean up aws s3 cp "/tmp/myapp-${STAMP}.sql.gz" "s3://your-bucket/db/" --endpoint-url "$S3_ENDPOINT" rm -f "/tmp/myapp-${STAMP}.sql.gz" 0 2 * * * /home/deploy/bin/backup-db.sh 2>> /var/log/db-backup.log Pair it with a logrotate rule so the log does not grow forever, and — importantly — test a restore at least once. A backup you have never restored is a hypothesis, not a backup. Day-to-day, Kamal gives you the operations you need without SSHing into the box: Task Command Tail logs kamal app logs -f Open a console kamal console (the alias above) Run a one-off task kamal app exec "bin/rails some:task" Roll back to previous release kamal rollback Restart the app kamal app boot Restart the proxy kamal proxy reboot kamal rollback is the one to remember. If a deploy ships a bad release, you are one command from the previous image, because Kamal keeps it around. Common Pitfalls A short list of the things that actually bite people on single-server Kamal deploys: Docker punches through UFW This is the big one. Docker writes its own iptables rules, and published container ports bypass UFW. Your ufw default deny incoming does not protect a container port published to 0.0.0.0. This is precisely why an accessory database must bind to 127.0.0.1:5432:5432 and not 0.0.0.0. kamal-proxy publishing 80/443 is fine — you want those open — but never assume UFW is shielding a published port. Forgetting the Docker subnet firewall rule If host Postgres listens on the bridge but you never run ufw allow from 172.16.0.0/12 to any port 5432, the app container’s connections are silently dropped and you will chase a “database unreachable” ghost. Architecture mismatch Building on Apple Silicon and deploying to an amd64 VPS without builder.arch: amd64 produces an image that will not boot. The error is rarely obvious. Let’s Encrypt can’t validate If DNS is not pointed at the server yet, or the Docker daemon has no DNS resolver, the ACME challenge fails and you get no certificate. Point DNS first; set daemon.json DNS during hardening. Treating the master key as optional No RAILS_MASTER_KEY in the container means encrypted credentials do not decrypt, and the app boots into a confusing half-broken state. Make sure it flows through .kamal/secrets. When a Single Server Is Enough — and When It Isn’t A hardened single server with Kamal is the right answer for the overwhelming majority of Rails SaaS apps: predictable cost, simple mental model, real zero-downtime deploys. It scales vertically a long way, and when you do outgrow it, Kamal already supports multiple hosts — you add IPs to the servers block and put a load balancer in front. The time to rethink is when you need high availability that survives a single box dying, multi-region latency, or a managed database with automated failover. Until then, resist the pull toward complexity you do not yet need. If you would rather hand the whole pipeline — server hardening, Kamal config, backups, and monitoring — to a team that does this every week, that is the core of our Rails Care Plans. And if your app is still on an older Rails version, getting to Rails 8 first is what Rails Upgrade Express is for. Frequently Asked Questions Do I need Kamal, or can I just use Capistrano or a PaaS? Kamal targets a different model than Capistrano: it deploys your app as a Docker container rather than running code directly on the host, which gives you reproducible images and trivial rollbacks. Compared to a PaaS like Heroku or Render, Kamal on your own VPS is dramatically cheaper at scale and keeps you off proprietary infrastructure — at the cost of owning server hardening and backups yourself. If you want zero ops and are happy paying for it, a PaaS is fine. If you have a senior engineer and want control plus low cost, Kamal on a single server is the sweet spot. Is a single server really enough for a production SaaS? For the large majority of Rails apps, yes. One VPS with a few dedicated vCPUs and 8–16 GB of RAM handles the web app, a worker, Postgres, and Redis for thousands of users. You scale vertically (a bigger box) for a long time before you need horizontal scaling. The honest limiter is not throughput — it is availability. A single server means a single point of failure, so the question to ask is whether you can tolerate occasional minutes of downtime, not whether the box is fast enough. What happens to my app during a deploy? Nothing visible, if your healthcheck is set up. Kamal boots the new container alongside the old one, waits for /up to return 200, then switches kamal-proxy to the new container and retires the old one. In-flight requests finish on the old container. That is what makes kamal deploy zero-downtime. How do I roll back a bad release? kamal rollback. Kamal keeps the previous image on the server, so rollback is near-instant — it just points the proxy back at the prior container. This is one of the strongest reasons to deploy containers rather than mutating a host in place. Should I run Postgres on the host or as a Kamal accessory? On a single server, I default to host Postgres: it gets OS security updates automatically, its data lives in a normal directory you can pg_dump, and no container restart can ever disrupt it. Use an accessory if you want dev/prod parity or to keep the host minimal — just bind its port to 127.0.0.1, never 0.0.0.0, or you expose your database to the internet. Does the firewall actually protect my Docker containers? Not automatically — this trips up almost everyone. Docker writes its own iptables rules, so a container port published to 0.0.0.0 bypasses UFW entirely. UFW protects host services (SSH, host Postgres on the bridge), but for containers you control exposure through the port binding. Publish internal services to loopback or the Docker bridge, and only let kamal-proxy bind 80/443 publicly. Which container registry should I use? GitHub Container Registry (ghcr.io) is the free default I reach for — unlimited public images, free private images, and no Docker Hub-style pull rate limits. Docker Hub works too but watch its rate limits on a server that re-pulls each deploy. See the registry section above for the full comparison. How do I handle database migrations? There are two common places to run migrations, and the choice matters more than it looks. Option 1 — in bin/docker-entrypoint. The Rails 8 generated entrypoint can run ./bin/rails db:prepare as each container boots. It is the simplest setup and fine for small apps. The catch: migrations now run inside the container’s startup, and they count against the time Kamal waits for the healthcheck to pass. A long migration on a growing table can exceed the container-up timeout, Kamal marks the boot as failed, and your deploy aborts — sometimes with the migration half-applied. Option 2 — as a Kamal hook (recommended). Run migrations from a .kamal/hooks/pre-deploy (or post-deploy) hook instead, decoupled from container boot: #!/usr/bin/env bash # .kamal/hooks/pre-deploy set -euo pipefail kamal app exec "bin/rails db:migrate" This runs the migration once, in its own step, with no bearing on the healthcheck timeout — so it scales as your migrations get longer and slower. Either way, migrations run inside the deployed image, so they use the exact code being shipped. Use the entrypoint for first-deploy convenience (db:prepare), but move recurring migrations to a hook before they grow long enough to start timing out your deploys. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Choosing a Reliable Ruby on Rails Development Partner for Ongoing Maintenance and Feature Work URL: https://railsfever.com/blog/rails-development-partner-maintenance-feature-work/ Date: 2026-04-25 Author: Wale Olaleye There is a moment in the life of most production Rails apps when the original setup stops working. The first developer is gone, or stretched thin, or only ever wanted to ship the MVP. The app is live, customers depend on it, and two things are now in tension: the framework needs to stay current and secure, and the roadmap needs to keep moving. Both need to happen, and neither is happening reliably. That is the moment people start searching for a Ruby on Rails development partner. Not a freelancer for one bug. Not an agency for one project. Not a full-time hire that will take four months to find. A partner — a small, senior team that takes ownership of the app’s health and helps ship new features, month after month. This post is a practical guide to choosing one. What “Ruby on Rails Development Partner” Actually Means The word “partner” gets thrown around a lot. Used precisely, it describes something specific. A Rails development partner is a small, senior team that: Takes ongoing ownership of a defined slice of your Rails app’s health — security patches, gem updates, Rails and Ruby upgrades, monitoring. Builds new features inside the same codebase, with the same engineers, on a predictable cadence. Treats your app as a long-term relationship, not a transaction. The same people work with you next quarter and next year. Operates with their own process and judgment, rather than waiting to be told what to do every week. The defining feature is the combination. Maintenance alone is a support contract. Feature work alone is project work. A partner delivers both, under one accountable relationship, with a single team that holds the context. How a partner differs from the alternatives Model What you get Where it falls short Freelancer Hourly help on specific tickets No continuity, no ownership of overall health Project agency Defined scope, fixed deliverable Engagement ends at handoff; nobody owns ongoing care Staff augmentation Bodies on your team You manage all the work; knowledge leaves when they do Full-time hire 40+ hrs/week of dedicated capacity 2-4 months to find; $150K-$220K/yr; single point of failure Rails development partner Combined maintenance + feature work, same team, ongoing Requires a good partner; less hour-by-hour control than a hire If you are weighing this against a fractional model specifically, see fractional Rails engineers — when and why. The two models overlap; “partner” describes the relationship, while “fractional” describes the engagement size. What “Reliable” Looks Like in Practice “Reliable” is the word people use, but it is not very specific. Here is what it actually means when applied to a Rails development partner. Predictable cadence You know what is happening this month and next month. Maintenance is on a rhythm — gem updates, CVE reviews, Ruby and Rails upgrade progress. Feature work has a defined queue with rough sizing and an expected delivery window. There are no surprises about when things happen. Named, consistent engineers The same one or two senior engineers work on your app every month. They know your domain, your deploy process, and the weird parts of your codebase that nobody documented. They are not a rotating cast. Communication that does not depend on you chasing A weekly or biweekly written update lands without you asking. There is a shared channel where questions get answered the same day. Monthly summaries cover what shipped, what was patched, and what is next. Clear written scope You know what is included in the monthly fee and what is billed separately. Critical CVE response is covered. Rails upgrade work is either covered or scoped explicitly. Feature work has a defined capacity envelope. Nothing is “we’ll figure it out.” Track record they can describe They can tell you about the apps they currently maintain — Rails versions, sizes, kinds of features they have shipped. They can connect you with at least one current client. They have moved real production apps between Rails versions, more than once. If a candidate cannot describe these things in a 30-minute call, they are not selling reliability. They are selling availability. What a Combined Maintenance + Feature Work Engagement Contains The thing that makes a development partner different from a support contract is the combined scope. Done well, a single monthly engagement covers both sides of the work without forcing you to manage the split. Maintenance work, every month Gem patch updates applied and tested. Security advisories reviewed; critical CVEs patched within days. Ruby patch versions applied when released. Quarterly progress on the next Rails minor or major upgrade. Monitoring kept healthy — error tracking, uptime alerts, background job health. Deploy pipeline kept current. Feature work, on the same monthly engagement Feature scoping with clear, smallest-valuable-version thinking. Implementation inside the existing app, using its existing patterns. Safe migrations and database design. Tests where they actually matter. Deploys with rollback plans. Post-launch support and iteration. The same engineers do both. They know that the feature you are shipping next week needs to coexist with the Rails 8 upgrade two months from now, and they plan accordingly. That is the value of one team holding the whole picture — there is no wall between “the support team” and “the feature team.” For more on what good Rails maintenance looks like in isolation, see the complete Rails app maintenance guide and how to maintain Ruby on Rails. How to Evaluate a Rails Development Partner A short list of questions that separate the actual partners from the people who use the word. “Are you a Rails specialist?” A team that does Rails alongside React, Python, Go, and PHP is spreading attention across ecosystems. Rails has its own gem ecosystem, security advisory cadence, and upgrade patterns. A specialist knows them; a generalist looks them up. “Will the same engineers work on our app every month?” If the answer is anything other than yes, keep looking. Continuity is the entire point. A different engineer every month means context is constantly being rebuilt at your expense. “How do you split maintenance and feature work each month?” A good partner has a default — for example, a fixed maintenance baseline plus a remaining capacity envelope for features, with the ability to flex when something urgent comes up. A vague answer here means the work will be vague too. “What is your Rails upgrade history?” Ask for specifics: which Rails versions they have upgraded, on apps of what size, how long it took, what broke. If they have never moved a production app between major Rails versions, the maintenance side of the engagement will be shallow. “How do you communicate?” Specifics matter: weekly written update, shared Slack channel, monthly report. If they cannot describe their default communication rhythm, they do not have one, and you will spend the engagement chasing them. “Can we talk to a current client?” The willingness to connect you with a real reference is one of the strongest signals available. Most marketing claims are unverifiable; a real client on a 30-minute call is not. For more on the evaluation step specifically, see choosing a Rails support consultancy — what actually matters. Red Flags A few signals that a candidate is not actually a development partner, regardless of how the website reads: Rotating engineers. A new face every month means nobody is building deep context. No defined maintenance process. “We patch when there’s a problem” is reactive support, not partnership. No Rails upgrade history. If they have never moved a production app between Rails majors, they will not know what they do not know. Invoice-only communication. If you only hear from them when the bill arrives, they are not partnering. No staging environment requirement. A team that ships to production without staging is gambling with your app. Hourly billing for everything. Pure hourly billing optimizes the wrong thing — it rewards slow work and discourages investment in your app’s long-term health. Vague scope. “It depends” answered to every scope question means the scope is whatever they decide it is at invoice time. One of these is a yellow flag. Two or more is a different conversation. What It Costs Pricing varies with app complexity, team size, and how much capacity you need, but rough ranges for a Ruby on Rails development partner engagement: Patch-level maintenance only (gems, security, monitoring): $2K-$5K/month Full maintenance + small fixes: $4K-$8K/month Maintenance + active feature development: $8K-$15K/month Dedicated senior capacity (multiple engineers, larger feature throughput): $10K-$18K/month Compare that to a full-time senior Rails hire, which runs $12K-$18K/month in salary alone, plus benefits, equipment, recruiting time, and 2-4 months to find them. The partner model is not always cheaper on paper — it is cheaper per unit of useful output, because you are paying for capacity that is already productive on your codebase. For a longer treatment of the economics, see Ruby on Rails maintenance cost and stop wasting money on one-off Rails upgrades. How to Decide If This Is the Right Model A short checklist. If you can answer yes to most of these, a Rails development partner is probably the right fit: Your Rails app is in production with real users. You do not have a full-time Rails owner — or the one you have is stretched too thin to cover both maintenance and features. Both sides of the work need to keep moving: the framework cannot drift, and the roadmap cannot stall. You want one accountable team rather than juggling a freelancer for fixes, an agency for features, and a separate person for upgrades. You want predictable monthly spend, not surprise emergency projects. You want senior judgment, not pure execution capacity. If you are still mostly looking for help on a single project, a project engagement may fit better. If you have 40+ hrs/week of Rails work and a CTO who can manage it, a full-time hire makes sense. Everywhere in between is partner territory. How Rails Fever Operates as a Development Partner At Rails Fever, the partner model is the default — most of our long-term clients run a Rails Care Plan for the maintenance side and add feature development capacity on top. Same engineers, same context, one relationship, one invoice. For teams that also need technical leadership — architecture decisions, hiring guidance, vendor selection — our Fractional CTO service layers strategic oversight on top of the engineering work. If you are not sure where your app stands today, a Rails technical audit is the right starting point. It produces a written report you can use to decide whether you need a partner now, soon, or not for a while. Looking for a reliable Ruby on Rails development partner for ongoing maintenance and feature work? Our Rails Care Plan handles the maintenance baseline, feature development keeps the roadmap moving, and the Fractional CTO service adds leadership where you need it. View our pricing plans to see how the pieces fit together. Schedule a consultation or email hello@railsfever.com to discuss what a long-term Rails partnership could look like for your app. --- # What Ruby Version Does Rails 8 Actually Require? URL: https://railsfever.com/blog/minimum-ruby-version-for-rails-8/ Date: 2026-04-24 Author: Wale Olaleye Every time a new Rails major ships, the same question churns through blog posts, Stack Overflow answers, and internal Slack channels: what is the minimum Ruby version? And the internet, being the internet, produces several confident but contradictory answers. For Rails 8, this is the short version: Minimum Ruby version: 3.2.0 Recommended Ruby version: 3.3 or later The rest of this post shows where those numbers come from, why the Rails 7.2 requirement often gets confused with Rails 8, and what you should actually install on your server today. Where the Minimum Comes From The authoritative source for a Rails version’s minimum Ruby is the rails.gemspec file in the corresponding stable branch. For Rails 8.0, that file specifies: s.required_ruby_version = ">= 3.2.0" This is the constraint that bundle install will enforce. If your system Ruby is older than 3.2.0, Rails 8 will refuse to install. Full stop. The official Rails upgrade guide says the same thing: “Rails 8.0 and 8.1 require Ruby 3.2.0 or newer.” Why Ruby 3.1 Keeps Getting Cited There is a widely circulated claim that Rails 8 requires Ruby 3.1. This claim is wrong, but it has a plausible origin. The Rails PR that bumped the minimum Ruby to 3.1 landed in late 2023 and was titled “Bump the required Ruby version to 3.1.0.” That PR was merged before Rails 8 released and became the basis for Rails 7.2’s minimum — not Rails 8’s. Between Rails 7.2 and Rails 8, the Rails team raised the minimum again to 3.2. So: Rails 6.1 requires Ruby 2.5+ Rails 7.0 and 7.1 require Ruby 2.7+ Rails 7.2 requires Ruby 3.1+ Rails 8.0 and 8.1 require Ruby 3.2+ If you see a source confidently saying Rails 8 runs on Ruby 3.1, it is almost always a reader who found PR 50491, read “Rails” and “3.1” and “required Ruby version,” and drew the wrong conclusion. The gemspec is the canonical source. It says 3.2. Where the Recommended Version Comes From Minimum and recommended are different things. The minimum is what Rails will tolerate. The recommended is what Rails works best on. The Rails issue tracking the Ruby recommendation for Rails 8 captures the core team’s reasoning: push adoption forward by defaulting new applications to Ruby 3.3 (and later, Ruby 3.4), and drop internal support cruft for older versions where possible. In practice, this means: rails new in Rails 8 scaffolds a Gemfile with Ruby 3.3 or newer. Generated Dockerfiles assume a current Ruby. Official benchmarks and guides use Ruby 3.3+ as the reference. If you install Ruby 3.2 to satisfy the minimum, Rails 8 will work. But you will be running on a Ruby that Rails considers the floor, not the target. Performance, YJIT improvements, and new standard-library features all favor the newer Ruby. What You Should Actually Install For a new Rails 8 application, install the latest stable Ruby supported by Rails 8 and your dependency set, and pin that version in your environment and configuration so every developer, CI run, and deploy uses the same Ruby. That gives you the Ruby the Rails team is actively optimizing against. For an existing Rails 8 application that needs to be upgraded, the order of operations is: Upgrade Ruby first to at least 3.2, ideally 3.3 or 3.4. Run your full test suite on the new Ruby, on the current Rails version, for at least a week in staging. Then upgrade Rails. Skipping step 1 — trying to upgrade Ruby and Rails simultaneously — is the number-one source of upgrade stalls. Each change has its own failure modes. Stacking them multiplies the debugging surface. The Ruby Release Cadence and What It Means Ruby ships a new minor version every December. Each version gets roughly three years of maintenance, then moves to security-only mode, then reaches end-of-life. In practical terms: Ruby 3.2: End-of-life approximately March 2026. If you are on 3.2 today, plan to move. Ruby 3.3: Maintained into early 2027. Safe choice for a new production deploy. Ruby 3.4: Latest stable. First choice for new applications. Rails 8 supports all three, but the cost of being on the lowest version climbs over time. Today’s “minimum” is next year’s “deprecated.” A Ruby that is comfortable today is at end-of-life in 18 months. For a fuller treatment of Ruby versioning from a business perspective, see our post on understanding Ruby versioning for founders. The Rails-Ruby Compatibility Table For reference, here is the compatibility matrix for recent Rails versions, pulled from the Rails upgrade guides and the FastRuby compatibility table: Rails Version Minimum Ruby Recommended Ruby Status Rails 6.0 2.5.0 2.6.x End-of-life Rails 6.1 2.5.0 3.0.x End-of-life Rails 7.0 2.7.0 3.3.x End-of-life Rails 7.1 2.7.0 3.4.x End-of-life Rails 7.2 3.1.0 3.4.x Security only Rails 8.0 3.2.0 3.4.x Active Rails 8.1 3.2.0 3.4.x Active The pattern is consistent: each minor bumps the Ruby floor, and the “recommended” tracks whatever the latest stable Ruby is at release time. Practical Recommendation If you are deploying Rails 8 today and you do not have a specific constraint pushing you lower: Install the latest stable Ruby supported by Rails 8 and your dependency set. Pin the chosen version in .ruby-version. Add ruby "3.4.x" to your Gemfile. Match the version in your Dockerfile, CI config, and any other environment that runs Ruby. This gives you the smoothest Rails 8 experience today, the longest runway before the next forced Ruby upgrade, and avoids every “minimum version is fine” conversation that tends to come back as a problem a year later. Planning a Rails 8 deployment or a Ruby upgrade ahead of one? Our Rails Upgrade Express service handles both the Ruby and Rails sides in a single engagement, so the version alignment is correct the first time. For ongoing Ruby and Rails currency, see the Rails Care Plan. Schedule a consultation or email hello@railsfever.com to plan your Rails 8 upgrade. --- # Ruby Version and Ubuntu Compatibility: It's All About OpenSSL URL: https://railsfever.com/blog/ruby-version-ubuntu-openssl-compatibility/ Date: 2026-04-23 Author: Wale Olaleye Every Rails team hits this eventually. You provision a new Ubuntu server. You try to install Ruby — usually an older version, because that is what the app uses. It fails somewhere deep in the build with a cryptic OpenSSL error. An hour later you are deep in StackOverflow reading about OPENSSL_ROOT_DIR, libssl1.1 PPAs, and people recommending you just “switch to Docker.” The underlying issue is almost always the same: the Ruby you are trying to install does not support the OpenSSL that shipped with the Ubuntu you are trying to install it on. Once you understand the compatibility matrix, the fix is usually straightforward. This post lays out the matrix and the practical decision tree. Why OpenSSL Is the Pivot Ruby links against OpenSSL at build time for its openssl, net/https, digest, and related standard library modules. Every Ruby release supports a specific range of OpenSSL versions — and OpenSSL has had two major transitions in the relevant window: the move from 1.0.x to 1.1.x, and the move from 1.1.x to 3.0.x. Ubuntu ships whichever OpenSSL was current when the Ubuntu release was cut. If you install a Ruby that predates that OpenSSL version, the build either fails or produces a Ruby that cannot make HTTPS connections. The Ubuntu maintainers do not update OpenSSL versions within a release. So a Ruby that worked on Ubuntu 20.04 may not build on Ubuntu 22.04 without extra work. The Ruby / OpenSSL Matrix Per the Ruby on Mac OpenSSL compatibility reference: Ruby Version OpenSSL Required Notes 4.0.x >= 1.1 Prefers 3.0+ 3.4.x >= 1.1 Prefers 3.0+ 3.3.x >= 1.1 Prefers 3.0+ 3.2.x >= 1.1 Prefers 3.0+ (end-of-life) 3.1.x >= 1.1 Prefers 3.0+ (end-of-life) 3.0.x >= 1.1, < 3.0 End-of-life 2.7.x >= 1.1, < 3.0 End-of-life 2.6.x >= 1.1, < 3.0 End-of-life 2.5.x >= 1.1, < 3.0 End-of-life 2.4.x >= 1.1, < 3.0 End-of-life 2.3.x >= 1.0, < 1.1 End-of-life 2.2.x >= 1.0, < 1.1 End-of-life The critical breakpoint: Ruby versions older than 3.1 do not support OpenSSL 3.0. They were released before OpenSSL 3.0 existed, and the C API changes were not backported. The Ubuntu / OpenSSL Matrix And here is what each Ubuntu LTS ships with by default: Ubuntu Release OpenSSL Default Ubuntu 18.04 (Bionic) 1.1.1 Ubuntu 20.04 (Focal) 1.1.1 Ubuntu 22.04 (Jammy) 3.0.2 Ubuntu 24.04 (Noble) 3.0.13 The big jump is between 20.04 and 22.04 — that is where OpenSSL moved from 1.1.x to 3.0.x. That jump is the source of most “my Ruby build just broke” support tickets. The Combined Compatibility Table Putting the two together, here is what actually works out of the box on each Ubuntu release: Ubuntu Release Works Cleanly Requires Extra Work Will Not Work 18.04 Ruby 2.4 – 3.4 (Ubuntu is EOL; see notes) Ruby 2.3 and older 20.04 Ruby 2.4 – 3.4 Ruby 4.0 (may need newer OpenSSL) Ruby 2.3 and older 22.04 Ruby 3.1 – 4.0 Ruby 2.4 – 3.0 (needs OpenSSL 1.1) Ruby 2.3 and older 24.04 Ruby 3.1 – 4.0 Ruby 2.4 – 3.0 (needs OpenSSL 1.1) Ruby 2.3 and older The pattern: if you are on Ubuntu 22.04 or 24.04 and your app uses Ruby 3.0 or older, installing it is not a native-apt-packages job. You need to either install OpenSSL 1.1 alongside the system OpenSSL 3, or containerize. The “Works Cleanly” Path If your Ruby and Ubuntu are in the green zone, the install just works: # On Ubuntu 22.04 or 24.04, installing Ruby 3.3 sudo apt-get install -y build-essential libssl-dev libffi-dev \ libyaml-dev libreadline-dev zlib1g-dev libgmp-dev \ libncurses5-dev libgdbm-dev # Using rbenv: rbenv install 3.3.9 rbenv global 3.3.9 That path is boring and reliable when the versions align. The “Requires Extra Work” Path: Old Ruby on New Ubuntu This is the common pain case: your Rails app is on Ruby 2.7 or 3.0, and your ops team is migrating to Ubuntu 22.04 or 24.04. The Ruby build will fail on OpenSSL. Three paths, in order of preference: Option A: Upgrade Ruby If you can, this is the right move. Getting onto Ruby 3.1+ removes the OpenSSL problem entirely and unblocks future Rails upgrades. For most apps, the Ruby jump from 2.7 or 3.0 to 3.1+ is modest — harder than a patch, easier than a Rails minor. If your Rails version supports it (Rails 6.1+ runs on Ruby 3.1), upgrade Ruby first, then provision the new Ubuntu box. See our Rails 6 to Rails 8 upgrade guide for the surrounding context. Option B: Build Ruby Against OpenSSL 1.1 If you genuinely cannot upgrade Ruby in the short term, install OpenSSL 1.1 on the Ubuntu box and build Ruby against it. # Install OpenSSL 1.1 from a trusted source (not the default apt repo on 22.04/24.04). # One common approach: build from source. cd /tmp wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=/opt/openssl-1.1 --openssldir=/opt/openssl-1.1 make -j$(nproc) sudo make install # Then build Ruby against it: RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/openssl-1.1" \ rbenv install 2.7.8 Caveat: OpenSSL 1.1 reached end-of-life in September 2023. You are running crypto that is no longer receiving security patches. This is acceptable as a short-term bridge during an upgrade; it is not a long-term production posture. Option C: Containerize Run the old Ruby in a Docker container based on an older Ubuntu (20.04) or a Ruby-official base image. The host Ubuntu’s OpenSSL version becomes irrelevant inside the container. This is the pragmatic answer for teams with infrastructure already leaning on containers. The drawback is that you have not actually solved the Ruby-end-of-life problem — you have just insulated it from the host OS. Ubuntu 18.04 Is EOL; Don’t Build New Infrastructure There Ubuntu 18.04 LTS reached end of standard support in May 2023 and will reach end of extended security maintenance in April 2028. Do not provision new servers on it. If you have old infrastructure still on 18.04 and your Rails app only runs there because of Ruby/OpenSSL alignment, you are carrying compounding debt on both axes. Plan a joint Ruby + Ubuntu upgrade rather than extending the life of either. The Right Target Today For new Ubuntu infrastructure running Rails in 2026: Ubuntu 24.04 LTS — supported through 2029. Ruby 3.3 or 3.4 — matches OpenSSL 3.0+ cleanly and is supported through 2027-2028. Rails 7.2 or 8.0 — both work on this pairing. That combination installs with no special flags, receives security updates from all three upstreams, and has runway measured in years, not months. A Quick Diagnostic Checklist When a Ruby install fails with a confusing error, work through this list: lsb_release -a — which Ubuntu? openssl version — which OpenSSL is installed on the host? Which Ruby version are you trying to install? Cross-reference against the tables above. Is your Ruby compatible with that OpenSSL? If the answer is no, you have found the issue. The fix is one of the three options above. Further Reading OpenSSL versions supported by Ruby — the authoritative matrix Understanding Ruby versioning for founders — the business-side view of Ruby versions Minimum Ruby version for Rails 8 — the forward-looking Ruby target Struggling to install an old Ruby on a new Ubuntu, or planning infrastructure changes that bump into Ruby version constraints? Our Rails Care Plan and Rails Upgrade Express services regularly handle these Ruby-and-OS alignment projects — so the server migration and Ruby upgrade happen once, together, correctly. Schedule a consultation or email hello@railsfever.com to plan your Ruby and OS upgrade. --- # Upgrading From Rails 6 to Rails 8: The Full Guide URL: https://railsfever.com/blog/rails-6-to-rails-8-upgrade-guide/ Date: 2026-04-22 Author: Wale Olaleye Rails 6 shipped in August 2019. Rails 8 shipped in late 2024. Between them sit four years of changes: Zeitwerk, Trilogy, Propshaft, Solid Cache, Solid Queue, the deprecation of Sprockets, shifts in default configuration, and three Ruby major-minor bumps. You cannot jump Rails 6 to Rails 8 in one step. The official Rails upgrade guides are unambiguous: move one minor at a time. That is not advice you can skip — the internal deprecation warnings only fire at each version, and skipping a minor means silently carrying forward broken assumptions that will surface as weird runtime errors two releases later. This guide lays out the full path, version by version, with the specific things to check at each step. The Path From Rails 6.0 or 6.1, the route to Rails 8 goes: 6.0 → 6.1 → 7.0 → 7.1 → 7.2 → 8.0 That is five upgrade steps if you are starting on 6.0, four if you are starting on 6.1. Each step should be its own branch, its own PR, and its own deploy to production. Do not batch them. Ruby version bumps are separate steps and should happen between Rails upgrades, not alongside them. Before You Start: Baseline Health Nothing about this guide works if your current Rails 6 app is in bad shape. Before step one: bundle exec rspec (or bin/rails test) passes, no flakes, in CI. bundle outdated has been reviewed in the last month. bundle exec bundle-audit check --update is clean. You have a staging environment that mirrors production. Deploys are a single command with a working rollback path. You can spin up a new branch and run the test suite against a clean database in under five minutes. If any of those are false, fix them first. The Rails 6-to-8 jump has enough surface area on its own; attempting it on a brittle base turns it into a multi-month disaster. Stage 0: Rails 6.0 to Rails 6.1 Skip this stage if you are already on 6.1. Rails 6.1 is the easier half of the 6.x line. The key changes: Zeitwerk is the default autoloader in new apps but Rails 6.1 still supports Classic. Switch to Zeitwerk now if you have not — Rails 7.0 will force the issue. The dedicated Zeitwerk transition guide covers the common fixes. Strict loading associations can surface N+1 queries earlier. Worth enabling in development. Per-database switching for multi-database setups was refined. If you use horizontal sharding, re-read the guide. Ruby requirement: Ruby 2.5+, but you should be on Ruby 3.0 or newer before moving to Rails 7. The common landmines: Classic autoloader files with naming that breaks under Zeitwerk (constants that do not match file paths). Enum behavior changes around validates on enums. Deprecations around Rails.application.routes.default_url_options. Update Gemfile, run bundle update rails, run tests, fix what breaks, run rails app:update, review the config diff, deploy. Stage 1: Rails 6.1 to Rails 7.0 This is the largest single jump on the path and the one most likely to eat a week of developer time. Rails 7.0 introduced a major shift in frontend tooling and forced Zeitwerk adoption. Ruby requirement: Ruby 2.7.0 minimum, but upgrade to Ruby 3.0 or 3.1 before this stage. Rails 7.0 on Ruby 2.7 is possible but awkward — many gems have moved on. The major surface areas: Asset pipeline rewrite. Rails 7.0 introduces Propshaft as an alternative to Sprockets, and the default for new apps shifts away from Webpacker toward import maps or jsbundling-rails/cssbundling-rails. You do not have to migrate immediately — keep Sprockets and Webpacker if you want — but understand where the project is heading. Zeitwerk is mandatory. Classic autoloader support is removed. Any remaining classic-style files will break. Encrypted attributes become a framework feature, replacing some third-party gems. Async query loading is available for long-running queries in parallel. The common landmines: Webpacker deprecation. Webpacker is officially retired in Rails 7. You can keep it working, but the clock is ticking. ActiveRecord::Base.connection_config is deprecated in favor of connection_db_config. Spring is removed from new Rails 7 apps. Keep it in your Gemfile if you were relying on it. Minor behavior changes in delegate_missing_to and attr_accessor in controllers. Run rails app:update carefully. Diff the generated changes against your existing configs. Reject the asset pipeline changes if you are not ready to migrate Webpacker or Sprockets yet. Expect this stage to take 2-5 engineer-days on a mid-sized app. Stage 2: Rails 7.0 to Rails 7.1 Rails 7.1 is a polish release. Most apps make this jump in a day or two. Ruby requirement: Ruby 2.7+, but 3.1 or later is strongly recommended. The major surface areas: Default config bumps. Several configs that were deprecation-warning only in 7.0 get stricter defaults in 7.1. Composite primary keys are finally supported in ActiveRecord. Async query consolidation, better Trilogy support. The common landmines: secrets.yml handling — some edge cases changed. If you still use Rails.application.secrets anywhere, audit. Autoloader edge cases around namespaced constants in engines. ActionController::Parameters#each behavior tweak. rails app:update, review config diffs, run tests, deploy. Short stage. Stage 3: Rails 7.1 to Rails 7.2 Rails 7.2 was specifically designed as the on-ramp to Rails 8. Almost everything that will land in 8 has a migration path in 7.2. Ruby requirement: Ruby 3.1.0 minimum. If you are still on Ruby 3.0 here, upgrade Ruby first. The major surface areas: Trilogy becomes the default MySQL adapter in generators (mysql2 still works). Dev container support shipped for Rails apps. PWA manifest and service worker scaffolded in new apps. YJIT enabled by default on supported Ruby versions. The common landmines: If you have custom rack middleware, re-verify the middleware stack order. require statements in initializers that relied on autoloading semantics — Zeitwerk’s 7.2 behavior is stricter. Production asset compilation flags — several defaults were tightened. This is a short stage on most apps. A day or two. Critical checkpoint: at the end of Stage 3, you are on Rails 7.2 with Ruby 3.1+. This is the known-good platform to launch Rails 8 from. Do not skip it even if you are tempted to fast-forward. Stage 4: Ruby Upgrade Before Rails 8 Rails 8 requires Ruby 3.2.0 minimum, and recommends Ruby 3.3 or newer. (See our post on the minimum Ruby version for Rails 8 for the source citations.) Before attempting the Rails 8 bump, upgrade Ruby: Target Ruby 3.3 or 3.4 — not just the minimum 3.2. Do this as its own PR, on Rails 7.2, with no framework changes. Run the full test suite, deploy to staging, let it bake at least a few days. Skipping this — bumping Ruby and Rails in the same PR — is the single most common way to turn a boring upgrade into a bisecting nightmare. Stage 5: Rails 7.2 to Rails 8.0 If you have been disciplined through the previous stages, this is usually the shortest stage of the whole project. Ruby requirement: Ruby 3.2.0 minimum, 3.3 or 3.4 recommended. The major surface areas: Solid Cache, Solid Queue, Solid Cable replace Redis and Sidekiq in new apps (old apps can keep Redis-backed workers; Solid Queue is optional). Kamal 2 is the default deploy tool in scaffolded Dockerfiles. Authentication generator ships in the framework. Propshaft becomes the default asset pipeline in new apps. Rails 8 generators produce slimmer, more opinionated apps. The common landmines: If you still depend on Sprockets, pin it explicitly — it is no longer a default. If you use Devise or another auth gem, the new built-in authenticate_by helpers may conflict if you do not name things carefully. The Docker generator assumes Kamal; if you deploy to Heroku or another PaaS, override. Minor behavior changes in ActiveRecord transaction callbacks. For the detailed step-by-step of this specific stage, see our Rails 7.2 to Rails 8 upgrade guide. Gem Ecosystem: Audit at Every Stage Major Rails versions break gems. At each stage, expect to: Update any gem with a Rails version dependency. Remove gems that have been absorbed into Rails (e.g., byebug after Ruby debug stdlib matures, webpacker after you migrate assets). Watch for gems that are no longer maintained. A gem with no commits since Rails 6 is a gem you should be nervous about. Bundler’s error messages during bundle update rails are usually informative. Read them carefully rather than reflexively running bundle update --all to “fix” them. Test Strategy Across the Upgrade A four-stage Rails upgrade is a test-suite-intensive project. A few patterns that pay off: Run the full test suite at every stage. Not just a sampler. Rails upgrades frequently surface existing bugs that were always there. Watch for silenced deprecations. Search the codebase for ActiveSupport::Deprecation.silence or ActiveSupport::Deprecation.behavior = :silence. Each silenced deprecation is a landmine at the next stage. Run in both development and production modes in CI. Several Rails issues only appear with config.eager_load = true. Exercise background jobs. Run at least one end-to-end test per job class. Expected Timeline On a mid-sized Rails 6 app (50-100 models, a few thousand specs, moderate gem complexity): Stage 0 (6.0 → 6.1): 1-3 days Stage 1 (6.1 → 7.0): 3-7 days (Zeitwerk, asset pipeline) Stage 2 (7.0 → 7.1): 1-2 days Stage 3 (7.1 → 7.2): 1-2 days Stage 4 (Ruby upgrade to 3.3/3.4): 1-2 days Stage 5 (7.2 → 8.0): 1-3 days Total: 2-4 engineer-weeks of focused work, plus staging bake time between each stage. Spread over a couple months with normal feature work, that is a quarter. Apps with unusual gem stacks, heavy custom middleware, or hand-rolled autoloading can easily double that. Apps with excellent test coverage and clean conventions can finish faster. When to Bring in Help Rails 6 to Rails 8 is a real project. Teams that succeed at it usually have one of: A dedicated engineer with prior Rails upgrade experience running point for the duration. A consultancy that has done this upgrade many times and knows the landmines in advance. A lot of calendar time and appetite to learn as you go. If none of those are true, the upgrade tends to stall out at Stage 1 or Stage 2, the app sits in a half-upgraded state on a branch, and the project quietly dies. We have seen this many times. Looking at a Rails 6 to Rails 8 upgrade and want a partner who has done it repeatedly? Our Rails Upgrade Express handles the full path on a fixed timeline, including the intermediate Ruby bumps. For apps that need a structural assessment first, the Rails Tech Audit produces a stage-by-stage plan you can execute internally or hand to us. See also our Rails 7.2 to Rails 8 step-by-step guide for the last leg of the journey. Schedule a consultation or email hello@railsfever.com to plan your Rails 6 to Rails 8 upgrade. --- # Managing AI Hesitancy in Software Engineers URL: https://railsfever.com/blog/managing-ai-hesitancy-in-software-engineers/ Date: 2026-04-21 Author: Wale Olaleye Software engineers are a special case in AI adoption. On one hand, they are the function where AI has the most immediate and measurable leverage — code generation, test writing, refactoring, and debugging are all workflows where modern LLMs demonstrably help. On the other hand, engineers tend to push back on AI harder and more articulately than most employees. That combination — highest potential value, strongest resistance — makes engineering adoption both the most important and the hardest part of an AI rollout. Generic “change management” playbooks do not land. The standard talking points (“AI will make you more productive”) get reverse-engineered and rebutted inside thirty seconds of a team meeting. This post is specifically for engineering leaders — CTOs, VPs, staff engineers — who need to bring a senior engineering team along on AI adoption. The general dynamics of employee hesitancy are covered in our post on managing employee AI hesitancy; this post goes deeper into what is specific to engineers. Why Engineers Push Back Harder The surface-level explanation is wrong. It is not that engineers are “resistant to change” or “afraid of being replaced.” Engineers have spent their careers adopting new languages, frameworks, and tools. Change itself is not the problem. The real dynamics are more specific: Engineers can evaluate AI output technically. Most employees see AI output and take it at face value. Engineers read the code and see the bugs. They see the hallucinated API calls, the subtly wrong logic, the mismatched types, the tests that test nothing. When a non-engineer says “AI is amazing at drafting emails,” the engineer hears the equivalent of “AI is amazing at writing plausible-looking nonsense” — because they have watched it do both. Craftsmanship is identity. Senior engineers built their careers on their code being good. Being asked to ship code they did not fully write — and in some cases did not fully understand — attacks that identity directly. This is not ego. It is the rational response of a professional whose reputation rests on the work being correct. The failure modes are expensive. A marketing email drafted by AI and sent with a typo is recoverable. A subtle bug in payment code shipped by an over-enthusiastic AI user is not. Engineers have a well-developed sense for this asymmetry; they know the blast radius of their mistakes. Engineers have the most mature tooling to compare against. Modern IDEs, linters, test suites, and type systems already remove a lot of boilerplate. The value proposition “AI will speed up your work” lands differently for an engineer whose IDE already autocompletes half their code than for a marketer who has no comparable tooling. Engineers read leadership more skeptically. Every engineer has lived through at least one technology-of-the-year mandate that did not work out. They have calibrated their skepticism accordingly, and leadership that sounds like the last failed rollout gets the pattern-matched response. Each of these is a legitimate reason to push back. Engineering leadership that treats them as obstacles to overcome rather than inputs to take seriously loses credibility fast. The Concerns That Are Specifically Engineering Beyond the general concerns common to all employees, engineers tend to raise issues that are unique to their work: Code quality and long-term maintainability. “Even if AI writes working code today, is this the code I want to maintain in two years?” Engineers know that code is read far more often than it is written, and that the cost of a bad abstraction compounds. Intellectual property and codebase exposure. “When I paste code into an LLM, where does that code go? Is it training future models? Is it leaking to competitors?” This concern is especially acute at companies with proprietary systems. The craft regression problem. “If junior engineers use AI to skip the hard parts, they never develop the instincts to recognize when AI is wrong. We are building a generation of senior engineers who cannot function without AI.” This is not a straw man — it is a serious concern about professional development. Autonomy and authorship. “My satisfaction in this job comes from solving problems. If the AI solves the problem and I just review, what exactly am I doing?” Review load. “I used to review one PR. Now I review three PRs, all of which were written in 30 minutes by someone using an AI. The review bottleneck has moved to me and nobody adjusted my workload.” Skill depreciation. “If I spend two years mostly reviewing AI output instead of writing code, am I still a strong engineer when I look for my next job?” Each of these is a real concern with a real answer. Glossing over them loses the room. What Does Not Work on Engineers Productivity numbers without code. “Teams using AI ship 40% more features” is meaningless to engineers who do not know what teams, what features, or what the code quality looked like six months later. Engineers will always ask for the detail you do not have. Vendor demo videos. Every engineer has seen the polished demo and knows the difference between a demo and a real codebase. Demos actively hurt credibility. Framing AI as replacing work engineers dislike. “AI will handle the boring parts!” Engineers know that some of the “boring parts” — writing tests, documentation, maintenance — are the parts that build institutional knowledge and prevent outages. Handing them entirely to AI is not obviously a win. Hiding the skepticism. Engineering leadership that pretends the concerns are unreasonable or that the team is “just resistant” destroys its own credibility. Engineers respect leaders who engage honestly with hard problems and distrust leaders who do not. Productivity theater. Dashboards tracking “lines of code AI-generated per engineer” are transparently silly. Engineers know that lines of code is a bad metric, and that “AI-generated” is trivially gamed. What Does Work Adopt AI Yourself, Visibly Engineering leaders who want their teams to use AI need to be using it themselves, meaningfully, and talking about it in technical terms. Not “I love Claude, it’s so cool.” Actual specifics: “I used Claude Code to generate the scaffolding for the new admin interface this morning. Here is the diff. Here is where it got things right and here is where I had to rewrite.” This does several things. It normalizes AI use at the senior level. It gives engineers concrete examples to react to. It signals that leadership is evaluating the tools on the same grounds engineers are, rather than just repeating marketing claims. Leaders who advocate AI without using it themselves lose credibility immediately. Respect the Quality Concerns With Real Process The “code quality” concern is legitimate. The answer is not to dismiss it but to build process that addresses it. Require thorough code review on AI-generated PRs. Same standard as human-written code, or stricter. No rubber-stamping. Invest in the test suite and CI. AI-assisted development works well when tests are comprehensive and fast, because the AI can close the loop. It works badly when tests are sparse and slow. Set up pattern libraries (see the creating Claude skills for Rails apps post). AI that imitates your team’s patterns produces code that fits the codebase; AI that follows its own defaults produces code that doesn’t. Adopt a code ownership model where the human who merges the PR is responsible for the code, not the AI. When engineers see that leadership is as serious about quality as they are, they engage differently. When leadership’s posture is “just ship more,” engineers resist — and they are right to. Address the IP and Privacy Concerns Explicitly Before telling engineers to use AI tools on company code, answer in writing: Which tools are approved for code access, and under what terms? What do the vendor’s data retention and training policies say, in plain language? Is there an enterprise agreement that prevents training on customer data? What code is off-limits (customer data, security-sensitive modules, regulated systems)? This is not a one-page document. This is a clear, specific, technical answer to questions engineers will ask within the first week. Have it ready. If you do not have an enterprise agreement with your LLM provider, get one before asking engineers to use AI on proprietary code. The additional cost is small compared to the adoption cost of unclear policy. Acknowledge the Craft Regression Concern The concern that junior engineers using AI might not develop the instincts of their senior colleagues is real. Pretending it is not makes leadership look naive. The response is not to forbid juniors from using AI — that ship has sailed, and AI is going to be part of the permanent tooling for the rest of their careers. The response is to be deliberate about what juniors are learning: Pair junior engineers with senior ones on code review of AI output. This is where the craft transfers. Require juniors to explain, in writing, the reasoning behind AI-generated code they submit. Not a pro-forma comment — actual “why does this work, and what are the failure modes?” Reserve some projects or features as “AI-off” training ground for junior engineers who need to build raw coding skill. Build internal education around the things AI does badly — systems design, performance analysis, debugging production incidents — where craft still matters and AI is still weak. Done well, this produces juniors who are stronger than their predecessors because they know both the fundamentals and how to use AI effectively. Rebalance Workload as AI Adoption Rises If AI-generated code means engineers review three PRs instead of one, that has to be reflected in workload expectations. Otherwise you create a burnout trap. Concrete adjustments: Reduce individual feature-ship quotas as AI assistance increases review load. Rotate review responsibility so no single engineer becomes a review bottleneck. Track review turnaround time as a team metric, not just PR velocity. If reviews are slowing down, the AI output has outpaced the review capacity. This is where many AI rollouts quietly fail. The velocity goes up, the engineers burn out, and six months later the “AI is great” narrative is replaced by “engineers are quitting.” Frame AI as Leverage, Not Replacement The framing that works with engineers is not “AI will make you faster.” It is “AI is a leverage multiplier on your judgment.” Concretely: AI writes the boilerplate, you review the architecture. AI drafts the tests, you validate the coverage. AI suggests refactors, you decide whether they are right for this codebase. AI produces the first draft of documentation, you refine for audience and accuracy. This framing preserves the part of engineering most engineers care about — judgment, taste, and ownership — while offloading the parts most engineers agree are tedious. It also sets realistic expectations about where review effort goes. Give Engineers Time to Learn the Tools Properly Using AI well is a skill. Senior engineers are used to being competent at their tools, and a drop in competence when adopting a new one is uncomfortable. If leadership rushes engineers past the awkward learning phase, many will give up and go back to what they know. Concrete investments: Protected learning time — 4-6 hours a week, first two months, explicitly for figuring out AI workflows. Internal Claude Code playbooks documenting your team’s specific setup, conventions, and skills. Office hours with engineers who are further along on AI adoption. Permission to be slower in the short term. Engineers who are told to “use AI and hit your normal velocity” will rationally conclude that AI is a distraction. The teams that invest in this phase get engineers who are genuinely competent with AI tooling by month three or four. The teams that skip it get engineers who “use AI” cosmetically and have not actually integrated it. Measure What Actually Matters The temptation to build AI dashboards is strong. Most of the metrics people instinctively track are wrong: Lines of AI-generated code (gamed trivially, says nothing about quality) Number of AI sessions per engineer (same) Time saved per AI interaction (hard to measure, easy to manipulate) Better metrics — still imperfect, but at least meaningful: Team PR throughput and cycle time (did adopting AI actually ship more shippable work?) Defect rate and time-to-resolution on production issues (did quality hold?) Engineer self-reported satisfaction and sustainability (are they enjoying the work or drowning in review?) These metrics move slowly and require honest conversation. That is what makes them useful. A Specific Move That Builds Trust If you want a single, high-leverage move: pick a real, non-trivial engineering project — something with enough shape that it would normally take a week — and do it end-to-end yourself with heavy AI assistance, in front of the team. Not a tutorial. A real project that ships to production. Walk the team through what worked and what did not. Show the prompts, the failures, the corrections, the final diff. Be honest about what was faster and what was slower. This single exercise does more for credibility than any number of all-hands messages. It demonstrates that leadership has actually tried to do the work the team is being asked to do, and has formed specific, honest opinions about it. The Long Arc Engineering teams that successfully adopt AI tend to go through a recognizable arc: Month 1-2: Skepticism. Early experiments mostly frustrating. Most engineers try AI, find it mediocre, and return to their old workflows. Month 3-4: A few engineers get genuinely good at AI-assisted workflows. They start producing visibly faster work without quality degradation. Month 5-6: Skilled users begin teaching other engineers. Internal patterns emerge. Team-level tooling (CLAUDE.md, skill libraries) starts getting built. Month 7-12: AI integration stabilizes. Most engineers use it daily for specific, well-defined workflows. A minority remain skeptical holdouts; that is fine and usually healthy. The teams that fail at AI adoption tend to quit between month 2 and month 3, when the initial experiments have not paid off and the learning investment has not yet compounded. Leadership that pushes through this valley — without dismissing the legitimate concerns that drove the skepticism — comes out the other side with a genuinely AI-capable team. Leadership that tries to shortcut the valley with mandates produces a team that claims to use AI and actually does not. Leading an engineering team through AI adoption and looking for outside perspective? Our Fractional CTO service includes engineering-culture and tooling guidance, often with direct hands-on work on AI integration. For teams on Rails specifically, see also our posts on tips for using Claude with an existing Rails app and how to increase the percentage of development done by AI. Schedule a consultation or email hello@railsfever.com to talk about AI adoption on your engineering team. --- # Managing Employee AI Hesitancy: A Playbook for Founders and CTOs URL: https://railsfever.com/blog/managing-employee-ai-hesitancy/ Date: 2026-04-18 Author: Wale Olaleye Most leadership conversations about AI adoption focus on the tools. Which LLM. Which subscription. Which integrations. A much smaller share of conversation goes to the question that actually determines whether the rollout succeeds: will your employees actually use the tools, seriously, every day? They often will not. Not because your employees are wrong, and not because AI is overhyped. The hesitancy is a real and predictable response to how AI is typically introduced into a company. If leadership does not address it head-on, adoption stalls at the 20% of employees who were already going to experiment on their own. This post is about how to handle that hesitancy constructively — in ways that raise genuine adoption rather than forcing performative compliance. What Employees Are Actually Worried About Before you can manage hesitancy, you have to understand what it actually is. In most organizations, it is not one concern but a mix of several, and the proportions vary by employee. A useful first step for any CTO or founder is to name them explicitly: Job security. “If AI can do my work, why am I being asked to train the thing that replaces me?” This is the loudest worry, and the one leadership most often underweights. Even employees who do not say it out loud are thinking about it. Quality and accountability. “If I ship AI-generated work and it has a subtle error, whose name is on that failure? Mine. And my reputation is not replaceable.” This concern is especially acute among employees who have spent years building craft. Loss of mastery. “If I use AI to skip the hard parts, I stop getting better at my job.” This is a real concern for mid-career professionals who see their expertise as their leverage. Overwork dressed up as productivity. “Every productivity tool ever has meant I am expected to do more in the same hours. Why would AI be different?” This is the concern of anyone who has watched email, Slack, and dashboards compound their workload. Privacy and compliance. “If I paste client data into an LLM, am I violating an NDA? Is leadership going to be upset with me, or is the company going to be fined?” These are legitimate questions that often have unclear answers. Cynicism about leadership follow-through. “Last year it was microservices. The year before it was blockchain. How long until we pivot again?” Employees who have watched several strategic pivots are reasonably wary of investing deeply in the next one. Most resistance is some combination of these, weighted differently for each person. A leadership approach that treats the resistance as a single thing — “change management” — addresses none of them well. What Does Not Work A few approaches that sound good in a board deck but reliably backfire: Top-down mandates. “Every employee must use AI daily” produces compliance theater. People log into the tool, paste in a sentence, and go back to what they were doing. Usage metrics go up. Actual productivity does not. Tying AI usage to performance reviews. This amplifies the job-security fear and adds a layer of resentment. It also incentivizes employees to use AI for things it is bad at, so that it looks like they are using it. Rolling out without a privacy answer. If you have not clarified what data can be pasted into which tools, you force employees to either take the risk themselves or refuse to use the tool. Most reasonable people refuse. Tool proliferation. Adding Cursor, Copilot, Claude Code, Gemini, and three AI meeting-note apps at once produces decision paralysis. Most employees end up using none of them seriously. Announcement-driven rollouts. An all-hands where leadership declares “we are an AI-first company” without a six-month plan produces enthusiasm in week one and dust by month two. What Does Work The approaches that raise genuine AI adoption are less flashy but more durable: Acknowledge the Concerns Out Loud The single most effective move a CTO or founder can make in the first weeks of an AI rollout is to name the concerns directly in company-wide communication. Not “we hear your feedback” — actually: “Some of you are wondering if this is going to make your jobs redundant. Here is what we think, and here is what we are committing to.” When leadership refuses to name the job-security concern, employees assume the silence means the worst answer. When leadership names it and gives a clear, honest position — “we are using AI to raise output and keep headcount, not to reduce headcount” or “we do expect some roles to change, and here is how we will support people through that” — the anxiety does not vanish, but it becomes workable. Doing this badly is worse than not doing it. Hedged corporate non-answers (“we remain committed to our valued team members while embracing the opportunities of AI transformation”) are read as evasions and increase distrust. If you cannot be direct, stay quiet until you can. Publish a Data Policy Before the Tools Before you roll out any AI tool, publish a short document answering: Which AI tools are approved for which types of work? What data can be pasted into each (public info, internal-only, PII, client-confidential)? What are the consequences of pasting the wrong type? Who do you ask when you are unsure? This document can be one page. Most companies make it ten, which means nobody reads it. One page, written in plain language, answering the specific questions employees actually have. This removes the largest source of silent hesitation: employees who avoided AI not because they disagreed with it, but because they did not want to get in trouble. Run the Rollout in Small Cohorts The instinct to announce AI adoption at all-hands and push tools to everyone simultaneously is almost always wrong. It produces uneven results and a lot of noise. Better: run a pilot with 5-10 volunteers across functions. Not your fastest adopters — your skeptical mid-career people, the ones whose opinion others weigh. Give them three months, real support, and permission to say “this is not working for me” without penalty. Collect their feedback carefully. When those employees report genuine value, they become the internal evangelists. When they report problems, you fix the problems before you roll out company-wide. Either way, you end up with a rollout that has a real-world track record rather than a vendor demo’s promises. Make the Value Concrete for Each Function AI value is not uniform across jobs. A blanket “AI will make everyone more productive” is abstract enough that no employee believes it about their specific role. Replace the blanket message with function-specific ones: For customer support: “AI drafts the first response to common tickets, so you spend less time on repetitive work and more on the complex escalations that need your judgment.” For engineering: “AI writes the tests and the boilerplate you have been putting off for months, so you ship more features.” For marketing: “AI handles first drafts of routine content, so you focus on campaign strategy and messaging that moves numbers.” For finance: “AI reconciles and flags anomalies, so you spend more time advising leadership and less time on manual review.” This takes work. Someone in leadership has to actually understand what each function does, where the drudgery lives, and which AI workflows address it. That work is the real investment in adoption. Invest in Training, Not Announcements Employees do not know how to use AI well just because it is available. The gap between “I have a Claude subscription” and “I am consistently getting high-quality output from Claude” is six to eight weeks of deliberate practice. Concrete investments that pay off: Function-specific workshops. Not “intro to AI.” Workshops where a marketer shows other marketers the exact prompt library they have built for their job. An engineer shows other engineers how they have configured Claude Code for their specific codebase. Internal prompt libraries. Per-function collections of prompts that work, vetted and maintained. Employees starting out copy from the library; advanced users contribute back. Office hours. A weekly drop-in where employees bring real work and get help using AI on it. This is where most of the actual adoption happens in well-run rollouts. Protected practice time. Explicit permission to spend 2-3 hours a week learning to use AI, without charging it to a project. Without this, only the most motivated employees get good. Handle the “Am I Being Replaced?” Question Carefully The honest answer at most companies is nuanced: some specific tasks will be done by AI instead of humans, which means job scopes will shift, but the headcount of the company probably will not shrink if the business is growing. Leadership that cannot speak honestly about this dynamic produces distrust. Leadership that over-reassures (“nobody’s job is at risk, ever”) produces disbelief when roles do start shifting. The sustainable position: “The shape of roles will change. We are committing to retraining people whose roles shift and to giving plenty of notice about what we see coming. We are not committing that no role will ever change, because that would not be honest.” Pair that statement with specific, visible commitments — an internal retraining budget, public examples of employees who have transitioned successfully, a named leader responsible for the transition program — and most reasonable employees can work with it. Reward Teaching, Not Just Using In most companies, AI adoption accelerates when employees start teaching each other. The colleague who discovered a great prompt shares it with the team; the engineer who figured out how to set up an agent workflow documents it for everyone. Recognize this explicitly. Call out employees who share AI knowledge in company meetings. Build it into performance reviews as “contributing to team AI capability” rather than “using AI a lot.” This shifts the incentive from individual compliance to collective capability. A Realistic Timeline Getting from “AI curious” to “AI integrated” at a company of any size takes 6-12 months of sustained effort. A rough pacing: Month 1: Address concerns publicly. Publish data policy. Identify pilot cohort. Month 2-3: Run pilot. Build function-specific prompt libraries. Set up office hours. Month 4-5: Expand based on pilot learnings. Roll out training programs. Recognize early contributors. Month 6-8: Company-wide adoption with ongoing support. Refine policies based on emerging practice. Month 9+: Integrate into hiring, onboarding, and performance reviews. Companies that try to compress this into a quarter tend to end up with high declared adoption and low actual adoption — the compliance theater outcome. The Leadership Shift The biggest change AI demands of leadership is not technical. It is temperamental. AI rollouts succeed when leaders treat employee hesitancy as a signal to engage with rather than a resistance to overcome. The hesitant employees are often the ones giving you the most useful feedback — they just frame it as concerns rather than suggestions. Leaders who learn to hear the concern underneath the objection ship rollouts that land. Leaders who override the concerns with mandates ship rollouts that look good in a board deck and do nothing to the business. The difference compounds. A year in, the two companies are in fundamentally different places — and the gap widens from there. Thinking about an AI rollout on an engineering team specifically? Our technical audit engagements increasingly include an AI-readiness assessment — tools, conventions, training gaps, and adoption blockers — so leadership can make decisions with a concrete baseline. For ongoing guidance as a fractional engineering leader, see our Fractional CTO service. Schedule a consultation or email hello@railsfever.com to talk about AI adoption at your company. --- # How to Increase the Percentage of Development Done by AI URL: https://railsfever.com/blog/how-to-increase-percentage-of-development-done-by-ai/ Date: 2026-04-17 Author: Wale Olaleye “We are using AI” has become the software version of “we are doing Agile.” Technically true at most companies. Not actually changing the output at most of them. The question that matters is not whether your team is using AI. It is: what percentage of the code shipping to production each week was written by AI? For most Rails teams today, the honest answer is 10-20%. The teams that are genuinely getting leverage are at 40-60%. A few are higher. This post is about what separates those tiers. It is not a list of prompts. It is a set of organizational and technical moves that compound — and each one raises the ceiling on how much of your team’s output can reasonably come from AI. Start by Measuring Honestly You cannot improve what you do not measure. Before any intervention, get a baseline. A rough but useful way to measure the AI share of development: Count commits in the last month and estimate what share were AI-initiated (co-authored, generated, or heavily assisted). Alternatively, count PR counts by engineer and cross-reference against self-reported AI usage. Or just ask each engineer: “What share of your code this sprint came from an AI first draft?” You will get a rough number. That is fine. Measure the same way each month and watch the trend. If the number is not moving, none of the investments are sticking. Remove the Friction That Blocks AI From Being Useful Most engineers do not use AI heavily because the friction of using it well is higher than the friction of just writing the code themselves. To raise the AI share, lower that friction systematically. Make the test suite fast and runnable from a clean slate. If bundle exec rspec spec/models/user_spec.rb takes 45 seconds to boot, the AI loop is broken. Every iteration costs a minute. Get boot time under 5 seconds. Use Spring, bootsnap, or whatever it takes. This one change doubles usable AI velocity for most Rails teams. Eliminate external dependencies from the default test run. If running a single spec requires Redis, Elasticsearch, Postgres, and S3 credentials, the AI cannot close the loop on its own. Use WebMock, in-memory Redis alternatives, and the Rails test fixtures pattern aggressively. Standardize the development environment. If half the team is on asdf, a quarter is on rbenv, and a few people use Docker, the AI has to guess at conventions. Pick one. Document it in CLAUDE.md. Make it reproducible with a single setup script. Make deploys boring. If every deploy is a manual ritual, the AI cannot ship. If deploys are bin/deploy with a one-command rollback, AI-driven work can flow all the way to production with a human in the loop for review. These are not AI projects. They are developer-experience projects. But they are the projects that determine whether AI adoption actually sticks. Write the Conventions Down — Specifically The number one reason AI-generated code gets rewritten by reviewers is that it does not match the team’s conventions. The number one reason that happens is that the conventions live in reviewers’ heads, not in any file. Fix this. Put conventions in a CLAUDE.md at the root of the repo. Specifically: Which test framework (RSpec, Minitest) and which style (mocks, fixtures, factories) Service object patterns (method name, base class, return shape) Error handling patterns (raise, return Result, return nil) API response shapes i18n coverage expectations Controller patterns (skinny controllers? fat controllers? what goes where?) Database migration patterns (strong migrations, batched updates, expected review gates) Every convention that lives only in review becomes a convention the AI will get wrong. Move them into text. The payoff: AI output that ships with 80% fewer convention-level review comments. Build a Library of Skills If you are writing the same prompt three times, it should be a skill. (See our guide to creating Claude skills for Rails apps.) Skills to build first, in order of payoff: A test-writing skill that follows your project’s conventions An upgrade prep skill for Rails and Ruby version bumps An i18n audit skill for finding hardcoded strings A dead code audit to remove unused methods and routes A code review skill that checks your team’s style before PR review Each of these shifts work from humans to AI, and each one runs consistently because the instructions are persistent. The compound effect is substantial: after six skills, a meaningful chunk of maintenance work runs on command. Invest in Pattern Corpora, Not Just Prompts AI is better at imitating than at following abstract instructions. So the best investment is not a cleverer prompt — it is a richer set of examples for the AI to imitate. Maintain a docs/patterns/ directory in your repo with exemplar files: One “perfect” service object One “perfect” controller action with strong parameters and authorization One “perfect” background job with idempotency and retry semantics One “perfect” RSpec spec with factories and shared examples One “perfect” migration with strong_migrations safety When you ask the AI to generate something, point it at the pattern file. “Write a service object for X, following the pattern in docs/patterns/example_service.rb.” The output quality jump is immediate and persistent. Shift From Individual Use to Team Use AI that lives in one engineer’s terminal helps that engineer. AI that is configured, committed, and shared with the whole team helps everyone. Commit the CLAUDE.md. Commit the .claude/skills/ directory. Commit the pattern files. Build a shared library that every engineer’s Claude session inherits on day one. The difference in velocity between a team where each engineer configures AI independently and a team where the configuration is shared is substantial — probably 2x at steady state. Most teams are in the first camp because it is the default; the work is in getting to the second. Restructure Work for AI Throughput Beyond tooling, the biggest lever is how work itself is organized. Two structural changes that raise the AI share: Break work into smaller, well-specified units. AI is great on a 200-line change with clear acceptance criteria. It is less great on a 2000-line “fix the billing system” epic. Stories that would normally be estimated at two days can often be decomposed into four half-day units, each of which is mostly AI-drivable. Front-load specification. When the spec is clear — inputs, outputs, edge cases, test cases — AI can execute most of the implementation. When the spec is “make it work like the old thing but better,” AI flounders. Engineering leaders who invest 20 minutes writing a crisp spec buy 4 hours of AI execution. This reshapes the job of senior engineers. Less time writing code, more time decomposing problems and reviewing output. That transition is harder culturally than technically. Parallel Work Is the Frontier One engineer + one AI session is the baseline. One engineer orchestrating three or four parallel AI sessions is where the leverage gets interesting — and where most teams are not yet. The pattern: while you are reviewing one PR, a second session is drafting tests for the work you just landed, a third is running a codebase audit you kicked off an hour ago, and a fourth is preparing the next feature’s scaffolding. You check in periodically, redirect where needed, and merge what passes review. This requires infrastructure: clean worktrees, non-conflicting branches, AI tools that can run in the background. It also requires a mental shift from “I am coding” to “I am directing several coding streams.” Teams that crack this pattern report step-function velocity gains. Do Not Skimp on Review Every post about increasing AI share should come with this caveat: the goal is not “AI writes everything while humans rubber-stamp.” That path ends in production incidents and slow decay of codebase quality. The goal is “AI drafts more, humans review more carefully.” Protect review rigor as the AI share rises. If anything, review standards should tighten as more AI-generated code lands — because the failure mode of AI code is plausible-looking bugs that compile and pass superficial tests. Specifically: trace logic by hand for anything touching business rules, money, authorization, or data integrity. Read migrations line by line. Re-run tests on the actual change (not just on the AI’s self-written tests). A Realistic Timeline Getting from 10-20% AI share to 40-60% is not a weekend project. Realistic pacing: Month 1: Write CLAUDE.md. Commit shared AI config. Measure baseline. Month 2-3: Build first five skills. Clean up test suite friction. Add pattern files. Month 4-6: Restructure work breakdown to favor AI-drivable units. Pilot parallel AI workflows with one senior engineer. Month 6+: Scale the parallel workflow pattern across the team. Refresh skills quarterly. Teams that try to rush this — six weeks to “AI does 50% of our code” — tend to ship more code but also more bugs, and then retreat. The teams that go steady state at high AI share got there deliberately over six to nine months. What Not to Chase A few things that sound like they should raise AI share but mostly do not: Bigger models. Useful, but marginal compared to the investments above. A 10% better model on top of 0% infrastructure still gets you 10% of something small. Cleverer prompts. Prompts lose to persistent configuration every time. Write it in CLAUDE.md once, not in a prompt every day. More AI tools. Adding Cursor and Claude Code and Copilot does not 3x the AI share. Pick one, commit to it, and go deep. Tracking AI metrics obsessively. Measure quarterly, not daily. The interventions are slow-acting. The Compounding Effect The thing that is easy to miss: each of these investments compounds with the others. A better CLAUDE.md makes skills more reliable. More reliable skills make parallel workflows viable. Parallel workflows reward cleaner work decomposition. Cleaner work decomposition makes the whole team faster, which frees capacity to refine CLAUDE.md. Six months in, the teams that stuck with it are running at a fundamentally different velocity than the teams that treated AI as a tool to sprinkle on. The gap widens over time. Getting there takes deliberate investment, not enthusiasm. Working on raising AI share on a Rails team and not sure where the biggest blockers are? Our technical audit now includes an assessment of AI-readiness — test suite friction, convention documentation, skill library — alongside the usual Rails health check. See also our post on AI-assisted development on a large legacy Rails app. Schedule a consultation or email hello@railsfever.com to talk about AI strategy on your Rails team. --- # Best Ruby on Rails Development Agencies in Philadelphia URL: https://railsfever.com/blog/best-rails-development-agencies-in-philadelphia/ Date: 2026-04-16 Author: Wale Olaleye Philadelphia has a strong Ruby on Rails community. The city hosted RailsConf, has an active Philly.rb meetup, and is home to several consultancies that focus specifically on Rails work. If you are a CTO, founder, or engineering lead looking for a Rails development partner in the Philadelphia area, this guide profiles three agencies worth evaluating. What to Look For in a Rails Agency Before reaching out to anyone, it helps to know what separates a good Rails partner from a generic web dev shop. A few criteria worth weighing: Rails specialization vs. generalist. An agency that lists Rails alongside 15 other frameworks is a different proposition than one that focuses exclusively on it. Specialists tend to have deeper upgrade experience, better knowledge of the gem ecosystem, and stronger opinions about how to structure long-lived Rails apps. Upgrade and maintenance track record. If your app needs a Rails version upgrade or ongoing maintenance, ask how many upgrades the agency has completed, what versions they have moved between, and what their process looks like. Experience here compounds — a team that has upgraded 50 apps will spot problems a first-timer will miss. Team size and engagement model. A solo consultant, a 5-person shop, and a 25-person distributed team are all valid — but they fit different needs. Smaller teams offer tighter relationships and direct access to senior engineers. Larger teams can absorb bigger projects and run multiple workstreams. Communication and availability. Rails work often involves production systems. You want a partner who communicates clearly, responds quickly when things go wrong, and is transparent about timelines and trade-offs. The Agencies Rails Fever Focus: Full-service Rails consultancy — feature development, upgrades, maintenance, rescue, technical audits, and fractional CTO services. Location: Philadelphia, PA Website: railsfever.com Rails Fever is a specialist Ruby on Rails consultancy founded by Wale Olaleye. Since 2014, the team has been building, managing, and modernizing Rails applications across industries — from early-stage SaaS products to mature platforms carrying years of technical debt. That depth of experience across the full lifecycle of Rails apps is what defines the practice: not just upgrading a framework version, but understanding how Rails applications evolve over time and what they need at each stage. The service lineup reflects that breadth. Rails Fever covers the entire Rails lifecycle under one roof: technical audits to assess where you are, upgrades to get you current, care plans to keep you there, feature development to ship new functionality, and rescue engagements when an app is in trouble. For teams without a CTO, there is also a fractional CTO service. The team is small and senior. Over a decade of hands-on Rails work means fewer surprises, faster diagnosis, and direct access to engineers who have seen the problem before — no handoff to junior developers after the sales call. What clients consistently highlight is the customer service. Rails Fever builds long-term partnerships, not short-term engagements. The team does not disappear after a project ships — they stay to make sure the work holds up in production and that the client is genuinely happy with the result. Many clients start with a one-time upgrade or audit and transition into an ongoing care plan because the relationship works. Those care plans are priced for the long haul — reasonable monthly rates designed so that continuous Rails maintenance is accessible, not a luxury reserved for companies with big budgets. Best for: Teams that want a long-term Rails partner who treats your app like their own — with responsive customer service, fair monthly pricing, and a commitment to sticking around. OmbuLabs / FastRuby.io Focus: Rails upgrades, technical debt remediation, and AI/ML consulting. Location: Philadelphia, PA (distributed team across 5 continents) Website: ombulabs.com · fastruby.io OmbuLabs, founded by Ernesto Tagwerker, has built a strong reputation in the Rails upgrade space. Their productized upgrade service, FastRuby.io, has logged over 60,000 developer hours on Rails version migrations. If your primary need is moving from an older Rails version to a current one, this is a team that has seen nearly every combination of version, gem conflict, and edge case. The team is around 20-25 people, distributed globally but headquartered in Philadelphia. They are active open source contributors — projects like Next Rails (which helps teams plan Rails upgrades by tracking gem compatibility) came out of their work. That open source involvement gives them visibility into the Rails ecosystem that most consultancies do not have. More recently, OmbuLabs has expanded into AI and machine learning consulting under the ombulabs.ai brand, while maintaining the Rails upgrade practice through FastRuby.io. Best for: Teams with a specific Rails upgrade project, especially large or complex version jumps where upgrade-specific expertise matters most. Neomind Labs Focus: Long-term Rails application maintenance, stewardship, and training. Location: Philadelphia, PA (distributed team across multiple US cities) Website: neomindlabs.com Neomind Labs has been operating since 2002, making them one of the longest-running Rails-oriented consultancies in the Philadelphia area. Founded by Ryan Findley, the company positions itself as a “forever home” for Rails applications — emphasizing long-term stewardship over short-term project work. Their services include Rails maintenance and support, application upgrades, code audits, rescue and stabilization, and training programs for development teams. The training angle is distinctive — if your goal is to build internal Rails capacity rather than outsource permanently, Neomind Labs offers programs to upskill your own engineers. The team is small (around 6 people) and distributed across Philadelphia, Nashville, Cleveland, and Virginia. They were recognized on Inc.’s Regionals 2023 Northeast list. Best for: Teams that want a long-term maintenance partner with a track record measured in decades, or organizations looking to train their internal team on Rails best practices. Quick Comparison   Rails Fever OmbuLabs / FastRuby.io Neomind Labs Primary focus Full-lifecycle Rails (build, upgrade, maintain) Rails upgrades and technical debt Long-term maintenance and training Team size Small, senior ~20-25, distributed ~6, distributed Founded 2014 — 2002 Engagement model Retainers, projects, fractional CTO Productized upgrades, consulting Projects, training Open source — Active (Next Rails, etc.) — Best fit Single long-term Rails partner Complex upgrade projects Maintenance + team upskilling How to Choose If you need a single partner who can handle feature development, upgrades, and ongoing maintenance under one roof, Rails Fever is built for that. If you have a specific, complex Rails upgrade — especially jumping multiple major versions — OmbuLabs / FastRuby.io has the deepest specialization and tooling in that niche. If you want a long-term maintenance relationship with a team that has been doing this for over two decades, and you also want to train your own developers, Neomind Labs is worth a conversation. All three are Philadelphia-based, Rails-focused, and run by experienced practitioners. The right choice depends on what your app needs right now and what kind of relationship you want going forward. Need help figuring out what your Rails app actually needs? We offer a free initial consultation to help you assess whether you need an upgrade, ongoing maintenance, a rescue, or a development partner. Schedule a consultation or email hello@railsfever.com to start the conversation. --- # AI-Assisted Development on a Large Legacy Rails App URL: https://railsfever.com/blog/ai-assisted-development-on-large-legacy-rails-app/ Date: 2026-04-15 Author: Wale Olaleye The AI demos you see online are almost always small apps. A Todo list. A Jekyll blog. A fresh Rails 8 scaffold. Those demos are honest about what they are, but they are not representative of what most Rails work looks like. Most Rails apps in the wild are not fresh. They are five to fifteen years old. They have 50+ models, dozens of engineers who have come and gone, patched gems, monkey-patched initializers, and a config/ directory that nobody alive fully understands. They also generate most of their company’s revenue. So the practical question is: can AI actually help on that kind of codebase? The honest answer is yes, but not by default, and not in the way demos suggest. This post lays out what works and what does not when you bring an AI coding assistant to a large, legacy Rails application. What Breaks First: Context The single biggest constraint on AI-assisted development in a large Rails app is context. The model cannot see your whole codebase at once. Even with large context windows, a 200,000-line Rails app with views, migrations, locales, and initializers will overflow fast. What this means in practice: the AI will confidently generate code that conflicts with conventions in files it never saw. It will import gems you removed. It will reference services that do not exist. It will assume a controller inherits from ApplicationController when you actually have a custom base class three levels up. The fix is not “use a bigger model.” The fix is disciplined context management: Pin the relevant files. Before asking for a change, explicitly load the files that matter. The controller, the model, the service object, the spec. Not “the signup flow” — actually the four files that make up the signup flow. Summarize what the AI cannot see. If your codebase has an unusual base class, a custom authentication middleware, or a forked gem, write that down once in CLAUDE.md or a skill file. The AI does not know until you tell it. Scope the task. “Fix the N+1 in UsersController#index” is a good prompt. “Audit the whole app for performance issues” is not — the AI will give you a generic checklist because the surface area is too large to reason about. Teams that get value on legacy apps treat context as a budget. Every token the AI spends reading an irrelevant file is a token it cannot spend reasoning about your actual problem. What Breaks Second: Conventions Fresh Rails apps look like the Rails guides. Legacy apps look like whatever the team agreed to in 2016. Common drift: before_filter instead of before_action (or a mix of both) Mass-assignment protection via attr_accessible instead of strong parameters Custom ORM patterns (squeel, hand-rolled scopes, Arel-heavy queries) Service objects in app/services/ with idiosyncratic patterns — .call, .execute, .perform, or a mix View layers with ERB, HAML, and Slim coexisting Configuration scattered across config/initializers/, config/settings.yml, environment variables, and a Settings model The AI will cheerfully “modernize” any of this when you ask it to edit a file — which means every PR turns into a style debate unless you head it off. The mitigation is the same as above, with more specificity: write the conventions down. Not “follow our patterns” — actually: “This app uses service objects with a .call class method. Do not introduce instance-method variants. Service objects live in app/services/ and do not inherit from a base class. Return a Result object from lib/result.rb.” That level of specificity turns AI output from 60% usable to 90% usable. What Actually Works: Pattern-Matched, Well-Scoped Work On large legacy Rails apps, AI earns its keep on tasks that are high-volume, well-understood, and locally scoped. Concrete examples: Writing tests for untested code. Legacy Rails apps are famous for thin test coverage. Point the AI at a model, give it the factory definitions, and ask for comprehensive specs. Review the output — it will miss some edge cases — but you get a 70% jump in coverage in an afternoon. Backfilling documentation. YARD comments, # frozen_string_literal: true headers, method-level docstrings. Boring, high-volume, pattern-matched. Ideal AI work. Extracting service objects from fat controllers. If you show the AI the target pattern (one example service object) and the controller action to extract from, it can produce a reasonable first draft. You review and merge. The productivity difference is real. Gem upgrades. AI is good at reading a changelog, matching it against your codebase, and flagging likely impact. “Upgrade Sidekiq from 6 to 7 — here is the changelog, here is our initializer, what do we need to change?” This is a genuinely useful workflow. Finding dead code. With grep and careful reasoning, AI can identify methods, routes, and views that have no callers. Not perfectly, but well enough to produce a candidate list a human can verify. Translating old patterns to new. before_filter → before_action, attr_accessible → strong parameters, ERB → ViewComponent. Mechanical translations with high volume are exactly what AI is good at. What Does Not Work: Business Logic Buried in Legacy Code The AI is not going to read your PricingCalculator class and understand that the third if branch exists because a specific customer signed a custom contract in 2019 that nobody wrote down. For anything that depends on unwritten business rules — pricing logic, fraud detection, feature gating, regulatory edge cases — the AI will produce plausible-looking code that is subtly wrong. The failure mode is insidious because the code compiles, the tests pass (the tests the AI wrote), and the bug surfaces three weeks later in production when a real customer hits an edge case. The defense is review. Not “does this look right” — actually trace the logic and compare it against what the code should do. For load-bearing business logic, AI is a drafting tool; a senior engineer still owns the final shape. Migrations and Background Jobs: Handle With Care Two specific categories deserve extra caution on large legacy Rails apps. Database migrations. On a 50-million-row table, the difference between a locking migration and a non-locking one is the difference between a clean deploy and a three-hour incident. AI knows about ALGORITHM=INPLACE, strong_migrations, and batched updates — but it does not always use them unprompted. Always review migrations by hand before running them in production. Always. Background jobs. Legacy Rails apps often have dozens of Sidekiq workers with subtle invariants: retry semantics, queue priorities, idempotency assumptions, coordination with external systems. AI will generate a worker that “works” but may not respect those invariants. Again: write them down. Review carefully. The Codebase Map Is Your Best Investment The single highest-leverage artifact on a legacy Rails app is what we call a codebase map — a document that tells the AI (and new humans) what is where, what each major module does, and what the land mines are. A minimal codebase map for a large Rails app might include: Core domain objects and where they live Major subsystems (billing, auth, notifications, reporting) and the directories that contain them External integrations and where they are isolated Background job topology (which queues exist, what they do, what runs where) Known sharp edges: “The legacy_users table is not what it sounds like — it is the current users table, renamed during a botched migration in 2019” Engineering conventions that differ from default Rails Write this once, check it in, and update it quarterly. It compounds across every AI session you run and every new engineer you onboard. Parallel AI Is Where the Real Leverage Is On a small app, one engineer plus one AI session is fine. On a large legacy Rails app, the leverage pattern is different: one engineer orchestrating several parallel AI workflows. Example: while you are manually debugging a production issue, a background Claude session is writing specs for the module you touched yesterday, another is auditing gem vulnerabilities, and a third is preparing a readiness report for next quarter’s Rails upgrade. You check the output periodically and merge what is good. This pattern — human as conductor, AI as multiple first drafts in parallel — is where the biggest velocity gains on legacy apps come from. It also requires more organizational muscle than most teams have yet, which is why it is a frontier rather than a norm. Expected Results: The Honest Numbers On a fresh Rails app, AI can plausibly do 70-90% of the initial build. On a large legacy Rails app, the realistic number for most teams today is 20-40% of development output — and that is if you have done the context and convention work above. Those are not small numbers. A team that ships 30% more per quarter without hiring is a team that is winning. But the marketing claims of “AI will write all your code” are not what the experience on a real production monolith looks like. The teams getting the most value are not the ones using the fanciest tools. They are the ones that invested in the boring infrastructure: CLAUDE.md, skills libraries, codebase maps, and disciplined review processes. Those investments compound. The AI gets better on your specific codebase over months of accumulated context. Running a large legacy Rails app and wondering how to realistically integrate AI into your workflow? Our Rails Care Plan and technical audit engagements increasingly include the codebase-mapping and AI-tooling work that make this possible — so you get velocity without the cleanup costs. See also our posts on tips for using Claude with an existing Rails app and creating Claude skills for Rails apps. Schedule a consultation or email hello@railsfever.com to talk about AI on your legacy Rails codebase. --- # Rails 7.2 to Rails 8 Upgrade: A Step-by-Step Migration Path URL: https://railsfever.com/blog/rails-7-2-to-rails-8-upgrade-step-by-step/ Date: 2026-04-14 Author: Wale Olaleye If you are on Rails 7.2 and staring at Rails 8, you are in the happiest version of this migration. 7.2 was specifically shaped as the on-ramp to 8. Most of the hard work - Zeitwerk defaults, Trilogy, async query support, the new framework defaults - already happened when you got to 7.2. So Rails 7.2 to 8 is usually a short, boring upgrade. If you sequence it right and do not try to also adopt every Rails 8 feature in the same PR. This is the focused step-by-step. If you are on Rails 7.0 or 7.1, start with the broader Rails 7 to Rails 8 upgrade guide and come back to this when you are on 7.2. Pre-Flight Checklist Do not start until all of these are true: You are on the latest Rails 7.2.x patch release. Your Ruby version is 3.2 or later (3.3.x recommended). bundle exec rspec passes, fully, with zero flakes. bundle outdated --only-explicit has been reviewed in the last month. bundle exec bundle-audit check --update is clean. You have a staging environment that actually mirrors production. Deploys are a single command, by any engineer, with a rollback path. If any of those is false, fix it first. Upgrading Rails on a shaky base is the number-one reason “simple upgrades” become emergencies. Step 1: Create a Dedicated Upgrade Branch git checkout -b upgrade/rails-8 Keep this branch narrow. Only the bump and its immediate fallout. New features, refactors, and opportunistic cleanups belong in other PRs. Step 2: Bump Ruby (If Needed) Rails 8 requires Ruby 3.2+. Most 7.2 teams are on 3.2 or 3.3 already, but verify: ruby -v cat .ruby-version If you are on 3.1 or earlier, bump Ruby first as a separate PR and deploy. Do not combine Ruby and Rails bumps in one project. # .ruby-version 3.3.6 # Dockerfile (if applicable) FROM ruby:3.3.6-slim Ship Ruby first. Let it bake. Then come back here. Step 3: Bump Rails # Gemfile gem "rails", "~> 8.0.0" bundle update rails Expect bundle update rails to surface a handful of gems that pin to < 8.0. Common culprits (check each against current gem versions - this list ages): Older versions of devise Older versions of pundit, cancancan Rails-adjacent gems pinned to 7.x (any *-rails gem) Sprockets if you are still on it For each, check the gem’s changelog. Usually a newer version supports Rails 8. Bump it. If a gem has genuinely not updated, evaluate whether it is still maintained - that is a separate signal worth acting on. Step 4: Run rails app:update bundle exec rails app:update This is interactive. Read every diff. For a Rails 7.2 starting point, the changes are fairly small compared to jumping from 7.0. Expect prompts for: config/application.rb - load_defaults 8.0. config/environments/development.rb, production.rb, test.rb. config/initializers/new_framework_defaults_8_0.rb - a new initializer listing each individual default. Keep this file. Flip defaults one by one once the bump is stable. bin/* scripts - minor changes, usually safe. Dockerfile (if you have one generated by Rails) - may get updated. Do not accept everything blindly. In particular, load_defaults 8.0 flips a number of subtle behaviors. The standard pattern is: # config/application.rb config.load_defaults 7.2 And keep a populated config/initializers/new_framework_defaults_8_0.rb. Flip each default intentionally, one PR at a time, after the bump ships. Then eventually bump to config.load_defaults 8.0 and delete the initializer. Step 5: Review Critical Config config/database.yml Rails 8 adopts new defaults for connection pooling and prepared statements. If your database.yml is explicit, you may need to add or adjust: production: <<: *default database: myapp_production # prepared_statements defaults changed in Rails 8 - verify config/cache.yml (new) Only matters if you adopt Solid Cache. For the upgrade itself, leave your existing cache store alone. config/queue.yml (new) Same - only matters if you adopt Solid Queue. Keep Sidekiq / GoodJob exactly as-is for the upgrade. config/puma.rb Rails 8’s default Puma config is slightly different. If you customized yours, diff the new generator output against your existing file and merge deliberately. Step 6: Run the Tests bundle exec rspec Expect some breakage. The common categories from 7.2 to 8: Deprecation warnings turned errors Rails 7.2 deprecations are Rails 8 removals. If your app had warnings like “X will be removed in Rails 8” and you ignored them, now is when they fail. Search the commits for DEPRECATION WARNING in staging logs over the past year. ActiveRecord::Base.connection usage Rails 8 prefers ActiveRecord::Base.lease_connection (or role-aware handlers) for some cases. Audit lib/ and app/ for bare .connection calls that bypass the connection pool. find_or_create_by semantics Rails 8 tightens behavior around unique constraint conflicts. If you have high-concurrency find_or_create_by calls, review them for new edge cases. Zeitwerk strictness Already the default in 7.2, but Rails 8 enforces more aggressively at boot. Run: bundle exec rails runner "Rails.application.eager_load!" Fix any autoload errors before deploying. System specs / browser specs Re-run browser-based tests with the latest Capybara and Selenium. Rails 8 doesn’t change browser behavior, but upgrade-adjacent gem bumps often do. Step 7: Boot It Locally, Click Around Automated tests miss things. Especially: Login / session persistence File uploads (ActiveStorage) Mailer previews Action Cable / Turbo Streams Background job enqueuing Walk through these manually before merging. This is 20 minutes that saves 2 hours of staging debugging. Step 8: Deploy to Staging Ship the branch to a real staging environment. Keep it there at least a few days. Watch: Boot times Memory usage (Rails 8 can have slightly different memory profiles) Error monitor (any new exception signatures?) Response times If something is odd, it is far cheaper to find it in staging than after production rollout. Step 9: Production Rollout Options, roughly safest to riskiest: Canary / one-instance rollout: deploy to one app instance, watch metrics, then roll to the rest. Off-peak deploy: Tuesday or Wednesday, middle of the business day so humans are awake. Full deploy with fast rollback: just ensure your deploy tool can redeploy the previous image in under 5 minutes. Have a rollback image identified before you deploy. A Rails major upgrade rollback is a container / Gemfile.lock rollback, not a git revert. Your platform needs to support that cleanly. Step 10: Let It Bake, Then Adopt Rails 8 Features After the upgrade is stable in production - usually 1-2 weeks - then decide feature by feature: Solid Cache Worth it if you are currently paying for Redis primarily for cache. Migrate gradually - keep Redis for Action Cable or Sidekiq if you use them, and move only the Rails.cache store to Solid Cache first. # config/environments/production.rb config.cache_store = :solid_cache_store Deploy this as its own PR, with a rollback plan to your previous cache store. Solid Queue Only consider if you want to drop Redis-based job backends. Benchmark on your real workload before committing - Sidekiq is hard to beat on throughput for some patterns. Built-in authentication Almost never worth swapping a working Devise setup for the built-in generator. New apps, yes. Existing apps, no. Propshaft If you are still on Sprockets and it works, leave it. Migrating to Propshaft is a separate project with its own surprises (custom helpers, asset path assumptions, CDN caching). Flipping load_defaults 8.0 Once all individual defaults in new_framework_defaults_8_0.rb have been flipped and tested, remove the initializer and set config.load_defaults 8.0 in config/application.rb. This is the final step of the upgrade, sometimes weeks after the Gemfile bump. Specific Rails 7.2 → 8 Gotchas Beyond the general 7-to-8 gotchas, a few things specifically surprise 7.2 teams: You might already be on Trilogy Rails 7.2 made Trilogy a first-class MySQL adapter. If you opted in on 7.2, Rails 8 is mostly invisible here. If you are still on mysql2, Rails 8 is a good time to evaluate - but not mandatory. Async queries 7.2 introduced more async query paths. Rails 8 expands on them. Nothing breaks, but if you adopted load_async in 7.2, retest behavior under load on 8. config.active_record.raise_on_assign_to_attr_readonly Became stricter. If you relied on silent ignoring of writes to readonly attributes, you’ll get raises now. Rubocop / standard Not a Rails issue, but 7.2 apps on older Rubocop versions sometimes fail the upgrade CI run. Bump your linter versions before debugging mysterious failures. Estimated Timeline A well-maintained Rails 7.2 app that followed the pre-flight checklist: Upgrade PR: 2-5 days of focused engineering work. Staging bake: 3-7 days of wall time. Production deploy: a single afternoon. Full Rails 8 feature adoption: several more weeks, stretched out. If you are hitting weeks of pain on the upgrade PR itself, stop. Something in the pre-flight checklist was not actually done. Fix that, then resume. Related Reading Rails 7 to Rails 8 upgrade: 2026 technical guide - if you are on 7.0 or 7.1, start there. Rails 7 LTS: A developer’s technical guide - if you are not upgrading yet. When to upgrade Rails Stop wasting money on one-off Rails upgrades Want expert eyes on your Rails 7.2 to 8 upgrade? Rails Upgrade Express runs these migrations end to end, a Rails technical audit gives you a realistic scope before you commit, and a Rails Care Plan keeps you at the latest version so the next upgrade is an afternoon, not a project. Schedule a consultation or email hello@railsfever.com to talk through your Rails 7.2 to 8 upgrade. --- # Creating Claude Skills for Rails Apps URL: https://railsfever.com/blog/creating-claude-skills-for-rails-apps/ Date: 2026-04-13 Author: Wale Olaleye If you use Claude Code on Rails work regularly, you end up typing the same prompts over and over. “Audit this gem for known CVEs and suggest replacements.” “Find every controller action missing a before_action authentication check.” “Walk the app and list hardcoded strings that should be in i18n.” Useful, but tedious to re-articulate every time. Claude skills are the fix. A skill is a reusable, invokable workflow — a named package of instructions that Claude can execute on demand. Once you have a skill, you do not re-explain the workflow; you invoke it. For Rails teams, skills are where a lot of AI leverage actually lives. This post explains what a skill is, when to build one, and walks through a concrete Rails example. What a Claude Skill Actually Is A skill is a markdown file with a small bit of frontmatter, stored in a directory Claude knows to look in. The frontmatter gives the skill a name and a short description; the body gives Claude the instructions to follow when the skill is invoked. The key difference from a CLAUDE.md file: CLAUDE.md is always in context — it shapes every response. A skill is only loaded when triggered, either by the user typing /skill-name or by Claude deciding the task matches the skill’s description. That distinction matters. CLAUDE.md is for things that are true about your codebase at all times (“we use RSpec, not Minitest”). Skills are for workflows you run occasionally but want to be consistent when you do (“audit our Gemfile for outdated gems”). When a Skill Is the Right Tool Build a skill when: The workflow is multi-step and the steps matter. If you want to make sure Claude always checks CVEs, then flags deprecation notices, then proposes upgrades in that order, a skill encodes the sequence. You want the workflow to be invokable by a less technical team member. A product manager who cannot write a detailed prompt can still type /audit-gems and get a consistent result. You want to capture institutional knowledge. The senior engineer who knows the right way to profile an N+1 leaves; the skill they wrote still runs the same way. Do not build a skill for a one-off task. And do not try to encode all of Rails into a single mega-skill — small, focused skills compose better. A Worked Example: Rails Upgrade Prep Let us build a skill that prepares an app for a Rails upgrade by producing a concrete readiness report. This is a workflow most Rails teams run manually every time; a skill makes it consistent and fast. Create a file at .claude/skills/rails-upgrade-prep.md in your repository: --- name: rails-upgrade-prep description: Audit the current Rails app and produce a readiness report for upgrading to the next Rails minor version. Use when the user asks to prepare for a Rails upgrade, assess upgrade readiness, or check what blockers exist. --- You are preparing an upgrade readiness report for this Rails application. Steps to follow in order: 1. Read `Gemfile.lock` and identify the current Rails version and Ruby version. 2. Determine the target Rails version (the next minor release, unless the user specifies otherwise). 3. Check the target version's minimum Ruby requirement from the Rails upgrade guides. 4. Run `bundle outdated --only-explicit` and note gems that have major version bumps available. 5. Run `bundle exec bundle-audit check --update` if the gem is available; flag any CVEs. 6. Grep the codebase for deprecation warnings currently being raised (look for `ActiveSupport::Deprecation`, silenced deprecations, and comment markers). 7. List any frozen or version-pinned gems that would block the upgrade. 8. Check the test suite: - Does `bin/rspec` or `bin/rails test` pass? - Are there skipped or pending tests relevant to the upgrade surface area? 9. Produce a markdown report with sections: - Current state (Rails/Ruby versions, test status) - Blockers (things that must change before the upgrade) - Risks (things that might break, ranked by likelihood) - Recommended sequence (what to upgrade, in what order) Do not modify any files. This skill is read-only and produces a report. Now when anyone on the team types /rails-upgrade-prep — or even asks “can you check if we are ready to upgrade Rails?” — Claude runs the same structured audit. A Second Example: Hardcoded String Audit for i18n A common Rails task: find every user-facing string that should be in a locale file. Here is what that looks like as a skill, stored at .claude/skills/audit-i18n.md: --- name: audit-i18n description: Scan views, helpers, and mailers for hardcoded user-facing strings that should be moved to locale files. Use when the user asks to audit i18n coverage, find missing translations, or prepare for internationalization. --- Scan the Rails app for hardcoded strings that should be in `config/locales/*.yml`. Include: - ERB/HAML/Slim templates in `app/views/` - Helpers in `app/helpers/` returning user-visible strings - Flash messages in controllers (`flash[:notice] = "..."`) - Mailer subject lines and bodies in `app/mailers/` and `app/views/*_mailer/` - Validation error messages in models (if not already using `I18n`) Exclude: - HTML attributes that are not user-visible (aria-hidden labels that match visible text, data attributes) - Strings that are clearly technical (log messages, error class names) - Anything already wrapped in `t()`, `I18n.t`, or `translate` Output a markdown table with columns: File, Line, Current String, Suggested Key. Group the table by file. Do not modify any files — this is read-only. Same idea: a tedious, error-prone audit becomes a one-word command. Structural Tips for Good Skills A few patterns that separate skills people actually use from ones that gather dust: Keep the body short. A skill that fits on one screen is easier to maintain and more likely to execute cleanly. If you are writing 200 lines of instructions, you probably have two skills, not one. Name the skill after what it does, not how. audit-gems is better than run-bundle-audit. The description should make the trigger obvious: “Use when the user asks to check gem security or find vulnerable dependencies.” Make read-only skills explicitly read-only. For anything that just produces a report, say “Do not modify any files” in the skill body. Claude is less likely to be helpful in unhelpful ways. Add a stop condition. If the skill could run indefinitely (e.g., scanning a large codebase), tell Claude when to stop: “Stop after the first 100 matches and note that the scan was truncated.” Version-control the skills. .claude/skills/ should be in the repo, not in a developer’s home directory. The whole point is team consistency. Skills That Are Worth Building for Most Rails Apps If you want a starter list, here are the skills that tend to pay for themselves quickly on Rails projects: rails-upgrade-prep — readiness report for the next Rails version (above) audit-gems — outdated gems, CVEs, replacement recommendations audit-i18n — hardcoded strings for translation (above) audit-n-plus-one — scan for likely N+1 patterns in controllers audit-strong-params — find controllers missing strong parameters or using permissive params audit-authorization — find controller actions missing authorization checks generate-service-object — create a new service object following your project’s conventions audit-deprecations — surface Rails and gem deprecations currently being triggered Build the one that addresses your biggest current pain. You can always add more later. What Skills Are Not Skills are not a way to automate a deploy pipeline. They are not a CI replacement. They run in a Claude session, against your codebase, with a human watching the output. They also do not remove the need for review. A good skill produces a report or a change set that a human still signs off on. The value is consistency and speed of the first pass, not autonomy. Getting Started The minimum viable path: Create .claude/skills/ in your Rails repo. Pick one workflow you run repeatedly — the gem audit or the i18n scan are good starters. Write a 30-line skill file following the frontmatter format above. Commit it. Use it. Tweak the instructions based on what Claude actually produces. By the third skill, the pattern is obvious. By the tenth, your team has a meaningful library of AI-driven Rails workflows that just run. Looking to integrate AI tooling into a Rails team in a durable way? Our Rails Care Plan increasingly includes skill libraries tuned to each client’s codebase — so the AI leverage compounds instead of dissipating between sessions. See also our post on tips for using Claude with an existing Rails app for the broader setup. Schedule a consultation or email hello@railsfever.com to talk about AI-assisted Rails development. --- # Fractional Rails Engineers: When a Part-Time Team Beats a Full-Time Hire URL: https://railsfever.com/blog/fractional-rails-engineers-when-and-why/ Date: 2026-04-11 Author: Wale Olaleye Hiring a full-time senior Rails engineer takes 2-4 months and costs $150K-$220K per year in salary alone. For a lot of companies — early-stage startups, bootstrapped SaaS products, teams between engineering hires — that math does not work. You need Rails expertise, but you do not need (or cannot afford) 40 hours a week of it. That is where fractional Rails engineers come in. “Fractional” means you get a dedicated, senior-level Rails engineer or team for a defined slice of their time — typically 10-20 hours per week, or a fixed monthly allocation. They are not freelancers you found on a marketplace. They are not a rotating body shop. They are experienced Rails engineers who work on your app consistently, build real context on your codebase, and operate as an extension of your team. This post explains how fractional Ruby on Rails development works, when it makes sense, and what to watch out for. What Fractional Rails Development Actually Looks Like A fractional Rails engagement is not “we will send you someone when you need them.” It is a structured, ongoing relationship where the same engineers work on your app every week. A typical setup: Dedicated engineers. You work with the same one or two senior Rails developers. They know your codebase, your business rules, your deploy process. No context switching, no re-onboarding. Fixed monthly scope. A defined deliverable or capacity per month. Predictable cost, predictable output. Integrated workflow. The fractional team joins your Slack, reviews PRs, attends relevant standups if needed. They operate like part of your team, not like an outside vendor. Flexible allocation. Some months are heavy on feature development. Others focus on maintenance, upgrades, or firefighting. The allocation flexes within the monthly scope. This is fundamentally different from staff augmentation, where a body fills a seat and you manage all the work. Fractional Rails engineers bring their own judgment, their own process, and their own opinions about how to keep your app healthy. When Fractional Makes Sense You need senior Rails expertise but not full-time Your app needs upgrades, maintenance, and occasional feature work — but not enough to justify a $200K hire. A fractional Rails team at $5K-$12K per month gives you senior-level work at a fraction of the cost. You are between engineering hires Your last Rails developer left. Hiring takes months. Your app still needs patches, deploys, and bug fixes in the meantime. A fractional team bridges the gap without the urgency of a panic hire. You are a founder without a technical team You built your MVP with an agency or contractor. Now you need ongoing development and someone who actually understands your codebase long-term. A fractional Rails team gives you that continuity without hiring. Your in-house team needs specialized help Your developers are strong on features but nobody enjoys (or has time for) Rails upgrades, gem maintenance, and infrastructure work. A fractional team handles the maintenance layer so your team can focus on product. You need to move fast without committing to headcount Pre-funding or post-funding, headcount is a commitment. Fractional Rails engineers let you ship at the speed of a larger team without locking in long-term salaries and benefits. What Fractional Is Not A few common misconceptions: It is not freelancing. Freelancers typically work project-to-project with no ongoing commitment. Fractional engineers work with you month after month, building context and continuity. It is not body shopping. You are not renting anonymous developers. You are engaging a specific team with specific expertise who take ownership of their work. It is not outsourcing. The fractional team integrates with your workflow, your tools, and your communication. They are not working in a black box overseas. It is not cheap labor. Fractional Rails engineers are senior. The cost per hour is comparable to (or higher than) a full-time senior engineer. The savings come from paying for only the hours you need. How to Evaluate a Fractional Rails Team Rails depth, not breadth A team that does “fractional development” across React, Python, Rails, and Go is spreading thin. Look for a team that specializes in Rails. They will be faster, more opinionated, and better at spotting problems before they become expensive. Consistency of the team Ask: “Will I work with the same engineers every month?” If the answer is anything other than yes, keep looking. The entire value of fractional is continuity. Ownership mentality Good fractional engineers do not just execute tickets. They flag risks, suggest improvements, push back on bad ideas, and care about the long-term health of your app. Ask for examples of how they have gone beyond task execution for other clients. Clear scope and pricing You should know exactly what you are getting each month: hours, deliverables, or both. No ambiguity about what is included and what is billed separately. Maintenance built in The best fractional Rails teams include maintenance as part of the engagement — gem updates, security patches, Ruby and Rails upgrades. If maintenance is an afterthought, your app will drift even with a fractional team. Fractional Rails Team vs. Other Models Model Best For Drawback Full-time hire Apps that need 40+ hrs/week of Rails work Expensive, slow to hire, single point of failure Freelancer One-off projects with clear scope No continuity, context lost between projects Staff augmentation Teams that need extra hands and can manage them You bear all management overhead Agency project Greenfield builds with a defined end date Handoff risk, no ongoing relationship Fractional Rails team Ongoing development + maintenance at < full-time Requires a good partner; less control than a hire Fractional sits in the sweet spot for companies that need consistent, senior Rails work without the overhead of a full-time hire or the risk of a transactional freelance relationship. What It Costs Rough ranges for fractional Ruby on Rails development: Maintenance + small features: $4K-$8K/month Active development + maintenance: $8K-$15K/month Dedicated senior capacity: $10K-$18K/month Compare that to: Full-time senior Rails hire: $12K-$18K/month in salary alone, plus benefits, equipment, management time, and 2-4 months to find them. The fractional model is not always cheaper on paper. It is cheaper per unit of useful output because you are paying for defined capacity delivered by someone who is already productive on your codebase. How We Do It at Rails Fever At Rails Fever, fractional Rails development is built into how we work. Clients on our Rails Care Plan get dedicated engineers who handle maintenance, upgrades, and support every month. Clients who also need feature work add feature development capacity on top — same engineers, same context, same relationship. For teams that need broader technical leadership alongside the engineering work, our Fractional CTO service adds strategic oversight: architecture decisions, hiring guidance, vendor evaluation, and technical roadmap planning. The common thread is continuity. Whether you need a light maintenance plan or a full development partnership, you work with the same people, and those people know your app. Looking for a fractional Rails team? Our Rails Care Plan and feature development services are designed for teams that need senior Rails engineers on a predictable monthly basis. If you also need technical leadership, explore our Fractional CTO service. Schedule a consultation or email hello@railsfever.com to talk about fractional Rails development for your team. --- # Tips for Using Claude with an Existing Rails App URL: https://railsfever.com/blog/tips-for-using-claude-with-an-existing-rails-app/ Date: 2026-04-10 Author: Wale Olaleye Using Claude on a greenfield Rails app is easy. The codebase is small, the conventions are Claude’s defaults, and there is almost no prior art to conflict with. Using Claude on a six-year-old Rails monolith with 40 models, 200 controllers, and a decade of team-specific conventions is a different exercise. The AI does not magically understand your app. It understands Rails. Your job is to close the gap between the two. Here are the tips that actually move the needle when you put Claude in front of a real, established Rails codebase. Start With a CLAUDE.md File The single highest-leverage thing you can do is drop a CLAUDE.md in the root of your repository. Claude Code reads it automatically on every session and treats it as persistent instructions. Put the things a new senior engineer would want to know on day one: The Ruby and Rails versions in use. Test runner and command (RSpec? Minitest? bin/rails test? bundle exec rspec?). Any local conventions that deviate from default Rails (service object patterns, form objects, query objects, naming conventions for concerns). What not to touch without asking — legacy modules, vendored gems, anything load-bearing that does not have tests. The database. If it is Postgres with specific extensions enabled, say so. If it is MySQL with unusual collation, say so. How to run the linter and which rules are non-negotiable (RuboCop config quirks, Standard, Packwerk boundaries). Keep it short. A 50-line CLAUDE.md is more useful than a 500-line one, because Claude will actually respect every line. Long documents dilute attention. Make the Tests Runnable From a Cold Start Claude operates best when it can run your tests and see the result. If bundle exec rspec spec/models/user_spec.rb requires five env vars, a running Postgres, a seeded database, and a Sidekiq worker, Claude will either skip running tests (and ship code that does not work) or waste a lot of context figuring out the setup. The fix: make it possible to run a single spec file against a test database with one command, ideally with no external services required. Use :rack_test or WebMock for external calls. Seed the test DB with Rails fixtures or a minimal seeds file that runs as part of db:test:prepare. If you cannot get there in one afternoon, at least document in CLAUDE.md exactly what needs to be running before Claude attempts tests. Point Claude at the Right Part of the Codebase Context windows are large but not infinite, and a Rails monolith will never fit entirely. The trick is scoping. Before asking Claude to change anything, give it the relevant files explicitly. Not “the user signup flow” — actually: app/controllers/registrations_controller.rb, app/models/user.rb, app/services/user_onboarding.rb, and the associated spec files. This sounds tedious, but it has two benefits. First, Claude’s output stays grounded in the actual code rather than inventing plausible Rails defaults. Second, you end up understanding your own signup flow better than you did before you asked. For exploratory work, the Grep and Glob tools inside Claude Code let it find files on its own. That works well for “find every place we call the Stripe API” but less well for “change the way we validate signups” — for the second case, you want to be specific. Respect the Conventions Already in the Codebase Claude has strong Rails defaults. Your app has its own conventions. When those conflict, Claude will happily generate code that works but looks nothing like the rest of the codebase — which turns every PR into a style review. Two moves help: Write the convention down in CLAUDE.md. “We use service objects in app/services/ with a call method. Controllers should not contain business logic.” Claude will follow this. Show it an example. When asking for a new service object, paste a reference service object into the prompt, or tell Claude which file to use as a template. Imitation is more reliable than instruction. This is especially true for apps that predate the current Rails conventions — if your app still uses before_filter or hand-rolled strong parameters, Claude needs to know, or it will “helpfully” modernize as it goes. Use Claude for the Boring, High-Volume Work The highest return on investment is on tasks that are tedious and pattern-matched: writing RSpec tests for existing code, adding i18n keys to hardcoded strings, generating form objects from existing controllers, backfilling YARD documentation, converting ERB to ViewComponent. These are the tasks that a senior engineer can do but does not want to do, and where getting it 85% right and reviewing the diff is faster than writing it from scratch. What Claude is less good at: anything that requires understanding a subtle business rule buried across three files. For that, you still need a human in the loop — or at a minimum, you need to explicitly surface the business rule in the prompt. Be Careful With Migrations and Destructive Changes Claude Code will happily generate and run a database migration if you let it. On a toy app, that is fine. On a production Rails app, it is not. Three safeguards: Configure Claude’s permissions so that rails db:migrate requires approval. Do not auto-allow. Always have Claude write the migration file first, then stop. Review the migration, run it manually, and then come back to Claude for the code that depends on it. For any migration that touches a table with more than a few million rows, review the locking behavior yourself. Claude knows about ALGORITHM=INPLACE and DISABLE_DDL_TRANSACTION! but will not always use them unprompted. The same principle applies to anything that mutates production-adjacent state: deploys, data backfills, cron jobs, feature flags. Keep a “Known Pitfalls” List After a few weeks of using Claude on your codebase, you will start to notice the same mistakes. Maybe it keeps importing a gem you removed six months ago. Maybe it insists on using update_attribute instead of update!. Maybe it generates specs that assume a test helper you do not have. Every time you correct one of these, add a one-line note to CLAUDE.md: - Do not use `update_attribute`; use `update!` and let it raise on failure. - Our Sidekiq queues are named `critical`, `default`, `low`. Do not invent new ones. - We use Factory Bot, not fixtures. Factories live in `spec/factories/`. This is the single most important investment in getting Claude to feel like a team member rather than a generic Rails engineer. Do Not Let Claude Run Forever Without Review Agent mode is powerful. It is also the fastest way to generate a PR that compiles, passes the tests Claude wrote, and does the wrong thing. Set a cadence: after every logical chunk of work (one feature, one bug fix, one refactor), read the diff carefully. Not just “does this look right” — actually trace the logic. Claude is unusually good at producing code that reads like it works. The bugs show up when it runs against real data. On larger changes, break the work into smaller commits and review each one. This makes bisecting easy when something does go wrong in production. The Bigger Picture Claude is not a replacement for understanding your own codebase. It is a very fast junior engineer who has read every Rails tutorial ever written but has never seen your app before. The leverage you get is proportional to how much context you give it and how carefully you review its output. Most teams under-invest in the CLAUDE.md file and over-invest in clever prompts. The lasting wins come from the boring, persistent configuration. Need help integrating AI tooling into an established Rails development process? Our Rails Care Plan and technical audit engagements are increasingly built around pairing senior Rails engineers with AI tooling — so you get the velocity without the cleanup bills. Schedule a consultation or email hello@railsfever.com to talk about AI-assisted Rails development. --- # Understanding Ruby Versioning: A Simple Guide for CTOs and Founders URL: https://railsfever.com/blog/understanding-ruby-versioning-for-founders/ Date: 2026-04-07 Author: Wale Olaleye If you run a product built on Ruby on Rails, your app depends on two major pieces of infrastructure: the Rails framework and the Ruby programming language. Most founders and CTOs pay attention to Rails versions but forget about Ruby — until something breaks or a security audit asks “what Ruby version are you running?” and nobody can answer confidently. This post is a plain-language explanation of how Ruby versioning works, how long each version is supported, and what it means for your business when a version reaches end of life. It is based on the official Ruby maintainer’s guide to the release cycle, simplified for a non-developer audience. How Ruby Version Numbers Work Ruby uses a three-part version number: MAJOR.MINOR.TEENY. MAJOR (the first number) changes rarely — only when the language makes a significant leap. Ruby went from 2.x to 3.0 in 2020. Ruby 4.0 shipped in December 2025. These jumps happen years apart. MINOR (the second number) changes every year. A new Ruby minor version ships every December 25th (yes, Christmas — it is a tradition). Ruby 3.3 shipped December 2023, Ruby 3.4 shipped December 2024, Ruby 4.0 shipped December 2025. TEENY (the third number) changes every few months for bug fixes and security patches. These are the small, safe updates: 3.3.5 → 3.3.6 → 3.3.7. The important thing to know: TEENY updates are almost always safe to apply immediately. MINOR and MAJOR updates require testing because they can change how the language behaves. How Long Is Each Version Supported? Each Ruby minor version follows a roughly three-year lifecycle: Year 1-2: Normal Maintenance The version receives bug fixes and security patches. This is the “fully supported” window. Everything works, gems are compatible, and you are in good shape. Year 3: Security Maintenance Only The version stops getting bug fixes. It only receives patches for security vulnerabilities and critical build issues. Your app will still run, but you are on borrowed time — new gems may stop supporting this version, and the pool of fixes shrinks. After Year 3: End of Life No more releases. No more security patches. Any new vulnerability discovered in your Ruby version will not be fixed. You are exposed. Where Things Stand Right Now As of early 2026: Ruby Version Released Status What It Means Ruby 4.0 Dec 2025 Normal maintenance Fully supported. Bug fixes and security patches. Ruby 3.4 Dec 2024 Normal maintenance Fully supported. Bug fixes and security patches. Ruby 3.3 Dec 2023 Security maintenance Security patches only. Plan your upgrade. Ruby 3.2 Dec 2022 End of life No patches. Upgrade now. Ruby 3.1 and older — End of life No patches. Upgrade urgently. If your app is on Ruby 3.2 or older, you are running on an unsupported runtime. Any new CVE will not be patched for your version. Why This Matters for Your Business Ruby version is not just a developer concern. It has direct business implications: Security and compliance Running an end-of-life Ruby version means unpatched vulnerabilities. If you handle customer data, payment information, or health records, this is a compliance risk. Security audits and SOC 2 assessments will flag it. Gem compatibility The Ruby ecosystem moves forward. Gem authors drop support for older Ruby versions over time. The longer you stay on an old Ruby, the harder it becomes to update any of your dependencies — including Rails itself. Rails 8 requires Ruby 3.2 at minimum. Hiring and retention Developers prefer working on current technology. An app stuck on Ruby 3.0 is a harder sell to candidates than one on 3.4 or 4.0. This affects both hiring speed and retention. Upgrade cost Ruby upgrades are usually straightforward when done one minor version at a time (3.2 → 3.3 → 3.4). They become expensive when deferred across multiple versions. A three-version jump involves more breaking changes, more gem incompatibilities, and more testing. The One Rule That Saves Money Upgrade Ruby every year. Each December, a new Ruby minor ships. Sometime in Q1 of the following year, update your app to the new version. The jump from one minor to the next is usually small — a few days of testing, a handful of gem updates, and a deploy. If you do this annually, you never fall behind. You never hit end of life. You never face a multi-version emergency upgrade. If you skip it for three years, you are looking at a project, not a patch. How Ruby Upgrades Relate to Rails Upgrades Ruby and Rails are separate projects with separate version numbers and separate support timelines. But they are tightly coupled: Each Rails version requires a minimum Ruby version. Rails 8 requires Ruby 3.2+. When you upgrade Rails, you often need to upgrade Ruby first. When Ruby hits end of life, you need to upgrade Ruby regardless of your Rails version. The practical advice: keep both current. Upgrade Ruby annually (small, boring). Upgrade Rails on its own cadence (see when to upgrade Rails). Never let either fall more than one version behind. What to Do Right Now Find out what Ruby version your app is running. Ask your developer, or check the .ruby-version file in your repository. Check it against the table above. If it is 3.2 or older, you need to act this quarter. If you are on 3.3, plan the upgrade to 3.4 within the next two quarters. You are in security-only maintenance. If you are on 3.4 or 4.0, you are in good shape. Make sure you have a plan to stay current when the next version ships in December. Put “Ruby upgrade” on your maintenance calendar as an annual Q1 task. Treat it like renewing insurance — boring, cheap, and catastrophically expensive to skip. Further Reading Ruby maintainer’s guide to the release cycle — the original technical source Rails 7 LTS: A CTO’s guide — what long-term support means on the Rails side How to maintain Ruby on Rails: a founder’s guide — the bigger maintenance picture Not sure what Ruby version your app is on, or whether it is time to upgrade? A Rails technical audit covers Ruby, Rails, and gem health in a single assessment. For ongoing Ruby and Rails maintenance, our Rails Care Plan keeps both current on a monthly cadence so you never hit end of life. Schedule a consultation or email hello@railsfever.com to check your Ruby version health. --- # Rails App Maintenance: The Complete Guide for 2026 URL: https://railsfever.com/blog/rails-app-maintenance-complete-guide/ Date: 2026-04-02 Author: Wale Olaleye Rails app maintenance is the work that keeps a production application secure, performant, and changeable over time. It is not glamorous. It does not show up in product demos. But it is the difference between an app that ships confidently in year five and one that grinds to a halt. If you are responsible for a Rails app in production — as a developer, CTO, or founder — this guide covers what maintenance actually involves, how often each task should happen, and how to build a sustainable practice around it. For the developer-focused playbook, see how to maintain an existing Rails app. For the business case, see the hidden ROI of regular Rails maintenance. This post sits between the two — practical enough to act on, strategic enough to justify. The Five Pillars of Rails App Maintenance 1. Dependency Management Your Rails app depends on Ruby, the Rails framework, and typically 50-200 additional gems. Each of these has its own release cycle, its own security advisories, and its own compatibility constraints. Maintenance means: Applying gem patch updates monthly. Reviewing bundle outdated --only-explicit regularly. Running bundler-audit in CI to catch known CVEs. Replacing abandoned gems before they become blockers. Keeping explicit version pins documented with reasons. The goal is never “update everything to latest.” The goal is “know what you have, know what is vulnerable, and keep the upgrade path clear.” 2. Security Patching Security is not a feature you ship once. It is a maintenance practice. For a Rails app, the security surface includes: The Rails framework (CVEs announced on the Rails blog and security mailing list). Ruby itself (CVEs announced by the Ruby core team). Every gem in your Gemfile.lock. Your operating system and Docker base image. Your JavaScript dependencies, if any. A healthy maintenance practice patches critical CVEs within days of disclosure and reviews lower-severity issues on a monthly cadence. For more on this, see security best practices for web apps. 3. Framework and Runtime Upgrades Rails ships a new minor version roughly annually and a new major version every 2-3 years. Ruby follows a similar cadence, with a new minor every Christmas and approximately three years of support per version. (For a detailed breakdown of Ruby’s support lifecycle, see understanding Ruby versioning.) Maintenance means staying within the supported window for both: Ruby: currently 3.3 (security maintenance) and 3.4 / 4.0 (normal maintenance). Ruby 3.2 is end-of-life. Rails: currently 7.2 and 8.0 receive patches. Older versions are unsupported. The apps that upgrade continuously — minor by minor, on a quarterly cadence — never face the “three majors behind” emergency project. The apps that defer upgrades eventually pay 10-50x more to catch up. 4. Monitoring and Observability You cannot maintain what you cannot see. A production Rails app needs: Error monitoring (Sentry, Honeybadger, Rollbar) — new exception signatures within minutes. Performance monitoring (Skylight, Scout, New Relic) — slow endpoints, N+1 queries, memory growth. Uptime monitoring — know before your customers do. Log aggregation — structured, searchable, retained long enough to investigate. Maintenance includes reviewing these signals regularly, not just setting them up and forgetting. 5. Code Health Over time, Rails apps accumulate dead code, unused gems, monkey-patched initializers, and tests that no longer pass. This is normal. Maintenance means cleaning it up on a regular cadence: Delete dead code and unused routes. Remove gems that nothing references. Audit config/initializers quarterly — many patches from years ago are no longer needed. Keep the test suite green, fast, and deterministic. Ensure new engineers can set up the development environment in under an hour. The Maintenance Calendar A default cadence that works for most small-to-medium Rails teams: Weekly (30-60 minutes) Review dependency alerts (Dependabot, Snyk, or bundler-audit). Check error monitor for new exception patterns. Triage any open CVEs. Monthly (half a day) Apply gem patch updates. Apply Ruby patch updates. Test and deploy to staging. Send a maintenance summary to stakeholders. Quarterly (1-2 days) Progress on the next Rails minor or major upgrade. Audit initializers and middleware. Review and clean up dead code. Spike the next major upgrade to measure distance. Annually (1-2 weeks) Complete at least one Rails version upgrade. Refresh test coverage around critical flows. Evaluate every pinned gem version. Review infrastructure (database versions, deploy tooling, CI pipeline). This cadence is not a ceiling. Regulated industries or high-traffic apps may need more. But it is a solid floor that prevents the kind of drift that leads to emergency projects. The Cost of Not Maintaining The cost of skipping maintenance is not the eventual upgrade bill — though that bill can reach six figures. The real cost is slower everything else: Features take longer because the test suite is unreliable. Bug fixes take longer because nobody trusts the deploy process. Hiring takes longer because candidates see the Gemfile and run. Sales take longer because security questionnaires reveal unsupported versions. Apps on regular maintenance do not have that slowdown. They ship faster in year five than apps that “saved time” by skipping maintenance in year two. For the full cost breakdown, see Ruby on Rails maintenance cost. DIY vs. Outsourced Maintenance Both models work. The decision depends on your team: DIY maintenance works when: You have at least one senior Rails engineer who enjoys this work. You can protect maintenance time from being cannibalized by feature requests. Your team has the discipline to maintain the cadence quarter after quarter. Outsourced maintenance works when: Your team is focused on product and nobody owns maintenance. You are between engineers or CTOs. You want a predictable monthly cost instead of unpredictable emergency projects. You want an outside perspective on your codebase health. Many teams start with DIY and move to outsourced when they realize maintenance keeps getting deprioritized. That is not a failure — it is a recognition that maintenance needs a dedicated owner. Need help building a sustainable maintenance practice for your Rails app? Our Rails Care Plan delivers monthly maintenance with clear scope and fair pricing. If you need an honest assessment of where your app stands, start with a Rails technical audit. And if your app needs rescue before it needs maintenance, the Rails Rescue Kit stabilizes first. Schedule a consultation or email hello@railsfever.com to talk about Rails app maintenance. --- # Rails 7 to Rails 8 Upgrade: The 2026 Technical Guide URL: https://railsfever.com/blog/rails-7-to-rails-8-upgrade-2026-guide/ Date: 2026-03-31 Author: Wale Olaleye Rails 8 has been out long enough now that “we’re planning our Rails 7 to Rails 8 upgrade” is no longer early-adopter talk. It is overdue for a lot of teams. If you’re on Rails 7.0 or 7.1, your official support window is closing. If you’re on Rails 7.2, you still have runway, but not for long. This is a 2026 field guide to the Rails 7 to Rails 8 upgrade, written from the perspective of someone who has shepherded this migration through many codebases. Not a marketing brochure for Rails 8’s new features - a practical walkthrough of what to plan, what to sequence, and what actually breaks. If you want an even more specific focus on Rails 7.2 only, see Rails 7.2 to Rails 8 upgrade: step-by-step. Before You Touch Anything: Scope the Work The single biggest mistake teams make on a Rails 7 to Rails 8 upgrade is treating it like a framework bump. It is not. It is a compound migration that touches the asset pipeline, caching, background jobs, and potentially authentication all at once. Before writing any code, answer these honestly: What Rails point release are we on? 7.0, 7.1, and 7.2 each have a different distance to 8. What Ruby version? Rails 8 requires Ruby 3.2 at minimum. 3.3 or 3.4 strongly preferred. Asset pipeline? Sprockets, Propshaft, Webpacker, jsbundling-rails, shakapacker? Background jobs? Sidekiq, GoodJob, Delayed Job, Resque? Cache store? Redis, Memcache, Dalli, custom? Authentication? Devise, custom, Sorcery, OmniAuth-only? Database? Postgres (version?), MySQL, SQLite. Deploy? Heroku, Kamal, AWS, custom. Write this down. Each answer constrains the upgrade path. An app on Rails 7.0 with Webpacker, Sidekiq, Devise, and Heroku is a fundamentally different project than Rails 7.2 with Propshaft, GoodJob, custom auth, and Kamal. Do not let anyone give you a timeline without knowing these answers. Sequence the Upgrade: Do Not Do It All at Once The other mistake: treating “upgrade to Rails 8” as a single PR. It is three or four separate projects that should ship in order. Batching them multiplies the risk. A good default sequence: Get Ruby current (3.3.x or 3.4.x). Get to the latest Rails 7.2.x if you are not there already. Clear upgrade blockers: retire unused gems, update authentication if needed, migrate off Webpacker to jsbundling-rails or importmap. Bump to Rails 8.0. Adopt Rails 8 features deliberately (Solid Cache, Solid Queue, built-in auth) only after you’re stable on 8. Each of these 1-5 items is ideally a separate deploy, possibly with weeks between them. Step 1: Get Ruby Current Rails 8 requires Ruby 3.2+. Ruby 3.0 and 3.1 are EOL. If you are on Ruby 3.0 or earlier, this is your first milestone - and it is its own project. # .ruby-version 3.3.6 # Dockerfile (if applicable) FROM ruby:3.3.6-slim Then: bundle install bundle exec rspec Common breakage points moving to Ruby 3.2 / 3.3: Gems that called .exists? on nil or relied on frozen-string quirks. Data.define collisions if you have a model or class named Data. Keyword argument strictness - if you didn’t finish the 2.7 → 3.0 transition, you’ll catch it now. Ship Ruby as a separate deploy. Let it bake in production for a week before touching Rails. Step 2: Move to Latest Rails 7.2.x Whatever Rails 7 point release you are on, move to the latest 7.2.x first. Do not jump from 7.0 straight to 8. # Gemfile gem "rails", "~> 7.2.2" bundle update rails bundle exec rails app:update rails app:update will walk you through changed configs interactively. Read every diff. Accept, reject, or merge with care. Don’t blindly accept - some of these defaults will bite you. Watch for: config/initializers/new_framework_defaults_*.rb files. config.load_defaults value in config/application.rb. Changes to config/puma.rb if you haven’t updated it in years. Ship Rails 7.2 to production. Let it bake for at least a week. Step 3: Clear the Rails 8 Blockers Some changes are easier to make on Rails 7 before the 8 upgrade than during it. Tackle these as independent PRs: Move off Webpacker Webpacker is retired. If your app still uses it, migrate to jsbundling-rails with esbuild or rollup, or move to importmap-rails if your JS is modest. This is a meaningful project on its own - do not pretend it’s part of the Rails upgrade. Decide Sprockets vs Propshaft Rails 8 defaults to Propshaft, but Sprockets still works. If your Sprockets setup is complex (custom transforms, Sass via sprockets, image fingerprinting assumptions), stay on Sprockets through the Rails 8 upgrade and migrate to Propshaft as a separate project later. Do not do both at once. Review authentication Rails 8 ships a built-in authentication generator. You do not have to use it. Devise still works on Rails 8. Do not rip out working auth to adopt a new framework feature in the same upgrade - that combination is a test suite nightmare. Clean up your Gemfile bundle outdated --only-explicit bundle exec bundle-audit check --update Delete gems you don’t use. Update gems with known CVEs. Upgrade any gem that has a known-to-block-Rails-8 older version. Step 4: Actually Upgrade to Rails 8 Now the bump itself. This should be the smallest PR in the whole project if you sequenced well. # Gemfile gem "rails", "~> 8.0.0" bundle update rails bundle exec rails app:update bundle exec rspec Work through rails app:update deliberately. Expect to touch: config/application.rb - load_defaults 8.0. config/environments/*.rb - new Rails 8 defaults in the framework_defaults initializer. config/cache.yml - if adopting Solid Cache. config/queue.yml - if adopting Solid Queue. config/puma.rb - default may have shifted. The Solid Cache / Solid Queue decision Rails 8 introduces Solid Cache (DB-backed caching) and Solid Queue (DB-backed jobs). These are optional. You do not have to adopt them during the upgrade. If you have a working Redis + Sidekiq stack, keep it. Adopt Solid* later as a separate project if at all. If you are over-paying for Redis for caching alone, Solid Cache is a real cost saver. If you are on Heroku and tired of Redis add-on complexity, Solid Queue is attractive. Adopt Solid Cache and Solid Queue only after you are stable on Rails 8 vanilla. Database compatibility Rails 8 drops support for older database versions. Verify: Postgres 13+ (14+ strongly recommended) MySQL 8.0.19+ SQLite 3.8+ If your production DB is older, you have a separate infrastructure project before Rails 8 will run. The Real Gotchas Here are the ones that keep showing up across migrations, beyond the obvious: Deprecated ActiveRecord::Base.connection In Rails 8 the multi-db API has evolved. Calls to ActiveRecord::Base.connection in places that should be .lease_connection or the per-role handler can raise. Audit any explicit .connection use in lib/ and app/. Zeitwerk strictness Rails 8 is stricter about constant autoloading. If you relied on implicit autoload paths or weird file naming, you will find out during boot. Test Rails.application.eager_load! locally. find_or_create_by race conditions Rails 8 hardens find_or_create_by / find_or_initialize_by behavior around unique constraints. Review any high-throughput find_or_create_by calls for subtle semantic changes. Initializer ordering Rails 8 shifts a handful of framework initializer orderings. If you have initializers that read or mutate framework state during boot, verify they still run when you expect. ActionMailer deliver_later with Solid Queue If you adopt Solid Queue, your mail delivery moves to the DB queue by default. If your transactional emails depend on Sidekiq retries or a specific dead-letter behavior, you need to reconfigure. JS build differences If you moved off Webpacker, verify that every page’s JS actually loads in production. Importmap-based apps in particular can look fine in dev and break in prod over CDN caching. Cookie / session compatibility Rails 8 changed some default session cookie settings. If you run multiple services behind a shared domain or share cookies across subdomains, test the login flow end-to-end. Testing Strategy The test suite is your upgrade’s co-pilot. A few things to do: bundle exec rspec --format documentation Run the entire suite multiple times to catch nondeterminism introduced by new defaults. Re-run system specs explicitly - browser-based specs catch the class of issues unit tests miss. Run your full suite with RAILS_ENV=production in staging, not just test. A staging environment that truly mirrors production is not optional for this upgrade. Deployment Do not deploy Rails 8 to production on a Friday. Do deploy it behind whatever rollout mechanism you have: Percentage rollouts if you have them. Canary deploys to one instance first. Feature-flagged new behavior (e.g., a trial of Solid Cache on a read-only surface) before full adoption. Have a rollback plan. For a Rails major upgrade, “rollback” means redeploying the previous image with the previous Gemfile.lock - not a git revert. Make sure your deploy tool can do that under stress. Post-Upgrade: Adopt New Features Deliberately Once you are stable on Rails 8, then evaluate: Solid Cache: significant cost savings if you were paying for Redis just for caching. Migrate gradually. Solid Queue: attractive if you want to drop Redis entirely; test throughput honestly on your actual workload before committing. Built-in auth: for new apps, compelling. For existing apps on Devise, rarely worth the swap. Kamal 2: if you are already on Kamal, the 2.x upgrade is straightforward. If you are on Heroku and happy, Kamal is a whole separate project. None of these belong in the “upgrade to Rails 8” PR. Timeline Expectations Rough numbers for a well-tested SaaS app: Well-maintained Rails 7.2 app: 2-4 weeks elapsed, 1-2 weeks of focused work. Rails 7.1 with modest debt: 4-8 weeks. Rails 7.0 with Webpacker and dated gems: 8-16 weeks, and the Webpacker migration is half of it. If anyone quotes you under a week for the full project, they are underscoping. If anyone quotes over 6 months, they are either overscoping or telling you that you have a bigger problem than a Rails upgrade. Related Reading Rails 7.2 to Rails 8 upgrade: step-by-step When to upgrade Rails Stop wasting money on one-off Rails upgrades How to maintain an existing Rails app Planning a Rails 7 to Rails 8 upgrade and want an honest scope? We offer Rails Upgrade Express for incremental Rails 7 to 8 migrations, Rails technical audits to scope the work realistically before you commit, and Rails Care Plans so the next upgrade is routine instead of heroic. Schedule a consultation or email hello@railsfever.com to talk through your Rails 8 upgrade. --- # Why Your Rails App Needs a Dedicated Support Team URL: https://railsfever.com/blog/why-your-rails-app-needs-a-dedicated-support-team/ Date: 2026-03-28 Author: Wale Olaleye There is a pattern that plays out across Rails apps of every size. The app runs fine for months. Then something breaks — a gem vulnerability, a production error spike, a deploy that will not complete. The founder or CTO scrambles to find someone who can help. A freelancer is hired. They fix the immediate problem. They leave. Three months later, something else breaks. A different freelancer is hired. The cycle repeats. Each time, the new person starts from zero. They do not know the codebase. They do not know the deploy process. They do not know why that one initializer exists or why Sidekiq is configured that way. They spend hours learning context that the previous person already had — and then that context walks out the door again. This is the ad-hoc support trap, and it is one of the most expensive ways to run a Rails app. Context Is the Most Expensive Thing to Rebuild A Rails app is not just code. It is decisions layered on decisions over years. Why was Devise chosen over custom auth? Why is there a concerns/legacy_pricing.rb that nobody touches? Why does the deploy script skip asset precompilation on Tuesdays? A dedicated support team learns these answers once and carries them forward. A rotating cast of freelancers learns them over and over — or worse, never learns them and introduces changes that conflict with decisions they did not know existed. The compounding value of a persistent support team is not just faster fixes. It is fewer fixes needed in the first place, because the team understands the app well enough to prevent problems upstream. What “Dedicated” Actually Means A dedicated Rails support team does not mean a full-time hire sitting idle between incidents. It means a consistent team — the same engineers, working on your app month after month — who own a defined scope of your app’s health. That scope typically includes: Dependency maintenance. Gem updates, Ruby patches, Rails version upgrades — applied continuously, not in annual sprints. Security response. CVEs triaged and patched within days, not weeks. bundler-audit and Brakeman running in CI. Monitoring and triage. Error spikes, slow queries, memory growth — caught by the support team, not reported by customers. Incident response. When something does break, the team already has context. Diagnosis is faster. Fixes are more targeted. Root causes get addressed. Knowledge continuity. Documentation, runbooks, and institutional memory that persist even if your internal team changes. This is what a Rails Care Plan is designed to deliver. The Math of Ad-Hoc vs. Dedicated A quick comparison for a typical mid-size Rails app: Ad-hoc support 3-4 incidents per year requiring outside help. Each incident: $3K-$8K for diagnosis + fix by someone with no context. Annual cost: $12K-$32K in reactive spend. Plus: the cost of downtime, lost customer trust, and the internal time spent finding and onboarding each contractor. Plus: the underlying problems that never get fixed because nobody owns them. Dedicated support team Monthly retainer: $3K-$6K/month ($36K-$72K/year). Incidents caught earlier or prevented entirely. Upgrades happen continuously — no emergency projects. Context compounds over time — everything gets faster. The dedicated model costs more in monthly spend but dramatically less in total cost of ownership. The apps that run on continuous maintenance do not have the emergency upgrade bills, the multi-day outages, or the “we need to pause features for a quarter to fix the foundation” conversations. When You Need a Support Team A few signals that your app has outgrown ad-hoc support: Your last Rails upgrade was more than 18 months ago. Nobody is owning the upgrade cadence. You have had the same class of incident more than twice. Root causes are not being addressed. You are between engineers or CTOs. Nobody is watching the store. Your deploy process requires tribal knowledge. One person being out should not block a production fix. Enterprise customers are asking about your security posture. You need a credible answer. Any two of these together is a strong signal. Three or more is urgent. What to Look For in a Support Team The same principles from choosing a Rails support consultancy apply, plus: Consistency. The same engineers work on your app every month. Not a rotating pool. Proactive communication. You hear from the team when things are fine, not just when things are broken. Clear scope. You know exactly what is covered and what is not. Reasonable pricing. Support should be accessible as a monthly cost, not a luxury. If the pricing only works for enterprises, it is not designed for growing teams. The Long Game The best thing about a dedicated Rails support team is what happens after 12 months. By then, the team knows your app as well as any internal engineer. Upgrades are routine. Incidents are rare. New features can be scoped in hours instead of days because the team already understands the data model, the business rules, and the deployment constraints. That is the compounding return on a support relationship. It is invisible in month one and undeniable by month twelve. Ready to stop cycling through ad-hoc contractors? Our Rails Care Plan gives your app a dedicated support team with monthly maintenance, clear communication, and engineers who build real context on your codebase. For urgent issues, our Rails Support Desk provides fast response. And if your app needs rescue first, the Rails Rescue Kit stabilizes before we maintain. Schedule a consultation or email hello@railsfever.com to talk about dedicated Rails support. --- # Choosing a Rails Support Consultancy: What Actually Matters URL: https://railsfever.com/blog/rails-support-consultancy-what-to-look-for/ Date: 2026-03-24 Author: Wale Olaleye At some point, most Rails apps outgrow the “one developer who knows everything” model. Maybe that developer left. Maybe the app got complex enough that one person cannot cover security patches, dependency updates, production monitoring, and feature work at the same time. Maybe you are a founder and you never had that person to begin with. That is when “rails support consultancy” starts appearing in your search history. The challenge is that “Rails support” means very different things to different providers. Some mean “we will answer Slack messages when your app is on fire.” Others mean “we will proactively maintain your app so it never catches fire in the first place.” Those are fundamentally different services at fundamentally different price points. This post helps you figure out which kind of support you need and how to evaluate the consultancies that offer it. What “Rails Support” Can Mean There are at least four distinct things that get sold under the banner of Rails support: 1. Reactive incident support You call when something breaks. The team investigates, fixes the immediate problem, and sends an invoice. No ongoing relationship. No proactive work. Good for: Teams with in-house Rails engineers who just need a safety net for emergencies. Risk: You only call when things are already bad. Root causes go unaddressed. The same types of incidents recur. 2. Staff augmentation The consultancy places one or more developers on your team. They work on your backlog, attend your standups, and write code alongside your engineers. Support is implicit — they help because they are embedded. Good for: Teams that need more hands and have the management capacity to direct them. Risk: When the augmented developers leave, the knowledge goes with them. No one is explicitly owning maintenance. 3. Managed maintenance (care plans) The consultancy takes ownership of a defined slice of your app’s health: dependency updates, security patches, Rails and Ruby upgrades, monitoring, and sometimes small bug fixes. Work happens on a predictable monthly cadence. Good for: Teams that want maintenance handled without managing it. Founders without a CTO. Engineering teams that want to focus on product. Risk: Low, as long as the scope is clearly defined and the consultancy communicates well. 4. Full technical partnership Everything in managed maintenance, plus feature development, architecture guidance, and strategic input. The consultancy acts as your external engineering team or fractional CTO. Good for: Early-stage companies without a full engineering team. Companies between CTOs. Teams scaling faster than they can hire. Risk: Dependency on the partner. Mitigated by good documentation and knowledge transfer practices. Most teams searching for a “Rails support consultancy” actually need option 3 or 4. Options 1 and 2 are fine for specific situations, but they do not solve the maintenance problem. What to Evaluate Do they specialize in Rails? A consultancy that supports Rails alongside React, Python, Go, and PHP is spreading attention across ecosystems. Rails has its own upgrade cadence, gem ecosystem, security advisory process, and deployment patterns. A Rails specialist knows these cold. A generalist looks them up. What is their maintenance process? Ask for specifics. How often do they patch gems? How do they handle CVE disclosures? Do they run bundler-audit in CI? What is their Rails upgrade cadence? A good consultancy can describe this in detail because they do it every month for every client. Who will actually work on your app? Small consultancies give you direct access to senior engineers. Larger ones may assign junior developers with senior oversight. Neither is inherently wrong, but you should know which model you are buying. Ask: “Will the person who scopes the work also do the work?” How do they communicate? Weekly async updates? A shared Slack channel? Monthly reports? The right cadence depends on your needs, but the consultancy should have a default that works for most clients. If they cannot describe their communication process, they probably do not have one. What does “support” actually include? Get the scope in writing. Does the monthly retainer cover security patches only, or also small bug fixes? Is there a cap on hours? What happens if a critical CVE drops — is that covered or billed separately? The clearest consultancies publish this. The murkiest ones say “it depends” to everything. Do they have a track record? Testimonials, case studies, client references. Not every consultancy publishes these, but the willingness to connect you with an existing client says a lot. Red Flags A few signals that a Rails support consultancy may not deliver: No defined process. “We’ll figure it out as we go” is not a support model. No Rails upgrade experience. If they have never moved a production app between Rails versions, maintenance will be shallow. Invoice-only communication. If you only hear from them when the bill arrives, they are not proactively supporting your app. No staging environment requirement. A support team that patches production without staging is gambling with your app. Rotating developers. If a different engineer touches your app every month, nobody builds deep context. What Good Support Looks Like Month to Month A well-run Rails support engagement on a monthly cadence typically includes: Gem patch updates applied and tested. Security advisories reviewed and patched within days of disclosure. Ruby patch versions applied when available. Quarterly Rails minor or major upgrade progress. Monthly summary of what was done, what was found, and what is coming next. Responsive communication for urgent issues. Over time, the support team builds context on your app that makes everything faster — debugging, upgrades, feature scoping. That compounding context is the real value of a long-term support relationship. How Much Should It Cost? Rails support pricing varies widely, but rough ranges for managed maintenance: Patch-level maintenance only (gems, security, monitoring): $2K-$5K/month Full maintenance + small fixes: $4K-$8K/month Maintenance + feature development: $8K-$15K/month The right tier depends on your app’s complexity, your internal team size, and how much of the maintenance burden you want to offload. For a longer take on the economics, see Ruby on Rails maintenance cost. Looking for a Rails support consultancy that actually owns your app’s health? Our Rails Care Plan delivers monthly maintenance with clear scope, fair pricing, and engineers who know your codebase. For teams that need broader support, our Rails Support Desk provides responsive help when things go wrong. And if you need a technical leader, our Fractional CTO service fills the gap. Schedule a consultation or email hello@railsfever.com to talk about Rails support for your app. --- # Ruby on Rails Upgrade Services: What to Expect and How to Choose URL: https://railsfever.com/blog/ruby-on-rails-upgrade-services/ Date: 2026-03-19 Author: Wale Olaleye If you have searched for “Ruby on Rails upgrade services,” you are probably in one of two situations. Either your app is on an older Rails version and you know it needs to move forward, or someone on your team just told you that your current version is approaching end of life and you need to act. Both are valid. Both are common. And both deserve better than a vague promise from a contractor who has never upgraded a production Rails app before. This post explains what a professional Rails upgrade engagement actually looks like, what it should cost, what questions to ask before signing, and how to tell the difference between a team that will get you there safely and one that will leave you with a half-finished migration. What a Rails Upgrade Actually Involves A Rails upgrade is not a single bundle update rails command. It is a coordinated migration that touches multiple layers of your application: Ruby version. Rails 8 requires Ruby 3.2 at minimum. If your Ruby is older than that, the Ruby upgrade comes first — and it is its own project with its own breakage surface. The Rails framework. The rails gem itself, plus actionpack, activerecord, activesupport, and the rest of the framework gems. Each major version introduces deprecations, removals, and new defaults. Your gem dependencies. Everything in your Gemfile.lock needs to be compatible with the target Rails version. This is usually where the real work lives — one pinned gem with no Rails 8 support can block the entire upgrade. Configuration and initializers. Rails ships new defaults with each version. Your config/application.rb, environment files, and initializers all need to be reviewed and updated. Your application code. Deprecated APIs, changed method signatures, removed features. The test suite catches most of these, but only if you have one. Infrastructure. Database version requirements change. Deploy tooling may need updates. CI pipelines need adjustment. A good upgrade service handles all of these as a coordinated sequence, not as a single big-bang PR. What to Look For in an Upgrade Provider Rails-specific experience General web development shops can write Rails code, but upgrading a production Rails app across major versions is a specialized skill. Ask how many Rails upgrades the team has completed, what version combinations they have handled, and whether they can show you a process — not just a resume. Incremental approach Any provider proposing to jump three Rails majors in a single PR is a red flag. Professional upgrade services move version by version: 6.1 to 7.0, 7.0 to 7.1, 7.1 to 7.2, 7.2 to 8.0. Each step is a deployable milestone. Each step has its own test pass. Test-first methodology The upgrade team should run your test suite before, during, and after every version bump. If your test coverage is thin, a good provider will flag that upfront and help you add coverage for critical paths before touching the framework version. Clear scoping and communication You should know before the engagement starts: what versions you are moving between, what the estimated timeline is, what risks have been identified, and what the team will do if a gem turns out to be incompatible. No surprises. Post-upgrade support The upgrade is not done when the PR merges. It is done when the app has been stable in production for a reasonable period. Ask whether the provider includes a stabilization window after deploy. What a Professional Upgrade Engagement Looks Like A typical Rails upgrade engagement follows this arc: Week 1: Audit and scoping. The team reviews your codebase, gem dependencies, Ruby version, test coverage, and infrastructure. You get a written scope: target versions, estimated effort, identified risks, and a timeline. Weeks 2-N: Incremental upgrades. Each version bump is a branch, a test pass, a code review, and a deploy to staging. Ruby first, then Rails minor-by-minor, then the major jump. Gems are updated alongside each step. Final week: Production deploy and stabilization. The final version lands in production. The team monitors for regressions, performance changes, and edge cases for an agreed stabilization window. The timeline depends on your starting point. A well-maintained Rails 7.2 app moving to 8.0 might take 2-4 weeks. A Rails 5.2 app with Webpacker and 200 gems might take 3-4 months. What It Should Cost Rough ranges for a typical SaaS app: Rails 7.2 → 8.0 (well-maintained): $8K-$20K Rails 7.0 → 8.0 (moderate debt): $15K-$40K Rails 5.x or 6.x → 8.0 (significant debt): $40K-$150K+ The biggest cost drivers are: how far behind you are, how many gems need replacing, whether you have test coverage, and whether the asset pipeline needs migration. If someone quotes you a flat rate without looking at the codebase first, be cautious. Questions to Ask Before Signing How many Rails upgrades have you completed in the last 12 months? What is your process for handling incompatible gems? Do you upgrade Ruby and Rails in separate steps? What happens if the timeline estimate is wrong? Is post-deploy stabilization included? Will I work with the same engineers throughout? Can you show me a past upgrade plan or case study? The answers tell you more than the sales pitch. When to Upgrade vs. When to Maintain Not every Rails app needs an upgrade right now. If you are on a supported Rails version (currently 7.2 or 8.0) with a current Ruby, your priority is ongoing maintenance — keeping gems patched, monitoring for CVEs, and staying current incrementally. If you are on an unsupported version, the upgrade is not optional — it is a security and compliance requirement. The question is not whether to upgrade but who does it and how fast. For a deeper look at the Rails 7 to 8 path specifically, see our Rails 7 to Rails 8 upgrade guide. Need a Rails upgrade done right? Rails Upgrade Express is our structured, incremental upgrade service — scoped before we start, delivered version by version. If you are not sure where you stand, a Rails technical audit gives you an honest assessment first. And once you are current, a Rails Care Plan keeps you there. Schedule a consultation or email hello@railsfever.com to scope your Rails upgrade. --- # How to Maintain Ruby on Rails: A Founder's Guide to Keeping Your App Healthy URL: https://railsfever.com/blog/maintain-ruby-on-rails-founder-guide/ Date: 2026-03-17 Author: Wale Olaleye If you are a founder whose product runs on Ruby on Rails, there is a question that will eventually land on your desk. Not when things are going well. Usually in the week after a CVE lands, or the month a Ruby version goes EOL, or the quarter a customer asks about SOC 2. The question: “are we maintaining this app properly?” Most founders cannot answer it confidently. Not because they are bad founders - because nobody ever told them what “maintaining Ruby on Rails” actually involves, what it costs, or what it looks like when it is going right. This guide is that explanation, in business terms. If you want the deep developer playbook, see how to maintain an existing Rails app. This post is for the person who signs the check. What “Maintain Ruby on Rails” Really Means Rails is a framework that ships a new minor version roughly once a year and a new major version every couple of years. Ruby does something similar. The ecosystem of gems you depend on moves continuously. “Maintaining Ruby on Rails” means keeping pace with that movement at a rhythm that fits your business: Applying security patches when CVEs land. Upgrading Ruby before your version goes end-of-life. Upgrading Rails often enough to stay supported. Keeping the hundred or so gems in your app reasonably current. Keeping your own code clean enough that the above is not terrifying. Done well, this costs a predictable, small amount of engineering capacity each month. Done poorly, it costs you a giant emergency project every few years. Why This Is a Business Decision Founders often delegate “maintenance” to the dev team because it sounds technical. That is a mistake. The dev team can execute maintenance. Only you can decide how much risk the business is willing to carry. Three business realities only you can judge: 1. Security risk tolerance If you hold customer data, payments, PII, or health information, your tolerance for running an un-patched framework is very low. If your app is an internal tool used by 12 people, it is higher. Maintenance frequency should follow risk. 2. Enterprise sales readiness The moment you start selling to larger companies, security questionnaires start arriving. “What versions of Ruby and Rails are you on?” is on every one. “We’re on Rails 5.2 and Ruby 2.7” closes no deals. 3. Engineering velocity Unmaintained Rails apps get slower to change. Features that took a day in year one take a week in year five. That is a direct drag on your roadmap - and it is invisible until you try to hire someone new and watch them flinch at your Gemfile. None of those are “should we use Propshaft?” questions. They are founder questions. The Three Modes of Rails Maintenance I have seen three patterns across the dozens of Rails apps I have worked on. Only one is sustainable. Mode A: Reactive maintenance (the default, the worst) Maintenance happens when something breaks. A CVE hits the news, a gem stops installing, a customer reports a bug. The team scrambles, fixes it, goes back to features. Symptoms: Nobody knows what Rails version you are on off the top of their head. Last Rails upgrade was “a while ago.” bundle install fails on new engineers’ laptops. Every production incident surprises somebody. Cost profile: flat line for 2-3 years, then one enormous project - often $150K-$300K of emergency upgrade work. See Ruby on Rails maintenance cost for the numbers. Mode B: Big-bang periodic upgrades Every 3-4 years, the team stops feature work for a quarter and does a giant upgrade. Rails 4 to 6. Rails 5 to 7. Everything at once. Symptoms: Predictable pain, roughly every 3 years. Features freeze during the project. One or two senior engineers carry all the risk. The app is “current” for about 18 months after, then starts drifting again. Cost profile: lumpy, expensive, and the roadmap suffers for a full quarter or two each time. Mode C: Continuous, incremental maintenance Maintenance is a small, predictable slice of engineering capacity each month. Gems are upgraded continuously. Rails moves minor-by-minor. Ruby gets bumped when patch releases drop. Upgrades are a PR, not a project. Symptoms: You can answer “what versions are we on?” without checking. Rails and Ruby are within one minor of latest supported. CVEs are handled within days, not months. The team feels safe deploying on Fridays. Cost profile: smooth, predictable, and measurably cheaper over 3+ years than either of the first two modes. This is the only mode that actually scales with the business. What Good Maintenance Looks Like From the Outside Even if you are not an engineer, you can tell whether your Rails app is being maintained well by looking at a few signals. Ask your CTO, lead engineer, or agency these questions: 1. “What versions of Ruby and Rails are we on, and when were they last upgraded?” A healthy answer is specific and recent. “Ruby 3.3.x, Rails 8.0.x, last upgraded in the current quarter.” A concerning answer is vague or older than two years. 2. “How often do we apply security patches?” Healthy: on a set schedule (weekly or monthly) plus emergency patches within days of disclosure. Concerning: “when we notice something.” 3. “What’s our plan for the next Rails version?” Healthy: a rough quarter, a rough scope, and an owner. Concerning: “we’ll look at it next year.” 4. “Can we deploy to production right now?” Healthy: yes, today, with one command, by any engineer on the team. Concerning: “only Person X knows the deploy.” 5. “When’s the last time we upgraded a gem that wasn’t Rails itself?” Healthy: recent and regular. Concerning: “I’d have to check.” These five questions tell you more about your Rails maintenance health than any technical deep-dive. What Maintenance Costs Rough numbers for a typical small-to-medium Rails app (one to five engineers, no regulated industries): Continuous maintenance: 5-10% of an engineer’s time, or roughly $2K-$6K/month depending on who does it. Quarterly minor upgrades: 1-3 days per quarter of focused work. Annual major upgrades: 1-3 weeks per year, planned and scoped. Unplanned CVE response: rare and short, when you are current. Compare that to: Big-bang upgrades from 3+ majors behind: $80K-$300K, 3-6 months. Emergency rescue from production outages: six figures, unpredictable. Lost enterprise deals because your stack fails a security review: possibly the biggest line item. The math isn’t subtle. Continuous maintenance is one of the highest-ROI engineering investments a SaaS business can make. For a longer take on the economics, see stop wasting money on one-off Rails upgrades. Who Should Do the Maintenance You have three real choices, each with tradeoffs. Your existing team Works if: The team has time and isn’t drowning in product work. Someone on the team genuinely enjoys maintenance (rare but valuable). You can protect maintenance time from being constantly deprioritized for features. Does not work if: The team is full-stretch on product. Your Rails expertise is concentrated in one person (bus factor of one). Maintenance time keeps getting cannibalized - which is what usually happens. A specialist consultancy Works if: Your team is focused on shipping the product. You want predictable monthly spend rather than surprise projects. You want an outside expert to review your team’s decisions. This is what a Rails Care Plan is designed to do. Fractional CTO Works if: You are pre-CTO, or your CTO is stretched across product, hiring, and fundraising. You need someone to own the whole technical health picture, not just Rails maintenance. See our Fractional CTO service. The right answer depends on company stage, team shape, and how complex the app is. Red Flags That You Need to Act Now A short list of signals that say “maintenance is not happening, intervene this quarter”: You cannot answer “what Ruby version are we on?” in under 30 seconds. Your last Rails upgrade was more than 18 months ago. Your CI is red “sometimes” and nobody has fixed it. Engineers are afraid to touch parts of the codebase. Deploys require a specific person’s laptop. You have been hit by a CVE and waited more than a week to patch. You’ve lost at least one deal over your security questionnaire answers. One of these is a yellow light. Three of these is a red one. The Founder’s One-Page Maintenance Checklist If you only take one thing from this post, take this: Know what Ruby and Rails versions you are on. Know the date of your last framework upgrade. Make sure someone is explicitly responsible for Rails maintenance - by name. Put a fixed monthly maintenance capacity on the calendar. Plan the next Rails upgrade before you need to. Review the health of the app once a year with an outside expert. Do those six things and you will not be the founder calling for an emergency rescue. Not sure where your Rails app stands? We offer a Rails technical audit that gives you an honest, founder-readable report on your maintenance health. For ongoing care, our Rails Care Plan replaces reactive scrambling with predictable monthly maintenance. For broader technical leadership, explore our Fractional CTO service. Schedule a consultation or email hello@railsfever.com to talk through your Rails app’s health. --- # How to Maintain an Existing Rails App: A Practical Playbook URL: https://railsfever.com/blog/how-to-maintain-an-existing-rails-app/ Date: 2026-03-03 Author: Wale Olaleye Most Rails apps in production are not new. They are 3, 5, 8 years old. They carry scar tissue from the founder who wrote the first version, the agency that built v2, and the four engineers who passed through since. The question for those apps is not “how do we build this?” It is “how do we keep this alive, without losing a week every time we touch it?” This is a playbook for maintaining an existing Rails app. Not greenfield advice. Not “rewrite in Hotwire.” Practical habits that keep a real codebase shippable and upgradable. If you are feeling the pain of an app that has been neglected for years, start with what to do when your Rails app crashes in production first. This post assumes you are not currently on fire. What “Maintenance” Actually Means Maintenance is not “keep the lights on.” Keeping the lights on is operations. Maintenance is the deliberate, ongoing work that keeps the app: Upgradable: you can bump Rails, Ruby, and gems without a two-month project. Auditable: you know what is running, why, and who changed it. Secure: you know your CVE exposure and patch quickly. Observable: you find out about problems from your monitors, not your customers. Changeable: a new engineer can ship a feature this week. If any one of those is broken, you are accumulating technical debt faster than you are paying it down. That debt has compound interest - see the hidden ROI of regular Rails maintenance. The Four Layers of a Rails App You Have to Maintain Most engineers think “Rails maintenance” and picture bumping gem "rails" in the Gemfile. That is one layer of four. Miss any of the others and the app decays. 1. The runtime Ruby version, OS, base Docker image, Node / Yarn if you have JS. 2. The framework Rails itself and its direct dependencies (actionpack, activerecord, etc.). 3. The gems Everything in Gemfile.lock that is not Rails. This is usually where the real technical debt lives. 4. Your own code The models, controllers, jobs, views, and initializers your team has written. Especially the initializers. Oh, the initializers. A good maintenance program touches all four on a predictable rhythm. The Weekly, Monthly, Quarterly Rhythm The single biggest upgrade for most Rails teams is moving from “we maintain reactively” to “we maintain on a schedule.” Here is a default rhythm that works for small teams. Weekly (30-60 minutes) Read dependency alerts (Dependabot, Snyk, or bundler-audit). Triage any new CVEs: patch now, patch this month, ignore with justification. Check Sentry / error monitor for new error signatures. Skim production logs for 500s and slow queries. Monthly (half a day) Bump all patch-level gems. Bump Ruby patch versions if available. Update one or two minor-version gems. Run the full test suite and deploy to staging with the bumps. Quarterly (1-2 days) Bump a Rails minor version if one is available and you are behind. Run bundle outdated --only-explicit and pick 3-5 gems to move forward meaningfully. Spike the next Rails major upgrade, even if you do not ship it. Review initializers and middleware - anything stale or unused? Annually (1-2 weeks) Complete at least one Rails minor or major upgrade. Refresh test coverage around critical flows. Re-evaluate every pinned-with-no-comment gem version. Retire dead code that nobody has touched in 18+ months. That is it. Apps that do this never call me in a panic. Apps that do not, eventually do. Dependency Management: The Core Skill Dependency management is the single most important maintenance skill in Rails. It is also the most neglected. Know what you have bundle outdated --only-explicit bundle exec bundle-audit check --update The first command shows you what is out of date among gems you explicitly declared. The second flags known CVEs. Both should run in CI. Neither should scream at your team - if they do, fix the signal before you fix the bug. Upgrade in small, boring steps The pattern that works: git checkout -b upgrade/redis-5 # bump Gemfile bundle update redis bundle exec rspec # if green, ship. if not, debug this one gem. One gem per branch. One branch per PR. If the test suite fails you know exactly who to blame. This is unglamorous and far faster than “let’s upgrade all the gems” marathons. Kill dead gems Every quarter, look at Gemfile and ask “does anything in the app still use this?” grep -r "GemClass" app lib spec Remove unused gems aggressively. Every gem is a future CVE and a future upgrade friction point. Pin deliberately, comment always # Pinned to 1.12.x because 1.13 drops Ruby 3.0 support. # Unpin when we are on Ruby 3.2+. gem "some_gem", "~> 1.12.0" Pins without comments are booby traps for the next engineer. Test Health Is Maintenance Health You cannot maintain an app you cannot test. Most upgrade pain is test pain wearing a costume. A few baseline requirements for a maintainable Rails app: CI runs the full test suite on every PR. The test suite finishes in under 15 minutes (ideally under 5). The test suite is deterministic. Flaky tests get fixed or deleted, not retried. Critical user flows have end-to-end coverage (system specs or equivalent). New features come with tests. No exceptions. If your tests are red, skipped, or flaky, maintenance becomes guesswork. Fix the tests first. Everything downstream gets easier. Observability: Find Out Before Customers Do A maintainable Rails app has: Error monitoring (Sentry, Honeybadger, Rollbar). You should know about a new exception signature within minutes. Performance monitoring (Skylight, Scout, New Relic, Datadog). You should see slow endpoints, slow queries, and memory growth. Structured logs that are actually searchable. Alerting that routes to a human for critical incidents. This is not optional. The cost of not having this is your next production outage. See what to do when your Rails app crashes in production for the incident side. The Initializer Graveyard Every old Rails app has an config/initializers directory full of files nobody has opened in years. monkey_patches.rb. custom_marshalling.rb. rack_patches.rb. Each one is a silent veto on every future upgrade. On a quarterly cadence, walk through config/initializers one file at a time and ask: Why is this here? Is it still needed? Can it be deleted now that Rails / the gem has upstreamed the fix? If it stays, is there a comment explaining why? Deleting an initializer is one of the highest-leverage maintenance actions in Rails. Each one you remove makes future upgrades measurably easier. Migrations and the Schema A healthy Rails app: Has a schema.rb (or structure.sql) that matches the database. Can rebuild the dev database from scratch in under a minute. Runs migrations reversibly or, for destructive changes, with an explicit rollback plan. Has no “temporary” columns from 2019. Audit the schema once a year. Drop unused columns, indexes, and tables. Big schemas slow down everything - migrations, specs, data backups. Security Maintenance Some baseline habits that catch 80% of real Rails security incidents: bundler-audit in CI, not just locally. Rails, Ruby, and Nokogiri on their latest supported releases. Brakeman in CI for static analysis. Credentials in config/credentials.yml.enc or a secret manager, not ENV files in Git. Force SSL, strict CSP, secure cookie flags in production. If you handle customer data you should also read security best practices for web apps. When Maintenance Cannot Fix It Alone Some apps have decayed past the point where weekly patching will save them. Signs: You are more than two Rails majors behind. Ruby is past EOL. Critical gems have no upgrade path on your version. The test suite is mostly skipped or broken. Deploys require a specific person’s laptop. In those cases, maintenance is not the answer. A Rails rescue or structured upgrade project is. Once you are stable, then you go back to maintenance rhythms. The Team Cost of Not Maintaining The real cost of skipping maintenance is not the eventual upgrade bill. It is the gradual slowdown in everything else. Features take longer because the test suite is scary. Bugs take longer to fix because nobody trusts deploys. New engineers ramp up slower because nothing is documented. Every quarter the app gets a little harder to change. Apps on regular maintenance do not have that slope. They ship faster in year five than apps that “saved time” by skipping it in year two. Need help setting up a sustainable maintenance rhythm for your Rails app? That is exactly what our Rails Care Plan delivers - monthly patching, incremental upgrades, and a team that actually knows your codebase. If you are starting from a bad place, a Rails technical audit gives you an honest baseline first. Schedule a consultation or email hello@railsfever.com to talk through your Rails maintenance plan. --- # Rails 7 LTS: A Developer's Technical Guide to Long-Term Support URL: https://railsfever.com/blog/rails-7-lts-technical-guide-for-developers/ Date: 2026-02-17 Author: Wale Olaleye If you work on a Rails 7 codebase in 2026, you have probably started thinking about the end of its supported life. Rails 8 is out. Rails 8.1 is on the horizon. The core team’s attention is moving. Your app is not. This post is the developer-facing answer to “what does Rails 7 LTS mean, and what do I actually need to do to keep this app patchable?”. If you are looking for the CTO / business framing, I covered that in Rails 7 LTS: A CTO’s Guide. This one is about code, gems, and CVEs. The Rails Maintenance Policy, In Plain English The Rails core team publishes a security and maintenance policy. The short version: Latest minor series: bug fixes, regular security fixes, severe security fixes. Previous minor series: bug fixes, regular security fixes, severe security fixes. Two minors back: severe security fixes only (usually). Older than that: officially unsupported. When Rails 8.0.x is the current line: Rails 7.2.x usually still receives security patches. Rails 7.1.x typically gets severe-only patches. Rails 7.0.x is effectively EOL from the core team’s perspective. Once Rails 8.1 ships, that window slides one more step. So “we’re on Rails 7, we’ll handle it eventually” is a decaying asset. You can always check the current support status in the Rails security announcements on the Rails blog and in the Gemfile / Gemfile.lock of a maintained app. What “Rails 7 LTS” Actually Refers To “Rails 7 LTS” is a phrase that gets used three different ways, and conflating them is the source of most confusion: The community shorthand for “whichever Rails 7 point release still gets security fixes from upstream.” This is free but shrinking. Commercial LTS vendors who maintain patched forks of older Rails versions for paying customers. Think of it like extended support contracts for OS releases. An internal LTS - your team maintains its own patched Rails branch. For most Rails 7 teams in 2026, the practical choices are: ride the official policy while it lasts and then upgrade, or pay a vendor to extend that runway. What LTS Does Not Cover This is the part developers most often get wrong. A Rails 7 LTS arrangement - official or commercial - typically covers: CVEs in the Rails framework gems (actionpack, activerecord, activesupport, etc.). Occasionally, severe bugs that affect production stability. It does not cover: CVEs in your Ruby runtime. Ruby has its own EOL schedule (usually ~3 years of patches per minor release). CVEs in every gem in your Gemfile.lock - Devise, Sidekiq, Puma, Nokogiri, image processors, etc. CVEs in your OS, base Docker image, or JavaScript toolchain. Deprecations and API drift in gems that have already moved on to Rails 8+. If you pay for commercial Rails LTS but leave Ruby 3.0 and Nokogiri 1.13 in place, you still have a security problem. LTS patches one surface of a multi-surface attack area. A Developer’s Rails 7 LTS Checklist If your decision is “we’re staying on Rails 7 for another 6-18 months,” here is what that actually means in the codebase. 1. Pin to the highest patched Rails 7.x Upgrade within the 7 line as aggressively as you upgrade between majors. Move to the latest 7.2.x you can run. Within-minor upgrades are usually cheap and they extend your official support window. # Gemfile gem "rails", "~> 7.2.2" bundle update rails bundle exec rails app:update Read every diff from rails app:update. Don’t blindly accept. 2. Lock Ruby to a supported version Check the current Ruby release branches. As a rule of thumb, if your Ruby minor is more than two years old, it is either already EOL or about to be. ruby -v cat .ruby-version Most Rails 7.2 apps should be on Ruby 3.2 or 3.3 at minimum. 3. Re-baseline your dependency tree Run this honestly and read the output: bundle outdated --only-explicit bundle audit check --update bundler-audit flags gems with known CVEs. If you have never run it, you will find surprises. Prioritize: Authentication (Devise, devise-*, JWT libs) Background jobs (Sidekiq, GoodJob, Delayed Job) Request/response pipeline (Rack, Puma, middleware) File / image / PDF processing (Nokogiri, ImageMagick wrappers) HTTP clients These are the gems most frequently implicated in real security incidents. 4. Decide on a Rails LTS vendor before you need them If you think you might need commercial LTS, evaluate vendors now, not the week an unpatched CVE drops. Questions to ask: Which Rails point releases do they patch? How fast do patches land after an upstream disclosure? Do they backport severe-only, or also regular-severity CVEs? How is it delivered - private gem source, patched branch, forked gem? Is there a path to upgrade off their patched version cleanly? 5. Set up CVE monitoring Do not rely on Twitter or Slack to find out your framework has a new advisory. # In CI bundle exec bundle-audit check --update Plus a service like GitHub Dependabot or Snyk to watch Gemfile.lock. Route the alerts to a channel humans read. 6. Keep the upgrade path warm This is the most skipped step. If you are on Rails 7 LTS, you should still be running a “can we upgrade to Rails 8?” spike every quarter: git checkout -b spike/rails-8-dry-run # bump Gemfile to rails 8 bundle update rails bundle exec rails app:update bundle exec rspec Even if you throw the branch away, you now know which gems blow up, which initializers need rewriting, and how big the real upgrade will be. The team that does this quarterly does a Rails 8 upgrade in 3 weeks. The team that does not is the one that eventually pays for a big-bang emergency. Common Patterns That Make Rails 7 Apps Hard to Patch A few things I see again and again in apps that end up calling for help: Sprockets + jQuery + legacy JS build. Every security patch feels scary because the asset pipeline is brittle. Fix the asset pipeline separately from the framework upgrade. Monkey-patched Rails internals. Somebody patched ActiveRecord::Relation in an initializer five years ago. Now every Rails point release is an adventure. Inventory these patches. Most can be deleted. Pinned gem versions with no comment. gem "redcarpet", "= 3.4.0". Why? Nobody knows. These are the gems that block security updates. Hunt them down, test removing the pin. No staging environment that mirrors prod. If you cannot test a security patch in a real staging environment, you cannot apply security patches confidently. Fix staging before you fix Rails. When to Stop LTSing and Just Upgrade At some point the math flips and LTS is more expensive than just doing the upgrade. A few triggers: Your commercial LTS cost is approaching the cost of one upgrade. You want to use a gem that requires Rails 8+ (this list grows every month). Your team has repeatedly scoped the Rails 8 upgrade and keeps coming back with “2-4 weeks.” You are hitting Ruby EOL and the Ruby upgrade will force most of the work anyway. When any two of those are true, it is time to stop maintaining the bridge and walk across it. Related Reading When to upgrade Rails Stop wasting money on one-off Rails upgrades Ruby on Rails maintenance cost Need help extending Rails 7 safely or planning the move to Rails 8? We run Rails technical audits that map your LTS vs upgrade decision in numbers, Rails Upgrade Express for incremental upgrades, and Rails Care Plans to keep patches flowing every month. Schedule a consultation or email hello@railsfever.com to talk through your Rails 7 situation. --- # Rails 7 LTS: A CTO's Guide to Long-Term Support Options in 2026 URL: https://railsfever.com/blog/rails-7-lts-long-term-support-guide-for-ctos/ Date: 2026-02-10 Author: Wale Olaleye If you are a CTO or founder running a production Rails 7 app, you have probably Googled “rails 7 lts” at least once in the last year. You have customers, revenue, and a backlog. You do not want to stop everything to chase the latest Rails release, but you also cannot let your stack drift into CVE territory. That is what “Rails 7 LTS” conversations are really about. Not the version number. The question behind the question is: how do I keep this app safe and supportable without pulling the team off product work for six months? This post walks through what long-term support actually means in the Rails world, how the official maintenance policy works, what third-party LTS offerings do (and do not) provide, and when it is the right business call to stay on Rails 7 a little longer. What “LTS” Usually Means Everywhere Else In most ecosystems - Ubuntu, Node, Java - LTS is a formal thing. A vendor picks a release, commits to a fixed number of years of security patches and bug fixes, and publishes an end-of-life date. You install it, you sleep at night, you plan your upgrade a year before EOL. Rails does not work exactly the same way. And that is the first thing most teams get wrong when they start searching for “rails 7 lts”. How Rails Actually Handles Long-Term Support The official Rails maintenance policy follows a simple rolling model: Current minor release gets bug fixes, security fixes, and severe security fixes. Previous minor release still gets bug fixes, security fixes, and severe security fixes. Older minor releases get security fixes and severe security fixes only. Once a release is more than two minor versions behind, it generally stops getting even security fixes from the core team. Translation: when Rails 8.0 is current, Rails 7.2 is usually still receiving attention. When Rails 8.1 ships, Rails 7.x starts sliding down the priority list. When Rails 8.2 ships, vanilla Rails 7 is effectively unsupported by the core team. So “Rails 7 LTS” is not a version. It is a strategy you have to assemble. The Three Realistic Options If you are on Rails 7 today, you essentially have three paths: Option 1: Upgrade to Rails 8 on the normal cadence This is the default Rails community answer. Plan a quarter, do the upgrade work, move on. For apps with good test coverage and modest customizations, this is usually the cheapest long-term option - even though it feels expensive today. Option 2: Pay for commercial LTS support There are third-party vendors (the most established is the “Rails LTS” project, which has been around for older Rails major versions) that backport security fixes to older Rails releases for a subscription fee. These are legitimately useful for shops that cannot upgrade right now - regulated industries, frozen contracts, giant legacy codebases. What you get: Backported CVE patches applied to the Rails 7 line A private gem source or patched branch Some level of support SLA What you do not get: New features Compatibility with brand-new gems that only target Rails 8+ A free pass on your own dependency hygiene (Ruby version, gems, OS) Option 3: Run your own internal LTS Some teams self-manage: they fork Rails, cherry-pick security patches from upstream, and maintain their own internal gem. This is cheaper than commercial LTS in dollars and vastly more expensive in engineering time. It only makes sense if you have a dedicated platform team and a very specific reason to avoid both Rails 8 and a vendor. The CTO Decision Framework Here is the short version of how I help clients pick between these options. Four questions: 1. What is your CVE exposure tolerance? Is this app behind a VPN on an internal network with no user data? Or is it public SaaS with credit card numbers? The higher the exposure, the shorter the leash on running un-patched Rails. 2. How hard is your Rails 8 upgrade actually going to be? Most Rails 7.1 and 7.2 apps can be moved to Rails 8 in weeks, not months, if the team is disciplined. Apps stuck on Rails 7.0 with Sprockets, Devise, Sidekiq, and a wall of custom middleware are a different story. Scope this before you decide. A real Rails technical audit beats guessing. 3. What is the opportunity cost of the team doing the upgrade? An upgrade is not just the calendar time. It is whatever product work you are not shipping that quarter. If the team is heads-down on a revenue feature, paying for commercial LTS for six more months might be the cheaper move - even at a few thousand dollars a month. 4. Do you have a real plan to leave LTS? This is the one most people skip. LTS is not a destination. It is a bridge. If you sign up for commercial Rails 7 LTS in 2026 and still have no Rails 8 upgrade plan in 2027, you have just bought yourself a more expensive version of the same problem. Common Mistakes I See Over the last few years I have watched a lot of Rails 7 apps drift. A few patterns come up again and again: “We’ll upgrade next quarter” - said for eight consecutive quarters. Confusing Ruby LTS with Rails LTS - these are separate problems, and Ruby EOL often hits first. Assuming Heroku / AWS handles this - your platform does not patch your Gemfile. Buying commercial LTS and still not upgrading gems - the Rails framework is one of many attack surfaces. Letting the dev team decide alone - this is a business risk decision, not a framework taste decision. A Sensible 12-Month Plan for Rails 7 Apps If I were stepping into a Rails 7 app today as a fractional CTO, here is what the first year would look like: Month 1: Technical audit. Understand what Rails 7 point release you are on, Ruby version, gem health, test coverage, and biggest upgrade blockers. Month 2: Decide: upgrade in the next two quarters, or bridge on LTS. Write the decision down with the dollar cost of both paths. Months 3-4: Incremental cleanup. Patch Ruby, update gems, retire dead code. The Rails 8 upgrade gets easier in direct proportion to how clean the app is. Months 5-8: Either execute the Rails 8 upgrade in stages, or stabilize on a supported Rails 7 line with LTS coverage. Months 9-12: Lock in ongoing maintenance so you never end up in the “it has been four years since we touched Rails” situation again. That last point is the whole game. Apps that get rescued usually got rescued because nobody owned maintenance. See the hidden ROI of regular Rails maintenance for why this compounds. When to Call for Help You should probably bring in outside Rails expertise if: You are not sure what Rails point release you are on, or why. Your last upgrade was more than 18 months ago. Your team has rotated and nobody remembers why a specific gem was pinned. You are weighing commercial LTS but cannot evaluate the vendors yourself. At Rails Fever we do exactly these engagements - scoping the Rails 7 to Rails 8 path, pricing it against staying on LTS, and running the upgrade incrementally so your product roadmap does not freeze. Need help deciding between Rails 7 LTS and a Rails 8 upgrade? We offer Rails technical audits to map your upgrade path, Rails Upgrade Express for a safe incremental migration, and Rails Care Plans so you never fall behind again. Schedule a consultation or email hello@railsfever.com to talk through your Rails 7 options. --- # Custom Software vs No-Code in 2026: What Founders Actually Need to Know URL: https://railsfever.com/blog/custom-software-vs-no-code-founders-2026/ Date: 2026-02-09 Author: Wale Olaleye Updated: 2026-02-09 Every founder hits the same crossroads: do I build it custom or ship it with a no-code tool? In 2026, that question is harder than ever. No-code platforms have gotten remarkably capable, but custom development frameworks like Rails have also gotten faster and leaner. The right answer depends on where you are, where you’re heading, and what you can’t afford to get wrong. Here’s a grounded comparison to help you decide. The No-Code Pitch—and Where It Holds Up No-code platforms like Bubble, Webflow, and Glide have matured significantly. For certain use cases, they’re genuinely the smarter choice: Landing pages and marketing sites — launch in hours, not weeks. Internal tools — dashboards, admin panels, and simple CRMs. Proof-of-concept MVPs — validate an idea before writing a single line of code. Simple CRUD apps — basic forms, submissions, and data views. If your product fits neatly into what these platforms offer out of the box, no-code can save you months of development time and tens of thousands of dollars upfront. Where No-Code Breaks Down The trouble starts when your product outgrows the platform. And for most SaaS products, that happens faster than founders expect. Common no-code limitations in 2026 Performance ceilings — complex queries and high-traffic loads expose platform bottlenecks you can’t optimize around. Vendor lock-in — your entire business logic lives inside someone else’s proprietary system. Migration is painful and expensive. Limited integrations — APIs exist, but deep integrations with payment systems, third-party services, or custom workflows often require workarounds. Security and compliance — SOC 2, HIPAA, and GDPR compliance is difficult to guarantee when you don’t control the infrastructure. Customization walls — the moment you need behavior the platform doesn’t support, you’re stuck. When Custom Software Wins Custom development makes sense when your software is the product. If you’re building a SaaS application that users pay for, that handles sensitive data, or that needs to scale with your business, custom code gives you control that no-code simply can’t. Rails, in particular, remains one of the fastest frameworks for going from zero to a production-grade SaaS application. Convention over configuration means less boilerplate, faster iteration, and a mature ecosystem of gems for authentication, payments, background jobs, and more. A Rails Tech Audit can help you understand exactly where your current setup stands before making a build-or-migrate decision. Side-by-Side Comparison Factor No-Code Custom (Rails) Time to MVP Days to weeks Weeks to months Upfront cost Low Moderate to high Long-term cost Escalates with complexity Predictable and controllable Scalability Limited High Customization Constrained by platform Unlimited Data ownership Platform-dependent Full ownership Migration risk High vendor lock-in Portable codebase Compliance Difficult to guarantee Fully configurable A Decision Checklist for Founders Before you commit to either path, run through this list: Is the product I’m building a core revenue driver or an internal tool? Will I need custom business logic beyond basic CRUD operations? Do I expect more than 1,000 concurrent users within the next 12 months? Does my product handle sensitive user data (health, financial, personal)? Am I comfortable with my entire product depending on a third-party platform’s roadmap? Do I have a plan for migrating off the no-code platform if I outgrow it? If you answered “yes” to three or more of these, custom development is likely the better long-term investment. Common Mistakes Founders Make Starting custom too early. If you haven’t validated demand, building a full Rails application from day one burns cash. Use no-code or a simple prototype to prove the concept first. Staying on no-code too long. This is the more dangerous mistake. Founders sink months into workarounds, duct-tape integrations, and increasingly fragile automations instead of investing in a proper codebase. By the time they migrate, they’ve spent more than custom development would have cost. Skipping the audit. Whether you’re on no-code or custom code, understanding your technical debt before making a strategic decision is critical. A technical audit reveals what’s actually under the hood. Not planning for maintenance. Custom software needs ongoing care. A Rails Care Plan keeps your application secure, updated, and running smoothly without requiring a full-time hire. The Practical Path Forward The best approach for most SaaS founders in 2026 is sequential: validate with no-code, then build custom when the product has traction. The key is knowing when to make the switch—and not waiting until the no-code platform is actively holding you back. If you’re already running a Rails application and suspect it needs modernization, a Rails upgrade can bring your codebase current without a full rewrite. The tools have changed. The fundamentals haven’t. Build what you can maintain, own what matters, and invest in code when your business depends on it. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # MVP Architecture That Won’t Break at 1,000 Users URL: https://railsfever.com/blog/mvp-architecture-that-wont-break/ Date: 2026-01-18 Author: Wale Olaleye Most MVPs are not meant to scale to millions of users. That is fine. But they do need to survive their first real wave of traction. A painful pattern shows up again and again. A founder launches an MVP. Early users arrive. Feedback is good. Then things start to wobble. Pages slow down. Bugs appear in strange places. Simple changes take days instead of hours. The product did not fail because it grew too fast. It failed because it was never built to grow a little. This post is about MVP architecture that survives early growth. Not enterprise scale. Not premature optimization. Just practical choices that let your product reach 1,000 users without breaking or stalling momentum. The Goal of MVP Architecture Good MVP architecture is not about perfection. It is about resilience. You want a system that: Is easy to change Is hard to accidentally break Gives you room to learn Does not panic under light growth Architecture is not something you add later. Early structure determines whether the product bends or snaps. Start With a Simple Monolith Many founders think scalability means microservices, queues everywhere, and complex infrastructure. That is almost always a mistake early on. A well-structured monolith is the best starting point for most MVPs. One codebase. One deploy. One mental model. Why this works: Fewer moving parts Easier debugging Faster onboarding Lower infrastructure cost The mistake is not using a monolith. The mistake is building a messy one. A clean monolith with clear boundaries can support thousands of users comfortably. Separate Concerns Inside the Codebase Even in a single application, structure matters. Your MVP should clearly separate: Business logic Data access User interface External integrations When everything lives in controllers or random files, changes become risky. When logic is organized, growth feels manageable. Founders do not see this directly. They feel it as speed and confidence. Design Your Data Model With Intent Data modeling is one of the most important early decisions. You do not need to predict the future. But you do need to avoid painting yourself into a corner. Healthy early data decisions include: Clear ownership of records Avoiding duplicated data Simple, intentional relationships Consistent naming Bad data models slow everything down. Reporting becomes hard. Features become expensive. Fixing it later is painful. At 1,000 users, poor data design starts to hurt. At 10,000, it becomes a crisis. Use Background Jobs Early (But Sparingly) Anything that does not need to happen instantly should not block a user request. Common examples: Sending emails Processing uploads Generating reports Syncing with third-party services Background jobs keep your app responsive as usage grows. The key is restraint. Do not turn everything into a background process. Use jobs where they clearly improve reliability and user experience. This decision alone often separates “slow MVPs” from calm ones. Treat the Database as a Shared Resource Most early performance problems are database problems. The fixes are usually simple: Add the right indexes Avoid unnecessary queries Paginate large result sets Watch for N+1 queries You do not need advanced scaling at 1,000 users. You need discipline. A healthy database supports growth quietly. A neglected one becomes a bottleneck fast. Build for Observability, Not Guesswork Many MVPs fail because teams cannot see what is happening. At a minimum, you should know: When errors occur Which requests are slow What changed recently How the system behaves under load Basic logging, error tracking, and performance monitoring are not optional. They are survival tools. When something breaks, visibility turns panic into problem-solving. Keep Infrastructure Boring Boring infrastructure is a feature. Managed databases. Standard deployment pipelines. Proven hosting setups. Early-stage products benefit from predictability. Every custom infrastructure decision adds risk and long-term maintenance cost. If your MVP requires a specialist just to keep it running, you are moving too fast in the wrong direction. Avoid Premature Optimization (But Respect Real Limits) There is a difference between planning for growth and guessing at it. Avoid: Caching everything “just in case” Splitting services too early Introducing complex queues without need But do: Write efficient queries Keep endpoints lean Address obvious bottlenecks Optimize when something hurts, not when it is hypothetical. How This Supports Early Growth At 1,000 users, problems show up in subtle ways. Support tickets increase. Deploys feel risky. New features take longer than expected. A well-architected MVP handles this phase smoothly. It gives you: Confidence to ship Faster iteration cycles Fewer emergencies Lower engineering stress This is what founders actually want. Not infinite scale. Just a product that keeps up with success. The Founder Takeaway You do not need enterprise architecture to succeed early. You need thoughtful architecture. Simple structure. Clear boundaries. Respect for data. Visibility into problems. The MVPs that survive early growth are not the most complex ones. They are the ones built with care. Build something you can change. Build something you can trust. Build something that will not break when people finally show up. That is MVP architecture done right. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # How AI-Driven Development Actually Works (Without the Hype) URL: https://railsfever.com/blog/ai-driven-development-without-the-hype/ Date: 2026-01-18 Author: Wale Olaleye AI-driven development is everywhere right now. Every tool claims it will replace engineers, write entire apps, or let founders build companies without technical teams. Most of that is noise. But underneath the hype, something real is happening. AI is changing how software gets built, how fast teams move, and what it costs to ship and maintain a product. For founders building an MVP in 2026, understanding this shift matters. Not so you can write code yourself, but so you can make smarter decisions about speed, cost, and risk. This is a clear, founder-level look at how AI-driven development actually works and what it means for your business. What AI-Driven Development Really Means AI-driven development does not mean AI builds your entire product by itself. It means engineers use AI as a force multiplier throughout the development process. Think of it as a very fast, very patient junior engineer who never gets tired and has read millions of codebases. AI helps with: Writing and refactoring code Generating tests Reviewing changes Exploring edge cases Documenting systems Speeding up debugging The key word is assistive. Good teams stay in control. AI accelerates decisions, but humans still decide what gets built and why. Where AI Fits in the Real Software Lifecycle To understand the impact, it helps to walk through a normal product build and see where AI shows up. Planning and Scoping Before code is written, AI helps teams think more clearly. Engineers use AI to: Break vague ideas into concrete features Explore different architectural options Identify edge cases early Spot risky assumptions in product specs For founders, this reduces one of the biggest MVP risks: building the wrong thing because the requirements were unclear. Business impact: Better scoping means fewer rewrites, tighter MVPs, and faster validation. Writing Code Faster, Not Sloppier This is where most people notice AI first. AI can: Generate boilerplate code Suggest implementations for common patterns Help refactor messy sections safely Translate ideas into working code quickly The best teams do not accept AI output blindly. They treat it like a draft, not a final answer. When used correctly, AI removes busywork so engineers spend more time on hard decisions and product logic. Business impact: Faster development without adding more engineers to payroll. Automated Testing at a New Level Testing is one of the most overlooked parts of MVP development. It is also one of the most expensive things to fix later. AI is changing this. Teams now use AI to: Generate test cases automatically Identify missing coverage Simulate edge cases humans forget Update tests as code changes This does not replace testing strategy, but it lowers the cost of maintaining a healthy test suite. Business impact: Fewer production bugs, safer releases, and more confidence shipping features. Debugging and Incident Response When something breaks, time matters. AI helps engineers: Analyze logs quickly Suggest likely root causes Reproduce issues locally Propose fixes based on similar problems Instead of staring at error messages for hours, teams can narrow down problems in minutes. Business impact: Less downtime, fewer emergency bills, and better customer trust. Code Review and Knowledge Sharing Code review is essential but time-consuming. AI assists by: Flagging risky changes Spotting performance or security issues Enforcing style consistency Summarizing complex pull requests This improves quality while reducing bottlenecks. It also helps onboard new engineers faster. Business impact: Higher-quality code and lower onboarding costs as teams grow. What AI Does Not Replace This matters most for founders. AI does not replace: Product judgment Business strategy User empathy Trade-off decisions Accountability AI does not know your customers or your market. It does not decide whether a feature is worth building. Teams that try to replace thinking with AI end up with fast, brittle systems. The winning pattern is simple. AI accelerates execution. Humans own direction. How AI Changes the Cost Structure of MVPs AI does not make software free. It changes where money is spent. Common shifts include: Smaller teams delivering more output Senior engineers spending less time on grunt work Fewer emergency fixes later Less rework due to better early decisions What does not change is the need for experienced judgment. Business impact: Lower burn, more predictable timelines, and better ROI on senior talent. The Risk of AI Used Poorly AI can hurt you if used carelessly. Common failure modes include: Shipping unreviewed AI-generated code Accumulating invisible technical debt Over-engineering too early Building features faster than you can support For founders, this often looks like early speed followed by sudden slowdown. Speed without discipline always creates debt. AI just lets you move faster into that trap. What Founders Should Ask Their Engineering Team You do not need to understand the tools. You need to understand the process. Good questions include: Where are we using AI today? How do we review AI-generated code? How does this improve reliability, not just speed? What guardrails are in place? If the answers sound thoughtful and boring, that is a good sign. AI-Driven Development and Long-Term Product Health The biggest benefit of AI is not speed. It is sustainability. Used correctly, AI helps teams: Keep codebases cleaner Maintain tests over time Document systems automatically Reduce burnout Early-stage products fail when teams can no longer move confidently. AI gives teams more runway, not just more output. The Bottom Line for Founders in 2026 AI-driven development is not magic. It is leverage. It rewards teams with strong fundamentals and punishes teams looking for shortcuts. It lowers the cost of quality work but does not eliminate the need for judgment. For founders building MVPs in 2026, the goal is not to chase AI tools. The goal is to work with teams who know how to use them responsibly. Build fast. Build safely. Use AI to amplify good decisions, not hide bad ones. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # The Hidden Costs That Kill Early-Stage Products URL: https://railsfever.com/blog/hidden-costs-that-kill-early-stage-products/ Date: 2025-12-16 Author: Wale Olaleye Most early-stage products do not fail because the idea was bad. They fail quietly. Slowly. In places founders are not watching. As a founder, you track burn rate, user growth, and churn. You worry about marketing and sales. But there are hidden technical costs inside almost every MVP that quietly drain time, money, and trust until the product collapses under its own weight. These costs do not show up on a spreadsheet. They show up as missed deadlines, growing frustration, and lost momentum. Fragile Foundations Many MVPs are built fast, which is good. But fast often turns into careless. Hard-coded values, no structure, no clear boundaries between features. Everything works until it doesn’t. No Tests, No Safety Net Skipping tests feels efficient early on. Nothing breaks yet, so it feels fine. Until the first real customer asks for a change. Infrastructure That Does Not Match Reality Early products often run on setups meant for demos, not real users. No monitoring. No alerts. No clear way to see what is failing and why. Security Debt You Cannot See Security problems rarely announce themselves early. An outdated dependency. Weak authentication rules. No rate limiting. Developer Turnover Costs When early code is messy and stressful to work on, good developers leave. Replacing them is expensive. Momentum disappears. Founder Time Drain When the product is unstable, founders get pulled into technical issues they should not be handling. Your time is the most expensive resource you have. Delayed Learning When deployments are painful and changes are risky, you stop experimenting. Learning slows. Opportunities disappear. Final Thoughts You do not need perfect systems on day one. You need resilient ones. Strong foundations buy you time. And time is what turns early-stage products into real businesses. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Why 2026 MVPs Must Be Built with Speed and Safety URL: https://railsfever.com/blog/why-2026-mvps-must-be-built-with-speed-and-safety/ Date: 2025-12-15 Author: Wale Olaleye Why 2026 MVPs Must Be Built with Speed and Safety If you plan to build an MVP in 2026, you are walking into one of the most competitive and fast moving markets we have ever seen. New ideas spread faster. Customers expect polished experiences even in early versions. And AI tools are changing what small teams can accomplish in a matter of weeks rather than months. But here is the truth many founders ignore. Speed without safety becomes waste. You can rush an MVP out the door, but if it breaks, loses data, or fails to earn trust, you will spend more time cleaning up than moving forward. The companies that win in 2026 will be the ones that build fast and stay safe at the same time. Think of it as disciplined speed. Not cowboy coding. Not slow enterprise processes. Something in the middle that lets you move quickly without putting your business at risk. Let’s break down why this matters and how modern development practices make it possible. Speed is not optional anymore Five years ago, you could take three to six months to build an MVP and still get the attention of early adopters. Today, the window is much smaller. Customer expectations have changed. They want you to solve their problems now, not after a long wait. Three forces are pushing founders to move faster. 1. AI is leveling the playing field With AI-assisted coding, small teams can ship features at the same pace as much larger teams. If you drag your feet, someone else with a three person squad can beat you to market with a strong, stable product. 2. Attention is scarce The moment you announce your idea publicly, you are entering a race. People will judge the seriousness of your idea by how quickly you show progress. Long delays break trust and make it harder to convert early believers into paying customers. 3. Early users expect quality even in an MVP The old definition of an MVP was the smallest thing that works. In 2026, the bar is higher. Users expect clean design, quick response times, data safety, mobile friendly flow, and an onboarding process that makes sense. Shipping something fragile or sloppy does more harm than good. Speed is essential. But speed alone is dangerous. Unsafe speed kills momentum Founders sometimes think they need to choose between speed and good engineering practices. So they choose speed and hope things hold together long enough to catch up later. But most never do. Here is what unsafe speed looks like: No automated tests No clear deployment process No monitoring or error tracking MVP built directly in production One developer holding the entire system in their head A growing list of hacks that become landmines later On a good day, this feels like progress. On a bad day, this becomes downtime, broken features, lost signups, angry users, and founders who burn out before the product has a chance. The danger is not that the app breaks once. The danger is that the team slows down because they no longer trust the codebase. Every change becomes scary. Every deploy feels risky. Instead of moving faster, you grind to a crawl. This is why safety matters as much as speed. Safe execution does not mean slow execution The smartest founders understand that safety is not about adding bureaucracy or slowing innovation. It is about protecting momentum. When you build with safety in mind, you remove the friction that slows teams down. Think of safety as rails on a high-speed train. Without rails, a train cannot go fast. With rails, it can move safely at full speed. Here are the modern practices that give founders both speed and safety in 2026. 1. AI-driven development and co-building AI coding tools reduce boilerplate, flag bugs early, generate tests, and give even small teams huge leverage. The key is to use AI as a co-builder, not a crutch. You still need structure and clean architecture. But AI lets you move fast on tedious parts while you focus on product logic and user experience. When used well, AI helps you build safely by spotting issues you might miss and guiding you through patterns that reduce risk. 2. Automated testing that runs on every change Testing used to be seen as a luxury for early stage teams. That is no longer the case. With AI-generated test scaffolding and low cost CI pipelines, you can get a solid safety net without slowing development. Tests protect you from breaking what already works. They make refactoring easier. They boost founder confidence. Most importantly, they allow fast iteration without fear. Teams that skip testing in the beginning almost always regret it later when they rewrite major parts of the app. 3. A safe and repeatable deployment pipeline Deploying code should not feel like a gamble. A modern MVP setup includes: A staging environment Automated deployments Rollbacks that work Health checks Logging and metrics This means you can ship updates multiple times per day without worrying about breaking your application for all users. Safe deployments reduce founder stress and increase development velocity. 4. Monitoring and alerting from day one You cannot fix what you cannot see. Monitoring tools give you visibility into performance, errors, and real time issues. Early stage founders often underestimate how much confidence this provides. When you get an alert before a customer complains, you look trustworthy and reliable. Even a simple setup with uptime monitoring, error tracking, and basic performance metrics makes a huge difference. 5. Clean boundaries in your codebase Modern MVPs are often built quickly, so it is easy for the codebase to turn messy. Clean boundaries help teams move faster without breaking things. Examples include: Separation between business logic and UI Consistent patterns for background jobs Stable API layers A predictable folder structure These things are not exciting, but they save hours later when you are iterating fast to respond to user feedback. 6. A security mindset from the start Users trust you with their data. In 2026, trust is currency. You cannot afford to treat security as an afterthought. You need: Strong access controls Secure data storage Regular dependency updates Basic threat monitoring Clear logging A breach in your first year can set your company back permanently. Security does not need to be complicated, but it cannot be ignored. 7. A roadmap that focuses on learning, not features The fastest teams are not the ones that build the most. They are the ones that learn the most. In 2026, the best MVPs are learning machines. They ship small, gather feedback, adjust quickly, and build safety into every step. This helps you avoid overbuilding. It keeps you from wasting time on features no one wants. And it ensures the product evolves with real data instead of guesses. Where founders often get stuck Founders do not fail because they lack ideas. They fail because they fall into one of these traps: Building too slowly while trying to perfect everything Building too fast and cutting corners that hurt later Relying on one developer with no guardrails Skipping basic safety practices Rewriting the product after user growth stalls The answer is not to move slower. The answer is to build with a system that balances both speed and safety. The new baseline for 2026 MVPs Founders will be judged not only on what they build but how they build it. Investors will ask about your process, not just your idea. Customers will expect reliability. Competitors will move faster than ever. The new baseline looks like this: AI-assisted development for speed Testing and CI for safety Monitoring and alerts from day one Safe deployments Clear code boundaries Security-first thinking Fast feedback loops Build your MVP this way and you get the best of both worlds. You move fast. You reduce risk. You earn trust. You can scale without rewriting your entire system. Final thought You are not only racing to launch something. You are racing to learn what works. Safe speed is how you get there. It is how you build a product that grows with you, earns trust, and keeps you ahead. Founders who adopt this mindset in 2026 will win more deals, build better products, and move with confidence in a market that rewards both velocity and reliability. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # From Chaos to Calm: How Rails Fever Keeps SaaS Apps Stable URL: https://railsfever.com/blog/chaos-to-calm-how-rails-fever-keeps-saas-apps-stable/ Date: 2025-11-13 Author: Wale Olaleye Most founders do not realize how fragile stability is until they lose it. It starts small: a few slow requests, a deploy that fails for no clear reason, an engineer spending weekends restarting servers. Then one morning, customers cannot log in. The team scrambles. Slack is on fire. Nobody knows what changed. That is the chaos moment. And that is exactly where many SaaS companies find Rails Fever. The Chaos Before the Calm A founder I will call Sarah runs a profitable EdTech platform built on Ruby on Rails. Her small team had grown the app for five years, but the infrastructure did not keep up. No one was watching logs. The Postgres instance was never vacuumed. Sidekiq queues would quietly grow overnight. Every few months, the app would stall for reasons no one could explain. Developers dropped everything to fix it, but those emergency patches only added risk. It was draining her team’s morale and her sleep. When Sarah reached out, she said something I hear often: “We do not need new features. We just need this thing to stop breaking.” That is where we step in, not as a dev shop, but as a Rails maintenance partner. Step 1: See What Others Miss Our first move is always visibility. You cannot stabilize what you cannot see. We set up monitoring on three levels: Infrastructure: CPU, memory, and database load App health: request latency, background jobs, and slow queries User experience: uptime, error rates, and page speed We use tools like Skylight, Datadog, and Sentry to get real time data, then pipe alerts to Slack and send simple weekly health summaries. Within two weeks on Sarah’s app, we could see the real cause of her issues: a small background worker that reprocessed data every few hours and slowly locked key tables until the app choked. That insight did not come from guesswork. It came from quiet, steady observation. We fixed the worker. The random outages stopped. The team slept better that week. Step 2: Clean the Foundation Once the fires are out, the real work begins. We go through the app like a careful mechanic, checking every bolt: Update outdated gems one by one with full test runs in staging Upgrade Rails to the latest stable release for security and support Verify SSL certificates, cron jobs, Redis versions, and backups Tune Sidekiq queues and worker concurrency to balance cost and speed Review slow queries and add safe indexes where it helps This is not glamorous work. It is the work that turns fragile systems into dependable ones. Think of it as preventive medicine for your SaaS. No more last minute heroics. Just consistent care. Step 3: Stand Guard, Quietly Once the system is stable, we keep watch. Our Rails Care Plan runs monthly. We apply patch level updates, scan dependencies for CVEs, rotate keys and tokens, and review alerts. Monitoring runs 24 by 7. If an incident happens, our Rails Rescue Hotline gives clients a direct line to immediate help. No ticket queue. No “we will get back to you Monday.” We have handled production outages on Friday nights that could have ruined a client’s launch. But the best days are the quiet ones, when nothing breaks because the right systems are already in place. The Calm That Follows Three months after onboarding, Sarah sent us a note: “I do not think about the app anymore. That is a good thing.” That is the calm we aim for. It is not just uptime. It is mental space for founders to focus on customers and growth, not error logs. When you stop firefighting, you start thinking clearly again. Your team stops dreading deploys. Your customers stop noticing small hiccups. Your business gets its rhythm back. Our Philosophy: Stability Is a Strategy Most SaaS teams treat stability like a technical problem. We see it as a business advantage. Every hour spent debugging an outage is an hour not spent building or selling. Every unstable release chips away at customer trust. Every emergency slows down your roadmap. Rails Fever exists to close that gap, the space between “we have an app” and “we have peace of mind.” We do not just patch code. We build systems that stay calm under pressure. From Founders to Partners When a founder joins Rails Fever, they are not just buying maintenance. They are gaining a technical partner who takes ownership of uptime, upgrades, and long term health. Here is what that looks like in practice: Regular check ins: we review your app’s status and discuss upcoming risks Automated alerts: we catch anomalies before users do Predictable upgrades: Rails and Ruby upgrades happen on schedule, not in crisis Instant help: when something breaks, you know exactly who to call That is how we keep apps stable and founders sane. Ready to Move From Chaos to Calm If your Rails app feels like it is one deploy away from disaster, you do not need to rebuild. You need a steady hand, a maintenance partner who understands SaaS stability from the inside out. Start with a Rails Care Plan or use our Rails Rescue Hotline if you are in the middle of an outage. That is what we do at Rails Fever. We keep your SaaS app stable, so you can keep your business growing. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Why SaaS Founders Need a Fractional CTO URL: https://railsfever.com/blog/why-saas-founders-need-a-fractional-cto/ Date: 2025-11-12 Author: Wale Olaleye When most SaaS founders hear “CTO,” they imagine a full-time executive managing a team of developers, planning architecture, and leading technology strategy. That image fits once a company is past $5–10 million ARR. But before then, having a fractional CTO—a part-time, on-demand technical leader—often determines whether your product grows cleanly or collapses under the weight of its own code. This is the role founders need before they think they do. The Early-Stage Blind Spot Let’s picture two founders. Case 1: Jamie, a non-technical founder who hires a freelance developer to build an MVP. The app launches fast, gets traction, but a year later support tickets pile up, customers complain about slow performance, and every small feature request feels like surgery. Jamie keeps paying devs to “patch things,” but each fix seems to break something else. The app works, but it’s fragile. Case 2: Alex, who took a different route. They hired a fractional CTO six months in—not to code full-time, but to design the foundation right. The fractional CTO set coding standards, picked a clean deployment pipeline, and helped choose scalable infrastructure. When traction came, the app grew smoothly. The CTO stayed involved part-time, guiding major decisions and hiring the next dev. Both founders spent the same money. Only one built a system that could last. What a Fractional CTO Actually Does A fractional CTO acts as your technical co-founder without the equity dilution. Their mission is to protect your product from early mistakes that can sink future growth. They’re part strategist, part architect, and part translator—bridging the gap between business goals and technology decisions. Here’s what that looks like in practice: Architecting for Growth They ensure your Rails app (or any stack) is structured for maintainability—modular, testable, and ready to scale. Prioritizing Features That Matter They align development with your business metrics—helping you say “no” to features that don’t move revenue or retention. Building an Early Technical Roadmap They create a six-to-twelve-month technology plan tied to your product milestones. Managing Dev Teams and Vendors They evaluate contractors, review code quality, and ensure consistent practices—reducing chaos. Security, Reliability, and Compliance Even small apps handle sensitive data. Your CTO can put monitoring, backups, and security policies in place before a breach happens. The Cost of Not Having One Technical debt isn’t just a developer’s problem—it’s a business problem. Every piece of bad code adds friction. Every unplanned architecture decision adds hidden cost. Every shortcut in infrastructure adds risk. Real-world consequences: Slower releases: new features take 3x longer as code complexity rises. Lost deals: a potential customer leaves because your API was down again. Developer turnover: new hires struggle with unclear structure. Investor hesitation: messy codebases raise red flags during diligence. A fractional CTO prevents these problems before they form. They don’t just write code; they protect your velocity. Real Scenarios from the Field 1. The App That Outgrew Its Developer A startup built their product on Rails with one full-stack dev. It worked until the customer base grew. Suddenly, memory leaks caused outages, and deployments failed randomly. Rails Fever came in as a fractional CTO. The first step was observability—metrics, logging, and alerts. Within a week, we found the culprit: unbounded background jobs and missing indexes. Uptime jumped to 99.9%, and the founder could finally sleep. 2. The Founding Team with No Technical Oversight Two marketing founders outsourced their build to an offshore team. It looked fine in staging, but after launch, bugs multiplied and the team kept billing for fixes. A fractional CTO stepped in to audit the codebase and contracts. They found no version control, no automated tests, and reused public code under bad licenses. Within a month, the CTO set up CI/CD, added testing, and rebuilt trust with the vendor team. 3. The Fast-Growing SaaS Hitting a Scaling Wall An EdTech company tripled in users after a viral post. Their database couldn’t handle it. Instead of upgrading to expensive servers, their fractional CTO optimized queries and caching. Monthly costs dropped 40%, and speed improved by 5x. Fractional CTO vs. Full-Time CTO You don’t need a full-time CTO until your team is large enough to justify one—usually post-Series A or when you’re managing multiple developers. Before that, a fractional CTO fills the gap for a fraction of the cost. Role Time Commitment Typical Stage Monthly Cost Freelance Developer Full-time coding MVP to seed $5K–$10K Fractional CTO 4–20 hrs/month Pre-seed to early growth $3K–$10K Full-Time CTO 40+ hrs/week Post-Series A $200K+ + equity The key isn’t time—it’s leverage. A fractional CTO gives founders senior-level direction without hiring overhead. Signs You Need One Now You might not think you need a CTO yet, but if any of these feel familiar, it’s time: You’re non-technical and rely entirely on contractors. You’ve rebuilt the same feature twice. You don’t know if your app can handle a traffic spike. You’re losing trust in your dev team’s estimates. You have rising tech costs but no visibility into why. If you’re nodding at two or more of these, you’re already late. How a Fractional CTO Aligns Product and Business A common mistake is treating tech decisions as separate from business strategy. A fractional CTO brings those together. Example: If your SaaS targets small businesses, your CTO might suggest prioritizing stability over deep customization. That single call affects hosting, releases, and roadmap. Or if your goal is to raise a seed round, your CTO can prep your app for due diligence—clean code, test coverage, and documentation. They don’t just manage technology; they align it with go-to-market, fundraising, and scale. Why Rails Founders Benefit Most Rails founders especially benefit from fractional CTO oversight. Rails is powerful but flexible—meaning it can become a mess fast. A fractional CTO enforces conventions, adds automated testing, and implements CI/CD pipelines that match your app’s pace. They help with: Safe Rails upgrades Choosing the right hosting (Heroku, Render, AWS) Job monitoring (Sidekiq, GoodJob) Managing secrets, SSL, and WAF protection These aren’t daily tasks for founders—but they determine reliability. When to Bring One In There’s a sweet spot—after your MVP proves demand, but before you start scaling fast. Bringing a fractional CTO in at that moment avoids costly refactors later. In practice: Pre-seed: Define roadmap and review MVP plan. Seed: Stabilize infrastructure and prep for first hires. Series A: Help recruit or train your full-time CTO successor. Think of them as a bridge between product-market fit and technical maturity. What to Expect When You Hire One At Rails Fever, we begin with a technical audit—a deep look at your code, infrastructure, and deployments. You get a clear roadmap: what’s working, what’s risky, and what needs attention. Then we meet monthly to review progress, unblock developers, and align with your business goals. The result isn’t just fewer fires—it’s long-term confidence in your tech. Final Thoughts A fractional CTO is like preventive healthcare for your product. You can ignore it while things seem fine—but when something breaks, the cost multiplies. The founders who win are the ones who seek help before they think they need it. Ready to add a fractional CTO to your SaaS? Rails Fever’s Fractional CTO Service gives you senior-level strategy and technical oversight—without a full-time hire. Let’s make sure your Rails app scales cleanly and your roadmap matches your goals. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # 5 Signs Your Rails App Needs Immediate Help URL: https://railsfever.com/blog/rails-app-needs-immediate-help/ Date: 2025-11-12 Author: Wale Olaleye If your Rails app runs a business, it deserves more than “hope it doesn’t crash today” maintenance. Founders often ignore small issues until they become major fires that stop sales or frustrate users. Here are five warning signs your Rails app needs help—right now. 1. Deploys Are Getting Slower (and Riskier) If your team holds their breath every time you push code, something’s wrong. Slow deploys often mean your app has grown messy—too many migrations, assets compiling on the fly, or large dependencies bloating the build. When deploys take more than a few minutes or routinely break staging, it’s a signal that your CI/CD setup or app architecture needs review. A healthy Rails app should deploy confidently in under ten minutes with rollback protection. If it doesn’t, that’s a rescue situation waiting to happen. 2. Your Gems Are Fighting Each Other When “bundle update” feels like pulling a grenade pin, your dependency tree has become a liability. Gem conflicts are common in older Rails apps because libraries evolve while your app stays still. Over time, these version mismatches lead to fragile environments and hard-to-reproduce bugs. If you’ve postponed updates for more than a year or find yourself locked into a specific Ruby version just to keep the app running, you’re overdue for a maintenance pass. Ignoring it only makes future upgrades more painful. 3. Downtime or “Weird” Outages Keep Happening You shouldn’t be waking up to Slack alerts about “server not responding.” Frequent downtime or random 500 errors usually trace back to one of three root causes: infrastructure misconfiguration, memory leaks, or missing background job monitoring. Founders often mistake this for “a hosting issue.” In reality, it’s a sign that no one’s watching the full picture—logs, Sidekiq queues, and performance metrics together. Every minute of downtime costs trust and sales. Rails Fever’s rescue clients often see stability double after we re-establish proper observability and alerting. 4. Performance Has Quietly Slowed to a Crawl If pages that used to load in under a second now take three or more, you’re bleeding user patience. Common causes include unoptimized queries, forgotten indexes, and background jobs stuck in retries. You can test this easily: run rails stats or check New Relic/Skylight transaction traces. If you see controller actions taking hundreds of milliseconds instead of tens, it’s time for a health check. Don’t wait until users start complaining—slow apps often precede total failure. 5. Your Developer Turnover Has Become a Risk This one’s often overlooked. When a new developer says, “I need a week just to get it running locally,” your app has accumulated invisible tech debt. Manual deploys, outdated gems, and unclear documentation don’t just slow progress—they increase the risk of mistakes in production. If you’ve lost key developers and no one fully understands the setup anymore, your app isn’t just vulnerable—it’s one deployment away from downtime. Bringing in outside help to stabilize, document, and modernize your environment can save weeks of future pain. What to Do Next If one or more of these signs sound familiar, your Rails app is quietly asking for help. A professional rescue or audit can identify the root causes, clean up your dependencies, and make deployments boring again—which is exactly what you want. At Rails Fever, we specialize in stabilizing and modernizing Rails apps that have fallen behind. Whether you need a one-time Rails Rescue Kit or an ongoing Rails Care Plan, we’ll get your system back to a place where you can ship confidently again. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # How to Detect and Stop Bot Traffic in Rails Apps URL: https://railsfever.com/blog/detect-and-stop-bot-traffic-in-rails-apps/ Date: 2025-11-11 Author: Wale Olaleye Every founder loves seeing spikes in traffic—until it’s fake. Bot traffic can quietly wreck a Rails app’s performance and your bottom line. Whether it’s fake signups flooding your database, card testing bots hammering your checkout, or credential-stuffing attacks draining your support team, bots are a real business risk. Let’s look at how they cause harm, how to spot them early, and what tools you can use to stop them. The Business Risks Behind Bot Traffic Most founders underestimate bots until the symptoms show up in their operations. A few examples: Fraudulent signups: Attackers automate thousands of account creations to test stolen credit cards or spam your platform. This clogs your database and triggers false growth metrics. Chargebacks and refunds: When stolen cards are used, you’re the one paying refund fees and explaining “unusual activity” to your payment processor. Support overhead: Each fake transaction or signup becomes a ticket for your team to review or clean up. Skewed analytics: Marketing teams make bad decisions because they’re tracking fake traffic and events. Security exposure: Bots can probe for vulnerabilities, scrape data, or brute-force logins. A single wave of automated traffic can burn hours of engineering time and cost thousands in wasted infrastructure and chargeback fees. Step 1: Know What Normal Looks Like Before you can detect bots, you need to understand your app’s baseline. Track metrics like: Average requests per user/session Signups per hour/day Conversion rates by country or IP range Failed logins or password reset attempts Rails makes this easy with structured logging and tools like Datadog, Skylight, or Logtail. If you notice sudden spikes from certain IP ranges, impossible click rates, or odd user-agent strings, that’s a red flag. Step 2: Add Basic Detection Layers Once you have visibility, add lightweight checks that separate human behavior from automation. 1. Rate limiting Use Rack::Attack to limit requests by IP, endpoint, or user ID. Rack::Attack.throttle('req/ip', limit: 100, period: 5.minutes) do |req| req.ip end This stops rapid-fire requests and slows brute-force attacks. 2. Behavioral checks Measure time between form renders and submissions. Real users take a few seconds; bots submit instantly. 3. Hidden form fields or honeypots Add invisible inputs that only bots fill out. If a value appears, reject the submission silently. 4. User-agent filtering Many bots use outdated or generic user-agent strings. Log them and block repeat offenders. Step 3: Leverage Edge Protection Tools Application-level filters are good, but your best defense happens before traffic even hits Rails. Use a Web Application Firewall (WAF) Cloudflare WAF or AWS WAF can detect and block bot traffic using rule sets that analyze IP reputation, request patterns, and header signatures. A few key rule types to enable: Known bot IP lists (Cloudflare Managed Rules) Rate-based blocking for signup and checkout routes Geofencing (block or challenge requests from regions irrelevant to your market) WAFs also help you visualize the scale of bot activity so you can fine-tune thresholds instead of guessing. Turn on Bot Fight Mode (Cloudflare) For small Rails apps, Cloudflare’s “Bot Fight Mode” adds lightweight JavaScript challenges to weed out headless browsers. Use CAPTCHA selectively Avoid adding CAPTCHAs to every form; reserve them for suspicious users or new devices. Tools like Cloudflare Turnstile or hCaptcha are privacy-friendly and easier to integrate than old-school reCAPTCHA. Step 4: Secure Payment and Authentication Flows Bot attacks often hit your checkout or login forms. Add these hardening steps: Use verified payment providers like Stripe with built-in card testing detection. Require email verification before enabling transactions. Log and alert on failed login patterns (use a background job to avoid performance hits). Rotate API keys regularly to prevent abused endpoints from being exploited. Step 5: Monitor, Report, and Iterate Bot traffic evolves. What worked last month may fail next quarter. Schedule a monthly security review that covers: IP and country breakdown of traffic Unusual referral sources Signups per region and user-agent trends Cloudflare or WAF dashboard anomalies Automate alerts for threshold breaches using tools like UptimeRobot or AWS CloudWatch. Real-World Example One of our Rails Fever clients saw a 30% drop in conversion rates after what looked like a sudden traffic surge. In reality, bots were running checkout scripts to validate stolen cards. After enabling Cloudflare WAF, tuning rate limits in Rack::Attack, and adding a simple honeypot on the signup form, we blocked 98% of malicious requests within a week—and real user conversions returned to normal. Final Thoughts Bot traffic is not just a security issue—it’s a business risk that drains time, money, and trust. The best approach combines visibility, layered defenses, and steady iteration. Start small with rate limiting and honeypots, then move upstream with WAF rules and smart monitoring. If your Rails app is seeing strange spikes or fraudulent behavior, don’t ignore it. It’s cheaper to fix now than after your next chargeback report. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Rails Upgrade Express: How We Upgrade Legacy Apps Safely URL: https://railsfever.com/blog/rails-upgrade-express-safe-legacy-rails-migration/ Date: 2025-11-10 Author: Wale Olaleye Upgrading a Rails app that’s been running for years can feel like open-heart surgery. You know it needs to be done, but one wrong move could bring down production, break critical features, or cause customer downtime. At Rails Fever, we’ve seen it all — apps stuck on Rails 4.2, dependencies frozen in time, or CI pipelines that haven’t run in years. Over the years, we’ve built a repeatable system for upgrading safely without guesswork. This is our Rails Upgrade Express, the same framework we use for every client upgrade. Step 1: Start With an Audit Every upgrade starts with discovery. Before touching a single file, we run a Rails Tech Audit — a deep scan of the app, gems, dependencies, and hosting setup. We look for: Which Rails version the app is currently running What gems are outdated or abandoned Compatibility issues between Rails versions Test coverage and CI setup Deployment and rollback mechanisms The audit gives us a complete map of risks and dependencies. For example, one client’s app had a background job system still running on delayed_job from 2015. Another had a gem using deprecated ActiveRecord callbacks. Without spotting these early, an upgrade would have failed halfway. Once we understand the landscape, we build a migration plan that clearly outlines: The target Rails version (usually Rails 7) The upgrade path (e.g., 5.2 → 6.1 → 7.0) The estimated timeline and testing requirements This plan becomes our blueprint. Step 2: Build Confidence With Tests An upgrade is only as safe as your ability to verify it works. That’s why the next step is improving or rebuilding the test suite. If an app already has tests, we run them under the current Rails version and note what’s failing. For apps with poor coverage, we add critical path tests — covering sign-ups, logins, payments, and key business flows. These tests become our safety net. They catch regressions before they ever hit production. For one SaaS client, we wrote 30 new system tests using RSpec and Capybara before touching the Rails version. That gave us instant feedback on whether the upgrade broke anything. No matter the app’s age, automated tests are non-negotiable. Without them, you’re flying blind. Step 3: Upgrade in Controlled Stages Once the test suite is solid, we perform the upgrade in stages, not all at once. We upgrade Rails and Ruby versions incrementally to avoid big-bang surprises. Each minor version bump gets its own commit, with the tests run in CI after each step. Here’s a simplified breakdown of how a multi-version upgrade might look: Upgrade Ruby to a supported version Update Rails from 5.2 → 6.0 → 6.1 → 7.0 Replace deprecated gems and APIs Run database migrations carefully Rebuild assets (Webpacker → Importmap or jsbundling) Test everything under the new environment We call this the “no skipped stops” rule. Even if it’s tempting to jump straight from Rails 5 to Rails 7, we don’t. Each version introduces changes that need to be addressed in order. This incremental approach reduces risk and makes it easier to identify the exact change that breaks something. Step 4: Stage Before You Ship Before rolling out to production, we deploy the upgraded app to a staging environment that mirrors production as closely as possible — same database type, same background job workers, same caching layer. In staging, we invite the client’s team to test core user flows. We monitor logs, background jobs, and metrics. We also run performance comparisons between old and new versions. This step helps catch subtle issues like time zone bugs or encoding mismatches that automated tests might miss. Only when staging runs clean for several days do we prepare for the production rollout. Step 5: Rollout With a Rollback Plan A safe upgrade isn’t just about what goes right — it’s about preparing for what could go wrong. For every deployment, we have a rollback strategy ready. That means: Database backups taken right before the release The old Docker image or Heroku slug preserved Feature flags available to disable new behavior Monitoring tools ready to alert on anomalies When the switch happens, we deploy during low-traffic hours and monitor logs and uptime dashboards closely for the first 24 hours. In one case, a client’s upgrade exposed a subtle bug in their mailer preview. Within minutes, we rolled back, fixed the dependency, and redeployed — zero downtime for users. That’s what we mean by “safe.” Step 6: Communicate Every Step Upgrades can be stressful, especially for non-technical founders. That’s why communication is part of our process. We send regular progress updates — what’s been done, what’s next, and any blockers. During staging and rollout, we maintain real-time Slack or email communication so the client knows exactly what’s happening. This transparency builds trust and keeps surprises to a minimum. The Result: Modern, Stable, and Future-Ready When the dust settles, the app runs faster, safer, and on a supported version of Rails. Developers can add features confidently again. Founders can stop worrying about security patches. For example, one client’s app went from Rails 5.0 to 7.1 in three weeks. Their deploy time dropped by 40%, and their CI pipeline ran twice as fast after cleanup. A safe upgrade isn’t just about the framework. It’s about restoring confidence in your software. Final Thoughts Legacy Rails apps aren’t a liability — they’re assets that need care. With a structured process, upgrades don’t have to be painful or risky. At Rails Fever, our goal is simple: make sure your app keeps running while getting better with every release. If you’re sitting on an old Rails app that’s starting to show its age, now’s the time to plan your next upgrade. We can help you do it safely. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # The Real Cost of Neglecting Your Rails App URL: https://railsfever.com/blog/the-real-cost/ Date: 2025-11-02 Author: Wale Olaleye Most Rails founders don’t wake up one morning to a broken app. It happens slowly: a few skipped updates, a gem that’s too old to upgrade, a patch that “can wait until next week.” Then one day, everything breaks. In this post, we’ll break down the real cost of neglecting your Rails app — not just in code, but in dollars, downtime, and team morale. We’ll also share a story from a SaaS founder who learned this lesson the hard way, and give you practical next steps to stay ahead of trouble. 1) The illusion of “saving time and money” When your app works “just fine,” it’s tempting to avoid touching it. After all, why spend time and money fixing something that isn’t broken? But neglect isn’t neutral. Every month you delay maintenance, the hidden costs pile up. They just don’t show up on your invoice — yet. Let’s look at where these costs hide. 2) Downtime: every minute has a price tag Downtime is the most visible symptom of neglect. When your app goes offline, users can’t sign in, process payments, or access their data. Here’s what that can cost: Type of App Estimated Cost of Downtime Example Impact Small B2B SaaS ($50K MRR) $500–$1,000/hour Missed customer renewals, churn Marketplace or Subscription App $2,000–$10,000/hour Lost transactions, angry vendors Consumer Platform $10,000+/hour Brand damage and PR fallout The longer it takes to recover, the more trust you lose — trust that takes months to rebuild. One forgotten dependency or expired SSL certificate can take down your entire app. That’s why Rails Fever clients often come to us after a crisis. They don’t realize that what failed wasn’t the server — it was their maintenance process. 3) Security incidents: the hidden explosions Rails apps depend on hundreds of open-source gems. Each one is a door into your system — and sometimes, that door is left unlocked. When you skip regular updates or delay patching, you give attackers more time to find and exploit known vulnerabilities. A few real examples from the Rails ecosystem: A nokogiri vulnerability allowed remote code execution in outdated versions. A Devise patch fixed an authentication bypass issue. A Rails ActiveRecord patch closed a SQL injection risk that lingered for months. Every one of these bugs was public knowledge long before many teams applied the fix. A security breach doesn’t just mean downtime — it can trigger data loss, compliance violations, and legal fees. Average cost of a small-scale data breach: often six figures for small teams when you add investigation, remediation, customer notifications, credits, and legal review. Security debt is like skipping oil changes. You might drive fine for months, but one day, the engine seizes. 4) Lost sales and growth opportunities Maintenance isn’t just about stability — it’s also about agility. When your Rails version is several releases behind, everything slows down: New features take longer to build Gems stop being compatible Developers start writing “temporary” workarounds that become permanent You may not see the direct cost, but you’ll feel it in lost velocity. While your competitors launch faster, you’re stuck fighting the framework instead of innovating. A client once told us, “Our app was running fine, but it took four weeks to ship a simple feature.” After we upgraded their stack and cleaned up old dependencies, that dropped to four days. If your tech stack becomes a drag on speed, every marketing campaign and product roadmap slows down too. That’s an invisible tax on your entire business. 5) Developer turnover and burnout Developers are problem-solvers — but not archaeologists. If your codebase feels brittle, hard to test, or constantly breaks after small changes, morale drops fast. Engineers don’t want to fight outdated dependencies or tangled configurations. Here’s how technical debt leads to turnover: Maintenance is postponed to “later.” Bugs increase, tests fail randomly. Developers start adding workarounds. The codebase becomes unpredictable. Your best engineers quit out of frustration. Replacing one senior Rails developer can cost tens of thousands of dollars in lost productivity and hiring time. And every new hire who joins a neglected codebase burns precious weeks just to understand why things are the way they are. The result is a cycle of churn that makes the problem worse. 6) Case study: the startup that froze mid-launch This is a real story with details anonymized. A SaaS startup in the education space had been growing steadily on Rails 5.2. They had one developer managing features and fixes, and maintenance was “something to do when there’s time.” Over 18 months, they delayed every upgrade — gems, Ruby, Rails, you name it. When Rails 7 came out, they realized many of their core gems no longer supported 5.2. During a routine deploy, the app started throwing errors due to an unpatched ActiveRecord bug. The developer tried to update the gem, but that gem required a newer Rails version. The result? The app went down for two full days during their annual sales cycle — the one week when they made 30% of their yearly revenue. They lost roughly $60,000 in sales and had to pay an external team (us) to bring the app back online and plan an upgrade path. What started as a “we’ll deal with it later” problem turned into a five-figure outage and a four-month rebuild. The founder later told us: “I thought skipping maintenance was saving us a couple thousand a month. In reality, it cost us far more in downtime and lost trust.” 7) The compounding nature of technical debt Technical debt is like interest on a credit card — it compounds. Every time you skip maintenance: You increase the effort required for the next upgrade You expand the list of dependencies that break together You make testing and deployment more fragile Soon, what was once a one-week upgrade becomes a full rewrite. For example: Upgrading from Rails 6.1 → 7.0 might take 1–2 weeks Waiting two years and upgrading from 5.2 → 7.1 might take 2–3 months Neglect multiplies both time and cost. That’s why proactive maintenance always wins. You pay a little now or a lot later — but you always pay. 8) The psychological cost: fear of change There’s another subtle cost: fear. When your system is fragile, your team avoids touching it. Every deploy feels risky. Every small change requires a meeting. The organization slows down because the software can’t be trusted. Healthy systems give teams confidence. Neglected systems create anxiety. That fear leads to stagnation — and eventually, to failure. 9) Practical next steps to protect your app If you recognize your app in any of these examples, you’re not alone. Most SaaS teams underinvest in maintenance until something breaks. Here’s how to turn it around: Step 1: Get a technical audit Start with a Rails tech audit. Identify outdated gems, patch gaps, and framework issues. You can’t fix what you can’t see. Step 2: Prioritize security and dependencies Patch critical gems and dependencies first. Then automate this with tools like Dependabot and CI checks that fail on vulnerable versions. Step 3: Schedule regular maintenance windows Create a recurring “maintenance sprint” every quarter or month. Treat it like an investment, not a distraction. Step 4: Monitor and alert Set up uptime and performance monitoring. Services like Pingdom, AppSignal, and Honeybadger give early warnings before downtime hits. Step 5: Plan major upgrades early Don’t wait until a Rails version goes out of support. Plan upgrades while your app is healthy, not when it’s on life support. Step 6: Get outside help If your team is small or stretched thin, bring in a specialist. Fractional Rails support can manage upgrades, security, and monitoring so you can focus on growth. 10) The real ROI of maintenance Maintenance is one of the few investments that protects and multiplies value. Fewer outages = more revenue Fewer security risks = less legal exposure Faster deploys = happier customers Cleaner code = happier developers Neglect might seem cheap in the short term, but it’s the most expensive decision you can make over time. Closing thoughts Every Rails app starts as a well-built machine. Over time, dust builds up — dependencies age, security holes appear, and performance slips. You can either spend time maintaining your app or spend money repairing it later. But you can’t escape the cost. At Rails Fever, we’ve seen both sides. The founders who invest early rarely face emergencies. Those who wait end up calling us when their app is down. Maintenance isn’t a nice-to-have. It’s the cheapest form of insurance you’ll ever buy. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Stop Wasting Money on One-Off Upgrades: Adopt Continuous Maintenance URL: https://railsfever.com/blog/stop-wasting-money-one-off-rails-upgrades/ Date: 2025-11-02 Author: Wale Olaleye When your Rails app starts slowing down or your team reports odd errors, it’s easy to treat upgrades as one-time fixes. You wait until something breaks, hire a developer to patch things up, and move on. It feels efficient—until the next issue appears. Then the cycle repeats, each “quick fix” costing more time, more money, and more lost sleep. Here’s the truth: you don’t save money by skipping maintenance. You just defer bigger bills. The Hidden Cost of Waiting Most SaaS founders underestimate how quickly small gaps pile up. A few missed gem updates here, a Ruby version behind there, and soon your app is sitting on outdated libraries with security holes no one remembers. When you finally bring in help, the scope isn’t “upgrade one gem.” It’s “untangle five years of technical debt.” You’re paying for catch-up work, not progress. A typical one-off upgrade for an aging Rails app can cost anywhere from $50,000 to $150,000, depending on how far behind you are. Compare that to a few thousand dollars a month in ongoing maintenance that keeps everything healthy, tested, and deploy-ready. Continuous Maintenance Changes the Game Continuous maintenance isn’t glamorous—but it’s powerful. It means your app is quietly improved each month: Gems are updated and security patches applied Ruby and Rails versions stay current Dependencies like Redis, Sidekiq, and PostgreSQL are monitored SSL certificates and domain renewals are tracked Errors are caught before users see them Think of it as preventive care for your software. You wouldn’t drive a car 100,000 miles without an oil change. Your Rails app deserves the same treatment. The ROI Is Obvious Let’s compare two SaaS founders. Founder A ignores maintenance for three years. When an upgrade becomes unavoidable, they spend $25K on emergency work and endure two weeks of downtime. Founder B signs up for a care plan at $1K/month. After three years, they’ve spent $36K—but their app is always stable, secure, and fast. No downtime, no panic calls, no surprise bills. More importantly, their team ships new features faster because the codebase is clean and up to date. Founder B’s business keeps running while Founder A’s app crashes during a launch. The Mindset Shift Continuous maintenance is not a luxury—it’s insurance for uptime and developer sanity. It protects your customer experience, your data, and your future revenue. At Rails Fever, we call it the Rails Care Plan. It’s how we keep our clients’ apps stable month after month, no matter what version of Rails or Ruby comes next. If you’ve been paying for one-off upgrades, it’s time to change course. The apps that thrive in the long run aren’t the ones that get rescued—they’re the ones that stay healthy. Call to Action Stop wasting money on reactive upgrades. Start investing in reliability. Learn more about the Rails Care Plan today. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # When to Upgrade Rails (and When to Wait) URL: https://railsfever.com/blog/when-to-upgrade-rails/ Date: 2025-10-20 Author: Wale Olaleye Every few years, a new version of Ruby on Rails drops, and the community buzzes with excitement. Blog posts appear, changelogs fill up, and developers start debating whether to upgrade now or later. For SaaS founders, though, the question isn’t just about new features—it’s about risk, cost, and timing. Let’s break down when upgrading makes sense, when waiting is smarter, and how to decide with confidence. 1. Why Rails Upgrades Matter Rails isn’t just another library—it’s the foundation your entire product runs on. An outdated Rails version can quietly erode your app’s stability and security. Here’s what’s at stake when you stay behind: Security patches stop coming. Each major Rails version is supported for roughly three years with regular security and bug fixes. After that, you’re on your own. Dependencies stop working. Gems that power your background jobs, payments, or analytics may drop support for old Rails versions. Developers lose motivation. It’s harder to attract and retain engineers who have to work around legacy quirks every day. Performance stalls. Each new version of Rails (and Ruby) typically brings performance gains—sometimes double-digit improvements in response time or memory efficiency. Upgrading isn’t just maintenance. It’s future-proofing your business. 2. The Cost of Waiting Too Long Imagine a SaaS running on Rails 5.2 today. That version was released in 2018 and lost official support in 2022. If that app skipped updates for four years, upgrading now means dealing with three major Rails jumps (6.0 → 6.1 → 7.0 → 8.0). Each step may introduce breaking changes in gems, dependencies, and even your custom code. Instead of a smooth, incremental upgrade, you’re now staring at a full rewrite-level project—one that could take months and cost tens of thousands of dollars. This is why founders say, “We’ll do it next quarter,” for years—until it becomes a crisis. 3. The Cost of Upgrading Too Soon That said, rushing into every new release also carries risk. When a major version like Rails 8 first drops, there’s a short period where gems, libraries, and plugins might not yet be compatible. Upgrading too soon can leave you with broken integrations, unstable deployments, or slowdowns in production. Here’s a common founder story: “We upgraded to Rails 7 the week it launched, and half our dependencies broke. We spent two weeks rolling back and reconfiguring background jobs.” The lesson: Early adoption is great—but only if your stack is simple or you have an internal dev team ready to handle surprises. 4. The Middle Ground: Upgrade Responsibly The healthiest approach is to upgrade deliberately, not reactively. At Rails Fever, we usually recommend founders follow a one-version lag strategy: Rails Version Recommended Action Rationale Current LTS (Long-Term Support) Stay You’re fully supported and safe. One version behind Plan to upgrade within 6–12 months Keeps risk low and costs predictable. Two versions behind Upgrade soon Security support is ending; gems will begin breaking. Three+ versions behind Treat as urgent You’re running unsupported code. Expect higher costs. This pattern keeps your app close to modern Rails without living on the bleeding edge. 5. Understanding Rails Support Windows Each minor Rails release (7.2, 8.0) gets: 12 months of bug fixes 12 additional months of security patches That’s roughly 2 years of full support. When the window closes, your app becomes exposed to new vulnerabilities—and if your infrastructure handles payments or user data, compliance risk goes up fast. Here’s what that looks like for recent versions: Rails Version Released End of Bug fixes End of Security Support Rails 7.2 Aug 2024 Aug 2025 Aug 2026 Rails 8.0 Nov 2024 Nov 2025 Nov 2026 Rails 8.1 Oct 2025 Oct 2026 Oct 2027 If your app runs on Rails 6.0 or older, the clock has already run out. 6. How to Assess Upgrade Readiness Before deciding, you need a snapshot of your app’s health. Run through these checks: Dependencies: Run bundle outdated to see how far behind your installed gems are. Outdated libraries are the #1 source of friction. Custom code: Check for monkey patches, deprecated Rails APIs, or old patterns like Sprockets-only asset pipelines. Testing coverage: You’ll need a reliable test suite. No coverage means higher risk. (If you don’t have one, start by writing smoke tests before upgrading.) Infrastructure: Check if your Ruby version, database driver, and CI/CD pipelines support the new Rails release. This assessment usually takes a day or two but can save weeks of surprises later. 7. The Decision Framework Let’s boil this down into a quick decision matrix: Question Yes No Action Are you still within Rails’ official support window? ✅ ❌ If “No,” plan an upgrade soon. Do your key gems support the new version? ✅ ❌ If “No,” find replacements. Do you have strong test coverage? ✅ ❌ If “No,” build minimal coverage first. Can you afford 2–4 weeks of dev time? ✅ ❌ If “No,” budget and schedule accordingly or seek external help. If most answers are “Yes,” you’re ready. If half are “No,” plan first—don’t rush. 8. The Business Case for Regular Upgrades From a business point of view, Rails upgrades are like oil changes—cheap when done regularly, expensive when ignored. Here’s why consistent maintenance pays off: Predictable costs: Incremental upgrades take weeks, not months. Less downtime: Smaller code changes mean fewer surprises. Security and trust: Staying updated signals maturity to partners and investors. Developer velocity: Your team spends less time fighting old patterns. In short, frequent upgrades keep your product nimble and your team sane. 9. When It’s Okay to Wait Sometimes, waiting is strategic. Here are valid reasons to defer: You’re mid-launch and can’t risk a production freeze. A critical gem isn’t yet compatible with the next Rails version. You’re preparing to rewrite or refactor large parts of the codebase anyway. You lack testing or deployment automation, which would make the upgrade fragile. If that’s you, create a maintenance hold plan: Keep your dependencies updated, patch Ruby, and revisit the upgrade in 3–6 months. 10. How to Plan an Upgrade Smoothly When you’re ready to move forward, break the upgrade into steps: Upgrade Ruby first: Rails upgrades usually depend on a newer Ruby version. Update gems: Replace or remove incompatible ones. Run tests early: Catch regressions in CI before they hit production. Deploy to staging: Always test under production-like conditions. Roll out gradually: Use feature flags or phased deployments to reduce risk. For large apps, this process can take 2–4 weeks. For smaller ones, often less than a week. 11. Example Timelines Here’s a typical timeline for small vs mid-size apps: App Type Lines of Code Estimated Duration Notes Small SaaS <30k LOC 1–2 weeks Minimal dependencies, few integrations Mid-size SaaS 30k–100k LOC 3–4 weeks Needs full test suite and staging validation Large Enterprise 100k+ LOC 6–12 weeks Likely requires parallel upgrade branches You don’t need a huge dev team—just structure and consistency. 12. What Happens If You Skip a Version Sometimes founders say, “Let’s jump from Rails 6 to Rails 8 directly.” That’s technically possible but rarely safe. Each version introduces deprecations and removals that compound. Skipping steps means missing transitional changes and facing multiple breaking points at once. Unless you have deep Rails expertise, it’s smarter to upgrade sequentially. 13. Common Upgrade Traps Not testing background jobs: Many break silently after an upgrade. Forgetting about Sidekiq or Redis: Version mismatches cause background errors. Ignoring production logs: Performance issues often show up days later. No rollback plan: Always keep a backup branch or snapshot. An experienced Rails consultant can catch these pitfalls quickly—especially if your app has unique configurations. 14. Founder’s Rule of Thumb If your Rails app earns real revenue, it deserves a modern foundation. Upgrade every 6-12 months. It’s cheaper, safer, and keeps your stack healthy. If you’re more than two major versions behind, it’s time to act now—not after the next outage. 15. When to Call for Help If your app has complex integrations, old gems, or minimal tests, it’s often faster and safer to bring in help. A consultancy like Rails Fever can: Assess your codebase and dependencies Plan and execute multi-step upgrades Ensure zero downtime during deployment Add monitoring to catch regressions early This is especially useful for SaaS founders who don’t have in-house Rails expertise. 16. The Bottom Line Upgrading Rails isn’t just about “keeping up.” It’s a strategic move that protects your uptime, speeds up your app, and keeps your product competitive. But timing matters. Upgrade too late, and you’ll pay in stress and downtime. Upgrade too early, and you might get stuck debugging dependencies. The best approach? Upgrade with intention. Track Rails releases. Budget for upgrades every couple of years. And never let your business run on unsupported software. That’s how you turn Rails from a risk into a strength. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # What to Do When Your Rails App Crashes in Production URL: https://railsfever.com/blog/what-to-do-when-your-rails-app-crashes-in-production/ Date: 2025-10-19 Author: Wale Olaleye When production breaks, your job is to slow things down, gather facts, and bring in the right help. This simple plan keeps you calm, limits damage, and speeds up recovery. Share it with your team. Step 1: Pause and set status Tell your team you see the issue. If users are affected, post a short status note. Keep it simple: We are investigating a production error. Some users may see failures. Next update in 30 minutes. Promise a time for the next update and stick to it. Step 2: Capture what users see Ask support to collect four details: The exact time the problem started The page or action that fails Any error message or code shown The user email or account if it helps These details let engineers match reports to logs. Step 3: Check simple health signals Open your host dashboard or uptime tool. Confirm: Are there 500 errors or timeouts? Are servers or containers restarting? Is the database reachable? Do not change anything yet. You are just confirming scope. Step 4: Review recent changes Ask two questions: What code shipped in the last 24 hours? What infra changes happened in the last week? If a change lines up with the start of the outage, consider rolling back to the last good release or image. Step 5: Check Rails and app logs You do not need to read Ruby code to help. Search for repeating errors near the start time. Common signals: Exception, Timeout, NoMethodError ActiveRecord, PG:: (Postgres), Redis, Sidekiq Save a sample error with timestamp. This is the “receipt” an expert will need. Step 6: Verify key services Most Rails apps depend on a few services. Check each one is healthy: Database: Postgres or MySQL is up and connections are not maxed Cache/Queue: Redis and Sidekiq are running and queues are not stuck Storage: S3 or similar is reachable Vendors: Payments, email, and other APIs show green on their status pages If a vendor is down, note their incident link in your internal thread. Step 7: Contact your host Open a support ticket with a short summary: When the issue started The error sample from logs Any recent deploy or infra change Ask them to confirm there is no platform incident, disk full issue, network block, or SSL problem. Keep the ticket updated. Step 8: Reduce blast radius If one feature is causing crashes, turn it off with a feature flag if you have one. Consider read-only mode to protect data while you investigate. If needed, put up a short maintenance page while you roll back. Step 9: Call for rails emergency help If you do not have in-house Rails help, bring in a specialist. Rails Fever handles production emergencies. We work with your host, read your logs, stabilize first, then find root cause. Have your error sample, deploy history, and vendor list ready. This saves time and cost. Step 10: Do a fast postmortem Keep it to one page: What happened in plain words Start and end time User and revenue impact Trigger and root cause What will change so it does not happen again Share it with the team and close the loop. Prevention: build your safety net Crashes will happen. Your goal is to spot them early and make them small. 1) Monitoring and alerts Use an uptime tool and a metrics dashboard that watches CPU, memory, queue size, error rate, and DB connections. Set alerts that wake a human in minutes. 2) Error tracking Install an error tracker like Sentry, Honeybadger, or Rollbar. These tools group errors, tag releases, and show which users are hit. They turn “it is broken” into “this line, after this deploy.” 3) Centralized logs Send Rails, Sidekiq, Nginx, and host logs to one place. Fast search during a fire saves hours. 4) Backups and restore drills Backups matter only if you can restore them. Test a DB restore on staging every month. 5) Safer deploys Ship small changes often. Add health checks and automatic rollback. Small changes are easier to unwind than big ones. 6) Capacity checks Watch database size, disk usage, and connection limits. Many “crashes” are really resource exhaustion. 7) SSL and domain hygiene Track certificate and domain renewals. Set calendar reminders 30 and 7 days before expiration. 8) Security and patching Keep Rails and gems current. Do a monthly patch window. Outdated libraries cause errors and risk. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # The Hidden ROI of Regular Rails Maintenance URL: https://railsfever.com/blog/hidden-roi-of-regular-rails-maintenance/ Date: 2025-10-13 Author: Wale Olaleye If you run a SaaS product built on Ruby on Rails, maintenance is probably the least exciting line item in your budget. It doesn’t make headlines, it doesn’t wow customers, and it doesn’t feel like “growth.” But here’s the truth: neglecting Rails maintenance is one of the most expensive mistakes SaaS founders make. Every Rails app ages. Gems go stale, dependencies drift, and Rails versions move on. A few years without updates might feel fine—until suddenly you’re facing a six-figure upgrade, extended downtime, or worse, data loss. Regular Rails maintenance flips that equation. Instead of chaos every few years, you get predictable performance, stable uptime, and a clear path forward. Let’s unpack how. 1. Why Rails Maintenance Matters More Than You Think When Rails first launched, it promised developers speed and elegance. But the framework’s real power comes from its steady evolution. Each Rails release introduces better security, improved performance, and cleaner conventions. If you skip maintenance for long, your app slowly drifts out of alignment with the modern Rails ecosystem. That drift compounds: New gems stop supporting your version Security patches no longer apply Your CI/CD pipelines break on new dependencies Your hosting provider upgrades libraries you can’t match Before you know it, your “stable” app is stuck in time. Every change feels risky. Every deploy feels like defusing a bomb. That’s not stability—it’s stagnation. 2. The Real Cost of “Let’s Fix It Later” Founders often say: “We’ll update Rails when we have time.” But time rarely appears. Here’s what that delay really costs: (a) Expensive, Large Upgrades Skipping minor maintenance means your next upgrade is massive. Jumping from Rails 5 to Rails 7 can cost 10x more than upgrading version by version. Compatibility layers, gem rewrites, and test failures pile up fast. A typical medium-sized SaaS app (~50k LOC) might spend: $5,000–10,000/year on regular maintenance $50,000–150,000 on a single major rebuild after years of neglect That’s like skipping oil changes to save $100, only to replace the engine for $10,000 later. (b) Downtime & Customer Trust Unmaintained apps break in unpredictable ways. Background jobs fail silently. Admin panels freeze. Payment gateways reject old libraries. Downtime isn’t just technical—it’s reputational. Every outage erodes trust and churns paying customers. (c) Security Risks Outdated gems are an open door for attackers. When Rails or Devise releases a patch for a vulnerability, it’s usually because someone found a real exploit. If your app isn’t patched, you’re inviting risk. 3. Maintenance Is an Investment, Not a Cost The word “maintenance” sounds like an expense. But the right way to think about it is insurance with ROI attached. Regular maintenance buys you: Predictable performance – no surprises on deploy day. Continuous security – patches applied before exploits spread. Developer confidence – new features don’t break old ones. Faster upgrades – because you’re never far behind. Operational stability – less downtime, fewer emergencies. In short: you’re buying peace of mind. 4. ROI Comparison: Maintenance vs. Major Rebuild Let’s put real numbers on this.   Regular Maintenance Major Rebuild Annual Cost $10,000 (monthly upkeep, minor updates, monitoring) $0 (until failure) Eventual Upgrade Small version bump each year Full rebuild every 4 years Total 4-Year Cost $40,000 $120,000–$180,000 Downtime Minimal (hours per year) Weeks or months Data Risk Low High Developer Velocity Steady Halted during rebuild Customer Impact Seamless Visible disruption ROI Outcome Stable growth, predictable budget Lost revenue + recovery cost Simplified ROI Formula: ROI = (Avoided Costs + Increased Uptime Value) / Maintenance Spend Example: If proactive maintenance avoids one major outage worth $25,000 and reduces rebuild costs by $80,000, that’s $105,000 saved on a $40,000 spend—a 162% ROI. Few investments in your business deliver that kind of return. 5. A Simple Story: Two SaaS Founders Founder A – Reactive Mode Sara runs a small EdTech SaaS on Rails 5.2. She skipped updates for three years because “everything still works.” Then AWS deprecated her Ruby version. Her CI pipelines broke, and none of her gems supported the new environment. She spent 3 months and $90,000 catching up, delaying feature releases and losing two enterprise customers. Founder B – Preventive Mode Tom runs a similar SaaS on Rails 7. Each month his team applies gem updates, patches, and minor Rails bumps. Upgrades take hours, not months. His cost is steady at $800/month, and he hasn’t had a security incident or downtime in two years. Both founders started with the same app. One paid predictably. The other paid painfully. 6. The Quiet Multiplier: Developer Productivity Regular maintenance does something founders rarely measure—it keeps developers fast. An outdated app is like driving with the parking brake half on. Tests fail for unknown reasons. Gems don’t work. CI jobs hang. Every new feature takes longer because you’re fighting the environment, not building the product. When your Rails stack stays current: Developers ship faster Onboarding new engineers is easier Technical debt doesn’t suffocate your roadmap That productivity translates directly to ROI. If your team of two developers saves 10 hours per week on debugging or setup, at $100/hr, that’s $52,000 per year in recovered productivity—just from staying up to date. 7. Maintenance and Uptime Are Twins Uptime isn’t luck. It’s the byproduct of disciplined systems work. Rails maintenance includes things like: Monitoring logs and performance metrics Updating background job frameworks like Sidekiq Patching Postgres and Redis dependencies Checking SSL and domain expirations Rotating secrets and API keys Neglect these, and your app eventually breaks at 2 AM. Handle them routinely, and your system hums quietly for years. That’s not magic—it’s maintenance. 8. The Hidden Cost of Data Loss Downtime hurts, but data loss kills. Every unpatched Rails app risks losing critical records if something goes wrong during deploys or migrations. Developers patching an old database driver or outdated migration logic can easily introduce silent corruption. One founder I worked with lost partial user data after a schema change on a legacy Rails 4.2 app. Restoring from backups took days. The PR team had to notify customers. Regular maintenance would have caught that risk months earlier. A single incident like that can erase years of customer goodwill. 9. SaaS ROI: Maintenance as a Growth Lever If you think maintenance just keeps things running, think again. Healthy systems accelerate feature velocity and time to market. When your Rails app stays current: New AI APIs plug in easily Performance improves automatically with framework updates DevOps teams spend time on innovation, not firefighting You can adopt Hotwire, Turbo, or Solid Queue faster That means every hour your team spends goes further. That’s the real ROI of maintenance—it compounds. 10. Common Myths About Rails Maintenance Myth 1: “We don’t need maintenance; the app is stable.” Reality: “Stable” usually means “untouched.” That’s a false sense of security. Myth 2: “It’s cheaper to wait and do one big upgrade.” Reality: Big upgrades cost exponentially more. The gap widens every month you wait. Myth 3: “Our developer can just update gems later.” Reality: By then, gem dependencies and deprecations stack up. What could take hours today takes weeks tomorrow. Myth 4: “We’re too small for that.” Reality: Small SaaS companies suffer the most from downtime. Every outage feels bigger when you only have hundreds of customers. 11. A Framework for Measuring ROI If you’re a numbers-driven founder, here’s a practical model: Estimate Annual Maintenance Cost Example: $10k/year Estimate Avoided Major Upgrade Cost Example: $100k every 4 years = $25k/year avoided Estimate Avoided Downtime Cost If 1 day of downtime = $5k in lost revenue and maintenance prevents 3 such days per year, that’s $15k/year saved. Estimate Productivity Gain If faster dev environment saves $40k/year, add that too. Compute ROI ROI = (25k + 15k + 40k – 10k) / 10k = 700% return. Maintenance doesn’t just protect value—it multiplies it. 12. The Emotional ROI: Calm Instead of Chaos Founders rarely talk about it, but the real payoff of maintenance is emotional. When you know your app is patched, monitored, and stable: You sleep better. You stop fearing deploys. You focus on growth, not firefighting. Every SaaS founder deserves that kind of calm. 13. Building a Culture of Maintenance If you manage your own dev team, maintenance should be built into your process, not tacked on as an afterthought. Practical ways to make it happen: Schedule monthly maintenance windows (updates, patching, gem audits) Automate dependency alerts with tools like Dependabot or Renovate Track Rails version status and set internal upgrade targets Document upgrade paths so your team isn’t reinventing the wheel Pair maintenance with monitoring—they go hand in hand Treat maintenance like marketing. It’s ongoing, measurable, and worth every dollar. 14. Why Founders Delay—and How to Break the Cycle It’s easy to delay maintenance. The fires of daily operations always seem bigger. But postponing technical upkeep is like ignoring your health. It feels fine—until suddenly it isn’t. Breaking the cycle starts with a mindset shift: Think of maintenance as an asset that increases your company’s value. When investors or acquirers evaluate your SaaS, they’ll look at: Codebase health Dependency freshness Security posture Deployment reliability A well-maintained Rails app signals maturity. It says, “We take our product seriously.” 15. Rails Care Plan: A Smarter Path for Founders At Rails Fever, we built the Rails Care Plan for exactly this reason. It’s designed for founders who don’t have a full in-house dev team but still need peace of mind. We handle: Monthly gem and Rails updates Security patches and vulnerability monitoring Uptime tracking and error reporting Regular health reports with recommendations Proactive upgrade planning In short: you focus on customers, we keep your Rails app healthy. It’s predictable, affordable, and built for SaaS businesses that can’t afford surprises. 16. Final Thoughts The hidden ROI of regular Rails maintenance is simple: it turns chaos into consistency. Instead of gambling on major rebuilds, you invest in stability and predictable growth. Your app stays secure. Your team stays productive. Your customers stay happy. If you want to understand how regular maintenance could reduce your costs and increase uptime, explore the Rails Care Plan today. Learn more about the Rails Care Plan → Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Help! My Rails App Is Down — What Founders Should Do in a Production Emergency URL: https://railsfever.com/blog/rails-app-production-emergency-help/ Date: 2025-09-23 Author: Wale Olaleye When your Rails app goes down, time slows to a crawl. Customers may be locked out, support tickets pile up, and every minute feels like revenue slipping through your hands. If you’re a non-technical founder, the panic doubles — you know something’s wrong but you don’t know how to fix it. The good news: you don’t need to be an engineer to take smart, immediate steps. Here’s how to respond to a production emergency on your Rails app. 1. Breathe and Confirm the Issue First, verify what’s really happening. Is it one customer reporting an error, or is the entire app unreachable? Check your app yourself, and look at any monitoring tools you may have in place (Heroku status page, AWS dashboard, Pingdom, etc.). If you don’t have monitoring, this is the time to start thinking about it — but for now, focus on confirming the outage. 2. Communicate Quickly Silence makes customers assume the worst. Post a quick status update via email, in-app banner, or social channel. Keep it simple: Acknowledge the issue Assure users you’re working on it Promise updates as you have them Transparency buys you time and keeps trust intact. 3. Contain the Damage If the problem is tied to payments, logins, or sensitive workflows, consider temporarily disabling those features until a fix is in place. This prevents a bad situation from getting worse, like duplicate charges or corrupted data. 4. Call in Reinforcements This is where most founders freeze: who do you call if you don’t have a Rails developer on staff? You have options: Hosting providers: Heroku, Render, or AWS often have support you can escalate to, however their main goal is to confirm that their service is not the problem. You may get some suggestions, but they are unable to dig into your application code or change infrastructure config to provide a solution. Rails consultancies: Specialized firms (like Rails Fever) that handle production firefighting and ongoing maintenance can fix your emergency and put preventive measures in place to make sure it never happens again. Freelancers: Platforms like Upwork or Fiverr can connect you, though vetting in the middle of an emergency is risky. It could be hard to get high quality work this way — you may get a quick & dirty patch until the problem resurfaces. The safest move is to build a relationship with a Rails support partner before disaster strikes, but in a true emergency, start calling in experienced Rails consultants right away. 5. Document Everything While the engineers work, keep notes: When the outage started What errors customers saw Any recent changes (deploys, new features, config updates) This context can speed up diagnosis and recovery. 6. Plan for Next Time Once the fire is out, don’t just breathe a sigh of relief and move on. Emergencies are wake-up calls. Ask: Do you have monitoring and alerts set up? Do you have automated backups and tested restores? Do you have a Rails support plan or fractional CTO to call when things break? Emergencies don’t have to become disasters if you build the right safety net. Finding the Right Help for Your Rails App If you’re a founder without in-house Rails expertise, the best step you can take after the immediate emergency is finding a long-term partner. A good Rails consultancy won’t just put out fires — they’ll keep your app updated, secure, and stable so you can focus on growing your business instead of firefighting. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Security Best Practices for Web Applications: Lessons from CodeRabbit Exploit URL: https://railsfever.com/blog/security-best-practices-web-apps-lessons-coderabbit-exploit/ Date: 2025-08-20 Author: Wale Olaleye The recent exploit of CodeRabbit—a popular AI code review tool—is a reminder that security problems don’t always start with a smoking gun. Sometimes they begin with application configuration that seems harmless until it snowballs into remote code execution that affects millions of repositories. For SaaS founders and app managers, the message is clear: small oversights in security can cascade into massive failures. Here are a few lessons you can apply today. 1. Secrets Don’t Belong in Environment Variables If an attacker gets remote code execution on your server and you’re storing API keys in environment variables, congratulations—you’ve just gifted them admin rights to your kingdom. Use a secrets manager (AWS Secrets Manager, HashiCorp Vault, Doppler). These tools make rotation painless and limit exposure when—not if—something leaks. 2. Outbound Traffic Isn’t “Unlimited Buffet” Your servers do not need to talk to the entire internet. Limit outbound access with security groups. If your app only needs Stripe, your load balancer, and maybe an email service—block everything else. A compromised server with full internet access is a hacker’s dream vacation. 3. Keep Development Toys Out of Production The CodeRabbit exploit showed how dev tooling in production can be abused. Tools like Rubocop, linters, or test runners don’t belong in production. They chew up resources and open up unnecessary attack surfaces. Keep production boring, predictable, and locked down. 4. Watch the Logs Like a Hawk (or Train One) Attackers often leave strange patterns in logs. Use anomaly detection, machine learning, or at least robust alerting to spot unusual spikes or odd requests. Logs aren’t just for compliance—they’re your early warning system. 5. Least Privilege Isn’t Optional One reason the CodeRabbit exploit caused such wide damage was overbroad permissions. Apply least privilege everywhere—servers, CI/CD pipelines, third-party integrations. If it doesn’t need write access, don’t give it. Takeaway The CodeRabbit incident proves that attackers don’t need zero-days to wreak havoc—they just need you to overlook the basics. Start with secrets, outbound access, dev-tool hygiene, log monitoring, and least privilege. It’s not everything, but it’s a strong line of defense against being tomorrow’s headline. Security isn’t about being perfect. It’s about making it hard for small mistakes to turn into big disasters. That’s what we focus on with our Rails Care Plan: proactive maintenance, ongoing security, and peace of mind. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Stopping Bot Traffic Before It Stops Your Business URL: https://railsfever.com/blog/stopping-bot-traffic-rails-applications/ Date: 2025-08-18 Author: Wale Olaleye At Rails Fever, we work with SaaS companies that don’t have in-house engineering teams. A recurring issue we see is the rise of automated bot traffic, which has spiked with the adoption of AI tooling by bots. This isn’t just “noise on the server.” Bot traffic has real costs, both human and financial, that can put an entire business at risk. Recently, a client enrolled in our Rails Care Plan came to us with a problem: fraudulent transactions were rising sharply. After digging in, we found the root cause—an organized wave of bots targeting their checkout flow. The Impact of Bot Traffic Unchecked bot traffic hits harder than most founders realize: Financial losses: fraudulent signups, test transactions, and stolen credit cards drive up chargeback fees. Customer risk: bots attempting account takeovers lead to real users losing trust. Support team burnout: staff spend hours cleaning up fake accounts, refunds, and angry emails. Infrastructure strain: bots inflate server load, forcing unnecessary scaling and higher bills. The hidden cost is the time and stress this creates for the humans running the business. Left unresolved, it becomes more than a technical issue—it’s a revenue and reputation issue. How We Stopped the Bots Working closely with the client, we applied a layered defense strategy: Pattern Identification – First, we analyzed request logs to isolate unusual traffic signatures and behaviors. WAF Rules – We deployed tuned rules in AWS CloudFront to block suspicious patterns while allowing legitimate users through. Rate Limiting & Throttling – Checkout endpoints were protected from rapid-fire attacks without breaking normal user flows. Monitoring & Iteration – We set up ongoing alerts and tuned rules weekly based on new patterns. The results were dramatic: fraudulent transactions dropped by over 90% within weeks. The Human and Security Costs of Ignoring Bots If bot traffic is not handled, it drains a business slowly: Founders spend more time on fraud disputes than product growth. Support teams burn out chasing fake signups. Users lose trust when their accounts are compromised. Security problems often start as “nuisances” but quickly escalate into business risks. A Case for Proactive Care This is exactly why the Rails Care Plan exists. It’s not just about keeping apps patched and servers healthy. It’s about anticipating threats like this and acting before they spiral into six-figure problems. Our job is to keep your Rails app running smoothly so you can focus on growth, not fraud disputes. If you’re seeing unusual traffic, fake signups, or unexplained charges, don’t ignore it. Let’s get ahead of it. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # Ruby on Rails Maintenance Cost: Stop Burning Money on Big-Bang Upgrades URL: https://railsfever.com/blog/ruby-on-rails-maintenance-cost/ Date: 2025-08-18 Author: Wale Olaleye Ruby on Rails Maintenance Cost: The Money-Burning Problem If you’ve ever asked “how much does it cost to maintain my Rails app?” you’ve probably noticed that no one gives you a straight answer. And for good reason. The cost of a giant, once-every-5-years upgrade is like planning a family vacation by spinning a globe and booking the first flight you see. It’s expensive, unpredictable, and usually comes with a headache. We’ve seen companies burn six figures trying to jump from Rails 5 to Rails 8 in one go. By the time they’re done, they could have funded an in-house developer… or bought a new home. Why Incremental Upgrades Are the Better Bet Here’s the thing: Rails, like your teeth, is easier to maintain if you don’t wait five years to see the dentist. Small, regular checkups prevent the giant bill and the painful root canal. That’s why incremental upgrades are the best practice. Move from Rails 5.0 to 5.1, not 5.0 to 8.2 in a panic. Smaller steps mean fewer broken gems, less downtime, and no all-nighters for your dev team. Rails Maintenance Cost Breakdown: Big-Bang vs. Incremental Care Let’s put some numbers behind this. Scenario 1: The Big-Bang Upgrade Rails version skipped: 3 major releases (e.g. Rails 5 → Rails 8) Dev time: 900-1200 hours Contractor rates: $200-$250/hr Estimated cost: $180,000–$300,000 Plus: downtime risk, broken gems, delayed roadmap, unexpected costs, months of bug fixes Basically, it’s setting your Q4 budget on fire. Scenario 2: The “Cheap” Ad-Hoc Fixes Wait until something breaks, then scramble Frequent contractor bills at premium emergency rates Slow, unpredictable response times Annual cost: $30,000-$60,000 (and no real progress on upgrades) It feels cheaper at first, until you realize you’re paying more for less. Scenario 3: Rails Fever Care Plan (Incremental Upgrades) Foundation: $5k/month → $60k/year Growth: $10k/month → $120k/year Partner: $20k/month → $240k/year Includes: proactive upgrades, monitoring, strategy, and predictable SLAs Outcome: no six-figure surprise projects, no downtime roulette Instead of gambling on your tech debt, you’re buying predictable maintenance that keeps your app modern and stable. Rails Fever’s Rails Care Plan: Transparent, Not Scary At Rails Fever, we got tired of watching companies burn money on surprise upgrades. So we built our Rails Care Plan around transparent pricing and proactive maintenance. Here’s how it breaks down: Foundation - $5,000/month For small apps (up to 20k LOC) on Heroku, Render, or Hatchbox. Includes monthly patches, one major Rails upgrade per year, monitoring, and reports. Think of it as your Rails dental cleaning plan. Growth - $10,000/month (Most Popular) For mid-sized apps with custom infra on AWS/GCP/DO (up to 60k LOC). Adds roadmap tracking, pipeline support, and strategy calls. Optional weekend emergency support if you like living dangerously. Partner - $20,000/month For apps so mission-critical that downtime isn’t just expensive—it’s unthinkable. Includes full DevOps, CTO-level advisory, and premium SLAs. Basically “Rails maintenance on steroids.” And every plan starts with a 3-month trial. Because unlike that shady car mechanic, we actually want you to trust us before signing a long-term deal. The Bottom Line Rails maintenance cost is about more than dollars—it’s about predictability. You can either: Wait 5 years, roll the dice, and pray your upgrade doesn’t explode your budget. Or sign up for a Rails Care Plan, spend a predictable monthly fee, and never worry about surprise six-figure upgrades again. Your call. But we recommend keeping your budget out of the bonfire ™. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # What to Expect When You Hire a Rails Support Consultancy URL: https://railsfever.com/blog/what-to-expect-from-rails-support-consultancy/ Date: 2025-07-29 Author: Wale Olaleye If you’re running a profitable SaaS company built on Ruby on Rails, but you don’t have an in-house development team, hiring a Rails support consultancy can feel like a leap of faith. What exactly are they responsible for? How will you know if the work is being done? What happens when something breaks? In this post, we’ll walk through what you should expect from a professional Rails maintenance service—so you can make an informed decision and avoid surprises down the line. 1. Initial Assessment and Onboarding Before any code is touched, a solid Rails support team will start with a comprehensive onboarding process. Expect three key activities here: Codebase Review: A thorough review of your app’s architecture, dependencies, and known issues. This helps identify technical debt, risky patterns, and upgrade blockers. Our Rails Tech Audit service provides exactly this type of comprehensive assessment. Infrastructure Check: Your hosting setup, CI/CD pipeline, backups, and monitoring tools are reviewed to ensure nothing critical is missing. Access and Documentation Setup: Clear, secure access to your code, servers, third-party services, and any existing docs. If documentation is lacking, a good team will start building it as they go. This phase lays the foundation for everything that follows. Without it, maintenance becomes guesswork. 2. Establishing a Maintenance Plan After onboarding, your consultancy should present a maintenance plan tailored to your app’s size, age, and complexity. This typically includes: Security Patching Schedule: Regular updates to Rails and gems to keep your app secure. This includes CVE monitoring and timely fixes for high-risk vulnerabilities. Monitoring & Alerts: Tools like AppSignal, Rollbar, or Datadog should be configured to watch performance, exceptions, and availability. Upgrade Planning: Based on your current Rails version and dependency health, the team should propose a safe, phased plan to stay current—especially if you’re several versions behind. For apps needing immediate upgrades, consider a dedicated Rails Upgrade Express service. This plan should be documented, reviewed with you, and adjusted over time as your product or usage evolves. 3. Communication and Reporting A common frustration with developers is poor communication. A professional Ruby on Rails support team avoids this by setting expectations upfront: Issue Updates: Clear tracking of bugs, fixes, and updates—whether that’s via email, Slack, or a shared project board. Check-In Cadence: You should expect regular status updates, with frequency depending on your service level. Roles & Responsibilities: You’ll know who’s responsible for what—no more wondering who’s handling an alert. Reliable communication is what separates a real consultancy from a loose group of freelancers. 4. Handling Urgent Issues When production is down or payments are failing, you need to know someone has your back. This is where a Rails Support Desk becomes invaluable. Your consultancy should: Define Response Times: What’s the expected turnaround for critical vs. non-critical issues? This should be part of your service agreement. Escalation Process: Know who gets alerted, how they respond, and when you’ll hear back. There should be no mystery here. Postmortems and Fixes: After a major incident, you should get a clear explanation and a plan to prevent it from happening again. If a support provider can’t commit to timely responses and clear resolution processes, that’s a red flag. 5. Ongoing Value Beyond the Basics A long-term Rails maintenance service like our Rails Care Plan is more than just bug fixes and patches. Over time, the right partner will help you: Improve Performance: From background job tuning to database indexing, there’s always room for speed improvements. Cut Costs: Optimizing cloud resources, reducing third-party dependencies, or cleaning up unused code can save real money. Plan for the Future: You’ll get heads-up advice on deprecations, upcoming Rails changes, and whether new features are worth adopting. This is the real value of working with a consultancy that isn’t just reacting—but thinking ahead for you. Conclusion Hiring a Rails support consultancy shouldn’t feel like a gamble. With the right partner, you gain a team that’s proactive, communicative, and aligned with your long-term goals. Whether you need basic rails maintenance services or full coverage for your production infrastructure, knowing what to expect upfront helps you choose with confidence. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # How to Choose the Right Rails Support Consultancy for Your Business URL: https://railsfever.com/blog/choosing-rails-support-consultancy/ Date: 2025-07-28 Author: Wale Olaleye If your Rails app is the backbone of your business, choosing the right support partner isn’t a technical decision—it’s a strategic one. Many SaaS companies running on Rails hit the same point: the original devs are gone, the app is stable enough, but any change feels risky, deployment is stressful, and bugs surface at the worst times. At that stage, you don’t need a freelancer for one-off tasks. You need a partner who takes ownership of your codebase like it’s theirs. Here’s what to look for when evaluating a Rails support consultancy. 1. They Offer More Than “Dev Help” Support means more than answering tickets or fixing bugs. A good consultancy provides proactive monitoring, routine maintenance, Rails upgrades, dependency management, and performance tuning. If you’re getting billed hourly for quick fixes, that’s not support—it’s reaction. Look for: Fixed-fee plans with clear SLAs Services that include audits, patching, upgrades, and security Regular communication and visibility into app health 2. They Specialize in Rails Maintenance This isn’t the time for a full-stack agency that “also does Rails.” You don’t need an agency that has do decide between building working on a 5 figure greenfield app or fixing your bugs, you need a company that focuses on maintenance. Futhermore, you want specialists who’ve lived through the nuances of Rails 4 to 7, know the edge cases of ActiveRecord, and don’t flinch at background jobs stuck in Sidekiq. Look for: A track record of maintaing multiple Rails apps Experience with legacy versions and Rails upgrades A clear technical stack focus 3. They Understand Business Tradeoffs Every Rails app has legacy code. What matters is how your support partner helps you triage and prioritize: What’s a fire? What’s technical debt you can live with? What’s worth fixing before a growth spurt? Support that ignores context wastes your money. Look for: Partners who ask about business goals before tech solutions Roadmapping and planning, not just coding Maintenance strategies tailored to ARR-stage companies 4. They’re Built for the Long Haul Many consultants vanish after the initial project. You need a team or individual who plans to stick around, with systems in place for ongoing communication, onboarding, and knowledge sharing. Look for: Long-term retainers or care plans A track record of multi-year client relationships A clear point of contact—not a rotating cast of contractors 5. They’re Proactive, Not Just Reactive Good support finds issues before you do. They’ll monitor logs, set up alerts, catch failing jobs, track background noise from bots, and patch security holes on their own. You shouldn’t have to micromanage your support team. They should be thinking 3 steps ahead. Look for: Uptime monitoring, exception tracking, and error resolution Regular status updates or monthly reports Prevention-first mindset Final Thoughts Your Rails app doesn’t need a savior—it needs a steward. Someone to care for it day in, day out, while you focus on growth, customers, and product. At Rails Fever, we specialize in long-term Rails application management. We don’t just parachute in and fix bugs—we take over the daily care of your codebase like it’s our own. Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. --- # 5 reasons you should maintain your Ruby on Rails Application URL: https://railsfever.com/blog/ruby-on-rails-maintenance-reasons/ Date: 2024-04-13 Author: Wale Olaleye Updated: 2025-07-28 As a founder of a business running on Ruby on Rails, you may wonder, if you have a working Ruby on Rails application, why is there a need to continue maintaining it? Is it really necessary? Isn’t it cheaper to do nothing? Here are 5 reasons you should definitely include application maintain in your budget. 1. Ruby on Rails Maintenance prevents application stoppage If you do not maintain your software it will eventually stop working, partially then completely. This will happen at a time and date you do not expect. Fixing the issue could be expensive, result in stress and possibly lost customers. Finding someone skilled enough to resolve the issue could take a long time. In emergency situations, you may need a Rails rescue service to quickly stabilize your application. However, if you hire a professional Ruby on Rails consultancy to regularly maintain your system every month, you will avoid expensive breakage to your system. In addition, an expert Ruby on Rails consultancy like Rails Fever that provides ongoing support will understand your system enough to build regular feature requests. They can review code written by other developers in your team to ensure that high-quality work is being delivered - to ensure that your development costs are being wisely used. 2. Ruby on Rails Maintenance makes it easier to hire new developers When you stay on an old version of Ruby and Rails the talent pool of developers that can work with that version is reduced every year. This is because when new versions are released, most companies upgrade and developers learn new ways of writing Ruby on Rails code. Most developers have little interest in working on very old platforms. Documentation for old platforms could be hard to find. This is a hidden cost of failing to maintain your Ruby on Rails application. 3. Ruby on Rails Maintenance prevents a complete application rewrite A company running an old version of Rails runs the risk that its system becomes so obsolete it may eventually have to be abandoned and rebuilt from scratch. Even if you could afford a rewrite, you may not be able to rebuild all the existing functionality into a new platform. How would you migrate users to the new platform? Would you experience data loss? Rewriting your system from scratch is a “nuclear option” that should be avoided if possible. The risk of losing existing customers is very high. The impact on your business could be catastrophic. 4. Ruby on Rails Maintenance allows developers to build new features faster Building new features on a properly maintained Ruby on Rails application is both faster and cheaper. Attempting to build some features on old versions of Ruby on Rails may be impossible. Your business benefits because the latest tools in the Rails ecosystem are available to your developers. This allows them to work efficiently and with agility. Each version of Ruby on Rails sets new standards for how Rails apps should be built. New features are provided to developers. An experienced Ruby on Rails consultancy can help guide your team to rewrite existing code to take advantage of new Rails features. 5. Ruby on Rails Maintenance protects you from hacking According to cybersecurity experts, 30,0000 websites are hacked every day. Security vulnerabilities are regularly found and fixed. To obtain these fixes you must upgrade your Ruby on Rails application. Failure to upgrade your Ruby on Rails application leaves your website and data vulnerable to hacking schemes. Hackers cost businesses lots of money every day. How much will it cost your business to recover from hackers? What is the cost of doing nothing? Maintaining your Ruby on Rails application every month costs some money, however, it is cheaper than the price you will pay when you have a catastrophic problem. To illustrate imagine you are driving a 30-year-old vehicle that appears to be functioning properly. Why buy a new one, isn’t it cheaper to do nothing? What happens when you have a catastrophic accident that could have been prevented if you had a modern car with updated safety features? Paying for a newer vehicle would have been significantly cheaper than the resulting bodily damage. Similarly, if you save money by not spending on maintaining your application, would the savings be worth it when your application experiences a severe problem? How much stress will it cost you? How many customers could you lose? How much money could your business lose? Benefits of Maintaining your Ruby and Rails application Prevents application stoppage Makes it easier to hire new developers Prevents a complete application rewrite Allows developers to build new features faster Protects your business from hacking Need help with Rails maintenance? We offer comprehensive Rails Care Plans for ongoing support, technical audits to assess your current state, and Rails upgrades to keep you current. View our pricing plans to find the right fit for your needs. Schedule a consultation or email hello@railsfever.com to discuss your Rails needs. ---