<?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>DEV Community: Valery Zinchenko</title>
    <description>The latest articles on DEV Community by Valery Zinchenko (@framemuse).</description>
    <link>https://dev.to/framemuse</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%2F1220131%2F34366366-14a0-446d-89b4-95dba4c8d25e.jpeg</url>
      <title>DEV Community: Valery Zinchenko</title>
      <link>https://dev.to/framemuse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/framemuse"/>
    <language>en</language>
    <item>
      <title>AI Guidance - How to use AI as a Senior Developer</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Sun, 05 Apr 2026 11:43:54 +0000</pubDate>
      <link>https://dev.to/framemuse/ai-guidance-how-to-use-ai-as-a-senior-developer-4m2m</link>
      <guid>https://dev.to/framemuse/ai-guidance-how-to-use-ai-as-a-senior-developer-4m2m</guid>
      <description>&lt;p&gt;I've been giving LLMs a chance every year now, and now I think the Agents are finally capable of something, so here's I make some use of AI as a Senior Developer.&lt;/p&gt;

&lt;p&gt;I'm experimenting a lot so having a technology that might give me a quick implementation of what's in my mind is a game changer.&lt;/p&gt;

&lt;p&gt;But usually LLMs generates a ton of shit if you don't tell them very specifically what to do, but if you already know what to do exactly, you can implement it yourself 10x faster than any CjAI that goes in circles.&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%2Flxblmsk1o34r1ldard1c.gif" 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%2Flxblmsk1o34r1ldard1c.gif" alt="CJ Meme, Here we go again" width="518" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not a secret here I'm going to expose here that has never been discussed. No, it's very common pattern of &lt;strong&gt;AI Guidance&lt;/strong&gt;, but I was able to reproduce it and actually move forward with actual implementations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put your reasons high
&lt;/h2&gt;

&lt;p&gt;In contrast to you (a senior developer), the LLMs need more &lt;del&gt;water&lt;/del&gt; specific instructions. You can simply go and implement whatever you need, but so that LLM can do its job, it needs hints and direction.&lt;/p&gt;

&lt;p&gt;To make a good use of LLM direction, you basically need to put maximum reasoning level, otherwise it will deviate ridiculously often.&lt;/p&gt;

&lt;p&gt;What works for me is &lt;code&gt;xHigh&lt;/code&gt; setting in Copilot, it takes a very long time to "think" but its output is very on point. And it doesn't consume monthly limit!&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompting Strategy
&lt;/h2&gt;

&lt;p&gt;It's very simple, write what you want in the beginning, add whatever resources you can think of to support your implementation idea.&lt;/p&gt;

&lt;p&gt;It's very crucial since if you don't give all the resources you keep in mind yourself, AI might miss something. It's pretty obvious, but always slips out of mind when prompting, probably because we all think about LLMs as universal program that can read your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multistep Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preparation
&lt;/h3&gt;

&lt;p&gt;As we're a senior engineer, we won't ask for a full implementation of a website/app.&lt;/p&gt;

&lt;p&gt;Instead we first do our human work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think about our app as modules/libraries, the manual labor that no one wants to pay for.&lt;/li&gt;
&lt;li&gt;Do the &lt;code&gt;git init&lt;/code&gt; and you might want to add some initial files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Plan
&lt;/h3&gt;

&lt;p&gt;Do the obvious things you usually do to have better results for yourself and then ask the &lt;strong&gt;Agent&lt;/strong&gt; in the &lt;strong&gt;Agent Mode&lt;/strong&gt; to make a comprehensive plan for the future implementation concentrated in one/few files.&lt;/p&gt;

&lt;p&gt;Then look at the LENGTH of the plan file(s), you don't need to get into them deeply, treat them as PRs from your team mates - read only what's on the surface!&lt;/p&gt;

&lt;p&gt;Keep asking it to iterate the plan once again until you're satisfied with a length of the plans (imagine how much text it would take if you wrote those yourself).&lt;/p&gt;

&lt;p&gt;If you remembered something you forgot to add initially, it's time to add any forgotten/further details.&lt;/p&gt;

&lt;p&gt;And ofc ask to iterate again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sketch
&lt;/h3&gt;

&lt;p&gt;Once it's done, commit the files, ask it to iterate again.&lt;/p&gt;

&lt;p&gt;It's like &lt;code&gt;apt update&lt;/code&gt; you see every before installing a new package.&lt;/p&gt;

&lt;p&gt;Then ask it to outline the program using only Interfaces and Abstract Classes. This is where it starts being interesting.&lt;/p&gt;

&lt;p&gt;It will output some code, you must go through a bit deeper than the plan files since this is what the Agent will be using a foundation, it will follow these interfaces and classes very carefully if it doesn't make sense.&lt;/p&gt;

&lt;p&gt;You may want to edit the files to introduces the corrections, but the Agent is very likely to ignore them, so instead copy the changes in chunks and introduce them at once.&lt;/p&gt;

&lt;p&gt;I personally edit the code myself and then copy-paste chunks to the Agent, sometimes explain how/what/why and then prompt it.&lt;/p&gt;

&lt;p&gt;Commit the files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exclusion
&lt;/h3&gt;

&lt;p&gt;Look at the sketch files once again, think what else could be split or minimized since you want the Agent to be in full focus on the core implementation, you should guide it to skip anything it can waste time on instead of caring about the core.&lt;/p&gt;

&lt;p&gt;e.g. Particle System is a part of a bigger system, but it also consists of sub-systems, you should choose wisely what the Agent should focus on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implement
&lt;/h3&gt;

&lt;p&gt;When you're satisfied with the sketch, which is a very exciting moment because usually it means you're on the very right track and have a very good understanding of the potential implementation (which you should do before moving on).&lt;/p&gt;

&lt;p&gt;It means the Agent will likely have a similar understanding and you can proceed with asking the Agent to implement it using the whole knowledge base, the plans and the sketch.&lt;/p&gt;

&lt;p&gt;When it's done, quickly peek if it actually follows the sketch and looks like something that would work.&lt;/p&gt;

&lt;p&gt;Commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;To actually see if it's good or shit, ask it to create a very minimal, one html file demo, using this module/library.&lt;/p&gt;

&lt;p&gt;Review the demo file, look for the module/library usage, it will tell if the interfaces were good enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there is a very minimal and simple setup of your module, it's a success.&lt;/li&gt;
&lt;li&gt;If the usage is more complex that you wanted, you should proceed with refining it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Commit anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refine
&lt;/h3&gt;

&lt;p&gt;Refining might be the most toughest since the Agent would need to follow and update the Plan/Sketch/Implementation/Demo files - that's why we actually stick to a modular approach rather than a whole application - no LLM is capable of doing such at this moment.&lt;/p&gt;

&lt;p&gt;There are no advice of how to do it better, sure make sure you do commits and review code changes important to you.&lt;/p&gt;

&lt;p&gt;It will likely to change the implementation and the demo separately and lazily - that's good, ask things like "is it possible to do ... in the demo with current implementation?".&lt;/p&gt;

&lt;p&gt;Keep iterating until the usage in the demo file looks clean enough and test the performance (performance tab of the devtools in browsers).&lt;/p&gt;

&lt;p&gt;The interfaces are very important as they are those &lt;strong&gt;you&lt;/strong&gt; will be working with and they are a natural constrain for the Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Merge
&lt;/h3&gt;

&lt;p&gt;Keep going until you implemented satisfied versions of all the modules you see your app consists of.&lt;/p&gt;

&lt;p&gt;Once you're done "building" the modules, you can finally engage yourself fully into the process without AI and maybe start getting  your croissant-only salary.&lt;/p&gt;

&lt;p&gt;Using AI/LLMs/Agents at this stage is very dangerous since it can mess up all the libraries and the code itself, since the reason to [split the work for the Agent into multiple chunks] is for that it doesn't "forget" details much and do a concentrated work, instead of constantly having its context overflowed and compacted.&lt;/p&gt;

&lt;p&gt;That's your stage to shine!&lt;/p&gt;

&lt;p&gt;Later you may refactor the AI-built modules completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Yeah, it looks exactly like you would do the project with a $200,000 salary, which is not what we usually practice, so we always forget that normality exists. &lt;/p&gt;

&lt;p&gt;I tested this approach on my big project, it works nicely, it ofc takes time, but at least now I can suffer less from motivation loss since LLM can at least build something in 1 day that looks like a working solution, comparing to me, that takes 2 months to build non-working one - Hurray!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>agents</category>
    </item>
    <item>
      <title>I overpowered AI by inventing "Brilliant" code by AI opinion itself</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Sat, 07 Mar 2026 21:35:20 +0000</pubDate>
      <link>https://dev.to/framemuse/i-overpowered-ai-by-inventing-brilliant-code-by-ai-opinion-itself-3732</link>
      <guid>https://dev.to/framemuse/i-overpowered-ai-by-inventing-brilliant-code-by-ai-opinion-itself-3732</guid>
      <description>&lt;p&gt;As it always happens to me, I started from describing a simple API client, then I started playing around Mixins, and at this point I really wanted to make my own Mixins library that is just faster than &lt;a href="https://www.npmjs.com/package/ts-mixer" rel="noopener noreferrer"&gt;ts-mixer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I set up benchmarks and started testing what works fast, I honestly got tired of hours of benchmarking and did what usually developers do right now when there are in a dead-end - asking LLM, I asked my agent to make it fast as possible, usually I don't do this, but this time and decided to establish proper tests and benchmarks, so AI can &lt;strong&gt;comfortably&lt;/strong&gt; deprive me of my job. I let it iterate for some time, while going out for bread. Long story short - it did improve the performance, but it also told me that to push limits even further, it would need to sacrifice some specification and "correctness", which I thought is insane since &lt;strong&gt;I felt&lt;/strong&gt; like it can be much faster.&lt;/p&gt;

&lt;p&gt;I tried some times again and again until I noticed that it's cycling 2-3 the same implementations and ignoring my notes, doesn't matter how much I told it to go further and "don't make mistakes", it still made mistakes, breaking the code, then fixing it and telling me that "no, that's it".&lt;/p&gt;

&lt;p&gt;I decided to forget AI and do it myself, it spent even more hours, without buying any single loaf of bread, I've gone over the options. When I felt like I was almost there partially fitting the spec and having better performance - I did a mistake, I waste my time asking AI to finish it &lt;strong&gt;again&lt;/strong&gt;. It just gave the same code as before and that's it actually.&lt;/p&gt;

&lt;p&gt;Next day, with fresh state of mind - I did it - I came with my own &lt;code&gt;CompositeMap&lt;/code&gt; that is just 40 lines and insanely fast. It seems it's also interesting from the point of keys ordering, usually in &lt;code&gt;CompositeMap&lt;/code&gt; [A, B] does not equal [B, A]. There are libraries for CompositeMap indeed, moreover there is a &lt;a href="https://github.com/tc39/proposal-composites" rel="noopener noreferrer"&gt;TC39 proposal for Composite keys&lt;/a&gt;, but these libraries and polyfills are not fast enough for &lt;strong&gt;me&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's where I pushed the limits to the top and even asked AI what it thinks about it.&lt;br&gt;&lt;br&gt;
This is what it said:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;That code is brilliant. This is a "Performance Masterclass". This is a very clean implementation of a "Discrete Identity Map." ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Though it wasn't able to come up with this code that I need itself, even when I have done everything LLM needs.&lt;/p&gt;

&lt;p&gt;This simply highlights that no matter how good AI is and will be, it will never be better than what you do yourself since LLM are trained with what people were able to do in the past and post about it. It is simply unaware and can't reproduced things no one has thought or talked about - that's on &lt;strong&gt;you&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Can you be better than AI? Yes! In fact, you are better because you are human. Anyone saying "this is a prompting skill issue" or "use another model" are just gasping for what is not there - coding skill. You're not going to be replaced if you do code yourself, but you are replaceable if you can't do code without LLM, it's simple math.&lt;/p&gt;

&lt;p&gt;Was I able to save any time using LLM? - hmm, actually no. Whenever I put long running process, it requires careful and exhausting prompting and I just go for a break and out for a bread, but I could've coded myself all this time getting the results much faster or understanding I failed earlier.&lt;/p&gt;

&lt;p&gt;Thanks to the company I'm working on by letting me to work on this kind of side work.&lt;br&gt;&lt;br&gt;
It's always that people are ignoring "serious" posts about real world things, so I decided to combine memes and make this topic a bit more involving.&lt;/p&gt;

&lt;p&gt;Here's the code: &lt;a href="https://github.com/pinely-international/mixin/blob/main/src/CompositeMap.ts" rel="noopener noreferrer"&gt;https://github.com/pinely-international/mixin/blob/main/src/CompositeMap.ts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shortly how it works: for every object it assigns ID incrementally and hashes all keys with &lt;a href="https://en.wikipedia.org/wiki/Mask_(computing)" rel="noopener noreferrer"&gt;bitmask&lt;/a&gt;, this way it's super fast and order-insensitive - it is bit-wise. The bitmask is usually used for things like Flags and usually seen in Game Development. There is a limitation though, bitmask can take very limited about of variants, usually up to 32 (depends how many bits your integer is). In my &lt;code&gt;CompositeMap&lt;/code&gt;, if it runs out of 32 bits, it escalates to BigInt, which is still faster than other libraries. However, for Mixins, it's not often to have 32 variations of mixins, so it should be fine anyway.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>End Of The Year For Denshya Libraries</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Tue, 16 Dec 2025 11:36:30 +0000</pubDate>
      <link>https://dev.to/denshya/end-of-the-year-for-denshya-libraries-2mom</link>
      <guid>https://dev.to/denshya/end-of-the-year-for-denshya-libraries-2mom</guid>
      <description>&lt;p&gt;Hello everyone,&lt;br&gt;
By now, there were some accomplishments.&lt;br&gt;
&lt;a href="https://github.com/pinely-international/tama/discussions/145" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/discussions/145&lt;/a&gt;&lt;br&gt;
(Though I'm not entirely satisfied with the quality of the code, &lt;em&gt;AI is the evil&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Some planned issues were not completed because there was 3 weeks pause on this project due to other projects I'm engaged in.&lt;/p&gt;

&lt;p&gt;Despite of this delay, I was constantly thinking and considering evolution options for Denshya and Tama, now I see clearly that mere renaming (to Tama) and documentation polishing is not enough.&lt;/p&gt;

&lt;p&gt;I was questioning signals approach generally (which I like) and by watching React Dev Conference 2025, I understood that React gives (at least) familiar and nice data-modelling approach, which I like too.&lt;br&gt;
I can't just ignore the fact that React nails it, whereas Tama focuses on different aspects.&lt;/p&gt;

&lt;p&gt;With this, I made a decision to support both approaches, both signals and plain JS scoped updates.&lt;br&gt;
For you, this just means React hooks will work in Tama (potentially any React components will work too). Though for me it means more work 🥲&lt;/p&gt;

&lt;p&gt;I adopted Tama in different projects to see how well it solves problems where React fails and how it &lt;strong&gt;feels&lt;/strong&gt; to use Tama. My conclusion: Tama itself is great, it feels much better than React in terms of "Freedom", but all-around reactivity is tedious at complex data structures, though the state-management overall is nice too.&lt;/p&gt;

&lt;p&gt;That's why now I will be focusing on providing more appealing and familiar way for data-modeling and state-management through React hooks and maybe something else. Only then I will switch back to "cosmetics", "ergonomics" and polishing. I will do that in &lt;a href="https://github.com/denshya/reactive" rel="noopener noreferrer"&gt;this Reactivity library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also implemented a documentation website with SSR and benchmarks for it, so take a look:&lt;br&gt;
&lt;a href="https://github.com/pinely-international/tama/tree/main/docs/ssr" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/tree/main/docs/ssr&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/pinely-international/tama/tree/main/benchmarks/ssr" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/tree/main/benchmarks/ssr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For now, I'm suspending new releases until I figure a new data-modeling strategy and util I'm generally satisfied with the quality of the library. The new releases will definitely be resumed in the new year 2026! 😁&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;feat: add &lt;code&gt;disableJSXCache&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;Fix typos in README&lt;/li&gt;
&lt;li&gt;Remove unnecessary logic&lt;/li&gt;
&lt;li&gt;Refactor code&lt;/li&gt;
&lt;li&gt;Migrate &lt;code&gt;Symbol.subscribe&lt;/code&gt; to &lt;code&gt;subscribe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add Multiple on Events Binding - issue #33&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Mount&lt;/code&gt; for conditional mounting per attribute&lt;/li&gt;
&lt;li&gt;Integrate TransitionAPI state handling with tests&lt;/li&gt;
&lt;li&gt;feat(lifecycle): Add life.scoped and hook enter into component constructor &lt;/li&gt;
&lt;li&gt;Renaming to "Tama"&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Tama.Ref&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;feat(lifecycle): Support cleanup functions in Life.scoped&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; with AI usage guidelines&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;ref&lt;/code&gt; attribute&lt;/li&gt;
&lt;li&gt;Add SSR Benchmarks&lt;/li&gt;
&lt;li&gt;Implement Documentation Website with Tama itself&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New Contributors
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;bittere made their first contribution in &lt;a href="https://github.com/pinely-international/tama/pull/97" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/pull/97&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;1amKhush made their first contribution in &lt;a href="https://github.com/pinely-international/tama/pull/100" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/pull/100&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;meetdhorajiya made their first contribution in &lt;a href="https://github.com/pinely-international/tama/pull/107" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/pull/107&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Divayang-2006 made their first contribution in &lt;a href="https://github.com/pinely-international/tama/pull/126" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama/pull/126&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>news</category>
      <category>frontend</category>
      <category>showdev</category>
    </item>
    <item>
      <title>We're Joining Hacktoberfest 2025 🎉 with TamaJs</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Mon, 22 Sep 2025 13:18:13 +0000</pubDate>
      <link>https://dev.to/framemuse/denshya-protonjs-joins-hacktoberfest-2025-4ed7</link>
      <guid>https://dev.to/framemuse/denshya-protonjs-joins-hacktoberfest-2025-4ed7</guid>
      <description>&lt;p&gt;We're excited to announce that &lt;strong&gt;Denshya TamaJs&lt;/strong&gt; is officially participating in &lt;strong&gt;Hacktoberfest 2025&lt;/strong&gt; 🍂&lt;/p&gt;

&lt;p&gt;Whether you're a seasoned open-source contributor or just starting your journey, Hacktoberfest is the perfect opportunity to get involved, sharpen your skills, and make an impact.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Tama.js&lt;/strong&gt;, you'll get hands-on experience contributing to a growing ecosystem while being part of a global celebration of open source.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Why contribute to Tama.js?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn by contributing in a friendly community&lt;/li&gt;
&lt;li&gt;Explore new possibilities and enhance existing tools&lt;/li&gt;
&lt;li&gt;Boost your GitHub portfolio with meaningful contributions&lt;/li&gt;
&lt;li&gt;Earn exclusive Hacktoberfest swag along the way&lt;/li&gt;
&lt;li&gt;Land a job if your contributions are valuable and meaningful&lt;/li&gt;
&lt;li&gt;Having a fun of course!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Start contributing today: &lt;a href="https://github.com/pinely-international/tama" rel="noopener noreferrer"&gt;https://github.com/pinely-international/tama&lt;/a&gt;&lt;br&gt;
🐱 Join &lt;a href="https://discord.gg/digitalocean" rel="noopener noreferrer"&gt;discord hacktoberfest server&lt;/a&gt; and find more details about the project in the &lt;code&gt;hacktoberfest-projects&lt;/code&gt; channel.&lt;/p&gt;

&lt;p&gt;Let's build future together this Hacktoberfest 🚀&lt;/p&gt;




&lt;p&gt;It is a part of a bigger set of libraries - Denshya - a movement of signal-based, DOM-first, Open Source Frontend Libraries. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/denshya" rel="noopener noreferrer"&gt;https://github.com/denshya&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently it's being developed in &lt;a href="http://github.com/pinely-international" rel="noopener noreferrer"&gt;http://github.com/pinely-international&lt;/a&gt;, which is the company you could be hired in.&lt;/p&gt;

&lt;p&gt;It also challenges DOM standards with &lt;a href="https://github.com/whatwg/dom/issues/736#issuecomment-2989073586" rel="noopener noreferrer"&gt;Group proposal&lt;/a&gt; with &lt;a href="https://github.com/framemuse/node-group" rel="noopener noreferrer"&gt;this library&lt;/a&gt; that is being used as the only dependency for TamaJs.&lt;/p&gt;

&lt;p&gt;All this means there are lots of work, so you can take in work anything you want.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>react</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>useEffect With AbortSignal</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Mon, 15 Sep 2025 17:32:54 +0000</pubDate>
      <link>https://dev.to/framemuse/use-reactuseeffect-like-a-pro-with-abortsignal-4l69</link>
      <guid>https://dev.to/framemuse/use-reactuseeffect-like-a-pro-with-abortsignal-4l69</guid>
      <description>&lt;p&gt;If this is the way you subscribe to events, then you must keep reading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onDrag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DragEvent&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onDrop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DragEvent&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="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDrag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDrop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return &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="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDrag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDrop&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, there are other ways to subscribe to these ones such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;div onDrag={onDrag} onDrop={onDrop} /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Using libraries with utility hooks like &lt;code&gt;useEvent&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, the problem is that - it's not always accessible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want to properly listen to resize updates, you should use &lt;code&gt;ResizeObserver&lt;/code&gt; or to track viewport enter, the &lt;code&gt;IntersectionObserver&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;There are cases when you need to integrate third-party libraries that are not React into React 😱, and subscribe to the elements like shown in the example above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shows example is already ok, but we can raise the bar a little bit. And this is good to know several ways how to implement something rather than single one.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal" rel="noopener noreferrer"&gt;&lt;code&gt;AbortSignal&lt;/code&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AbortSignal&lt;/code&gt; is simply an object that can be passed when you subscribe to an event source, either &lt;code&gt;addEventListener&lt;/code&gt; or &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget" rel="noopener noreferrer"&gt;&lt;code&gt;when(...).subscribe&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So instead of calling a separate function to &lt;strong&gt;unsubscribe&lt;/strong&gt;, you can just pass a &lt;code&gt;signal&lt;/code&gt; and that's it. The subscription or &lt;strong&gt;subscriptions&lt;/strong&gt; can terminated when &lt;code&gt;signal.abort&lt;/code&gt; is called.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved &lt;code&gt;useEffect&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;To make an improvement, we simply introduce a &lt;code&gt;AbortController&lt;/code&gt; to have access to &lt;code&gt;abort&lt;/code&gt; and the &lt;code&gt;signal&lt;/code&gt; that we can pass around.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;abortController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AbortController&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;abortController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;

    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;abortController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you can go further and create a very simple custom hook&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useEffectScoped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&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;const&lt;/span&gt; &lt;span class="nx"&gt;abortController&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AbortController&lt;/span&gt;
    &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;abortController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;abortController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&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;To transform the final implementation into this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nf"&gt;useEffectScoped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&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;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;drop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which eliminates extra unsubscribe call (&lt;code&gt;removeEventListener&lt;/code&gt;) for each subscription (&lt;code&gt;addEventListener&lt;/code&gt;), shorts &lt;code&gt;AbortController&lt;/code&gt; and &lt;code&gt;return&lt;/code&gt; declaration.&lt;/p&gt;

&lt;p&gt;In total we're abstracting away from almost half of the code!&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://dev.to/framemuse/new-framework-ripple-what-about-others-3mc8"&gt;New Framework Ripple? What about Others?&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/pinely-international/proton" rel="noopener noreferrer"&gt;Support Proton with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>react</category>
      <category>frontend</category>
    </item>
    <item>
      <title>New Framework Ripple? What about Others?</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Sat, 13 Sep 2025 11:10:48 +0000</pubDate>
      <link>https://dev.to/denshya/new-framework-ripple-what-about-others-3mc8</link>
      <guid>https://dev.to/denshya/new-framework-ripple-what-about-others-3mc8</guid>
      <description>&lt;p&gt;That's funny how people who already has media traction can sell basically anything - unfinished, unpolished project that repeats Vuejs with React style.&lt;/p&gt;

&lt;p&gt;It's not something bad actually, but the way it's done is just killing me slow. Ripple is not unique, on my way of creating &lt;em&gt;actually new framework&lt;/em&gt; - &lt;a href="https://github.com/pinely-international/proton" rel="noopener noreferrer"&gt;Proton&lt;/a&gt;, I've seen so many frameworks like Ripple, so I don't really understand how people are attracted to THIS, while not attracted to anything else that really changing it.&lt;/p&gt;

&lt;p&gt;Yeah, I guess that's just marketing, now you have to &lt;strong&gt;sell&lt;/strong&gt; a open source project. Imagine how many projects die that could've changed the industry because they didn't have enough of media resource? - Probably a lot.&lt;/p&gt;

&lt;p&gt;Why Ripple even got attention? It uses JSX, while actually not, because it uses its own &lt;code&gt;.ripple&lt;/code&gt; files, which simply means entirely new syntax parser. It parasitize on what's loved by community and includes by what's hated, but still sold.&lt;/p&gt;

&lt;p&gt;Maybe it's giving something better than reactive &lt;code&gt;$&lt;/code&gt; that Vuejs has already been doing forever?&lt;/p&gt;

&lt;p&gt;A new syntax of mapping an array? Wait! Angular has already doing that.&lt;/p&gt;

&lt;p&gt;You can declare components with &lt;code&gt;component&lt;/code&gt; keyword - OMG, WTF, so you're saying I'm so idiot that I need a special keyword to declare a component?&lt;/p&gt;

&lt;p&gt;JavaScript directly in the html? Mmm, is this some kind of punishment? I think there is a reason why developer community is up to &lt;code&gt;{{foo}}&lt;/code&gt; syntax...&lt;/p&gt;

&lt;p&gt;Maybe a nice tree-shaking? SSR speed? Small bundle size? Customization? Anything actually new? Well It's basically a mix of several frameworks &lt;strong&gt;without&lt;/strong&gt; any change, and I'm afraid it inherits the worst qualities of all of them rather than vice versa.&lt;/p&gt;

&lt;p&gt;So what, people are dumb? - No, people are trustful, they trust in people they are already subscribed to, so they eat what they give, even if it's undercooked meat.&lt;/p&gt;

&lt;p&gt;Why youtubers advertise this? - Because &lt;strong&gt;they&lt;/strong&gt; are dumb... well I mean they just ride on a hype wave :(&lt;/p&gt;

&lt;h2&gt;
  
  
  What then?
&lt;/h2&gt;

&lt;p&gt;Can we just appreciate some open source projects that really require attention?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Back the builders, not the buzz, spotlight open source that actually make a move.&lt;/li&gt;
&lt;li&gt;Stop applauding noise, promote projects that solve real problems.&lt;/li&gt;
&lt;li&gt;Discover, star and support under-the-radar projects.&lt;/li&gt;
&lt;/ol&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/pinely-international/proton" rel="noopener noreferrer"&gt;Support Proton with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/reactivehtml/rimmel" rel="noopener noreferrer"&gt;rimmel&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/kitajs/html" rel="noopener noreferrer"&gt;kitajs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Embeddable Open Source Unity-like Editor for ThreeJS</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Mon, 18 Aug 2025 07:19:00 +0000</pubDate>
      <link>https://dev.to/framemuse/embeddable-open-source-unity-like-editor-for-threejs-2mm9</link>
      <guid>https://dev.to/framemuse/embeddable-open-source-unity-like-editor-for-threejs-2mm9</guid>
      <description>&lt;p&gt;I'm a open-source developer, so yes I do staff for free even if you don't pay me.&lt;/p&gt;

&lt;p&gt;This is a short introduction a concept of embeddable editor for easier development of 3D apps in ThreeJS (for Vite bundler).&lt;/p&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;Embeddable ThreeJS Editor in browser that you can add to any of your existing projects, expand (Picture-in-Picture) to a second display and add/move/remove/update scene objects in real time while you're is running - no need for annoying restarts.&lt;/p&gt;

&lt;p&gt;This is helpful if you're designing a scene and you want to move/update objects freely to proactively see how they look, which is 100x faster than editing, reloading and only then looking.&lt;/p&gt;

&lt;p&gt;It enables Visual Programming, so that you can compose a scene even with object behavior using only interactive editor.&lt;/p&gt;

&lt;p&gt;It resembles Unity and Godot editor, so if you're already familiar with these, it should be easy to learn.&lt;/p&gt;

&lt;p&gt;You don't need subscriptions, registration or anything, all happens on your computer and only - it's self-hosted, it's just a library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why me
&lt;/h2&gt;

&lt;p&gt;I have a big experience in UI Design and Frontend Development as well as Patience about game development (and I worked with Unity). So I think I'm a good person to work on this and actually ship a product that you will be using.&lt;/p&gt;

&lt;p&gt;I have a little &lt;strong&gt;roadmap&lt;/strong&gt; for this project&lt;br&gt;
&lt;a href="https://www.patreon.com/posts/136404913" rel="noopener noreferrer"&gt;https://www.patreon.com/posts/136404913&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's possible
&lt;/h2&gt;

&lt;p&gt;Thanks to new Web APIs that recently got available in browsers and ThreeJS that took care implementing it.&lt;br&gt;
Thanks to my another project - &lt;a href="https://github.com/denshya/proton" rel="noopener noreferrer"&gt;Denshya Proton ⭐&lt;/a&gt; that allowed me to build such UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your feedback
&lt;/h2&gt;

&lt;p&gt;I don't ask to donate me as I might not be able to finish this project, but I'm asking for your feedback to understand if this even matters to keep building.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>discuss</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Transparent NodeParent Without Wapprer: a new DOM Node</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Tue, 05 Aug 2025 08:09:00 +0000</pubDate>
      <link>https://dev.to/framemuse/documentfragment-upgaded-a-live-reparentable-dom-primitive-3bkh</link>
      <guid>https://dev.to/framemuse/documentfragment-upgaded-a-live-reparentable-dom-primitive-3bkh</guid>
      <description>&lt;p&gt;After struggling several months spent brainstorming how I could implement this without DOM patching, something which seemed to be impossible turned out to be pretty easy.&lt;/p&gt;

&lt;p&gt;Not everything, but essential parts like "remote attaching" of nodes and "PersistentFragment" was achieved purely in conventional Vanilla JS.&lt;/p&gt;

&lt;p&gt;Here's the tests &amp;amp; playground:&lt;br&gt;
&lt;a href="https://stackblitz.com/edit/node-group" rel="noopener noreferrer"&gt;https://stackblitz.com/edit/node-group&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The One Big Reveal
&lt;/h2&gt;

&lt;p&gt;Traditional &lt;code&gt;DocumentFragment&lt;/code&gt; is a one‑shot batch—append it once, its children move into the host, and the fragment empties itself. If you need the same nodes elsewhere, you must clone or rebuild them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Group&lt;/code&gt; changes that. It holds onto its children as single instances, and lets you attach the very same nodes to multiple hosts - not by duplicating or sequentially reappending, but by moving the live nodes between parents while they remain discoverable via &lt;code&gt;childNodes&lt;/code&gt;.&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;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt;
&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// mount the same nodes in hostA&lt;/span&gt;
&lt;span class="nx"&gt;hostA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;childNodes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// [span, img, div]&lt;/span&gt;

&lt;span class="c1"&gt;// later, move them to hostB, without losing discovery:&lt;/span&gt;
&lt;span class="nx"&gt;hostB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;childNodes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// still [span, img, div]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike &lt;code&gt;DocumentFragment&lt;/code&gt;, &lt;code&gt;Group&lt;/code&gt; does not clear its &lt;code&gt;childNodes&lt;/code&gt; on &lt;code&gt;append&lt;/code&gt;. It simply reassigns their parentage - so your live nodes persist as a coherent set across hosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Actually Matters
&lt;/h2&gt;

&lt;p&gt;Shared Ownership: Borrowing React compositional mindset - sharing a single node tree instead of duplicating or rebuilding it. Now multiple containers can host the exact same elements, without side-effects.&lt;/p&gt;

&lt;p&gt;Wrapper-free Transparency: No extra &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; or invisible wrapper. Under the hood, &lt;code&gt;Group&lt;/code&gt; is a Custom Element shim that preserves CSS selector behavior, event targeting, and box‑model semantics.&lt;/p&gt;

&lt;p&gt;Live, Incremental Updates: Every append, remove, or move inside a Group fires &lt;code&gt;connectedCallback&lt;/code&gt;/&lt;code&gt;disconnectedCallback&lt;/code&gt;, streaming exactly the DOM mutations you expect - no &lt;code&gt;innerHTML&lt;/code&gt; rewrites, no virtual DOM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alignment with WHATWG &lt;code&gt;PersistentFragment&lt;/code&gt; Proposal
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Group&lt;/code&gt; mirrors &lt;a href="https://github.com/whatwg/dom/issues/736#issuecomment-2989073586" rel="noopener noreferrer"&gt;WHATWG Issue #736&lt;/a&gt;: "A &lt;code&gt;DocumentFragment&lt;/code&gt; whose nodes do not get removed once inserted."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent fragment semantics: children survive mounts.&lt;/li&gt;
&lt;li&gt;No artificial wrappers: CSS and DOM behave as if the fragment never existed.&lt;/li&gt;
&lt;li&gt;Mutation tracking via Custom Elements: no heavy diffing, just native callbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Perfect Fit With Proton Rootless Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/denshya/proton" rel="noopener noreferrer"&gt;Proton&lt;/a&gt; struggled to express null or an array of nodes from components without fake containers. Group solves this by exposing a mountable footprint that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Represents null but retains identity.&lt;/li&gt;
&lt;li&gt;Integrates with inflators to plug into the DOM later.&lt;/li&gt;
&lt;li&gt;Moves dynamically without re-rendering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Cases That Spark Imagination
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shared UI fragments: One tree, live across multiple panes.&lt;/li&gt;
&lt;li&gt;Drag‑and‑drop reparenting: Move a node group seamlessly between containers.&lt;/li&gt;
&lt;li&gt;Nullable Proton components: Maintain identity even when nothing renders.&lt;/li&gt;
&lt;li&gt;Plugin UIs without hacks: Inject UI anywhere without hijacking a root.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  But Let's Be Skeptical: What Doesn't Work (Yet)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;parentNode&lt;/code&gt; illusions: Children report their real parent, not the &lt;code&gt;Group&lt;/code&gt; - maybe contrary to some expectations.&lt;/li&gt;
&lt;li&gt;Serialization gaps: No native markup for named fragments - will be implemented if enough attraction is gained.&lt;/li&gt;
&lt;li&gt;Callback latency: Custom‑element lifecycle timing can introduce microtask delays - but in reality I haven't noticed even once.&lt;/li&gt;
&lt;li&gt;Browser support: Custom Elements V1 only; legacy browsers need polyfills.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Try It Now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install node-group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt;
&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Text1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Text2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Note3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Roadmap &amp;amp; Ambitions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Named fragment registry (e.g. &lt;code&gt;Group.groups&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Configurable parent-reporting behavior for &lt;code&gt;.parentNode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;SSR‑friendly anchors for direct serialization.&lt;/li&gt;
&lt;li&gt;Collaboration with WHATWG on native support.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;I built a DOM primitive that feels like the future-persistent, transparent, live UI chunks that remain discoverable and mutable. No virtual DOM, no wrappers, no re-renders - just native behavior in plain JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Call to Action
&lt;/h2&gt;

&lt;p&gt;Let's see what it hides behind and where it can evolve to - this can't happen without you.&lt;/p&gt;

&lt;p&gt;I would gladly appreciate if you &lt;a href="https://github.com/FrameMuse/node-group" rel="noopener noreferrer"&gt;star the repo&lt;/a&gt; and support me with a &lt;a href="https://ko-fi.com/framemuse" rel="noopener noreferrer"&gt;coffee&lt;/a&gt;.&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya/proton" rel="noopener noreferrer"&gt;Support Proton with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya" rel="noopener noreferrer"&gt;Denshya Movemenet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.pinely.eu/" rel="noopener noreferrer"&gt;Pinely International&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>opensource</category>
      <category>tooling</category>
      <category>frontend</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Flexing Your Brain In ChatGPT Guide</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Tue, 15 Jul 2025 05:14:00 +0000</pubDate>
      <link>https://dev.to/framemuse/how-to-use-chatgpt-without-degrading-2do3</link>
      <guid>https://dev.to/framemuse/how-to-use-chatgpt-without-degrading-2do3</guid>
      <description>&lt;p&gt;Here are simple steps/rules how to use ChatGPT and alike without brain rot and being degraded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not copy &lt;strong&gt;anything&lt;/strong&gt; from what LLM replies, safely copy what you answer, of course, if your answers/prompts are entirely written by you. Treat ChatGPT like a book rather than a source you can copy from, yes it's tempting, but that's where all the brain rot comes from.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Plan what you want to discuss or create with very simple and rough points, write them down somewhere.&lt;/li&gt;
&lt;li&gt;In a new chat without using Deep Thinking/Reasoning (so that LLM uses less memorized data from you). &lt;strong&gt;Browse&lt;/strong&gt; information, look for additional knowledge and ask opinions for each point you wrote down - DO NOT include your opinions - only ask just like you would search info in Google.&lt;/li&gt;
&lt;li&gt;Now go away from LLM, maybe drink something, just relax a bit.&lt;/li&gt;
&lt;li&gt;Then think about what LLM told you for each point without looking at its responses.&lt;/li&gt;
&lt;li&gt;Expand the points you wrote down in the beginning, make them more detailed, you may use wording that LLM gave (it actually really good at it), which you remember.&lt;/li&gt;
&lt;li&gt;Consider and create a draft of the end result you want (and write down) without copying LLM replies, using only your own words.&lt;/li&gt;
&lt;li&gt;Create new chat and start giving it parts of what you drafted one by one, read what it answers and answer next with related content of what you drafted. Try to not change your draft too much, but you can adapt it. NO OPINIONS SO FAR. Only guiding the AI in the direction of your desired result.&lt;/li&gt;
&lt;li&gt;When you ran out of points, give your last answer as emotional and opiniated as you can in the same chat.&lt;/li&gt;
&lt;li&gt;Congratulations! You gained 2000x times more data from simple points that you had, which you actually are aware of and already processed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you have a lot to get to the end result you wanted from the beginning. Yes, this approach takes time, but it takes much less than pure Googling and laying of information yourself.&lt;/p&gt;

&lt;p&gt;Of course, you should not forget about Googling - Check important info and if you doubt something LLM gives you - go and read the articles in the internet or at least ask LLM to give a list of sources to read.&lt;/p&gt;

&lt;p&gt;Thanks for reading! How do you keep away from brain rot?&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya/proton" rel="noopener noreferrer"&gt;Support Proton with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya" rel="noopener noreferrer"&gt;Denshya Movemenet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.pinely.eu/" rel="noopener noreferrer"&gt;Pinely International&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>TamaJs Core - No Root Components</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Sun, 06 Jul 2025 09:52:37 +0000</pubDate>
      <link>https://dev.to/denshya/rootless-unframed-framework-2gdh</link>
      <guid>https://dev.to/denshya/rootless-unframed-framework-2gdh</guid>
      <description>&lt;p&gt;Building a rootless framework is difficult, but still &lt;a href="https://github.com/pinely-international/tama" rel="noopener noreferrer"&gt;TamaJs&lt;/a&gt; was built with a very intentional design choice: its components are allowed to return anything - from DOM Nodes, to primitives, and &lt;code&gt;null&lt;/code&gt;/&lt;code&gt;undefined&lt;/code&gt;. This flexibility is not a bug, but a feature. However, this freedom comes with sharp edges: when &lt;code&gt;null&lt;/code&gt; is returned, no anchor is created, and the view replacement logic has nothing to latch onto.&lt;/p&gt;

&lt;p&gt;One of core goals of Tama is to eliminate the concept of "Root Components" entirely and embrace fully "Atomic Components" - meaning self-contained, relocatable, and behaviorally independent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Another layout&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Some layout&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;componentView1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inflator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;componentView2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inflator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// These should be two independent component nodes with identical reactive behavior.&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;componentView1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;componentView2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&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="c1"&gt;// And they should be moveable across the DOM freely.&lt;/span&gt;
  &lt;span class="nx"&gt;anotherElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;componentView2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;componentView1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where complications begin to surface. Without an anchor or predictable rendering footprint, &lt;code&gt;null&lt;/code&gt; becomes a dead-end.&lt;/p&gt;

&lt;p&gt;These problems (dynamic mounts, node independence, movable view layers) are elegantly solved by &lt;a href="https://github.com/framemuse/node-group" rel="noopener noreferrer"&gt;&lt;code&gt;node-group&lt;/code&gt; library&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing &lt;code&gt;Group&lt;/code&gt; node
&lt;/h2&gt;

&lt;p&gt;The design of &lt;code&gt;Group&lt;/code&gt; is a practical implementation of the &lt;a href="https://github.com/whatwg/dom/issues/736" rel="noopener noreferrer"&gt;&lt;code&gt;DocumentPersistentFragment&lt;/code&gt; proposal&lt;/a&gt;, aiming to cover its core aspects in current browsers. The proposal envisions a fragment that can persist beyond a single parent and avoid surrogate wrapper elements. &lt;code&gt;node-group&lt;/code&gt; approximates these goals today by leveraging custom elements and live synchronization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alignment with the Proposal
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Persistent Fragment Semantics&lt;/strong&gt;&lt;br&gt;
The proposal defines a &lt;code&gt;DocumentPersistentFragment&lt;/code&gt; that its children remains even when its was attached to a parent. In &lt;code&gt;node-group&lt;/code&gt;, it follows this precisely.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;Group&lt;/code&gt; instance can be reparented at any time. When appended to a new parent, its associated nodes removed from the previous one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-Wrapper Behavior&lt;/strong&gt;&lt;br&gt;
The proposal discussion emphasizes avoiding synthetic wrapper elements. &lt;code&gt;node-group&lt;/code&gt; uses a non-rendering custom element that emits no visual footprint. To engines, the &lt;code&gt;Group&lt;/code&gt; nodes appear as true direct children, preserving CSS, Box Model and Layout consistency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Mutation Tracking&lt;/strong&gt;&lt;br&gt;
While the spec would rely on low-level fragment mutation observers, &lt;code&gt;node-group&lt;/code&gt; hooks into the Custom Elements API (&lt;code&gt;connectedCallback&lt;/code&gt;/&lt;code&gt;disconnectedCallback&lt;/code&gt;) to detect when a relay enters or leaves the DOM. It then streams &lt;code&gt;append&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, and &lt;code&gt;move&lt;/code&gt; operations to the targeted parent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group Usage Example&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-group&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Group&lt;/span&gt;
&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;footer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&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;const&lt;/span&gt; &lt;span class="nx"&gt;note&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aside&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;note&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Persistent Fragment in action&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;note&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Group&lt;/code&gt; not only solves TamaJs dynamic mounting challenges, but also opens up door for future enhancements.&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/pinely-international/tama" rel="noopener noreferrer"&gt;Support Tama with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya" rel="noopener noreferrer"&gt;Denshya Movemenet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.pinely.eu/" rel="noopener noreferrer"&gt;Pinely International&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>A React Alternative That Turned out Better than I Thought</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Tue, 01 Jul 2025 13:35:01 +0000</pubDate>
      <link>https://dev.to/denshya/this-react-alternative-turned-out-better-than-i-thought-4ggf</link>
      <guid>https://dev.to/denshya/this-react-alternative-turned-out-better-than-i-thought-4ggf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I was always striving for something better, first I was making my own little tools working with JQuery, then I started learning more about VanilaJS, after all I found React. It was a Heaven that day, but learning deeply was really something incredible difficult and felt like hell.&lt;/p&gt;

&lt;p&gt;Now I'm very used to React, I don't even think about how things work anymore, I'm just building - which is great! Unless you want to strive for more.&lt;/p&gt;

&lt;p&gt;While learning React I was trying out how I could build application with different architectures. The thing I figured out is that &lt;strong&gt;everything is possible&lt;/strong&gt;, but you need &lt;strong&gt;hooks&lt;/strong&gt; :)&lt;/p&gt;

&lt;p&gt;This means you can't use your tools you've been developing and polishing for years in another frameworks or just in VanilaJS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits are Reached
&lt;/h2&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%2Fz31b5swsswi0mijfteew.webp" 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%2Fz31b5swsswi0mijfteew.webp" alt=" " width="285" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While figuring out architecture patterns and how I can organize things with React, I realize I can't go even further just because &lt;strong&gt;React itself&lt;/strong&gt; doesn't allow me to do so, I can't really &lt;strong&gt;customize&lt;/strong&gt; it. It might seem like too much, but that's maybe just for you as a user-developer, but for as Developer-Tools developer, that's something I'm missing very much.&lt;/p&gt;

&lt;p&gt;The complexity of React is not going anywhere, they can't fix it, it wouldn't be React anymore. It's easily proven by React Team themself since they Pre-Released React Compiler, which should help avoid that fundamental complexity - even they understand that it can't be fixed.&lt;/p&gt;

&lt;p&gt;That's why some developers choose other frameworks over React like Angular, Vue, Svelte, SolidJS, ...&lt;/p&gt;

&lt;h2&gt;
  
  
  Tired 😩
&lt;/h2&gt;

&lt;p&gt;I'm honestly tired from React, that's true that it's my Money-Making machine and that's a tool I can use to quickly build something - even faster than AI as for now. However, I'm striving for even better reality and I'm really tired of using this one tool for too long with not so many improvements.&lt;/p&gt;

&lt;p&gt;Like why I need that &lt;code&gt;useOptimistic&lt;/code&gt; if I could build that hook on my own, just let me do that - they don't.&lt;/p&gt;

&lt;p&gt;Maybe let me introduce at least ONE SINGLE new attribute so I don't suffer  with importing a function over and over again, why I can't just do that?&lt;/p&gt;

&lt;p&gt;Is that really so difficult?&lt;br&gt;
&lt;code&gt;&amp;lt;div classBEM={["base", { active: true }]} /&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Sketching into Reality
&lt;/h2&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%2Fll7fuxa7b56599lxav88.gif" 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%2Fll7fuxa7b56599lxav88.gif" alt=" " width="444" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I had enough of it, I just started sketching the better React and was a chaos to be honest. I was imagining a beast, but eventually I took the practical approach and simplified many things, it took almost a whole year to just sketch what I wanted - It took another year to reach several severe goals I wanted.&lt;/p&gt;

&lt;p&gt;Now I'm ready to give something I'm proud of&lt;br&gt;
&lt;a href="https://denshya.github.io/proton/learn/" rel="noopener noreferrer"&gt;https://denshya.github.io/proton/learn/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is something between React, SolidJS and VanilaJS - you can create components almost like in React with Observables like in SolidJS, while attaching Components like regular VanilaJS elements!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Example&lt;/strong&gt;&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;function&lt;/span&gt; &lt;span class="nf"&gt;RangeApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return &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="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;range&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;progress&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;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;%&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/progress&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inflator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;WebInflator&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AppView&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inflator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inflate&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;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppView&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// And you can move it arround.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why it's better
&lt;/h2&gt;

&lt;p&gt;If you're too lazy to the whole docs, I will give a quick list of why I would prefer Proton over React for the next project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No hooks - Do things and reuse them anywhere (even in React).&lt;/li&gt;
&lt;li&gt;Observables - no need to rely on Component lifecycle, I can design and develop state flows and then use/reuse them in components or directly in elements as globals.&lt;/li&gt;
&lt;li&gt;Customization - I can add my own attributes to elements and even render DOM Nodes directly to JSX.&lt;/li&gt;
&lt;li&gt;No root hijacking - I'm just building components and then put them as see it fits - all the components can be Root Components right now.&lt;/li&gt;
&lt;li&gt;Super lightweight - I'm an extreme footprint optimizer, so for me saving 200kb of code means a lot! Proton is just ~5kb!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Seemingly Successful Road
&lt;/h2&gt;

&lt;p&gt;In the beginning I tried it on my own personal projects - it was not so good, I was really questioning if it's even worth continuing building.&lt;/p&gt;

&lt;p&gt;But now I'm building a website for the company I'm working at (&lt;a href="https://dev.pinely.eu/" rel="noopener noreferrer"&gt;Pinely&lt;/a&gt;) and we're planning to spread it to another projects we had if clients do not mind.&lt;/p&gt;

&lt;p&gt;So I think it's somewhat a success for me, I've been inspired by many people and library I've seen outer no one is looking at - so I want to say thanks to these libraries as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/WebReflection/uhooks" rel="noopener noreferrer"&gt;https://github.com/WebReflection/uhooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WebReflection/usignal" rel="noopener noreferrer"&gt;https://github.com/WebReflection/usignal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WebReflection/dom-augmentor" rel="noopener noreferrer"&gt;https://github.com/WebReflection/dom-augmentor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WebReflection/heresy-ssr" rel="noopener noreferrer"&gt;https://github.com/WebReflection/heresy-ssr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReactiveHTML/rimmel" rel="noopener noreferrer"&gt;https://github.com/ReactiveHTML/rimmel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/snabbdom/snabbdom" rel="noopener noreferrer"&gt;https://github.com/snabbdom/snabbdom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yelouafi/unReact" rel="noopener noreferrer"&gt;https://github.com/yelouafi/unReact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kitajs/html" rel="noopener noreferrer"&gt;https://github.com/kitajs/html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya/proton" rel="noopener noreferrer"&gt;Support Proton with a ⭐&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/denshya" rel="noopener noreferrer"&gt;Denshya Movemenet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.pinely.eu/" rel="noopener noreferrer"&gt;Pinely International&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>react</category>
      <category>showdev</category>
    </item>
    <item>
      <title>It's wrong time for Vibe coding, We don't have right tools yet</title>
      <dc:creator>Valery Zinchenko</dc:creator>
      <pubDate>Fri, 13 Jun 2025 15:36:29 +0000</pubDate>
      <link>https://dev.to/framemuse/vibe-coding-came-too-early-2mi8</link>
      <guid>https://dev.to/framemuse/vibe-coding-came-too-early-2mi8</guid>
      <description>&lt;p&gt;Vibe coding felt like a shot of adrenaline—exciting, dreamy, but totally out of sync. Right now, our tools are too shaky and our playground too messy. In game engines you have some order. On the web, it is chaos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Many Moving Parts
&lt;/h3&gt;

&lt;p&gt;There are dozens of frameworks. Thousands of libraries. New standards pop up every week. Web Components promised easy modules, but they still feel clunky. One month you learn React way. Next month you chase Svelte. Then you jump to Solid or Qwik. Who knows what comes next? It is a dizzying spin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing Building Blocks
&lt;/h3&gt;

&lt;p&gt;Core features are half‑built. Real state lifecycles? Still sketchy. Built‑in suspense? Barely there. Teams waste hours wrestling with glue code and browser quirks. How can you trust your flow when half the pipes leak?&lt;/p&gt;

&lt;h3&gt;
  
  
  Hype Burns Fast
&lt;/h3&gt;

&lt;p&gt;Hype grabs attention. But hype also crashes hard. Vibe coding looks magical - until it crashes. Will anyone trust this idea in future after everyone burned their last drops of confidence? Doubt will linger.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Can't Keep up the Pace
&lt;/h3&gt;

&lt;p&gt;LLMs learn patterns, but patterns shift daily - syntax changes, APIs evolve, AI spits out outdated code. It cannot "feel" the latest tricks - on unstable ground, it just slips off.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fix the Foundation First
&lt;/h3&gt;

&lt;p&gt;We need firm basics before we improvise. We need simple, solid primitives for rendering and state. We need stable standards with clear rules. We need tools that don't break every update and that LLMs can easily pick up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Waiting for True Love
&lt;/h3&gt;

&lt;p&gt;Vibe coding can wait, right now it is a false promise. Let us patch the holes. Let us nail the boards. When the stage stops shaking, we can finally be vibing truly and with pleasure.&lt;/p&gt;




&lt;p&gt;Honestly I love this idea, I love vibing and coding. Now using AIs feel like suffer, especially if you're a developer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
