<?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: Fyodor</title>
    <description>The latest articles on Forem by Fyodor (@fyodorio).</description>
    <link>https://forem.com/fyodorio</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%2F57214%2F83cf1053-8a44-457d-b397-a2eda4a83100.jpg</url>
      <title>Forem: Fyodor</title>
      <link>https://forem.com/fyodorio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fyodorio"/>
    <language>en</language>
    <item>
      <title>These ever-popping and ubiquitous posts with titles saying something like "Here's The Topic That Will Blow Your Mind (Especially If You Have One)" — with unnecessary unsolicited text in parentheses specifically — are so freaking annoying, FWIW... 👴🏻</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Tue, 10 Feb 2026 08:51:12 +0000</pubDate>
      <link>https://forem.com/fyodorio/these-ever-popping-and-ubiquitous-posts-with-titles-saying-something-like-heres-the-topic-that-1dco</link>
      <guid>https://forem.com/fyodorio/these-ever-popping-and-ubiquitous-posts-with-titles-saying-something-like-heres-the-topic-that-1dco</guid>
      <description></description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>writing</category>
    </item>
    <item>
      <title>Discussions on DEV seem to become much more active lately... Like, orders of magnitude probably... What happened?! 😲</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Wed, 04 Feb 2026 12:11:48 +0000</pubDate>
      <link>https://forem.com/fyodorio/discussions-on-dev-seem-to-become-much-more-active-lately-like-orders-of-magnitude-probably-4c2m</link>
      <guid>https://forem.com/fyodorio/discussions-on-dev-seem-to-become-much-more-active-lately-like-orders-of-magnitude-probably-4c2m</guid>
      <description></description>
    </item>
    <item>
      <title>TIL… would be fun to see it evolve indeed.</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Wed, 08 Oct 2025 15:59:50 +0000</pubDate>
      <link>https://forem.com/fyodorio/til-would-be-fun-to-see-it-evolve-indeed-5b58</link>
      <guid>https://forem.com/fyodorio/til-would-be-fun-to-see-it-evolve-indeed-5b58</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/codepo8/abandonware-of-the-web-did-you-know-that-there-is-an-html-tables-api-1efn" class="crayons-story__hidden-navigation-link"&gt;Abandonware of the web: did you know that there is an HTML tables API?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/codepo8" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F110884%2Fc4807448-b7fe-4d8d-ba13-a3ec4c97b377.jpeg" alt="codepo8 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/codepo8" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Christian Heilmann
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Christian Heilmann
                
              
              &lt;div id="story-author-preview-content-2905284" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/codepo8" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F110884%2Fc4807448-b7fe-4d8d-ba13-a3ec4c97b377.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Christian Heilmann&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/codepo8/abandonware-of-the-web-did-you-know-that-there-is-an-html-tables-api-1efn" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 8 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/codepo8/abandonware-of-the-web-did-you-know-that-there-is-an-html-tables-api-1efn" id="article-link-2905284"&gt;
          Abandonware of the web: did you know that there is an HTML tables API?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/html"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;html&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tables"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tables&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/codepo8/abandonware-of-the-web-did-you-know-that-there-is-an-html-tables-api-1efn" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;9&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/codepo8/abandonware-of-the-web-did-you-know-that-there-is-an-html-tables-api-1efn#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>html</category>
      <category>javascript</category>
      <category>tables</category>
    </item>
    <item>
      <title>One niche dev newsletter: lessons learned</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Mon, 01 Sep 2025 17:28:29 +0000</pubDate>
      <link>https://forem.com/fyodorio/one-niche-dev-newsletter-lessons-learned-4ij2</link>
      <guid>https://forem.com/fyodorio/one-niche-dev-newsletter-lessons-learned-4ij2</guid>
      <description>&lt;p&gt;About seven months ago I had published &lt;a href="https://metaframe.works/archive/0/" rel="noopener noreferrer"&gt;the first issue&lt;/a&gt; of my first newsletter — Metaframeworks Weekly, dedicated to JavaScript-based tools like &lt;a href="https://metaframe.works/tags/nextjs/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, &lt;a href="https://metaframe.works/tags/nuxt/" rel="noopener noreferrer"&gt;Nuxt&lt;/a&gt;, &lt;a href="https://metaframe.works/tags/sveltekit/" rel="noopener noreferrer"&gt;SvelteKit&lt;/a&gt;, and &lt;a href="https://metaframe.works/tags/astro/" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; and their place in the modern web development. Today I'm renaming it to &lt;a href="https://metaframe.works" rel="noopener noreferrer"&gt;Metaframeworks Records&lt;/a&gt; and sharing some why's, pains, and gains here, following up &lt;a href="https://fyodor.io/let-s-talk-metaframeworks/" rel="noopener noreferrer"&gt;the initial post&lt;/a&gt; from the last days of the last year. I'm not going to teach anyone with this lessons format, not at all (&lt;em&gt;would be boring, and I'm not that old&lt;/em&gt;) — it's rather the list of things one can learn even during such a short amount of grind time over something new that needs to be repeated regularly. Sounds obscure, I know, so let's dive deeper. &lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: Roll up your sleeves
&lt;/h2&gt;

&lt;p&gt;I love reading newsletters. Well, some of them. Most of the stuff on the Internet, including the niche dev projects, are pretty basic and represent some sort of list of resources with basic meta derived from... well, the resource meta. There are some examples I really like though, like &lt;a href="https://bytes.dev" rel="noopener noreferrer"&gt;Bytes&lt;/a&gt;, where the author adds some [in]sane humour and pop-culture references to that, with some short essays on the most interesting stuff. But most of that is pretty generic anyway. What I always wanted is some deeper chronicles of the industry I'm into without unnecessary noise at the same time. So, &lt;a href="https://fyodor.io/let-s-talk-metaframeworks/" rel="noopener noreferrer"&gt;as I mentioned&lt;/a&gt;, something like that pushed me to creating my regular list of interesting resources dedicated to metaframeworks topics specifically. And I thought some details for each of the findings in the list would make it more alive.&lt;/p&gt;

&lt;p&gt;Long story short, making something alive is [un]surprisingly difficult. That is something I'm still trying to figure out the mechanics of, but one obvious thing is it's hard, and it requires time, especially if you do it manually. I have some tricks in my pockets already, but in essence it's still a lot of reading things, and trying things, and writing about things.&lt;/p&gt;

&lt;p&gt;I honestly underestimated the amount of effort and am now trying to adjust to proper operation mode instead, taking into account my day job in a "fast-pace startup environment", and my family life, and my migraines, and learning Rust (&lt;em&gt;which can be a sort of migraine of its own at times&lt;/em&gt;). What is true is that you need to re-visit and re-assess your attitude and cut yourself some slack if you plan to save your mental health not to go mental. Which leads to... &lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: Form the shape as you go
&lt;/h2&gt;

&lt;p&gt;During these months of working on the newsletter I tried different tools and approaches to everything, starting from information gathering, through &lt;a href="https://github.com/fyodorio/metaframeworks-newsletter-website" rel="noopener noreferrer"&gt;website source code&lt;/a&gt; changes, and finishing with the resulting text format. I found that at least in the early stages you need to change a lot and cut away stuff that doesn't look good, and emphasize things that work best and bring personality to the project. &lt;/p&gt;

&lt;p&gt;The newsletter had started as &lt;em&gt;&lt;strong&gt;Metaframeworks Weekly&lt;/strong&gt;&lt;/em&gt;, and because of &lt;em&gt;the Lesson 1&lt;/em&gt; above I quickly realized that the cadence is probably not something that should be set in stone this harsh way. At the same time, from the very beginning, the content was tightly tied to music, which is a big part of my audiophile life: each issue is called after a song with a tagline from it as an epigraph, relevant to the key topic of the week. So that was the reason I eventually decided to rename the project to &lt;em&gt;&lt;strong&gt;Metaframeworks Records&lt;/strong&gt;&lt;/em&gt;, which sounds much better to me because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It eliminates the pressure of weekly updates — now I can publish bi-weekly, or twice a week, or even go to a vacation sometimes.&lt;/li&gt;
&lt;li&gt;It's much more relevant to music, which is so cool (&lt;em&gt;especially as all these records provide a lot of releases in the end&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;It's relevant to records as notes on something (&lt;em&gt;which is closer to my heart than "issues" as the latter is still associated with bugs for me&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;It's more relevant to news I write about being some sort of &lt;a href="https://www.guinnessworldrecords.com" rel="noopener noreferrer"&gt;records&lt;/a&gt; in its area — some outstanding, or the most awful, or unexpected things peer developers praise or shame out loud.&lt;/li&gt;
&lt;li&gt;It's even much more relevant &lt;a href="https://en.wikipedia.org/wiki/Record_(computer_science)" rel="noopener noreferrer"&gt;to Computer Science&lt;/a&gt;, especially if you consider the fact I started my newsletter with &lt;a href="https://metaframe.works/archive/0/" rel="noopener noreferrer"&gt;the Issue #0&lt;/a&gt;, as them records &lt;del&gt;classically&lt;/del&gt; sometimes do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in all, it's a good example of shaping something as you go, when you realize that, even with some unhabitual changes, the results may get more straightforward, relevant and even... simple? &lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: Simplicity is great until it's not
&lt;/h2&gt;

&lt;p&gt;The initial idea of mine was to make the project itself (&lt;em&gt;the code base&lt;/em&gt;) as simple as possible and (&lt;em&gt;even though it started as an &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt;-based project&lt;/em&gt;) come to some framework-less solution and avoid vendor lock-ins of any kind. But eventually I realized a good tool goes a long way, and with some of them it turned out into a real attachment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I still use Astro, and it helps me a lot to quickly iterate on new ideas and features without clunky contraptions of self-made analogues for well-thought features the guys deliver.&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://buttondown.com" rel="noopener noreferrer"&gt;Buttondown&lt;/a&gt; for the actual newsletter services (&lt;em&gt;and I'm ashamed to confess I hadn't even went out of the boundaries of the free tier yet&lt;/em&gt;), I can compare it with other solutions which I used professionally, and it's much simpler than competitors (&lt;em&gt;literally one line of HTML code&lt;/em&gt;), while allowing me to avoid the pains of maintaining my own mailing solution.&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://bsky.app" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt; for communication around the newsletter (&lt;em&gt;not a lot of though, wouldn't call it marketing or something&lt;/em&gt;) and for following &lt;a href="https://bsky.app/profile/did:plc:7vyxybjsqatduo4xbldbf2cu/feed/aaan4pa65r5ke" rel="noopener noreferrer"&gt;the real-time news&lt;/a&gt; from the metaframework world, and I need to accept this project is very close to something one would call an ideal social media for humans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Probably without all that I'd feel myself more accomplished, but I also would suffer a lot more too. With one caveat related to being slightly opinionated and selective about some technologies, but you know what?&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 4: Opinions are inevitable, and that's OK
&lt;/h2&gt;

&lt;p&gt;Again, while I still try to be the most unbiased person as I write about the technology news of my niche of choice, I can not avoid some judgements from time to time, not to say about having some of already mentioned favorites. However, I was told once, and I pretty much agree with the saying, that without opinions you lose personality. I'm still sure there's no black and white in our technical world, there is no absolute, and I try to float at a sane distance from love or hate for this or that technology. But being a curator of the metaframeworks-related newsletter already makes me an opinionated person by default. That's why I have a "The Bad" block in each of my records, where I inevitably find something bad about metaframeworks and related technologies each week. And this block is a part of something important too, specifically...&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 5: Patterns are extremely useful
&lt;/h2&gt;

&lt;p&gt;Each newsletter issue consists of three blocks as a rule: &lt;em&gt;the Good&lt;/em&gt;, &lt;em&gt;the Bad&lt;/em&gt;, and &lt;em&gt;the Noteworthy&lt;/em&gt;. You quickly get an idea of what that's about, and it becomes a habitual and anticipated structure. Besides, it makes it easier to prepare each record for &lt;em&gt;me&lt;/em&gt;, and makes cross-record connections possible (&lt;em&gt;and quite interesting&lt;/em&gt;). There are lots of other patterns in this project too, starting from the Astro's &lt;a href="https://docs.astro.build/en/guides/content-collections/" rel="noopener noreferrer"&gt;content collections&lt;/a&gt; (&lt;em&gt;powering not only issues and tags but also stuff like the items on &lt;a href="https://metaframe.works/comparison/" rel="noopener noreferrer"&gt;the Metaframeworks Comparison&lt;/a&gt; page, or &lt;a href="https://metaframe.works/faq/" rel="noopener noreferrer"&gt;FAQ pairs&lt;/a&gt;&lt;/em&gt;), the song title and tagline as "my thing", posts on Bluesky, and more. As we developers know, patterns are powerful tools to simplify maintenance, and it's a shame not to use them. Like many other things too, for instance... &lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 6: AI is extremely overrated
&lt;/h2&gt;

&lt;p&gt;AI and LLMs are parts of our lives now. It would be dumb to dump them these days, but... As Rich Harris had &lt;a href="https://bsky.app/profile/rich-harris.dev/post/3lxi76nyra22o" rel="noopener noreferrer"&gt;said&lt;/a&gt; recently, "I keep giving LLMs a chance to impress me, whenever I encounter a boring task that they should be good at, and they keep shitting the bed". That's spot on. I experiment with code assistants (&lt;em&gt;and online webapp builders like Bolt and Lovable&lt;/em&gt;) a lot, as they mostly generate code for web projects in metaframeworks wrappings by default. But as many of us know from the professional experience, the last 10% remaining from the initial (&lt;em&gt;often AI-generated&lt;/em&gt;) implementation of a project take 90% of the time, or even more, and sometimes dealing with the AI output, or collaborating with AI over these 10% is a real torture, as even on simple tasks the code assistants fail spectacularly (&lt;em&gt;and too stupidly&lt;/em&gt;) too often. And even for simple stuff LLMs are born to be perfect at (&lt;em&gt;like text proofreading&lt;/em&gt;) they need thorough supervision (&lt;em&gt;even more than myself, being a non-native speaker, so we fight a lot and I often prefer my clumsy draft versions&lt;/em&gt;). But they're not the only burning problem of our industry, as...&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 7: Security is important, from back to front
&lt;/h2&gt;

&lt;p&gt;I am genuinely intimidated by how often you face new and new security threats and issues with the technology like metaframeworks and tools around that. You can check &lt;a href="https://metaframe.works/tags/security/" rel="noopener noreferrer"&gt;the "security" tag&lt;/a&gt;, I'm not kidding: that's a whole new specialization for some bounty hunters these days. The problems the metaframeworks industry raises are quite unique very often, considering their hybrid approach to building full-stack web applications. So it's hard to overestimate how important it is to keep your finger on the pulse of what's happening in the industry in this regard and how different tooling vendors try to prevent adversaries from messing with &lt;em&gt;your&lt;/em&gt; code. We, developers, too often neglect that, but there's some hope that metaframeworks can actually (&lt;em&gt;and surprisingly&lt;/em&gt;) be an answer to this problem too. But that's a long journey and...   &lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 8: It only starts here
&lt;/h2&gt;

&lt;p&gt;I like &lt;em&gt;&lt;strong&gt;Metaframeworks Records&lt;/strong&gt;&lt;/em&gt; — that's my labour of love. I write a lot, I learn a lot, and I explore how much I still need to learn about the technology and the ways to make it work in a better way for us. I have a lot of ideas to make it easier for myself and other interested developers, and to subside further beneath the tip of the iceberg we have discovered during these several month, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/fyodorio/awesome-metaframeworks" rel="noopener noreferrer"&gt;The metaframeworks encyclopedia&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://metaframe.works/comparison/" rel="noopener noreferrer"&gt;The metaframeworks comparison&lt;/a&gt; (&lt;em&gt;which I plan to turn into an interactive quiz!&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bsky.app/profile/did:plc:7vyxybjsqatduo4xbldbf2cu/feed/aaan4pa65r5ke" rel="noopener noreferrer"&gt;The dedicated Bluesky feed&lt;/a&gt;,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and a lot more (&lt;em&gt;not even saying about "simple" stuff like records search, pagination, and alike&lt;/em&gt;), just stay tuned! Suggestions are welcome too, as well as any feedback (&lt;em&gt;the simplest way is to ping me via &lt;a href="//mailto:fyodor@metaframe.works"&gt;fyodor@metaframe.works&lt;/a&gt;&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;And if you have any new metaframework in mind (&lt;em&gt;&lt;a href="https://metaframe.works/tags/newborn/" rel="noopener noreferrer"&gt;it happens&lt;/a&gt;, you know&lt;/em&gt;) — spit it out without a doubt! Who knows, maybe it will take its place in the metaframeworks Hall of Fame another day.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The cover photo by &lt;a href="https://unsplash.com/@jontyson" rel="noopener noreferrer"&gt;Jon Tyson&lt;/a&gt; from Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>metaframework</category>
      <category>craftsmanship</category>
      <category>software</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Inspiring amateurism, or a couple of success lessons from random podcast episodes</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Fri, 29 Aug 2025 17:43:33 +0000</pubDate>
      <link>https://forem.com/fyodorio/inspiring-amateurism-or-a-couple-of-success-lessons-from-random-podcast-episodes-1p6k</link>
      <guid>https://forem.com/fyodorio/inspiring-amateurism-or-a-couple-of-success-lessons-from-random-podcast-episodes-1p6k</guid>
      <description>&lt;p&gt;I listen to a lot of programming-related podcasts, that's one of the ways I both educate myself with some occasional technology aspects on the background, and keep myself acquainted with the latest and the greatest in the software development world (&lt;em&gt;not much, TBH&lt;/em&gt;). I have a curated list of podcast episodes I get to when I'm doing chores usually, or woodworking, or dogwalking, or whatnot. Sometimes it's new stuff from shows I follow, sometimes it's something I found during targeted search about some technology I'm currently interested in.&lt;/p&gt;

&lt;p&gt;One of my favourite tech shows of all time is &lt;a href="https://feeds.acast.com/public/shows/software-unscripted" rel="noopener noreferrer"&gt;"Software Unscripted"&lt;/a&gt; — always thoughtful and long no-bullshit conversations about different aspects of computer science, programming languages, and a lot more from the host who is themselves a great person and educator — &lt;a href="https://github.com/rtfeldman" rel="noopener noreferrer"&gt;Richard Feldman&lt;/a&gt; (&lt;em&gt;I love their &lt;a href="https://frontendmasters.com/teachers/richard-feldman/" rel="noopener noreferrer"&gt;courses on FrontendMasters&lt;/a&gt; so much too, the cleverest and the most modest teacher on the interwebs!&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;There was this guy on the show once (&lt;em&gt;quite some time ago, found this episode accidentally&lt;/em&gt;), Casey Muratori, who's an expert in software performance selling their courses and other educational materials and considering themself proficient in different technologies including web development. And when Richard started to talk about ORMs with them, Casey admitted they were hearing this term for the first time in their life and was genuinely surprised that people do such things to SQL...&lt;/p&gt;

&lt;p&gt;Another show I love is &lt;a href="https://corrode.dev/podcast/" rel="noopener noreferrer"&gt;"Rust in production"&lt;/a&gt;, where &lt;a href="https://github.com/mre" rel="noopener noreferrer"&gt;Matthias Endler&lt;/a&gt; speaks to seasoned Rust developers about their experience in building future-proof production software systems. There was an episode recently with Andrew Burkhart, Senior Rust Engineer at &lt;a href="https://1password.com" rel="noopener noreferrer"&gt;1password&lt;/a&gt;. This episode was particularly exciting because of the clear "fake it til you make it" philosophy of the guest. When you think about Rust system engineers developing low-level software — mentally coding in assembly and then translating it on the fly to some formal language that you, as a web developer, can only have nightmares about — you imagine some Yoda-level gurus (&lt;em&gt;and don't get me wrong, they often are&lt;/em&gt;). But as a matter of fact, usually these people have no idea what they are doing at the beginning and learn on the fly (&lt;em&gt;at best!&lt;/em&gt;), growing their craftsmen wings in process (&lt;em&gt;or pretending they do&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;What this taught me was to give some perspective to my inner critic and impostor alter-ego: if the people we all admire often have no idea what they're doing on a professional level they're paid for and still are considered to be the experts, I think we all, usual software developers from the darkest corners of the software world, have a chance to some day say to ourselves, "well done, pal!"&lt;/p&gt;

&lt;p&gt;I mean, we all constantly hear and see these memes and shitposts on social media about "hey, I'm a seasoned software developer and today I asked ChatGPT how to center a div", or "programmer's mind is constantly fluctuating between 'I am a God!' and 'I have no idea what I am doing'" but usually that's just self-deprecating humor, or a well-worn joke for the approval of fellow programming plebs. But in fact, many people in the software world pave their way to success through lots of empty stares at dark screens with blank minds over some simple programming task.&lt;/p&gt;

&lt;p&gt;It's possible to be a know-it-all. It's just that usually we are not in a position to. There are other things to do as well. So it's fair to take it easy, slow down the pace, and give yourself some friendly pat on the shoulder and say "it's OK, you'll learn the borrow checker tomorrow, today you can just watch Netflix with the kid... or play you some harpsichord... like that guy from the Rust in Production podcast... like a PRO..."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://unsplash.com/@drewgilliam" rel="noopener noreferrer"&gt;Drew Gilliam&lt;/a&gt; from Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>learning</category>
      <category>craftsmanship</category>
      <category>software</category>
      <category>philosophy</category>
    </item>
    <item>
      <title>Wait a minute, where's this week's Meme Monday post?! 😱</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Tue, 12 Aug 2025 04:44:04 +0000</pubDate>
      <link>https://forem.com/fyodorio/wait-a-minute-wheres-this-weeks-meme-monday-post-2cmh</link>
      <guid>https://forem.com/fyodorio/wait-a-minute-wheres-this-weeks-meme-monday-post-2cmh</guid>
      <description></description>
      <category>memes</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I see C book in 2025, I subscribe 📖</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Thu, 31 Jul 2025 05:14:15 +0000</pubDate>
      <link>https://forem.com/fyodorio/i-see-c-book-in-2025-i-subscribe-5134</link>
      <guid>https://forem.com/fyodorio/i-see-c-book-in-2025-i-subscribe-5134</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/pauljlucas/why-learn-c-book-announcement-4a01" class="crayons-story__hidden-navigation-link"&gt;“Why Learn C” Book Announcement&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/pauljlucas" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2304%2F7366785.jpeg" alt="pauljlucas profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/pauljlucas" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Paul J. Lucas
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Paul J. Lucas
                
              
              &lt;div id="story-author-preview-content-2742586" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/pauljlucas" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2304%2F7366785.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Paul J. Lucas&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/pauljlucas/why-learn-c-book-announcement-4a01" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 31 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/pauljlucas/why-learn-c-book-announcement-4a01" id="article-link-2742586"&gt;
          “Why Learn C” Book Announcement
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/c"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;c&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/pauljlucas/why-learn-c-book-announcement-4a01" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;46&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/pauljlucas/why-learn-c-book-announcement-4a01#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              15&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>c</category>
    </item>
    <item>
      <title>UmiJS: the Shaolin of web frameworks</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Sun, 30 Mar 2025 14:18:23 +0000</pubDate>
      <link>https://forem.com/fyodorio/umijs-the-shaolin-of-web-frameworks-55d8</link>
      <guid>https://forem.com/fyodorio/umijs-the-shaolin-of-web-frameworks-55d8</guid>
      <description>&lt;p&gt;I stumbled upon &lt;a href="https://umijs.org/en-US" rel="noopener noreferrer"&gt;UmiJS&lt;/a&gt; accidentally when reading about &lt;a href="https://makojs.dev" rel="noopener noreferrer"&gt;Mako&lt;/a&gt; — a &lt;a href="https://vite.dev" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; analog built with &lt;a href="https://www.rust-lang.org" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; (&lt;em&gt;&lt;a href="https://transitiontech.ca/random/RIIR" rel="noopener noreferrer"&gt;of course&lt;/a&gt;&lt;/em&gt;) which I'm very interested in. When I started to dig, I had fallen into a whole treasure trove which I wanted to share with other people who hadn't heard anything about the Umi ecosystem. Maybe it's just me living under a stone, so feel free to skip it if you're already a UmiJS kung fu master. Otherwise, welcome to the ride.&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;And just in case someone may consider this journey somewhat derogatory in terms of China and its culture — it's not. I'm a big fan of everything related to this part of the world, and the Shaolin and kung fu reference is not arbitrary — I am myself a certified oriental martial arts instructor, and this philosophy is not an empty phrase for me.&lt;/em&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why Umi&lt;/li&gt;
&lt;li&gt;What is Umi&lt;/li&gt;
&lt;li&gt;Tooling ecosystem&lt;/li&gt;
&lt;li&gt;People behind&lt;/li&gt;
&lt;li&gt;
Project example

&lt;ul&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Project scaffolding&lt;/li&gt;
&lt;li&gt;Project structure&lt;/li&gt;
&lt;li&gt;Running the app&lt;/li&gt;
&lt;li&gt;Working with Umi CLI&lt;/li&gt;
&lt;li&gt;Build and deploy&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;My opinionated impressions&lt;/li&gt;

&lt;li&gt;Conclusions&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Umi
&lt;/h2&gt;

&lt;p&gt;I have a soft spot &lt;a href="https://metaframe.works" rel="noopener noreferrer"&gt;for metaframeworks&lt;/a&gt;, you know. So I eagerly dig into info related to any metaframework projects and tools. There's no shortage of that these days, of course — the landscape is versatile. But some projects are quite esoteric and hidden from external eyes — either because of geographical and cultural reasons, or because of language barriers. Here it is both. UmiJS and tools around that are developed predominantly by the Chinese community of commercial and non-commercial open-source contributors. However, as with many Chinese technological innovations (&lt;em&gt;looking at you &lt;a href="https://deepseek.com" rel="noopener noreferrer"&gt;DeepSeek&lt;/a&gt;&lt;/em&gt;), this one sparks curiosity because of how rich and self-sufficient the ecosystem is. So armed with this curiosity and intrigued by the original GitHub &lt;a href="https://github.com/umijs/umi" rel="noopener noreferrer"&gt;source code&lt;/a&gt; findings, I had decided to explore it further. Consider it a kind of "Umi for React/Vue/Angular/Svelte developers" research, often resting on the corresponding habitual analogies.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Umi
&lt;/h2&gt;

&lt;p&gt;UmiJS is an [extremely] pluggable enterprise-scale React-based web application [meta]framework, offering (&lt;em&gt;as &lt;a href="https://metaframe.works/comparison/" rel="noopener noreferrer"&gt;many analogs&lt;/a&gt;&lt;/em&gt;) routing, build tools, dedicated design system, and everything in between. From what I could see during my reconnaissance, its main market is huge enterprise monorepos for React websites and web applications (&lt;em&gt;something very opposite to tools like, for instance &lt;a href="https://waku.gg" rel="noopener noreferrer"&gt;Waku&lt;/a&gt;, if you will&lt;/em&gt;). Umi itself is not exactly a metaframework though, as I'd say, but rather something React would be if it aimed to resemble &lt;a href="https://angular.dev" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; as of version 19 — the powerful SPA framework with optional support for SSR/SSG and a whole lot of build options making it very customizable and approachable for performance optimizations specific to each particular use case. Its plugins-driven extensibility is something resembling Vite but for a more dedicated goal of building rich user interfaces. And there's more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling ecosystem
&lt;/h2&gt;

&lt;p&gt;In addition to the framework itself, the developers behind UmiJS maintain and connect the dots for a whole huge ecosystem of very clever tools and technologies, some of which have gained popularity even behind the Great Wall of China:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://makojs.dev" rel="noopener noreferrer"&gt;Mako&lt;/a&gt;.&lt;/strong&gt; A bundler and web server — a kind of &lt;a href="https://vite.dev" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; for the UmiJS web apps. It's a fresh development among other tools (&lt;em&gt;as far as I understand, the team used mostly Webpack and Vite before this in-house tool got up to speed&lt;/em&gt;). Built with Rust and declared to be even faster than other Rust-based analogs, not to mention the lame tools like Webpack and such (&lt;em&gt;just kidding, I ❤️ Webpack forever!&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://d.umijs.org" rel="noopener noreferrer"&gt;Dumi&lt;/a&gt;.&lt;/strong&gt; A static site generator specifically designed for component library development. Look at it as something between &lt;a href="https://storybook.js.org" rel="noopener noreferrer"&gt;Storybook&lt;/a&gt; and &lt;a href="https://docusaurus.io" rel="noopener noreferrer"&gt;Docusaurus&lt;/a&gt; inside the Umi world (&lt;em&gt;but much better integrated between each other, presumably&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://ant.design" rel="noopener noreferrer"&gt;Ant Design&lt;/a&gt;.&lt;/strong&gt; A top-level UI component library that provides a set of high-quality React components. Quite popular even outside of the Umi toolset and can be used independently, but integrated beautifully with Umi — to the extent I had a hard time figuring out where to find the actual components (&lt;em&gt;see below, in the project section&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/umijs/father" rel="noopener noreferrer"&gt;Father&lt;/a&gt;.&lt;/strong&gt; A tool designed specifically for building libraries. Used widely by all other tools and from the first look it's hard to find any analog in the world I got used to. Very often dev teams develop some custom approaches for that, but here it's a good set of best practices combined into a decently looking (&lt;em&gt;and functioning&lt;/em&gt;) craftsman's hammer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://qiankun.umijs.org" rel="noopener noreferrer"&gt;Qiankun&lt;/a&gt;.&lt;/strong&gt; An implementation of &lt;a href="https://en.wikipedia.org/wiki/Micro_frontend" rel="noopener noreferrer"&gt;micro frontends&lt;/a&gt; for easier and painless building of production-ready microfront-end architecture system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://umijs.org/en-US/docs/max/dva" rel="noopener noreferrer"&gt;Dva&lt;/a&gt;.&lt;/strong&gt; A plugin-based state management solution (&lt;a href="https://redux.js.org" rel="noopener noreferrer"&gt;Redux&lt;/a&gt; + &lt;a href="https://redux-saga.js.org" rel="noopener noreferrer"&gt;Sagas&lt;/a&gt;). Also quite popular in narrow communities outside of the Umi world.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://umijs.org/en-US/docs/api/commands" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;.&lt;/strong&gt; An interesting DX booster for Umi I'll talk about in detail a bit later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moreover, with Umi you get a strong &lt;a href="https://umijs.org/en-US/docs/guides/use-plugins" rel="noopener noreferrer"&gt;plugin system&lt;/a&gt;, some of which are included by default with each project scaffolded with Umi CLI. These plugin provide, for instance, capable site analytics, rich charts, robust data storage presets, internatiolization and localization capabilities, and many other enticing (&lt;em&gt;though obscure still, until you try them&lt;/em&gt;) things.&lt;/p&gt;

&lt;p&gt;There's also something even more huge than Umi itself: the misterious &lt;strong&gt;"Bigfish"&lt;/strong&gt; project (&lt;em&gt;don't search for meaningful resources links, at least if you're not fluent mandarin speaker&lt;/em&gt;) — an enterprise-grade wrapper around UmiJS, designed to enhance the capabilities of the framework with additional predefined and finetuned configurations and plugins. It serves as an internal framework for &lt;a href="https://www.antgroup.com/en" rel="noopener noreferrer"&gt;Ant Group&lt;/a&gt;, owning the world's largest mobile payments platform Alipay (&lt;em&gt;and if there's something requiring more security and complexity than fintech, I definitely have no idea about it&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Not surprisingly, the Umi organisation on GitHub even has a &lt;a href="https://github.com/umijs/ai" rel="noopener noreferrer"&gt;repository for some AI tool&lt;/a&gt; which, I'd assume, will be analogous to &lt;a href="https://sdk.vercel.ai/docs/introduction" rel="noopener noreferrer"&gt;Vercel's AI SDK&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  People behind
&lt;/h2&gt;

&lt;p&gt;The father of UmiJS and many other tools I mentioned is &lt;a href="https://github.com/sorrycc" rel="noopener noreferrer"&gt;Chen Cheng&lt;/a&gt;, the person leading the Ant Group's front-end work. They're a very productive and insightful person and open-source enthusiast, to the point of curating one of the most popular JS awesome lists — &lt;a href="https://github.com/sorrycc/awesome-javascript" rel="noopener noreferrer"&gt;Awesome JavaScript&lt;/a&gt;. I would follow their blog or anything willingly but looks like everything they write is behind some esoteric type of a popular Chinese paywall service so I had left my attempts. Their and their team's &lt;a href="https://github.com/umijs" rel="noopener noreferrer"&gt;repositories&lt;/a&gt; are quite popular, especially among the Chinese audience (&lt;em&gt;which is fair&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;Doesn't all that mean that there is no smoke without fire? Would be too stupid not to check it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project example
&lt;/h2&gt;

&lt;p&gt;So I have decided to play with UmiJS CLI and generate a project with a maximum staffed setup to take a look how the results look and feel like. There will be some short tutorial-like guidings and impressions shared, but to dig deeper you can explore &lt;a href="https://umijs.org/en-US/docs/guides/getting-started" rel="noopener noreferrer"&gt;the official docs (in English 🎉)&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;The code for the described project can be found &lt;a href="https://github.com/fyoset/my-yummy-umi-thingy" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Umi suggests (&lt;em&gt;and supports&lt;/em&gt;) quite a bunch of build tools and package managers, but the default one is &lt;a href="https://pnpm.io" rel="noopener noreferrer"&gt;&lt;code&gt;pnpm&lt;/code&gt;&lt;/a&gt;, for which you'll need to have &lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; v18+ installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project scaffolding
&lt;/h3&gt;

&lt;p&gt;To scaffold a template app with UmiJS you need to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm dlx create-umi@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which results in somewhat similar CLI dialog:&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%2F324aq9csg3c7k7ymzr2u.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%2F324aq9csg3c7k7ymzr2u.png" alt="Output of the project scaffolding command" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By selecting the Ant Design Pro template I had implicitly opted-in to using &lt;a href="https://umijs.org/en-US/docs/max/introduce" rel="noopener noreferrer"&gt;Umi Max&lt;/a&gt; which by itself can be considered a kind of metaframework configuration of Umi with a ton of shenanigans. This config comes with pre-installed and on-demand-enabled features like state management, analytics, charts, &lt;a href="https://umijs.org/en-US/docs/max/i18n" rel="noopener noreferrer"&gt;i18n&lt;/a&gt;, and &lt;a href="https://umijs.org/en-US/docs/max/introduce#how-to-use" rel="noopener noreferrer"&gt;more&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project structure
&lt;/h3&gt;

&lt;p&gt;The resulting project structure creates the impression of a well-thought-out and best-practices-based opinionated set of dedicated places for everything, starting from Ant-based components, and finishing with API mocks to help you with testing the app locally at any moment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── mock
│   └── userAPI.ts
├── src
│   ├── assets
│   ├── components
│   │   └── Guide
│   │       ├── Guide.less
│   │       ├── Guide.tsx
│   │       └── index.ts
│   ├── constants
│   │   └── index.ts
│   ├── models
│   │   └── global.ts
│   ├── pages
│   │   ├── Access
│   │   │   └── index.tsx
│   │   ├── Home
│   │   │   ├── index.less
│   │   │   └── index.tsx
│   │   └── Table
│   │       ├── components
│   │       │   ├── CreateForm.tsx
│   │       │   └── UpdateForm.tsx
│   │       └── index.tsx
│   ├── services
│   │   └── demo
│   │       ├── UserController.ts
│   │       ├── index.ts
│   │       └── typings.d.ts
│   ├── utils
│   │   └── format.ts
│   ├── access.ts
│   └── app.ts
├── README.md
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
└── typings.d.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running the app
&lt;/h3&gt;

&lt;p&gt;Running &lt;code&gt;pnpm dev&lt;/code&gt; results in the following:&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%2Fibogz7apx1b60npnnjo1.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%2Fibogz7apx1b60npnnjo1.png" alt="Dev server run" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;A bit more about the ubiquitous MFSU thingy later...&lt;/em&gt;) And then in the browser, after slight loading with a fancy dedicated animated loader:&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%2F3ntrp1gimpnje4gctvwh.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%2F3ntrp1gimpnje4gctvwh.png" alt="Browser loading indicator" width="479" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll get something like that:&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%2Flg4cvnrcrmug72e3vu0o.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%2Flg4cvnrcrmug72e3vu0o.png" alt="Resulting default template application UI" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Working with default UI generated in Chinese can be a bit intimidating:&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%2Flrp3mwo4zwy2x0clgt0o.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%2Flrp3mwo4zwy2x0clgt0o.png" alt="UI for some user actions in the template application" width="800" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No problem, we're seasoned vibe-coders, we can use Cursor to translate that!&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%2F9nndqfblodm06hnnfwsx.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%2F9nndqfblodm06hnnfwsx.png" alt="Using Cursor IDE to translate Chinese to English" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which helps a bit but not too much, unfortunately, as many parts come from integrated &lt;a href="https://ant.design/components/overview" rel="noopener noreferrer"&gt;And Design components&lt;/a&gt; which require separate configuration to work with English:&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%2F3v6xqt2qxdh9if616e5d.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%2F3v6xqt2qxdh9if616e5d.png" alt="The UI translated to English" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's a starting point. But we want more, aren't we? Umi got us covered guys, with something awesome that will help us think less and move faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working with Umi CLI
&lt;/h3&gt;

&lt;p&gt;The Umi CLI can be considered something similar to Angular CLI (&lt;em&gt;for instance&lt;/em&gt;), with it's helpers and utils, but probably even much more that that. Here's what we've got:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build           build app for production
config          umi config cli
dev             dev server for development
help            show commands help
lint            lint source code using eslint and stylelint
setup           setup project
deadcode        check dead code
version         show umi version
plugin          inspect umi plugins
verify-commit   verify the commit message, which is usually used with husky.
preview         locally preview production build
run             run the script commands, support for ts and zx
generate        generate code snippets quickly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use &lt;code&gt;max&lt;/code&gt; configuration (&lt;em&gt;as I did during scaffolding, if you recall&lt;/em&gt;) you have many stuff (&lt;em&gt;like linting&lt;/em&gt;) enabled by default, often implicitly (&lt;em&gt;doh!&lt;/em&gt; 😖). It provides you with some coding best practices adhering with the opinionated automated style guide. &lt;/p&gt;

&lt;p&gt;Interesting thing is the so-called &lt;em&gt;&lt;a href="https://umijs.org/en-US/docs/guides/generator" rel="noopener noreferrer"&gt;microgenerators&lt;/a&gt;&lt;/em&gt; allowing you to scaffold some stuff like pages, data stores, or mocks easily. &lt;/p&gt;

&lt;p&gt;I had tried my luck with pages. It looked a bit awkward and not very productive to be perfectly honest (&lt;em&gt;I still needed to edit a lot of stuff manually&lt;/em&gt;) but it's a good way to enforce project's best practices, if you apply proper conventional configuration, I assume.&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%2Fk8m75p8pyb07dcjjute3.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%2Fk8m75p8pyb07dcjjute3.png" alt="Page generation process in CLI" width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check my resulting awesome &lt;a href="https://github.com/fyoset/my-yummy-umi-thingy/blob/main/src/pages/About/index.tsx" rel="noopener noreferrer"&gt;"About" page&lt;/a&gt; with an inevitable counter (&lt;em&gt;fancy, I know&lt;/em&gt; 😎). Nothing too original but it's good to know that everything resides on its place right where you expect it to be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build and deploy
&lt;/h3&gt;

&lt;p&gt;As we got used to, everything we built needs deployment. I hadn't found any popular deployment adapters for Umi unfortunately from a first glance (&lt;em&gt;but I'm pretty sure there are some plugins for that&lt;/em&gt; 🤞), but Google gave me a bunch of seemingly easy deployment options targeted directly to Umi.&lt;/p&gt;

&lt;p&gt;Long (&lt;em&gt;and painful&lt;/em&gt;) story short, the UmiJS-dedicated &lt;a href="https://tiiny.host" rel="noopener noreferrer"&gt;tiiny.host&lt;/a&gt; deployment story is quite weird. First of all, you can deploy only by uploading your &lt;code&gt;dist&lt;/code&gt; folder which neglects all the continuous deployment story. Second of all, if you replace the content of your website, it gets broken — looks like some files get cached or something. So I needed to &lt;a href="https://yummy-umi.tiiny.site" rel="noopener noreferrer"&gt;recreate the project&lt;/a&gt; while changing it. Basically, it's just a simple one-off static site deployment service so probably it won't work for even lightly sophisticated and regularly updated scenarios. &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%2Fwn2r95fcqrewe0qi0hql.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%2Fwn2r95fcqrewe0qi0hql.png" alt="tiiny.host deployment UI" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good thing is that you can just deploy your repo to &lt;a href="https://www.netlify.com" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt; using their &lt;code&gt;pnpm&lt;/code&gt; configuration which is &lt;a href="https://www.netlify.com/blog/how-to-use-pnpm-with-netlify-build/" rel="noopener noreferrer"&gt;pretty straightforward&lt;/a&gt; and &lt;a href="https://yummy.fyodor.io" rel="noopener noreferrer"&gt;works like a charm&lt;/a&gt;. Well, not exactly like a charm, I'd need to correct the SPA routing quirks there definitely if I'd want to make it real serious, but that's probably for the other day.  &lt;/p&gt;

&lt;h2&gt;
  
  
  My opinionated impressions
&lt;/h2&gt;

&lt;p&gt;Here I come with a sheet of random thoughts borne by the results of my successful UmiJS testing.&lt;/p&gt;

&lt;p&gt;🧙 In general, UmiJS provides developers with a clever Angular/&lt;a href="https://redwoodjs.com" rel="noopener noreferrer"&gt;RedwoodJS&lt;/a&gt;-like approach with out-of-the-box tools and scripts for streamlined web development in big teams. The corresponding inevitably huge amount of abstractions and hidden complexity brings a decent level of obscurity and magic, which might be good or bad, depending on the number of dedicated wizards of high level in your team.&lt;/p&gt;

&lt;p&gt;㊙️ One problem these wizards will face though will be poor &lt;del&gt;wizarding library&lt;/del&gt; documentation in English because all the development happens to be in Chinese and English support is quite secondary and lacking. However, you'll have a sufficient amount of general documentation in English anyway, and you'll always have access to the source code — because that's what them wizards do, right?&lt;/p&gt;

&lt;p&gt;🏗️ The Umi's plugin system and API is quite interesting. You can do a lot with that. The approach is quite common for dev tools and in this case resembles both Vite and &lt;a href="https://nx.dev" rel="noopener noreferrer"&gt;Nx&lt;/a&gt; with their extensibility and community orientation. There's a huge ecosystem of plugins of all sorts, and you can always complement them with your own (&lt;em&gt;which is quite important for sophisticated enterprise development&lt;/em&gt;). I'd assume you could build pretty decent metaframework mechanisms with this flexible approach. At least, as I mentioned already, you have a bunch of thoughtful building blocks for that.&lt;/p&gt;

&lt;p&gt;🎨 &lt;a href="https://lesscss.org" rel="noopener noreferrer"&gt;LESS&lt;/a&gt; is recommended by the Umi team officially as a styles preprocessor which is a bit weird and original. I didn't see it often (&lt;em&gt;never, actually&lt;/em&gt;) in other tools (&lt;em&gt;which doesn't lessen LESS's awesomeness, of course&lt;/em&gt;) and it creates some vibe of exclusivity and rebellion (&lt;em&gt;as everything in Umi, TBH&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;🗃️ MPA mode is quite obscure here. I wasn't able to quickly turn my demo app to an MPA as I planned, but I believe digging into configuration and plugins deeper would provide a solution. It's just it's a bit tough, meaning the focus is actually SPAs (&lt;em&gt;though as I mentioned, the client-side routing has runtime quirks too requiring some further unsolicited setup which everyone likes, right?&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;😶‍🌫️ TypeScript support is quite obscure and weird. My &lt;a href="https://www.jetbrains.com/webstorm/" rel="noopener noreferrer"&gt;WebStorm&lt;/a&gt;'s language service got fed up with that from time to time (&lt;em&gt;which probably can be attributed to lack of out-of-the-box support for Umi in particular, but nevertheless&lt;/em&gt;). Again, the matter of configuration, but you know — we, spoiled-with-zero-config-tools developers of 2025, totally forgot what it actually means (&lt;em&gt;along with the dirty words like "Webpack" and such&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;🚫 The linting and formatting capabilities are quite cool in Umi — the default config provides you with a predefined strict and opinionated set of rules which of course can be extended (&lt;em&gt;or limited&lt;/em&gt;) but which would be a good foundation for any developer team from the get-go. Not to mention the possibility to start your CI/CD pipeline from the very beginning and enhance it further on.&lt;/p&gt;

&lt;p&gt;🔞 No &lt;a href="https://react.dev/blog/2024/12/05/react-19" rel="noopener noreferrer"&gt;React 19&lt;/a&gt; support (&lt;em&gt;yet?&lt;/em&gt;) with some expected "blood" in the browser console caused by corresponding deprecations. It's not a big deal, and I can imagine how harsh the potential migration may get, but still. If you're into shiny and new, that's probably not for you. But hey, what are you doing here then, on this chapter?!&lt;/p&gt;

&lt;p&gt;💚 You can use Vue instead of React (&lt;em&gt;via a dedicated &lt;a href="https://umijs.org/en-US/docs/guides/use-vue" rel="noopener noreferrer"&gt;configuration&lt;/a&gt;&lt;/em&gt;) even though the app becomes quite a contraption in this case. Vue is quite loved in the oriental web development tradition so it's not a surprise, and I'm really glad that, as opposed to many other metaframeworks, here you can have options, similar to the loved and only &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;⏳ Not very fast build time, both during development and for production even though it uses the so-called &lt;a href="https://umijs.org/en-US/docs/guides/mfsu" rel="noopener noreferrer"&gt;MFSU&lt;/a&gt; (&lt;em&gt;I assume it's something like &lt;strong&gt;Module Federation Speed Up&lt;/strong&gt;&lt;/em&gt;) under the hood. You can &lt;a href="https://umijs.org/en-US/docs/guides/mfsu#two-build-tools" rel="noopener noreferrer"&gt;use esbuild&lt;/a&gt; as an alternative to webpack though, or even &lt;a href="https://umijs.org/en-US/docs/api/config#mako" rel="noopener noreferrer"&gt;engage Mako&lt;/a&gt; itself (&lt;em&gt;which I hadn't figured out how to use directly in Umi TBH — though there's a short note on it in the CLI, as you could see above&lt;/em&gt;), so maybe there's space for improvement here. Also using MFSU and its overheads on smaller projects is most probably leveled out by incremental build improvements for larger monorepo projects (which obviously get a lot of enablement via MFSU, as we saw).&lt;/p&gt;

&lt;p&gt;🎓 Lack of learning resources around is definitely a problem for Umi. The only comparatively meaningful article about that I found worth attention was &lt;a href="https://blog.logrocket.com/rapid-enterprise-class-development-umijs/" rel="noopener noreferrer"&gt;this LogRocket's writeup&lt;/a&gt; from 2020 (&lt;em&gt;which validates the age of existence of the framework but confirms the limited adoption in the English-speaking world&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;❓ The ideal target market (&lt;em&gt;or ideal customer profile, as the startup bros say&lt;/em&gt;) for Umi is probably the folks who use tools like Angular or Next.js in production for huge enterprise apps built by huge multi-squad teams. The capabilities of opinionated project control the Umi ecosystem and plugins provide is exciting but probably a bit overwhelming for smaller teams and less demanding projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;So this was just an overview (&lt;em&gt;and a test drive, FWIW!&lt;/em&gt;) of the capabilities of this interesting tool used by lots of Chinese software industry monsters like Alibaba Cloud, Taobao, ByteDance, and many others.&lt;/p&gt;

&lt;p&gt;The official UmiJS repository provides &lt;a href="https://github.com/umijs/umi/tree/master/examples" rel="noopener noreferrer"&gt;a whole bunch of examples&lt;/a&gt; of using UmiJS with multiple tools and packages (&lt;em&gt;figured you could actually use it with Vite itself, or &lt;a href="https://remix.run" rel="noopener noreferrer"&gt;Remix&lt;/a&gt;, for instance&lt;/em&gt;). Check them out and decide for yourself. &lt;/p&gt;

&lt;p&gt;Umi is definitely not a tool for everyone, but it's obviously a labor of love of many talented developers and I was really excited to dig deeper and get my hands dirty with that. Who knows, maybe one day I'll need to cheat on my other favorite tools and come back to this dragon — I'll be ready and glad to proceed tinkering with that. Because as Lao Tzu said,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A journey of a thousand Li begins with a single step&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The cover photo by &lt;a href="https://unsplash.com/@h4x0r3" rel="noopener noreferrer"&gt;Thao LEE&lt;/a&gt; from Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>umijs</category>
      <category>react</category>
      <category>software</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How Bun can help to revive a Gridsome project</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Tue, 11 Mar 2025 10:46:37 +0000</pubDate>
      <link>https://forem.com/fyodorio/how-bun-can-help-to-revive-a-gridsome-project-2hi7</link>
      <guid>https://forem.com/fyodorio/how-bun-can-help-to-revive-a-gridsome-project-2hi7</guid>
      <description>&lt;p&gt;Starting from this year, builds for &lt;a href="https://github.com/fyodorio/fyodorio-is-gridsome" rel="noopener noreferrer"&gt;this website's code&lt;/a&gt; through my &lt;a href="http://netlify.com" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt; account began failing.&lt;/p&gt;

&lt;p&gt;Frankly speaking, I'm still not quite sure why. It could be updates to the corresponding Netlify's Ubuntu image used for deployment. Or perhaps changes in the building workflows for Node (&lt;em&gt;which tend to be unnecessarily extensive at times&lt;/em&gt;). It was hard to find the reason, and the community support there is quite slow (&lt;em&gt;as with any community support — hard to blame the guys here&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Meanwhile, on the surface there were some objective reasons for this beast to fail eventually.&lt;/p&gt;

&lt;p&gt;This website is built with &lt;a href="https://gridsome.org" rel="noopener noreferrer"&gt;Gridsome&lt;/a&gt; — one of the oldest static site generators, which is practically not maintained anymore. It causes some troubles for working with websites based on it, specifically the necessity to use Node.js v14 which is quite obsolete and poorly supported on all the public deployment platforms, including Netlify.&lt;/p&gt;

&lt;p&gt;I tried to &lt;a href="https://fyodor.io/migration-from-gridsome-to-astro/" rel="noopener noreferrer"&gt;go away from Gridsome&lt;/a&gt; and migrate to something else a couple of times, but eventually decided to stick with it for now, because it's just smooth — and when something works smoothly, you shouldn't invite unwanted trouble (&lt;em&gt;yeah, that's the old enterprise software developer speaking in me, I know&lt;/em&gt;). Moreover, there's some vintage feeling and nostalgia in using Gridsome these fancy days, especially as it is my digital shed — a place of power and not just some random website I maintain occasionally. I got some interesting letters about this site. I met some people using the same random Gridsome starter I found a million years ago. You know what I mean.&lt;/p&gt;

&lt;p&gt;All in all, before eventually migrating to some boring modern technology, I decided to try using &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; with it instead of Node. I didn't come up with this idea completely out of nowhere; I had some interesting experience with Bun already, and the promise of zero-config development had proven to be a working approach for me. So I decided to test the hypothesis of letting Bun handle the obsolete Node project to see what it would yield.&lt;/p&gt;

&lt;p&gt;Long story short, here's what I did to make it happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update Netlify settings (&lt;em&gt;just in case&lt;/em&gt;) to use the latest available Ubuntu image for deployment&lt;/li&gt;
&lt;li&gt;Remove &lt;code&gt;/node_modules&lt;/code&gt;, &lt;code&gt;/dist&lt;/code&gt;, &lt;code&gt;package-lock.json&lt;/code&gt;, and stuff like &lt;code&gt;.nvmrc&lt;/code&gt; or analogues (&lt;em&gt;it can override the Netlify build settings&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;code&gt;netlify.toml&lt;/code&gt; file (&lt;em&gt;I didn't have it before, delegating configuration to the Netlify's default dashboard settings&lt;/em&gt;) with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[build]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bun run build"&lt;/span&gt;
&lt;span class="py"&gt;publish&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dist"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;package.json&lt;/code&gt; with proper command for &lt;code&gt;start&lt;/code&gt; (&lt;em&gt;if you will&lt;/em&gt;):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;"scripts": {
&lt;span class="gd"&gt;-  "start": "npm run develop",
&lt;/span&gt;&lt;span class="gi"&gt;+  "start": "bun run develop",
&lt;/span&gt;   "build": "gridsome build",
   "develop": "gridsome develop",
   "explore": "gridsome explore"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's basically it. After that, you should run &lt;code&gt;bun install&lt;/code&gt; and test everything locally before pushing your code to production (&lt;em&gt;and also generate &lt;code&gt;bun.lock&lt;/code&gt; on the background, it's mandatory, and you need to push it to your repo too — Netlify uses this file to detect it needs to use Bun instead of Node&lt;/em&gt;). To my surprise, it worked perfectly, and I didn't need to do anything additional. There was some trial and error, but mostly due to my experimenting or testing the limits.&lt;/p&gt;

&lt;p&gt;A couple of spotted tradeoffs after this update were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default &lt;code&gt;http://localhost:8080/&lt;/code&gt; dev server route doesn't work anymore, only the network-exposed one (&lt;em&gt;&lt;code&gt;http://192.168.1.114:8080/&lt;/code&gt; in my case&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Hot reloading doesn't work very smoothly, which is bearable for content editing (&lt;em&gt;which I mostly do&lt;/em&gt;) but probably will be annoying for code changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are definitely not showstoppers but something I want to tinker with further a bit later. It's an affordable price for resurrecting the website.&lt;/p&gt;

&lt;p&gt;In summary, I'd say that if you're a noble gentleman or a lady, you probably should go the migration route and use something like &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; (&lt;em&gt;supports Vue components&lt;/em&gt;) or &lt;a href="https://www.11ty.dev" rel="noopener noreferrer"&gt;11ty&lt;/a&gt; (&lt;em&gt;lightweight and simple&lt;/em&gt;), or basically any static site generator or &lt;a href="https://metaframe.works/comparison/" rel="noopener noreferrer"&gt;modern metaframework&lt;/a&gt;. But as a bit of a tech eccentric, I'll personally reside here for now, thanks to Bun (&lt;em&gt;which I'm now quite motivated to adopt and research further&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The cover photo by &lt;a href="https://unsplash.com/@museumsvictoria" rel="noopener noreferrer"&gt;Museums Victoria&lt;/a&gt; from Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gridsome</category>
      <category>bunjs</category>
      <category>netlify</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hasn’t dev.to become much slower lately? Or is it just me? 🤔</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Fri, 07 Mar 2025 18:31:22 +0000</pubDate>
      <link>https://forem.com/fyodorio/hasnt-devto-become-much-slower-lately-or-is-it-just-me-1iik</link>
      <guid>https://forem.com/fyodorio/hasnt-devto-become-much-slower-lately-or-is-it-just-me-1iik</guid>
      <description></description>
      <category>discuss</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Mon, 27 Jan 2025 13:51:29 +0000</pubDate>
      <link>https://forem.com/fyodorio/meme-monday-4k4b</link>
      <guid>https://forem.com/fyodorio/meme-monday-4k4b</guid>
      <description></description>
    </item>
    <item>
      <title>Let's talk metaframeworks</title>
      <dc:creator>Fyodor</dc:creator>
      <pubDate>Mon, 30 Dec 2024 20:08:24 +0000</pubDate>
      <link>https://forem.com/fyodorio/lets-talk-metaframeworks-2mkb</link>
      <guid>https://forem.com/fyodorio/lets-talk-metaframeworks-2mkb</guid>
      <description>&lt;p&gt;My interest in &lt;a href="https://nuxt.com/docs/guide/concepts/rendering" rel="noopener noreferrer"&gt;full-stack hybrid rendering&lt;/a&gt; and the corresponding tools was sparked by &lt;a href="https://www.youtube.com/watch?v=860d8usGC0o" rel="noopener noreferrer"&gt;Rich Harris’ talk at Jamstack Conf 2021 titled “Transitional Apps”&lt;/a&gt; (you can find the transcription &lt;a href="https://geoffrich.net/posts/rich-harris-jamstack-conf-2021/" rel="noopener noreferrer"&gt;here&lt;/a&gt;, thanks to Geoff Rich). At the time, I was in the middle of my personal JavaScript fatigue (and SPA fatigue) escalation, and the ideas expressed by Rich resonated deeply with me. There wasn’t a sticky name for this approach yet, so “transitional apps” was a kind of first attempt at naming it.&lt;/p&gt;

&lt;p&gt;Several years later, this idea is ubiquitous and is more or less consistently called &lt;strong&gt;“metaframeworks.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the name implies, &lt;em&gt;a metaframework&lt;/em&gt; is something that’s built on top of a framework, yet it also represents the intrinsic essence underlying the conventional framework entity. Yes, I see you yawning already. Practically, it’s a set of tools that complement a UI framework (like React, Angular, Vue, or whatnot) with server-side functionality and deployment adapters. Sometimes, there are many more features included, but that’s the gist of it.&lt;/p&gt;

&lt;p&gt;There are lots of tools in this category, and I’m pretty sure you’ve heard of them — if not used them already (or on a day-to-day basis, like myself).&lt;/p&gt;

&lt;p&gt;There are also lots of opinions about them, with complexity and developer experience often sitting on opposite sides of the scale. The only objective truth is that metaframeworks are something we need to live with, whether we want to or not, and they are, in most cases, a great example of good engineering, with many open-source contributors participating.&lt;/p&gt;

&lt;p&gt;What I personally love about the metaframework movement and its rise in popularity is the emphasis on progressive enhancement and the flexibility that new technologies bring, including the possibilities of building your own bespoke systems using battle-tested tools and templates.&lt;/p&gt;

&lt;p&gt;I want to dig deeper into this whole metaframeworks story, and that’s why I’d like to humbly share with you two things I’ve just started to give myself a good kick into 2025.&lt;/p&gt;

&lt;p&gt;The first is the open-source &lt;a href="https://github.com/fyodorio/awesome-metaframeworks" rel="noopener noreferrer"&gt;Encyclopedia of Metaframeworks&lt;/a&gt; in the form of an awesome-list, familiar to everyone. I’ve gathered the tools and links accumulated in my closet throughout the years, and I invite you to check it out and &lt;a href="https://github.com/fyodorio/awesome-metaframeworks/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;join the ride&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fyodorio" rel="noopener noreferrer"&gt;
        fyodorio
      &lt;/a&gt; / &lt;a href="https://github.com/fyodorio/awesome-metaframeworks" rel="noopener noreferrer"&gt;
        awesome-metaframeworks
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A curated list of awesome resources related to software development with metaframeworks
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Encyclopedia of Metaframeworks &lt;a href="https://awesome.re" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3418ba3754faddfb88c5cbdc94c31ad670fc693c8caa59bc2806c9836acc04e4/68747470733a2f2f617765736f6d652e72652f62616467652e737667" alt="Awesome"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A curated list of awesome resources related to software development with metaframeworks.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#metaframeworks" rel="noopener noreferrer"&gt;Metaframeworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#metaframework-like-tools" rel="noopener noreferrer"&gt;Metaframework-like tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#meta-metaframeworks" rel="noopener noreferrer"&gt;Meta-metaframeworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#building-parts" rel="noopener noreferrer"&gt;Building parts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#ai-tools" rel="noopener noreferrer"&gt;AI tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#auxiliary-tools" rel="noopener noreferrer"&gt;Auxiliary tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#metaframework-heroes" rel="noopener noreferrer"&gt;Metaframework heroes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#comparisons-and-benchmarks" rel="noopener noreferrer"&gt;Comparisons and benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#metaframework-pros" rel="noopener noreferrer"&gt;Metaframework PROs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#metaframework-cons" rel="noopener noreferrer"&gt;Metaframework CONs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#security-for-metaframeworks" rel="noopener noreferrer"&gt;Security for metaframeworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#construction-site" rel="noopener noreferrer"&gt;Construction site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#oss-examples-built-with-metaframeworks" rel="noopener noreferrer"&gt;OSS examples built with metaframeworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#newsletters" rel="noopener noreferrer"&gt;Newsletters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#podcasts" rel="noopener noreferrer"&gt;Podcasts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#live-streams" rel="noopener noreferrer"&gt;Live streams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fyodorio/awesome-metaframeworks#social-media" rel="noopener noreferrer"&gt;Social media&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Metaframeworks&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org" rel="nofollow noopener noreferrer"&gt;Next.js&lt;/a&gt;. React-based framework for building full-stack web applications.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://remix.run" rel="nofollow noopener noreferrer"&gt;Remix / React Router&lt;/a&gt;. Web standards focused React metaframework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nuxt.com" rel="nofollow noopener noreferrer"&gt;Nuxt&lt;/a&gt;. Vue-based framework for performant and production-grade full-stack web apps.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://quasar.dev" rel="nofollow noopener noreferrer"&gt;Quasar&lt;/a&gt;. The enterprise-ready cross-platform Vue framework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://svelte.dev/docs/kit/introduction" rel="nofollow noopener noreferrer"&gt;SvelteKit&lt;/a&gt;. A framework for rapidly developing robust, performant web applications using Svelte.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://start.solidjs.com" rel="nofollow noopener noreferrer"&gt;SolidStart&lt;/a&gt;. Fine-grained reactivity goes fullstack.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tanstack.com/start/latest" rel="nofollow noopener noreferrer"&gt;TanStack Start&lt;/a&gt;. Full-stack React framework powered by TanStack Router.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://analogjs.org" rel="nofollow noopener noreferrer"&gt;Analog&lt;/a&gt;. The fullstack Angular metaframework.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://qwik.dev/docs/qwikcity/" rel="nofollow noopener noreferrer"&gt;Qwik City&lt;/a&gt;. Qwik-based set of tooling for building extremely performant full-stack applications.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://redwoodjs.com" rel="nofollow noopener noreferrer"&gt;RedwoodJS&lt;/a&gt;. Batteries-included React- and RSC-based full-stack web framework for startups.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fyodorio/awesome-metaframeworks" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The second is &lt;a href="https://metaframe.works" rel="noopener noreferrer"&gt;the Metaframeworks Records newsletter&lt;/a&gt;. This will be a regular, focused dive into the world of metaframeworks and the ecosystem around them — tools, news, releases, people, and so on. You’ll hardly find pompous odes to metaframeworks there; rather, you’ll find an unbiased view of the topic and objective, multifaceted opinions.&lt;/p&gt;

&lt;p&gt;All in all, I hope some of these resources might be of use to you, and maybe you’ll even be willing to contribute to them — whether by providing insightful submissions for the encyclopedia or by dropping me interesting relevant findings from around the web via &lt;a href="//mailto:ping@fyodor.io"&gt;email&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With that, remember that the truth is always somewhere in the middle, and it tastes not like shiny Twitter influencer tarts but rather like your home-cooked, granny-recipe cakes.&lt;/p&gt;

&lt;p&gt;Happy new year 🎄&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The cover photo by &lt;a href="https://unsplash.com/@carteryocham" rel="noopener noreferrer"&gt;Carter Yocham&lt;/a&gt; from Unsplash&lt;/em&gt;&lt;/p&gt;

</description>
      <category>metaframework</category>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
