<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Austin&apos;s Blog</title><description>Austin Raey&apos;s blog about web development, design, and technology.</description><link>https://raey.me</link><language>en-us</language><lastBuildDate>Fri, 22 May 2026 00:47:17 GMT</lastBuildDate><image><title>Austin Raey</title><url>https://raey.me//assets/portrait.avif</url><link>https://raey.me/</link></image><item><title>Multiple NEXT.JS instances with NGINX</title><link>https://raey.me/blog/2024/multiple-nextjs-nginx</link><guid isPermaLink="true">https://raey.me/blog/2024/multiple-nextjs-nginx</guid><description>Getting two NEXT.JS instances to play nice together on the same server</description><content:encoded>&lt;p&gt;import RelatedLinks from &amp;quot;&lt;del&gt;/components/mdx/related-links.astro&amp;quot;;
import TLDR from &amp;quot;&lt;/del&gt;/components/mdx/tldr.astro&amp;quot;;&lt;/p&gt;
&lt;TLDR&gt;
	If you want to run multiple NEXT.JS instances on the same server, you can use
	the `assetPrefix` configuration option in NEXT.JS to serve build artifacts
	from different directories. Then, you can configure NGINX to proxy requests to
	the correct instance based on the path.
&lt;/TLDR&gt;&lt;p&gt;&amp;lt;RelatedLinks
	links={[
		{
			title: &amp;quot;Multi-Zones&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/deploying/multi-zones&quot;&gt;https://nextjs.org/docs/app/building-your-application/deploying/multi-zones&lt;/a&gt;&amp;quot;,
			description: &amp;quot;Deploying multiple Next.js apps on the same domain&amp;quot;
		},
		{
			title: &amp;quot;NGINX Documentation&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://nginx.org/en/docs/&quot;&gt;https://nginx.org/en/docs/&lt;/a&gt;&amp;quot;,
			description:
				&amp;quot;Official NGINX documentation for reverse proxy configuration&amp;quot;
		},
		{
			title: &amp;quot;assetPrefix - Next.js&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/next-config-js/assetPrefix&quot;&gt;https://nextjs.org/docs/app/api-reference/next-config-js/assetPrefix&lt;/a&gt;&amp;quot;,
			description:
				&amp;quot;Next.js configuration option for serving assets from a different path&amp;quot;
		},
		{
			title: &amp;quot;Docker&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://www.docker.com/&quot;&gt;https://www.docker.com/&lt;/a&gt;&amp;quot;,
			description:
				&amp;quot;Containerization platform that can help manage multiple instances&amp;quot;
		}
	]}
/&amp;gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;Recently at work, it has come up that we want to incrementally update &lt;em&gt;specific&lt;/em&gt; paths in our app with the latest version of NEXT.JS (15). The old app is also based on an older version of NEXT.JS (10), but would require non-trivial changes to upgrade &amp;mdash; so we are opting to rebuild the app from scratch.&lt;/p&gt;
&lt;p&gt;Prior to this, other upgrades or rewrites had allowed us to directly host the app on a new subdomain and server, because they were small enough to do it all at once. This time, however, we do not have this luxury.&lt;/p&gt;
&lt;p&gt;Both apps are hosted / run / deployed on the same server.&lt;/p&gt;
&lt;/section&gt;&lt;section&gt;&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;When running multiple NEXT.JS instances on the same server, your biggest problem is the &lt;code&gt;/_next&lt;/code&gt; folder. Without configuration, artifacts from &lt;strong&gt;both instances&lt;/strong&gt; are served from this directory. This means requests made to any particular path, e.g. &lt;code&gt;/profile&lt;/code&gt;, will have Next artifacts served from &lt;code&gt;/_next&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, even if you correctly proxy requests to the correct NEXT.JS instance per path, the browser will still load the wrong assets. Depending on the instance hit, with no configuration, it will attempt to request &lt;code&gt;_next&lt;/code&gt; and get assets on whatever instance is the default for the server.&lt;/p&gt;
&lt;p&gt;In some suggestions I&amp;#39;ve found online, they often might refer to changing the &lt;code&gt;basePath&lt;/code&gt; in the &lt;code&gt;next.config.js&lt;/code&gt; file &amp;mdash; but this is &lt;em&gt;not&lt;/em&gt; feasible for our situation. Both instances theoretically could have the same paths in the future (&lt;em&gt;the new app is simply a remake of the old one!&lt;/em&gt;), and the new app needs to be able to replace those incrementally. For instance, the new app might have a &lt;code&gt;/profile&lt;/code&gt; path, and the old app might have a &lt;code&gt;/profile&lt;/code&gt; path. However, with &lt;code&gt;basePath&lt;/code&gt; configured on the new app, we&amp;#39;d have something weird to deal with like how we are supposed to route to &lt;code&gt;/${basePath}/profile&lt;/code&gt; for the new app, but make it look like &lt;code&gt;/profile&lt;/code&gt; to the end user browser. I&amp;#39;m sure it&amp;#39;s possible with some NGINX configuration or NEXT.JS &lt;code&gt;middleware.ts&lt;/code&gt; config, but &lt;code&gt;assetPrefix&lt;/code&gt; was much simpler for us.&lt;/p&gt;
&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;In a nutshell, the idea to solve this is to have NEXT serve its artifacts from a different directory for each instance. This way, the browser will load the correct assets for each path.&lt;/p&gt;
&lt;p&gt;In our case, we use NGINX to proxy requests to the correct instance based on the path.&lt;/p&gt;
&lt;p&gt;Thankfully, NEXT.JS has a configuration option to change the directory where it serves its build artifacts from &amp;mdash; &lt;code&gt;assetPrefix&lt;/code&gt;. This in tandem with NGINX allows us to serve the correct assets for each instance per path with no strange configuration rot. I&amp;#39;m sure this could also apply to other reverse proxies, but I have not tried it because NGINX is what we use.&lt;/p&gt;
&lt;small&gt;
	**Note**: NEXT.JS doesn&apos;t seem to note in its documentation when the
	`assetPrefix` configuration was first added. From a quick Google search, the
	earliest I could find was [from at least **version
	9.5.2**](https://stackoverflow.com/questions/63347780/nextjs-assetprefix-and-basepath-prefix-not-taking-effect).
&lt;/small&gt;&lt;p&gt;Here&amp;#39;s a rough outline of the steps to get this working:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On at least one of your NEXT.JS instances, configure &lt;code&gt;assetPrefix&lt;/code&gt; to be unique, e.g. &lt;code&gt;v2&lt;/code&gt; for the new app.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;/** @type {import(&amp;#39;next&amp;#39;).NextConfig} */
const nextConfig = {
    assetPrefix: &amp;quot;/v2&amp;quot;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For something repeatable, you could simply assign a unique identifier to each instance, e.g. &lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;v2&lt;/code&gt;, etc, as a rule so every app is consistent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optional&lt;/strong&gt;: Although it is possible this might not matter for your apps, I had noticed for our two apps, we used an &lt;code&gt;app/api&lt;/code&gt; / &lt;code&gt;pages/api&lt;/code&gt; directory for our API routes. This causes the same problem as the &lt;code&gt;/_next&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;To solve this, if possible, you can simply change this &lt;code&gt;./api&lt;/code&gt; directory to match your asset prefix, e.g. &lt;code&gt;./v2/api&lt;/code&gt;. This will simplify your NGINX configuration.&lt;/p&gt;
&lt;p&gt;Likewise, you may have to do this for &lt;code&gt;/public&lt;/code&gt; folder assets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure NGINX to proxy requests to the correct instance based on the path.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx&quot;&gt;server {
    listen 80;
    server_name example.com;

    # The old app will the default for arbitrary paths.
    location / {
        proxy_pass http://localhost:3000;
    }

    # The new app assets will be served from /v2, as configured in `next.config.js`.
    # Because we changed the API routes to match `assetPrefix` (v2/api),
    # this configuration item also applies to them.
    location /v2 {
        proxy_pass http://localhost:3001;
    }

    # Optionally, if you chose to give an `assetPrefix` to all apps, also configure them.
    location /v1 {
        proxy_pass http://localhost:3000;
    }

    # Incrementally pass routes to the new NEXT.JS app as they are created.
    location /profile {
        proxy_pass http://localhost:3001;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;#39;s basically it! With this configuration, you should be able to run multiple NEXT.JS instances on the same server and have them play nice together.&lt;/p&gt;
&lt;p&gt;For our case, this is thankfully enough &amp;mdash; the stickiest situation we could have in future is a catch-all route we have on the root &lt;code&gt;/{catch-all}&lt;/code&gt;. Once this catch-all view is reimplemented, I believe it will make sense to switch the &lt;code&gt;location /&lt;/code&gt; configuration to point at the new app, then point other &lt;code&gt;location /{path}&lt;/code&gt; configurations to the old app.&lt;/p&gt;
&lt;p&gt;Something to keep in mind is structuring your routes in such a way that there is little potential for overlap. For example, having a &lt;code&gt;/profile&lt;/code&gt; client component query some random &lt;code&gt;/otherpath/api-route&lt;/code&gt; path could potentially cause collisions between the old and new app, especially if you are re-implementing the API routes as well. It may be best to ensure everything stays organized &amp;ndash; e.g. in your &lt;code&gt;v2/api&lt;/code&gt; folder &amp;ndash; or you may end up with a messy / confusing NGINX configuration.&lt;/p&gt;
&lt;p&gt;However &amp;mdash; and I&amp;#39;m just thinking out loud &amp;mdash; you may intend for the &lt;em&gt;new app&lt;/em&gt; to query server routes in the &lt;em&gt;old app&lt;/em&gt; for some reason, but you would need to ensure that old API route is robust. That certainly could be an intersting use case.&lt;/p&gt;
&lt;p&gt;For more literature on this topic, I originally found the idea of using &lt;code&gt;assetPrefix&lt;/code&gt; hidden within NEXT.JS&amp;#39;s documentation on &lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/deploying/multi-zones&quot;&gt;&amp;quot;Multi-Zones&amp;quot;&lt;/a&gt;. This also includes some more info on writing middleware / rewrites for your app, which could be useful for more complex configurations. In our case, simply configuring &lt;code&gt;assetPrefix&lt;/code&gt; with a simple NGINX configuration was enough.&lt;/p&gt;
&lt;/section&gt;</content:encoded><category>tutorial</category><category>framework</category><author>Austin Raey</author></item><item><title>Identify Memory Leaks in Node.js</title><link>https://raey.me/blog/2025/identify-memory-leaks-node</link><guid isPermaLink="true">https://raey.me/blog/2025/identify-memory-leaks-node</guid><description>How to find and fix memory leaks in your Node.js applications, specifically with Next.js</description><content:encoded>&lt;p&gt;import RelatedLinks from &amp;quot;&lt;del&gt;/components/mdx/related-links.astro&amp;quot;;
import UnderConstruction from &amp;quot;&lt;/del&gt;/components/mdx/under-construction.astro&amp;quot;;&lt;/p&gt;
&lt;UnderConstruction /&gt;&lt;p&gt;&amp;lt;RelatedLinks
	links={[
		{
			title: &amp;quot;Node.js Memory Leaks&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://nodejs.org/en/docs/guides/diagnostics/memory-leaks/&quot;&gt;https://nodejs.org/en/docs/guides/diagnostics/memory-leaks/&lt;/a&gt;&amp;quot;
		},
		{
			title: &amp;quot;Next.js Memory Management&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/optimizing-performance#memory-management&quot;&gt;https://nextjs.org/docs/app/building-your-application/optimizing-performance#memory-management&lt;/a&gt;&amp;quot;
		},
		{
			title: &amp;quot;Heap Profiling with Chrome DevTools&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://developers.google.com/web/tools/chrome-devtools/memory-problems&quot;&gt;https://developers.google.com/web/tools/chrome-devtools/memory-problems&lt;/a&gt;&amp;quot;
		},
		{
			title: &amp;quot;Docker Memory Limits&amp;quot;,
			href: &amp;quot;&lt;a href=&quot;https://docs.docker.com/config/containers/resource_constraints/#memory&quot;&gt;https://docs.docker.com/config/containers/resource_constraints/#memory&lt;/a&gt;&amp;quot;
		}
	]}
/&amp;gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;Recently, I had to deal with my very first memory leak in a Node.js application! Lines go up is generally great, but this is probably the last place you want to see it:&lt;/p&gt;
&lt;/section&gt;</content:encoded><category>bug</category><author>Austin Raey</author></item><item><title>My Thoughts on Dependencies</title><link>https://raey.me/blog/2026/thoughts-on-dependencies</link><guid isPermaLink="true">https://raey.me/blog/2026/thoughts-on-dependencies</guid><description>Reflections on managing dependencies in modern web development.</description><content:encoded>&lt;p&gt;import RelatedLinks from &amp;quot;&lt;del&gt;/components/mdx/related-links.astro&amp;quot;;
import TLDR from &amp;quot;&lt;/del&gt;/components/mdx/tldr.astro&amp;quot;;
import InlineFootnote from &amp;quot;~/components/mdx/inline-footnote.astro&amp;quot;;&lt;/p&gt;
&lt;TLDR&gt;
	In my experience, less is more when it comes to dependencies. Each added
	depedency is liability. Dependencies should be added only when they help hit
	requirements that would otherwise be unweildy to maintain in-house. In any
	case, careful consideration should be given.
&lt;/TLDR&gt;&lt;section&gt;&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I figure I&amp;#39;d throw my two cents in on the extremely tired topic of dependencies as it pertains to web development; specifically &amp;quot;packages&amp;quot;. I&amp;#39;ll be referring to these as &amp;quot;dependencies&amp;quot; or &amp;quot;packages&amp;quot;, but think of these as the things you install via a package manager like NPM, PNPM, yarn, bun, etcetera. I am certainly shouting into the void here, but I&amp;#39;d like to just document my thoughts on this (and practice writing!).&lt;/p&gt;
&lt;p&gt;It is no secret that it&amp;#39;s &lt;a href=&quot;https://www.npmjs.com/package/is-even&quot;&gt;kind of a meme&lt;/a&gt; that NPM and the JavaScript ecosystem in general can quickly blow up any project with a massive number of dependencies. Through a project&amp;#39;s lifecycle, if you&amp;#39;re not careful, you can easily end up with something unmanageable.&lt;/p&gt;
&lt;p&gt;Personally, it even irks me when installing otherwise immutable (I&amp;#39;ll also call them &amp;quot;first-party&amp;quot;) depedencies like &lt;code&gt;next&lt;/code&gt; or &lt;code&gt;react&lt;/code&gt; and seeing a multi-thousand line lockfile (sometimes tens of thousands!) (or rather, hundreds if using &lt;code&gt;bun&lt;/code&gt;) get generated. On must wonder how much electricity and network bits are wasted every year globally installing all these. To be fair though, there is not much we can do about to reduce bloat on these otherwise &amp;quot;immutable&amp;quot; ones, other than choosing another framework or tool. We don&amp;#39;t always have that luxury. Also, these large frameworks (usually) follow good practices in terms of maintenance and security - so you can concern yourself a little less with what choices they make.&lt;/p&gt;
&lt;p&gt;In a vaccum - I suppose there is no problem having 3 dependencies or 3,000, so long as they produce a working project that is secure and works. The issue, as with many things in life, comes down to maintenance, risk management, and ownership (i.e., things that happen over time).&lt;/p&gt;
&lt;p&gt;There is also a pie in the sky thought that, in theory, more dependencies is actually better - as each dependency added for whatever feature you&amp;#39;re building will be thoroughly vetted by some community (for security, performance, accessibility, etc.) - freeing you to focus on your product. In practice though, many factors work against this ideal.&lt;/p&gt;
&lt;/section&gt;&lt;section&gt;
## My Thoughts&lt;small&gt;
	Everything I write here is purely my opinion and likely mutable. But there are
	a finite number of characters I am willing to type on this topic. As with many
	things, there is so much additional context or nuance that could be added that
	change or modify my opinions on these things. But here are some of my core
	beliefs:
&lt;/small&gt;&lt;p&gt;In my opinion, dependencies should almost never be added to an application unless they are solving an issue that would otherwise be very time-consuming to build in-house. And I would really, really consider carefully your ability to create functionality that you consider impossible or unweildy as well - often times, a simpler solution with simpler requirements is possible, or, the &amp;quot;complicated&amp;quot; thing is actually not so complicated to write after all.&lt;/p&gt;
&lt;p&gt;Any dependency added is more liability. While you are offloading some work to a 3rd party, the buck stops with you if something breaks in the application. If that something breaking is due to a dependency, it is often times &lt;em&gt;not&lt;/em&gt; trivial to fix, and now it&amp;#39;s your problem to debug, fix, or work around. Your PM or Product Owner does not care you used TanStack Table for their data view, they just want it to work.&lt;/p&gt;
&lt;small&gt;
	*To be fair in this contrived example, this line of thought is potentially a
	bit toxic - I think if Tanstack provides you with a lot of value, it could be
	worth pushing back and asking for more time to integrate it properly.*
&lt;/small&gt;&lt;p&gt;When dependencies are added, the following is likely to come into play as time goes on.&lt;/p&gt;
&lt;h3&gt;Maintenance Burden:&lt;/h3&gt;
&lt;p&gt;Immutable dependencies will need to be updated over time. This can happen for many reasons, such as security concerns, performance considerations, or new features - or worse, pressure from 3rd parties. Often times, these updates can introduce breaking changes or require significant effort to integrate. This is especially true for dependencies which themselves depend on your framework.&lt;/p&gt;
&lt;p&gt;Even something as simple as a framework upgrade can cause several downline dependencies to start throwing peer dependency warnings. While often times these are harmless, they can also indicate that some features you rely on may break -- and unfortunately, it&amp;#39;s up to you now to test and verify this.&lt;/p&gt;
&lt;p&gt;These problems are often magnified the older the project is. They come in several flavors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;InlineFootnote id=&quot;1&quot; /&gt; The dependency has new configuration /
implementation hurdles you need to consider if you want to have it work
properly, requiring you to revisit documentation&lt;/li&gt;
&lt;li&gt;The dependency is no longer maintained by the original author(s)&lt;/li&gt;
&lt;li&gt;The dependency has breaking changes you depended on before and now need to adapt&lt;/li&gt;
&lt;li&gt;Rarer to see nowawdays, but sometimes a completely new pattern of usage is introduced that requires a larger rewrite (e.g., class to functional components in React)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;#39;s certainly not limited to these and can compound on each other, especially with time and amount. The easiest way to avoid this is to not have the dependency in the first place. You&amp;#39;ll even run into these issues anyways if you keep deps to a minimum and only use first party ones, although those issues tend to be resolved more quickly and with less friction.&lt;/p&gt;
&lt;InlineFootnote id=&quot;1&quot;&gt;
	In my experience, this is the most common issue I run into, even with smaller
	updates and/or well-maintained dependencies.
&lt;/InlineFootnote&gt;&lt;h3&gt;Risk Surface:&lt;/h3&gt;
&lt;p&gt;Each dependency added implicitly introduces more issues of the same kind you already face with your in-house code. External dependencies (even first-party/immutable ones) introduces lines of code you haven&amp;#39;t written or reviewed. These often manifest as more and more &lt;em&gt;time&lt;/em&gt; passes, and requirements begin to stack:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- **Security Vulnerabilities:** Each dependency is additional attack surface, and no one has the time to audit every line of code in every dependency you use. &amp;lt;small&amp;gt;*Well, maybe some people do.*&amp;lt;/small&amp;gt;

- **Supply Chain Attacks:** Any single depenedency (or their dependencies) can be compromised potentially, and a malicious version can be published to the package registry. Even if the dependencies code is simple or secure, a compromised account can easily change that reality

- **Performance Considerations:** Each dependency might not be tuned to the degree you need it to be for your application. Also in general, adding too many client / application facing dependencies can bloat your bundle and increase execution time. For JAMStack applications (e.g., Cloudflare or Vercel), this can increase your costs quickly. It also could tank your Lighthouse scores if you get too overzelaous.

- **Accessibility Considerations:** You may properly set up your application for accessibility, but jerry-rigging a dependency to be accessible might require hacky workarounds.

- **Business Requirements:** Sometimes a third party dependency might almost align with everything you need your feature to do, except maybe one or two things. However, in my experience, sometimes those one or two things are not trivial to implement under the dependency and require significant hacky workarounds (sorry, `@radix-ui`). This also implicity (or explicitly? lol) lead to a time sink where you could&amp;#39;ve just built the feature yourself once you realized this isn&amp;#39;t going to work out.

- **Vendor Lock-in:** Relying heavily on a specific dependency will require a significant rewrite should it ever need to be replaced (deprecation, better alternatives, etc.). Rewrite complexity increases with the complexity/usage of the dependency.

- **Test Cases:** This could be less of a problem if your tests are not brittle, however, sometimes package updates cause tests to fail and debugging / fixing the issue can be difficult.
&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;&lt;section&gt;
## When I like dependencies&lt;small&gt;
	I think it goes without saying, but of course dependencies are somewhat
	crucial to development. For instance, things like Astro, SvelteKit, Next.js,
	Tanstack... all provide enormous value. You probably don&apos;t want to waste your
	time remaking these yourself, and in large teams, I&apos;d imagine such a thing
	would be detrimental due to knowledge silos.
&lt;/small&gt;&lt;p&gt;I&amp;#39;ll enjoy adding a depenedency to a project for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is a third party service that I&amp;#39;m using the app (think: analytics, authentication, etc.).&lt;/li&gt;
&lt;li&gt;The dependency itself doesn&amp;#39;t have a lot of dependencies. This reduces bloat and complexity.&lt;/li&gt;
&lt;li&gt;It saves time by providing out-of-the-box functionality that would otherwise take significant effort to implement. For example, proper &lt;code&gt;aria&lt;/code&gt; accessibility is difficult to do right.&lt;/li&gt;
&lt;li&gt;Component libraries like Radix / React Aria / Headless are pretty useful for scaffolding projects, although sometimes I grow a little tired of these. The more flexible it is, the better.&lt;ul&gt;
&lt;li&gt;One anecdote I can give is I once had to integrate a combobox that had some complex business logic, and despite us using &lt;code&gt;shadcn-ui&lt;/code&gt; in our app, this integration entirely fell short. It ended up being easier making our own.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;&lt;section&gt;
## Closing Thoughts&lt;p&gt;I think above all else, don&amp;#39;t underestimate your ability to make your own features. A lot of times, the functionality is simple enough -- there&amp;#39;s no need to bloat a repository to acheive it. I think there is a certain elegance in keeping things simple.&lt;/p&gt;
&lt;/section&gt;</content:encoded><category>personal</category><author>Austin Raey</author></item><item><title>Use Exact Versions</title><link>https://raey.me/blog/2026/use-exact-versions</link><guid isPermaLink="true">https://raey.me/blog/2026/use-exact-versions</guid><description>In my opinion, using exact versions for dependencies is essential.</description><content:encoded>&lt;p&gt;import TLDR from &amp;quot;&lt;del&gt;/components/mdx/tldr.astro&amp;quot;;
import UnderConstruction from &amp;quot;&lt;/del&gt;/components/mdx/under-construction.astro&amp;quot;;&lt;/p&gt;
&lt;UnderConstruction /&gt;&lt;TLDR&gt;
	Instead of using `^` for dependency versions, use exact versions as much as
	possible. It will save you headaches during deployment and potentially save
	you from supply chain attacks.
&lt;/TLDR&gt;</content:encoded><category>personal</category><author>Austin Raey</author></item></channel></rss>