<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jeff Martinez</title>
    <description>The latest articles on DEV Community by Jeff Martinez (@jakiru5).</description>
    <link>https://dev.to/jakiru5</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3689998%2F058f2f3a-4cd4-4d54-8831-3c1af7791e51.png</url>
      <title>DEV Community: Jeff Martinez</title>
      <link>https://dev.to/jakiru5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jakiru5"/>
    <language>en</language>
    <item>
      <title>Shipping Prism Organizer: How Scheduling My Own Cleanup Tool Found Three Bugs in One Afternoon</title>
      <dc:creator>Jeff Martinez</dc:creator>
      <pubDate>Tue, 18 Aug 2026 04:14:04 +0000</pubDate>
      <link>https://dev.to/jakiru5/shipping-prism-organizer-how-scheduling-my-own-cleanup-tool-found-three-bugs-in-one-afternoon-25ei</link>
      <guid>https://dev.to/jakiru5/shipping-prism-organizer-how-scheduling-my-own-cleanup-tool-found-three-bugs-in-one-afternoon-25ei</guid>
      <description>&lt;h2&gt;
  
  
  Shipping Prism Organizer: How Scheduling My Own Cleanup Tool Found Three Bugs in One Afternoon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1j1raoige44gn6jwj2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1j1raoige44gn6jwj2a.png" alt="HOOK: Laptop screen with hands typing on a dark lit room" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted one thing this week: my Downloads folder and my Creative Cloud Files desktop to clean themselves up twice a month without me touching a keyboard. Instead I spent an afternoon debugging my own CLI tool live, in production, against my own laptop — and came out the other side with three real bug fixes and something I'm finally comfortable calling done: &lt;strong&gt;Prism Organizer&lt;/strong&gt; is officially launching.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I'm open-sourcing &lt;strong&gt;Prism Organizer&lt;/strong&gt;, a portable Python CLI + TUI for scanning, sorting, deduping, and cleaning up Windows folders — dry-run by default, nothing ever hard-deleted, everything undoable.&lt;/li&gt;
&lt;li&gt;Trying to wire it into Windows Task Scheduler for my own twice-a-month cleanup surfaced three real bugs: a broken local Python install, an &lt;code&gt;argparse&lt;/code&gt; naming collision that silently misrouted a whole subcommand, and a Windows &lt;code&gt;schtasks&lt;/code&gt; quirk that only accepts one day-of-month at a time.&lt;/li&gt;
&lt;li&gt;All three are fixed and shipped as of &lt;code&gt;v1.3.2&lt;/code&gt;. The tool now genuinely runs itself, unattended, on the 1st and 15th of every month.&lt;/li&gt;
&lt;li&gt;Full source, &lt;code&gt;CONTRIBUTING.md&lt;/code&gt;, and a real &lt;code&gt;SECURITY.md&lt;/code&gt; are up on GitHub if you want to poke at it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Built This in the First Place
&lt;/h2&gt;

&lt;p&gt;Between running Syntaxure Labs, coursework at ISUFST, and SineAI Guild stuff, my Downloads folder had become a crime scene — installers next to screenshots next to half-finished PSDs next to who-knows-what &lt;code&gt;.crdownload&lt;/code&gt; files. I didn't want a one-off cleanup, I wanted something that ran itself: scan, sort into sane category folders, flag junk instead of nuking it, and let me undo anything if it got something wrong. So I built Prism Organizer — a CLI first, then a full arrow-key TUI dashboard on top, because typing &lt;code&gt;--recursive --no-interactive&lt;/code&gt; at 1am is not a personality trait I want.&lt;/p&gt;

&lt;p&gt;By this week it had scan, sort-by-type/date, three-phase duplicate detection (size → partial hash → SHA-256, plus perceptual hashing for near-duplicate images), a custom YAML rules engine, optional AI classification (OpenAI, Ollama, or LM Studio — your choice, local-first if you want it), and a watch mode. What it didn't have, in any way I'd actually tested end-to-end, was the one feature that made all of that &lt;em&gt;automatic&lt;/em&gt;: &lt;code&gt;schedule add&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug #1: The Python That Wasn't There
&lt;/h2&gt;

&lt;p&gt;First attempt at registering the schedule, &lt;code&gt;python -m prism_organizer schedule add ...&lt;/code&gt;, threw a native Windows dialog: &lt;code&gt;python314.dll was not found&lt;/code&gt;. Not a bug in my code — a half-broken Python 3.14 install shadowing a perfectly good Python 3.13 sitting one directory over. &lt;code&gt;py -0p&lt;/code&gt; showed both; &lt;code&gt;py -3.13&lt;/code&gt; fixed the immediate problem in about ten seconds. Lesson filed under "always check &lt;code&gt;where python&lt;/code&gt; before blaming your own code," and moving on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug #2: The &lt;code&gt;--command&lt;/code&gt; That Ate Itself
&lt;/h2&gt;

&lt;p&gt;The second failure was more interesting, and entirely mine. I'd typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prism-organizer schedule add &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;..&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="s2"&gt;ownloads"&lt;/span&gt; &lt;span class="nt"&gt;--command&lt;/span&gt; &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;--interval&lt;/span&gt; monthly &lt;span class="nt"&gt;--days&lt;/span&gt; 1,15 &lt;span class="nt"&gt;--at&lt;/span&gt; 09:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and got a stack trace from &lt;code&gt;cmd_sort&lt;/code&gt; — a function that shouldn't have run at all, crashing on &lt;code&gt;AttributeError: 'Namespace' object has no attribute 'by'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The root cause was an &lt;code&gt;argparse&lt;/code&gt; collision I'd shipped without noticing: my top-level subcommand parser used &lt;code&gt;dest="command"&lt;/code&gt; (so &lt;code&gt;args.command&lt;/code&gt; holds &lt;code&gt;"scan"&lt;/code&gt;, &lt;code&gt;"sort"&lt;/code&gt;, &lt;code&gt;"schedule"&lt;/code&gt;, etc.), and the &lt;code&gt;schedule add&lt;/code&gt; subparser &lt;em&gt;also&lt;/em&gt; defined a &lt;code&gt;--command&lt;/code&gt; flag for "which action should this scheduled task run" — writing to that exact same &lt;code&gt;args.command&lt;/code&gt; attribute. Parse &lt;code&gt;schedule add ... --command sort&lt;/code&gt; and the nested flag silently overwrites the top-level one. By the time &lt;code&gt;main()&lt;/code&gt; did &lt;code&gt;commands.get(args.command)&lt;/code&gt;, it was dispatching to &lt;code&gt;cmd_sort&lt;/code&gt; with a Namespace that had never seen &lt;code&gt;--by&lt;/code&gt;. Cloud-drive detection even kicked in as a side effect, since that's &lt;code&gt;cmd_sort&lt;/code&gt;'s job, not &lt;code&gt;schedule&lt;/code&gt;'s — which made the failure look far stranger than it was until I traced the actual attribute write order.&lt;/p&gt;

&lt;p&gt;The fix: give the nested flag its own &lt;code&gt;dest="run_command"&lt;/code&gt; so it stops colliding, update &lt;code&gt;cmd_schedule()&lt;/code&gt; to read that instead, and add a regression test that literally asserts &lt;code&gt;args.command == "schedule"&lt;/code&gt; after parsing &lt;code&gt;schedule add&lt;/code&gt;. [confirm exact version/commit tag for this fix — v1.3.1] This is the kind of bug that only shows up when you actually run the command end-to-end instead of unit-testing each parser branch in isolation — which is exactly why it survived undetected through the initial release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug #3: &lt;code&gt;schtasks&lt;/code&gt; Doesn't Do Lists
&lt;/h2&gt;

&lt;p&gt;With dispatch fixed, the tool correctly reached real Windows Task Scheduler — and Windows itself rejected the request: &lt;code&gt;ERROR: Invalid value for /D option.&lt;/code&gt; I'd assumed &lt;code&gt;schtasks /Create /SC MONTHLY /D 1,15&lt;/code&gt; would register a single task firing on both days, the way you might expect from cron-style day lists. It doesn't. &lt;code&gt;/D&lt;/code&gt; under &lt;code&gt;/SC MONTHLY&lt;/code&gt; accepts exactly one numeric day. I confirmed it the boring, reliable way — ran the raw command by hand with a single day first, watched it succeed, then knew exactly what to build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6ov6ns8k0li0botf4xx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6ov6ns8k0li0botf4xx.png" alt="Screenshot of error message on cli" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real fix: &lt;code&gt;TaskScheduler.add_task()&lt;/code&gt; now loops over each requested day and registers one &lt;code&gt;schtasks&lt;/code&gt; entry per day — &lt;code&gt;Prism Organizer - sort Downloads (day 1)&lt;/code&gt;, &lt;code&gt;(day 15)&lt;/code&gt; — with partial-failure handling so one bad day doesn't sink the whole batch, plus a &lt;code&gt;group_base_name()&lt;/code&gt; helper so &lt;code&gt;schedule remove&lt;/code&gt; can still treat them as one logical group instead of two mystery entries. Six new tests, full suite green at 45, shipped as &lt;code&gt;v1.3.2&lt;/code&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy4ejkbekyoza2nach6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy4ejkbekyoza2nach6d.png" alt="Screenshot of success message on cli" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;Honestly, I'd have caught bug #2 in about thirty seconds if I'd run &lt;code&gt;schedule add&lt;/code&gt; against a real Windows Task Scheduler once before calling the feature "documented and done" in the README. It's a classic trap: the individual pieces — argument parsing, task creation, task listing — all had unit coverage, but nothing exercised the actual dispatch path end-to-end with real subcommand strings. I've since made "run the exact command from the README, on a real machine, before merging" part of how I sign off on CLI features, not just an afterthought.&lt;/p&gt;

&lt;p&gt;I also went back through the rest of the codebase with the same skeptical eye while I was in there, since I was about to make this public — and found one more real issue worth fixing before launch: the AI classification feature builds a destination folder path directly from whatever category string the model returns, with no sanitization, while the AI-rename path &lt;em&gt;does&lt;/em&gt; sanitize. Same class of bug as the scheduling one, really — one code path got the careful treatment and a sibling path didn't. Fixing that now, before &lt;code&gt;v1.3.2&lt;/code&gt; becomes the version people actually pull down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Prism Organizer is MIT-licensed and up on GitHub now: &lt;strong&gt;github.com/J-Akiru5/prism-organizer&lt;/strong&gt;. &lt;code&gt;npm install -g prism-organizer&lt;/code&gt; gets you a standalone binary with zero Python setup, or clone it and &lt;code&gt;pip install -e .&lt;/code&gt; if you want to poke at the source. Dry-run is the default on every destructive command, nothing gets permanently deleted without an explicit backup folder, and &lt;code&gt;prism-organizer undo&lt;/code&gt; reverses anything that goes sideways.&lt;/p&gt;

&lt;p&gt;If you try it, or find bug #4, I'd genuinely like to hear about it — open an issue, or find me at &lt;a href="https://portfolio.jeffdev.studio" rel="noopener noreferrer"&gt;jeffdev.studio&lt;/a&gt; / Syntaxure Labs.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>softwareengineering</category>
      <category>founder</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Knowing vs. Understanding: What Two Physics Teachers Taught Me at AI Fest 2026</title>
      <dc:creator>Jeff Martinez</dc:creator>
      <pubDate>Sat, 08 Aug 2026 15:23:33 +0000</pubDate>
      <link>https://dev.to/jakiru5/knowing-vs-understanding-what-two-physics-teachers-taught-me-at-ai-fest-2026-4jj1</link>
      <guid>https://dev.to/jakiru5/knowing-vs-understanding-what-two-physics-teachers-taught-me-at-ai-fest-2026-4jj1</guid>
      <description>&lt;p&gt;"A booth conversation at AI Fest 2026 in Iloilo turned into a hard look at what it actually means to 'know' something — as a teacher, and as a developer gating five AI agents' output."&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgwqw2gtoitjetjcj8swd.jpg" alt="Booth exhibit gate at AI Fest 2026" width="799" height="533"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Booth, the Noise, and Two Teachers Who Asked the Right Question
&lt;/h2&gt;

&lt;p&gt;I spent August 3–5 at &lt;strong&gt;AI Fest 2026&lt;/strong&gt; in the Iloilo Convention Center, exhibiting under &lt;strong&gt;KWADRA TBI Cohort 5&lt;/strong&gt;, representing &lt;strong&gt;Syntaxure Labs&lt;/strong&gt;. Three days of pitching, demoing, and explaining "governance over generation" to anyone who'd stop long enough to listen.&lt;/p&gt;

&lt;p&gt;Somewhere in the noise, two women stopped by the booth. Both DOST scholars. Both physics teachers, working on their master's degrees. And — as it turned out — both building a startup of their own, called &lt;strong&gt;Dalubasa&lt;/strong&gt;, focused on early childhood literacy.&lt;/p&gt;

&lt;p&gt;They weren't there for the AI pitch. They wanted to talk about kids.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Knowing How To Doesn't Always Mean Understanding It"
&lt;/h2&gt;

&lt;p&gt;Their startup idea came out of something they kept seeing in their own classrooms: young learners can speak English fluently — but that fluency is often pure imitation. The words come out right. The grammar lands. But shift the context slightly, ask a follow-up question the kid hasn't rehearsed, and the understanding underneath isn't actually there.&lt;/p&gt;

&lt;p&gt;They put it simply, standing right there at the booth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Knowing how to doesn't always mean understanding it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Coming from two physics teachers, that line hit different. Physics is basically the discipline built around catching people who can plug numbers into a formula and get the right answer without having the faintest idea &lt;em&gt;why&lt;/em&gt; the formula works. Every physics teacher has graded that exam — a student nails F = ma on every problem set, then freezes the second you ask what force actually &lt;em&gt;means&lt;/em&gt; in a scenario they haven't memorized yet.&lt;/p&gt;

&lt;p&gt;Turns out five-year-olds learning English and physics students learning mechanics are doing the exact same move: pattern-match the surface, skip the model underneath.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcssazmmu9s1qgkzbga87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcssazmmu9s1qgkzbga87.png" alt="A parrot and a Light Bulb" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Is When I Remembered I Do This For a Living
&lt;/h2&gt;

&lt;p&gt;I build software. More specifically, these days I mostly &lt;em&gt;architect&lt;/em&gt; it — I run a multi-agent pipeline where one model scaffolds, another handles the genuinely hard parts, another does quick edits, another builds frontend UI, another reasons through tradeoffs, and I sit on top of all of it as the gating reviewer deciding what actually ships.&lt;/p&gt;

&lt;p&gt;Which means what those two teachers described isn't just a kids-learning-English problem, or a physics-101 problem. It's my problem too — just one layer up. I'm not the one typing every line anymore. I'm the one deciding whether the line that got typed is actually &lt;em&gt;right&lt;/em&gt;, and that call is only as good as how deeply I understand what's underneath it — not how fluently I can skim a diff and think "yeah, that looks fine."&lt;/p&gt;

&lt;p&gt;Fluency and understanding look identical from the outside. A kid saying a perfect English sentence looks the same whether they understand every word or none of them. A pull request that passes CI looks the same whether the person approving it understands the failure modes or is just pattern-matching "this looks like code I've seen before." The gap only shows up under pressure — a follow-up question, an edge case, a context nobody planned for.&lt;/p&gt;

&lt;p&gt;That's the expensive version of "looks right." And it's exactly the version that agent-assisted development multiplies, because now there's more fluent-looking output to gate, faster, than any one person used to have to review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3d9bidv6qshpxkimd4d2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3d9bidv6qshpxkimd4d2.png" alt="Graph showing the difference between Knowing and Understanding" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Lesson
&lt;/h2&gt;

&lt;p&gt;I don't think the answer is "understand everything, all the way down" — nobody does that, ever. I don't understand Postgres's internals well enough to rebuild them, and I use Supabase daily anyway. The physics teachers don't re-derive quantum field theory before teaching torque.&lt;/p&gt;

&lt;p&gt;The lesson is narrower than that, and more useful: &lt;strong&gt;know exactly which layer you're responsible for understanding, and don't let fluency at the layers above or below it convince you that you've got it covered.&lt;/strong&gt; For a kid learning English, that's whether they know what the words &lt;em&gt;mean&lt;/em&gt;, not just how they sound. For a physics student, it's whether they know &lt;em&gt;why&lt;/em&gt; the equation holds, not just how to rearrange it. For me, sitting on top of a handful of models producing code I didn't type — it's whether I understand the architecture and the failure modes well enough to catch it when something &lt;em&gt;fluent&lt;/em&gt; is also &lt;em&gt;wrong&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Two physics teachers reminded me of that at a booth in Iloilo, in between demos, completely by accident. Sometimes the most useful thing at a tech conference isn't the tech.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you run into your own version of this — fluent output masking a gap in real understanding, whether in code, in a classroom, or somewhere else entirely? I'd like to hear it in the comments.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>career</category>
      <category>philosophy</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built complex web apps, but missed a simple UI paradigm hiding in plain sight</title>
      <dc:creator>Jeff Martinez</dc:creator>
      <pubDate>Fri, 24 Jul 2026 15:37:00 +0000</pubDate>
      <link>https://dev.to/jakiru5/i-built-complex-web-apps-but-missed-a-simple-ui-paradigm-hiding-in-plain-sight-4af6</link>
      <guid>https://dev.to/jakiru5/i-built-complex-web-apps-but-missed-a-simple-ui-paradigm-hiding-in-plain-sight-4af6</guid>
      <description>&lt;p&gt;As a developer, it’s easy to get trapped in a hyper-focused bubble.&lt;/p&gt;

&lt;p&gt;I spend most of my days inside &lt;strong&gt;VS Code&lt;/strong&gt;, architecting web systems, writing &lt;code&gt;Next.js&lt;/code&gt; code, tuning AI development tools, and thinking heavily in terms of modular UI. Component-driven architecture—&lt;em&gt;props, state, reusability&lt;/em&gt;—is literally second nature to me. If you ask me to build a dynamic platform or structure a front-end interface from scratch, I can map out the components before I even write the first line of &lt;code&gt;JSX&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Yet somehow, I completely missed how fast everyday digital tools were evolving right under my nose.&lt;/p&gt;




&lt;p&gt;Recently, I had to jump back into quick digital editing and media creation for a few community and project graphic assets. Naturally, I opened &lt;strong&gt;Canva&lt;/strong&gt;—a tool I mostly remembered as a simple drag-and-drop graphic builder for quick posters.&lt;/p&gt;

&lt;p&gt;That was until I started poking around its newer features and realized Canva now heavily utilizes &lt;strong&gt;components, dynamic properties, and bulk-editing capabilities&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc3hbbu4rs8x60a9e4chg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc3hbbu4rs8x60a9e4chg.png" alt=" " width="800" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;The realization:&lt;/strong&gt; As developers, we get so absorbed in low-level mechanics that we overlook how consumer-level creative tools are quietly adopting the exact same component paradigms we preach in code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Canva’s components hit close to home for a Next.js dev
&lt;/h2&gt;

&lt;p&gt;When you work with &lt;code&gt;Next.js&lt;/code&gt; or &lt;code&gt;React&lt;/code&gt;, the core philosophy is &lt;strong&gt;reusability and a single source of truth&lt;/strong&gt;. You build a core component (like &lt;code&gt;&amp;lt;Card /&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;Button /&amp;gt;&lt;/code&gt;), pass different props to it, and render dynamic content cleanly across your app without repeating yourself.&lt;/p&gt;

&lt;p&gt;Seeing this paradigm inside a visual design suite was an instant &lt;em&gt;"aha!"&lt;/em&gt; moment for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Component-Based Thinking:&lt;/strong&gt; Instead of treating every slide as isolated static shapes, elements act as structured, reusable blocks. Update the core design once, and changes cascade across the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk Editing &amp;amp; Data Mapping:&lt;/strong&gt; The real mind-blower was the bulk editing efficiency. It’s essentially mapping an array of data over a visual component template—the exact same way we use &lt;code&gt;.map()&lt;/code&gt; on JSON data in React.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency Over Manual Labor:&lt;/strong&gt; As someone juggling software builds, community initiatives, and creative media, time is always a constraint. Leveraging modular logic inside a design canvas blew my workflow wide open.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrkjh34ulhfp69qp7ymw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrkjh34ulhfp69qp7ymw.png" alt=" " width="663" height="969"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer's Dilemma: Don't ignore high-level tools
&lt;/h2&gt;

&lt;p&gt;This little realization was a good humble pie for me.&lt;/p&gt;

&lt;p&gt;We sometimes fall into the trap of thinking that if a tool doesn't require a terminal, custom code, or a complex build step, it’s "too simple." But &lt;strong&gt;efficiency is efficiency&lt;/strong&gt;. Knowing &lt;em&gt;how&lt;/em&gt; systems are engineered makes you appreciate when a visual tool gets abstraction right.&lt;/p&gt;

&lt;p&gt;It reminded me that staying "tuned into technology" doesn't just mean reading documentation for the newest JavaScript framework or chasing AI models. It also means exploring how everyday software is solving workflow friction for creators.&lt;/p&gt;

&lt;p&gt;If you’re a dev who hasn't looked at visual editing suites in a while because you assumed they were just basic design tools—give them another look. You might just find the component patterns you write in your codebase already working hard in a visual editor near you.&lt;/p&gt;




&lt;h3&gt;
  
  
  💭 Let's Chat
&lt;/h3&gt;

&lt;p&gt;Have you ever had a moment where a simple visual tool surprised you with features you usually only write in code? Drop your thoughts below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building a Cyberpunk Portfolio with React, Cloud Run, and Gemini AI</title>
      <dc:creator>Jeff Martinez</dc:creator>
      <pubDate>Mon, 02 Feb 2026 06:59:31 +0000</pubDate>
      <link>https://dev.to/jakiru5/building-a-cyberpunk-portfolio-with-react-cloud-run-and-gemini-ai-433c</link>
      <guid>https://dev.to/jakiru5/building-a-cyberpunk-portfolio-with-react-cloud-run-and-gemini-ai-433c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: Breaking the Mold
&lt;/h2&gt;

&lt;p&gt;Hi, I'm Jeff. I'm a 3rd Year BSIT Student, Student Body President, and a freelance developer known as the &lt;strong&gt;"Vibe Coder."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I exist in the chaotic intersection of grinding out freelance deadlines and building "self-hosted" solutions at 3 AM. When it came time to build my portfolio, I refused to use a sterile, corporate template. I wanted to express the struggle and joy of coding through a &lt;strong&gt;Retro-Futuristic / Cyberpunk&lt;/strong&gt; lens—a love letter to the 8-bit era, rebuilt with the tech of 2025.&lt;/p&gt;

&lt;p&gt;The result is a containerized application running on &lt;strong&gt;Google Cloud Run&lt;/strong&gt;, powered by a custom &lt;strong&gt;Gemini AI&lt;/strong&gt; integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Portfolio
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://gcp.jeffdev.studio/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjeffdev.studio%2Fog-image.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://gcp.jeffdev.studio/" rel="noopener noreferrer" class="c-link"&gt;
            JeffDev Studio | Vibecoder Developer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Portfolio of Jeff Martinez - Specializing in High-Performance Web Applications, React Architecture, and 8-bit aesthetic designs.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgcp.jeffdev.studio%2Ffavicon%2Ffavicon-96x96.png" width="96" height="96"&gt;
          gcp.jeffdev.studio
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;(Note: If the embed above doesn't load, check out the live site at &lt;a href="https://gcp.jeffdev.studio" rel="noopener noreferrer"&gt;gcp.jeffdev.studio&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Quick Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Site:&lt;/strong&gt; &lt;a href="https://gcp.jeffdev.studio" rel="noopener noreferrer"&gt;gcp.jeffdev.studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/J-Akiru5/my-portfolio-react" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. The Vision: Design with a Soul
&lt;/h2&gt;

&lt;p&gt;I didn't write a single line of code until I had defined the "vibe." I spent hours in Figma mapping out an experience that felt like stepping into a futuristic arcade cabinet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Palette:&lt;/strong&gt; Electric cyan, neon green, and deep space purples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Aesthetic:&lt;/strong&gt; Pixelated fonts, glowing terminals, and nostalgic scanlines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Goal:&lt;/strong&gt; Make it feel like a game, not a resume.&lt;/p&gt;

&lt;p&gt;To ensure quality, I established strict design rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Retro-Futurism Only:&lt;/strong&gt; Every component must pass the "vibe check."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enhance, Don't Distract:&lt;/strong&gt; Animations serve the content, they don't bury it.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Inclusive Design:&lt;/strong&gt; Accessibility is non-negotiable.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. The "Antigravity" Workflow
&lt;/h2&gt;

&lt;p&gt;Building this solo meant I needed a force multiplier. I used my &lt;strong&gt;"Antigravity" workflow&lt;/strong&gt;: treating AI not as autocomplete, but as a &lt;strong&gt;Senior Pair Programmer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I didn't just prompt "make a website." I fed the AI my design rules and "laws of physics" for the UI. It helped me scaffold the architecture and solve complex CSS specificity wars for the CRT monitor effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React 19 + Vite (for speed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation:&lt;/strong&gt; GSAP + ScrollTrigger (for buttery-smooth reveals).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Firebase Firestore (Real-time data) + Auth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Google Cloud Run (Dockerized).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. The Crown Jewel: Gemini-Powered Intelligent Editor
&lt;/h2&gt;

&lt;p&gt;I hate staring at blank Markdown files. I wanted a smart writing partner built directly into my portfolio's admin panel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;User Chat → Intent Detection (Regex) → Gemini 2.5 Flash API → Diff Preview&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intent Detection &amp;amp; Diff Previews
&lt;/h3&gt;

&lt;p&gt;Using regex pattern matching and Gemini's natural language understanding, the system distinguishes between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conversational Questions:&lt;/strong&gt; ("Is this clear?") → Returns a chat reply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit Requests:&lt;/strong&gt; ("Fix the grammar") → Returns a structured code block.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When an edit is requested, I don't just apply it blindly. The system generates a &lt;strong&gt;Green/Red Diff Preview&lt;/strong&gt;, allowing me to granularly accept or reject changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Gemini 2.5 Flash?&lt;/strong&gt; It's fast, incredibly affordable, and its large context window allows it to remember the entire history of the post I'm writing.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Deploying on Google Cloud Run
&lt;/h2&gt;

&lt;p&gt;To enter the "New Year, New You" challenge, I graduated from static hosting to &lt;strong&gt;Google Cloud Run&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Docker Journey
&lt;/h3&gt;

&lt;p&gt;I built a &lt;strong&gt;multi-stage Dockerfile&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Build Stage:&lt;/strong&gt; Compiles the Vite app.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Production Stage:&lt;/strong&gt; Copies assets into a minimal Node.js image (140MB) running a lightweight Express server.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ⚠️ The Environment Variable Gotcha
&lt;/h3&gt;

&lt;p&gt;I encountered a critical bug: my Firebase keys were undefined in the production build despite being passed as Docker arguments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Vite doesn't bake environment variables into the client bundle unless explicitly told to. I had to use the &lt;code&gt;define&lt;/code&gt; option in &lt;code&gt;vite.config.js&lt;/code&gt;:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// vite.config.js
define: {
  'import.meta.env.VITE_FIREBASE_API_KEY': JSON.stringify(env.VITE_FIREBASE_API_KEY),
}
Now, my pipeline is fully automated via GitHub Actions. Every push to main builds the container and deploys to Cloud Run in under 4 minutes.

5. Performance Meets Aesthetics
A site with neon glows and scanlines shouldn't be slow.

Lighthouse Scores: 98/100 Performance, 100/100 Accessibility.

First Contentful Paint: ~0.8s.

Accessibility: Full keyboard navigation and support for prefers-reduced-motion.

Final Thoughts
This project taught me that the best way to learn is to build for yourself without compromises. The intersection of retro aesthetics and modern cloud infrastructure might seem odd, but that's the point. We need more personality in our portfolios.

Go build something that makes you smile every time you look at it.

Created for the Google AI Dev.to Challenge.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>How I Built My 8-Bit Portfolio with Claude Opus 4.5 on Antigravity</title>
      <dc:creator>Jeff Martinez</dc:creator>
      <pubDate>Sat, 17 Jan 2026 22:13:00 +0000</pubDate>
      <link>https://dev.to/jakiru5/how-i-built-my-8-bit-portfolio-with-claude-opus-45-on-antigravity-3a1j</link>
      <guid>https://dev.to/jakiru5/how-i-built-my-8-bit-portfolio-with-claude-opus-45-on-antigravity-3a1j</guid>
      <description>&lt;p&gt;Building a developer portfolio in 2025 feels different than it did just a year ago. The tools have evolved, AI has become a legitimate coding partner, and the line between "designing" and "developing" has blurred in the most exciting ways. This is the story of how I built my retro-futuristic portfolio—and how an AI assistant named Claude became my most reliable pair programmer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vision: Cyberpunk Meets Nostalgia
&lt;/h2&gt;

&lt;p&gt;My long-standing fascination with the aesthetic of old-school video games and the neon-soaked visuals of cyberpunk fiction naturally guided my vision. When rebuilding my portfolio, I aimed to create a digital experience that felt like stepping into a futuristic arcade—a place brimming with pixelated fonts, glowing terminals, and nostalgic scanlines. The challenge was to seamlessly blend all that retro charm into a modern React application.&lt;/p&gt;

&lt;p&gt;The challenge was making it more than just a gimmick. A portfolio needs to be functional first. It needs to showcase real work, be accessible, and actually help me connect with potential collaborators and employers. The 8-bit aesthetic had to enhance the experience, not get in the way of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting with Design, Not Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmy-portfolio-react-topaz-eta.vercel.app%2Fapi%2Fimage%3Fkey%3Dblog%252F1766806066469-screenshot_2025-12-24_080611.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%2Fmy-portfolio-react-topaz-eta.vercel.app%2Fapi%2Fimage%3Fkey%3Dblog%252F1766806066469-screenshot_2025-12-24_080611.png" alt="Screenshot 2025-12-24 080611.png" width="799" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before writing a single line of code, I spent time in Figma mapping out the experience. I'm a firm believer that jumping straight into code leads to endless refactoring later. Having a visual reference meant I could make design decisions without the pressure of implementation looming over me.&lt;/p&gt;

&lt;p&gt;The design process helped me establish the color palette—electric cyan, neon green, sunset orange, and deep space purples against dark backgrounds. I mapped out the sections: a dramatic hero with my name in pixelated glory, an about section that tells my story, a skills showcase with animated progress bars, projects displayed as terminal windows, and a contact form styled like a command-line interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Claude: My AI Pair Programmer
&lt;/h2&gt;

&lt;p&gt;Here's where things got interesting. I'd been experimenting with AI coding assistants, but my experience with Claude Opus 4.5—specifically through an agentic coding platform called Antigravity—was different from anything I'd tried before.&lt;/p&gt;

&lt;p&gt;Instead of treating the AI as a fancy autocomplete, I approached it as a true collaborator. I described what I wanted to build, shared my design files, and watched as Claude helped me scaffold the entire React project structure. It suggested component architecture, helped me set up GSAP animations, and even caught accessibility issues I would have missed.&lt;/p&gt;

&lt;p&gt;The magic wasn't just in code generation—it was in the back-and-forth. When something didn't look right, I could describe the problem in plain English. When I wanted to add a feature like a typing animation for my tagline, Claude didn't just write the code; it explained the approach and suggested alternatives I hadn't considered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing It to Life with Animation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmy-portfolio-react-topaz-eta.vercel.app%2Fapi%2Fimage%3Fkey%3Dblog%252F1766803479088-screenshot_2025-12-26_131716.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%2Fmy-portfolio-react-topaz-eta.vercel.app%2Fapi%2Fimage%3Fkey%3Dblog%252F1766803479088-screenshot_2025-12-26_131716.png" alt="Screenshot 2025-12-26 131716.png" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A static portfolio feels lifeless, especially one going for a retro-gaming vibe. I leaned heavily on GSAP and ScrollTrigger to create those moments of delight—the hero section with its dramatic reveal, skill bars that fill as you scroll past, project cards that float in with staggered timing.&lt;/p&gt;

&lt;p&gt;One of my favorite touches is the holographic projector in the hobbies section. Hover over a hobby category and watch the CRT monitor flicker to life with details about that interest. Small interactions like this transform a portfolio from a static resume into an experience people actually want to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Stack
&lt;/h2&gt;

&lt;p&gt;For those curious about what powers this site: it's built with React and Vite for fast development and builds. Styling is vanilla CSS with CSS variables for the theme system. Animations are handled by GSAP with ScrollTrigger for scroll-based effects. The backend uses Firebase for the contact form and any dynamic content. Everything is deployed on Vercel with automatic previews for every push.&lt;/p&gt;

&lt;p&gt;I intentionally kept the stack simple. Fancy frameworks are great, but for a personal portfolio, I wanted technology that would be easy to maintain and update years from now. React and CSS aren't going anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons from the Process
&lt;/h2&gt;

&lt;p&gt;Building this portfolio taught me a few things worth sharing. First, AI-assisted development is genuinely powerful when you treat it as collaboration rather than delegation. I still made every design decision and wrote plenty of code myself, but having an intelligent assistant to bounce ideas off accelerated the whole process.&lt;/p&gt;

&lt;p&gt;Second, constraints breed creativity. The 8-bit theme could have been limiting, but it actually made decisions easier. Every component had to pass the "does this feel retro-futuristic?" test. That focus prevented feature creep and kept the design cohesive.&lt;/p&gt;

&lt;p&gt;Third, accessibility still matters, even with a gimmicky aesthetic. The portfolio works with screen readers, respects reduced-motion preferences, and maintains proper color contrast despite all the neon. Good design is inclusive design.&lt;/p&gt;

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

&lt;p&gt;A portfolio is never truly finished—it evolves as you do. I'm already planning to add a blog section for deeper technical writing, integrate some live project demos, and continue refining the animations based on feedback.&lt;/p&gt;

&lt;p&gt;If you're thinking about building your own portfolio, my advice is simple: have fun with it. This is the one website where you get to be completely yourself. Make it weird, make it personal, make it something you're proud to share. And if you've got an AI assistant ready to help, don't be afraid to lean on it. The future of development is collaborative—even when your collaborator is a large language model.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please check out my personal portfolio &lt;a href="https://portfolio.jeffdev.studio/" rel="noopener noreferrer"&gt;https://portfolio.jeffdev.studio/&lt;/a&gt; for more info about me and blog posts&lt;/em&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>development</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
