<?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: Eugene Kozlovsky</title>
    <description>The latest articles on DEV Community by Eugene Kozlovsky (@koztechie).</description>
    <link>https://dev.to/koztechie</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%2F3340118%2Fb7a95fb0-4366-48e6-a83d-3a589891c52e.jpg</url>
      <title>DEV Community: Eugene Kozlovsky</title>
      <link>https://dev.to/koztechie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/koztechie"/>
    <language>en</language>
    <item>
      <title>Building NICHLYST: The Weight of 40 Days, 29 Endings, and a Style Anchor</title>
      <dc:creator>Eugene Kozlovsky</dc:creator>
      <pubDate>Thu, 13 Aug 2026 21:01:28 +0000</pubDate>
      <link>https://dev.to/koztechie/building-nichlyst-the-weight-of-40-days-29-endings-and-a-style-anchor-2o0f</link>
      <guid>https://dev.to/koztechie/building-nichlyst-the-weight-of-40-days-29-endings-and-a-style-anchor-2o0f</guid>
      <description>&lt;p&gt;Three days ago, I published the first devlog. I had a 128-step plan, a blank APK, and 3 Google Play testers. Today, I have 40 days of structured narrative content, 29 endings, a full art pipeline, and a very familiar tightness in my chest.&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Content Freeze
&lt;/h2&gt;

&lt;p&gt;Between August 10th and August 13th, I completed a massive chunk of the antifragile plan. The most critical milestone was the content freeze.&lt;/p&gt;

&lt;p&gt;What does "frozen" mean? It means NICHLYST now has a definitive shape. Unless a miracle happens and I find myself far ahead of schedule with time to consider expanding the lore, the scope is now locked. The JSON file that drives the entire game has been committed, tagged, and backed up to Google Drive. &lt;/p&gt;

&lt;p&gt;Here is what that structure looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;40 days&lt;/strong&gt; of narrative content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;29 endings&lt;/strong&gt; (main and hidden).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple resource counters&lt;/strong&gt; (some visible to the player to manage survival, others running silently under the hood, tracking psychological and moral degradation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over 100 global flags&lt;/strong&gt; tracking every choice the player makes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote the initial script as a markdown document, then structured it into JSON. The English translations were finalized alongside the Ukrainian originals, as the hackathon requires all submission materials in English.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffxiy1jzs18ebf847qlwf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffxiy1jzs18ebf847qlwf.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moral Audit
&lt;/h2&gt;

&lt;p&gt;Before freezing the content, I ran a moral complexity audit on the entire game. My design formula is simple: &lt;strong&gt;every choice must pit the value of testimony against the cost of survival&lt;/strong&gt;. No binary good/evil. No easy outs.&lt;/p&gt;

&lt;p&gt;The audit checked every single day for six criteria: no binary good/evil, testimony vs. survival tension, consequence weight, emotional cost, no easy outs, and narrative coherence.&lt;/p&gt;

&lt;p&gt;The audit found 39 out of 40 days passing all six checks. One day failed.&lt;/p&gt;

&lt;p&gt;It was a breathing space between two heavy acts. The problem? Both choices had zero mechanical consequences. No resource deltas. No flags set. The player could experience the day as cost-free.&lt;/p&gt;

&lt;p&gt;That is a violation of the core design philosophy. In NICHLYST, nothing is free. So I fixed it: accepting help now costs a psychological resource (the moral weight of compromise), and refusing help costs a social resource (the cost of pride). The fix was committed, and the content was frozen.&lt;/p&gt;

&lt;p&gt;The audit also identified some of the game's strongest moral scenes — moments where the player must decide whose memory gets preserved, whose identity gets erased, and whether to warm the paper archive or the living people in the freezing basement. These are not fun choices. They are not supposed to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Art Pipeline: Style Anchor and Privacy
&lt;/h2&gt;

&lt;p&gt;With content frozen, I moved to art generation. The design document specifies a "muted gouache and ink-wash illustration" style — desaturated, painterly, Eastern-European post-industrial. This is the style anchor.&lt;/p&gt;

&lt;p&gt;I am using a single AI model for this: &lt;strong&gt;MAI-Image-2.5-Pro&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I rejected other tools because their creations are public by default. I am not publishing art before the game ships. Privacy is a stop-loss. &lt;/p&gt;

&lt;p&gt;I generated a series of test images to validate the style anchor. Then I generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Character sheets and portraits for the Archivist and all visitors.&lt;/li&gt;
&lt;li&gt;Base background locations for the underground node and the besieged city.&lt;/li&gt;
&lt;li&gt;Postscript locations reflecting the slow decay after the finale.&lt;/li&gt;
&lt;li&gt;Flat papercut UI icons for the visible resources.&lt;/li&gt;
&lt;li&gt;The 1024×1024 app icon.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd7v9obty0hgbmbh13mmb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd7v9obty0hgbmbh13mmb.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every single image was manually audited against a negative checklist: no real flags, no military insignia, no celebrity likenesses, no readable text, no brand logos. One image initially had a pattern too close to real military gear. I regenerated it with explicit instructions for nondescript, worn winter gear without any insignia, and passed the audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 23:00 Rule Met Reality
&lt;/h2&gt;

&lt;p&gt;In my first devlog, I wrote about the 23:00 hard stop. I said an antifragile plan must absorb bad days.&lt;/p&gt;

&lt;p&gt;I had bad days.&lt;/p&gt;

&lt;p&gt;War breaks a person. Even a civilian one. It shatters the psyche. But paradoxically, it also builds a strange kind of callus. You start perceiving things not as acutely as you might have years ago. Explosions become background noise. But the internal pressure remains.&lt;/p&gt;

&lt;p&gt;On August 10th, I felt the pre-panic state creeping in. A tightness in the chest, shallow breathing. I knew exactly what it was — I've been treating GAD for over a year. It didn't escalate into a full attack, but the physical toll was there. Sitting at my desk, trying to write JSON while my nervous system was bracing for an impact that wasn't coming.&lt;/p&gt;

&lt;p&gt;On August 11th, Russian ballistic missiles hit Kyiv again. The explosions were loud. But I didn't panic. I just kept working. There is a strange detachment that develops — you hear the booms, you acknowledge the danger, and you return to the code. The anxiety that day wasn't about the missiles; it was the quiet, creeping dread of an exhausted mind.&lt;/p&gt;

&lt;p&gt;None of these days were perfectly productive hackathon days. The plan bent.&lt;/p&gt;

&lt;p&gt;But the plan did not break.&lt;/p&gt;

&lt;p&gt;On the morning of August 13th, I sat down, opened VS Code, and committed the final content freeze. The JSON was valid. The art was generated. The moral audit was complete. The structure was intact.&lt;/p&gt;

&lt;p&gt;The antifragile plan absorbed days of anxiety and war, and the project still shipped its milestones on schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tester Update
&lt;/h2&gt;

&lt;p&gt;In my first post, I asked for help with the Google Play 20-tester bureaucracy. &lt;/p&gt;

&lt;p&gt;I now have 6 emails. &lt;/p&gt;

&lt;p&gt;It is progress, but the math is still unforgiving. I need 20 testers to bypass the 14-day closed testing wall before I can publish to production.&lt;/p&gt;

&lt;p&gt;So, I am putting this directly into this devlog again. If you are reading this, have an Android device, and 2 minutes to spare, please help a fellow builder bypass this bureaucratic wall.&lt;br&gt;
👉 &lt;a href="https://forms.gle/4hJkWsmuyKp3Tgtr8" rel="noopener noreferrer"&gt;https://forms.gle/4hJkWsmuyKp3Tgtr8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will just need to accept an invite from Google Play later, download the app, and keep it installed for 14 days. No deep QA required. Just your presence to satisfy the algorithm.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;The content is frozen. The art is generated (resizing and compression are deferred to pre-APK build — another stop-loss decision to avoid perfectionism). &lt;/p&gt;

&lt;p&gt;Next up: Phase 4 (Audio) and Phase 5 (Engineering — the game engine in HTML5/JS, reading from the JSON). The hardest part is still ahead. Writing a JavaScript state manager that tracks all these counters, flags, and ending conditions — all running inside a Capacitor Android wrapper on a phone.&lt;/p&gt;

&lt;p&gt;But the foundation is no longer fragile. It is concrete that was poured during a heatwave, under missile alerts, through the fog of GAD.&lt;/p&gt;

&lt;p&gt;NICHLYST is coming. And the content is frozen.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow this devlog for the #BuildInPublic journey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>shipaton</category>
      <category>indiedev</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building NICHLYST: An Antifragile Approach to Surviving a Hackathon (and Reality)</title>
      <dc:creator>Eugene Kozlovsky</dc:creator>
      <pubDate>Sun, 09 Aug 2026 21:30:57 +0000</pubDate>
      <link>https://dev.to/koztechie/building-nichlyst-an-antifragile-approach-to-surviving-a-hackathon-and-reality-2ehn</link>
      <guid>https://dev.to/koztechie/building-nichlyst-an-antifragile-approach-to-surviving-a-hackathon-and-reality-2ehn</guid>
      <description>&lt;p&gt;I’m 36. From Kyiv.&lt;/p&gt;

&lt;p&gt;Right now, my city is suffocating under a heatwave. At night, the air raid sirens wail, and the psychological weight of a war with no end in sight presses down on every decision. I am typing this on an AMD A4-4020 with 8GB of RAM — a machine so weak it chokes on modern web browsers.&lt;/p&gt;

&lt;p&gt;I am not a traditional developer. I am a vibe coder. To me, vibe coding isn't just a buzzword; it's a philosophy. It’s the ability to translate a feeling, an idea, or a complex vision into a precise prompt for a machine. It’s about orchestrating AI to bring a concept to life, rather than getting bogged down in the syntax of writing code from scratch. By day, I work as a webmaster and system architect, navigating a full-time job and a complex medical regimen.&lt;/p&gt;

&lt;p&gt;Yet, I am entering the RevenueCat Shipaton 2026 hackathon. Alone. Against teams with M2 Macs and budgets.&lt;/p&gt;

&lt;p&gt;Why? Because I don't just want to build an app. I want to prove that constraints don't kill projects. Fragility does.&lt;/p&gt;

&lt;p&gt;This is the story of NICHLYST — a slow narrative survival-archive sim for Android — and the 128-step antifragile plan I wrote to ensure it actually ships by September 28th.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Concept: Survival as a Gameplay Loop
&lt;/h3&gt;

&lt;p&gt;In NICHLYST, you are an archivist in a besieged city. You don't fight. You record. Every day, someone knocks on your door with a story. You must choose: record the full truth and risk your safety, or edit it to survive. The consequences don't arrive immediately — they arrive days later, via a real-time push notification, forcing you to live with the anxiety of your choices.&lt;/p&gt;

&lt;p&gt;It’s a game about documentation, truth, and the civilian experience of conflict.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 0: The Pre-Mortem
&lt;/h3&gt;

&lt;p&gt;Most hackathon projects die because developers start coding on day one. I started by writing a 128-step plan, but before writing a single line of code, I forced myself to do a pre-mortem.&lt;/p&gt;

&lt;p&gt;I listed the 10 most likely ways NICHLYST would fail. Here they are, raw and unfiltered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My weak local PC freezing during an Android build.&lt;/li&gt;
&lt;li&gt;Solo development bottlenecks.&lt;/li&gt;
&lt;li&gt;Missed evenings due to fatigue or schedule conflicts.&lt;/li&gt;
&lt;li&gt;Google Play App Review delays.&lt;/li&gt;
&lt;li&gt;AI art style mismatch or inconsistency.&lt;/li&gt;
&lt;li&gt;RevenueCat sandbox failure or SDK integration issues.&lt;/li&gt;
&lt;li&gt;Missing the hard deadline entirely due to scope creep.&lt;/li&gt;
&lt;li&gt;Psychological burnout.&lt;/li&gt;
&lt;li&gt;Catastrophic loss of content or code.&lt;/li&gt;
&lt;li&gt;Conflict with an existing 32-day evening schedule I must maintain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, I applied Nassim Taleb's Antifragility framework. I didn't just want to mitigate these risks; I wanted the project to &lt;em&gt;benefit&lt;/em&gt; from the stress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Barbell Strategy:&lt;/strong&gt; I allocated 90% of my time to the core, guaranteed MVP. The other 10% is strictly time-boxed for bonus categories. The "middle ground" — medium-risk, medium-reward tasks — is entirely eliminated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop-Loss Dates:&lt;/strong&gt; I hardcoded triggers into my plan. If the AI art pipeline isn't done by August 26th, I don't argue with myself. I automatically cut the art scope to a stark, 1-bit CSS visual filter and move on. Emotion has no place in the schedule.&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%2F3h32uhxr4he69mekvelr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3h32uhxr4he69mekvelr.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The 23:00 Rule and the Reality of Mental Health
&lt;/h3&gt;

&lt;p&gt;My plan includes a strict rule: work ceases at 23:00. A tired solo dev creates more bugs than they fix. Sleep is a strategic investment.&lt;/p&gt;

&lt;p&gt;But that’s the theory. The reality is messier.&lt;/p&gt;

&lt;p&gt;Sometimes external factors — late shifts at my day job, or the air defense activity in Kyiv — make the 23:00 deadline impossible. And then there are the internal factors. I live with GAD and depression. There are days when there are no missiles, no extra work, but my brain simply refuses to cooperate. The energy tank is empty. On those days, the only achievable victory is making it to the shower and getting into bed.&lt;/p&gt;

&lt;p&gt;An antifragile plan can’t be a rigid, brittle clockwork. It must absorb these bad days. If I miss an evening due to a depressive episode, the Stop-Loss dates protect the project. The schedule bends, but it doesn't break. It accommodates the reality of being human.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Infrastructure and the Art of Being Broke
&lt;/h3&gt;

&lt;p&gt;I operate on a strict, near-zero budget. My monthly income is about $700 USD, and rent consumes half of it. The only financial investment I made was paying the $25 Google Play Console registration fee — a serious amount of money for me right now.&lt;/p&gt;

&lt;p&gt;The Shipaton sponsors heavily promoted Replit for cloud builds. Replit even offers a 40% discount for hackathon participants. But even with the discount, a Replit Pro subscription is financially impossible for me.&lt;/p&gt;

&lt;p&gt;So, I engineered a workaround. I set up a local development environment on my Xubuntu 26.04 LTS machine using VS Code. For the heavy lifting — compiling the Capacitor Android APK — I connected my GitHub repo to &lt;strong&gt;Codemagic's free tier&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The setup wasn't painless. Capacitor v7 requires Java 21, but Codemagic defaulted to an older version. My first cloud build failed with &lt;code&gt;error: invalid source release: 21&lt;/code&gt;. A quick edit to the &lt;code&gt;codemagic.yaml&lt;/code&gt; file fixed the environment variables, and the build went green.&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%2F153xyd7z8hdpp7xprmi9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F153xyd7z8hdpp7xprmi9.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I sideloaded that blank, debug APK onto my Xiaomi Redmi Note 9 Pro and saw it launch... it wasn't just a blank screen. It was proof that a pipeline running from a $0 local machine to a $0 cloud builder to a physical device actually worked. The cycle was closed before I wrote a single line of game logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Google Play 20-Tester Bureaucracy
&lt;/h3&gt;

&lt;p&gt;Then came the infrastructure hurdle. Google Play now mandates a 14-day closed testing track with 20 active testers before a new personal account can publish to production.&lt;/p&gt;

&lt;p&gt;This is a bureaucratic nightmare for a solo dev with a ticking clock. If I wait until the game is done to start this timer, I will miss the deadline. So, I built a Google Form and posted it in the Shipaton Discord, my social channels, and sent it to colleagues.&lt;/p&gt;

&lt;p&gt;The result? Humbling.&lt;br&gt;
I got 3 emails from colleagues — my most loyal audience. From the Discord community? Zero. After 24 hours, the form remains agonizingly empty.&lt;/p&gt;

&lt;p&gt;I try not to succumb to panic. I try to filter out the noise, both from the outside world and my own anxiety. But the math is unforgiving: I need 20 testers, and I have 3.&lt;/p&gt;

&lt;p&gt;So, I am putting this directly into this devlog. If you are reading this, have an Android device, and 2 minutes to spare, please help a fellow builder bypass this bureaucratic wall.&lt;br&gt;
👉 &lt;a href="https://forms.gle/4hJkWsmuyKp3Tgtr8" rel="noopener noreferrer"&gt;https://forms.gle/4hJkWsmuyKp3Tgtr8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will just need to accept an invite from Google Play later, download the app, and keep it installed for 14 days. No deep QA required. Just your presence to satisfy the algorithm.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Unseen Labor
&lt;/h3&gt;

&lt;p&gt;Right now, NICHLYST is just a 128-step plan, a handful of &lt;code&gt;.md&lt;/code&gt; files tracking risks and deadlines, a GitHub repository, and a &lt;code&gt;codemagic.yaml&lt;/code&gt; configuration. No art, no story code, no RevenueCat paywalls yet.&lt;/p&gt;

&lt;p&gt;But the foundation is poured. It is not fragile.&lt;/p&gt;

&lt;p&gt;The day before yesterday, after a 10-hour shift at my day job and helping my wife with her transcription work, I had zero energy left. I didn't code. I didn't force it. I followed the rule: I updated my &lt;code&gt;PLAN_STATE.md&lt;/code&gt; log with one sentence, did a &lt;code&gt;git commit&lt;/code&gt;, and went to sleep.&lt;/p&gt;

&lt;p&gt;In a hackathon, survival isn't about sprinting. It's about building a system that allows you to keep walking, even when the ground is shaking.&lt;/p&gt;

&lt;p&gt;NICHLYST is coming. And it will ship on time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow this devlog for the #BuildInPublic journey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>shipaton</category>
      <category>indiedev</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>One person, one project, one month: Building Svitlogics from Kyiv</title>
      <dc:creator>Eugene Kozlovsky</dc:creator>
      <pubDate>Sat, 12 Jul 2025 00:13:56 +0000</pubDate>
      <link>https://dev.to/koztechie/one-person-one-project-one-month-building-svitlogics-from-kyiv-318k</link>
      <guid>https://dev.to/koztechie/one-person-one-project-one-month-building-svitlogics-from-kyiv-318k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wlh"&gt;World's Largest Hackathon Writing Challenge&lt;/a&gt;: Building with Bolt.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I'm 34. From Kyiv. A city that has learned to live by the sound of sirens.&lt;br&gt;
Because of my health, office life is impossible for me. So my home became my studio.&lt;br&gt;
I’m not a professional programmer. I know some Python, that's it. My real strength is something else. A process known as "vibe coding"—the ability to translate a feeling, an idea, a vision into a clear prompt for a machine.&lt;/p&gt;

&lt;p&gt;When I saw the announcement for the World’s Largest Hackathon presented by Bolt, my first thought was crushing.&lt;br&gt;
&lt;em&gt;Who am I to compete?&lt;/em&gt;&lt;br&gt;
A 34-year-old guy from Ukraine. Not a developer. Alone. Against 70,000 participants. Against entire teams. It felt absurd.&lt;/p&gt;

&lt;p&gt;I almost gave up on the idea.&lt;br&gt;
But a day before registration closed, I asked myself: what did I really have to lose? Time? I waste it doomscrolling anyway. A prize? The odds were tiny.&lt;br&gt;
But the potential gain was incredible. Experience. And most importantly, a chance to build something that matters.&lt;/p&gt;

&lt;p&gt;That idea was already living in my head. &lt;strong&gt;&lt;a href="https://svitlogics.com/" rel="noopener noreferrer"&gt;Svitlogics&lt;/a&gt;&lt;/strong&gt;.&lt;br&gt;
The name combines the Ukrainian word "світло" (transliterated as svitlo, meaning "light") and "logics" for reason.&lt;br&gt;
This isn’t just a tool. It's my personal mission. Because I believe we must bring light into the information chaos. And while this is a global issue, here in Ukraine, the ability to see clearly has become an acute survival skill.&lt;/p&gt;

&lt;p&gt;On May 28th, I registered. On the 31st, I began.&lt;br&gt;
My first prompt was simple. Very simple. "Create the full structure for a web application. The design should have a brutalist vibe. The app's purpose is to analyze text." Then I hit "Enhance prompt" and let the AI work.&lt;/p&gt;

&lt;p&gt;The result was… magic.&lt;br&gt;
It wasn't what I envisioned, but it wasn't entirely wrong. Bolt.new had created a functional text analyzer, but one that focused on word counts and character metrics, not the nuanced analysis of manipulation I had in mind. But I didn't feel disappointment. I felt euphoria.&lt;br&gt;
That feeling when you see a first, wobbly, but incredibly important step.&lt;br&gt;
The foundation was laid. It was imperfect. It was raw. But it existed.&lt;br&gt;
The first light of Svitlogics had been switched on.&lt;/p&gt;

&lt;p&gt;Onwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let me start with the questions…
&lt;/h2&gt;

&lt;p&gt;… The ones people ask.&lt;/p&gt;

&lt;p&gt;"Why does it look so... raw?"&lt;br&gt;
"Where are the shadows? The rounded corners?"&lt;br&gt;
"Isn't it a bit... primitive?"&lt;/p&gt;

&lt;p&gt;My answer is simple. And it’s always the same.&lt;br&gt;
This is not a mistake. It is a choice. It is a philosophy.&lt;/p&gt;

&lt;p&gt;I call it "Pure Minimalist-Brutalist."&lt;br&gt;
Because I believe form must serve substance. Not hide it.&lt;br&gt;
Svitlogics exists to cut through the noise. Its design must do the same. No exceptions.&lt;/p&gt;

&lt;p&gt;Modern UI uses soft shadows to create depth. It uses gentle gradients to feel "friendly."&lt;br&gt;
This is persuasion.&lt;br&gt;
It’s the same toolkit manipulators use, just with visuals instead of words.&lt;br&gt;
I refused to fall into that trap. For a tool that dissects lies, a "friendly" interface would be the biggest lie of all.&lt;/p&gt;

&lt;p&gt;So. No shadows. No gradients. No visual tricks.&lt;br&gt;
Because they are noise. Because they distract. Because they are not honest.&lt;/p&gt;

&lt;p&gt;The font is IBM Plex Mono. For one reason: absolute clarity. It sets a serious, analytical tone. It signals that this is a tool for thinking.&lt;br&gt;
The palette is even stricter. Black and white. For pure contrast.&lt;br&gt;
And one single color. Blue.&lt;br&gt;
It’s not for branding. It’s for function. It has only one job: to say, “You can act on this” or “This is a key result.”&lt;br&gt;
One color. One purpose.&lt;/p&gt;

&lt;p&gt;This design is not about being "beautiful."&lt;br&gt;
It is about being honest.&lt;br&gt;
And for a tool designed to fight for clarity, honesty is the only thing that matters.&lt;/p&gt;

&lt;p&gt;Unapologetically.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the design is its soul…
&lt;/h2&gt;

&lt;p&gt;…the system prompt is its brain.&lt;br&gt;
It’s what turns a general AI into a specialized tool. And building it was the hardest part of this journey.&lt;/p&gt;

&lt;p&gt;My first approach was naive.&lt;br&gt;
I thought I could write one "universal" prompt for both English and Ukrainian.&lt;br&gt;
I fed it an English text. The result was… promising.&lt;br&gt;
Then I fed it a Ukrainian text.&lt;br&gt;
A total mess.&lt;br&gt;
The AI missed the cultural context. The scores were erratic. The justifications felt soull-ess.&lt;/p&gt;

&lt;p&gt;This wasn't a turning point; it was a confirmation of what I already knew, especially after Russia's full-scale invasion: language is a weapon. The way manipulative narratives are constructed in English-speaking media can be vastly different from the techniques used in texts aimed at a Ukrainian audience. A universal tool would be a blunt instrument where a scalpel was needed.&lt;br&gt;
So I threw out the universal idea. And started over.&lt;br&gt;
Two separate prompts. One for each language. Double the work. But it was the only way.&lt;/p&gt;

&lt;p&gt;The process became a relentless loop.&lt;br&gt;
Prompt. Test. Analyze. Refine. Repeat.&lt;/p&gt;

&lt;p&gt;First, the data. I realized my initial test texts were too simple.&lt;br&gt;
So I spent hours building a richer dataset. Corporate press releases. Political speeches. Opinion pieces. Even 20th-century propaganda.&lt;br&gt;
Then I did something more. I used another AI to create synthetic data. To generate perfect examples of disinformation, with every manipulation I wanted to teach Svitlogics to see. It was like a targeted training course for my AI.&lt;/p&gt;

&lt;p&gt;Then, the real grind began.&lt;br&gt;
I’d run a test. Svitlogics would miss a manipulation.&lt;br&gt;
Why?&lt;br&gt;
My prompt was too vague. "Look for logical fallacies" isn't enough.&lt;br&gt;
So I’d refine it.&lt;br&gt;
“Search for a 'Straw Man' argument. A 'Straw Man' is when you misrepresent someone's position to make it easier to attack. For example…”&lt;br&gt;
Then I’d run the test again. A small victory. It found the Straw Man. But it missed the Appeal to Emotion.&lt;br&gt;
Back to the prompt.&lt;br&gt;
Another iteration. Another test.&lt;br&gt;
For hours. Days. Living in this cycle.&lt;/p&gt;

&lt;p&gt;Every success was a jolt of pure ecstasy. Every failure, a command to think clearer. To instruct better.&lt;br&gt;
This is the unseen labor behind Svitlogics.&lt;br&gt;
It's not just an API call. It's a carefully calibrated instrument.&lt;br&gt;
And the prompts are its secret sauce. The result of dozens of hours of obsession.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cascade eureka
&lt;/h2&gt;

&lt;p&gt;At first, Svitlogics was fragile. It relied on a single AI model.&lt;br&gt;
A choice born from pragmatism. I had a zero-dollar budget. It was free and generous.&lt;br&gt;
For a while, it worked.&lt;/p&gt;

&lt;p&gt;Then, during an intense testing session, it broke.&lt;br&gt;
429 Too Many Requests.&lt;br&gt;
I had hit the limit. My workflow, my focus — shattered.&lt;br&gt;
It was more than an annoyance. It was a fundamental flaw. A single point of failure.&lt;br&gt;
A tool for clarity cannot be this unreliable.&lt;/p&gt;

&lt;p&gt;The dilemma was classic. A smarter model with stricter limits? Or a dumber one that was always available?&lt;br&gt;
Neither was good enough. It needed to be smart &lt;em&gt;and&lt;/em&gt; resilient.&lt;/p&gt;

&lt;p&gt;The answer came to me while staring at the Google AI documentation.&lt;br&gt;
I didn't have to choose one model. I could use them all.&lt;br&gt;
The idea was a cascade. A sequential fallback system.&lt;br&gt;
It would try the best model first. If that failed, it wouldn't show an error. It would seamlessly try the next one. And the next.&lt;br&gt;
From a fragile pillar to a resilient, multi-layered structure.&lt;/p&gt;

&lt;p&gt;I built a priority list of seven models.&lt;br&gt;
The smartest and fastest at the top. The high-volume "workhorses" in the middle. The most limited one at the very end, defining the baseline for the whole app.&lt;br&gt;
This became the central nervous system.&lt;/p&gt;

&lt;p&gt;I chose to build this logic entirely on the client-side. In the browser.&lt;br&gt;
Simpler for a solo dev. Faster to deploy.&lt;br&gt;
I rewrote my API service into a recursive function.&lt;/p&gt;

&lt;p&gt;Here’s how it works.&lt;br&gt;
The system starts with the highest-priority model. It makes the API call.&lt;br&gt;
Success? Great. The job is done. The user gets their analysis.&lt;br&gt;
But if the API returns an error 429—meaning the model's quota is hit—there's no panic.&lt;br&gt;
The function simply calls itself again, this time targeting the next model down the cascade.&lt;br&gt;
This loop continues until it either gets a successful response or has tried all available models.&lt;br&gt;
To the user, it just works.&lt;/p&gt;

&lt;p&gt;Under the hood, it’s an elegant dance between seven different AI brains.&lt;br&gt;
Orchestrated by a few lines of JavaScript code running in the browser.&lt;br&gt;
Ensuring the light of Svitlogics never goes out. Even when some of its bulbs flicker.&lt;/p&gt;

&lt;h2&gt;
  
  
  My workflow: A symphony of two AIs
&lt;/h2&gt;

&lt;p&gt;I am not a programmer. Not a traditional one.&lt;br&gt;
This is the most important context.&lt;br&gt;
Svitlogics exists because of a new way to create. A process known as "vibe coding."&lt;br&gt;
It’s not about writing code from scratch. It's about having a clear vision and orchestrating AI to bring it to life.&lt;br&gt;
The project was built by a trio. Me, as the director. And two AI partners.&lt;/p&gt;

&lt;p&gt;Gemini was my strategic consultant. Bolt.new was my tireless engineer.&lt;br&gt;
A constant, fluid dance between them.&lt;/p&gt;

&lt;p&gt;I used Gemini as my architect and ultimate debugger. Before any big feature, I'd have a conversation with it. "I need to build a model cascade. What are the pitfalls?" It gave me blueprints. When Bolt's code broke, I didn't just ask Gemini to "fix it." I gave it the full context. The component. The prompt. The exact error. And it would find the root cause in seconds.&lt;/p&gt;

&lt;p&gt;Bolt.new was my implementation team. It built the project structure in minutes. My daily flow was simple: discuss logic with Gemini, refine details in Bolt's Discussion Mode, then execute with Build Mode. My job was to be the lead engineer. To review. To refine.&lt;br&gt;
This synergy is best illustrated by the story of when Svitlogics got "sick."&lt;/p&gt;

&lt;p&gt;It happened on June 8th. Until then, my confidence was soaring. The plan was simple: add a language switcher to the UI. I asked my strategist, Gemini. It recommended a solid, battle-tested library.&lt;br&gt;
But then, out of simple curiosity, I asked my engineer, Bolt, for its opinion. It suggested a different, lighter library. And I made a critical error. I deviated from my tested workflow and chose Bolt's suggestion.&lt;/p&gt;

&lt;p&gt;I gave it the prompt. "Install the library."&lt;br&gt;
And the machine I had come to trust turned against me.&lt;br&gt;
The application collapsed. A complete, catastrophic failure.&lt;/p&gt;

&lt;p&gt;My confidence evaporated. Frustration set in.&lt;br&gt;
I spent hours in a frantic loop. Feed error messages to Gemini. Translate its advice into prompts for Bolt. Each attempt was a gamble, burning my precious token allotment. The afternoon bled into evening. I was getting nowhere.&lt;/p&gt;

&lt;p&gt;Then, the air raid sirens began to wail in Kyiv.&lt;br&gt;
The dissonance was surreal. Wrestling with a broken app—a problem entirely of my own making—while the very real threat of missiles loomed outside. It was a stark reminder of priorities.&lt;/p&gt;

&lt;p&gt;In that moment, I had to make a decision. Not as a developer chasing perfection, but as a project manager with a hard deadline.&lt;br&gt;
I could keep fighting this losing battle. Keep burning time and tokens on a feature that wasn't core to the mission.&lt;br&gt;
Or I could retreat.&lt;/p&gt;

&lt;p&gt;I chose to retreat.&lt;br&gt;
The next day, my first command to Bolt was not to fix. It was to remove.&lt;br&gt;
"Delete the library. Remove every file. Every line of code. Revert everything."&lt;br&gt;
It felt like a small defeat. But it was the most mature decision I could make. I realized my desire for "one more feature" had endangered the entire project.&lt;/p&gt;

&lt;p&gt;A buggy app with a language switcher is infinitely worse than a stable, single-language app that does its job perfectly.&lt;br&gt;
This taught me the most valuable lesson of this hackathon.&lt;br&gt;
Ruthless prioritization.&lt;br&gt;
A great project is defined not just by what you add, but by what you wisely choose to remove.&lt;br&gt;
Sometimes, the most powerful move is not to write more code.&lt;br&gt;
It's to decisively delete it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building under fire: Finding focus amidst chaos
&lt;/h2&gt;

&lt;p&gt;This isn't just about code. It's about the human context.&lt;br&gt;
To build a hackathon project solo, with a full-time job, is a stretch.&lt;br&gt;
To do it from Kyiv, during a war, is to find focus in the heart of a storm.&lt;/p&gt;

&lt;p&gt;There were many nights like that. Nights that started not with code, but with the wail of air raid sirens. Nights that ended not with a successful commit, but with the grimly familiar routine: running to the hallway, waiting for the thud of our air defense systems at work, and hoping for the silence that follows.&lt;br&gt;
The next morning, you wake up a wreck. Utterly sleep-deprived.&lt;br&gt;
For me, sleep isn't a luxury; it's a pillar of stability. Its absence is a trigger for my depressive disorder. On those days, the energy tank is empty. Zero code gets written. Zero progress is made on Svitlogics.&lt;/p&gt;

&lt;p&gt;This is the part of the story often left out of triumphant tech narratives. The grind. The exhaustion. The many days where you produce nothing at all.&lt;br&gt;
And it was on one of those days, running on fumes, that I realized my perfectionism had become a trap.&lt;br&gt;
I was obsessed with making the system prompt "perfect." But the list of other essential tasks was a mountain.&lt;br&gt;
I was getting bogged down. Watering a single tree, while a whole ecosystem needed attention.&lt;/p&gt;

&lt;p&gt;So I made a strategic decision.&lt;br&gt;
I split my time into two tracks.&lt;br&gt;
&lt;strong&gt;Track 1: The Engineer.&lt;/strong&gt; Deep, focused work on the AI brain. Reserved for the days when I had strength.&lt;br&gt;
&lt;strong&gt;Track 2: The Product Manager.&lt;/strong&gt; Everything else. UI fixes, writing content, project planning. Less cognitively demanding tasks for the days of exhaustion.&lt;br&gt;
It was a way to keep moving forward. Always.&lt;/p&gt;

&lt;p&gt;This was a turning point. It felt empowering.&lt;br&gt;
It taught me that discipline isn't about forcing yourself to work when you have no energy left.&lt;br&gt;
It’s about being smart with the energy you have.&lt;br&gt;
On some days, progress is a complex new feature. On others, it’s fixing a single bug.&lt;br&gt;
Both are valid. Both are steps forward.&lt;/p&gt;

&lt;p&gt;This journey has been a lesson in resilience.&lt;br&gt;
The drive to create something meaningful is a powerful anchor in a sea of chaos.&lt;br&gt;
And the quiet act of writing a line of code, of building a tool for clarity while the world outside explodes, feels like a small act of defiance.&lt;br&gt;
An act of hope.&lt;br&gt;
And that is the most powerful motivator of all.&lt;/p&gt;




&lt;p&gt;34 days. What started as a last-minute decision has become one of the most rewarding experiences of my life.&lt;br&gt;
Svitlogics is now a real, working application. But for me, it is so much more.&lt;/p&gt;

&lt;p&gt;I came into this not as a programmer, but as a "vibe coder."&lt;br&gt;
I had a vision, a deep "why." But I believed my lack of traditional skills was a barrier.&lt;br&gt;
I was wrong.&lt;br&gt;
This journey proved to me that tools like Bolt.new are powerful equalizers. They shatter the walls between an idea and its execution. The future of building is here. And it’s incredibly empowering.&lt;/p&gt;

&lt;p&gt;Svitlogics itself is a project with a clear philosophy.&lt;br&gt;
It's not a judge that gives you answers. It's a scalpel to help you ask better questions.&lt;br&gt;
Its mission is to empower your own critical thinking. This belief is in every part of it—from its honest, brutalist design to its core analysis. Because the most effective way to fight disinformation is not by creating a new source of truth, but by fostering more critical minds.&lt;/p&gt;

&lt;p&gt;Building this from Kyiv gave it a meaning I never expected.&lt;br&gt;
The sounds of war are not a footnote to this story. They are the ink it was written with.&lt;br&gt;
It transformed a technical exercise into a personal act of resistance.&lt;/p&gt;

&lt;p&gt;I don't know if I will win. But I know I have already won the most important prize.&lt;br&gt;
The experience of building something I believe in, from zero.&lt;br&gt;
The lesson of managing a project, facing failure, and finding focus in chaos.&lt;br&gt;
The proof that my personal challenges do not define me.&lt;/p&gt;

&lt;p&gt;Whether it wins an award or not, Svitlogics exists. It works. It was built with purpose.&lt;br&gt;
For a solo developer from Kyiv, that is everything.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wlhchallenge</category>
      <category>bolt</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
