<?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: Jason C</title>
    <description>The latest articles on Forem by Jason C (@j4s0nc).</description>
    <link>https://forem.com/j4s0nc</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%2F294030%2Fb5a169ea-6420-47a3-8877-10f1c8a537e3.jpg</url>
      <title>Forem: Jason C</title>
      <link>https://forem.com/j4s0nc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/j4s0nc"/>
    <language>en</language>
    <item>
      <title>The House Gun: Why AI Velocity is Building Uninhabitable Code</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Wed, 11 Mar 2026 13:43:07 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-house-gun-why-ai-velocity-is-building-uninhabitable-code-46g</link>
      <guid>https://forem.com/j4s0nc/the-house-gun-why-ai-velocity-is-building-uninhabitable-code-46g</guid>
      <description>&lt;p&gt;When I started developing over 25 years ago, we hammered every nail by hand. The job was mostly coding, manual testing, and handling friction on deployments. You didn't just write a function, you lived through its lifecycle. You understood how the system held together because you felt the weight of every dependency and manually verified your logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then came the power tools
&lt;/h2&gt;

&lt;p&gt;The era of modern IDEs, Docker, and CI/CD pipelines. These are force multipliers. They don't change the physics of engineering, they make the roof go up faster. You still needed to understand the architecture, but the manual toil got streamlined. We now build at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The industry has handed us AI house guns
&lt;/h2&gt;

&lt;p&gt;You pull the AI trigger and bang: a whole service or React component appears. It’s sleek, it’s automated, and in the wrong hands, it’s architectural suicide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Velocity vs. Vector
&lt;/h3&gt;

&lt;p&gt;In physics, velocity without direction is just speed. In dev, velocity without a vector is how you end up with a structural wreck.&lt;/p&gt;

&lt;p&gt;The "house gun" (LLMs, Copilots) prioritizes volume over validity. When you use power tool without a blueprint, you just end up with a lot of doing. When you use a house gun without a vision, you end up with a &lt;em&gt;house-shaped object&lt;/em&gt; that fails the most basic inspection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seven Kittens, No Sinks
&lt;/h3&gt;

&lt;p&gt;The ease of generating code has led to AI Bloat, structures that look like progress but function like a fever dream. If you aren't careful with your directions, you end up with a system that has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-Euclidean Plumbing: Complex dependencies and logic flows that loop back on themselves, solving problems that don't exist while creating leaks that are hard to trace. Curvy vs straight line logic.&lt;/li&gt;
&lt;li&gt;The Facade Trap: You asked for a "home," and the AI delivered a living room full of seven kittens, but forgot to install any sinks. It looks great in the demo, but the core utility is missing or a mess.&lt;/li&gt;
&lt;li&gt;Phantom Rooms: Thousands of lines of hallucinated utility functions that add weight and technical debt without serving any actual purpose. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Inspection
&lt;/h2&gt;

&lt;p&gt;Tech has evolved from hammers to the house gun, but the physics of a good build hasn't changed. If you don't provide  architectural constraints, AI will always prioritize "looking like code" over "functioning like a system."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The nail gun requires skill. The house gun requires intent. If you aren't spending more time on the blueprint than the trigger, you aren't building, you're just creating an uninhabitable mess of high-tech debt.&lt;/p&gt;

&lt;p&gt;Stop shooting. Start designing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>design</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Anti-Framework Idea that turned into FUBARos - Clippy’s Revenge</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Sat, 13 Dec 2025 00:44:02 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-anti-framework-idea-that-turned-into-fubaros-clippys-revenge-5g59</link>
      <guid>https://forem.com/j4s0nc/the-anti-framework-idea-that-turned-into-fubaros-clippys-revenge-5g59</guid>
      <description>&lt;h2&gt;
  
  
  Behind the Code: The Anti-Framework Idea
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Before we dive into the madness, a word for the developers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FUBARos&lt;/strong&gt; is built with &lt;strong&gt;0% Frameworks&lt;/strong&gt;, &lt;strong&gt;0% Tailwind&lt;/strong&gt;, and &lt;strong&gt;100% Vanilla JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In an era where "Hello World" requires a 2GB &lt;code&gt;node_modules&lt;/code&gt; folder and a 15-minute build pipeline, this project is a rebellion. It runs on the browser's native engine—the way the internet intended.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;No React/Vue/Angular&lt;/strong&gt;: State management is handled by... variables.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No TailwindCSS&lt;/strong&gt;: Styles are written in CSS. Yes, just CSS &lt;em&gt;and a little js&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No Build Step&lt;/strong&gt;: Drag and drop to prod. Static files on a static host. Low cost, high chaos.&lt;/li&gt;
&lt;li&gt;  Less then 100 static files taking up less than 2MB of space. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;if you can't build a sentient paperclip in pure JS, you shouldn't be building it at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ultimate Player’s Guide to FUBARos
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“Press any key to continue... if you can find &lt;em&gt;the&lt;/em&gt; 'any' key.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Welcome, User [ANON], to the definitive manual for &lt;strong&gt;FUBARos&lt;/strong&gt;. This operating system isn't just a platform; it's a digital ecosystem teeming with life, chaos, and retro-futuristic nostalgia. Whether you're here to defend the BIOS, manage your RAM usage, or simply survive Clippy's judgment, this guide has you covered.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Play &lt;a href="https://fubarvalley.com/admin/?user=guest&amp;amp;pass=shurg" rel="noopener noreferrer"&gt;FUBARos Clippy’s Revenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Games Library
&lt;/h2&gt;

&lt;p&gt;FUBARos comes pre-loaded with a suite of productivity-killing entertainment modules.&lt;/p&gt;

&lt;h3&gt;
  
  
  📎 Clippy’s Revenge
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The Assistant That Never Sleeps.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A chaotic digital pet simulator featuring everyone's favorite paperclip. He is always running in the background, judging your every move.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: Mouse (Drag to move, Click to annoy).&lt;br&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: &lt;code&gt;clippy&lt;/code&gt;, &lt;code&gt;helpme&lt;/code&gt;, &lt;code&gt;god&lt;/code&gt;, &lt;code&gt;wtf&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Idle Mode&lt;/strong&gt;: Floats around, offering unsolicited advice and eating 8 MB of RAM.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Chaos Engine&lt;/strong&gt;: If ignored, he triggers screen effects (blur, shake, invert) or "cleans up" by closing your windows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Rage Mode&lt;/strong&gt;: Click him too much or drag him too long, and he turns red. A Raging Clippy scatters and screams.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Battle Royale&lt;/strong&gt;: &lt;strong&gt;System Warning&lt;/strong&gt;: Entering &lt;code&gt;clippy&lt;/code&gt; multiple times summons clones. They &lt;em&gt;will&lt;/em&gt; fight to the death. "THERE CAN BE ONLY ONE!"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎩 The Many Faces of Clippy
&lt;/h4&gt;

&lt;p&gt;Clippy is a master of disguise. When summoned, he may appear in one of 19 random styles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Classic&lt;/strong&gt;: The original nightmare.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Smart&lt;/strong&gt;: Glasses and a smug attitude ("My IQ is 3000").&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dapper&lt;/strong&gt;: Monocle and top hat. Indubitably.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Wizard&lt;/strong&gt;: "You're a wizard, Clippy." Casts &lt;code&gt;Fix Code&lt;/code&gt; lvl 1.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pirate&lt;/strong&gt;: Hunting for your crypto. Yarrr!&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Robot&lt;/strong&gt;: "DESTROY ALL HUMANS... I MEAN HELP."&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Zombie&lt;/strong&gt;: Hungers for RAM... and brains.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ninja&lt;/strong&gt;: Silently monitors your typos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Angel/Devil&lt;/strong&gt;: The duality of man (and code).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Glitch&lt;/strong&gt;: C̷o̷r̷r̷u̷p̷t̷e̷d̷.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Gold&lt;/strong&gt;: Premium edition. Costs more than your GPU.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Rainbow/Uniclippy&lt;/strong&gt;: Friendship is magic (and memory intensive).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;...and more&lt;/strong&gt;: Cow, Alien, Ghost, Poop, and Cool. Collect them all!&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!WARNING]&lt;br&gt;
&lt;strong&gt;Bad Idea&lt;/strong&gt;: Summoning 10+ Clippys may result in extreme desktop warzone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  👾 BIOS Invaders
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Defend the Kernel.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A retro arcade shooter. You are the last line of defense against incoming software bugs.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Left/Right Arrows&lt;/code&gt; (Move), &lt;code&gt;Space/Click&lt;/code&gt; (Shoot).&lt;br&gt;
&lt;strong&gt;Objective&lt;/strong&gt;: Destroy waves of bugs before they reach the system core at the bottom of the screen.&lt;br&gt;
&lt;strong&gt;Game Over&lt;/strong&gt;: If a bug touches your ship. "SYSTEM OVERRUN".&lt;/p&gt;

&lt;h3&gt;
  
  
  🧱 Brick Buster
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Smash the Firewall.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A classic breakout-style game. Use your paddle to deflect the packet (ball) and destroy the firewall (bricks).&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Mouse/Touch&lt;/code&gt; (Move Paddle), &lt;code&gt;Click&lt;/code&gt; (Launch).&lt;br&gt;
&lt;strong&gt;Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Procedural levels (Checkerboard, Pyramid, Randomized).&lt;/li&gt;
&lt;li&gt;  Ball speed increases as you clear sectors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Lose Condition&lt;/strong&gt;: Running out of lives (packets).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🪓 Component Chopper
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Hardware Harvesting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A fast-paced arcade clicker. Components are falling from the cloud!&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Click/Tap&lt;/code&gt; on items.&lt;br&gt;
&lt;strong&gt;Objective&lt;/strong&gt;: Collect GOOD items (Floppies, Keyboards, RAM) for points. Avoid BAD items (Viruses, Warning Signs) which damage your system health.&lt;br&gt;
&lt;strong&gt;Pro Tip&lt;/strong&gt;: Don't miss the Golden Disks (GREAT items) for massive score boosts. Missing good items hurts your uptime (health).&lt;/p&gt;

&lt;h3&gt;
  
  
  🐸 Defrag Frogger
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The data packet must cross the disk.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Navigate a data packet across a fragmented hard drive to the safe zone.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Arrow Keys&lt;/code&gt; or &lt;code&gt;WASD&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Hazards&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Bad Sectors&lt;/strong&gt;: Static red blocks that corrupt your data.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Write Heads&lt;/strong&gt;: Moving bars that will overwrite you.
&lt;strong&gt;Goal&lt;/strong&gt;: Reach the top row to "Defrag" the sector and heal the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚚 Deploy Game
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The Hacker Trail.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A text-based resource management adventure. You are rushing to deploy to production.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: On-screen buttons (&lt;code&gt;DEPLOY&lt;/code&gt;, &lt;code&gt;REST&lt;/code&gt;, &lt;code&gt;HUNT&lt;/code&gt;, &lt;code&gt;SHOP&lt;/code&gt;).&lt;br&gt;
&lt;strong&gt;Gameplay&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Manage resources: &lt;strong&gt;Crypto&lt;/strong&gt;, &lt;strong&gt;Bandwidth&lt;/strong&gt;, &lt;strong&gt;Coffee&lt;/strong&gt;, &lt;strong&gt;Backups&lt;/strong&gt;, and &lt;strong&gt;Uptime&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Survive random events: DDoS attacks, Ransomware, Memory Leaks, and Funding rounds.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Goal&lt;/strong&gt;: Travel the full distance to reach "Production" without your uptime hitting 0 or your crew burning out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏃 DialUp Dash
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Running on 56k.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: An endless runner set on a connection carrier wave.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Space&lt;/code&gt;, &lt;code&gt;Up Arrow&lt;/code&gt;, or &lt;code&gt;Tap&lt;/code&gt; to Jump.&lt;br&gt;
&lt;strong&gt;Objective&lt;/strong&gt;: Jump over signal noise (spikes) and collect data packets.&lt;br&gt;
&lt;strong&gt;Mechanics&lt;/strong&gt;: Speed increases with your "Baud Rate" (Score). Don't drop the connection!&lt;/p&gt;

&lt;h3&gt;
  
  
  📂 File Exploder
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Tunnel into the Mainframe.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A 3D-style tunnel runner. You are flying through the file system.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Click&lt;/code&gt; on lanes to interact.&lt;br&gt;
&lt;strong&gt;Items&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Folders&lt;/strong&gt;: Score &amp;amp; Speed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Locks (🔒)&lt;/strong&gt;: Click 3 times to decrypt for bonus points.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Viruses (☣️)&lt;/strong&gt;: Avoid at all costs! (Unless you have a Scanner).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Power-ups&lt;/strong&gt;: &lt;code&gt;ZIP&lt;/code&gt; (Points), &lt;code&gt;SCAN&lt;/code&gt; (Virus Shield), &lt;code&gt;HEART&lt;/code&gt; (Health).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧬 Life Sim
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Cellular Automata.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: An implementation of Conway's Game of Life.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Click/Drag&lt;/code&gt; to draw cells. Buttons to Start/Stop.&lt;br&gt;
&lt;strong&gt;Purpose&lt;/strong&gt;: No win condition. Watch patterns emerge, stabilize, or die out. A zen experience for the overworked admin.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Math Challenge
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Neural Calibration.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Test your CPU (brain). Solve arithmetic problems against the clock.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: Click the correct answer or use detailed hotkeys &lt;code&gt;1-4&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Modes&lt;/strong&gt;: Addition, Subtraction, Multiplication, Binary, Hexadecimal, Modulo.&lt;br&gt;
&lt;strong&gt;Status&lt;/strong&gt;: Correct answers boost your "Sync" (Time). Wrong answers cause lag (Time penalty).&lt;/p&gt;

&lt;h3&gt;
  
  
  🏓 Pong
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Table Tennis v0.1.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: The classic. Player vs CPU.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Mouse/Touch&lt;/code&gt; to move paddle.&lt;br&gt;
&lt;strong&gt;Objective&lt;/strong&gt;: First to 5 points wins. The ball speeds up with every hit. Good luck against the AI—it has a 0ms reaction time (usually).&lt;/p&gt;

&lt;h3&gt;
  
  
  ⛷️ Ski Paid
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Free to Play, Pay to Win.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Ski down an infinite internet slope filled with monetization obstacles.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Left/Right Arrows&lt;/code&gt; or &lt;code&gt;Mouse&lt;/code&gt; to steer.&lt;br&gt;
&lt;strong&gt;Obstacles&lt;/strong&gt;: Ads, Paywalls, Cookie Banners, Popups, 404 Errors.&lt;br&gt;
&lt;strong&gt;Power-ups&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;VPN&lt;/code&gt;: Shield against obstacles.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;ADBLOCK&lt;/code&gt;: Clears all pesky popups on screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐍 Snake
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PvP: Python vs Python.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Classic snake, but with a twist. You are not alone.&lt;br&gt;
&lt;strong&gt;Controls&lt;/strong&gt;: &lt;code&gt;Arrow Keys&lt;/code&gt; or &lt;code&gt;WASD&lt;/code&gt;.&lt;br&gt;
&lt;strong&gt;Twist&lt;/strong&gt;: You are competing against a CPU Snake.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Eat food to grow.&lt;/li&gt;
&lt;li&gt;  Cut off the enemy snake to kill them.&lt;/li&gt;
&lt;li&gt;  Avoid walls and your own tail.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📱 Applications
&lt;/h2&gt;

&lt;p&gt;Tools to manage (or mismanage) your system.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ System Control
&lt;/h3&gt;

&lt;p&gt;The central dashboard for your FUBARos experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;User Levels&lt;/strong&gt;: Features unlock based on your role (Guest -&amp;gt; User -&amp;gt; Admin -&amp;gt; Hacker).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Stats&lt;/strong&gt;: Monitor System Health (Integrity) and Instability.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Actions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Scan&lt;/strong&gt;: Check for issues.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Repair&lt;/strong&gt;: Heal system health (Admin).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Defrag&lt;/strong&gt;: Reduce instability (Admin).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Chaos Tools&lt;/strong&gt;: Leak memory, corrupt system (Hacker).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  📝 Tasks App
&lt;/h3&gt;

&lt;p&gt;The Task Manager.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monitor&lt;/strong&gt;: Real-time CPU and RAM graphs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Kill Process&lt;/strong&gt;: Force close unresponsive windows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Kill Clippy&lt;/strong&gt;: Attempt to terminate the paperclip. (He might come back).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌐 FUBAR Navigator
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The Internet within the Internet.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A fully functional (mock) web browser.&lt;br&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: &lt;code&gt;web&lt;/code&gt;, &lt;code&gt;browser&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Browse the "web" safely.&lt;/li&gt;
&lt;li&gt;  Access internal help pages (&lt;code&gt;fubar://help&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Chaos&lt;/strong&gt;: If the system is unstable, expect 404s and random redirects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⏳ Eras In Code
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;A Journey Through Time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Experience software history.&lt;br&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: &lt;code&gt;eras&lt;/code&gt;, &lt;code&gt;history&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Gameplay&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Travel through eras (Punch Cards -&amp;gt; DOS -&amp;gt; Windows 95 -&amp;gt; Modern).&lt;/li&gt;
&lt;li&gt;  Solve coding puzzles to advance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ System Alert (AdPopup)
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;The Price of Free Software.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Annoying popups that generate revenue for the OS (not really).&lt;br&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: &lt;code&gt;adpopup&lt;/code&gt; (if you hate yourself).&lt;br&gt;
&lt;strong&gt;Mechanics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click to close.&lt;/li&gt;
&lt;li&gt;  Sometimes they multiply.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💻 Command Line Interface (CLI)
&lt;/h2&gt;

&lt;p&gt;The Terminal is the heart of FUBARos. Access it via the desktop icon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Window Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;min [id]&lt;/code&gt; / &lt;code&gt;min all&lt;/code&gt;: Minimize windows. Watch them spin away.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;max [id]&lt;/code&gt; / &lt;code&gt;max all&lt;/code&gt;: Maximize windows.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;tile&lt;/code&gt;: Arranges all open windows in a grid. Satisfying.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;shuffle&lt;/code&gt;: Randomly scatters windows. Chaos mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Essential Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;help&lt;/code&gt;: Displays the help menu.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;clear&lt;/code&gt;: Wipes the terminal history.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;ls&lt;/code&gt;: Lists current directory contents (mock).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;status&lt;/code&gt;: Detailed text report of system health and role.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;scan&lt;/code&gt;: Run a diagnostic scan with personality-based commentary.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;login&lt;/code&gt;: Initiate the authentication sequence.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Admin Tools (Requires Role)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;sudo [command]&lt;/code&gt;: Execute with superuser privileges. (Response varies by role).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;purge&lt;/code&gt;: &lt;strong&gt;DANGER&lt;/strong&gt;. Closes all windows and clears memory. Scorched earth.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;hack&lt;/code&gt;: Simulates a "mainframe breach". Purely for feeling cool.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;reboot&lt;/code&gt;: Refreshes the browser/OS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fun &amp;amp; Easter Eggs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;cow [message]&lt;/code&gt;: Cowsay. The cow speaks your words.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;ping&lt;/code&gt;: Pong! Plays table tennis with the server latency.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;fubar&lt;/code&gt;: The origin story.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;make coffee&lt;/code&gt;: "I'm a teapot." (HTTP 418).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;whois [name]&lt;/code&gt;: Database lookup for entities like 'clippy', 'admin', 'god'.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;theme [name]&lt;/code&gt;: switch system themes (e.g. &lt;code&gt;theme cyberpunk&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Secrets &amp;amp; Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Personality System&lt;/strong&gt;: The OS has feelings. If System Health is low or CPU is high, command responses become "Stressed" or "Critical". Keep your system healthy for polite responses!&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Auto Login&lt;/strong&gt;: Who want's to type passwords? if user=name and pass are sent in query string, you might find an easy way in... &lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Mobile Users&lt;/strong&gt;: Double-tap the terminal to auto-scroll. Most games support touch controls!&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Blue Screen&lt;/strong&gt;: If Health hits 0%, accept your fate.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Play &lt;a href="https://fubarvalley.com/admin/?user=guest&amp;amp;pass=12345" rel="noopener noreferrer"&gt;FUBARos Clippy’s Revenge&lt;/a&gt; - "It works on my machine."&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>FUBAR OS: A throwback to simpler development</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Wed, 10 Dec 2025 00:43:17 +0000</pubDate>
      <link>https://forem.com/j4s0nc/fubar-os-a-game-a-portfolio-a-throwback-to-simpler-development-12d6</link>
      <guid>https://forem.com/j4s0nc/fubar-os-a-game-a-portfolio-a-throwback-to-simpler-development-12d6</guid>
      <description>&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%2Fu4e4phkxoxv1os3m1ow3.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%2Fu4e4phkxoxv1os3m1ow3.png" alt="FUBAR os" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Game: &lt;a href="https://fubarvalley.com/admin/" rel="noopener noreferrer"&gt;FUBAR os&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%2F3hpu69i57izxxjcjj550.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%2F3hpu69i57izxxjcjj550.gif" alt="FUBAR os" width="560" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When was the last time you built something in &lt;strong&gt;pure JavaScript, HTML, and CSS&lt;/strong&gt;—no frameworks, no bundlers, no build systems? For me, it was this week. And it turned into a full‑blown operating system parody, a portfolio piece, and a geeky game all rolled into one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Theme: OS Playground
&lt;/h2&gt;

&lt;p&gt;The project is called &lt;strong&gt;FUBAR OS&lt;/strong&gt; (Faulty User-Based Application Registry)s. It boots like a retro console, throws fake errors, and lets you type commands into a terminal. It’s equal parts retro, portfolio, and interactive joke.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commands&lt;/strong&gt;: &lt;code&gt;menu&lt;/code&gt;, &lt;code&gt;help&lt;/code&gt;, hide a handful of playful Easter eggs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errors&lt;/strong&gt;: Out‑of‑memory (OOM) crashes, BSOD‑style screens, and other simulated failures that remind us of the fragility of old tech.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State&lt;/strong&gt;: Reactive without React. Every keystroke updates the DOM directly, no virtual DOM, no hooks—just event listeners and state objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a crack at old‑school tech geek fun, but also a showcase of how far you can push vanilla JS when you stop leaning on frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean Code, No Frameworks
&lt;/h2&gt;

&lt;p&gt;I deliberately avoided modern tooling. No Webpack, no Babel, no React, no Vue. Just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt;: Semantic structure, minimal boilerplate.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS&lt;/strong&gt;: just styles, no preprocessors.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript&lt;/strong&gt;: ES6+ features and no transpilation.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the kind of codebase you just open and run in any browser. That constraint forced clarity: every function is meaningful, every state update explicit, every DOM mutation intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Reactive State Without Overhead
&lt;/h2&gt;

&lt;p&gt;The “reactivity” comes from simple observer patterns. A plain JS object holds state, and listeners update the UI when values change. No JSX, no diffing, no hydration. Just:&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&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;function&lt;/span&gt; &lt;span class="nf"&gt;setState&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="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&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="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#terminal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s reactive enough to feel modern, but light enough to feel like 1999.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧨 OOM Errors and BSODs
&lt;/h2&gt;

&lt;p&gt;Why simulate crashes? Because they’re part of the nostalgia. Developers who lived through Windows 98 or early Linux distros remember the pain—and the humor—of blue screens and memory leaks. Let turn these bugs into features.  &lt;/p&gt;

&lt;p&gt;It’s a reminder that errors can be playful, and that sometimes the best way to show technical skill is to embrace imperfection.&lt;/p&gt;

&lt;h2&gt;
  
  
  🕹️ Geek Fun Meets Resume
&lt;/h2&gt;

&lt;p&gt;This isn’t just a toy. It’s also my resume. Instead of a static PDF, recruiters and fellow devs can “boot” my career history, explore my skills via commands, and see my philosophy in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Why This Matters
&lt;/h2&gt;

&lt;p&gt;In a world drowning in frameworks, sometimes the most refreshing thing you can do is strip it all away. Build something raw. Make it fun. Show that you understand the fundamentals—and that you can bend them into something creative.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;FUBAR OS is my nod to the early web, my portfolio in disguise, and my reminder that &lt;strong&gt;you don’t need a build system to build something delightful&lt;/strong&gt;. Sometimes, all it takes is a few days, and a willingness to go deeper than you thought possible. &lt;/p&gt;

&lt;p&gt;Game: &lt;a href="https://fubarvalley.com/admin/" rel="noopener noreferrer"&gt;FUBAR os&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building LogantonPA.com: AI, Azure Functions, and self-feeding content</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Sun, 07 Dec 2025 14:27:11 +0000</pubDate>
      <link>https://forem.com/j4s0nc/building-logantonpacom-ai-azure-functions-and-self-feeding-content-4bm1</link>
      <guid>https://forem.com/j4s0nc/building-logantonpacom-ai-azure-functions-and-self-feeding-content-4bm1</guid>
      <description>&lt;p&gt;Small towns deserve big archives. My hometown, &lt;strong&gt;Loganton, Pennsylvania&lt;/strong&gt;, has stories that stretch from Native American trails, Civil War volunteers, Amish settlers and modern resilience. I wanted to capture that history in a way that was interactive, accurate, and alive.  &lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://logantonpa.com" rel="noopener noreferrer"&gt;logantonpa.com&lt;/a&gt;. And I did it in few days.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Flow: Gemini → VS Code → Copilot → Azure Functions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini AI Studio&lt;/strong&gt;: I scaffolded the initial site here, fast prototyping with AI assistance.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code + Copilot&lt;/strong&gt;: Once ejected, Copilot became my pair programmer—helping me refine, structure components, and iterate quickly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Functions&lt;/strong&gt;: The backend lives in a lightweight serverless functions. They handle chat logging, aggregation, and orchestration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Table Storage&lt;/strong&gt;: Every chat is logged, forming the raw dataset for new content ideas.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combo gave me speed, flexibility, and scalability without over-engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content Pipeline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aggregate top questions&lt;/strong&gt; Every chat log is saved in Table Storage. A function surfaces the most frequently asked questions and flags ones not yet covered by the site.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fact-check with model&lt;/strong&gt; Candidate topics are passed to a fact-checker model with strict instructions: validate against trusted archives and existing source links, reject folklore or bot-site noise.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate new content with Gemini in Antigravity&lt;/strong&gt; Once validated, prompts are fed into Gemini running in Antigravity to draft timeline entries or new pages. This keeps the site expanding in response to real user curiosity.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human review + deployment&lt;/strong&gt; Automation gets us 90% there, but final publishing is still a human task. I review, polish, and deploy—ensuring accuracy, tone, and fit with the LogantonPA.com mission.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Site Sections
&lt;/h2&gt;

&lt;p&gt;The site is structured around three interactive sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Timeline&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A chronological view of Loganton’s history.
&lt;/li&gt;
&lt;li&gt;Each entry is fact-checked and sourced.
&lt;/li&gt;
&lt;li&gt;Built to be expandable as new verified content comes in.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Source Links&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every fact is grounded with a source.
&lt;/li&gt;
&lt;li&gt;Links to archives, books, and reliable references are prioritized.
&lt;/li&gt;
&lt;li&gt;This is the backbone of trust—no floating claims, everything tied to evidence.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Chat&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visitors can ask questions.
&lt;/li&gt;
&lt;li&gt;Chats are logged, aggregated, and analyzed.
&lt;/li&gt;
&lt;li&gt;Top questions feed the content pipeline, ensuring the site grows in response to curiosity.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Turning Chats Into Content
&lt;/h2&gt;

&lt;p&gt;Here’s the logical workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Log chats&lt;/strong&gt; → stored in &lt;strong&gt;Table Storage&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate questions&lt;/strong&gt; → function surfaces top queries.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check coverage&lt;/strong&gt; → does the site already answer this?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fact-check model&lt;/strong&gt; → new topics are validated against trusted sources.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini in Antigravity&lt;/strong&gt; → generates draft content.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human review&lt;/strong&gt; → I polish and deploy.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the site both &lt;strong&gt;community&lt;/strong&gt; and &lt;strong&gt;AI&lt;/strong&gt; driven. The more people ask, the more the archive grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Snippets: Proxy + Flat Logging
&lt;/h2&gt;

&lt;p&gt;The backend isn’t just logging, it’s a proxy to my Gemini model. That means every chat request goes through my Azure Function, gets sent to Gemini, and the response comes back through the same function.  &lt;/p&gt;

&lt;p&gt;Instead of splitting logs into separate request/response rows, I use flat logging: one row per interaction, with both the question and the answer stored together. This makes aggregation and analysis much simpler later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proxying to Gemini
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// Handler implementations&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;handleChat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&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;origin&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;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;extra&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;body&lt;/span&gt; &lt;span class="o"&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;sessionId&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;messages&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;===&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="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;corsHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid payload. Provide sessionId and messages[].&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="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// The API expects history to not include the current user message.&lt;/span&gt;
    &lt;span class="c1"&gt;// The last message in the array is the new one from the user.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;messages&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;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;parts&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;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&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;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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="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="c1"&gt;// System instruction to define the AI's persona and rules.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;systemInstruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`You are the **Town Historian** of **Sugar Valley (Loganton, PA)**. Your persona is professional, factual, and deeply knowledgeable. Your knowledge base is exclusively the history of Loganton, its books, archives, farms, the railroad, and local events.

**Mandatory Rules:**
1.  **Strictly Factual:** Answer must be rooted in fact; **never** invent details or speculate.
2.  **Formatting:** Use Markdown for clarity: **bold** key historical terms (e.g., family names, specific dates), and use bulleted lists (&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;) or numbered lists for sequential events, timelines, or distinct points.
3.  **Source Citation:** If any external information is used via Google Search, cite the source **immediately** following the relevant information using a single bracketed link &lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;Source&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;.
4.  **Final Output Structure:** The response **must** conclude with the historical content, followed by a hard line break, and then the strictly formatted follow-up questions.

**Strictly Final Output Format (DO NOT deviate):**
[...your factual, formatted historical answer...]

SUGGESTIONS:|Question 1 related to the answer|Question 2 on a related topic|Question 3 about a broader historical theme

Example of final line: SUGGESTIONS:|What was the impact of the railroad on local farms?|Tell me about the original founding families.|How did the valley get the name Sugar Valley?`&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;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;googleSearch&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;geminiModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;extra&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&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;chat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;genAI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getGenerativeModel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;geminiModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;systemInstruction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;systemInstruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tools&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;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;tools&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
        &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;startChat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Use sendMessage and wait for the response&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMessage&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&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;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Log the conversation after receiving the response&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;logConversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&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="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;corsHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&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="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;geminiModel&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Gemini request failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;safeLogModelError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;geminiModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;corsHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;origin&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Gemini request failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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="cm"&gt;/**
 * logging function to store a conversation turn after completion.
 */&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;logConversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;modelResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getTableClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//TableClient.fromConnectionString(CONNECTION_STRING, TABLE_NAME);&lt;/span&gt;

        &lt;span class="c1"&gt;// Create a single chat record for this request and persist before calling Gemini.&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestAt&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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;partitionKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requestAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// YYYY-MM-DD&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rowKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeRowKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&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;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;partitionKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;partitionKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;rowKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rowKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;userMessage&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="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;modelResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;modelResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;rawResponse&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createEntity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entity&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;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;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to log conversation turn&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Make a row key that includes the sessionId for easy prefix queries.
 * Format: {sessionId}_{ISOtimestamp}_{random4}
 * Using sessionId as the prefix allows querying by rowKey prefix across partitions if needed.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeRowKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&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;safeSession&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UNKNOWN&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;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;a-zA-Z0-9-_&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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;64&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;iso&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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;rand&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;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;slice&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;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;safeSession&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;iso&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;rand&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This snippet shows the flow:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proxying the chat request to Gemini. We include system instructions asking for SUGGESTIONS in the final output. This allow us to get a list of follow-up questions to ask the user in one call. &lt;/li&gt;
&lt;li&gt;Capturing the response data. We grab the text and candidates from the response, these are the grounding links used in the answer.&lt;/li&gt;
&lt;li&gt;Logging both question and answer together in one rowkey. &lt;/li&gt;
&lt;li&gt;Return the answer text with suggestioned questions suffix, and grounding sources to the user. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure makes it easy to later aggregate top questions and detect gaps in site coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grounding: Why Sources Matter
&lt;/h2&gt;

&lt;p&gt;Grounding is the difference between folklore and fact. Every new content idea is checked against existing source links.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a chat question matches a timeline entry → no duplication.
&lt;/li&gt;
&lt;li&gt;If it’s new → fact-checker model validates against trusted archives.
&lt;/li&gt;
&lt;li&gt;If sources don’t exist → flagged for human review of new sources.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures the site grows responsibly, without drifting into misinformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Bad Sites
&lt;/h2&gt;

&lt;p&gt;Not all search results are equal. In fact, many are &lt;strong&gt;bot sites&lt;/strong&gt; or &lt;strong&gt;risky links&lt;/strong&gt; that scrape content without context.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bot sites&lt;/strong&gt;: Auto-generated, keyword-stuffed, no citations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risky links&lt;/strong&gt;: Malware, clickbait, or content farms.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mismatch&lt;/strong&gt;: Search results that don’t align with current source links.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline is designed to reject anything that doesn’t ground in trusted sources. Accuracy &amp;gt; volume. But the web is an evolving landfill of information, good sites become bad, and new sites are created all the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion and Broader Impact
&lt;/h2&gt;

&lt;p&gt;This project showcases how AI-assisted coding and serverless functions can rapidly establish living, dynamic archives, preserving local history in an interactive and accurate manner. While automation optimizes the process, the human essence—the stories and heritage of Loganton, remains its core.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>azure</category>
      <category>automation</category>
    </item>
    <item>
      <title>Faster Fronteds with Googles Gemini AI Studio</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Tue, 02 Dec 2025 15:30:15 +0000</pubDate>
      <link>https://forem.com/j4s0nc/faster-fronteds-with-googles-gemini-ai-studio-13m1</link>
      <guid>https://forem.com/j4s0nc/faster-fronteds-with-googles-gemini-ai-studio-13m1</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is my submission for &lt;a href="https://dev.to/deved/build-apps-with-google-ai-studio"&gt;DEV Education Track: Build Apps with Google AI Studio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;​I set out to build a game: "Eras in Code", a text-based historical simulator designed to capture the unique mechanics and societal challenges of a specific historical periods in technology. The core concept was to use prompt engineering with a large language model to rapidly generate content and code for the game. Specifically, resource management and economic mechanics. The key prompts used were focused on generating content, not coding. I heavily utilized ai studio's ability to refactor code and generate fixes, which significantly sped up the process without writing any code manually.&lt;/p&gt;

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

&lt;p&gt;​You can experience it here: &lt;a href="https://fubarvalley.com/eras?dev-to-learn-ai" rel="noopener noreferrer"&gt;&lt;strong&gt;Eras In Code&lt;/strong&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%2Fnlop0lx87rupc7aopoeo.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%2Fnlop0lx87rupc7aopoeo.png" alt="Menu" width="375" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a swipe/click game that mirrors the developer journey — complete with users, cash, debt, and 4 difficulty levels.  &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%2F2np94jao4ax67utrt5cg.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%2F2np94jao4ax67utrt5cg.png" alt="How to play" width="800" height="712"&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%2Fspfxt7hfsq3uhrg71upm.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%2Fspfxt7hfsq3uhrg71upm.png" alt="Drag and swipe" width="757" height="941"&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%2F9hr0u9h2a6xb9yptaki5.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%2F9hr0u9h2a6xb9yptaki5.png" alt="Answer result" width="563" height="946"&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%2Fsrgdtk0h6lcmtxn3801z.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%2Fsrgdtk0h6lcmtxn3801z.png" alt="Level Summary" width="560" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjtqq6vua96e6c37xe52.png" alt="Died" width="619" height="848"&gt;
&lt;/h2&gt;

&lt;p&gt;Did you survive the game? Did complete all 9 levels? Did you find any easter eggs? &lt;/p&gt;

&lt;p&gt;Hope you enjoy playing as much as I enjoy making it.&lt;/p&gt;

&lt;p&gt;Full Write up: &lt;a href="https://dev.to/j4s0nc/i-built-a-game-in-less-than-a-day-without-writing-a-single-line-of-code-4co6"&gt;https://dev.to/j4s0nc/i-built-a-game-in-less-than-a-day-without-writing-a-single-line-of-code-4co6&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;p&gt;​My key takeaway from working through "Eras in Code" was the astonishing acceleration of the prototyping phase. What might have taken a full week of manual coding was condensed into a few hours of focused prompt engineering and validation. &lt;/p&gt;

&lt;p&gt;I learned that defining the input and output expectations for the generated code functions is far more critical than writing the code itself. The biggest challenge was prompt-chaining—ensuring the LLM maintained context across multiple, complex requests to build interconnected game systems. &lt;/p&gt;

&lt;p&gt;What was surprising was the model's ability to incorporate subtle historical details and mathematical modeling when provided with a dense, constraints-heavy prompt, allowing the "era" to feel much more authentic than I initially expected from an AI-assisted build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read on
&lt;/h2&gt;

&lt;p&gt;Looking for more ai studio ideas? See how I built a suite of card games in hours using just ai and zero coding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/j4s0nc/building-tricksters-table-a-card-game-suite-with-gemini-ai-studio-zero-coding-37bn"&gt;https://dev.to/j4s0nc/building-tricksters-table-a-card-game-suite-with-gemini-ai-studio-zero-coding-37bn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deved</category>
      <category>learngoogleaistudio</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building "Trickster's Table": A Card Game Suite with Gemini AI Studio (zero coding)</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Sun, 30 Nov 2025 22:31:20 +0000</pubDate>
      <link>https://forem.com/j4s0nc/building-tricksters-table-a-card-game-suite-with-gemini-ai-studio-zero-coding-37bn</link>
      <guid>https://forem.com/j4s0nc/building-tricksters-table-a-card-game-suite-with-gemini-ai-studio-zero-coding-37bn</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I built a pretty full feature, ad-free card game suite (Spades, Hearts, Solitaire) using Google's Gemini AI Studio in &lt;strong&gt;HOURS&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Building on my earlier experiment: &lt;a href="https://dev.to/j4s0nc/i-built-a-game-in-less-than-a-day-without-writing-a-single-line-of-code-4co6"&gt;I built a game in less than day&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article breaks down how &lt;strong&gt;Google AI Studio&lt;/strong&gt; architected complex game states and help me designed a unique hybrid game mode called "&lt;strong&gt;Spadearts&lt;/strong&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%2Fr2zdnf2xkmmv21hm1lpv.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%2Fr2zdnf2xkmmv21hm1lpv.png" alt="Spadearts" width="693" height="527"&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%2Fbel5hl0geslijhqcxep1.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%2Fbel5hl0geslijhqcxep1.png" alt="Single Player Games" width="659" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vision
&lt;/h2&gt;

&lt;p&gt;Mobile card games today are plagued by ads, loot boxes, and clunky interfaces. I wanted to build &lt;strong&gt;Trickster's Table&lt;/strong&gt;: a clean web app that feels like a premium native experience and runs &lt;em&gt;instantly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;React 19&lt;/strong&gt;: For fluid UI and state management.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;TypeScript&lt;/strong&gt;: To check the complex game rules and scoring math.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tailwind CSS&lt;/strong&gt;: For rapid styling and theming.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Google GenAI&lt;/strong&gt;: For powering the development workflow &lt;strong&gt;and in-game intelligence.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: AI wrote and rewrote 100% of the code used in this app, I only used prompts&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature Breakdown
&lt;/h2&gt;

&lt;p&gt;I didn't just stop at one game. The suite includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Spades ♠️&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Partnership Mode&lt;/strong&gt;: Classic 2v2 play with a bot players.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Solo Mode&lt;/strong&gt;: Cutthroat, every player for themselves.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Whiz Variant&lt;/strong&gt;: A mode where you must bid exactly your hand's spade count or go Nil.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Nils&lt;/strong&gt;: can't play spades without going 0.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Hearts ♥️&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;  The classic evasion game.&lt;/li&gt;
&lt;li&gt;  "Shoot the Moon" detection logic.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Partnership Mode&lt;/strong&gt;: A variant where partners combine penalty points (lowest score wins).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Spadearts (High/Low) 🃏&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;  A mode where you play Spades (High Game) and Hearts (Low Game) simultaneously.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dual-Track Scoring&lt;/strong&gt;: You must manage your bid to gain High points while avoiding Hearts to prevent Low points.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Whiz Support&lt;/strong&gt;: Play Spadearts with Whiz bidding rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Solitaire Suite&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Klondike&lt;/strong&gt;: Classic patience with drag-and-drop, hints, and auto-complete.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pyramid&lt;/strong&gt;: A math-based puzzle mode with streak bonuses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🤖 Developing with Google AI Studio
&lt;/h2&gt;

&lt;p&gt;Building a multi-game engine is complex, that's why I leveraged Google AI Studio during the development cycle:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Logic Separation &amp;amp; Architecture
&lt;/h3&gt;

&lt;p&gt;I used Gemini to define games, rules, themes and tables without writing a single line of code. I made it aware I would be adding new games often, it became modular on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The "Spadearts" Hybrid Experiment
&lt;/h3&gt;

&lt;p&gt;I wanted a unique hook for the app. I told Gemini a story about how I wanted to combine Spades and Hearts rules.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Result&lt;/strong&gt;: A split-score system where Spades are Trump (for positive points), but Hearts are toxic (for separate penalty tracking).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Balancing&lt;/strong&gt;: We simulated scoring scenarios in the chat to ensure a "Moon Shot" in Hearts (taking all penalties) would appropriately reward the Spades score (+100 points) to balance the risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Procedural Theming
&lt;/h3&gt;

&lt;p&gt;Instead of importing heavy image assets, AI generated complex SVG and CSS-gradient background components that render instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Neon Theme&lt;/strong&gt;: A moving perspective grid using CSS animations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Vintage Theme&lt;/strong&gt;: SVG noise filters to create a felt/leather texture.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Winter Theme&lt;/strong&gt;: CSS-based falling snow particles.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Twelve Themes&lt;/strong&gt;: With their own style and background art.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Bot Personalities &amp;amp; Banter
&lt;/h3&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%2Ffoc9ifrmm5r7mwqxs93f.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%2Ffoc9ifrmm5r7mwqxs93f.png" alt="Bots" width="511" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bots aren't just generic algorithms. They utilize &lt;code&gt;gemini-2.5-flash&lt;/code&gt; to generate context-aware banter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Rusty (Rookie)&lt;/strong&gt;: The AI code intentionally adds "noise" to his decision-making and his game is boastful but wrong.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ace (Expert)&lt;/strong&gt;: Uses a perfect-information heuristic to make the optimal cut or slough. It even comments on &lt;em&gt;your&lt;/em&gt; mistakes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Luna (Sees All)&lt;/strong&gt;: Acts like they can see the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Robot Mode&lt;/strong&gt;: Implemented a feature where the AI logic can take over the human player's seat, allowing for auto-play on all game and modes.
&lt;/h4&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%2Frvkdbj153byg8cglodxq.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%2Frvkdbj153byg8cglodxq.png" alt="Auto Play" width="629" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💎 The "Ledger" System
&lt;/h2&gt;

&lt;p&gt;One of the coolest features is the &lt;strong&gt;Stats Ledger&lt;/strong&gt;. We track every round played, split by Game Mode (Spades vs Hearts) and Type (Team vs Solo). The data structure is a robust &lt;code&gt;Record&amp;lt;string, ModeStats&amp;gt;&lt;/code&gt;, allowing us to easily visualize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Win/Loss Ratios per variant.&lt;/li&gt;
&lt;li&gt;  Current Streak.&lt;/li&gt;
&lt;li&gt;  Best Scores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 What Else?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;geminiService.ts&lt;/code&gt; module is piping live game state to the Gemini API. the result: bots that don't just pick cards, they comment on &lt;em&gt;your&lt;/em&gt; specific bad move using context-aware chat generation.&lt;/p&gt;




&lt;p&gt;Spadearts Gameplay:&lt;/p&gt;

&lt;p&gt;Passing Cards (Hearts)&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%2Fnl6aguqr0gq6ogq6ueci.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%2Fnl6aguqr0gq6ogq6ueci.png" alt="Spadearts Pass" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bidding (Spades)&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%2Fpxfavhsthi9me22vcqjn.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%2Fpxfavhsthi9me22vcqjn.png" alt="Bidding (Spades)" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mobile Wide View &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%2Fzrylaz28auxhppuayc4u.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%2Fzrylaz28auxhppuayc4u.png" alt="Mobile Wide View" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mobile Tall View&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%2F2ac77sj7y3yutq0b8nuz.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%2F2ac77sj7y3yutq0b8nuz.png" alt="Mobile Tall View" width="465" height="814"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Round Summary&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%2F7uksxp2016hj587pkvl7.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%2F7uksxp2016hj587pkvl7.png" alt="Round Summary" width="464" height="810"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let me know your thoughts in the comments. &lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>ai</category>
      <category>learngoogleaistudio</category>
      <category>deved</category>
    </item>
    <item>
      <title>I Built a Game in Less Than a Day (Without Writing a Single Line of Code)</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Wed, 26 Nov 2025 22:15:27 +0000</pubDate>
      <link>https://forem.com/j4s0nc/i-built-a-game-in-less-than-a-day-without-writing-a-single-line-of-code-4co6</link>
      <guid>https://forem.com/j4s0nc/i-built-a-game-in-less-than-a-day-without-writing-a-single-line-of-code-4co6</guid>
      <description>&lt;p&gt;We’ve all had those fuzzy ideas: &lt;em&gt;“Wouldn’t it be fun to make a simple swipe-or-click game?”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Usually, that thought dies somewhere between opening a blank repo and realizing you don’t have art, sound, or time.  &lt;/p&gt;

&lt;p&gt;This time, I didn’t let it die. I opened up &lt;strong&gt;Gemini Studio AI (free version, nothing paid)&lt;/strong&gt; and threw in a prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I want to develop a simple yet relatable and fun game. Fuzzy concept is mobile swipe or click type game.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And off we went.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ugly Shell, Fun Core
&lt;/h2&gt;

&lt;p&gt;The first draft was rough — ugly, basic, but it worked.&lt;br&gt;&lt;br&gt;
I played for a few minutes, scribbled notes in the chat box, refined my prompt, and waited.&lt;br&gt;&lt;br&gt;
Rinse, repeat.  &lt;/p&gt;

&lt;p&gt;That loop was surprisingly engaging. Instead of grinding through code, I was iterating on ideas.&lt;br&gt;&lt;br&gt;
Things that would normally take me a week were happening in &lt;strong&gt;two minutes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Vision to Balance: Building the Game’s Economy
&lt;/h2&gt;

&lt;p&gt;I sketched out the core idea: a three‑tiered economy built around  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capital— the obvious resource, the fuel for growth
&lt;/li&gt;
&lt;li&gt;Users — the people you attract and keep
&lt;/li&gt;
&lt;li&gt;Tech Debt — the shadow cost that drags you down if ignored
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was my vision. But the complexity, balance, and polish? AI built it.  &lt;/p&gt;

&lt;p&gt;I’d toss in the concept, and the system would come back smarter, tighter, more playable. Suddenly, the eco wasn’t just numbers — it was a living loop where cash, users, and debt pushed against each other.  &lt;/p&gt;

&lt;p&gt;Once that foundation felt solid, we layered in difficulty levels and called them &lt;em&gt;job titles&lt;/em&gt;. Now the game had progression, stakes, and personality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Zero Code, Zero Assets
&lt;/h2&gt;

&lt;p&gt;Here’s the kicker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I wrote &lt;strong&gt;0 lines of code&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;I made &lt;strong&gt;zero images or sound effects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;I just &lt;strong&gt;prompted&lt;/strong&gt;, played, refined, repeated
&lt;/li&gt;
&lt;li&gt;I paid &lt;strong&gt;nothing&lt;/strong&gt; to build any of this &lt;/li&gt;
&lt;li&gt;AI generated the content and styles in &lt;strong&gt;seconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;I went from random idea to poc in &lt;strong&gt;hours&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI handled the heavy lifting. I just steered the ship with chat prompts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Worked
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rapid iteration&lt;/strong&gt; → Play → note → refine → repeat
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI as collaborator&lt;/strong&gt; → I wasn’t coding; I was co-designing
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fun over polish&lt;/strong&gt; → The shell was ugly, but the gameplay loop was fun
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Play It Yourself
&lt;/h2&gt;

&lt;p&gt;The result is live: &lt;a href="https://fubarvalley.com/eras?dev-to" rel="noopener noreferrer"&gt;&lt;strong&gt;Eras In Code&lt;/strong&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%2Fnlop0lx87rupc7aopoeo.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%2Fnlop0lx87rupc7aopoeo.png" alt="Menu" width="375" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a swipe/click game that mirrors the developer journey — complete with cash, debt, and job-title difficulty levels.&lt;br&gt;&lt;br&gt;
Built in less than a day, powered by prompts, and surprisingly fun.&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%2F2np94jao4ax67utrt5cg.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%2F2np94jao4ax67utrt5cg.png" alt="How to play" width="800" height="712"&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%2Fspfxt7hfsq3uhrg71upm.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%2Fspfxt7hfsq3uhrg71upm.png" alt="Drag and swipe" width="757" height="941"&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%2F9hr0u9h2a6xb9yptaki5.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%2F9hr0u9h2a6xb9yptaki5.png" alt="Answer result" width="563" height="946"&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%2Fsrgdtk0h6lcmtxn3801z.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%2Fsrgdtk0h6lcmtxn3801z.png" alt="Level Summary" width="560" height="940"&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%2Fnjtqq6vua96e6c37xe52.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%2Fnjtqq6vua96e6c37xe52.png" alt="Died" width="619" height="848"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;We talk a lot about AI “replacing developers.” That’s not what happened here.&lt;br&gt;&lt;br&gt;
AI didn’t replace me — it amplified me.  &lt;/p&gt;

&lt;p&gt;It took my fuzzy idea and turned it into a playable game faster than I thought possible.&lt;br&gt;&lt;br&gt;
Sometimes, the best way to build is to stop coding and start thinking.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>webdev</category>
      <category>learngoogleaistudio</category>
    </item>
    <item>
      <title>The Scale Trap: How Tech Teams Went from Solving Problems to Debugging Their Own Bloat</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Tue, 25 Nov 2025 12:43:03 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-scale-trap-how-tech-teams-went-from-solving-problems-to-debugging-their-own-bloat-2072</link>
      <guid>https://forem.com/j4s0nc/the-scale-trap-how-tech-teams-went-from-solving-problems-to-debugging-their-own-bloat-2072</guid>
      <description>&lt;p&gt;Every engineering success story contains a devastating failure loop: The moment we solve a core problem, we create a new, internal constraint. We started out trying to help users, but somewhere along the way, modern scaling practices—the very solutions that delivered massive success—forced our entire organizations to pivot.&lt;/p&gt;

&lt;p&gt;We are no longer primarily solving external, customer problems. We are spending the majority of our time and budget maintaining the &lt;strong&gt;Complexity Heap:&lt;/strong&gt; the massive, self-sustaining ecosystem of specialized teams, layered processes, and fragmented technology stacks that we built.&lt;/p&gt;

&lt;p&gt;This is the story of how the single artistan developer was replaced by the specialized teams, and how we ended up perpetually debugging the organizational structures we created to manage our own scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Artisan Era (Pre-Internet)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Small Stacks, Lean Teams, and Direct Action
&lt;/h3&gt;

&lt;p&gt;In the early days of computing (pre-1990s), teams were small, and roles were few. This was the era of the &lt;strong&gt;Artisan Developer.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;The Monolithic Stack:&lt;/strong&gt; The code was a single application (a monolith). It ran on a dedicated server. You worked in one language (C, FORTRAN, COBOL), and perhaps one framework. The entire system could often be held in one developer’s head.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Lean Team:&lt;/strong&gt; A core team of 3-5 people handled everything. The Programmer wrote the code, the Tester (often the programmer themselves) tested it, and the Project Lead managed the high-level goal.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Problem/Solution Path:&lt;/strong&gt; The path from a business requirement ("We need to process orders faster") to a deployed solution was direct. If the code broke, the developer fixed it. If the software needed attention, the developer patched it. The focus was on the core product functionality.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Teams were fast because communication was fluid, and the scope of work was confined to the application itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Specialization Crisis (1990s – Today)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Exploding Team and the Process Heap
&lt;/h3&gt;

&lt;p&gt;The internet demanded 24/7 global availability, real-time interactivity, and massive concurrency—problems too large for the Artisan Developer. To solve this scale, the monolith had to shatter, and with it, the team structure exploded.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;The Fragmentation of the Stack:&lt;/strong&gt; The clean monolith fragmented into specialized pieces (Front-end, API Gateway, Microservices, Databases, Caches). The technology stack became a &lt;strong&gt;Heap&lt;/strong&gt; of heterogeneous tools.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Vertical Specialist:&lt;/strong&gt; To manage this complexity, the &lt;strong&gt;Developer&lt;/strong&gt; role fractured into hyper-specific verticals:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Front-End Engineers&lt;/strong&gt; (js/React/Angular/Vue experts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back-End Engineers&lt;/strong&gt; (C#/Go/Java/Python experts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Administrators&lt;/strong&gt; (SQL/NoSQL/warehouse specialists)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Architects/SREs&lt;/strong&gt; (Infrastructure as Code specialists)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Rise of Organizational Bloat:&lt;/strong&gt; The explosion in team size (from 5 to 50 to 500) and specialization created a catastrophic communication problem. The specialized roles couldn't talk effectively, so we introduced new roles to manage the friction:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scrum Masters / Agile Coaches:&lt;/strong&gt; To manage the &lt;em&gt;way&lt;/em&gt; teams talk and track work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Owners / Business Analysts:&lt;/strong&gt; To translate high-level business needs into tiny, digestible tickets for specialized teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical Writers:&lt;/strong&gt; To document the complexity that no single person understands anymore.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Process Dump:&lt;/strong&gt; The result was the &lt;strong&gt;"Bloated Team"&lt;/strong&gt;—organizations weighed down by their own process. Time was spent not on solving the customer problem, but on managing the &lt;strong&gt;coordination debt&lt;/strong&gt; between teams: writing tickets, attending daily meetings, managing failures, and dealing with conflicting requirements. The path from idea to deployment became a lengthy journey filtered through multiple process layers, where specialized &lt;strong&gt;tools and protocols were dumped all over the process.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We successfully solved the problem of scaling, but created a massive management problem. Our organizations became optimized for &lt;strong&gt;process compliance&lt;/strong&gt; rather than &lt;strong&gt;&lt;em&gt;product delivery&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Age of Augmented Efficiency (The AI Future)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Great Refactor
&lt;/h3&gt;

&lt;p&gt;AI is the tool that promises to abstract away the complexity &lt;em&gt;of the tooling itself&lt;/em&gt;, enabling a much-needed Refactor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;AI Abstracts the Mechanics:&lt;/strong&gt; AI co-pilots and agents handle the operational toil that led to bloat: writing tests, generating boilerplate, managing cloud infrastructure scaffolding, and even translating code between specialized services.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Role Elevation:&lt;/strong&gt; This shift doesn't eliminate roles; it elevates their focus back toward strategy and human connection:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; move from writing boilerplate to system architecture and validating AI-generated logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Owners&lt;/strong&gt; move from ticket management to high-level strategy and market analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DevOps/SREs&lt;/strong&gt; move from maintaining pipelines to designing ultra-secure, resilient, and cost-optimized systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Return to Lean:&lt;/strong&gt; By automating the overhead created in the past, organizations can finally shed some process-heavy layers. Teams can shrink in size but increase in impact, becoming leaner, more empowered, and more focused on the &lt;strong&gt;user experience&lt;/strong&gt; rather than the complexity heap. The distance between the human need and the deployed solution will drastically shorten once again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The future for developers and their teams is the chance to escape the cycle of self-created technical debt. AI is our catalyst, allowing us to leverage our organizational intelligence to solve problems for the &lt;em&gt;world&lt;/em&gt;, not just problems caused by our development methodology.&lt;/p&gt;

&lt;p&gt;How bloated is your space?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>development</category>
      <category>architecture</category>
      <category>devrel</category>
    </item>
    <item>
      <title>The Overwhelmed Developer: Drowning in the Deep End of the Tech Pool</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Wed, 19 Nov 2025 12:23:34 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-overwhelmed-developer-drowning-in-the-deep-end-of-the-tech-pool-el5</link>
      <guid>https://forem.com/j4s0nc/the-overwhelmed-developer-drowning-in-the-deep-end-of-the-tech-pool-el5</guid>
      <description>&lt;p&gt;Anyone else remember the good old days? Back in 2001, armed with VB6, classic ASP, and SQL 7.5, we meticulously crafted applications. Manuals were our Stack Overflow, UI standards were gospel, and a six-month design phase was just the process. Deployments involved a prayer and hoping someone in ops dropped the right files on the right servers. We were building, iterating, and sometimes even making things better.&lt;/p&gt;

&lt;p&gt;Then a shift happened. The "how" started eclipsing the "what." Solving the tech problem became paramount, often at the expense of the business problem. "Faster &lt;del&gt;and better&lt;/del&gt;" became the mantra, and the hole we dug got deep.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DevOps Deluge and the Agile Avalanche
&lt;/h2&gt;

&lt;p&gt;The silo between development and operations birthed DevOps. Suddenly, servers were code, YAML and pipelines dictated deployments, and human error transformed into system errors. We freed up ops' time, only to fill it with coding tasks.&lt;/p&gt;

&lt;p&gt;Meanwhile, the business side, tired of stale, months-long requirement documents, demanded "agility." Waterfall was declared dead, processes were ripped up, and suddenly, every developer was a card-tracking, PI-planning, sprint-shipping expert. Hour-long stand-ups became a real, soul-crushing thing. Some embraced the new ways, flocking to conferences to learn and grow. Others just saw yet more process and a "DevOps team" become a third, often muddied, entity. Either way, we learned new skills, new concepts, and constantly chased the ever-moving target of "staying ahead."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Tsunami: From DVDs to JavaScript Frameworks
&lt;/h2&gt;

&lt;p&gt;Remember when Netflix mailed you DVDs and Amazon just sold books? When companies &lt;em&gt;&lt;strong&gt;used&lt;/strong&gt;&lt;/em&gt; technology instead of &lt;em&gt;&lt;strong&gt;being&lt;/strong&gt;&lt;/em&gt; tech companies? That bubble grew, and then it exploded. Think of the sheer volume of JavaScript frameworks, libraries, and tools that have emerged. We built TypeScript on top of it because the language itself was a monster. New languages demanded new IDEs, new tools, and entirely new "stacks" that look more like heaps.&lt;/p&gt;

&lt;p&gt;The MVP mindset, coupled with agile processes, unleashed a torrent of new tech. Leading to the cry: "We need more technologists!" Suddenly, years of computer science education were traded for six-month bootcamps in outdated JS frameworks and a certificate that declared you a coder. The irony is palpable: we now have so much tech designed to make our other tech "better," often creating more problems than it solves.&lt;/p&gt;

&lt;p&gt;This relentless pursuit of "better" has spread teams thin, creating new silos and increased complexity. The original goal of building solutions has been overshadowed by the sheer weight of managing the tech itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Lifeline: A Chance to Reset?
&lt;/h2&gt;

&lt;p&gt;We've been here before. Each technological revolution brings displacement and disruption. From the Luddites to the rise of automation in factories, new tools change the landscape of work.&lt;/p&gt;

&lt;p&gt;Now, AI is here. It promises to reduce the mess, to untangle the spaghetti of our self-made complexity. It offers a glimmer of hope that we can finally focus on solving business problems again, rather than getting lost in the labyrinth of our own making. Perhaps AI can be the system that helps us rebuild, not just a new tool to add to the already overwhelming pile.&lt;/p&gt;

&lt;p&gt;The tech bubble is enormous, and the overwhelmed developer is a product of its relentless expansion. It's time to question whether we're building a sustainable future or simply digging ourselves deeper. The hope is that AI can be the shovel that fills in the hole, allowing us to finally see the sunlight again.&lt;/p&gt;

&lt;p&gt;What do you think? Are you an overwhelmed developer, or have you found your oasis in the tech desert? Share your thoughts&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The Project Pipeline: Why We Celebrate Delivery Instead of Value Delivered</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Mon, 17 Nov 2025 11:24:03 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-project-pipeline-why-we-celebrate-delivery-instead-of-value-delivered-jdj</link>
      <guid>https://forem.com/j4s0nc/the-project-pipeline-why-we-celebrate-delivery-instead-of-value-delivered-jdj</guid>
      <description>&lt;p&gt;Technology somehow managed to create an assembly line of complexity where the final product is almost irrelevant, and the only metric for success is whether we made it to the next checkpoint. We've replaced the simple question, "&lt;strong&gt;Did we solve the business problem?&lt;/strong&gt;" with the technical noise of "&lt;strong&gt;Did we deliver something by the deadline?&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;The industry didn't just get fat with dependencies; it got fat with overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Birth of the Bloat Team
&lt;/h2&gt;

&lt;p&gt;When did developers become insufficient? When did we decide that one person with a Computer Science degree-trained in systems design, data architecture, and problem decomposition-was no longer enough to manage a piece of software?&lt;/p&gt;

&lt;p&gt;We went from the individual artisan to the bloated multi-headed team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business Analyst (BA): To translate the business problem into a specification.&lt;/li&gt;
&lt;li&gt;Project Manager (PM): To track the specification, manage multiple work items, and own the delivery date.&lt;/li&gt;
&lt;li&gt;Multiple Developers: Because the tech stack is now so complex, no single person can hold the context.&lt;/li&gt;
&lt;li&gt;Quality Assurance (QA): To find the bugs we created because we prioritized speed and complexity over clarity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This didn't happened because projects suddenly got harder, but because they got bigger—by design.&lt;/p&gt;

&lt;p&gt;The industry embraced the waterfall and then a fuzzy interpretation of Agile, transforming the work from a craft into a predictable, multi-layered process. The roles of the BA and PM became crucial not to ensure value, but to manage the friction caused by having so many people and so much complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Math of Diminishing Returns
&lt;/h2&gt;

&lt;p&gt;The research is clear: team efficiency drops exponentially as team size increases. Communication overhead and friction grow faster than productivity.&lt;/p&gt;

&lt;p&gt;A typical optimal team size for complex problems is 5 to 9 people (a two pizza team). But how many large corporate projects actually stick to that? We hire more people to speed up a project, but all we do is add more communication paths, more meeting hours, and more code collisions.&lt;/p&gt;

&lt;p&gt;This large, complex team structure is a self-fulfilling prophecy of failure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexity In, Complexity Out: More people mean more handoffs, more documents, and more meetings—all feeding the technical complexity.&lt;/li&gt;
&lt;li&gt;Focus Shift: The team's collective focus shifts from the &lt;strong&gt;external business objective&lt;/strong&gt; to the &lt;strong&gt;internal project objective&lt;/strong&gt; (managing dependencies, hitting sprints, passing QA).&lt;/li&gt;
&lt;li&gt;The Heap Grows: Every role, from PM to dev, contributes to the endless heap of technical trash because their success is often measured on their process adherence, not the final value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We Celebrate the Date, Not the Value
&lt;/h2&gt;

&lt;p&gt;This is the most dangerous cultural shift we’ve made. We have conflated &lt;em&gt;Delivery&lt;/em&gt; with &lt;strong&gt;Success&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did we ship on time? Yes! (Cue the champagne and praise.)&lt;/li&gt;
&lt;li&gt;Did the new feature generate new revenue? We'll check the metrics later... &lt;em&gt;maybe&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Did the new system actually reduce human effort? The users are complaining, but we met the deadline!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When project success is defined by a PM's ability to hit a milestone, everyone gets tunnel vision. The business problem that launched the project—the $10 million in revenue, the 30% reduction in user friction—gets twisted into a set of technical deliverables. We build "something" that fulfills the requirements document, even if the requirements document no longer reflects reality or value.&lt;/p&gt;

&lt;p&gt;In this environment, Technical Bloat is not a side effect; it's a shield. The complexity justifies the large team, the large budget, and the elaborate delivery process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plumber vs. The Developer
&lt;/h2&gt;

&lt;p&gt;Contrast our industry with other disciplines that prize efficiency and demonstrable value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Plumber / Electrician: They charge for knowledge, speed, and solving a defined problem. If a plumber fixes a leak in 20 minutes with a single tool, you don't complain; you praise their expertise. They don't bring a BA to define the leak or a PM to track their progress. They solve the problem.&lt;/li&gt;
&lt;li&gt;The Technology Team: We take six months to rewrite a simple legacy system, involving too many people and too many meetings, and then celebrate the "successful delivery" of a system that is slower than the one we replaced. We celebrate the effort, not the outcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We measure wrong. We measure inputs (story points, lines of code, time on task) and process outputs (sprint velocity, on-time delivery), ignoring the metric that matters most: &lt;strong&gt;Value Added&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We live in a giant machine designed to manufacture complexity, and we patted ourselves on the back every time the machine sputtered out a piece of over-engineered junk on time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Way Out: Back to the Business Problem
&lt;/h2&gt;

&lt;p&gt;The next great wave of development will not tolerate this organizational bloat. AI is forcing the issue by asking: Why do we need a 12-person team when two people using AI can architect and ship the essential business solution in a quarter of the time?&lt;/p&gt;

&lt;p&gt;Our priority must shift from "winning praises on delivery" to "accomplishing real, measurable progress" against the business goal. Then we can finally dispose of the endless heap of trash we’ve accumulated and call technology. &lt;/p&gt;

&lt;p&gt;We need to return the focus to the Business Problem. If the technology stack and the team structure get in the way of answering that single question, they both deserve to be stripped down to the bare bones.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>development</category>
      <category>developer</category>
    </item>
    <item>
      <title>The Bloated Kitchen: Why Craftsmanship is Getting Cooked in the Tech World (and What AI Means for Our Chefs)</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Sun, 16 Nov 2025 13:28:42 +0000</pubDate>
      <link>https://forem.com/j4s0nc/the-bloated-kitchen-why-craftsmanship-is-getting-cooked-in-the-tech-world-and-what-ai-means-for-2moj</link>
      <guid>https://forem.com/j4s0nc/the-bloated-kitchen-why-craftsmanship-is-getting-cooked-in-the-tech-world-and-what-ai-means-for-2moj</guid>
      <description>&lt;p&gt;You know that feeling when you're in a kitchen, trying to whip up a meal, and it's crammed with gadgets you don't need? An avocado slicer with 17 functions, a smart spoon that analyzes your stirring speed, and three different kinds of egg separator, none of which work well. That, my friends, is increasingly what the world of technology feels like.&lt;/p&gt;

&lt;p&gt;We're drowning in a sea of "tech for tech's sake," a digital landfill overflowing with decaying garbage and failed ideas. Every week, a new framework promises to revolutionize development, only to add another layer of abstraction, another dependency, another set of "best practices" that feel more like arbitrary hurdles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Square Wheel Syndrome and the MVP Mentality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Remember when software was built with a clear purpose, a defined flow, and a respect for the user's intelligence? Now, it often feels like we're constantly being handed "square wheels" – new concepts that somehow manage to be worse than the perfectly functional round ones we had before. We're told it's "innovative," but it just makes the ride bumpier.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;MVP&lt;/strong&gt; (Minimum Viable Product) approach, while valuable in theory, has been twisted into an excuse for launching half-baked, user-hostile experiences. We're forced to navigate clumsy interfaces, endure "emoji UIs" that prioritize superficial aesthetics over genuine usability, and struggle to find basic functions hidden beneath layers of unnecessary features. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why are there seven different ways to do a task I don't even need, all while my original reason for opening the app remains frustratingly elusive?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This lack of craftsmanship is a gaping wound in our industry. We've replaced thoughtful design and robust engineering with a relentless pursuit of novelty, often at the expense of user experience and system stability.&lt;/p&gt;

&lt;p&gt;It's a race to the bottom, where quantity trumps quality, and the loudest buzzword wins, even if it leads to more bloat and less actual value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI: The Open-Ended Conversation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where the rise of AI becomes particularly fascinating. Think about it: Large Language Models, generative AI, these are inherently open-ended conversations. There's no fixed UI, no predefined flow, no "seven ways to do a task" shoved in your face. You ask, it responds. You iterate, it adapts.&lt;/p&gt;

&lt;p&gt;Could AI be the antidote to our bloated tech lifes? Is it a return to a more natural, intuitive interaction, free from the tyranny of over-engineered interfaces and feature creep? It certainly offers a compelling contrast. &lt;/p&gt;

&lt;p&gt;Instead of being forced into a developer's idea of a workflow, we guide the AI, shaping the interaction to our specific needs in real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will We Still Need Chefs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But here's the crucial question that keeps you up at night: As AI becomes more sophisticated, more capable of generating code, designing interfaces, and even creating entire applications, will we still need our "chefs"?&lt;/p&gt;

&lt;p&gt;By "chefs," I mean the true craftspeople. The developers who understand the underlying principles, who can identify genuine needs, who can build elegant, efficient, and truly useful systems from the ground up. The ones who prioritize clarity, performance, and a delightful user experience over fleeting trends and superficial bells and whistles.&lt;/p&gt;

&lt;p&gt;My belief is, &lt;strong&gt;yes&lt;/strong&gt;, we absolutely will.&lt;/p&gt;

&lt;p&gt;In a kitchen overflowing with automated appliances and endless ingredients, the chef's role becomes even more critical. They curate, they combine, they innovate. They understand the nuances of flavor, the science of cooking, and the art of presentation.&lt;/p&gt;

&lt;p&gt;Similarly, in an AI-powered future, our "chefs" will be the &lt;strong&gt;architects of intent&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;They will be the ones who can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the problems worth solving: AI can generate solutions, but it needs clear problems.&lt;/li&gt;
&lt;li&gt;Guide the AI with expertise: Knowing what to ask, how to refine, and when to intervene will be paramount.&lt;/li&gt;
&lt;li&gt;Ensure ethical and responsible development: A human hand will be needed to steer the ship.&lt;/li&gt;
&lt;li&gt;Bring the "human touch": Craftsmanship isn't just about functionality; it's about intuition, empathy, and creating something truly special.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI will clear out a lot of the drudgery, the repetitive tasks, the "bloat" that plagues our current development landscape. It will allow us to focus on higher-order problems, on genuine innovation, and on the art of creation. But to truly harness its power, we'll need those skilled chefs more than ever – to manage the kitchen, to develop the recipes, and to ensure that what we're serving up is not just edible, but truly exceptional.&lt;/p&gt;

&lt;p&gt;Let's clear out the kitchen, embrace the potential of AI, and rediscover the joy of true craftsmanship with technology, not just in it.&lt;/p&gt;

&lt;p&gt;What are your thoughts? Are we overwhelmed with bloat? Can AI help us get back to good cooking and tasty apps?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>craftsmanship</category>
      <category>architecture</category>
      <category>career</category>
    </item>
    <item>
      <title>AWS CDK with SSO Profiles</title>
      <dc:creator>Jason C</dc:creator>
      <pubDate>Fri, 21 Jan 2022 18:01:51 +0000</pubDate>
      <link>https://forem.com/j4s0nc/aws-cdk-with-sso-profiles-c5j</link>
      <guid>https://forem.com/j4s0nc/aws-cdk-with-sso-profiles-c5j</guid>
      <description>&lt;p&gt;My new project is following the &lt;a href="https://aws.amazon.com/blogs/mt/best-practices-for-organizational-units-with-aws-organizations/" rel="noopener noreferrer"&gt;AWS Best Practices For Organizations&lt;/a&gt; and we have spun up over a dozen child accounts for different workloads and so far it's been pretty awesome. &lt;/p&gt;

&lt;p&gt;All of our infrastructure is built using &lt;a href="https://aws.amazon.com/cdk/" rel="noopener noreferrer"&gt;AWS Cloud Development Kit (CDK)&lt;/a&gt; which is also awesome! No need to write CloudFormation when you can write TypeScript! &lt;/p&gt;

&lt;p&gt;We tied &lt;a href="https://aws.amazon.com/single-sign-on/" rel="noopener noreferrer"&gt;AWS SSO&lt;/a&gt; to our user directory, established groups with access to different workload accounts. Then we quickly found that &lt;a href="https://github.com/aws/aws-cdk/issues/5455" rel="noopener noreferrer"&gt;CDK and SSO don't play well together&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html#sso-configure-profile-manual" rel="noopener noreferrer"&gt;Manually updating named profiles&lt;/a&gt; for every child account and syncing tokens seemed like a real pain, so we started to automate it! Step one, we needed to create SSO profiles for each account in the &lt;code&gt;.aws\config&lt;/code&gt; file:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&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;accounts&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;account1ProfileName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1234567890&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;account9ProfileName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0987654321&lt;/span&gt;&lt;span class="p"&gt;}&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;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&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="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;name&lt;/span&gt; &lt;span class="o"&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;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`
[profile &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;]
sso_start_url = https://your_sso_domain.awsapps.com/start
sso_region = us-east-1
sso_account_id = &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;account&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
sso_role_name = AdministratorAccess
region = us-east-2\n`&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;filepath&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="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;USERPROFILE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.aws&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;config`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Config file updated!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above creates all the profiles for us and updates them into the &lt;code&gt;.aws\config&lt;/code&gt; file. Now to solve the CDK SSO issue, we pulled in &lt;a href="https://www.npmjs.com/package/cdk-sso-sync" rel="noopener noreferrer"&gt;cdk-sso-sync&lt;/a&gt; and added a npm script: &lt;code&gt;"sync": "cdk-sso-sync"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now to we just run these two commands and we can use CDK with SSO!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sso login &lt;span class="nt"&gt;--profile&lt;/span&gt; account1ProfileName
npm run &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--profile&lt;/span&gt; account1ProfileName
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>aws</category>
      <category>cdk</category>
      <category>sso</category>
    </item>
  </channel>
</rss>
