<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Engineering Notes — Vinicius Pereira</title>
    <link>https://ovini.site/blog/en/</link>
    <atom:link href="https://ovini.site/feed.en.xml" rel="self" type="application/rss+xml" />
    <description>Long-form posts on Rails internals, PostgreSQL at scale, distributed systems, and AI-assisted engineering.</description>
    <language>en</language>
    <lastBuildDate>Thu, 13 Aug 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>How a coding agent actually operates on a repository</title>
      <link>https://ovini.site/blog/en/how-a-coding-agent-operates-on-a-repository.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-a-coding-agent-operates-on-a-repository.html</guid>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ai</category>
      <description>Not autocomplete, not magic: a loop of read, plan, edit, verify, running against a real filesystem. Traced against an actual change made to this site, including the part it got wrong.</description>
    </item>
    <item>
      <title>What actually happens between the WebView and the native shell</title>
      <link>https://ovini.site/blog/en/hotwire-native-webview-bridge.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/hotwire-native-webview-bridge.html</guid>
      <pubDate>Thu, 06 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>hotwire</category>
      <description>Hotwire Native is not a wrapper around a website. It is a native app that delegates screens, and the moment you understand who owns the back stack, half the confusion disappears.</description>
    </item>
    <item>
      <title>Connection pooling: why your database runs out of connections</title>
      <link>https://ovini.site/blog/en/connection-pooling-why-your-database-runs-out-of-connections.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/connection-pooling-why-your-database-runs-out-of-connections.html</guid>
      <pubDate>Thu, 21 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>Rails opens one connection per thread, Postgres charges ~10MB per connection, and nobody notices until concurrency spikes. PgBouncer, pool sizing, and the math that actually matters.</description>
    </item>
    <item>
      <title>You don't understand Machine Learning until you implement it from scratch</title>
      <link>https://ovini.site/blog/en/you-don-t-understand-machine-learning-until-you-implement-it-from-scratch.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/you-don-t-understand-machine-learning-until-you-implement-it-from-scratch.html</guid>
      <pubDate>Thu, 14 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ml</category>
      <description>Calling sklearn.fit() isn't understanding. Building a perceptron, logistic regression and a net that solves XOR in Ruby is. ML is algebra and optimization — not magic.</description>
    </item>
    <item>
      <title>Gradient descent, visually explained</title>
      <link>https://ovini.site/blog/en/gradient-descent-visually-explained.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/gradient-descent-visually-explained.html</guid>
      <pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ml</category>
      <description>Cost function is a surface. Derivative is slope. θ = θ − α·∇J(θ). Every neural net you've ever heard of is this rule, repeated.</description>
    </item>
    <item>
      <title>epoll and io_uring, explained visually</title>
      <link>https://ovini.site/blog/en/epoll-and-io-uring-explained-visually.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/epoll-and-io-uring-explained-visually.html</guid>
      <pubDate>Thu, 30 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>infra</category>
      <description>Blocking IO → select → poll → epoll → io_uring. Every step exists because the previous one stalled. Async isn't a language feature, it's a kernel feature.</description>
    </item>
    <item>
      <title>How the Linux kernel actually receives an HTTP request</title>
      <link>https://ovini.site/blog/en/how-the-linux-kernel-actually-receives-an-http-request.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-the-linux-kernel-actually-receives-an-http-request.html</guid>
      <pubDate>Thu, 23 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>infra</category>
      <description>NIC → driver → IRQ → softirq → IP → TCP → socket buffer → accept queue → Puma. Your framework is the last 5% of the request. The rest is kernel.</description>
    </item>
    <item>
      <title>The &quot;exactly once&quot; myth</title>
      <link>https://ovini.site/blog/en/the-exactly-once-myth.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/the-exactly-once-myth.html</guid>
      <pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>Exactly-once doesn't exist on the network. What exists is at-least-once plus idempotency. Stop chasing a marketing myth — design for reality and sleep at night.</description>
    </item>
    <item>
      <title>How to avoid retry storms in background jobs</title>
      <link>https://ovini.site/blog/en/how-to-avoid-retry-storms-in-background-jobs.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-to-avoid-retry-storms-in-background-jobs.html</guid>
      <pubDate>Thu, 09 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>External API goes down. 100k Sidekiq jobs decide to retry at the same time. Jitter, circuit breaker, DLQ — retry isn't a fix, it's a deferral strategy.</description>
    </item>
    <item>
      <title>Idempotency in real systems</title>
      <link>https://ovini.site/blog/en/idempotency-in-real-systems.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/idempotency-in-real-systems.html</guid>
      <pubDate>Thu, 02 Apr 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>distributed</category>
      <description>At-least-once is reality. A unique constraint is the only real guarantee. Idempotency-Key, dedupe tables — survival in distributed systems.</description>
    </item>
    <item>
      <title>Lock contention: the silent killer in PostgreSQL</title>
      <link>https://ovini.site/blog/en/lock-contention-the-silent-killer-in-postgresql.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/lock-contention-the-silent-killer-in-postgresql.html</guid>
      <pubDate>Thu, 26 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>A 10ms migration that freezes production for 40 minutes. ALTER TABLE grabbing ACCESS EXCLUSIVE. pg_locks + pg_stat_activity. Locks are invisible — until they aren't.</description>
    </item>
    <item>
      <title>What VACUUM actually does in PostgreSQL</title>
      <link>https://ovini.site/blog/en/what-vacuum-actually-does-in-postgresql.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/what-vacuum-actually-does-in-postgresql.html</guid>
      <pubDate>Thu, 19 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>MVCC, dead tuples, bloat, autovacuum, transaction wraparound. VACUUM isn't cleanup — it's how Postgres works. Ignoring it is how you wake up at 3am.</description>
    </item>
    <item>
      <title>EXPLAIN ANALYZE should be mandatory</title>
      <link>https://ovini.site/blog/en/explain-analyze-should-be-mandatory.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/explain-analyze-should-be-mandatory.html</guid>
      <pubDate>Thu, 12 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>postgres</category>
      <description>Junior runs the query. Senior runs the query plan. Seq Scan, Index Scan, Bitmap Heap, estimated vs actual, BUFFERS — reading the plan isn't optional, it's the job.</description>
    </item>
    <item>
      <title>You DON'T understand Rails until you understand the full Request cycle</title>
      <link>https://ovini.site/blog/en/you-don-t-understand-rails-until-you-understand-the-full-request-cycle.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/you-don-t-understand-rails-until-you-understand-the-full-request-cycle.html</guid>
      <pubDate>Thu, 05 Mar 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>rails</category>
      <description>Rails isn't magic. Rails is Rack, TCP, threads, middleware, SQL and Ruby objects on the heap. Understand what happens before and after your controller.</description>
    </item>
    <item>
      <title>Refactoring a monolith without blowing up production</title>
      <link>https://ovini.site/blog/en/refactoring-a-monolith-without-blowing-up-production.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/refactoring-a-monolith-without-blowing-up-production.html</guid>
      <pubDate>Thu, 26 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>architecture</category>
      <description>Microservices aren't the answer. Refactoring a monolith is an art — strangler fig, feature flags, stepwise schema migration. What nobody tells you about the process.</description>
    </item>
    <item>
      <title>How to identify a performance bottleneck in minutes</title>
      <link>https://ovini.site/blog/en/how-to-identify-a-performance-bottleneck-in-minutes.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-to-identify-a-performance-bottleneck-in-minutes.html</guid>
      <pubDate>Thu, 19 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>performance</category>
      <description>Every slow app has ONE dominant bottleneck. Guessing doesn't cut it. Learn the suspect hierarchy, the right tools and the workflow that goes straight to the cause.</description>
    </item>
    <item>
      <title>Debugging memory leaks in Ruby without crying</title>
      <link>https://ovini.site/blog/en/debugging-memory-leaks-in-ruby-without-crying.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/debugging-memory-leaks-in-ruby-without-crying.html</guid>
      <pubDate>Thu, 12 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>performance</category>
      <description>Ruby has a GC. So classic leaks don't really exist. What does exist is bloat — and knowing the difference is what separates senior from junior here.</description>
    </item>
    <item>
      <title>Writing a simple DSL from scratch in Ruby</title>
      <link>https://ovini.site/blog/en/writing-a-simple-dsl-from-scratch-in-ruby.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/writing-a-simple-dsl-from-scratch-in-ruby.html</guid>
      <pubDate>Thu, 05 Feb 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Rails, RSpec, Sidekiq, Devise — every famous gem is a DSL. And none of them is magic. They're simple metaprogramming tricks you can replicate in an afternoon.</description>
    </item>
    <item>
      <title>How ActiveRecord builds SQL under the hood</title>
      <link>https://ovini.site/blog/en/how-activerecord-builds-sql-under-the-hood.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-activerecord-builds-sql-under-the-hood.html</guid>
      <pubDate>Thu, 29 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>rails</category>
      <description>You're not building SQL. You're building a tree. Understand Arel, bind parameters, lazy evaluation and the real difference between includes, preload and eager_load.</description>
    </item>
    <item>
      <title>Ancestors chain: how Ruby actually resolves methods</title>
      <link>https://ovini.site/blog/en/ancestors-chain-how-ruby-actually-resolves-methods.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/ancestors-chain-how-ruby-actually-resolves-methods.html</guid>
      <pubDate>Thu, 22 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>The favorite interview question to separate a Rubyist from someone who just writes Ruby. Include, prepend, singleton classes — every doubt has the same answer.</description>
    </item>
    <item>
      <title>How Ruby resolves methods internally</title>
      <link>https://ovini.site/blog/en/how-ruby-resolves-methods-internally.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/how-ruby-resolves-methods-internally.html</guid>
      <pubDate>Thu, 15 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>When you call user.name, Ruby performs a ritual. Method lookup, inline cache, method_missing, singleton classes — the real mechanics behind a simple call.</description>
    </item>
    <item>
      <title>GIL: the lock every Rubyist needs to understand</title>
      <link>https://ovini.site/blog/en/gil-the-lock-every-rubyist-needs-to-understand.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/gil-the-lock-every-rubyist-needs-to-understand.html</guid>
      <pubDate>Thu, 08 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Ruby has no real parallelism because of the GIL — a half-truth said with confidence. Understand the GVL for real, when threads help and when they become traps.</description>
    </item>
    <item>
      <title>Understanding Ruby's runtime (not just the language)</title>
      <link>https://ovini.site/blog/en/understanding-ruby-s-runtime-not-just-the-language.html</link>
      <guid isPermaLink="true">https://ovini.site/blog/en/understanding-ruby-s-runtime-not-just-the-language.html</guid>
      <pubDate>Thu, 01 Jan 2026 12:00:00 GMT</pubDate>
      <dc:creator>Vinicius Pereira</dc:creator>
      <category>ruby</category>
      <description>Most know the language. Almost none know the runtime. YARV, heap, GC, GVL, inline cache — where engineering lives and where production bugs are born.</description>
    </item>
  </channel>
</rss>
