<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><description>Designing software systems and thinking about why most of them hurt.&#xA;Rails, JavaScript, architecture, product.&#xA;&#xA;https://syedaslam.com</description><link>https://bsky.app/profile/syedaslam.bsky.social</link><title>@syedaslam.bsky.social - Syed Aslam</title><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mkfcpl7bis2o</link><description>Rails routing isn’t smart.&#xA;&#xA;It’s deterministic.&#xA;&#xA;It matches a request against your route set, in order, and dispatches to the first match.&#xA;&#xA;That single idea explains most routing “mysteries.”&#xA;&#xA;Wrote a breakdown of how it actually works:&#xA;&#xA;https://open.substack.com/pub/railsrevelry/p/how-rails-routing-works-turning-urls?r=4jsb&amp;utm_medium=ios</description><pubDate>26 Apr 2026 10:07 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mkfcpl7bis2o</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mkdxhytxys2g</link><description>New article: Inside the Rails middleware stack.&#xA;&#xA;The core idea: middleware is not a checklist before your controller. It is a chain of Rack wrappers around your app.&#xA;&#xA;That explains sessions, redirects, headers, and why some requests never reach your controller.&#xA;&#xA;https://open.substack.com/pub/railsrevelry/p/inside-the-rails-middleware-stack?r=4jsb&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=true</description><pubDate>25 Apr 2026 21:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mkdxhytxys2g</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mjrgqbgeh22o</link><description>I’ve been wanting to write more about how Rails actually works under the hood, not just how to use it.&#xA;&#xA;So I started RailsRevelry. Explaining what really happens between an HTTP request hitting your app and your controller action running.&#xA;&#xA;https://railsrevelry.substack.com/p/from-rack-to-controller-understanding</description><pubDate>18 Apr 2026 12:26 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mjrgqbgeh22o</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mjhn7xm7k22t</link><description>Understanding the dependency, execution, and behavioral surfaces of a Rails system makes upgrades more predictable.&#xA;&#xA;https://syedaslam.com/posts/a-preflight-for-rails-upgrades/</description><pubDate>14 Apr 2026 14:55 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mjhn7xm7k22t</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mjd6jqkx2k2b</link><description>https://open.substack.com/pub/railsrevelry/p/from-rack-to-controller-understanding?r=4jsb&amp;utm_medium=ios&amp;shareImageVariant=split</description><pubDate>12 Apr 2026 20:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mjd6jqkx2k2b</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3milybldgl22p</link><description>A Rails upgrade rarely fails because of Rails.&#xA;&#xA;It fails because of everything the system has accumulated around it.&#xA;&#xA;Dependency graph&#xA;Runtime&#xA;Infrastructure&#xA;Hidden behavior&#xA;&#xA;The version bump is just where the failure shows up.&#xA;&#xA;https://syedaslam.com/posts/the-signals-that-predict-a-difficult-rails-upgrade/</description><pubDate>03 Apr 2026 14:59 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3milybldgl22p</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mi4u6doay22g</link><description>I maintain a small Ruby gem called duration_in_words, and I just shipped v0.3.1.&#xA;&#xA;It formats ActiveSupport::Duration values like 1.day + 2.hours + 30.minutes into readable strings, with locale-aware output and better pluralization support.&#xA;&#xA;https://github.com/aslam/duration_in_words</description><pubDate>28 Mar 2026 14:35 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mi4u6doay22g</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mhptd3pzoc2g</link><description>Rails upgrades don’t become painful because teams get unlucky. They become hard in predictable ways.&#xA;&#xA;The curve: low friction -&gt; rising friction -&gt; avoidance -&gt; recovery.&#xA;&#xA;The mistake is treating upgrades as execution work. They’re discovery problems first.&#xA;&#xA;https://syedaslam.com/posts/the-upgrade-anxiety-in-mature-systems/</description><pubDate>23 Mar 2026 10:15 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mhptd3pzoc2g</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mgula6ehnk2y</link><description>One of the quiet constraints of software systems is something we rarely talk about explicitly: Every codebase has a local reasoning budget.&#xA;&#xA;When the budget is exceeded, the experience changes dramatically.&#xA;&#xA;https://syedaslam.com/posts/the-local-reasoning-budget-of-a-codebase/</description><pubDate>12 Mar 2026 14:09 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mgula6ehnk2y</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mgahdh4a5k2h</link><description>Got a BSI abuse report via Hetzner: my Postgres (5432) was exposed from a Kamal/Docker deploy.&#xA;&#xA;root cause: port: &#34;5432:5432&#34; published to 0.0.0.0, and UFW didn’t protect it the way I expected.&#xA;&#xA;fix: bind to localhost (127.0.0.1) + verify secrets handling in Kamal 2.x.&#xA;&#xA;https://syedaslam.com/posts/why-the-german-government-emailed-me-about-my-kamal-deployment/</description><pubDate>04 Mar 2026 14:06 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mgahdh4a5k2h</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mfu6ugk7i22i</link><description>New post: Where Rails Apps Actually Slow Down&#xA;&#xA;Rails apps rarely degrade because Rails is slow.&#xA;&#xA;In long-lived systems, the usual causes are hidden query multiplication, layered indirection, and caching masking hot paths.&#xA;&#xA;Performance tuning is often visibility work.&#xA;&#xA;https://syedaslam.com/posts/where-rails-apps-actually-slow-down</description><pubDate>27 Feb 2026 17:02 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mfu6ugk7i22i</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mffb3unqkc2f</link><description>Memoizing with ||= in Ruby looks clean and idiomatic, until your domain evolves and &#34;false&#34; becomes a legitimate cached value.&#xA;&#xA;Here&#39;s why ||= doesn&#39;t mean &#34;if unset&#34; (it means &#34;if falsey&#34;), and how that subtle distinction silently kills performance.&#xA;&#xA;https://syedaslam.com/posts/when-or-equals-betrays-your-memoization/</description><pubDate>21 Feb 2026 18:32 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mffb3unqkc2f</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mel7oekfds2w</link><description>Rails taught me this twice: first, callbacks made flows unclear. Then service objects did the same. The problem isn’t patterns, it’s indirection that overshadows its usefulness. I wrote about how to recognize and cut that decay. &#xA;https://syedaslam.com/posts/when-good-abstractions-age/</description><pubDate>11 Feb 2026 09:58 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mel7oekfds2w</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mdxpoho3x22t</link><description>Wrote a new blog post on why Stimulus works so well in mature Rails apps:&#xA;https://syedaslam.com/posts/stimulus-is-boring</description><pubDate>03 Feb 2026 15:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mdxpoho3x22t</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mcuacscluk2j</link><description>ActiveModel::Serializers (AMS) is archived, yet many Rails apps still use it.&#xA;&#xA;Why? Replacing your serialization layer is scary.</description><pubDate>20 Jan 2026 13:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mcuacscluk2j</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mcki5mtsec2s</link><description>Sometimes the best feature you can add is a constraint. By limiting what users can do, you guarantee the dignity of the content remains intact.</description><pubDate>16 Jan 2026 16:06 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mcki5mtsec2s</guid></item><item><link>https://bsky.app/profile/syedaslam.bsky.social/post/3mcaah5nlps22</link><description>I&#39;ve spent years building software systems.&#xA;Lately, I&#39;m more interested in understanding why they hurt than adding new features.&#xA;&#xA;Posting thoughts as I go.</description><pubDate>12 Jan 2026 14:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:gn7zthmcy3uh7et4642e7qd3/app.bsky.feed.post/3mcaah5nlps22</guid></item></channel></rss>