<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kuga</title>
    <description>The latest articles on DEV Community by Kuga (@branislav_kuga_4118d3b3ab).</description>
    <link>https://dev.to/branislav_kuga_4118d3b3ab</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4147805%2F8e788942-5b9f-4c63-9573-061188f838e3.png</url>
      <title>DEV Community: Kuga</title>
      <link>https://dev.to/branislav_kuga_4118d3b3ab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/branislav_kuga_4118d3b3ab"/>
    <language>en</language>
    <item>
      <title>Five small free apps: your voice, your birthday, your song, your photo, and a bedtime story</title>
      <dc:creator>Kuga</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:18:59 +0000</pubDate>
      <link>https://dev.to/branislav_kuga_4118d3b3ab/five-small-free-apps-your-voice-your-birthday-your-song-your-photo-and-a-bedtime-story-2n7m</link>
      <guid>https://dev.to/branislav_kuga_4118d3b3ab/five-small-free-apps-your-voice-your-birthday-your-song-your-photo-and-a-bedtime-story-2n7m</guid>
      <description>&lt;p&gt;August was for websites. September was for music videos. October finally belonged to the small apps: ideas that had been spinning around in my head for a while, waiting for their turn. This month they got built.&lt;/p&gt;

&lt;p&gt;The first four share one rule: everything you see and hear comes from what you give them. Your voice, your name and birth date, your song, your photo. Nothing is random and nothing is picked from a library, so the same input always gives the same result. The fifth is a small gift for anyone with little kids.&lt;/p&gt;

&lt;p&gt;All five are free and run entirely in the browser. No account, no server, and nothing you record, type or upload ever leaves your device. Videos are rendered frame by frame and encoded straight to MP4, not recorded from the screen, so they don't stutter and open on any phone.&lt;/p&gt;

&lt;p&gt;They all live on one small site: My Little Apps | Kuga Lab, &lt;a href="https://mylittleapps.pages.dev" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Rosonata: say your name, get a rosette that plays music
&lt;/h2&gt;

&lt;p&gt;Say your name into the microphone. Two seconds later you have a glowing rosette with petals, rings and little gold spikes. Press Play, and a needle starts reading it like a music box, while a real piano (or a harp, a cello and a French horn) plays what it finds.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsxh8xa6zim8c5sj73h0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsxh8xa6zim8c5sj73h0.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it came from
&lt;/h3&gt;

&lt;p&gt;Before Rosonata there was a simpler app: say a name, get a mandala-like rosette, with one strict rule that everything must come from the voice. Looking at one of those rosettes, it suddenly looked like the disc from an old music box: rings, bumps, a steady rhythm around the circle. It looked like a score. So the question became: what if the rosette could sing?&lt;/p&gt;

&lt;h3&gt;
  
  
  Listening to the voice
&lt;/h3&gt;

&lt;p&gt;The recording is cut into short overlapping frames, and for each one the app measures loudness, pitch, brightness, 12 frequency bands, and how often the wave crosses zero, which is how it finds hissing sounds like s, sh and ch. Silence is trimmed, and the loudness peaks split the name into syllables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drawing the rosette
&lt;/h3&gt;

&lt;p&gt;Every measurement has one job:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the median pitch of the voice sets the number of arms (10 to 18) and the base colour&lt;/li&gt;
&lt;li&gt;every syllable becomes a ring&lt;/li&gt;
&lt;li&gt;the pitch and loudness of that syllable shape the petals in its ring&lt;/li&gt;
&lt;li&gt;hissing sounds become spikes, loud moments become dots&lt;/li&gt;
&lt;li&gt;a medallion in the centre sums up the whole name&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The number of arms is one line. pc is where the voice falls inside an octave (0 to 11):&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;N&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;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&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;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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="nx"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pc&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 10..18 arms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It goes around the octave like a circle instead of up a ladder, so low voices don't always get fewer arms. A deep voice and a high voice can both land on 18.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading it like a music box
&lt;/h3&gt;

&lt;p&gt;As the disc turns, wherever a petal line crosses the needle, a note sounds. Further from the centre means higher. To keep it from sounding like a cat on a keyboard, every note snaps to a pentatonic scale in the key of the voice that said the name:&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;PENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&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;deg2semi&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;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12&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;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;PENT&lt;/span&gt;&lt;span class="p"&gt;[((&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;5&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;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;57&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;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// the key comes from your voice&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are two ways to read. Classic: the needle stands still, the medallion gives the bass, and on the last arm the disc slows down like a music box running out of spring. Complex: the needle travels from the centre to the edge like a gramophone, the dots and spikes set the rhythm, and every phrase reads a different line.&lt;/p&gt;

&lt;p&gt;The sound comes from real recorded instruments (tonejs-instruments). There are three sounds: Piano, Salon (piano, harp, cello) and Film (French horn, harp, piano, cello), all through a concert-hall reverb. You can keep the rosette as a PNG, a 1080×1080 MP4 or a WAV.&lt;/p&gt;

&lt;h3&gt;
  
  
  The detours
&lt;/h3&gt;

&lt;p&gt;The first version had no instruments at all. You recorded your name, then sang "laaa", and your own voice became a choir. It crackled, for three reasons. The click or breath at the start of the recording was replayed on every note. A deep voice pushed two octaves up sounded like broken glass. And the phone simply couldn't mix dozens of voices live: the exported WAV was clean, but live playback crackled. The fix for that last one stayed in the app. The whole piece is rendered offline first, and only one finished buffer is played:&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;oc&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;OfflineAudioContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&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;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;44100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;44100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ...schedule every note into oc...&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;oc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startRendering&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// then play just this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It hasn't crackled since, even on a mid-range Android phone.&lt;/p&gt;

&lt;p&gt;The next discovery: every melody went up, down, up. Of course, because petals go out and come back. So came other paths through the rosette: a golden spiral, a nautilus (which, by the way, is not a golden spiral, that's a popular myth), sunflower seeds at 137.5°, Archimedes' spiral, a rose curve, Lissajous figures. At one point there were about twelve reading modes and six instruments.&lt;/p&gt;

&lt;p&gt;A scoring function then measured which option was the most "melodic". On paper, the spirals won. To the ear, plain piano going up and down sounded best, and the violin was shrieking. And a visitor who sees fifteen buttons just leaves. So the extra code was removed, not hidden, and the best ideas from the experiments were folded into Complex.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://mylittleapps.pages.dev/rosonata/app" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev/rosonata/app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Melodentity: your name and birthday as a melody nobody else has
&lt;/h2&gt;

&lt;p&gt;It started with a claim seen online: if you match name and birth time down to the minute, only 1 to 5 people in the world share yours, even for the most common names.&lt;/p&gt;

&lt;p&gt;It's wrong. About 250 babies are born every minute worldwide. The most common full name on Earth, Wang Wei, belongs to roughly 290,000 people. Spread over about 70 years of birthdays, that's around 10 per calendar date, and divided by the 1,440 minutes in a day, 0.007 Wang Weis per minute. The "1 to 5" only appears if you forget the birth year.&lt;/p&gt;

&lt;p&gt;So for almost everyone alive, name + date + time of birth is already unique. Which means it could become something that belongs to only one person: a melody.&lt;/p&gt;

&lt;p&gt;You type your full name, in any alphabet, your date and your time of birth. You get a short tune with a synth or a real grand piano, the same tune as real piano sheet music, and a PNG of the score and an MP3 of the melody. Change one letter or one minute and you get a completely different tune.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb07j3ur271yx5qr9xo9m.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb07j3ur271yx5qr9xo9m.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Version 1, and how it broke
&lt;/h3&gt;

&lt;p&gt;The first version mapped things directly: each digit of the date became a melody note, each letter of the name an accompaniment note, the time of birth set the tempo. It sounded nice and felt unique. Then came the question: can two people get the same tune? The math said yes, in several ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Only the first 5 letters were heard, so Marko Petrović and Marko Jovanović sounded identical.&lt;/li&gt;
&lt;li&gt;The note was charCode % 10, so A, K and U shared a note. Nina = Dina, Hana = Rana.&lt;/li&gt;
&lt;li&gt;Tempo depended on the distance from noon, so 10:00 and 14:00 sounded the same.&lt;/li&gt;
&lt;li&gt;Cyrillic letters were silently deleted, so every name written in Cyrillic got no accompaniment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Patching each hole would only patch the holes found so far.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version 2: a fingerprint
&lt;/h3&gt;

&lt;p&gt;Name, date and time are joined into one string and run through SHA-256. The result is a 256-bit fingerprint, and changing a single character changes the whole thing. Every musical decision is then read from that number, one after another:&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="c1"&gt;// each choice "uses up" part of the fingerprint&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hashReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hex&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;big&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;hex&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;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BigInt&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;big&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="nx"&gt;big&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hashReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sha256&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="nx"&gt;name&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="nx"&gt;date&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="nx"&gt;time&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tempo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;BPMS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;         &lt;span class="c1"&gt;// one of 8 tempos&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pitch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PENT8&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)];&lt;/span&gt;        &lt;span class="c1"&gt;// one of 8 notes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;DURATIONS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;R&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="c1"&gt;// short, long, or short + rest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every letter counts, every alphabet works, and there are no symmetries. Before hashing, the name is normalized: upper and lower case are the same, extra spaces don't count, and Ана Петровић = Ana Petrović, because it's the same person in two scripts. But č is not c: Petrović and Petrovic are spelled differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two modes
&lt;/h3&gt;

&lt;p&gt;In Date + fingerprint mode, the melody is your birth date, one note per digit, so you can actually hear your birthday. The accompaniment comes from the fingerprint and tells apart the roughly 360,000 people born that day. It has 16 notes, because that's where the chance of two people sharing a tune drops below one in a million, and 8 digits × 2 eighth notes fill the bar exactly. In Pure fingerprint mode, 24 melody notes come from the fingerprint of everything, over 4 slow bass notes. An honest caveat: a hash makes uniqueness overwhelmingly likely, not mathematically guaranteed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sheet music a pianist can play
&lt;/h3&gt;

&lt;p&gt;The score is drawn with VexFlow as a grand staff. A phrase can be 9, 10, 11 or 12 eighth notes long, so instead of forcing it into 4/4, each bar gets its true time signature: 11/8, 9/8. Long bass notes are written with ties, short notes get staccato dots, accented notes get accent marks. 120 combinations were checked in both modes: every note on paper starts and ends exactly where the sound does.&lt;/p&gt;

&lt;p&gt;The piano uses 12 recordings from the Salamander Grand Piano. The MP3 uses the same offline rendering as Rosonata, encoded in the browser with lamejs.&lt;/p&gt;

&lt;p&gt;The rule that caught the Nina = Dina problem: agree first, code second. The first version felt unique. Only "prove that two people can't get the same tune" showed the holes.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://mylittleapps.pages.dev/melodentity/app" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev/melodentity/app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Songlyph: 25 visualizer experiments, one app
&lt;/h2&gt;

&lt;p&gt;After a month of making music videos in code, the phone was full of experiments with names like tacke-v11-2.html and linija-v4-1.html. About 25 files, many of them slightly different versions of the same idea. Four ideas survived:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Line: a line that wanders, spirals or writes rows across the canvas, steered by the song.&lt;/li&gt;
&lt;li&gt;Dots: discs that fall on every beat and fill the canvas as the song goes.&lt;/li&gt;
&lt;li&gt;Circle of fifths: the harmony of the song drawn as a path around the circle of fifths, with rings and chord lines on each beat.&lt;/li&gt;
&lt;li&gt;Signature: a line whose whole behaviour comes from a few numbers measured from the entire song.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of four apps, there's one, with a Layers switch that stacks several modes on the same canvas. That's Songlyph: song + glyph.&lt;/p&gt;

&lt;p&gt;You upload any song, and the app first listens to all of it: tempo and beats, chords, loudness, bass and treble, stereo width, and the points where the song changes parts. Then it draws while the song plays, and every trait leaves its own trace. Beats drop shapes, chords pick the colour and the direction, loudness sets size and brightness, stereo width splits the line in two, and new parts of the song leave rings. You can save a full-resolution PNG, or a video with the song in 1:1, 9:16 or 16:9.&lt;/p&gt;

&lt;p&gt;There are a lot of switches: four modes with their own options, layers, six palettes, a dark or light canvas, bokeh lights, "breathing", a seed and a manual tempo fix. If you like visualizers, drop in a song you love and play. If you write code, open the source: one HTML file, a hand-written FFT and beat detection, no frameworks. Change a number and you get a different drawing. Take it apart.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://mylittleapps.pages.dev/songlyph/app" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev/songlyph/app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Kaleidosong: the kaleidoscope, back where it belongs
&lt;/h2&gt;

&lt;p&gt;Almost everyone had one as a kid. A cardboard tube, a few pieces of coloured glass, three little mirrors. You held it up to the light, turned it slowly, and a new pattern bloomed every second. Nobody had to explain it, and nobody owned it. It was the cheapest toy in the shop, and every child in the world got to hold one.&lt;/p&gt;

&lt;p&gt;So it was strange to find kaleidoscope apps that charge for HD, for a longer video, or to remove a watermark.&lt;/p&gt;

&lt;p&gt;Kaleidosong is free. Give it one picture and one song, and it turns them into a living kaleidoscope that moves with the music: squares like mirrored tiles, or hexagons, exactly like three mirrors in a tube. No account, no watermark, no limit. Take a photo of your street, your cat, your grandmother's tablecloth, put your favourite song under it, and turn the tube.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://mylittleapps.pages.dev/kaleidosong/app" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev/kaleidosong/app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Storyglobe: four picture books, free for every child
&lt;/h2&gt;

&lt;p&gt;This one is a small present for everyone with little kids at home.&lt;/p&gt;

&lt;p&gt;Four picture books, each with a gentle lesson, illustrations and a little song at the end:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lioner Learns to Stay Safe&lt;/li&gt;
&lt;li&gt;Greenosaur Learns to Brush His Teeth&lt;/li&gt;
&lt;li&gt;Foxin Learns to Share&lt;/li&gt;
&lt;li&gt;Owlo, a little owl who doesn't want to go to bed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Read them together on the screen, in your own language, or download them and keep them. No account, no ads, no price. Good stories for kids should be free, just like the kaleidoscope.&lt;/p&gt;

&lt;p&gt;Read them: &lt;a href="https://mylittleapps.pages.dev/storyglobe/" rel="noopener noreferrer"&gt;https://mylittleapps.pages.dev/storyglobe/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you try any of them, show what you got in the comments: your rosette, your tune, your drawing, your kaleidoscope. And if you read a book with your kid, tell me if I made some mistakes in your mother's language 🙂&lt;/p&gt;

&lt;p&gt;Credits: piano samples from the Salamander Grand Piano by Alexander Holm (CC BY 3.0). Instrument samples from tonejs-instruments, VSCO 2 Community Orchestra and Freesound (CC BY 3.0). Sheet music by VexFlow (MIT). MP3 encoding by lamejs (LGPL-3.0). Video export with mp4-muxer (MIT).&lt;/p&gt;

&lt;p&gt;All five apps were built on a phone, in conversation with Claude. This post was written with help from AI.&lt;/p&gt;

&lt;p&gt;Cheers 🥂 &lt;br&gt;
Kuga&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webaudio</category>
      <category>creativecoding</category>
    </item>
    <item>
      <title>I made 45 music videos in a month. 21 of them are pure code, and here's how</title>
      <dc:creator>Kuga</dc:creator>
      <pubDate>Sat, 03 Oct 2026 12:23:17 +0000</pubDate>
      <link>https://dev.to/branislav_kuga_4118d3b3ab/i-made-45-music-videos-in-a-month-21-of-them-are-pure-code-and-heres-how-20f</link>
      <guid>https://dev.to/branislav_kuga_4118d3b3ab/i-made-45-music-videos-in-a-month-21-of-them-are-pure-code-and-heres-how-20f</guid>
      <description>&lt;p&gt;After the kind response to my first post, where I wrote about building three websites in August, here's what came next. In September I started making music videos for the songs I create with AI and publish on my YouTube channel.&lt;/p&gt;

&lt;p&gt;Let me be honest right away: all of this is play and experimenting. I'm still a beginner. I'm not a graphics programmer or a video editor. I just want to see how far I can go, because AI tools today have almost no limits.&lt;/p&gt;

&lt;p&gt;In one month I made 45 music videos. 24 are the classic kind: scenes generated with AI video tools, then put together in a video editor. 21 are made entirely in code, with no video footage and no AI video.&lt;/p&gt;

&lt;p&gt;I don't write the code myself. AI does. I come up with the story and the look, watch every version and say what's wrong. The AI writes and fixes the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why code, when AI video exists?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It's more fun for me. I get to watch something being built from zero, piece by piece.&lt;/li&gt;
&lt;li&gt;It looks different. It's not yet another "wow AI animation" like the thousands already online.&lt;/li&gt;
&lt;li&gt;I have full control. Code is something tangible: I can change any detail exactly the way I want. With pure AI video, the result always drifts off in its own direction, no matter if the prompt is short, long, detailed or vague.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How the work goes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The process was the same for all three videos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I write a script for the song. Line by line, with timestamps: at 0:41 this happens, at 1:24 that. This turned out to be the most important step.&lt;/li&gt;
&lt;li&gt;The AI writes the code and tests it on its own server. It doesn't render the whole video, just 20–30 still frames from different parts of the song, like a contact sheet.&lt;/li&gt;
&lt;li&gt;I look at those stills and say what's wrong. Most mistakes are visible in a picture, not in the code.&lt;/li&gt;
&lt;li&gt;When the stills look right, I render the real video on my own device, usually my phone, and report what still looks wrong in motion.&lt;/li&gt;
&lt;li&gt;Repeat until it's right.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I picked three videos. The first two use the same tool, Three.js in the browser, but each one solved a different problem: a city that follows the song and its lyrics, and a character that walks and acts. The third one is made in a completely different way, with Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Veins of the City (Three.js, in the browser)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A walk through a rainy neon city at night, where the lyrics light up as neon signs. Both the song and the video were inspired by Wong Kar-wai's film Fallen Angels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it was built, step by step:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, the song gets measured. When you pick the mp3, the browser (Web Audio) isolates the bass and finds the beats, about 250 in 5 minutes. That's a list of timestamps, and from then on the picture "knows" where the rhythm is.&lt;/li&gt;
&lt;li&gt;The lyrics become a table. Each line has three values: the text, when it lights up and when it goes dark. The auto-generated subtitles were a mess, so the timing was put together from my lyrics and the parts of the subtitles that were actually right.&lt;/li&gt;
&lt;li&gt;The song decides the shape of the city. The camera walks faster in the chorus and slower in the quiet part. From that speed, the length of each street is calculated, so the camera turns a corner exactly when the song changes sections. Song first, city second.&lt;/li&gt;
&lt;li&gt;Everything is drawn by one function: "show me moment t". You give it a time in the song, and it places the camera, lights the right signs and windows, and draws the frame. There's no real randomness: even the "random" flickering is calculated from the time, so it's identical every time.&lt;/li&gt;
&lt;li&gt;The frame goes through filters: glow, motion trails, blur toward the edges, then color grading and film grain.&lt;/li&gt;
&lt;li&gt;Export: the same function is called for moment 0, then 1/30 of a second, then 2/30… Each frame goes into an encoder (WebCodecs), which packs them together with the audio into an MP4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why step 4 matters most: when I say "something's wrong at 2:36", the AI can render exactly that frame and look at it. The same function also makes the vertical version for Shorts, just with a different frame shape.&lt;/p&gt;

&lt;p&gt;Here's the idea in a few simplified lines:&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="c1"&gt;// Everything on screen comes from one number: the time in the song.&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;renderAt&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;moveCamera&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="c1"&gt;// where we are on the street at this second&lt;/span&gt;
  &lt;span class="nf"&gt;lightSigns&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="c1"&gt;// which lyrics are glowing right now&lt;/span&gt;
  &lt;span class="nf"&gt;flickerWindows&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="c1"&gt;// windows react to the bass&lt;/span&gt;
  &lt;span class="nf"&gt;drawFrame&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;         &lt;span class="c1"&gt;// draw the picture&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Export: ask for every moment, 30 times per second, and save each picture.&lt;/span&gt;
&lt;span class="k"&gt;for &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;frame&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="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;totalFrames&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="o"&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;renderAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;saveFrame&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;&lt;strong&gt;What went wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The server had no graphics card, so one frame took 3 seconds and the whole video about 4 hours. So the server only makes test stills, and I render the real video myself. On a desktop it took a few minutes.&lt;/p&gt;

&lt;p&gt;The camera jerked after the second minute. The AI wrote a small program that "walks" the camera through the whole video and flags every spot where it jumps too much. It found the causes in seconds.&lt;/p&gt;

&lt;p&gt;The camera walked into a building, and lyrics ended up in the wrong street. Both only showed up on the contact sheet.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;2. Memories I Was Given (Three.js, in the browser)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lonely robot walks through a burned-out world at sunset, with someone else's memories on its chest screen.&lt;/p&gt;

&lt;p&gt;How do you get a 3D world without 3D software? There's no modeling program where you shape objects with a mouse. The robot is written as a list of parts: the head is a sphere, the visor is a ring, the chest is a rounded box. The parts are connected like joints: the hand hangs from the elbow, the elbow from the shoulder, the shoulder from the chest. When the shoulder turns, the whole arm follows. The ruins are made the same way: the ground is a grid of points whose heights are calculated, and a wall is a box with its top edge "bitten off". Three.js turns all of that into 3D shapes, and the graphics card draws them. The world is still 3D, it's just written instead of built by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it was built, step by step:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A script, line by line. Before any code, the whole song was planned out: which shot, what the robot does, on which lyric. In the end this was the most useful part of the whole project.&lt;/li&gt;
&lt;li&gt;The song gets measured once, in advance. The finished video is a single HTML file, but during preparation Python was used once: it split the song into 10 frequency bands, 30 times per second, and the resulting numbers (about 50 KB) were written straight into the HTML. Python isn't needed to make the video, and the equalizer and the heart on the robot's chest always move the same way.&lt;/li&gt;
&lt;li&gt;The robot is built from parts, as described above, and the metal gets rust painted on a canvas.&lt;/li&gt;
&lt;li&gt;Walking is calculated backwards. I don't move the knee and hip by hand. I say where the foot should be, and the code calculates the angles (this is called IK). Each step lasts exactly one beat of the song.&lt;/li&gt;
&lt;li&gt;The whole path is calculated once, at load time: where the robot is and which foot is on the ground, for every moment of the song. That's why you can jump to any second and the feet still stay planted.&lt;/li&gt;
&lt;li&gt;Same idea as the city: "show me moment t". That function moves the sun, poses the robot, draws the chest screen and places the camera.&lt;/li&gt;
&lt;li&gt;A camera with no hard cuts. Within one location the camera glides from shot to shot. When the location changes, both shots are drawn and dissolve into each other.&lt;/li&gt;
&lt;li&gt;Export works like the city: frame by frame into an MP4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What went wrong:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It worked on the AI's server, but on my computer (Windows) the screen was completely black. One broken pixel, which the glow effect smeared across the entire frame. The first fix turned the screen white, because Windows had quietly removed the part of the code meant to catch the problem. Lesson: test on another computer as soon as you have your first frame.&lt;/p&gt;

&lt;p&gt;Screen recording didn't work: the video stuttered, and my video editor wouldn't even show the file. That's where the rule came from: always render frame by frame.&lt;/p&gt;

&lt;p&gt;Vertical video for Shorts: a simple crop loses half the shot, so the vertical mode widens the field of view on its own.&lt;/p&gt;

&lt;p&gt;Surprise: my mid-range phone exported the whole video in 1080p in about 7 minutes, right in the browser.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;3. The Galaxy Devourer (Python, no browser)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A black hole devours a galaxy, styled as a Japanese arcade game from the 80s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it was built, step by step:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rhythm first. librosa finds the beats in the song. Since they "wobble" a little, the code lines them up into a perfectly even grid. From that come two small functions: "which beat are we on" and "how far into it are we". Everything else asks them.&lt;/li&gt;
&lt;li&gt;Then the rules of the look: a small image (384×216), only 16 colors, letters without smoothing. Those rules apply to every single frame.&lt;/li&gt;
&lt;li&gt;Every scene is a function of time. The black hole, the galaxy, the bonus stage, the captions: each one gets the time, asks "which beat is it", and draws its part (Pillow). Movement happens in steps on the beat, like in old games.&lt;/li&gt;
&lt;li&gt;One function for swallowing. Planets, dust, the galaxy and the player's ship all use the same function: "pull this point into the hole along a spiral". Written once, used everywhere.&lt;/li&gt;
&lt;li&gt;Captions and lyrics come last, on top of everything: the dialog box, the score counter, the stage name.&lt;/li&gt;
&lt;li&gt;Upscaling: the small image is enlarged five times (NumPy), then old-TV scanlines are added.&lt;/li&gt;
&lt;li&gt;No images on disk: each finished frame goes straight into ffmpeg, which joins it with the song. 6,100 frames in about 5 minutes on the server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When everything hangs on the rhythm, the video feels in sync even when the animation is simple.&lt;/p&gt;

&lt;p&gt;Limits help: low resolution and 16 colors created the style by themselves.&lt;/p&gt;

&lt;p&gt;First a 30-second test, agree on the look, and only then the full video.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What applies to all three&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Almost everything on screen is calculated from the time in the song. If something's wrong at 2:36, you can render exactly that frame and look at it.&lt;/li&gt;
&lt;li&gt;Render frame by frame, don't record the screen. Recording stutters. This way it's identical every time, with no glitches.&lt;/li&gt;
&lt;li&gt;Look at frames, not code, but don't be afraid of the code. As a beginner I can't read 1,300 lines of code, but I can see that the camera is inside a wall. Sometimes I still ask to see the code and have the AI explain what each part does and how I can change it myself. That way I can tweak small things like a color or a speed on my own, and I learn something new every time.&lt;/li&gt;
&lt;li&gt;Test on a real device, and don't underestimate your phone. What works on one computer doesn't have to work on another. I only used my computer when I was impatient and wanted to render faster and see the result. Along the way I figured out that everything works on a phone too, so I did about 98% of the work on my phone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every video taught me something new, and every time I'm surprised how far you can get with AI, without any background in graphics or animation.&lt;/p&gt;

&lt;p&gt;All the videos are on my YouTube channel: &lt;a href="https://www.youtube.com/@kuga-i7o" rel="noopener noreferrer"&gt;https://www.youtube.com/@kuga-i7o&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading. U zdravlje!&lt;/em&gt; 😄&lt;/p&gt;

&lt;p&gt;This post was written with help from AI, based on my own work.&lt;/p&gt;

</description>
      <category>creativecoding</category>
      <category>javascript</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I'm an ER doctor. After decades without touching code, I built 3 websites with AI in one month — on my phone.</title>
      <dc:creator>Kuga</dc:creator>
      <pubDate>Mon, 28 Sep 2026 20:43:37 +0000</pubDate>
      <link>https://dev.to/branislav_kuga_4118d3b3ab/im-an-er-doctor-after-decades-without-touching-code-i-built-3-websites-with-ai-in-one-month-on-5ccm</link>
      <guid>https://dev.to/branislav_kuga_4118d3b3ab/im-an-er-doctor-after-decades-without-touching-code-i-built-3-websites-with-ai-in-one-month-on-5ccm</guid>
      <description>&lt;p&gt;I've been an emergency doctor in Serbia for 12 years, Emergency medicine is intense, and burnout is real. This summer I started building websites out of pure curiosity, and as a way to switch off after shifts.&lt;/p&gt;

&lt;p&gt;My coding background: a little BASIC and Pascal, a very long time ago,lol. Since then, nothing. Not a single line of code.&lt;/p&gt;

&lt;p&gt;In one month I built three websites. Along the way I finally understood things that used to be just words to me: what PHP is and how it differs from WordPress, what SQL and a database actually do, what a website is made of and how all the pieces talk to each other. All three sites are live, and I built every one of them on my phone, in conversation with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three sites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leaveittotheworld.com/" rel="noopener noreferrer"&gt;leaveittotheworld.com&lt;/a&gt;&lt;br&gt;
-an infinite wall where anyone can leave a short message to the world. You move around it like a map, zoom in and out, and new messages start near the center.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://globalwallofgratitude.com/" rel="noopener noreferrer"&gt;globalwallofgratitude.com&lt;/a&gt; &lt;br&gt;
-a place to publicly thank someone: your mother, a teacher, a neighbour, a stranger.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://sendtothestars.com/" rel="noopener noreferrer"&gt;sendtothestars.com&lt;/a&gt; &lt;br&gt;
-pick a real star, exoplanet or galaxy on an interactive sky and send it a message. You get a card with a live counter showing how far your message has travelled at the speed of light, save the card and it works even offline. Everything on the sky is meant to be scientifically accurate. Positions, distances and descriptions come from real astronomical catalogues: the HYG star database, the IAU lists of official star and exoplanet names, exoplanet.eu, OpenNGC for galaxies and nebulae, and published research catalogues for star clusters and black holes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it actually works
&lt;/h2&gt;

&lt;p&gt;I don't write the code. I explain what I want, we discuss it until the idea is clear, and only then does the AI write the code. I upload the files to my hosting, test on my phone and report back what's broken.&lt;/p&gt;

&lt;p&gt;One rule I learned fast: &lt;strong&gt;first agree, then code.&lt;/strong&gt; If you let AI write code while the idea is still vague, you end up rebuilding everything three times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problems I didn't expect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Touch screens are hard.&lt;/strong&gt; On the message wall, tapping a card sometimes counted as dragging the wall. The fix was a bigger "drag threshold" for fingers than for a mouse. Pinch-to-zoom on the star map also jumped around until the touch handling was rewritten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big files and phones don't mix.&lt;/strong&gt; One page grew to 200 KB and my phone struggled to download and edit it. We split the data (thousands of stars) away from the code, and the file dropped to 22 KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WordPress plugins can bite.&lt;/strong&gt; One site runs on WordPress with code snippets. Importing a snippet silently created a duplicate, and the duplicate crashed the whole site. Now I always check for duplicates after an import.Not to mention the leftover plugins I tried at the beginning and then forgot about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-$ About money&lt;/p&gt;

&lt;p&gt;At first I thought: nice, maybe I can make a little money from this. I set up PayPal and got the whole payment flow working automatically: payment, server-side verification, the card appearing on the wall, the confirmation email. It worked with real payments.&lt;/p&gt;

&lt;p&gt;Then I realised these are my first three "school" projects. They should be open to everyone, with no payment at all. So I switched payments off. All three sites are now completely free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;A few weeks after launch, a message appeared on the wall from a complete stranger. Nobody I know, it just came from the internet. That felt better than any payment would have.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell another beginner
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;With AI, a complete beginner can get something real online, but you still have to understand what you're building. Ask "why" a lot.&lt;/li&gt;
&lt;li&gt;Test everything on a real phone.&lt;/li&gt;
&lt;li&gt;Security and privacy aren't optional. Ask the AI to review them, then ask again.&lt;/li&gt;
&lt;li&gt;Launch before it's perfect, but not before it works.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How I got here
&lt;/h2&gt;

&lt;p&gt;The websites weren't the beginning. It all started last year, when I discovered AI.&lt;/p&gt;

&lt;p&gt;First came posters. I had images in my head that I could never draw myself, and suddenly I could see them on the screen, looking exactly the way I imagined them.&lt;/p&gt;

&lt;p&gt;Then I made three children's picture books.&lt;/p&gt;

&lt;p&gt;Then I moved on to fashion. I designed a collection of dresses, and not just pretty pictures: complete designs, detailed enough to actually be sewn in real life.&lt;/p&gt;

&lt;p&gt;Then came AI music, and that one still amazes me. You can make songs exactly the way you like them.&lt;/p&gt;

&lt;p&gt;And finally, the websites.&lt;/p&gt;

&lt;p&gt;Right now I'm making music videos for the songs I created. Some use AI animation, some are built in code, so that everything on screen follows the music: the beat, the mood, the moment.&lt;/p&gt;

&lt;p&gt;Every step taught me something for the next one. A year ago I couldn't have imagined any of this. Now I can't imagine stopping.&lt;/p&gt;

&lt;p&gt;I'm still an ER doctor. This is what I do between shifts, and it has been the best kind of therapy.&lt;/p&gt;

&lt;p&gt;To be honest, none of my friends would really understand what I'm talking about. When I say "I moved the config file above public_html" or "the canvas was drawing the sky from the outside," I get polite nods. So I needed to share this story with people who actually get it. That's you.&lt;/p&gt;

&lt;p&gt;Does any of this have a point? I don't know. But it made me happy, and maybe it will make someone else curious enough to try.&lt;/p&gt;

&lt;p&gt;If you visit any of the sites, I'd love to hear what you think, especially what's confusing.&lt;/p&gt;

&lt;p&gt;U zdravlje, everyone. That's Serbian for "to your health." Coming from a doctor, I mean it literally.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was written with help from AI, of course , based on my own story.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kuga&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
