<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[ren focus | RSS Feed]]></title>
        <description><![CDATA[Metaphysics, tunes, and code]]></description>
        <link>https://renfoc.us</link>
        <image>
            <url>https://renfoc.us/header.webp</url>
            <title>ren focus | RSS Feed</title>
            <link>https://renfoc.us</link>
        </image>
        <generator>RSS for Node</generator>
        <lastBuildDate>Sat, 18 Jul 2026 20:01:29 GMT</lastBuildDate>
        <atom:link href="https://renfoc.us/rss.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Sat, 18 Jul 2026 20:01:29 GMT</pubDate>
        <copyright><![CDATA[All rights reserved 2026]]></copyright>
        <item>
            <title><![CDATA[antipatterns the blob]]></title>
            <description><![CDATA[The Blob is a class or function that has absorbed too many responsibilities over time until nobody fully knows what it does anymore. It shows up in codebases everywhere, even the best ones, and it tends to freeze you the moment you open it. This post names the pattern, walks through how a Blob grows one reasonable addition at a time, and argues that the first step is not always fixing it today but making sure you do not make it worse.]]></description>
            <link>https://renfoc.us/posts/1782490973-antipatterns_the_blob</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1782490973-antipatterns_the_blob</guid>
            <category><![CDATA[antipatterns]]></category>
            <category><![CDATA[refactoring]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[god-object]]></category>
            <category><![CDATA[software-design]]></category>
            <pubDate>Fri, 26 Jun 2026 16:22:53 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[what i look for on code reviews]]></title>
            <description><![CDATA[Nobody formally teaches developers how to review code, so this post shares a personal checklist built from watching teammates and making mistakes. It covers five areas in order: running lint against only the changed files, auditing any new or modified dependencies with npm audit, scanning for anti-patterns like God Objects and dead code, checking for language-specific traps like missing await in JavaScript async functions, and verifying that test coverage includes the happy path, edge cases, and error paths. The lint and dependency steps take minutes and the rest takes judgment, but together they form a review that catches what automated checks miss.]]></description>
            <link>https://renfoc.us/posts/1781810749-what_i_look_for_on_code_reviews</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1781810749-what_i_look_for_on_code_reviews</guid>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[lint]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[antipatterns]]></category>
            <category><![CDATA[javascript]]></category>
            <pubDate>Thu, 18 Jun 2026 19:25:49 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[kratos and mistake literacy]]></title>
            <description><![CDATA[God of War (2005) is used as a lens for examining mistake literacy, the ability to recognize problems before they happen because you have already paid the cost of running into them. The game's repetitive enemy encounters teach players to read the room before reacting, which maps directly to how experienced engineers learn to spot issues early through accumulated failure rather than instruction. The post expresses concern that AI tools entering developers' careers before they have made enough meaningful mistakes may cost the next generation the pattern recognition that only comes from struggling through problems without assistance.]]></description>
            <link>https://renfoc.us/posts/1780007976-kratos_and_mistake_literacy</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1780007976-kratos_and_mistake_literacy</guid>
            <category><![CDATA[games]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[mistakes]]></category>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[ai]]></category>
            <pubDate>Thu, 28 May 2026 22:39:36 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[rust on my bun]]></title>
            <description><![CDATA[After Anthropic acquired Bun.sh, a developer on the team opened a pull request to port the runtime from Zig to Rust using a large language model and a single giant prompt, which set off a wave of community concern and several hundred comments before the PR merged. The Rust codebase quickly accumulated issue tickets pointing out unsafe code and undefined behavior, highlighting the real limits of AI-generated systems code in a production runtime. The post treats the episode as a small, fascinating piece of engineering history and an honest look at what happens when enthusiasm for AI tools runs ahead of verification.]]></description>
            <link>https://renfoc.us/posts/1778877814-rust_on_my_bun</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1778877814-rust_on_my_bun</guid>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[bun]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[ai]]></category>
            <pubDate>Fri, 15 May 2026 20:43:34 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[shielding repos on a budget]]></title>
            <description><![CDATA[This tutorial shows how to enforce pull request discipline on a GitHub repository without a GitHub Enterprise account by combining Husky pre-commit hooks with GitHub Actions. A pre-commit hook blocks direct commits to main, while Actions enforce test coverage thresholds, lint checks, a required Miro link in every PR description, and a bot-controlled ready-to-merge label that can only be added by a reviewer who is not the PR author. The approach is not airtight but raises the floor enough to handle the problems that come from habit and convenience rather than deliberate circumvention.]]></description>
            <link>https://renfoc.us/posts/1776095006-shielding_repos_on_a_budget</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1776095006-shielding_repos_on_a_budget</guid>
            <category><![CDATA[github]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[pull-requests]]></category>
            <category><![CDATA[husky]]></category>
            <pubDate>Mon, 13 Apr 2026 15:43:26 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[the race down]]></title>
            <description><![CDATA[A personal memory of falling down a mountain at age nine during a birthday hike, where the desire to belong and be liked led to a terrifying accident that left a lasting mark. The aftermath shaped a deep habit of guilt and an overactive sense of responsibility for the people he loves, traced back to lying in a hospital bed worrying about inconveniencing his classmate. The essay closes by reaching for the moment just before the fall, hoping that remembering the joy of being included might make it possible to be kinder to the kid who only wanted to belong.]]></description>
            <link>https://renfoc.us/posts/1774107059-the_race_down</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1774107059-the_race_down</guid>
            <category><![CDATA[personal]]></category>
            <category><![CDATA[childhood]]></category>
            <category><![CDATA[guilt]]></category>
            <category><![CDATA[belonging]]></category>
            <category><![CDATA[memory]]></category>
            <pubDate>Sat, 21 Mar 2026 15:30:59 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[my review of metroid fusion]]></title>
            <description><![CDATA[Metroid Fusion is reviewed as essential context for understanding Metroid Dread, praised for threading the needle between freedom and frustration, telling its story entirely through environmental details rather than exposition, and accomplishing remarkable atmosphere within the constraints of GBA hardware. The review pushes back on the common argument that Dread made Fusion obsolete, arguing instead that Dread's improvements are best understood as a conversation with Fusion, not a replacement for it. Two honest caveats are offered: a difficulty spike in the late game that punishes precision on the small handheld form factor, and a few isolated pacing missteps that stand out against an otherwise tightly controlled experience.]]></description>
            <link>https://renfoc.us/posts/1771544324-my_review_of_metroid_fusion</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1771544324-my_review_of_metroid_fusion</guid>
            <category><![CDATA[games]]></category>
            <category><![CDATA[review]]></category>
            <category><![CDATA[metroid]]></category>
            <category><![CDATA[gameboy]]></category>
            <category><![CDATA[atmosphere]]></category>
            <pubDate>Thu, 19 Feb 2026 23:38:44 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[the backlog and existence]]></title>
            <description><![CDATA[The media backlog is examined as both a monument to the impossible and a meaningful act of self-cultivation: technology has removed the physical limits on accumulation, making it easier than ever to collect more books, games, and films than one could consume in a lifetime. Seneca's warning that we waste the time we have sits alongside Aristotle's virtue ethics, which frames the act of curating a backlog as a practice that builds discernment, temperance, and practical wisdom. The post lands on a balanced view where the backlog is worth having for the preserved choice and self-knowledge it offers, as long as organizing it does not replace actually engaging with the art.]]></description>
            <link>https://renfoc.us/posts/1769188897-the_backlog_and_existence</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1769188897-the_backlog_and_existence</guid>
            <category><![CDATA[philosophy]]></category>
            <category><![CDATA[media]]></category>
            <category><![CDATA[stoicism]]></category>
            <category><![CDATA[backlog]]></category>
            <category><![CDATA[self-cultivation]]></category>
            <pubDate>Fri, 23 Jan 2026 17:21:37 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[building a js gameloop]]></title>
            <description><![CDATA[This tutorial explains how to build a browser game loop using requestAnimationFrame, which syncs rendering with the display refresh rate and automatically pauses when the tab is hidden. It walks through a reusable GameLoop class that uses delta time to limit frame rate and keep game speed consistent across different displays, then shows how to plug it into a canvas game and integrate it with React via useEffect. The pattern separates rendering logic from game state updates and provides a clean mechanism to stop the loop when the game ends.]]></description>
            <link>https://renfoc.us/posts/1764713109-building_a_js_gameloop</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1764713109-building_a_js_gameloop</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[games]]></category>
            <category><![CDATA[canvas]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[tutorial]]></category>
            <pubDate>Tue, 02 Dec 2025 22:05:09 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[starting a supabase project]]></title>
            <description><![CDATA[This tutorial walks through setting up a Supabase backend project using Terraform for infrastructure as code, so that all cloud resources are version controlled, reproducible, and free of hardcoded secrets. It covers writing the provider and project resource configuration, managing environment variables safely, and running terraform init, plan, and apply to provision the project. The post then continues with linking the Supabase CLI to the new project, initializing local configuration, and creating the first database migration.]]></description>
            <link>https://renfoc.us/posts/1763486231-starting_a_supabase_project</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1763486231-starting_a_supabase_project</guid>
            <category><![CDATA[supabase]]></category>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[infrastructure]]></category>
            <category><![CDATA[tutorial]]></category>
            <pubDate>Tue, 18 Nov 2025 17:17:11 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[call bind or apply]]></title>
            <description><![CDATA[JavaScript functions have three methods for controlling what "this" refers to inside them: call, apply, and bind. Call and apply both invoke a function immediately with a specified "this" value, differing only in how extra arguments are passed (individually for call, as an array for apply). Bind does not invoke the function at all but returns a new function with "this" permanently locked to the given value, ready to be called later.]]></description>
            <link>https://renfoc.us/posts/1762973191-call_bind_or_apply</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1762973191-call_bind_or_apply</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[this-keyword]]></category>
            <category><![CDATA[functions]]></category>
            <category><![CDATA[tutorial]]></category>
            <category><![CDATA[binding]]></category>
            <pubDate>Wed, 12 Nov 2025 18:46:31 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[this quirky javascript]]></title>
            <description><![CDATA[This post explains how the value of "this" in JavaScript is determined by how a function is called rather than where it is written, which is fundamentally different from how other variables work. It walks through the four binding rules (default, implicit, explicit, and arrow functions) using an interview question about a "once" wrapper as the central example. The key takeaway is that regular functions should be used when you need "this" from the call site and arrow functions when you want "this" captured from the surrounding scope.]]></description>
            <link>https://renfoc.us/posts/1762298703-this_quirky_javascript</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1762298703-this_quirky_javascript</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[this-keyword]]></category>
            <category><![CDATA[arrow-functions]]></category>
            <category><![CDATA[binding]]></category>
            <category><![CDATA[interviews]]></category>
            <pubDate>Tue, 04 Nov 2025 23:25:03 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[from ad chaos to clarity]]></title>
            <description><![CDATA[When malicious ads start appearing on a news site and the engineering team has no direct control over them, a junior developer named Bob solves the problem not with clever code but by calling the ad network and asking questions until he finds a lever he can pull. The story follows Bob building a simple browser extension that lets editors identify and report bad ad providers, restoring trust between departments and giving engineers their time back. It is a quiet argument that curiosity, communication, and the willingness to try the obvious thing are often more valuable than technical sophistication.]]></description>
            <link>https://renfoc.us/posts/1759258235-from_ad_chaos_to_clarity</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1759258235-from_ad_chaos_to_clarity</guid>
            <category><![CDATA[communication]]></category>
            <category><![CDATA[problem-solving]]></category>
            <category><![CDATA[curiosity]]></category>
            <category><![CDATA[teamwork]]></category>
            <category><![CDATA[leadership]]></category>
            <pubDate>Tue, 30 Sep 2025 18:50:35 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[the poison within patriotism]]></title>
            <description><![CDATA[A personal account of being treated as a foreign visitor despite being a legal citizen illustrates how patriotism draws lines that exclude people regardless of their contributions or legal standing. Martha Nussbaum's critique of patriotic education is used to argue that teaching loyalty to one's country above all else blinds people to shared global humanity and produces the kind of nationalism that fuels immigration fights and dehumanization. The post calls for embracing world citizenship and seeing each other as members of the same team rather than as rivals divided by borders.]]></description>
            <link>https://renfoc.us/posts/1755103186-the_poison_within_patriotism</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1755103186-the_poison_within_patriotism</guid>
            <category><![CDATA[patriotism]]></category>
            <category><![CDATA[identity]]></category>
            <category><![CDATA[philosophy]]></category>
            <category><![CDATA[immigration]]></category>
            <category><![CDATA[humanity]]></category>
            <pubDate>Wed, 13 Aug 2025 16:39:46 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[a haunting musical kaleidoscope]]></title>
            <description><![CDATA[The Moog Subharmonicon generates music by mathematically dividing a root frequency into subharmonics, creating rich textures that can sound consonant or hauntingly wrong depending on the divisor, because higher integers produce microtonal intervals that fall between the notes of standard Western scales. Quantization can snap the fundamental oscillators to familiar tuning systems like 12-ET or just intonation, but it cannot fix the subharmonics themselves, which remain pure mathematical ratios. Learning the instrument means developing an ear for harmonic relationships that simply don't exist in conventional music, and a companion JavaScript tool on the site lets you hear these divisions interactively.]]></description>
            <link>https://renfoc.us/posts/1755014540-a_haunting_musical_kaleidoscope</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1755014540-a_haunting_musical_kaleidoscope</guid>
            <category><![CDATA[music]]></category>
            <category><![CDATA[moog]]></category>
            <category><![CDATA[subharmonics]]></category>
            <category><![CDATA[synthesis]]></category>
            <category><![CDATA[math]]></category>
            <pubDate>Tue, 12 Aug 2025 16:02:20 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[need more Bertrand and less Seneca]]></title>
            <description><![CDATA[Stoicism offers useful armor against emotional pain by focusing on what's within your control, but its emotional minimalism can become too much armor when what you need is to feel alive again rather than just endure. Bertrand Russell's approach in The Conquest of Happiness offers a warmer alternative: happiness comes from growing your interests outward, engaging with the world, and seeking connection rather than retreating inward. The post is a personal reflection on finding that Stoicism is good for survival but Russell is better for rediscovering joy.]]></description>
            <link>https://renfoc.us/posts/1748907707-need_more_Bertrand_and_less_Seneca</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1748907707-need_more_Bertrand_and_less_Seneca</guid>
            <category><![CDATA[philosophy]]></category>
            <category><![CDATA[stoicism]]></category>
            <category><![CDATA[happiness]]></category>
            <category><![CDATA[bertrand-russell]]></category>
            <category><![CDATA[mental-health]]></category>
            <pubDate>Mon, 02 Jun 2025 23:41:47 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[ai is easy with huggingface]]></title>
            <description><![CDATA[This tutorial walks JavaScript developers through using Hugging Face's pretrained models to add AI features to their projects without training models from scratch. It explains the pipeline abstraction, which handles data ingestion, model inference, and output in a single call, and surveys common pipeline types like summarization, translation, and text classification. By the end, any JS developer should feel equipped to incorporate machine learning into their work using Hugging Face's JavaScript library.]]></description>
            <link>https://renfoc.us/posts/1748281271-ai_is_easy_with_huggingface</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1748281271-ai_is_easy_with_huggingface</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[huggingface]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[tutorial]]></category>
            <pubDate>Mon, 26 May 2025 17:41:11 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[what happened to pwas]]></title>
            <description><![CDATA[Progressive Web Apps promised a write once run anywhere future where browser based apps could match native experiences on any device, but inconsistent support from Apple and Mozilla stalled that vision. Apple restricted key PWA APIs on iOS for years, and Firefox quietly removed installation support in 2021, citing low user interest and fragmenting the ecosystem in Chrome's favor. Mozilla's 2025 reintroduction of web app support in Firefox is a tentative hopeful sign that PWAs might yet get a second chance.]]></description>
            <link>https://renfoc.us/posts/1746036083-what_happened_to_pwas</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1746036083-what_happened_to_pwas</guid>
            <category><![CDATA[pwa]]></category>
            <category><![CDATA[browsers]]></category>
            <category><![CDATA[web-standards]]></category>
            <category><![CDATA[mobile]]></category>
            <category><![CDATA[history]]></category>
            <pubDate>Wed, 30 Apr 2025 18:01:23 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[the bare minimum during ai prompt design]]></title>
            <description><![CDATA[AI text generation models are vulnerable to prompt injection attacks, techniques where crafted input steers the model toward unintended goals or leaks sensitive information. This post covers the two main attack types, goal hijacking and prompt leaking, and walks through practical defenses like input validation, instruction precedence, clear delimiters, and stop sequences. Following these practices is the bare minimum needed to keep AI-powered features safe and predictable in production.]]></description>
            <link>https://renfoc.us/posts/1725041521-the_bare_minimum_during_ai_prompt_design</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1725041521-the_bare_minimum_during_ai_prompt_design</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[prompts]]></category>
            <category><![CDATA[injection]]></category>
            <category><![CDATA[llm]]></category>
            <pubDate>Fri, 30 Aug 2024 18:12:01 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[a good commit with empathy]]></title>
            <description><![CDATA[Git commits are a way to save the state of a project, and the commit message carries the responsibility of explaining the why behind each change, not just what the code does. A good message fills in the sentence "If applied, this commit will ___" and includes context like keywords, reasoning, and human-readable explanations that help teammates navigate the codebase. Writing with empathy in commit messages reduces frustration, confusion, and hopelessness on teams working through shared code.]]></description>
            <link>https://renfoc.us/posts/1708455032-a_good_commit_with_empathy</link>
            <guid isPermaLink="true">https://renfoc.us/posts/1708455032-a_good_commit_with_empathy</guid>
            <category><![CDATA[git]]></category>
            <category><![CDATA[commits]]></category>
            <category><![CDATA[empathy]]></category>
            <category><![CDATA[communication]]></category>
            <category><![CDATA[teamwork]]></category>
            <pubDate>Tue, 20 Feb 2024 18:50:32 GMT</pubDate>
        </item>
    </channel>
</rss>