
Hi, I’m Damian.
I shipped my first website in 2006, and since 2011 I have mostly worked on Ruby on Rails applications. I have seen a wide range of challenges with Rails. Today we get to use incredible coding agents to help turn any Rails app into a masterpiece.
I love to challenge ideas from the low level (DevOps) to the end-user perspective (UI).
Today, I focus on software engineering best practices and coding agents to improve Rails apps on every level.
The Rails problems that keep coming back.
A non-exhaustive list of what I like to tackle on Rails apps, in addition, of course, to designing and shipping new features.
-
An app that gets slower as it grows
I profile slow requests, fix N+1 queries and missing indexes, and reduce rendering and memory bottlenecks.
-
Upgrades and security patches keep slipping
I upgrade Ruby, Rails and every gem, including transitive dependencies, with security-advisory reviews, tests and compatibility checks.
-
Test coverage that misses real failures
I cover critical journeys, permissions and unexpected data, improve fixtures, and fix flaky tests so green means something.
-
Slow CI and painful boot times
I trim slow builds and Rails boot times, streamline test setup and balance parallel workers for faster feedback.
-
QA environments that block the team
I create isolated branch previews with reproducible configuration and safe, realistic data, so reviewers can test before merging.
-
Assets that are heavy or break on deploy
I simplify asset pipelines, reduce CSS and JavaScript payloads, and fix stale or missing assets after deployment.
-
An interface that feels like several products
I unify components, spacing and interactions into a consistent design system, with responsive layouts and accessibility checks.
-
A codebase nobody wants to touch
I untangle models, controllers and callbacks in small refactorings, with regression tests that protect existing behaviour.
-
Background jobs and integrations that fail quietly
I make jobs safe to retry, handle API failures and monitor queues so stuck work is visible and recoverable.
-
Deployments and migrations that feel risky
I stage schema changes, separate large backfills and strengthen deployment checks and rollback plans to reduce release risk.
-
The same issues in every code review
I turn recurring feedback into shared conventions, automated checks and agent-assisted reviews, keeping human judgement on decisions.
-
Knowledge trapped in people’s heads
I document business rules and conventions and make setup reproducible, so developers and agents can work confidently.
I also love working on the UI.
I work across Rails and UI, from models and APIs to fast, clear screens people enjoy using.
AI helps me explore and implement design ideas while keeping the product coherent and the code maintainable.
AI, Ruby, and how I work.
I was among the weirdos who believed in agentic development in early 2025. Today, I use it to improve large Rails applications.
Agents work within clear goals, rules and secure environments. I review the code, make architectural decisions and refine the next run.
| Problem | What I did |
|---|---|
| Reviews repeat the same details | I analysed the latest 500 pull requests on a large Rails monolith and distilled 40 recurring rules for a first-pass Code Reviewer agent. |
| Tests miss the data that breaks production | I expanded an RSpec fixture set with deliberately malformed data to expose edge cases earlier. I prefer “Data coverage” to “Test coverage”. |
| Delivery work takes time away from product decisions | Agents can create a QA environment per branch, speed up CI, refactor core components and improve their own accuracy and token usage. |
The right model for each job.
I use various tools for the job: Codex, Claude and Cursor, plus OpenRouter to try new models. Different models are good at different jobs, and I like to have them critique each other’s work, like Opus reviewing code written by GPT.
I reuse existing skills, but I love writing custom ones: easy to review, easy to adjust, and tailored to the project I’m working on.
- Claude
- Codex
- Cursor
- OpenRouter
The tools I keep coming back to.
What is always in my backpack: the libs and stack I work with.
- Framework Rails 5+ · Ruby 2.7+
- Databases PostgreSQL · MySQL · Redis · Elasticsearch
- Background jobs Sidekiq · Solid Queue · Good Job · Delayed Job
- Testing RSpec · Minitest · FactoryBot · Fixtures · Custom
- Authentication Devise · OmniAuth · Custom
- Authorization Pundit · CanCanCan · Custom
- Frontend JavaScript Hotwire · Turbo · Stimulus · Vue.js · React · Custom JS
- Frontend CSS Tailwind · Bootstrap · Material Design · Custom CSS
- Asset pipelines Importmap · Sprockets · Propshaft · Webpacker
- APIs GraphQL · REST · Jbuilder
- Deployment Docker · Kubernetes · Kamal · AWS · Azure · GCP · Custom
- CI / CD GitHub Actions · Slack
- File uploads Active Storage · CarrierWave · Shrine
- Admin panels ActiveAdmin · Administrate · RailsAdmin · Custom
- Monitoring Sentry · Bugsnag · Datadog
I love helping teams level up together.
Teaching is part of how I work. I share what I learn, explain the reasoning behind a choice and help the whole team become more confident with the codebase.
15 years of Rails.
Every project is an excuse to learn something new.
- 2011–2020 HashtagBattle, my first Rails product in productionScaled to thousands of users per minute and maintained for eight years
- 2013–2016 Geeksters, one of the first Ruby dev shops in MoroccoWe built The House Of Geeks in Agadir, where I taught Ruby on Rails and grew the team from 2 to 15 full-stack developers
- 2017 Rails due diligence for the Loco2 acquisitionA quality audit of a large, business-critical Rails application
- 2017–2019 Ruby and Sidekiq at scalePostgreSQL, Sidekiq Enterprise, Kubernetes, APIs and a CI pipeline reduced from 45 to 4 minutes
- 2017–now Localtower, a Rails Engine for database migrationsBuilt to support applications from Rails 5.2 to Rails 8 and featured in Ruby Weekly
- 2023–2026 kelvin, a large Rails monolithMy latest Rails experience, working with an established production codebase
- 2026 A contribution merged into RailsPull request #56967 in the Rails repository