<?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>Forem: Torrin Leonard</title>
    <description>The latest articles on Forem by Torrin Leonard (@torrin).</description>
    <link>https://forem.com/torrin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3254359%2F268d8dc8-3d21-47f7-b272-45768d06fe3b.jpg</url>
      <title>Forem: Torrin Leonard</title>
      <link>https://forem.com/torrin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/torrin"/>
    <language>en</language>
    <item>
      <title>A Time Tracking App Wanted $28,800, So I Replaced It With a Homelab</title>
      <dc:creator>Torrin Leonard</dc:creator>
      <pubDate>Wed, 28 Jan 2026 04:18:13 +0000</pubDate>
      <link>https://forem.com/torrin/a-time-tracking-app-wanted-28800-so-i-replaced-it-with-a-homelab-l7d</link>
      <guid>https://forem.com/torrin/a-time-tracking-app-wanted-28800-so-i-replaced-it-with-a-homelab-l7d</guid>
      <description>&lt;p&gt;My parents run a software testing + consulting company called &lt;a href="https://worx4you.com" rel="noopener noreferrer"&gt;worX4you&lt;/a&gt;. They’ve been doing it for &lt;strong&gt;17 years&lt;/strong&gt;. They’re stable, they’re good at what they do, and their business is not complicated:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hire good people --&amp;gt; small business clients --&amp;gt; track time --&amp;gt; invoice --&amp;gt; repeat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For years they used &lt;strong&gt;Harvest&lt;/strong&gt; for time tracking. Simple product, fair price. Everyone moves on with their life.&lt;/p&gt;

&lt;p&gt;Then Harvest changed their pricing after an acquisition (reported in 2024 as involving private equity firms Montagu and TA Associates). And the vibe went from “boring SaaS you forget about” to “wait, are you serious?” pretty fast.&lt;/p&gt;

&lt;p&gt;We were paying &lt;strong&gt;$9.99 USD per seat&lt;/strong&gt;. Then my parents recieved an email about a pricing change: &lt;strong&gt;$17.50 per seat&lt;/strong&gt;, plus a new “usage” layer where the options were either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$2,000/month&lt;/strong&gt; for “unlimited usage”, or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;usage-based billing capped at $400/month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As of writing, Harvest has not updated their &lt;a href="https://www.getharvest.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; to reflect these increases.&lt;/p&gt;

&lt;p&gt;Maybe you’re thinking: “Enterprise pricing is always weird.” Sure. But this wasn’t a giant enterprise rolling in cash. This is a small business that just wants to log hours and get on with real work.&lt;/p&gt;

&lt;p&gt;So I did what any reasonable person with a mild homelab addiction does:&lt;/p&gt;

&lt;p&gt;I spun up &lt;a href="https://www.kimai.org/" rel="noopener noreferrer"&gt;Kimai&lt;/a&gt;, an open source time tracking alternative, on our home server.&lt;/p&gt;

&lt;p&gt;Now everyone can log hours at our own URL, on our own hardware, for the cost of electricity and an internet connection we’re paying for anyway.&lt;/p&gt;

&lt;p&gt;And here’s the part I can’t stop thinking about:&lt;/p&gt;

&lt;h2&gt;
  
  
  I think this kind of pricing is accelerating open source adoption
&lt;/h2&gt;




&lt;p&gt;Not because everyone suddenly became an “open source purist”.&lt;/p&gt;

&lt;p&gt;But because at some point, the math becomes insulting enough that people start asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait… why are we paying &lt;em&gt;how much&lt;/em&gt;… to record hours?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The pricing breaks the value prop
&lt;/h2&gt;




&lt;p&gt;For context, my parents were on &lt;strong&gt;$9.99 USD per seat&lt;/strong&gt; as a flat fee. Totally reasonable. Then they got a new quote: bump the per-seat price to &lt;strong&gt;$17.50&lt;/strong&gt;, and add a whole new “usage” layer.&lt;/p&gt;

&lt;p&gt;Option one was a &lt;strong&gt;$2,000/month&lt;/strong&gt; flat fee for “unlimited usage”. Option two was “usage-based”, calculated from recent months, capped at &lt;strong&gt;$400/month&lt;/strong&gt;. Which, first of all, how do you even charge “usage” for a time tracking app? People are literally typing numbers into boxes.&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;the weirdest part&lt;/strong&gt;: if we took the usage-based option, we’d have to enable &lt;strong&gt;credit card billing on all invoices&lt;/strong&gt;. Translation: route more of the company’s money flow through Harvest’s credit card billing, and potentially hand over &lt;strong&gt;+3%&lt;/strong&gt; of invoice revenue in processing/platform fees.&lt;/p&gt;

&lt;p&gt;At that point it stops feeling like “time tracking software” and starts feeling like someone found a new place to stick a toll booth or &lt;a href="https://en.wikipedia.org/wiki/Boom_(navigational_barrier)" rel="noopener noreferrer"&gt;boom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If my parents took the “unlimited usage” option, that’s roughly &lt;strong&gt;$400/month&lt;/strong&gt; for seats plus &lt;strong&gt;$2,000/month&lt;/strong&gt; for the unlimited fee.&lt;/p&gt;

&lt;p&gt;In total, my parents would have to pay &lt;strong&gt;$28,800 a year&lt;/strong&gt; for a time tracking app.&lt;/p&gt;

&lt;p&gt;That’s not “a little increase to help out a time tracking startup”. That’s &lt;strong&gt;“congrats, your time tracker is now a mortgage-sized monthly bill.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, hosting Kimai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On a homelab: basically &lt;strong&gt;free&lt;/strong&gt; (already paying for power + internet + old PCs and already bought hardware)&lt;/li&gt;
&lt;li&gt;On a VPS: still basically free compared to &lt;strong&gt;$28,000 A YEAR&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A small VPS on DigitalOcean/Linode/etc is like &lt;strong&gt;$6–$20/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Call it &lt;strong&gt;$120–$240/year&lt;/strong&gt;, plus a domain&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Peanuts. Even accounting for time spent tinkering and setting everything up. &lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;$28,000&lt;/strong&gt; you could hire someone to build a full height rack, set up all the SaaS and IT services you could dream of, and still have enough money left over to buy 16gb of ddr5 for your gaming pc.&lt;/p&gt;

&lt;p&gt;Our homelab was basically a one-time hardware purchase. After that, it’s a fixed platform I can keep extending. I can run dozens of Docker containers on it, hosting open source alternatives to the paid stuff we used to subscribe to, all for about the cost of a Netflix subscription each year.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually did
&lt;/h2&gt;




&lt;p&gt;I’m a fullstack dev, I main Ubuntu on a framework 16, and I LOVE homelab stuff. Been building out a full height rack for years. Currently I have three machines: one is a dedicated 70Tb NAS, another has 2 3080 Ti's for llms + docker containers, the other is dedicated to nginx, routing and more docker. This wasn’t heroicly built. It was just modern infra being very accessible now. I spun up the Kimai in an afternoon of tinkering.&lt;/p&gt;

&lt;p&gt;At a high level, it’s Kimai running in Docker, with Docker running inside a VM on Proxmox. I put Nginx in front so it’s reachable at a clean URL, used Cloudflare for DNS and proxying, and got HTTPS set up with free SSL through Cloudflare. For backups, I rely on Proxmox ZFS snapshots, because I enjoy sleeping.&lt;/p&gt;

&lt;p&gt;Now my parents’ team can log time like they always did, except we control the instance, we control the data, and we control the cost. And Kimai is… fine. It’s not some VC-designed conversion funnel. It’s a time tracker. That’s the point: simple, does the job, set it up once and forget about it. &lt;strong&gt;What we thought we could rely on Harvest for.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The private equity playbook (and why it backfires)
&lt;/h2&gt;




&lt;p&gt;I’m not claiming I know what’s happening inside Harvest. I’m not on the board. I’m not reading internal memos.&lt;/p&gt;

&lt;p&gt;But I &lt;em&gt;have&lt;/em&gt; seen this pattern enough times to recognize the shape of it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buy a stable “boring SaaS” with predictable customers
&lt;/li&gt;
&lt;li&gt;Increase prices hard (especially on teams that can’t easily churn)
&lt;/li&gt;
&lt;li&gt;Add vague fees that are hard to justify (“platform”, “usage”, “success”, etc.)
&lt;/li&gt;
&lt;li&gt;Squeeze revenue now, worry about retention later
&lt;/li&gt;
&lt;li&gt;If customers leave… that’s a next-quarter problem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A pretty common term people use for the worst version of this is &lt;strong&gt;asset stripping&lt;/strong&gt;, extracting value (cash, fees, whatever) and leaving the company weaker on the other side. I theorize a version of this is happening over at Harvest right now. In extreme scinarios, the company dies as a result. The recent Hudson's Bay bankruptcy is a good example of this process. A 356 year old company, one that shaped the fabric of Canadian nationhood, obliterated in 2 years of private equity management.&lt;/p&gt;

&lt;p&gt;And here’s the funny part:&lt;/p&gt;

&lt;h2&gt;
  
  
  This strategy creates the exact conditions where open source wins
&lt;/h2&gt;




&lt;p&gt;When pricing is fair, convenience wins.&lt;br&gt;
When pricing gets weird, &lt;strong&gt;control&lt;/strong&gt; wins.&lt;/p&gt;

&lt;p&gt;We've seen this play out before with movie streaming vs piracy. The 2020s have seen a surge in consumer streaming costs and a surge in content piracy.&lt;/p&gt;

&lt;p&gt;Open source doesn’t need to be perfect. It just needs to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;good enough&lt;/li&gt;
&lt;li&gt;cheaper enough&lt;/li&gt;
&lt;li&gt;stable enough&lt;/li&gt;
&lt;li&gt;easy enough to host and use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And in 2026, that last part is &lt;em&gt;way&lt;/em&gt; easier than it used to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The “Blender effect”: once open source is good, it’s hard to compete
&lt;/h2&gt;




&lt;p&gt;Blender is the example I keep coming back to. Blender didn’t win because it had the best pricing page. It won because it became genuinely good, widely supported, and community-driven. It’s also basically impossible to undercut because “free + open source” is undefeated. ~$100/month for cinema 4d and octane engine? No thanks.&lt;/p&gt;

&lt;p&gt;Any proprietary 3D tool competing with Blender has to justify why you should pay… when the free option is legit industry-grade.&lt;/p&gt;

&lt;p&gt;Time tracking isn’t 3D modeling, obviously. But the pattern rhymes:&lt;/p&gt;

&lt;p&gt;If enough people get burned by “stable SaaS --&amp;gt; acquisition --&amp;gt; pricing explosion”, they start looking for exits.&lt;/p&gt;

&lt;p&gt;Open source is that exit.&lt;/p&gt;

&lt;h2&gt;
  
  
  I think we’re entering a new software cycle
&lt;/h2&gt;




&lt;p&gt;I think we’re going to see more of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Small stable SaaS&lt;/strong&gt; exists for years (slow growth, reliable)&lt;/li&gt;
&lt;li&gt;It gets acquired (VC/PE/etc.)&lt;/li&gt;
&lt;li&gt;Prices go up, fees appear, support gets “optimized”&lt;/li&gt;
&lt;li&gt;Customers churn, especially the technical ones&lt;/li&gt;
&lt;li&gt;Open source alternatives get an influx of users + contributors&lt;/li&gt;
&lt;li&gt;The market resets around tools people can actually control&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And the difference now vs. 10-15 years ago is huge:&lt;/p&gt;

&lt;p&gt;You don’t need a rack in a closet and a CCNA to self-host something.&lt;/p&gt;

&lt;p&gt;I do own a rack, but it's in my parents baseement... far better than a closet I'd argue. but my point remains!&lt;/p&gt;

&lt;p&gt;You can run a ton of open source SaaS tooling on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Mac mini&lt;/li&gt;
&lt;li&gt;a Raspberry Pi&lt;/li&gt;
&lt;li&gt;a $10/month VPS&lt;/li&gt;
&lt;li&gt;an old pc repurposed as a home server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open source adoption isn’t just ideology anymore. It’s logistics. And logistics that small businesses will take seriously when it's destroying their bottom line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The optimistic takeaway
&lt;/h2&gt;




&lt;p&gt;Do I like watching solid products get enshittified? Not really.&lt;/p&gt;

&lt;p&gt;But I &lt;em&gt;do&lt;/em&gt; like the unintended side effect:&lt;/p&gt;

&lt;p&gt;When companies squeeze users for short-term gains, they’re basically funding the ecosystem that replaces them.&lt;/p&gt;

&lt;p&gt;People won’t just roll over and take it. We didn’t.&lt;/p&gt;

&lt;p&gt;We replaced Harvest with Kimai in an afternoon and moved on with our lives. Literally saving us &lt;strong&gt;$28,000 A YEAR.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;And if enough teams do that, the “boring SaaS” category starts to look a lot like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open tools&lt;/li&gt;
&lt;li&gt;self-hostable defaults&lt;/li&gt;
&lt;li&gt;paid hosting as a choice (not a hostage situation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which is… honestly kind of great imo.&lt;/p&gt;




&lt;p&gt;Checkout my guide to setting up Kimai &lt;a href="https://torrin.me/blog/kimai-setup" rel="noopener noreferrer"&gt;here&lt;/a&gt;. If you wanna read more, checkout my other posts &lt;a href="https://torrin.me/blog" rel="noopener noreferrer"&gt;here&lt;/a&gt; or visit my &lt;a href="https://torrin.me/" rel="noopener noreferrer"&gt;home page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>saas</category>
      <category>tooling</category>
    </item>
    <item>
      <title>The problem with React and MUI</title>
      <dc:creator>Torrin Leonard</dc:creator>
      <pubDate>Tue, 10 Jun 2025 03:08:47 +0000</pubDate>
      <link>https://forem.com/torrin/the-problem-with-react-and-mui-gl2</link>
      <guid>https://forem.com/torrin/the-problem-with-react-and-mui-gl2</guid>
      <description>&lt;p&gt;For the past year I've been working on a project that started as an internal tool at my job as a web dev at Equator Studios, the project has made me realize that there is a big problem with the way modern js libraries like Material UI are built for developers.&lt;/p&gt;

&lt;p&gt;Using Material UI is fairly burdensome for many reasons, the package size, it's reliance on react and the performance issues that introduces with the virtual dom, a quite horribly disorganized theme system, and the general resistance to customization one faces when trying to tweak anything about any component.&lt;/p&gt;

&lt;p&gt;Basically, if you don't want to ride their carefully designed rollercoaster the way they intended, seatbelt, bubble wrap and all, you are simply out of luck or face a heap of challenges and wasted time.&lt;/p&gt;

&lt;p&gt;Generally the problems with MUI and most modern JavaScript projects (React is another good example of this) can be distilled: They suffer from expanding complexity creep.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createTheme&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;MuiButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;styleOverrides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This complexity creep leads to an increase in confusion among new developers both arriving to material ui, or to the js ecosystem at large for the first time.&lt;/p&gt;

&lt;p&gt;As someone who's first experience with web development was manually creating html/css/js templates in Django, the React/MUI ecosystem really warped and altered my understanding of web development into a gooie mess. React intro tutorials never teach you about the "dom" or how js is used to physically update html dom elements in a literal .html file.&lt;/p&gt;

&lt;p&gt;That concept was never communicated to me, not through code, not through the documentation, not even through third party tutorials on how to use these tools. They hand you the hammer and blabber something about nails while kicking you out the door, and thus I never had an understand of how the elements on the page were actually structured, rendering, updating, or reacting.&lt;/p&gt;

&lt;p&gt;This reveals another major issue with MUI and React: the complexity creep abstracts the need for basic understanding of the tools your using; the browser, the dom, css, and JavaScript itself.&lt;/p&gt;

&lt;p&gt;How did I wake up you ask? That's simple, I work with a senior developer who insists on building almost everything ourselves. We have our own websocket implementation, our own base64 encoder hard coded into our backend, files and files of complex projection math to render gis data.&lt;/p&gt;

&lt;p&gt;This persistent pursuit to create almost everything our selves has two main benefits over using off the shelf solutions: Everything is easily tweakable to our companies needs, and we are able to learn the fundamentals of any problem we tackle, improving our skills as developers.&lt;/p&gt;

&lt;p&gt;Remember that theme definition in MUI above? This it in destamatic-ui:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it, a simple object with key &lt;code&gt;button&lt;/code&gt;, the css class name, the value of which is a style object converted into inline css in the dom when that class is invoked. dead simple. All that's needed to define a global theme. This can even be duplicated and used in another &lt;code&gt;ThemeContext&lt;/code&gt; in the same app.&lt;/p&gt;

&lt;p&gt;This approach brings convenience without cluttering the page with ten different parameters and objects you need to declare because it will break if you don't for some reason you can read about in the documentation or on their github issues pages when it breaks.&lt;/p&gt;

&lt;p&gt;The themeing system in our ui library destamatic-ui is quite advanced, it has inheritance, so you can reuse styles, variables and functions so you can create reactive themes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toCSS&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="nx"&gt;$color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FF0000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$alpha($color, 0.5)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's not all though. destamatic-ui is built on two other libraries that have this same no complex nonsense approach: destam, a delta state management library, and destam-dom, a dom manipulation library built on destam's observer reactivity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq09nfx40z0o12q3o506.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwq09nfx40z0o12q3o506.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why is destam-dom better and simply faster? destam-dom doesn't use a virtual dom, it doesn't re-render the entire page on an update. It directly modifies the dom, and the specific element of the dom a given component actually needs to update. Which means it doesn't require the entire page to be reloaded whenever there is even the smallest of updates.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://torrin.me/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftorrin.me%2Fsite-card.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://torrin.me/" rel="noopener noreferrer" class="c-link"&gt;
            Torrin Leonard | Full-Stack Engineer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Full-stack software engineer building AI-powered web apps, custom UI frameworks, and the infrastructure they run on.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftorrin.me%2Ffavicon.png"&gt;
          torrin.me
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I built my personal site &lt;a href="https://torrin.me" rel="noopener noreferrer"&gt;torrin.me&lt;/a&gt; using our destam stack, my site was originally built with React, React-Three-Fiber, and MUI. I cannot tell you how buttery smooth the loading is now, the theme transitions, the snappy reactivity. Using destam-dom simplified my build pipeline, made deployments 40 seconds.&lt;/p&gt;

&lt;p&gt;Working with the destam stack professionally has not only inspired me to build my hobby projects using it but has also deepened my understanding of how websites function. By embracing a more efficient, back-to-basics approach, I've learned to create web applications that are lean, efficient, and snappily reactive. I firmly believe that if more developers adopt this approach to libraries and frameworks, it could lead to a healthier ecosystem for newcomers to learn and create.&lt;/p&gt;

&lt;p&gt;If you're tired of the complexity and ready to experience the difference, I encourage you to give the destam stack a try. We've dedicated ourselves to crafting tools that prioritize both developer and user comfort. You can explore the stack and see for yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/torrinworx/destamatic-ui" rel="noopener noreferrer"&gt;destamatic-ui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nefsen402/destam-dom" rel="noopener noreferrer"&gt;destam-dom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/equator-studios/destam" rel="noopener noreferrer"&gt;destam&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Join us in creating more efficient and enjoyable web experiences!&lt;/p&gt;




&lt;p&gt;This was just a brief introduction to destam, destam-dom, and destamatic-ui. I'll be writing more in depth articles and tutorials about the stack, and some adjacent projects I've been working on using it to show it off. Please let me know what you think!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
