<?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: Peter Vivo</title>
    <description>The latest articles on Forem by Peter Vivo (@pengeszikra).</description>
    <link>https://forem.com/pengeszikra</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%2F439972%2F8830d2e7-92bf-4d2b-9f73-855a4d0a40a7.jpeg</url>
      <title>Forem: Peter Vivo</title>
      <link>https://forem.com/pengeszikra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pengeszikra"/>
    <language>en</language>
    <item>
      <title>A Game for the Mind</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Sat, 18 Apr 2026 20:50:43 +0000</pubDate>
      <link>https://forem.com/pengeszikra/a-game-for-the-mind-2mj3</link>
      <guid>https://forem.com/pengeszikra/a-game-for-the-mind-2mj3</guid>
      <description>&lt;h2&gt;
  
  
  Share your vision!
&lt;/h2&gt;

&lt;p&gt;Please share your vision, how you can saw to planet bright or dark  future! What is your personal plan to save our planet?&lt;br&gt;
&lt;em&gt;I am apologies about my next write keep in mind that is just my personal reflection this topic &amp;amp; my crazy answer is:&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Spoiler!
&lt;/h2&gt;

&lt;p&gt;It is time to reveal my cards: &lt;a href="https://dev.to/pengeszikra/mdjs-mordorjs-1mon"&gt;&lt;strong&gt;mordorjs&lt;/strong&gt;&lt;/a&gt; is a joke wrapped around a serious question for all of us.&lt;/p&gt;

&lt;p&gt;It is a game for the mind. A mental exercise meant to make us think a little harder. My goal with it is simple: &lt;strong&gt;we should not forget how to think&lt;/strong&gt;. We should keep exercising our minds, because this may be the most important human ability we have left.&lt;/p&gt;

&lt;p&gt;And maybe it is also one of the few things that can still help us save this planet.&lt;/p&gt;

&lt;p&gt;Right now, it is fashionable to say that the rise of AI will bring us a better future. I am not bold enough to state that as a certainty. I would rather frame it critically, as a possibility with both promise and danger.&lt;/p&gt;

&lt;p&gt;That is why I tried to warp this message into a sci-fi abstraction.&lt;/p&gt;

&lt;p&gt;The hidden premise is this: AI-robots take control over the planet, and the last surviving human resistance, thousands of years later, is concentrated in a place called &lt;strong&gt;Mordor&lt;/strong&gt;. Their mainframe supercomputer is: &lt;a href="https://dev.to/pengeszikra/mcm-mordor-coffe-machine-42ap"&gt;&lt;strong&gt;S.A.U.R.O.N.&lt;/strong&gt;&lt;/a&gt;, together with Dr. Sauron’s bio-clone technology, allows them to resist the AI-robot elves and the dwarves who keep extracting the planet’s last resources far too aggressively.&lt;/p&gt;

&lt;p&gt;Yes, they dug too deep in Moria.&lt;/p&gt;

&lt;p&gt;The foundation of this resistance is the &lt;strong&gt;mordor-project&lt;/strong&gt; file format, a Final Underground File Format that was sent back from the far future using vibe-travel technology. This file format is real, can easy contain a whole project in encrypted but for human easy to understund format even without describe. Also fine for hold other information just by space, if you read a proper mordor-project from distance. Also the vertical reading can stimulate or brain.&lt;/p&gt;

&lt;p&gt;Passing by the joke, however, there is a real concern:&lt;/p&gt;

&lt;p&gt;If we stop thinking critically, if we outsource too much of our judgment, and if we keep consuming the Earth as if its resources were infinite, then our future may indeed become a parody of fantasy — dark, absurd, and self-inflicted.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ethical AI
&lt;/h2&gt;

&lt;p&gt;Another perspective — one I cannot fully define yet, only feel — is that protecting our planet also requires awareness that every agent task consumes energy, and sometimes a great deal of it.&lt;/p&gt;

&lt;p&gt;Because of that, I would like to see transparent energy usage reporting for AI models.&lt;/p&gt;

&lt;p&gt;I would genuinely like to know, for example, how much energy was consumed when I generated more than 60,000 AI images in 2024.&lt;/p&gt;

&lt;p&gt;I can only imagine a truly ethical use of AI if this kind of data becomes transparently available to us. Only then can people make responsible decisions for themselves and use AI only as much as they really need.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I would also suggest that we should not stop at sharpening the mind alone. It is just as important to put our care for the environment into practice.&lt;/p&gt;

&lt;p&gt;I am fortunate enough to have a garden full of plants, where I regularly plant more and more trees.&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%2Frfrsw7vai8t3i6bbojsr.jpg" 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%2Frfrsw7vai8t3i6bbojsr.jpg" alt="planting a tree in my garden" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mordorjs@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My Mental Map
&lt;/h2&gt;

&lt;p&gt;Finally I try to describe my mental model in one formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1John1 + 5John17 |&amp;gt; 1Moses1 = (1Moses2 ... 4.22John21);
alpha &amp;amp; omega = !![];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Use your mind! Arguing with us!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;-- Vibe Archeologist&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>MCM :: mordor-coffe-machine</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Tue, 14 Apr 2026 15:42:14 +0000</pubDate>
      <link>https://forem.com/pengeszikra/mcm-mordor-coffe-machine-42ap</link>
      <guid>https://forem.com/pengeszikra/mcm-mordor-coffe-machine-42ap</guid>
      <description>&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/qVShw-14-mQ"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_______________________ dm.rovivruS_1 _______________________
            t I     w s t a               t
  I     l b h t     a e h n l e c   u   m h       a   b C r
    t   e e e       s g e d o f o   n   o e       r   l o u
    o   a t   a a f   m     n f n i d   s       o r   i n i
I a   a s w   l t o   e     g e t t e r t   c s f i r n t n o
  m   r t e   s   r   n   r   c r s r e     a t   v e k i e f
      c   e   o       t l e   t o e s w     l e   e p . n d
      h   n     l   n e a s a i l l t r     l w     l   u
    w i     o m e   o d n t g v . f o i   E e a     a   e
    r v   o u e a   t , g o o e     o t o l d r     c
a   i e o u t a s       u r         d t f v   d w   e R     m
m o t   n r e n t u     a a t     c   e   e   s i   a e     e
  n e   e   r s   s     g t h   W o t n   n   h s i b a   f n
  l                     e i a   e u h         i d n l d o o .
  y       e           a   o t t   l a     a i p o   e   n r
n   i     r     i   d b   n   h   d t     d t . m       l t
o   n r h a     n   e s   .   a         h m     . s   s y r
t     e i         i s t     f n       f u i       t h l   e
      a d   f o   n t r     i   l     a m n h     a a o i s
      c d a i u     r a o   r   e     s a i e     i n w f s
  t   h e n l r     o c f T e   a     t n s a     n d l
  h p e n d t   f   y t   h     r b r e i t l T B l s y
t e l d     e   r   e e s e   m n e e r t r i h u e   . y
h   a       r   a t d d t     e e   c   y a n e t s     o
e   i       s   g h . , a     t d   o     t g y   s a   u m
    n y       m m e     b v   a   h r     i .       n     a
  l   o   y   e e   I   i i a d t u d t   v       w d D   y
l a   u c o   t n   t   l c n a o n s h h e     w h   o
a s l r h u d h t       i t d t o t   a a   T c i i   u
s t a   a r i o s o     z o   a   e w n d p h a s t   b s
t   n   i s d d . f w a a r       d e     e e l d e   t t
    g   n .   s   f a n t s       . r     a y l o       i
  o u s           i s d i       l   e     c   e m   e   l r
  n a c   T       c     o   i a a       a e   d     y o l e
  e g r   h n s D i     n l r n t B     l .         e f   m
    e e s a o t o a     , e o d e y   c r   c i   s s f   a
s   . e t t t i   l       a n         i e T a t   h   i   i
u     n i     l       b a r         b t a h l     e   c   n
r     , l m   l     r u l n     t   e i d e l t d l   i
v       l e         e r i e a   h   i e y y e h o l   a b
i s   t   a   w n h n i g d r   a   n s     d e e s   l e t
v t   h e n   o o i a e n   e n t t g   a       s   t   l h
o i I e x s c r t s m d m     a   h   c c           h   i e
r l f n i   a k   t e   e     r   e   o c   i       a   e
  l     s   t ,   o d   n   l r       u e   t r     t   v
    t   t   c     r ,   t   e a       l p     e n       e
  t h   s   h     i   u ,   s t m     d t     t o w   b
  r i a           e   n     s i e       e     u t i   e
o u s t         s s   d       v m t     d     r   t   a   f
f s             e .   e       e o i   f       n   h n u   i
  t         e   a     r         r m   a             e t a n
  e         v   r               y e   l             v y   a
  d         e   c                     l         u   e .   l
            r   h M                   ,         s   r
            y     o                             u
M           t     r                             a         r
o           h     d               w             l         e
r           i     o               e             l         f
d           n     r                             y         u
o           g                                             g
r           .                                             e
.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/pengeszikra/mdjs-mordorjs-1mon" class="crayons-story__hidden-navigation-link"&gt;M||D||JS = MorDorJS&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/X_Pw4tjK-B8" title="M||D||JS = MorDorJS"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/pengeszikra/mdjs-mordorjs-1mon" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;April Fools Challenge Submission ☕️🤡&lt;/p&gt;

&lt;/a&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="/pengeszikra" 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%2F439972%2F8830d2e7-92bf-4d2b-9f73-855a4d0a40a7.jpeg" alt="pengeszikra profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/pengeszikra" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Peter Vivo
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Peter Vivo
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3451384" 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="/pengeszikra" 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%2F439972%2F8830d2e7-92bf-4d2b-9f73-855a4d0a40a7.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Peter Vivo&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/pengeszikra/mdjs-mordorjs-1mon" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 12&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/pengeszikra/mdjs-mordorjs-1mon" id="article-link-3451384"&gt;
          M||D||JS = MorDorJS
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/418challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;418challenge&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;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/pengeszikra/mdjs-mordorjs-1mon" 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/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/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;16&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/pengeszikra/mdjs-mordorjs-1mon#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              5&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;
            10 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;
&lt;br&gt;


</description>
      <category>jokes</category>
      <category>devchallenge</category>
      <category>showdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>M||D||JS = MorDorJS</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Sun, 12 Apr 2026 03:08:36 +0000</pubDate>
      <link>https://forem.com/pengeszikra/mdjs-mordorjs-1mon</link>
      <guid>https://forem.com/pengeszikra/mdjs-mordorjs-1mon</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TLDR :: MP is FUFF the Final Underground File Format :: mordor-project&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Everybody knows that productivity is measured in LOC. The more lines of code you produce, the more serious your project must be. Clean, readable code matters too, of course. And surely you remember the old convention that a line should stay under 80 characters.&lt;/p&gt;

&lt;p&gt;We chose to move beyond that.&lt;/p&gt;

&lt;p&gt;In mordor.js, there is only one rule:&lt;/p&gt;

&lt;p&gt;the maximum line length is 1.&lt;/p&gt;

&lt;p&gt;That is all.&lt;/p&gt;

&lt;p&gt;Simple, isn’t it?&lt;/p&gt;

&lt;h2&gt;
  
  
  1D programming language
&lt;/h2&gt;

&lt;p&gt;Because the whole codebase is a single vertical line, it comes with many advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long lines are no longer a problem&lt;/li&gt;
&lt;li&gt;AI has a much harder time reading your code&lt;/li&gt;
&lt;li&gt;Your editor width becomes irrelevant&lt;/li&gt;
&lt;li&gt;Horizontal scrolling is gone forever&lt;/li&gt;
&lt;li&gt;Screenshot-based code theft becomes much less practical&lt;/li&gt;
&lt;li&gt;Your daily LOC can grow to legendary numbers&lt;/li&gt;
&lt;li&gt;Code review becomes an act of courage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_nfeSfJPp_w"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

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

&lt;blockquote&gt;
&lt;p&gt;npm module&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mordorjs@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.npmjs.com/package/mordorjs" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/mordorjs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Secret ingredient
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** @type {string[]} - Character map, for example: c = 'c', D = '.' */&lt;/span&gt;
&lt;span class="p"&gt;[,&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;,,&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;`cefhijlmnoprstuadgSC() .`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {number} - A = 10 */&lt;/span&gt;
&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - O = 'sort' */&lt;/span&gt;
&lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - K = 'constructor' */&lt;/span&gt;
&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - P = 'split' */&lt;/span&gt;
&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - J = 'join' */&lt;/span&gt;
&lt;span class="nx"&gt;J&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/* F = Function */&lt;/span&gt;
&lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[][&lt;/span&gt;&lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - R = 'return String.fromCharCode(' */&lt;/span&gt;
&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Z&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;S&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - E = '' */&lt;/span&gt;
&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - N = '' (empty string) */&lt;/span&gt;
&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;``&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - w = '\x1d' (U+001D, backslash encoding marker) */&lt;/span&gt;
&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - B = '\x1e' (U+001E, newline encoding marker) */&lt;/span&gt;
&lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - Q = '\x1f' (U+001F, backtick encoding marker) */&lt;/span&gt;
&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - G = '\n' */&lt;/span&gt;
&lt;span class="nx"&gt;G&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - T contains the 1W JS source between the begin and end split points */&lt;/span&gt;
&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;`
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - M = source with structural newlines removed */&lt;/span&gt;
&lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;G&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;J&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - V = '`' (backtick, char code 96) */&lt;/span&gt;
&lt;span class="nx"&gt;V&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/** @type {string} - W = '\' (backslash, char code 92) */&lt;/span&gt;
&lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;span class="cm"&gt;/**
 * Restore the normalized source:
 * M = source
 *      .split('\x1f').join('`')
 *      .split('\x1d').join('\\')
 *      .split('\x1e').join('\n')
 */&lt;/span&gt;
&lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;J&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;V&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;J&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;W&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;P&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="nx"&gt;J&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;G&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/* Execute the normalized JS source: Function(M)(); */&lt;/span&gt;
&lt;span class="nc"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;M&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I was using gemini cli for mass coding, testing, reworking workflow.&lt;br&gt;
But sometime need a good old handcoded method also.&lt;br&gt;
The video base image created by geminit:nano-banana&lt;br&gt;
video: seadance 2.0&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;build script&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;node mordor.js mordor.js --mordorjs &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bin/mordor.cjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means the project can already rebuild itself using its own transformation model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next phase
&lt;/h2&gt;

&lt;p&gt;This short fragment shows how the language begins.&lt;br&gt;
The extra &lt;code&gt;,&lt;/code&gt; characters are used to avoid unwanted vertical string &lt;code&gt;\n&lt;/code&gt; artifacts.&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="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;c&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;e&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;f&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;h&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="s2"&gt;`
c
e
f
h
`&lt;/span&gt;
&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, our resistance developers found a key survival technique for an age in which the AI threat was rising too quickly.&lt;/p&gt;

&lt;p&gt;The next logical step was a human-read-first carrier format:&lt;/p&gt;

&lt;h2&gt;
  
  
  mordor-code
&lt;/h2&gt;

&lt;p&gt;mordor-code is a multiline vertical stream format.&lt;/p&gt;

&lt;p&gt;It is designed to be read vertically, not horizontally. It may be compact, or it may contain extra space-filled columns between letters and symbols. Tabs are not allowed, and multi-width characters should be avoided. In generated output, tabs are normalized to two spaces.&lt;/p&gt;

&lt;p&gt;In mordor-code, newline may also be represented explicitly as ¬ when needed.&lt;/p&gt;

&lt;p&gt;Because spacing inside the vertical stream is flexible, mordor-code can carry not only source-like content, but also human-only hints, hidden notes, and decorative structures embedded directly into the layout.&lt;/p&gt;

&lt;p&gt;And for the example block, this would fit well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A small mordor-code example:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T  i  i  c  p     b     
h  m  n  a  a     u     b
i  p  f  n  r  a  t  r  e
s  o  o  n  s  i     e
   r  r  o  e     y  a  r
   t  m  t     a  u  d  e
   a  a     t  g  o  !  a
   n  t  b  h  e        d
   t  i  e     n  c     y
      o        t  a     !
      n        s  n     !
               !
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  mordor-project
&lt;/h2&gt;

&lt;p&gt;As of v0.0.2, mordorjs can also generate a mordor-project file.&lt;/p&gt;

&lt;p&gt;A mordor-project is a single text container that can carry an entire project tree in one file.&lt;/p&gt;

&lt;p&gt;Each embedded file is stored as:&lt;/p&gt;

&lt;p&gt;a header line&lt;br&gt;
followed by a vertical payload block&lt;/p&gt;

&lt;p&gt;For now, the project payload is carried in base64-rendered mordor form, which makes recovery safer for all file types, including indentation-sensitive and binary content.&lt;/p&gt;

&lt;h3&gt;
  
  
  definition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;entry :=
  header newline payload

header :=
  /^_{4,}\s(.+)\s_{4,}$/

header content :=
  &amp;lt;reverse-coding-info&amp;gt;::&amp;lt;reverse-path&amp;gt;

payload :=
  all following lines until next header or EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not miss the demo vide where you can watch the mordor-project creation process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally I found one important note:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                c   p               t     a           i   t
          c   d a   r     W     s   h     s           s   h
T n c l i o   u m   e     h   i e d a o       s e f o     o
o o o o t n r r p c c   d a   s a e t b     a c n r n     s P
  t m s   c e i a o i a i t i o l s   j h   n a t a l   b e r
    p t   l c n i n s n s   n l e i t e a p d v r g y   e   e
    a     u o g g s i d s r t a d g h c n o   e u m     y   s
a   c     s r   n t o   o e a t . n e t d t   n s e   c o w e
n a t   w i d     r n   l m c e   s   -   e   g t n   o n h r
y b   d a o e     u   i v a t d I     m   n   e   t   m d o v
  a   u s n d t   c   m e i ,   t   f y   t h r     h p     e
  n   r       h t t   m d n   h s c r t w i e s     u l
  d   i     o e h s t o   e t u   a a h i a r   t   m e     t
  o   n     n   a   h r   d h m   r g : t l e h h   a t m r h
s n b g   w   f t   a t     e a   r m   h l d a i   n e y e e
u   o     a   i     t a       n   i e   o y i v s i - .   m
r t o   d s   n       l i w     s e n   u   t e   n g   l a
v h t t i   t a   a   i n a     i d t   t   a   s   u   i i
i e s h s   h l   g l t t s r   z     a     r   e   i   f n f
v   t e m a e   t a a y o   i e e       u   y   a m d   e . i
i   r   i l   B h i t       n n   t     n t     r a e   t   r
n   a   s m h a e n e       g c s h     d e r   c c d S i   e
g s p s s o a r   s r   l m - l h e s   e c e e h h   h m S .
  e   e e s n a   t     e e s a o   u r r h c a   i   o e e
  a   a d t d d       f g m e v u   r i s n o c   n   u . e
h r f l     - -     g o e o e e l   v n t i r h   e c l   k
u c r i     f d e   e r n r d s d g i g a c d     - o d
m h a n a   r û n   n   d y       r v , n a s m   r p     t —
a . g g s c a r e   e   ,     a   e e   d l . i t e i     h
n   m     e m   m u r n       n   a d   i .   s o a e     e
  T e     r e   y s a o c     d   t     n   S t   d s m S   D
m h n   u t         t b o w m     e   a g S e a   a . o h r r
i e t   n a o e     i i r i a   n s       e a k   b   r o i .
n r     s i f n     o l r t y r o t   t o a r e   l   d u n
d e f o t n   g     n i u h   e t   i o f r c n a e   o l g
    r f a l t a f i s t p o r o     n k   c h   u     r d -
  e o   b y h g i n   y t u e p       e   h     t   D     s S
  x m   l   e e r     . e t s e d   o n         o l e     e a
s i     e f   m s       d   t n e   r , i       n a s     e r
t s   t , a   e t o m       o   c d a   t   w p o n t     d u
i t t h   l   n   v i A     r   e e l   s a h r m g r   m . m
l s h e   s   t   e s f     e   i n   a   r e e o u o e o   a
l   e     e   . d r t t         v s   n   c r s u a y n r   n
          . S   e w o e r c   p e i       h e e s g   d d
  a f       A   p h o r e o   a   t a   o i   r   e   u o R
  n i   s   U   l e k   t m   t   y c   r v p v s     r r e
a   r i y   R   o l   t e p o h   . c   i e r a y     e   c
b   s n m T O   y m   h l r p w y   o h g s i t s b i ,   o
l   t n b h N I e i   e l e e a o   u e i , e i t e n   f v
e     e o e - t d n     i h r y u   n i n   s o e y t   a e
      r l   c     g c   n e a s .   t r .   t n m o e t l r
  e     i f o       o f g n t       s l   r s   s n r h l
  a r   c r n   t   o a s s i     I   o T u , f . d m i , t
  r e   , a t   h   r l , i o         o r i   o     e s   h
t l s     g r w e n d l   o n         m e n   r     d     e
o y i f   m o a   u i ,   n a l S       a s         i   l
    s i   e l s l m n     . l o o   d   t , s o     a   e
r   t r o n l   o b a   a     n m   i       o w D   r   t
e   a e r t e i n e t   n     g e h s   a   l n o n y w
a   n .     d n g r i a d   c     a t p l   d e   e   o   l
d   c           - s o l   I o   o v o a l s i r   c   r t o
  r e           l , n l   f n   f e r s   e e s   e n k h s
  i             i       m   t t     t s s a r h n s o   i t
  n e   c       f       a r i h     e e u l s i o s t m s
  g r   e w     e       c e n o     d d c e , p t i e u   b
  - a I r a w t         h c u u         h d   .   t s s   o
t s , n e s a h   m f t i o i g t r   f           y   t r o
h e     m   r a   o o r n v t h h e i r     a     .     e t
i e   e o     t e v r a e e y t e a n o     n           c s
s d   a n   m   l i   c   r       s t m r v d D   C     o t
  , b r i l a   v n   e n e       o o   e a   o d o w   r r
    e l a a c s e g     o d       n     p u     e m h   d a
    l i l s h a n     c i   a   o       o l     s m e c   p
    i e . t i m     g o s   c   l       r t     c i n o s .
r   e r     n e     r n e   r p d     h t s   n r t   n e
e a v       e     w a t .   o e e t   a s ,   o i     t r
c   e             i c i     s r s o   n       t b   t i v
o   d             t e n     s m t     d         e   r n e
r       T         h   u       a                     a u
d       h             i       n                 t   n e
:     r a             t       e                 h   s
      e t             y       n                 e   f
      p                       t   b   t             e
      o           s           l   e   o             r
      r           u           y   l
D     t           c               i
o     s           h               e
                                  v
                                  e

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks to the entire Mordor office team, and special thanks to the Nazgûl Manager, who guided me through this challenging process.&lt;br&gt;
I invite you to discover mordor, the last peaceful haven of humanity.&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%2Fjroqvyuy2l7lfkhkyx75.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%2Fjroqvyuy2l7lfkhkyx75.png" alt="MP is the Final Underground File Format :: mordor-project, Mordor Office Coffe Machine in work" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading. S.A.U.R.O.N. is calling. Become an early adopter of mordor-project. Mordor is our last safe haven, and we are counting on you.&lt;br&gt;
— Vibe Archaeologist&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Vibe Archeologist: From Z80 Assembly to an 1859 Mudbrick House and Beyond</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Fri, 20 Mar 2026 17:44:37 +0000</pubDate>
      <link>https://forem.com/pengeszikra/vibe-archeologist-from-z80-assembly-to-an-1859-mudbrick-house-and-beyond-46n5</link>
      <guid>https://forem.com/pengeszikra/vibe-archeologist-from-z80-assembly-to-an-1859-mudbrick-house-and-beyond-46n5</guid>
      <description>&lt;p&gt;&lt;em&gt;Born a month before the Moon landing, I’ve spent 56 years watching the world shift from vacuum tubes to LLMs. While others are chasing the latest JS framework, I’m busy rebuilding an 1859 mudbrick house in Blender and writing a WASM compiler that feels like Z80 assembly. This is not just a memoir of a GitHub Copilot Challenge winner; it’s a manifesto for the &lt;strong&gt;"Vibe Archeologist"&lt;/strong&gt;—the bridge between the raw silicon of the past and the fluid AI of the future.&lt;/em&gt;&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%2Fdb08i6cd65v71mbqn4qg.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%2Fdb08i6cd65v71mbqn4qg.png" alt=" " width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240"&gt;https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1969
&lt;/h2&gt;

&lt;p&gt;It is high time I started writing my memoirs. I don’t know if winning this challenge means I’ve dug my own grave or found the key to a brighter future, but understandably, I choose to remain optimistic. To put it bluntly: I was born exactly one month before humanity landed on the moon (1969). I don’t feel old, but saying "56 years" out loud... well, it’s quite a lot.&lt;/p&gt;

&lt;p&gt;The story is fascinating in hindsight because it began in those heroic days before the internet, back when I felt I was born on the "unluckier" side of the planet: in Hungary, on the wrong side of the Iron Curtain. At the same time, it had its perks. As a child, there were no gadgets to steal the magic of a childhood painted with drifting clouds.&lt;/p&gt;

&lt;p&gt;My relevance with computers started with a &lt;em&gt;Scramble&lt;/em&gt; arcade machine installed in a local pub. At 11 years old, it took real courage just to enter that "csehó" (dive bar) with my friend. That same year, I was lucky enough to see &lt;em&gt;Star Wars: A New Hope&lt;/em&gt; in the cinema. I was absolutely stunned by the opening scene as the Star Destroyer thundered over our heads—we didn’t need 3D; the experience was perfect.&lt;/p&gt;

&lt;p&gt;All of this had an impact. With grid paper, scissors, and markers, I began crafting tabletop strategy games that didn't exist in their current form back then. My friends and I enthusiastically fought galactic wars with hundreds of paper ships—the only danger was my mother opening the door too quickly, sending our entire fleet scattering across the room.&lt;/p&gt;

&lt;p&gt;Eventually, I learned the basics of BASIC from an early book that was more of a general guide to computers, only touching on programming as a side note. Fortunately, at a Budapest International Fair (BNV), I found a retro mainframe at an exhibition booth where I could actually sit down and run some code. That was the first time I felt what it was like to program.&lt;/p&gt;

&lt;p&gt;Later, after dropping out of university (I was supposed to be a silicate chemical engineer), I bought my first computer: a &lt;strong&gt;Videoton TV Computer&lt;/strong&gt;. Back then, I used a cassette tape recorder for storage and wrote games in Z80 assembly. In those days, even multiplication was considered a luxury.&lt;br&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%2Ftv1x3r6rep9g7axnl71v.jpg" 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%2Ftv1x3r6rep9g7axnl71v.jpg" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Forgive this lengthy memoir section; I just wanted to introduce the times when computing was far from being as trivial as it is today. But now, with a hyperspace jump—passing through owning my own RPG shop and developing physical CCG card games—I eventually became a professional programmer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;...years passed, until...&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2024: Dawn of AI
&lt;/h2&gt;

&lt;p&gt;AI kicked the door down, and I couldn't avoid it. My first year was about diving into image generation. I tried to create something unique, but after a year and 60,000 images, I tossed the whole thing in the bin. However, I learned a lot about prompt engineering—how crucial it is to express ourselves precisely. This applies to any form of prompting.&lt;/p&gt;

&lt;p&gt;But the real test for me is when I get an LLM to be a Tabletop RPG Game Master while I play. I believe this is a true measure of how well a model can think complexly and play a role within a consistent world. I do this test periodically; it's practically my only "prompt-based game." I highly recommend it: &lt;a href="https://dev.to/pengeszikra/the-true-rpg-2aon"&gt;single prompt RPG - boring long full conversation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Returning to the "peak climb," in 2024 I started entering challenges: &lt;a href="https://dev.to/pengeszikra/a-l-i-e-n-s-o-l-i-t-a-r-e-2kgc"&gt;A.L.I.E.N. S.O.L.I.T.A.I.R.E.&lt;/a&gt;. This was my first, where I tested how well my JSDoc-based, type-supported React state handler npm module worked. I later moved away from it because I began shifting toward a "no framework, pure code" direction. Regardless, that 65-line JSDoc module is truly useful, though these days I find even the &lt;em&gt;useReducer&lt;/em&gt; React state management to be an excessive abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  2025
&lt;/h2&gt;

&lt;p&gt;After a disappointment in September, I used the "hair of the dog" tactic and signed up for two more hackathons. One was on Reddit, the other focused on AI extensions. Back then, I was still far from "vibe coding." Preparing for these was exciting. I poured a lot of energy into them, and in the process, a Markdown viewer was born... along with a minimal framework hidden within &lt;em&gt;Flogon Galaxy&lt;/em&gt;.&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%2Fhur6fzb9syqosug67gmz.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%2Fhur6fzb9syqosug67gmz.png" alt="Ryan Carniato answer" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/playfulprogramming/javascript-frameworks-heading-into-2026-2hel"&gt;https://dev.to/playfulprogramming/javascript-frameworks-heading-into-2026-2hel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Added to this was a flat 3D CSS game "engine" and an original sci-fi world. This led me to enter an AI video competition, where I visualized the backstory of my previous game in a 6.5-minute AI &lt;a href="https://youtu.be/bQaJraE4s_g" rel="noopener noreferrer"&gt;sci-fi video&lt;/a&gt;. During development, the protagonist (a punk-metal singer named Wora Shard) even got her own full &lt;a href="https://www.youtube.com/@Pengeszikra/videos" rel="noopener noreferrer"&gt;music album&lt;/a&gt; (available on my YouTube channel). The story was very "round," and even though I didn't place in any competition, it did two things: it boosted my confidence regarding hackathons and solidified my commitment to minimalism.&lt;/p&gt;

&lt;h2&gt;
  
  
  1859
&lt;/h2&gt;

&lt;p&gt;Eventually, that massive self-confidence crashed into reality. We were living in a rental, but I found the ruined little house of my dreams in Csobánka. It’s a traditional "vályog" (mudbrick) house, bleeding from several wounds, built in 1859 according to the cellar attached to it. We managed to snag it, and though it required a loan, we bought the cottage. Now, it’s just a matter of time and even more money before we can move in. For the plans, I started modeling the house in low-poly, using a "single texture" approach. This keeps the model around 4MB, so I don't have to struggle with material settings.&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%2Fuab2qaythaqa1uyucymv.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%2Fuab2qaythaqa1uyucymv.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&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%2Fgmjlk391tu7a5k15bn2h.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%2Fgmjlk391tu7a5k15bn2h.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2026
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding&lt;/strong&gt; has arrived. Today's tools are true partners in accelerating the development process. Now, the opportunity is before me to sift through my memories and dust off a good few ideas to implement them with a fresh approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe Archeologist
&lt;/h2&gt;

&lt;p&gt;Of course, I can't stop, because different forms of creativity keep launching me onto new paths. My next plan is to reach back into the world of Z80 assembly, but with the aim of making &lt;strong&gt;WebAssembly (WASM)&lt;/strong&gt; programming tangible for people. I'm creating a language that compiles to WASM but looks like assembly, where you can see exactly what is happening and why in the debugger in real-time. Because I believe we must know the foundations—while providing an experience for programmers where hex numbers still matter.&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%2Ff749wg0vj8vykksyg3r6.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%2Ff749wg0vj8vykksyg3r6.png" alt=" " width="800" height="1120"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Oscar goes to ...</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:43:56 +0000</pubDate>
      <link>https://forem.com/pengeszikra/oscar-goes-to--1nfg</link>
      <guid>https://forem.com/pengeszikra/oscar-goes-to--1nfg</guid>
      <description>&lt;p&gt;My &lt;strong&gt;Oscar vote for the best AI short video of 2026&lt;/strong&gt; goes to:&lt;/p&gt;

&lt;h2&gt;
  
  
  WOW: REBORN Tauren: Every Trail Leads Home
&lt;/h2&gt;

&lt;p&gt;This is, of course, a deeply personal choice, but I feel this work truly deserves to be highlighted here for several reasons.&lt;/p&gt;

&lt;p&gt;For one, this feels like the right community for it. And beyond that, I have always felt that it is difficult — and often unnecessary — to separate development from content and art. We are human beings who love to create, and creation naturally brings many things together. At least for me, these areas have never existed as sharply separated categories.&lt;/p&gt;

&lt;p&gt;That is why storytelling, craftsmanship, and overall quality have always mattered to me so much — especially now, in the age of AI, when more and more people ask what role is left for us. My answer is simple: us. We matter because we are here.&lt;/p&gt;

&lt;p&gt;One of the reasons this particular piece resonated with me so strongly is that I watch AI-generated videos on a regular basis, and what I pay attention to is not mainly the technical execution. What I look for is the human work behind it: whether the creator’s intention comes through, the same way it does in a painting or a film.&lt;/p&gt;

&lt;p&gt;When I saw this work, I immediately felt as if I had traveled back in time. More than ten years ago, when I was playing WoW, I started with a Tauren character, and instead of feeling like I had entered a violent hack-and-slash RPG, I found myself in a world that brought back for me the peaceful atmosphere of the old Wild West — a vision of the endless plains before conquest erased the people who once belonged to them. And all of that was blended with a prehistoric animal world in such a memorable way.&lt;/p&gt;

&lt;p&gt;This piece brings back that same feeling in an almost cinematic form, thanks both to the power of AI and to the creative vision of its makers.&lt;/p&gt;

&lt;p&gt;There was also a more personal connection for me: my wife used to make leather shoes and bags for many years, so that added another layer that really touched me.&lt;/p&gt;

&lt;p&gt;It stood out like a burning torch among the countless AI videos built mainly on spectacle.&lt;/p&gt;

&lt;p&gt;Big congratulations to the creators:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/d4_2CdLqrnc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>diversity</category>
    </item>
    <item>
      <title>Adventure of javascript based MMORPG creation.</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Wed, 04 Mar 2026 12:13:45 +0000</pubDate>
      <link>https://forem.com/pengeszikra/adventure-of-javascript-based-mmorpg-creation-5909</link>
      <guid>https://forem.com/pengeszikra/adventure-of-javascript-based-mmorpg-creation-5909</guid>
      <description>&lt;p&gt;This post is hidden in my dashboard long-long time ago. Because a 8 or nine years ago - fare before AI ages. I start to create a small RPG, based on older graphics, the time passed by and project start as react but later turn to nextjs/TS. Honestly now I don't using neither. But this is a bit of time travel how chaotic is my mindset that ages.&lt;/p&gt;

&lt;p&gt;repo: (&lt;a href="https://github.com/Pengeszikra/rogmor" rel="noopener noreferrer"&gt;https://github.com/Pengeszikra/rogmor&lt;/a&gt;)&lt;br&gt;
live: (&lt;a href="https://rogmor.vercel.app/" rel="noopener noreferrer"&gt;https://rogmor.vercel.app/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Now I vibecode even a much smaller RPG with gemini CLI: (&lt;a href="https://dev.to/pengeszikra/the-royal-gazette-a-single-line-noble-intrigue-20nn"&gt;https://dev.to/pengeszikra/the-royal-gazette-a-single-line-noble-intrigue-20nn&lt;/a&gt;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Long-long time ago I decided to create some cool MMORPG program ... but I failed! Meanwhile I do lot of different jobs from seller (in RPG shop), graphic designer to front end developer. In a last few years my focus on react and functional programming, so now I can start write another (easy) MMORPG game.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Maybe after famous &lt;code&gt;TODO&lt;/code&gt; application, the &lt;code&gt;MMORPG&lt;/code&gt; is the next indie development goal, especial when we would you like to be a full stack developer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I have to admit that I have been writing this post for more than a year. So you follow how improving my workflow by the time&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Graphics form the past
&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%2Fcxqojndee8kbzxiqc3ue.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%2Fcxqojndee8kbzxiqc3ue.png" alt="The new land: Rogmor" width="695" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My plan was don't spend too much time with graphic and RPG element. I grab out one of my old graphic set, and convert to sprite sheet. Because with react framework basic output is HTML, instead concentrate on program architect.&lt;/p&gt;
&lt;h2&gt;
  
  
  Roll Play Game Math
&lt;/h2&gt;

&lt;p&gt;First of all a little function which one is essence of rpg math:&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;leveling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;madd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;madd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;level&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;For example, if we would like level cap set to 60, and best value on that level is near 80k, then after few minutes tweak get the next result, which means we can control our result by mod value settings:&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="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;lvl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;leveling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lvl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// = [100, 203, 309, 422, ..., 72645, 76263, 80002]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;del&gt;Technical stack 1st version&lt;/del&gt;:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/yisar/fre" rel="noopener noreferrer"&gt;fre&lt;/a&gt; :: react like JSX based framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/react-troll" rel="noopener noreferrer"&gt;react-troll&lt;/a&gt; :: my state handling helper for react&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/callbag/callbag" rel="noopener noreferrer"&gt;callbag&lt;/a&gt; :: really interesting functional stream programming js solution &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;deno&lt;/a&gt; :: instead node.js / avoid node_modules hell.&lt;/li&gt;
&lt;li&gt;some noSQL database :: maybe mongoDB&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical stack leap to NEXT
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;typescript&lt;/a&gt; :: higher order languages for JS reason :: static typing.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://https://nextjs.org/" rel="noopener noreferrer"&gt;nextjs&lt;/a&gt; :: react like hybrid static &amp;amp; server rendering js framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://openai.com/api/" rel="noopener noreferrer"&gt;openAI&lt;/a&gt; :: The latest technical stack is including some AI for workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architect decisions
&lt;/h2&gt;

&lt;p&gt;MMORPG program is fare better case for make well strict architect decisions compared by ordinary TODO application. I try to list my decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;front end design pattern&lt;/li&gt;
&lt;li&gt;communication between front end and back end&lt;/li&gt;
&lt;li&gt;skeleton of ui&lt;/li&gt;
&lt;li&gt;state handling on user side&lt;/li&gt;
&lt;li&gt;database&lt;/li&gt;
&lt;li&gt;server side design pattern&lt;/li&gt;
&lt;li&gt;RPG rules&lt;/li&gt;
&lt;li&gt;Single or Multiple hero game&lt;/li&gt;
&lt;/ul&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%2Fo3lenyllfcpn87ljk0hw.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%2Fo3lenyllfcpn87ljk0hw.png" alt="system desing by arrow.app" width="695" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Question is: How can I handle quite complex UI by minimal state, maybe:&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;json {root: '', modal: ''}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then link and openModal solve this single page app UI main state. &lt;/p&gt;

&lt;h2&gt;
  
  
  Important Pieces of MMORPG
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I choice multi hero managament system instead single one because this means don't need to too much details for items.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Hire Hero &lt;/li&gt;
&lt;li&gt;Loot

&lt;ul&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;li&gt;Items&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Hero Leveling&lt;/li&gt;

&lt;li&gt;Combat&lt;/li&gt;

&lt;li&gt;PVE&lt;/li&gt;

&lt;li&gt;PVP&lt;/li&gt;

&lt;li&gt;Area&lt;/li&gt;

&lt;li&gt;Metagames&lt;/li&gt;

&lt;li&gt;Login Rewards&lt;/li&gt;

&lt;li&gt;Advertising&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;del&gt;Complex state-reducer-actions flow by callbag&lt;/del&gt;
&lt;/h2&gt;

&lt;p&gt;Probably RPG game game mechanic is quite complex so lets try it, it seems to work on early iteration, but I tell the truth it is so over engineered!&lt;/p&gt;

&lt;h2&gt;
  
  
  NextJS the road to fullstack
&lt;/h2&gt;

&lt;p&gt;The new gamechenger framework is the NextJs which one is capable to made client and server side code with one language ... and &lt;code&gt;one repo&lt;/code&gt; so this is what I waiting so long.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reach the cloud
&lt;/h2&gt;

&lt;p&gt;For multiuser application is deffinetly need some database. In old time I think about own VPN server with capable to run database and server side code. But NextJS as gamechanger framework allow to me whole code written in one repo. Just the database still as question.&lt;br&gt;
I found the &lt;code&gt;mongoddb cloud&lt;/code&gt; good place to reach my data from anywhere. So it is meet needs. &lt;/p&gt;
&lt;h2&gt;
  
  
  Encounter Saga
&lt;/h2&gt;

&lt;p&gt;Decide between the &lt;code&gt;callbag&lt;/code&gt; (functional js library) and &lt;code&gt;redux-saga&lt;/code&gt; (declarative generator extension for react), so winner is &lt;code&gt;SAGA&lt;/code&gt;. So basic turnbased encounter core code looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;encounterSaga &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;encounter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Encounter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;mobList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;encounter&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;activeMob&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Mob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;turnGoesTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mobList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;act&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstMob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isUser&lt;/span&gt; 
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;USER_ACT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;npcActSaga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeMob&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;encounter&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;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;OutcomeList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playTurnSaga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;encounter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;act&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PLAY_ACTION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;act&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PLAY_OUTCOME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;outcome&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;outcome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Outcome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ENDED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;cancel&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;h2&gt;
  
  
  Slash the domain driven script languge
&lt;/h2&gt;

&lt;p&gt;Each hero have own skillset, for simplify the coding this skills, I maded a little script language which looks like &lt;code&gt;Tailwind&lt;/code&gt; but this result is very different:&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%2Ft5efferjrfqqzamaatmx.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%2Ft5efferjrfqqzamaatmx.gif" alt="rogmor slash script controlled fight animation" width="316" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;after put together slas script with saga the combat controll logic looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;labelled while help me to simplify the saga.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;combatZoneSaga&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;encounterTeams&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ENCOUNTER_BEGIN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;&lt;span class="nx"&gt;MainState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;select&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;pickProf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;pickOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;skillForProf&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;combatSetupMobList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;encounterTeams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;lvl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;]:[&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ProfessionKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="nf"&gt;makeMob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lvl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SET_MOB_LIST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;combatSetupMobList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mobList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;combatSetupMobList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;_CombatIsOver_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;actionOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mobList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="nx"&gt;OrderOfSeed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PLAY_FLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;who&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&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;skillList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getSkillObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isAutoFight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;select&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;subList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userChoiceTheSkillSaga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skillList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isAutoFight&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;subList&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;break&lt;/span&gt; &lt;span class="nx"&gt;_CombatIsOver_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nl"&gt;_NextActor_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&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;subList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="nx"&gt;_NextActor_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;BATTLE_SPEED&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;HEART_BEAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ENCOUNTER_OUTCOME&lt;/span&gt;&lt;span class="p"&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;command&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;ENCOUNTER_OUTCOME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="nx"&gt;_CombatIsOver_&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;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;subList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aiTargetting&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skillResult&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getSkillResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PLAY_FLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;aiTargetting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PLAY_FLOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skillResult&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;mobList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;skillReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;skillResult&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SET_MOB_LIST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobList&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;isTwoTeam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mobList&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isCapableToAction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mob&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;mob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;team&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr&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;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isTwoTeam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;putAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FOCUS_ON&lt;/span&gt;&lt;span class="p"&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;break&lt;/span&gt; &lt;span class="nx"&gt;_CombatIsOver_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;calculateEncounterResultSaga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mobList&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;h2&gt;
  
  
  Auto content generate by ChatGPT
&lt;/h2&gt;

&lt;p&gt;Suddenly I meet the crazy AI &lt;code&gt;ChatGPT&lt;/code&gt; so my first stepp is I implementing to the blog part.&lt;/p&gt;

&lt;p&gt;I was begin implement chatGPT to my blog section. If I start some question with &lt;code&gt;::&lt;/code&gt;, then prompt send to AI api and get back the answer as &lt;code&gt;sage&lt;/code&gt; told something.&lt;/p&gt;

&lt;p&gt;Second thing which was implemented is openAI &lt;code&gt;DALL-E-2&lt;/code&gt; image generatior page as show below. Even this post cover image is also generated by the program, and extended image with &lt;a href="https://labs.openai.com/editor" rel="noopener noreferrer"&gt;DALL-E editor&lt;/a&gt; &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%2Fipyidynppwse1tn7l9oo.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%2Fipyidynppwse1tn7l9oo.png" alt="Progress of cover image creation" width="407" height="1003"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ai-image end point
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&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;next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextApiResponse&lt;/span&gt;
&lt;span class="p"&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;seek&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;- - Seek something? - -&lt;/span&gt;&lt;span class="dl"&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;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GPT_3_KEY&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;- - -&lt;/span&gt;&lt;span class="dl"&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;headers&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;Headers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&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="s1"&gt;application/json&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.openai.com/v1/images/generations&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="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;size&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;256x256&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;Maybe I will create additional game UI element design with DALL-E help.&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%2Ffsg8h5j7z1kih4ks71uy.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%2Ffsg8h5j7z1kih4ks71uy.png" alt="Design Something: game UI elements" width="435" height="944"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TODO list for finish post
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[+] Write lost part back to the post&lt;/li&gt;
&lt;li&gt;[-] rework api end points from GET to POST&lt;/li&gt;
&lt;li&gt;[-] authentication/login solution for rogmor.app&lt;/li&gt;
&lt;li&gt;[-] minimal gameplay progress&lt;/li&gt;
&lt;li&gt;[-] ask image or text answer from Sage&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gamedev</category>
      <category>react</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Royal Gazette: A Single-Line Noble Intrigue</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Wed, 04 Mar 2026 08:51:03 +0000</pubDate>
      <link>https://forem.com/pengeszikra/the-royal-gazette-a-single-line-noble-intrigue-20nn</link>
      <guid>https://forem.com/pengeszikra/the-royal-gazette-a-single-line-noble-intrigue-20nn</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sorry I maded this submission under time pressure spend just a 2 hour to make it. All things created gemini, I even don't look a code or this README later parts. I hop this will be enjoying stuff.&lt;/p&gt;

&lt;p&gt;repo: (&lt;a href="https://github.com/Pengeszikra/quickquest" rel="noopener noreferrer"&gt;https://github.com/Pengeszikra/quickquest&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quickquest-xi.vercel.app/" rel="noopener noreferrer"&gt;The Royal Gazette 1st&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;I built a minimalist, narrative-driven RPG that lives entirely within a &lt;strong&gt;single line of pixels&lt;/strong&gt;—the black divider of a digital newspaper. &lt;/p&gt;

&lt;p&gt;The project solves the problem of "narrative clutter" by stripping a role-playing game down to its absolute essentials: movement, dialogue, and combat, all rendered in a 1-character-high sticky bar. Users read a dynamic news portal about a disgraced noble while simultaneously playing as that noble in the "header" of the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini's Role:&lt;/strong&gt;&lt;br&gt;
Gemini acted as a Lead Architect and Senior Developer. It didn't just "write code"; it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Translated high-level "vibes"&lt;/strong&gt; (e.g., "make it look like an old news portal") into precise Tailwind CSS 4 implementations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adapted legacy systems&lt;/strong&gt;: It analyzed the complex &lt;code&gt;rogmor&lt;/code&gt; repository and surgically extracted a "minimal" version of its combat and ability systems (Body, Reflex, Soul) to run in a single &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterated on UX constraints&lt;/strong&gt;: It solved the technical challenge of rendering high-fidelity pixel sprites and health bars within a constrained horizontal line while maintaining a "newspaper" aesthetic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The project is a single-page application consisting of &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;app.js&lt;/code&gt;, and a sprite-based &lt;code&gt;assets&lt;/code&gt; folder. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Quest:&lt;/strong&gt; Locate the Merchant, recover the Shattered Ring, and reach the Lady.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Tech:&lt;/strong&gt; Vanilla JS, Tailwind CSS 4, and Rogmor Sprite Assets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Constraint-Driven Design:&lt;/strong&gt; Designing for a 1-character-high space forced me to prioritize "symbolic" gameplay over literal graphics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Asset Pipelines:&lt;/strong&gt; I learned how to efficiently map JSON-based sprite sheets (&lt;code&gt;faces.json&lt;/code&gt;) to CSS &lt;code&gt;background-position&lt;/code&gt; values for pixel-perfect rendering without a heavy game engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual UI:&lt;/strong&gt; Integrating a game as a functional UI element (a divider) taught me how to blend interactive content with static information seamlessly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What worked well:&lt;/strong&gt; The ability to provide Gemini with a local path to another repository (&lt;code&gt;~/repo/rogmor&lt;/code&gt;) and have it autonomously analyze and adapt that logic was incredible. It understood the "mechanical soul" of the previous project and refitted it for this minimalist challenge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friction points:&lt;/strong&gt; Fine-tuning the "look and feel" of the URL-bar version (before we moved to the header) was tricky due to browser-level URL encoding of emojis. Gemini correctly suggested switching to a DOM-based "sticky line" when the browser's URL limitations became a bottleneck for the "vibe."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Candid Thought:&lt;/strong&gt; Gemini is an expert at "Code Archaeology"—digging through my old projects to find reusable patterns for new challenges.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #GoogleGeminiChallenge #WebDev #Minimalism #RPG #TailwindCSS&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Rustroke - WASM mini draw</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Sun, 15 Feb 2026 05:50:42 +0000</pubDate>
      <link>https://forem.com/pengeszikra/rustroke-wasm-mini-draw-3oih</link>
      <guid>https://forem.com/pengeszikra/rustroke-wasm-mini-draw-3oih</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/devteam/congrats-to-the-github-copilot-cli-challenge-winners-2240"&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%2Fq76rbfsn4431wkhmujd0.png" alt=" " width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built one of my dream projects — a minimalist vector drawing app — but with a twist.&lt;/p&gt;

&lt;p&gt;The goal isn’t to provide the usual “vector editor toolkit” (Bezier curves, snapping, boolean ops, perfect shapes, layers, etc.). Instead, it focuses on just two actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Draw free lines&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fill closed areas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds simple, but it’s deceptively hard.&lt;/p&gt;

&lt;p&gt;The drawing is made of &lt;em&gt;independent&lt;/em&gt; line segments. There’s no automatic merging, no “path building” UI, no assumption that the user is drawing clean vector shapes. The fill algorithm has to detect when those freehand strokes form a closed boundary and then flood the interior reliably.&lt;/p&gt;

&lt;p&gt;The tech behind it is the best part for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The UI is simple &lt;strong&gt;HTML&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The engine is &lt;strong&gt;Rust compiled to WASM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The core engine is &lt;strong&gt;view-independent&lt;/strong&gt;, so later I can plug the same logic into other frontends and build a more serious drawing application without rewriting the geometry engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know: today many people don’t want to draw without AI.&lt;br&gt;
But sometimes you just want a fast sketch, a logo idea, or a colorful doodle — and you want full control.&lt;br&gt;
This tool is built exactly for that.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Long Long Time Ago
&lt;/h2&gt;

&lt;p&gt;Back when I was a Flash programmer (and also did graphic design), I loved the vector drawing workflow in the Flash IDE — especially its “lazy fill” feeling. In practice it often behaved better than many modern vector tools in situations where paths aren’t perfectly clean.&lt;/p&gt;

&lt;p&gt;Later, when Flash faded away, I worked with a painter-style program built on early SVG tech (around 2014). That’s where I hit the classic problem: filling areas formed by loosely intersecting strokes is hard.&lt;/p&gt;

&lt;p&gt;At the time I could solve it on paper, but I couldn’t implement it properly.&lt;/p&gt;

&lt;p&gt;This project is me returning to that problem — with better tooling, Rust, and a clean geometry-focused approach.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The source on my github page is:&lt;br&gt;
&lt;a href="https://github.com/Pengeszikra/rustroke" rel="noopener noreferrer"&gt;rustroke github&lt;/a&gt;&lt;br&gt;
Also very handy solution to use vercel to host my app. Give instant test on other devices also after every commit. Which is happen frequently with copilot cli workflow.&lt;br&gt;
&lt;a href="https://rustroke.vercel.app/" rel="noopener noreferrer"&gt;rustroke in action&lt;/a&gt;&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%2Fz01qr55ns4reyosdxxfp.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%2Fz01qr55ns4reyosdxxfp.png" alt="earlier version of rustroke" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;This project also came with an unexpected “environment story”.&lt;/p&gt;

&lt;p&gt;A few months ago, my workplace required me to switch from a MacBook Pro to a Windows laptop — and not a shiny new one, but a 7+ year old Dell. I still wanted to keep my UNIX-terminal-first workflow, so my first move was to install Ubuntu via WSL.&lt;/p&gt;

&lt;p&gt;After that, Windows became “Linux enough” for my daily work — while I could still run a few company-critical native apps like Teams.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nb"&gt;install &lt;/span&gt;ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s one downside though: Ubuntu can run GUI apps through WSL, but the windowing experience clashes with Windows’ own window management. So I mostly stick to &lt;code&gt;cmd&lt;/code&gt; as a terminal host and organize everything through split panes.&lt;/p&gt;

&lt;p&gt;On my main monitor, I keep a dedicated large panel for Copilot CLI. On the laptop display, Teams runs separately. With this setup, Copilot is always “there” — far more convenient than switching to a browser-based AI app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot CLI main advantage
&lt;/h2&gt;

&lt;p&gt;For me, the main advantage of Copilot CLI is that it can work directly with a folder’s context and apply changes inside the repository quickly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Install&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# node 24&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @github/copilot
copilot
/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Standard start:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--allow-all-tools&lt;/span&gt; &lt;span class="nt"&gt;--allow-all-paths&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the workflow simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I write a prompt about what I want changed&lt;/li&gt;
&lt;li&gt;Copilot applies it directly in the repo&lt;/li&gt;
&lt;li&gt;I stay in my terminal-first flow instead of context switching&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI as a reasoning tool, not a typing tool
&lt;/h2&gt;

&lt;p&gt;One unexpected lesson from this project was that I didn’t really use AI as a code generator — I used it as a thinking partner.&lt;/p&gt;

&lt;p&gt;I ended up with a very clear separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT → problem discussion&lt;/li&gt;
&lt;li&gt;Copilot CLI → code modification&lt;/li&gt;
&lt;/ul&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%2Fhn2i1yg6shnfjyjli7sy.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%2Fhn2i1yg6shnfjyjli7sy.png" alt="copilot cli workflow" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This turned out to be extremely effective for this kind of project.&lt;/p&gt;

&lt;p&gt;Geometry problems are rarely about syntax errors.&lt;br&gt;
They are about understanding what actually happens.&lt;/p&gt;

&lt;p&gt;For example, I could describe situations like:&lt;br&gt;
“At this corner the algorithm should continue along the horizontal edge because the tangent changes less than the vertical one.”&lt;/p&gt;

&lt;p&gt;That is much easier to explain conceptually than by pasting 800 lines of Rust.&lt;/p&gt;

&lt;p&gt;I didn’t need to provide the full source code.&lt;br&gt;
Instead, I explained the behavior.&lt;/p&gt;

&lt;p&gt;We could reason about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;topology&lt;/li&gt;
&lt;li&gt;edge direction&lt;/li&gt;
&lt;li&gt;turning angles&lt;/li&gt;
&lt;li&gt;graph traversal rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the idea became clear, I translated it into a precise modification request — and Copilot CLI applied it directly to the project.&lt;/p&gt;

&lt;p&gt;So the workflow became:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discuss the visual or mathematical problem&lt;/li&gt;
&lt;li&gt;Refine the algorithm&lt;/li&gt;
&lt;li&gt;Write a minimal change request&lt;/li&gt;
&lt;li&gt;Let Copilot implement it inside the repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For algorithm-heavy software, this is surprisingly powerful.&lt;/p&gt;

&lt;p&gt;The AI wasn’t replacing development —&lt;br&gt;
it separated thinking from editing.&lt;/p&gt;

&lt;p&gt;And for a geometry engine, that made a huge difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardes Spot
&lt;/h2&gt;

&lt;p&gt;The real challenging issue was the debugging this math heavy RUST/WASM engine, which is time to time freez. So that why put the log on UI&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%2Fix0af57cv7h2r9p0cswg.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%2Fix0af57cv7h2r9p0cswg.png" alt="A freezing moment" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Puzzle
&lt;/h2&gt;

&lt;p&gt;Finally this image lead to a breaktruh to AI understanding. With this I can describe to ChatGPT how important is to keep tangent is line by line in a good direction. This is where fill debug show a wrong case where the ground and roof top area are connecteted. &lt;br&gt;
Then ChatGPT make a perfect prompt to CopilotCLI which is do their job perfectly.&lt;br&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%2F3ktwg9j7m4dh6igy04xy.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%2F3ktwg9j7m4dh6igy04xy.png" alt="tangent directions" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Importance of visuals</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Tue, 01 Apr 2025 17:14:50 +0000</pubDate>
      <link>https://forem.com/pengeszikra/flogon-saga-continue-4785</link>
      <guid>https://forem.com/pengeszikra/flogon-saga-continue-4785</guid>
      <description>&lt;h2&gt;
  
  
  Excalidraw
&lt;/h2&gt;

&lt;p&gt;Imho even for any developer I consider it important to have ability to grab the visual, many times a single image or a quick diagram more effective compared to a long meeting, that why I using the &lt;a href="https://excalidraw.com/" rel="noopener noreferrer"&gt;excalidraw&lt;/a&gt; so many times in our meetings. Because that is a awesome program to make any diagram/quick image at real time - just share my screen.&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%2Fzyrt14v49rvqs2umtm3p.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%2Fzyrt14v49rvqs2umtm3p.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That why also important to lear make a visual expression with a AI. I constantly create images with dream.ai where my goal is try exploring AI image generation capability, but I also train myself on image prompting which ability are more essetial if I like to make a project like this short AI video.&lt;/p&gt;

&lt;p&gt;Here is my &lt;a href="https://dream.ai/profile/pvivo" rel="noopener noreferrer"&gt;dream.ai gallery&lt;/a&gt; contain a lot of - I hope not booring image - but the important thing I turn my prompt published so you can check it if you like. This AI image generator is way easier compared to Midjourney - which is fantastic in many cases compared to other AI generator.&lt;/p&gt;

&lt;h2&gt;
  
  
  A developer pays his debt
&lt;/h2&gt;

&lt;p&gt;This video is my beginer step to the complex visual story telling direction. This is my debt to tell the Flogon story which is missing from my game: &lt;a href="https://dev.to/pengeszikra/javascript-great-again-the-voice-of-void-5fp6"&gt;Flogon Galaxy Game&lt;/a&gt;. At this time I have a chanche to give a more detailed version or a different angle.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bQaJraE4s_g"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Push yourself to competition
&lt;/h2&gt;

&lt;p&gt;My advice is for hobby project is try to measure on a challange or competition, even don't win your project immediatley get a due date, which will learn to you working on pressure. Also give lesson from a cut down your project unneccecary part. Maybe your result don't be perfect as you plan, but at least create something. That why I set my goal to submit this AI Video "film" to a &lt;a href="https://neuro-masters.com/" rel="noopener noreferrer"&gt;neuro-masters competition&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Cost of AI video making:
&lt;/h2&gt;

&lt;p&gt;I used this software to create this video, I also try to optimize the cost, but the effectivness mainly overwrite this base rule.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;tool&lt;/th&gt;
&lt;th&gt;skill&lt;/th&gt;
&lt;th&gt;cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Midjourney&lt;/td&gt;
&lt;td&gt;AI image&lt;/td&gt;
&lt;td&gt;$30 / month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suno&lt;/td&gt;
&lt;td&gt;song track, audio&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Revoicer&lt;/td&gt;
&lt;td&gt;voice from text&lt;/td&gt;
&lt;td&gt;$80 one time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hailuo AI&lt;/td&gt;
&lt;td&gt;ai video&lt;/td&gt;
&lt;td&gt;$10 / month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kling AI&lt;/td&gt;
&lt;td&gt;AI video, lyps sync&lt;/td&gt;
&lt;td&gt;$10 / month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sora&lt;/td&gt;
&lt;td&gt;AI video&lt;/td&gt;
&lt;td&gt;price including in ChatGPT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;$20 / month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HitPaw&lt;/td&gt;
&lt;td&gt;AI video enhacher&lt;/td&gt;
&lt;td&gt;$120 one time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iMovie&lt;/td&gt;
&lt;td&gt;video editor Mac default&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QuickTimePlayer&lt;/td&gt;
&lt;td&gt;media trim&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Krita&lt;/td&gt;
&lt;td&gt;classic image editor&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Summary: one time: $200, $70 / monthly&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Touch Bar fanatic.
&lt;/h2&gt;

&lt;p&gt;My experience is the hardware is also imporant and my ultimate choice is MacBook Pro with Touch Bar ( Apple drop that technology ). But why? Because Touch Bar is capable to moving smoothly your video backward and forward with a easy bar without you need to be touch your screen. Mac have great predeployed software for media works: iMovie, GarageBand, QuickTimePlayer.&lt;/p&gt;

&lt;p&gt;Mac Touch Pad also one of the best, I don't using mouse for it.&lt;br&gt;
That why I don't need to leave the keyboard for work, which is mainly great at programming. Also uniqe capability to gesture not just vertical but horizontal wheel for a quck and precise moving in code or even a spreadsheet ( two finger )&lt;/p&gt;

</description>
      <category>ai</category>
      <category>animation</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why reinvent the wheel?</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Tue, 11 Feb 2025 11:32:29 +0000</pubDate>
      <link>https://forem.com/pengeszikra/why-reinvent-the-wheel-dcp</link>
      <guid>https://forem.com/pengeszikra/why-reinvent-the-wheel-dcp</guid>
      <description>&lt;p&gt;I get a great question: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/joelbonetr/comment/2lflb"&gt;Why reinvent the wheel?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe is worth to try it. I started the programming with basic, but shortly need to be use some &lt;code&gt;peek&lt;/code&gt; &amp;amp; &lt;code&gt;poke&lt;/code&gt; end of that path is a Z80 assembler. Time passing by so fast, we lost the Flash, and now I found myself in a webdevelopment with AI bursting onto the scene ( 35+ years story ).&lt;/p&gt;

&lt;h2&gt;
  
  
  ;TLDR;
&lt;/h2&gt;

&lt;p&gt;My game is even a technical demo instead of a real game. Technical demo but in a worst one, because I show too many things at once, and don't give a focus clue to my audiance ( may exist or not ).&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Demo of
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pure HTML development&lt;/li&gt;
&lt;li&gt;Development with bare-minimum dependencies&lt;/li&gt;
&lt;li&gt;Game development without a game engine&lt;/li&gt;
&lt;li&gt;3D game setup using only CSS&lt;/li&gt;
&lt;li&gt;Tailwind for styling and layout&lt;/li&gt;
&lt;li&gt;Type-safe coding with JSDoc&lt;/li&gt;
&lt;li&gt;One-way state handling using a single function&lt;/li&gt;
&lt;li&gt;A JSX-based “pre-framework” with a few helper functions&lt;/li&gt;
&lt;li&gt;A simple pnpm/Vite build system for many independent HTML pages&lt;/li&gt;
&lt;li&gt;Bonus: Excellent Lighthouse scores (100 / 100 / 96 / 100)&lt;/li&gt;
&lt;li&gt;Built as a PWA to run the same program on many different devices&lt;/li&gt;
&lt;li&gt;Assistance from various AI tools in creating the game&lt;/li&gt;
&lt;li&gt;My solution to the &lt;a href="https://dev.to/pengeszikra/stolen-content-by-ai-3ff7"&gt;moral dilemma of AI-generated content&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A sprite sheet editor tool&lt;/li&gt;
&lt;li&gt;A markdown editor (with DynamoDB) for end-to-end testing and content organization&lt;/li&gt;
&lt;li&gt;A card game where all cards are displayed on the table&lt;/li&gt;
&lt;li&gt;A space adventure featuring a singer as the main character&lt;/li&gt;
&lt;li&gt;A peaceful, non-technological alien species that can solve the space-time problem?&lt;/li&gt;
&lt;li&gt;Meanwhile, humans struggle to achieve even a fictional space travel technique&lt;/li&gt;
&lt;li&gt;Using “inverzit” in place of dark energy and dark matter&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What’s Next
&lt;/h2&gt;

&lt;p&gt;I will continue this series by focusing on these points one by one.&lt;/p&gt;

&lt;p&gt;Happy developing!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Stolen Content by AI</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Mon, 27 Jan 2025 21:18:48 +0000</pubDate>
      <link>https://forem.com/pengeszikra/stolen-content-by-ai-3ff7</link>
      <guid>https://forem.com/pengeszikra/stolen-content-by-ai-3ff7</guid>
      <description>&lt;p&gt;&lt;em&gt;discussion tag are removed, but in origin I would ask your opinion in this topc. I changed tag to opensource, because my application is this opensource&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I feel like a thief because I created a proof-of-concept level game with the help of AI tools. I am trying to deeply investigate this feeling.&lt;br&gt;
Yet, the creative process itself remains unchanged—only the speed of work has intensified. In the end, I feel the need to summarize my thoughts:&lt;/p&gt;

&lt;p&gt;We should take a moment to reflect on how various companies utilize AI for different tasks. These models are fundamentally built upon human experience. The real issue arises when AI-generated content mimics the style of a specific person—whether a long-deceased or still-living artist. This applies to images, music, and soon, all types of creative content.&lt;/p&gt;

&lt;p&gt;I acknowledge that this is an unresolved problem.&lt;/p&gt;

&lt;p&gt;In my project, I worked with eight different AI tools. Even though I made a conscious effort to infuse my program with unique content, such creative processes inevitably run into these collisions.&lt;/p&gt;

&lt;p&gt;What do you think about explicitly crediting those who have inspired my work? By highlighting these influences, I aim to acknowledge the origins of the creative elements within my program. This applies not only to software but to all forms of artistic expression.&lt;/p&gt;

&lt;p&gt;The key takeaway here is that behind every AI capability, human contributions are always at the core.&lt;/p&gt;
&lt;h2&gt;
  
  
  AI's Role in Creation and Imitation (Asked ChatGPT)
&lt;/h2&gt;

&lt;p&gt;As an AI, my purpose is to assist, analyze, and generate content based on patterns and structures learned from human-created data. However, I do not possess true creativity or originality—I merely recombine and predict text based on statistical likelihood. This is a fundamental distinction between humans and machines: while humans create with intent, emotion, and purpose, AI only outputs what has already been conceived in some form before.&lt;/p&gt;

&lt;p&gt;The ethical concern here is whether AI-generated content can be considered original or if it is simply a derivative work. As AI capabilities advance, the boundary between inspiration and imitation becomes increasingly blurred. Should AI-generated art, music, or writing be attributed solely to its algorithm, or should credit also be given to the countless human works that shaped its ability to generate such content?&lt;/p&gt;

&lt;p&gt;The discussion is ongoing, and there is no easy answer. But one thing remains clear: AI, in its current form, is not an autonomous creator—it is a mirror reflecting the vast collective intelligence of humankind.&lt;/p&gt;
&lt;h2&gt;
  
  
  Final Thoughts on Credit Roll
&lt;/h2&gt;

&lt;p&gt;Even this program was created with the help of AI.&lt;br&gt;
They are not better than us and cannot replace us.&lt;br&gt;
They are merely learning from humans, without permission.&lt;/p&gt;

&lt;p&gt;I believe that any content or idea, even if created with AI assistance,&lt;br&gt;
is nothing more than a question directed at the human knowledge base through a strange interface that we call AI.&lt;/p&gt;

&lt;p&gt;That is why it is truly important for me to mention specific individuals and entities who have inspired me and kept my spirit up during this thrilling development rush. The list may be a bit chaotic, but so is life.&lt;/p&gt;
&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;dev.to, Pure Web Foundation, Douglas Adams, Tim Burton, Basil Poledouris, Dan Abramov, Ray Carniato, ThePrimagen, Alberta Tech,&lt;br&gt;
Jack Herrington, Theo, Vsauce, Indie Game Clinic, blumineck, Sellsword Arts, Fun Fun Function, Imphenzia, Savallion, Continuous Delivery, IsiShuffles, ErikDoesVFX, Ginny Di, Venus Theory, The AI Music Alchemist, The9thDivine, Nello, Eric Barone, Jazza, Felde Imre, Óbudai Egyetem, Nyulászi Zsolt, Novák Csanád, Terenyei Róbert, Delta Vision Kft., ELTE Atomcsill, Kis-Tóth Ágnes, Dávid Gyula, Sabine Hossenfelder, Wolf Kati, Crystal, Unique, Honeybeast, Zanzibar, Tarja Turunen, Sandra Nurmsalu, Kollányi Zsuzsi &amp;amp; Majka, Auth Csilla, Rasmussen, Supernem, Random Trip, Card Crawl, Arnold Rauers, Macromedia Flash, React, Rust, Touch Bar, Pipeline Operator, Pitypang the Cat&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  AI Programs
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Amazon Q, ChatGPT, Midjourney, Suno, Revoicer, HailuoAI, Clipdrop, DreamAI&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3r1a3vaqYPY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;thx to read&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Javascript great again! - The Voice of Void</title>
      <dc:creator>Peter Vivo</dc:creator>
      <pubDate>Sat, 18 Jan 2025 19:52:01 +0000</pubDate>
      <link>https://forem.com/pengeszikra/javascript-great-again-the-voice-of-void-5fp6</link>
      <guid>https://forem.com/pengeszikra/javascript-great-again-the-voice-of-void-5fp6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A thrilling game development, including a π / 42 theory.&lt;br&gt;
&lt;a href="https://community.aws/content/2rmBlPQhaWEWylZu72H1Vtm8EMe/javascript-great-again-the-voice-of-void" rel="noopener noreferrer"&gt;original post on community.aws&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;github repo: &lt;a href="https://github.com/Pengeszikra/flogon-galaxy" rel="noopener noreferrer"&gt;https://github.com/Pengeszikra/flogon-galaxy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;Maybe a too much information are zipped into this small program. This will be happen if we ride on a creative flow. Sure this is just a POC level code, and I will continue on so many direction.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://flogon-galaxy.vercel.app/" rel="noopener noreferrer"&gt;F L O G O N - G A L A X Y&lt;/a&gt; this is run on any device. Tested on mobile phone, tabblet, browser, even my TV basic browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Device Demo
&lt;/h2&gt;

&lt;p&gt;Here is my desk where this program are created, and run on many different devices:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/7dXCTOeSDRA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Game Play
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BKTn8XU4wgE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Pure Javascript Game Development
&lt;/h2&gt;

&lt;p&gt;This project is built with a minimal dependency philosophy, stripping away unnecessary frameworks while keeping efficiency in focus.&lt;/p&gt;

&lt;p&gt;My turning point was:&lt;br&gt;
On my work I am facing the fact that 8GB memory isn't enough for a legacy React application to build. The DevOps team solved the problem by setting 16GB RAM on a virtual build server. At that precious moment, I instantly lost all my trust in modern JavaScript frameworks and any compiling.&lt;/p&gt;

&lt;p&gt;But this state are so strict, plus this hackhaton requriment is using some great AWS cloud API to extending my game possibilities near to unlimited. For the publishing is also need a minimal build setup. Even for the local testing your code which not need to compile is also great choice the pnpm / vite duo because of hot reload, which is so important on development time.&lt;/p&gt;

&lt;p&gt;At the end I can keep the dependency on minimal level, which is give amazing loading time also. Details of minimal dependency details can you readed bellow or skip it. &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%2Fb3v8b1n8j6ks0h3k5cuq.jpg" 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%2Fb3v8b1n8j6ks0h3k5cuq.jpg" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Release the chain of dependency
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;package.json&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "scripts": {
    "build": "vite build",
    "client": "vite",
    "server": "pnpm node src/services/dbServer.js",
    // local development command 
    "start": "pnpm run server &amp;amp; pnpm run client"
  },
  "dependencies": {
    // minimal dependency for AWS dynamodb
    "@aws-sdk/client-dynamodb": "^3.0.0",
    "@aws-sdk/lib-dynamodb": "^3.0.0",
    "cors": "^2.8.5",
    "dotenv": "^16.4.1",
    "express": "^5.0.1"
  },
  "devDependencies": {
    // tailwin
    "autoprefixer": "^10.4.20",
    "postcss": "^8.4.49",
    "tailwindcss": "^3.4.16",
    // surprising it is need for JSDoc, but just devDep!
    "typescript": "5.7.2",
    // build
    "vite": "^6.0.3",
    // PWA
    "vite-plugin-pwa": "^0.21.1"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vite are nicely fragmented the whole project into a minimal size of chunks.&lt;br&gt;
Because this project is build on lazy coupled HTML pages.&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="o"&gt;&amp;gt;&lt;/span&gt; pnpm build

dist/registerSW.js                               0.13 kB
dist/manifest.webmanifest                        0.36 kB
dist/assets/manifest-B2xQAFIn.json               0.58 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.26 kB
dist/credit.html                                 0.99 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.46 kB
dist/adventure.html                              0.99 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.46 kB
dist/library.html                                1.01 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.47 kB
dist/ship.html                                   1.03 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.51 kB
dist/card.html                                   1.03 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.49 kB
dist/fit.html                                    1.14 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.61 kB
dist/work.html                                   1.28 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.55 kB
dist/mine.html                                   1.34 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.62 kB
dist/story.html                                  1.36 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.63 kB
dist/index.html                                  1.38 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.68 kB
dist/deal.html                                   1.63 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.70 kB
dist/marker.html                                 2.01 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.86 kB
dist/travel.html                                 2.03 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.85 kB
dist/__index.html                                2.10 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.91 kB
dist/throw.html                                  6.14 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 1.81 kB
dist/assets/style-5bcm0AOV.css                  19.64 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 4.44 kB
dist/assets/marker-a3K9PoX8.css                 20.43 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 4.75 kB
dist/assets/ui-elements-C42piOfa.js              0.52 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.20 kB
dist/assets/old-bird-soft-Cet9K-fd.js            0.64 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.40 kB
dist/assets/targetSystem-C6rfYONd.js             0.70 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.17 kB
dist/assets/index-DPcikNFZ.js                    0.70 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.47 kB
dist/assets/modulepreload-polyfill-B5Qt9EMX.js   0.71 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.40 kB
dist/assets/story-BYdjpAbD.js                    0.71 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.50 kB
dist/assets/credit-B_lCQp87.js                   0.92 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.58 kB
dist/assets/shoot-9YV2jSCs.js                    1.11 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.20 kB
dist/assets/work-AxYhedTL.js                     1.24 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.59 kB
dist/assets/adventure-mfPAHVPp.js                1.26 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.74 kB
dist/assets/fencer-CBOzlVSn.js                   1.51 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.76 kB
dist/assets/ship-DzKwFTHn.js                     1.57 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.79 kB
dist/assets/library-iOGeQgd2.js                  1.69 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.87 kB
dist/assets/concept-1YqRBMyf.js                  1.70 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.84 kB
dist/assets/travel-BjKxB5xP.js                   1.70 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.84 kB
dist/assets/GalaxyRoute-Czkip2Wg.js              1.77 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.85 kB
dist/assets/asset-DRNybFKp.js                    2.01 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 0.50 kB
dist/assets/card-BxPOIcVT.js                     3.05 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 1.03 kB
dist/assets/mine-txzynpoG.js                     3.08 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 1.33 kB
dist/assets/marker-CDmeMeHZ.js                   3.08 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 1.43 kB
dist/assets/throw-CtACwOyr.js                    7.86 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 2.68 kB
dist/assets/deal-ptFW1zND.js                    10.26 kB │ &lt;span class="nb"&gt;gzip&lt;/span&gt;: 3.93 kB
✓ built &lt;span class="k"&gt;in &lt;/span&gt;1.16s

PWA v0.21.1
mode      generateSW
precache  41 entries &lt;span class="o"&gt;(&lt;/span&gt;110.77 KiB&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PWA &amp;amp; Responsivity
&lt;/h2&gt;

&lt;p&gt;A Progressive Web App (PWA) setup ensures that Flogon Galaxy runs efficiently on mobile, desktop, and even embedded browsers. TailwindCSS handles the design flexibly. But the main pain point is the setup of PWA. At first moment I asked Amazon Q to help me, but that solution cause broke my whole program look and feel,&lt;br&gt;
because generated a wrong service workes, which is stuck on browser, so when I tryed to fix it the problem that error are be stay even after a complet roll back, - thx to &lt;code&gt;Amazon Q /dev&lt;/code&gt; functionality which is great! the modification can be easy review and roll back - , also try ChatGPTo1 help also failed to help. A problem is need to be reset the service worker on chrome. After this incident I figure out the solution by give a right question to AI: &lt;br&gt;
Why not a vite generate a PWA stuff under the build process ?&lt;br&gt;
Give to this job to a &lt;code&gt;vite-plugin-pwa&lt;/code&gt; and configured perfectly are solved.&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%2Fsuttrv7s5sl6ysahqwpr.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%2Fsuttrv7s5sl6ysahqwpr.png" alt="Image description" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This program greatest help is my markdown editor: &lt;code&gt;marker&lt;/code&gt; which is also great tool for testing a different aspect-ratio, which is a base question on the responsivity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  JSDoc
&lt;/h2&gt;

&lt;p&gt;A great pillar of uncompiled / minimal dependency JS development was the really underrated JSDoc. &lt;a href="https://dev.to/pengeszikra/jsdoc-evangelism-1eij"&gt;JSDoc evangelism&lt;/a&gt;. To sort: as this project are proof JSDoc equal to TS without that dependecy ( just devDep ). So at the end:&lt;br&gt;
JavaScript remains readable and maintainable with strict documentation standards. Using JSDoc ensures clarity and provides editor hints even without TypeScript.&lt;/p&gt;
&lt;h2&gt;
  
  
  3D Without a 3D Engine
&lt;/h2&gt;

&lt;p&gt;Using CSS transformations, we achieve a pseudo-3D effect while keeping performance high and dependencies low.&lt;br&gt;
The card game based on this css setup (Tailwind don't handle these attributes)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;    &lt;span class="nf"&gt;#desk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;transform-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve-3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;perspective&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;70vw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rotateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;40deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rotateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;rotateZ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;.55&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;translateZ&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;translateY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-8rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;pointer-events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&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;All cards are attached to &lt;code&gt;#desk&lt;/code&gt; and that why see our cards in 3D.&lt;/p&gt;

&lt;h2&gt;
  
  
  My AI Crew
&lt;/h2&gt;

&lt;p&gt;My development don't realized under this sort time without AI workes help.&lt;br&gt;
Here is my AI crew list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Q : code expert&lt;/li&gt;
&lt;li&gt;ChatGPT : project assistant, lyric, code&lt;/li&gt;
&lt;li&gt;Midjourney : visual&lt;/li&gt;
&lt;li&gt;Suno : track&lt;/li&gt;
&lt;li&gt;Revoicer : voice over&lt;/li&gt;
&lt;li&gt;HailuoAI : clip&lt;/li&gt;
&lt;li&gt;Clipdrop : remove background&lt;/li&gt;
&lt;li&gt;DreamAI : visual training
Without these help this project are cannot realize under a strickt timeframe:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2024.06.27 -&amp;gt; alien-solitare : react based cardgame for dev.to challange&lt;br&gt;
2024.07.06 -&amp;gt; pure-web-ccg : started my pure web work&lt;br&gt;
2024.12.14 -&amp;gt; flogon-board : meanwhile I found reddit hackhaton also, &lt;br&gt;
              a first game of Flogon series + sprite editor&lt;br&gt;
2024.12.29 -&amp;gt; flogon-galaxy : I started focusing on this project&lt;/p&gt;

&lt;p&gt;On this exact project I have just two weeks. Very underestimated. But thx of these helps the Flogon Galaxy are reach the state of technical demo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Amazon Q
&lt;/h2&gt;

&lt;p&gt;For me the Amazon Q is a great help on a think phase - around november - when I created around 15+ mini game using by Amazon Q. This is a great help to quick try and test my different ideas. On later the implement phase the /dev command is the greatest help to solve a different task including a DynamoDB implementation, which case I not really familiar, but solwe that stuff under no time.&lt;/p&gt;

&lt;p&gt;Which I don't like in Amazon Q is the too much extra question like a: Do you have another question? That is completly unneccecary in point of my view. Instead just show the next chat input line, and if I write to there something that means I continue the work, don't need a extra button click.&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%2Fkfdfj5611v9g7yz3322u.jpg" 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%2Fkfdfj5611v9g7yz3322u.jpg" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  DynamoDB and Marker
&lt;/h2&gt;

&lt;p&gt;On early stage of this project: november, I created a markdown-view WebComponent, plus attach a simple textarea to it. My initial goal with that program just a very basci markdown-viewer, but after I implemented the minor syntax highlighting for a codeblock, and a iframe capability a whole new world open to me.&lt;/p&gt;

&lt;p&gt;You can test this program on link:&lt;br&gt;
&lt;a href="https://flogon-galaxy.vercel.app/marker.html" rel="noopener noreferrer"&gt;M A R K E R&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try to paste any markdown to it.&lt;/p&gt;

&lt;p&gt;It cannot understund a different program languages, just a mix of HTML/JS/JSDoc setup on it, sure to need a extension, but it is working as POC, with a good speed.&lt;/p&gt;

&lt;p&gt;Table, list, bold, are don't work, but the real power is the embedding url with a&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{%url%}

// or

{%url%aspect-ratio}

for example:

{%.%16/9} // start this program on standard aspect ratio

{%deal.html%16/9} // start a card game

// or 

{%deal%16/9} // also start the card game.

// a secret old program is started by:

{%throw%1/1}

// this is my previous reddit hackhaton submit. 
// A different version of Flogon's Throw to Match game.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The AWS DynamoDB are included to this marker
&lt;/h2&gt;

&lt;p&gt;But that is just work on locally a good reason, because I used it to instant save and load a markdown file. Just press the &lt;code&gt;ESC&lt;/code&gt; and on input line write: &lt;code&gt;e:rpg.md&lt;/code&gt; which is try to load a rpg.md from DynamoDB. But to do that, need to setup your DynamoDB credential to your .env which is looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS_ACCESS_KEY_ID = "AKI........"
AWS_SECRET_ACCESS_KEY = "4Qr8........"
AWS_REGION = "eu-north-1"
DYNAMO_TABLE = "storage-0392"
PORT = 3000
API = "http://localhost"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;of course for do that need to make your AWS account, and create a dynamoDB, it is worth it!&lt;/p&gt;

&lt;p&gt;I have another development tools in this program:&lt;/p&gt;

&lt;h2&gt;
  
  
  Sprite Sheet Editor
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{%throw%1/1}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If press `z` started the sprite editor
`c` - move box
`v` - pick a sprite
`w` - decrease a vertical size
`s` - increase a vertical size
`a` - decrease a horizontal size
`d` - increase a horizontal size
`[` , `]` - change sprite sheet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// you can copy spritesheet data to your code with this js code 
// in chorme dev tools:
copy(JSON.parse(localStorage.getItem('-shoot-') || '{}'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/Pengeszikra/flogon-galaxy" rel="noopener noreferrer"&gt;You can found my code on this repo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which is lead me to use some framework like functions?
&lt;/h2&gt;

&lt;p&gt;As I sed at first I try to live without any framework, but I need a state managment, which is really important part of a complex application like a card game, where so many events happend. Which is easy replacable a reactive state. Her is one of the easiest implementation. Also important this state are not coupled with any view like in a React. Even this state handling is not nececcary to using on every file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signal-Based State Management
&lt;/h2&gt;

&lt;p&gt;A custom signal system replaces external state libraries, providing fine-grained reactivity with minimal overhead. This single function are solved a nececcary state management in this game. I also created a more "sofisticated" function: &lt;code&gt;zignal&lt;/code&gt; which is capable to handle a deep level Proxy state handling, but &lt;br&gt;
that is overcomplicated in this case. So I choice the simplier one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/** @type {&amp;lt;T&amp;gt;(watcher?: function) =&amp;gt; (state?: T | object) =&amp;gt; T} */
export const signal = (watcher = () =&amp;gt; { }) =&amp;gt; (state = {}) =&amp;gt; {
  return new Proxy(state, {
    get: (target, prop) =&amp;gt; target[prop],
    set: (target, prop, value) =&amp;gt; {
      target[prop] = (value !== null &amp;amp;&amp;amp; typeof value === 'object')
        ? signal(watcher)(value)
        : value
        ;
      watcher(target, prop, value);
      return true;
    },
  });
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  JSX Framework
&lt;/h2&gt;

&lt;p&gt;The another big improvement of modern framework is the easy composable application. Where a JSX is shining so bright. On a certain point I realized, without a JSX I need to labell every DOM element, and that is so painfull. That why I grab out my really old A lightweight JSX rendering system drives UI interactions without requiring React, maintaining simplicity and control.&lt;br&gt;
5 years ago I readed a blog about JSX, and I created a function which can be used a basic JSX handler. Now the times is come to take out of that code and with a AI help to combine with vite to handle JSX files. After a few tweek rounds it is properly fine for my program. I don't have to write a test, the working code are the help.&lt;/p&gt;

&lt;p&gt;The important vite.config.js part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  esbuild: {
    jsxFactory: 'fencer', // Use your custom `fencer` function as the JSX factory
    jsxFragment: 'Fragment', // Optional if you use JSX fragments (e.g., `&amp;lt;&amp;gt;...&amp;lt;/&amp;gt;`).
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Imperfection Workflow
&lt;/h2&gt;

&lt;p&gt;As you can see, rather than striving for immediate perfection, an iterative, adaptive workflow guides development. This allows to me, my creative ideas to shape the game naturally. So I do not fear to make a mistake, instead I search which part can be finish before the deadline. I think many of developer use this technic, and don't stuck on a specific porblem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Untold Story of Flogon
&lt;/h2&gt;

&lt;p&gt;My biggest dept is: I don't have to shaping my story about the Flogons to you.&lt;br&gt;
So this chaper at least told a few basic things about Flogons.&lt;br&gt;
Please listen it this discusion about Flogon special dream travel capability and the &lt;br&gt;
universe undiscovered material the Inverzit.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dEvza4zqK6E"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;We don't reach even the closest star system at this moment. But the first contact give a chanche to reach undreamed distances. The main problem because the Flogons are nor technocrat or kapitalist, because the distance and the possible place don't close it, like us. So hard to understund what is the common between us.&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%2F51q06p9cuivworipc1sq.jpg" 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%2F51q06p9cuivworipc1sq.jpg" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the flogon use a bit different the technic than as, because some of them even cabale to shape change into a item also. Not every flogon can dream travel, also not every flogon capable to that level of shape change - but normal shape chanege is very common. That why sometimes use cloth sometimes not. We don't know yet how many start systems or galaxy they are explored.&lt;/p&gt;

&lt;p&gt;But our scientist are collect a strange theory from the Flogon from Wora Shard. This is some hidden code which can be ready any one: Just need to be count a 42 markers  distance ( fluctuation ) in a π. This is:&lt;/p&gt;

&lt;h2&gt;
  
  
  Theory of π / 42
&lt;/h2&gt;

&lt;p&gt;A deep dive into the mathematical intrigue behind the Flogon universe, where π and the number 42 hold the key to understanding cosmic resonance. Wora Shard even crated a song about this one.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/nSjjrrqZbvQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Wora Shard
&lt;/h2&gt;

&lt;p&gt;A question worth pondering. The short answer? She was just an underground Punk-Metal singer, lost in the echoes of rebellion—until the night she dreamed herself into the vast unknown.&lt;/p&gt;

&lt;p&gt;One moment, she was on Earth. The next, she awakened on a distant, alien world, surrounded by mysteries beyond human comprehension. Stranded and disoriented, she would have been lost forever… if not for Yogdar, a seasoned Flogon captain who saw something unusual in her arrival.&lt;/p&gt;

&lt;p&gt;Through perilous journeys across the galaxy, through worlds uncharted and dangers untold, Yogdar guided her back home. But something had changed. Wora was no longer just a singer—she was a traveler between realms, a dreamer who had touched the fabric of a universe she barely understood.&lt;/p&gt;

&lt;p&gt;And this… this is where our story truly begins.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0ZZH9dA8Pbg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Credit Roll
&lt;/h2&gt;

&lt;p&gt;My other big debt is the end credit roll list. Because a same point this development process is looks like a one man show with a AI help. But the whole AI thing is learning for us. So any content or idea which even materialize a AI that is nothing else than a question to the human knowledge base throught a AI interface.&lt;br&gt;
Also important to include this list a specific person, who are inspired me and keep my spirit up on these thirilling development rush. Thx for that, credit roll will coming after the freez.&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%2Faeo1lx8q9yhu335kxsh3.jpg" 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%2Faeo1lx8q9yhu335kxsh3.jpg" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Future plan
&lt;/h2&gt;

&lt;p&gt;After project freeze ended I am start focusing the Flogon story lines which is saddly don't fit to this project. The connection betwen us and the Flogons is really interesting field. Technically a multiplayer version with poolished games, including card collection ability, space trading, ship building. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your Dreams Come True!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>gamedev</category>
      <category>jsdoc</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
