Migrate a Ruby on Rails application from Oracle Database to PostgreSQL — schema differences (NUMBER to BIGINT/DECIMAL, VARCHAR2 to VARCHAR, CLOB/BLOB to TEXT/BYTEA, sequences, ROWID, hierarchical queries, PL/SQL packages), Oracle Enhanced adapter to pg gem, data migration via ora2pg, the dual-write cutover. Use when…
Integrate React with a Ruby on Rails app — Inertia.js as the default (server-rendered routing, no separate API), classical API + SPA when Inertia doesn't fit, jsbundling-rails with esbuild, viteruby as a faster alternative, hydration vs full SPA, when React earns the integration cost. Use when integrating React into…
Integrate Vue with a Ruby on Rails app — Inertia.js as the default (server-rendered routing), classical API + SPA when Inertia doesn't fit, viteruby with @vitejs/plugin-vue, Vue 3 Composition API, hydration patterns, when Vue earns the integration cost. Use when integrating Vue into Rails, the user mentions Inertia…
Integrate Angular with a Ruby on Rails app — classical API + SPA as the default (Angular's full-framework model doesn't fit Inertia well), standalone-components Angular 17+, NgRx vs signals, JWT auth flow, CORS configuration, deploying Angular separately from Rails. Use when integrating Angular into Rails, the user…
Tune Puma for production Rails 8 — worker process count (CPUs × 1.5), thread count per worker (3-5 default), memory budget per worker, jemalloc, preloadapp + fork-safe initializers, the Ruby 3+ YJIT enable, GIL implications for thread count, signal handling, restart strategies, MALLOCARENAMAX. Use when the user…
Asset pipeline for Rails 8 — Propshaft as the new default (replacing Sprockets), Importmap-rails for JS without bundling, jsbundling-rails for esbuild/rollup/webpack, cssbundling-rails for Tailwind/Sass/PostCSS, the Sprockets-to-Propshaft migration, asset host for CDN, digest stamping, far-future expiry headers. Use…
Multi-database Rails 8 — primary + replica for read scaling, separate databases per concern (auth DB, analytics DB), automatic role switching via connectedto + connectsto, replica lag detection, sticky writes (writes-followed-by-reads on primary), GHA-style horizontal sharding, the trilogy/pg per-connection-pool…
Receive webhooks in Ruby on Rails 8 — signature verification, idempotency via event-ID storage, async processing in jobs (never sync), retry semantics, the raw-body capture for HMAC, replay protection. Use when the user mentions webhooks, webhook signature, HMAC verification, replay protection, idempotency keys…
Integrate Ruby on Rails apps with external HTTP APIs — Faraday as the canonical client, retries with exponential backoff, circuit breaker (Stoplight), VCR for tests, timeout discipline (open + read), structured logging of API calls, idempotency keys on writes, rate limit handling, the wrap-in-a-service-object pattern.…
Feature flags in Ruby on Rails 8 — Flipper as the canonical gem, percentage-rollout and group-based flags, the per-request and per-user evaluation patterns, integration with admin UI and CI, deprecating flags safely, the "every feature behind a flag" anti-pattern. Use when the user mentions Flipper, feature flags…
Architectural patterns beyond fat models — form objects for multi-model form binding, query objects for complex AR querying, presenters / decorators for view logic. When each earns its keep, naming, testing, common smells. Use when models bloat, forms span multiple models, queries get hard to read, views accumulate…
Action Text (rich text) in Rails 8 — Trix editor integration, hasrichtext on models, Active Storage for embedded attachments, the safe-list of HTML tags, custom embeds via attachable mixin, server-side sanitization, XSS prevention, search indexing of plain text. Use when the user mentions Action Text, Trix, rich text…
Internationalization and time zones in Rails 8 — I18n keys for translations, locale fallbacks, lazy lookup in views, locale switching per-request, the rails-i18n gem, time zone storage strategy (UTC in DB, display in user's zone), Time.zone vs Time.current vs Time.now, timeinzone, daylight saving traps. Use when the…
Search in Rails 8 — pgsearch as the default (Postgres full-text + tsvector + trigram), Meilisearch when relevance / typo tolerance / autocomplete matter, Elasticsearch / OpenSearch only when you actually need cluster-scale, Searchkick as a friendly wrapper. Multi-search across models. Indexing strategies (sync, async…
Production console safety in Rails 8 — the production console warning, sandbox mode, read-only consoles, audit logging of console sessions, scrubbing PII, dangerous methods to never run (updateall, deleteall, truncate, raw SQL DELETE/UPDATE without WHERE), the staged-production-console pattern, replacing console with…
A diagnostic skill that refuses microservices in the wrong contexts and recommends a modular monolith instead. Covers the team-size threshold, the deploy-coupling argument, the distributed-systems tax, when DHH's "majestic monolith" is correct, and the "you're not Netflix" rule. Use when the user mentions…
Decomposing a Rails monolith into services — bounded contexts, service boundaries, public-API contracts, ownership of data, service-to-service authentication, the "shared library" trap, distributed-transaction patterns (saga, outbox), how to NOT recreate the monolith over HTTP. Use ONLY after the user has answered YES…
Incrementally extracting a service from a Rails monolith — the strangler fig pattern, dark-launching, dual-writes with reconciliation, the cutover, the rollback plan, schema-level decoupling before code-level decoupling. Use after the user has decided to extract (see when-NOT-to-use-microservices) and needs to plan or…
Apache Kafka in Rails — producing and consuming with karafka (recommended), racecar as a thin alternative, ruby-kafka legacy notes, schema management with Avro/Protobuf, partitioning strategy, consumer group offsets, exactly-once vs at-least-once delivery semantics, idempotent consumers, the outbox pattern for…
RabbitMQ in Rails — bunny client, sneakers for consumers, exchange topology (direct / fanout / topic / headers), durable queues + persistent messages, acknowledgements, dead-letter exchanges, prefetch tuning, when RabbitMQ is the right tool vs Kafka vs Solid Queue. Use when the user mentions RabbitMQ, bunny gem…
Redis Streams (XADD / XREADGROUP / consumer groups) in Rails as a lightweight Kafka — when it fits, the redis-rb client, MAXLEN cap, consumer group semantics, PEL (pending entries list) handling, claiming abandoned entries, when to graduate to Kafka. Use when the user mentions Redis Streams, XADD, XREADGROUP, consumer…