<?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: Ehsan Pourhadi</title>
    <description>The latest articles on DEV Community by Ehsan Pourhadi (@ehsanpo).</description>
    <link>https://dev.to/ehsanpo</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%2F373399%2Fc7b8688e-8ec3-44ca-82a5-a9e656a76e8f.jpeg</url>
      <title>DEV Community: Ehsan Pourhadi</title>
      <link>https://dev.to/ehsanpo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ehsanpo"/>
    <language>en</language>
    <item>
      <title>Tech Hiring: A Generalist's Frustration</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Fri, 06 Feb 2026 19:01:58 +0000</pubDate>
      <link>https://dev.to/ehsanpo/recruiters-have-never-gotten-me-a-job-4i87</link>
      <guid>https://dev.to/ehsanpo/recruiters-have-never-gotten-me-a-job-4i87</guid>
      <description>&lt;p&gt;I just realized something: recruiters have never gotten me a job.&lt;br&gt;
Every single job I’ve had came from talking directly to the team or a manager.&lt;/p&gt;

&lt;p&gt;Recruiters are one of the worst things that happened to tech.&lt;br&gt;
They’re useless.&lt;/p&gt;

&lt;p&gt;To be clear, most recruiters are actually very nice people. The interviews often go well. I’m not nervous. I have a solid story about my work and my career, and I know how to tell it.&lt;br&gt;
And yet, nothing.&lt;/p&gt;

&lt;p&gt;I once had a recruiter tell me, &lt;em&gt;“They really liked you, but your WordPress background didn’t really fit us.”&lt;/em&gt;&lt;br&gt;
Bro, I haven’t touched WordPress in like &lt;strong&gt;eight years&lt;/strong&gt;. How is that even relevant?&lt;/p&gt;

&lt;p&gt;Another one told me, &lt;em&gt;“They really like you, but you don’t have enough leadership.”&lt;/em&gt;&lt;br&gt;
Bro, I’ve been running teams since &lt;strong&gt;2018&lt;/strong&gt;. Taking care of people. Scaling teams , Planning work for entire teams. Handling conflicts. mentoring juniors and interns, Delivering projects.&lt;br&gt;
I’m even taking a leadership course now just to get it “down on paper.”&lt;/p&gt;

&lt;p&gt;I had a recruiter from London calling on behalf of another recruiting company in Stockholm to offer me a job in Malmö, Sweden.&lt;br&gt;
Read that again. That’s not global talent acquisition, that’s a bad game of telephone.&lt;/p&gt;

&lt;p&gt;I had another one ask me, &lt;em&gt;“What do you do for sustainability?”&lt;/em&gt;&lt;br&gt;
Bro, why is that important in the &lt;strong&gt;first interview&lt;/strong&gt;?&lt;br&gt;
What a stupid question.&lt;br&gt;
I still gave a good answer. I’ve stopped using plastic for the past few years.&lt;br&gt;
But seriously, why does that matter at this stage?&lt;/p&gt;

&lt;p&gt;I had another interview at 11:30 with some recruiter. The moment I saw her, she looked tired, hungry and annoyed &lt;em&gt;before&lt;/em&gt; the interview even started. She didn’t listen to anything I said.&lt;br&gt;
She just went, &lt;em&gt;“Yeah… now can you do our stuff?”&lt;/em&gt;&lt;br&gt;
Bro. That is the worst question I’ve ever heard.&lt;br&gt;
You’re having a bad day, and now I lose a chance at a job because of it?&lt;/p&gt;

&lt;p&gt;I’ve also had interviews with AI systems.&lt;br&gt;
Three of them.&lt;br&gt;
The first one went horribly. It didn’t get me at all.&lt;br&gt;
The other two went pretty well.&lt;br&gt;
That alone should tell you something about how random this process is becoming.&lt;/p&gt;

&lt;p&gt;I also noticed recruiters constantly reschedule interviews because of “something.”&lt;br&gt;
Meetings move. Calls get delayed. Things get pushed.&lt;br&gt;
But when you miss a detail, suddenly that’s a red flag.&lt;/p&gt;

&lt;p&gt;I have a portfolio website that clearly lists every stack I’ve worked with and how many years I’ve worked with each one.&lt;br&gt;
They never look at it.&lt;br&gt;
Instead, they ask me the same questions again during the interview.&lt;br&gt;
Why did I even send the link?&lt;/p&gt;

&lt;p&gt;Recruiters spend half the interview telling a story about the company that I honestly don’t care about.&lt;br&gt;
All I care about is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the team&lt;/li&gt;
&lt;li&gt;the product&lt;/li&gt;
&lt;li&gt;how you manage people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will fix everything else inside the team.&lt;br&gt;
I will work cross-team.&lt;br&gt;
We will solve problems together.&lt;br&gt;
That’s how real work gets done.&lt;/p&gt;

&lt;p&gt;Then they ask a few technical questions they don’t even understand themselves.&lt;/p&gt;

&lt;p&gt;Recruiters cannot sell me.&lt;br&gt;
They don’t understand me, my work, or my value.&lt;/p&gt;

&lt;p&gt;So how do I even get a new job now?&lt;/p&gt;

&lt;p&gt;Last year in the UK, I applied to &lt;strong&gt;2000+ jobs&lt;/strong&gt;.&lt;br&gt;
I got &lt;strong&gt;4 first interviews with recruiters&lt;/strong&gt;. Then nothing.&lt;/p&gt;

&lt;p&gt;In Sweden and Copenhagen, I applied to &lt;strong&gt;70+ jobs&lt;/strong&gt;.&lt;br&gt;
I got &lt;strong&gt;20+ first interviews&lt;/strong&gt;. Then nothing.&lt;/p&gt;

&lt;p&gt;Now, about me.&lt;/p&gt;

&lt;p&gt;I discovered programming at &lt;strong&gt;14&lt;/strong&gt;, doing networking and linux setup, Moved to FrontPage. Then Dreamweaver with PHP/MySQL.&lt;br&gt;
Fought with Photoshop just to slice images and use them as background images.&lt;br&gt;
Worked with Flash and Fireworks.&lt;/p&gt;

&lt;p&gt;Later I moved to WordPress because everybody wanted WordPress. Then Drupal and Laravel,&lt;br&gt;
A few years of Ruby on Rails and NodeJs.&lt;br&gt;
For the last &lt;strong&gt;8 years&lt;/strong&gt;, I’ve been working with React and most of the JavaScript frameworks.&lt;br&gt;
I’m also worked with Spring Boot, playing with Java, and Electron JS to build desktop communication app that was used by 1 million users worldwide.&lt;/p&gt;

&lt;p&gt;I do, Front-end, Backend, Design, DevOps, Managing projects, people and product roadmaps.&lt;/p&gt;

&lt;p&gt;Besides coding, and certificates just to prove that I actually know my stuff, I’ve worked with different people in different situations, with different types of customers.&lt;br&gt;
Years of experience solving weird, messy, real-world problems.&lt;/p&gt;

&lt;p&gt;I’m a team player. I learned early in my career that you create far more impact as a team than as a solo hero.&lt;br&gt;
That lesson stuck.&lt;/p&gt;

&lt;p&gt;I regularly hold workshops and presentations for my team to keep everyone up to date with the latest tech. Not because it’s required. but because knowledge should move fast inside a team.&lt;/p&gt;

&lt;p&gt;I’ve worked across different industries:&lt;br&gt;
advertising, helping people in different branches, telecom for the last few years.&lt;/p&gt;

&lt;p&gt;Right now, I’m taking an AI course and a leadership course.&lt;br&gt;
I’m building applications with a Go backend and a Wails app.&lt;/p&gt;

&lt;p&gt;My favorite language? i use to say js but now I don’t have one.&lt;br&gt;
I can start a project in NestJS and move it to Go.&lt;br&gt;
Start a frontend in React and move it to Next.js or something else.&lt;br&gt;
The tool is not the point. Solving the problem is. That's what am good at! That's what i want to do!&lt;/p&gt;

&lt;p&gt;I am a &lt;strong&gt;generalist builder&lt;/strong&gt;, a &lt;strong&gt;systems thinker&lt;/strong&gt;, and a &lt;strong&gt;team-first engineer&lt;/strong&gt; in an industry that keeps trying to hire checklist-shaped humans through people who don’t understand the work. That mismatch hurts more the more senior and adaptable i become.&lt;/p&gt;

&lt;p&gt;The strange part of the universe here is that the more capable you are across time, people, and technology, the harder you are to reduce to a keyword search, and the worse recruiters become at seeing you at all.&lt;/p&gt;

&lt;p&gt;So tell me, what does that say about me? How do i get a job now?&lt;/p&gt;

</description>
      <category>whoishiring</category>
      <category>webdev</category>
      <category>career</category>
      <category>job</category>
    </item>
    <item>
      <title>UI ‘Isms’ Explained by Me Poking Buttons</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Fri, 06 Feb 2026 09:07:38 +0000</pubDate>
      <link>https://dev.to/ehsanpo/ui-isms-explained-by-me-poking-buttons-5db0</link>
      <guid>https://dev.to/ehsanpo/ui-isms-explained-by-me-poking-buttons-5db0</guid>
      <description>&lt;p&gt;Alright, this one started as a couple of bookmarks… and then somehow turned into a tiny design museum I built in my browser at 1:47am.&lt;/p&gt;

&lt;p&gt;I kept seeing these words everywhere, &lt;em&gt;glassmorphism&lt;/em&gt;, &lt;em&gt;neubrutalism&lt;/em&gt;, &lt;em&gt;claymorphism&lt;/em&gt; and my brain did that thing where it nods confidently while understanding absolutely nothing. So instead of reading another “Top UI Trends” post, I did what usually works for me:&lt;br&gt;
I opened an empty HTML file and started breaking things until the vibes made sense.&lt;/p&gt;

&lt;p&gt;Whats is this "ism" thing?&lt;br&gt;
In the context of design and art, adding "-ism" to the end of a word turns a specific technique or philosophy into a distinct movement or category. In the digital design world, new trends pop up every few years. To make them easier to discuss, designers give them a name ending in "-ism" (or "-morphism" for form/shape).&lt;/p&gt;

&lt;p&gt;This post is that experiment.&lt;br&gt;
Not definitions-from-a-podium, but &lt;em&gt;touch it, poke it, feel why it feels that way&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We’re going to build &lt;strong&gt;tiny ui element per design style&lt;/strong&gt;, tweak a couple of properties, and watch the personality change in real time.&lt;/p&gt;

&lt;p&gt;Think of it like switching CSS environments and noticing how your app’s mood changes.&lt;/p&gt;

&lt;p&gt;Design styles aren’t decorations.&lt;br&gt;
They’re &lt;strong&gt;constraint systems&lt;/strong&gt; — opinions about depth, hierarchy, feedback, and affordances.&lt;/p&gt;

&lt;p&gt;So instead of talking about styles abstractly, I built the same small UI &lt;em&gt;six times&lt;/em&gt;.&lt;br&gt;
Same intent. Same structure.&lt;br&gt;
Different rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Glassmorphism — UI as atmosphere
&lt;/h2&gt;

&lt;p&gt;Glassmorphism works when the interface feels like a &lt;em&gt;layer&lt;/em&gt;, not a surface.&lt;br&gt;
It only works if there’s something &lt;em&gt;behind&lt;/em&gt; it. Otherwise, it’s just a semi-transparent rectangle having an identity crisis.&lt;br&gt;
The moment contrast drops too far or blur gets lazy, the UI collapses into fog.&lt;/p&gt;

&lt;p&gt;The real levers here are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opacity&lt;/li&gt;
&lt;li&gt;background blur&lt;/li&gt;
&lt;li&gt;tint color&lt;/li&gt;
&lt;li&gt;stroke strength&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🧠 &lt;em&gt;Mental model&lt;/em&gt;: glassmorphism is like a variable that never quite resolves, it always depends on context.&lt;/p&gt;

&lt;p&gt;🧰 Tool to use: &lt;a href="https://hype4.academy/tools/glassmorphism-generator" rel="noopener noreferrer"&gt;https://hype4.academy/tools/glassmorphism-generator&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Neumorphism / skeuomorphism — memory as affordance
&lt;/h2&gt;

&lt;p&gt;Skeuomorphism doesn’t want you to &lt;em&gt;learn&lt;/em&gt; the interface.&lt;/p&gt;

&lt;p&gt;It wants your muscle memory from real life.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;borrowing trust&lt;/strong&gt; from physical experience.&lt;/p&gt;

&lt;p&gt;Textures. Shadows. Materials. Stuff that looks touchable even when it’s not, all doing one job:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You’ve used something like this before.”&lt;/p&gt;
&lt;/blockquote&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%2Flepnwkx4ssqq1drem3zg.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%2Flepnwkx4ssqq1drem3zg.png" alt=" " width="659" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to notice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the shadows don’t imply weight, the illusion breaks.&lt;/p&gt;

&lt;p&gt;Skeuomorphism fails quietly, it just starts feeling fake.&lt;/p&gt;

&lt;p&gt;🧠 &lt;em&gt;Mental model&lt;/em&gt;: skeuomorphism is backwards compatibility for humans.&lt;/p&gt;

&lt;p&gt;🧰 Tool to use: &lt;a href="https://neumorphism.io" rel="noopener noreferrer"&gt;https://neumorphism.io&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Neobrutalism - clarity through aggression
&lt;/h2&gt;

&lt;p&gt;Neobrutalism has no interest in being polite.&lt;/p&gt;

&lt;p&gt;Hard edges.&lt;br&gt;
Bold colors.&lt;br&gt;
Zero blur.&lt;br&gt;
Drop shadows that refuse to be subtle.&lt;/p&gt;

&lt;p&gt;The goal isn’t beauty.&lt;br&gt;
It’s &lt;strong&gt;unambiguous intent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Controls here focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shadow offset&lt;/li&gt;
&lt;li&gt;border thickness&lt;/li&gt;
&lt;li&gt;contrast&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;What to notice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Remove the shadow and everything flattens into ambiguity.&lt;/p&gt;

&lt;p&gt;Neobrutalism lives or dies by separation.&lt;/p&gt;

&lt;p&gt;🧠 &lt;em&gt;Mental model&lt;/em&gt;: neobrutalism is like skipping abstraction layers and talking straight to the hardware.&lt;/p&gt;

&lt;p&gt;🧰Tool: &lt;a href="https://www.neobrutalism.dev/" rel="noopener noreferrer"&gt;https://www.neobrutalism.dev/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Claymorphism - volume-first UI
&lt;/h2&gt;

&lt;p&gt;Claymorphism feels like neumorphism that discovered depth sliders and never looked back.&lt;/p&gt;

&lt;p&gt;Everything feels inflated.&lt;/p&gt;

&lt;p&gt;Heavy.&lt;/p&gt;

&lt;p&gt;Touchable.&lt;/p&gt;

&lt;p&gt;The best explanation I’ve found:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Inflate neumorphism until it becomes adorable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The real controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;corner radius&lt;/li&gt;
&lt;li&gt;vertical lift&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;What to notice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lower the lift too much and the UI loses authority.&lt;br&gt;
Clay needs weight to feel believable.&lt;/p&gt;

&lt;p&gt;🧠 &lt;em&gt;Mental model&lt;/em&gt;: claymorphism is depth without sharpness — like rendering UI in a softer physics engine.&lt;/p&gt;

&lt;p&gt;🧰 Tool to use: &lt;a href="https://hype4.academy/tools/claymorphism-generator" rel="noopener noreferrer"&gt;https://hype4.academy/tools/claymorphism-generator&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Minimalism - hierarchy without decoration
&lt;/h2&gt;

&lt;p&gt;Minimalism isn’t about removing things.&lt;br&gt;
It’s about removing excuses.&lt;/p&gt;

&lt;p&gt;When borders, colors, and shadows disappear,&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;spacing becomes your strongest primitive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There’s only one honest control here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;spacing&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;What to notice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If spacing becomes arbitrary, hierarchy collapses instantly.&lt;/p&gt;

&lt;p&gt;Minimalism is unforgiving, which is why it’s powerful.&lt;/p&gt;

&lt;p&gt;🧠 &lt;em&gt;Mental model&lt;/em&gt;: minimalism is aggressive refactoring of UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terminalism (I made this up my self) information over comfort
&lt;/h2&gt;

&lt;p&gt;Terminal-style UI isn’t cosplay.&lt;/p&gt;

&lt;p&gt;It’s what happens when the interface stops trying to be friendly and starts trying to be &lt;em&gt;honest&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This style assumes a few things up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user cares more about &lt;strong&gt;state&lt;/strong&gt; than aesthetics&lt;/li&gt;
&lt;li&gt;density is a feature, not a bug&lt;/li&gt;
&lt;li&gt;text &lt;em&gt;is&lt;/em&gt; the interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no depth here. No illusion of touch.&lt;/p&gt;

&lt;p&gt;Everything is explicit, linear, and slightly uncomfortable, on purpose.&lt;/p&gt;

&lt;p&gt;The constraints are brutal but clarifying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monospace typography&lt;/li&gt;
&lt;li&gt;limited color palette&lt;/li&gt;
&lt;li&gt;visible focus&lt;/li&gt;
&lt;li&gt;zero decoration that doesn’t carry meaning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When people say “this feels like a real tool”, this is usually what they mean.&lt;/p&gt;

&lt;p&gt;The only real levers you get are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;density&lt;/strong&gt; (line height + spacing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;contrast&lt;/strong&gt; (readability vs eye strain)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Push either too far and the UI becomes unusable.&lt;/p&gt;

&lt;p&gt;That tension is the whole lesson.&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%2Fslbn1z1cou8xqrvs9in0.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%2Fslbn1z1cou8xqrvs9in0.png" alt=" " width="659" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this one earns its place
&lt;/h3&gt;

&lt;p&gt;When you put this next to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;glassmorphism&lt;/li&gt;
&lt;li&gt;liquid glass&lt;/li&gt;
&lt;li&gt;claymorphism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…the contrast is almost uncomfortable.&lt;/p&gt;

&lt;p&gt;And that’s the point.&lt;/p&gt;

&lt;p&gt;This style makes something very clear, very fast:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most interfaces are just structured text wearing expensive clothes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Terminalisum strips the clothes off and asks whether the structure still holds.&lt;/p&gt;

&lt;p&gt;That’s a lesson worth keeping in the set.&lt;/p&gt;




&lt;h2&gt;
  
  
  The takeaway (this surprised me)
&lt;/h2&gt;

&lt;p&gt;Once you apply the &lt;strong&gt;same UI intent&lt;/strong&gt; to every style,&lt;/p&gt;

&lt;p&gt;something interesting happens:&lt;/p&gt;

&lt;p&gt;Some styles are generous.&lt;/p&gt;

&lt;p&gt;Others are strict.&lt;/p&gt;

&lt;p&gt;Some forgive mistakes.&lt;/p&gt;

&lt;p&gt;Others amplify them.&lt;/p&gt;

&lt;p&gt;Design systems aren’t just visual languages.&lt;/p&gt;

&lt;p&gt;They’re &lt;strong&gt;behavioral contracts&lt;/strong&gt; between your UI and your user.&lt;/p&gt;

&lt;p&gt;And once you feel that difference in your hands,&lt;/p&gt;

&lt;p&gt;no style ever feels like a vibe again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where this goes next
&lt;/h2&gt;

&lt;p&gt;This whole article could easily turn into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a single playground with a style switcher&lt;/li&gt;
&lt;li&gt;shared HTML + per-style CSS variables&lt;/li&gt;
&lt;li&gt;a repo for learning design systems by breaking them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But even as-is, the lesson sticks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Real design styles reveal themselves only when you force them to solve real UI problems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s where the truth leaks out.&lt;/p&gt;

</description>
      <category>design</category>
      <category>ui</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>New Year, New You Portfolio Challenge</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Tue, 27 Jan 2026 17:42:47 +0000</pubDate>
      <link>https://dev.to/ehsanpo/new-year-new-you-portfolio-challenge-3n51</link>
      <guid>https://dev.to/ehsanpo/new-year-new-you-portfolio-challenge-3n51</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;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I’m a full-stack developer based in Sweden who enjoys turning messy ideas into clean, scalable web applications. I like good code, thoughtful UX, and working closely with designers and product folks to build things that actually get used. Currently exploring new opportunities and looking for my next role somewhere in the EU.&lt;/p&gt;

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

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://web-111056155992.europe-west4.run.app"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




&lt;p&gt;--labels dev-tutorial=devnewyear2026&lt;/p&gt;

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

&lt;p&gt;One month. That's how long it took me to build my entire portfolio. And honestly? A lot of that time was spent undoing things, changing my mind, asking AI agents to try different approaches, and updating the same &lt;code&gt;Plan.md&lt;/code&gt; file so many times I should've just lived in it.&lt;/p&gt;

&lt;p&gt;But today? It's live. 🚀  &lt;a href="https://ehsan-pourhadi.com/" rel="noopener noreferrer"&gt;ehsan-pourhadi.com/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Let me walk you through what actually happened, what I learned, and all the weird stuff I hid in my site that nobody asked for but I built anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy: Keep It Simple, Make It Weird
&lt;/h2&gt;

&lt;p&gt;First, let me tell you what I &lt;em&gt;didn't&lt;/em&gt; change: the core idea that &lt;strong&gt;all portfolio data lives in one JSON file&lt;/strong&gt;. I kept that because it works. Separate content in MDX, separate data in JSON, build pages from both. No overthinking.&lt;/p&gt;

&lt;p&gt;But everything else? Yeah, Started with a brand new installation of Astro and keep adding stuff.&lt;/p&gt;

&lt;p&gt;The big realization was: &lt;strong&gt;nobody scrolls&lt;/strong&gt;. Like, genuinely nobody. I had this beautiful parallax effect on my about page. Total waste. I ripped it out and replaced it with a compact overview of my experience and education. Now it's scannable. Fast. Honest.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;New /work Page (The Game Changer)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This one genuinely changed how I think about portfolios.&lt;/p&gt;

&lt;p&gt;Instead of listing all portfolio items under the work menu, I created a dedicated &lt;code&gt;/work&lt;/code&gt; page that shows &lt;strong&gt;places I've worked&lt;/strong&gt;. Nice and scannable.&lt;/p&gt;

&lt;p&gt;Then when you click into &lt;code&gt;/work/{workplace}&lt;/code&gt;, &lt;em&gt;that's&lt;/em&gt; where the deep stuff lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short descriptions&lt;/strong&gt; of my responsibilities there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soft skills&lt;/strong&gt; for that role&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projects related to that workplace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team members&lt;/strong&gt; (with avatars from the &lt;strong&gt;boring-avatars&lt;/strong&gt; npm package for people I don't have photos of)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why? Because it's easier to scan. You see the company, click if you care, then you get the full context. It's not a wall of portfolio items, it's a story about &lt;em&gt;where I've been and what I did there&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Clean overview first, details only if you want them.&lt;/p&gt;

&lt;p&gt;I still keep the &lt;code&gt;/portfolio&lt;/code&gt; page too though, that's where you can see &lt;em&gt;everything&lt;/em&gt; in one place if you just want to browse all my work without the "by company" filter. Sometimes people want the complete list, so I kept that.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Better Skill Representation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I got tired of progress bars and arbitrary 1-10 numbers. Now each skill has a &lt;strong&gt;level description&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beginner 1-4&lt;/strong&gt;: I've experimented and built something basic for personal use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional 5-7&lt;/strong&gt;: I've worked with it professionally and deployed it to production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced 8-9&lt;/strong&gt;: Several years of experience, regularly working with it in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expert 10&lt;/strong&gt;: Highly confident, capable of mentoring others, comfortable making architectural decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus I added &lt;strong&gt;years&lt;/strong&gt; to each skill. So instead of looking at a radar chart and seeing meaningless numbers, you understand what I've &lt;em&gt;actually&lt;/em&gt; done with each tool. Way more useful.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Separated /products from /portfolio&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;New distinction: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/portfolio&lt;/strong&gt;: Client work and collaborative projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/products&lt;/strong&gt;: Stuff I built completely myself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because it shows the difference between "code I wrote within a team" and "full-stack projects I owned from start to finish." Both are valuable, but they're different. Now people can see both.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Search and AI Chat (Algolia Agent Studio)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I integrated &lt;strong&gt;Algolia search&lt;/strong&gt; to show I can actually work with third-party APIs. Full-text search across my entire site. But the cooler part? I built a &lt;strong&gt;chat feature using Algolia Agent Studio&lt;/strong&gt; where you can ask questions about me, my projects, my skills. It's supposed to be an AI agent that knows everything about my portfolio.&lt;/p&gt;

&lt;p&gt;Problem: Still waiting on my Beta access to go live with it. So right now it exists, it works locally, but the world can't use it yet. Classic.&lt;/p&gt;

&lt;p&gt;The lesson here? Sometimes you build cool stuff and it's not ready. That's fine.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Color Redesign: Red → Yellow/Orange&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I used red and purple as my primary colors for &lt;em&gt;years&lt;/em&gt;. Loved it. But then... every AI agents started using the same red/purple combo.&lt;/p&gt;

&lt;p&gt;Switched to &lt;strong&gt;yellow as primary, orange as secondary, blue as accent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It stands out. It's warmer. It doesn't look like every other AI tool's marketing site. The secondary color (orange-400) gets heavy use, and the blue accent adds sophistication. Much better distribution of color—80/20 rule applies even to design.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;Guestbook with Bad Word Filtering&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Remember guestbooks? That old internet vibe? Yeah, I missed it. Built one using &lt;strong&gt;Upstash Redis and Vercel Serverless&lt;/strong&gt;, with bad word filtering using npm packages.&lt;/p&gt;

&lt;p&gt;I didn't even search for the filtering packages—I just told my AI agent the problem and it threw back two options. I checked what they did, and they were &lt;em&gt;exactly&lt;/em&gt; what I needed. Felt like magic.&lt;/p&gt;

&lt;p&gt;The guestbook lets people leave messages. It filters the gross stuff. It saves to Redis. It works. And honestly? I hope people use it. It feels retro in the best way.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. &lt;strong&gt;Music Player That Actually Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Replaced the static Spotify embed with a &lt;strong&gt;custom media player&lt;/strong&gt; and &lt;strong&gt;custom audio visualization&lt;/strong&gt;. The hard part? Making it work with Astro Islands without losing the state managed in Zustand, and making sure music keeps playing when you navigate between pages.&lt;/p&gt;

&lt;p&gt;Built a &lt;code&gt;GlobalAudioPlayer&lt;/code&gt; that handles this. You start a song, navigate around, come back—it's still playing. Small detail that most sites forget about.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. &lt;strong&gt;Resume Page and Print Layout&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Updated my resume layout so if you actually print it, the header and footer disappear, the layout reformats nicely, and you get a professional-looking resume with proper page breaks.&lt;/p&gt;

&lt;p&gt;Small detail, but it matters when someone wants to download a PDF.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. &lt;strong&gt;AI Prompts Shared Publicly&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I use specific prompts for AI work, and I wanted to share them. So I created a &lt;code&gt;/prompts&lt;/code&gt; page with the prompts I actually use. They're tuned to how I work, how I write, and what I ask for.&lt;/p&gt;

&lt;p&gt;Still iterating on this because I want it to feel authentic, not like I'm selling a course.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. &lt;strong&gt;GitHub Contributions Animation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I added my GitHub contribution graph because it's a visual representation of how active I am. Yeah, it doesn't show work I did on Bitbucket or private repos, so it's incomplete, but it's still useful.&lt;/p&gt;

&lt;p&gt;Found a really cool animation idea on &lt;a href="https://www.reddit.com/r/UI_Design/comments/1qdnmd3/thoughts_on_the_heatmap_motion/" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt; and adapted it. Now my contributions have this nice animated reveal effect.&lt;/p&gt;




&lt;h3&gt;
  
  
  11. &lt;strong&gt;New /roles Page&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This one's for the future mostly, but I created a page that shows &lt;em&gt;roles I can work as&lt;/em&gt; based on my experience and skills. Not the titles I've had, but the actual work I can do.&lt;/p&gt;

&lt;p&gt;It needs more love (better storytelling, actual links), but the structure is there.&lt;/p&gt;




&lt;h3&gt;
  
  
  12. &lt;strong&gt;Testimonials with Motion Animations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Had testimonials on my LinkedIn for years. Brought them to the site with animations inspired by PrebuiltUI. They slide in, they rotate slightly, they feel alive.&lt;/p&gt;




&lt;h3&gt;
  
  
  13. &lt;strong&gt;Credits Page&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Built with help from multiple AI tools and refined by me? Gotta credit where credit's due. Added a &lt;code&gt;/credits&lt;/code&gt; page that lists all the tools, libraries, and AI assistance that went into building this.&lt;/p&gt;




&lt;h3&gt;
  
  
  14. &lt;strong&gt;Deployed to Google Cloud with Docker and Caddy&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With help from an AI agent, this took maybe 15 minutes. Created a Dockerfile, set up Caddy as the web server, pushed to Google Cloud. Done.&lt;/p&gt;

&lt;p&gt;The deployment is easy when someone walks you through it. But I actually &lt;em&gt;understand&lt;/em&gt; what's happening now, so next time I can do it myself.&lt;/p&gt;




&lt;h3&gt;
  
  
  15. &lt;strong&gt;The Floating Island (And Recraft.ai)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I wanted something next to my name on the homepage. Not a boring background, not a video. Something &lt;em&gt;weird&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I found &lt;strong&gt;Recraft.ai&lt;/strong&gt; (generative vector art from prompts) and spent time refining a prompt until I got this floating island with a machine on it and a tiny man (me) operating it. It feels like a modern metaphor for a developer using tools to generate code.&lt;/p&gt;

&lt;p&gt;Then I animated some binary (0s and 1s) floating around it. It's the kind of thing nobody needs, but when you see it? You remember it.&lt;/p&gt;




&lt;h3&gt;
  
  
  16. &lt;strong&gt;3D Cards with Mouse-Tracking Perspective&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Looked at a ton of CodePen inspiration &lt;a href="https://codepen.io/Smit29/pen/WNYmqbE" rel="noopener noreferrer"&gt;(there's this one by Smit29 that's just &lt;em&gt;chef's kiss&lt;/em&gt;)&lt;/a&gt;. Built 3D cards that follow your mouse, shift their perspective, and cast moving shadows.&lt;/p&gt;

&lt;p&gt;Nothing groundbreaking, but they feel premium. They make the site more &lt;em&gt;interactive&lt;/em&gt; without being gimmicky.&lt;/p&gt;




&lt;h3&gt;
  
  
  17. &lt;strong&gt;Easter Eggs Everywhere&lt;/strong&gt; 🥚
&lt;/h3&gt;

&lt;p&gt;I went full chaotic developer mode here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Console Easter Egg&lt;/strong&gt;: Open dev tools and you'll see messages that... let's just say they're me having fun with my own site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Game Mode&lt;/strong&gt;: There's a secret code (you can find it in the developer tools hint 👀) that unlocks a clicker game. You get points, unlock new pages, the whole thing. The long-term plan is to actually gate some portfolio items behind this, make people &lt;em&gt;earn&lt;/em&gt; seeing what I've built. But for now, it's just pure dopamine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pixel World&lt;/strong&gt;: This one's my favorite. Scroll to the bottom of the page, then keep scrolling. Ten times. Magic happens. A whole pixel art world appears—neon cats that run randomly, pixel art that follows light/dark mode. And if you click the fire ten times? Welcome to &lt;strong&gt;hell mode&lt;/strong&gt;. The aesthetic shifts. Everything burns.&lt;/p&gt;

&lt;p&gt;I worked with AI on this one using Nanobannan's AntiGravity, got some concept art, then spent a few hours in Photoshop cleaning it up and cutting it into usable pieces. That part? All me. AI got me 70% there, I finished the last 30%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Duck&lt;/strong&gt;: There's also just a tiny debug duck that lives randomly in the footer. No reason. It's there. It's cute. That's it.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Throw Everything at the Wall
&lt;/h3&gt;

&lt;p&gt;The design philosophy that worked best: try 10 ideas, see what sticks, pick the 3 that feel &lt;em&gt;right&lt;/em&gt;. Don't overthink it. The floating island was an experiment. The 3D cards were an experiment. Some experiments failed (the Neo4j graph idea was too cluttered). But the ones that worked &lt;em&gt;really&lt;/em&gt; worked.&lt;/p&gt;

&lt;h3&gt;
  
  
  80/20 on Color
&lt;/h3&gt;

&lt;p&gt;Don't use your primary and secondary colors for everything. Reserve them. Use accent colors liberally. That's what makes a design feel balanced and not overwhelming. I've been over-saturating primary color for years, this redesign fixed that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agents Need a Plan.md
&lt;/h3&gt;

&lt;p&gt;Always create a &lt;code&gt;Plan.md&lt;/code&gt; and mark things done as you go. Manually verify everything works. I updated my plan probably 50 times during this project. Sounds tedious, but it kept me sane when I was undoing an hour of work and trying a different approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Talk to Agents Like a Client
&lt;/h3&gt;

&lt;p&gt;When I didn't like what an agent produced, I stopped using my "developer brain" and started talking like a client would talk to me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Nah, I don't like this. Can we try something else?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Refactor the component architecture to use XYZ pattern..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Simpler language often gets better results. And when agents did something I liked, I'd say "good job, we're done, now refactor this to follow best practices and make it production ready." That cleanup magic is real.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Antigravity:
&lt;/h3&gt;

&lt;p&gt;Besides the chat and Agents features, I had a bit of a fight getting Prettier to behave. I ended up rolling back to an older version of the Prettier VS Code extension to make it work properly. Also, the auto-suggestions were sometimes a little too fast and occasionally interrupted my typing flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nobody Scrolls
&lt;/h3&gt;

&lt;p&gt;Seriously, rip out the long scrolling sections. People scan fast. Show them what matters in 2 seconds or they bounce. Compact, scannable layouts &amp;gt; beautiful narratives nobody reads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Header Should Only Show Important Stuff
&lt;/h3&gt;

&lt;p&gt;I removed &lt;code&gt;/services&lt;/code&gt; because I don't freelance or contract—I work as a consultant or full-time. Having a services page made no sense. Now the header is clean and purposeful.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/life page&lt;/strong&gt;: A more personal, storytelling section about my life, career journey, and actual personal experiences (not just professional achievements).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better image handling and lazy loading&lt;/strong&gt;: Current setup is good but not optimized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better content overall&lt;/strong&gt;: Video presentations for each product, better photography for portfolio items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT projects&lt;/strong&gt;: I've done Arduino and Raspberry Pi projects (temperature sensors, relay switches, auto plant watering, Pi-Hole setup) that deserve to live on the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More coherent design&lt;/strong&gt;: Everything's close, but I want it to feel even more unified and intentional.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building UI using CSS shapes</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Fri, 16 Jan 2026 08:03:30 +0000</pubDate>
      <link>https://dev.to/ehsanpo/building-ui-using-css-shapes-26b0</link>
      <guid>https://dev.to/ehsanpo/building-ui-using-css-shapes-26b0</guid>
      <description>&lt;p&gt;I'm a total sucker for that cyberpunk, high-tech, neon aesthetic. You know the vibe, angular shapes, diagonal cuts, glowing borders, the kind of UI that looks like it came straight out of a sci-fi movie. My portfolio already has that look, and honestly, getting it working on the web was harder than I expected.&lt;/p&gt;

&lt;p&gt;A few years ago I found &lt;a href="https://github.com/propjockey/augmented-ui" rel="noopener noreferrer"&gt;augmented-ui&lt;/a&gt;, which was perfect for making gaming cards and flashy components. But trying to use it for actual web content? Different story. I spent &lt;em&gt;hours&lt;/em&gt; making random stuff that looked cool but didn't work for real layouts. Eventually, I grabbed some clip-path inspiration from it, modified everything to fit an 8-point grid (percentage values were driving me nuts), and made 3-4 CSS classes that I still use in my site.&lt;/p&gt;

&lt;p&gt;It worked. It looked unique. But it was &lt;em&gt;hard&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then one day I was lurking around the internet and stumbled onto &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/basic-shape/shape" rel="noopener noreferrer"&gt;CSS Shapes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wait. This is a thing?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Figma → CSS Pipeline That Actually Worked
&lt;/h2&gt;

&lt;p&gt;I already had tons of cyberpunk UI inspiration bookmarked (&lt;a href="https://bookmark-0s4v.onrender.com/" rel="noopener noreferrer"&gt;you can see them all here&lt;/a&gt;), so I did a quick search and found this &lt;a href="https://www.figma.com/community/file/921630016386632325" rel="noopener noreferrer"&gt;Figma cyberpunk UI kit&lt;/a&gt;. Naturally, I tried copying the shapes.&lt;/p&gt;

&lt;p&gt;Except... the groups weren't flat vectors. And flattening them in Figma &lt;em&gt;changed the shapes&lt;/em&gt;. Ugh.&lt;/p&gt;

&lt;p&gt;So I tried something wild:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export the shape as SVG from Figma&lt;/li&gt;
&lt;li&gt;Flatten the SVG using &lt;a href="https://lean-svg.netlify.app/" rel="noopener noreferrer"&gt;lean-svg.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Convert it to CSS shape using &lt;a href="https://css-generators.com/svg-to-css/" rel="noopener noreferrer"&gt;css-generators.com/svg-to-css&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And OMG. It &lt;em&gt;worked&lt;/em&gt;. Like, shockingly well.&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%2Fw4cbyvbiixjvz1cni4ah.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%2Fw4cbyvbiixjvz1cni4ah.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I sat there in disbelief for a minute, then immediately started building &lt;a href="https://ehsanpo.github.io/CyberTechUI/" rel="noopener noreferrer"&gt;CyberTechUI&lt;/a&gt;, a full UI component library made entirely with CSS shapes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* A cyberpunk button shape generated from SVG */&lt;/span&gt;
&lt;span class="nc"&gt;.bu1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nl"&gt;clip-path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="m"&gt;10.53%&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;75.38%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;10.53%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;move&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;-100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;78.95%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;10.53%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;move&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;89.47%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;-10.53%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hline&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;10.53%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;75%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;-2.63%&lt;/span&gt; &lt;span class="m"&gt;-6.25%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;31.25%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="m"&gt;2.63%&lt;/span&gt; &lt;span class="m"&gt;-6.25%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vline&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;close&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;I made cards, buttons, tabs, checkboxes, everything you'd need for a complete kit. Integrated it with shadcn so you can install components with one click. The buttons alone have 7 different shape variants (bu1-bu7). Added the shapes as inline CSS in each component. It felt like magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Firefox Betrayal
&lt;/h2&gt;

&lt;p&gt;And then I tested it in Firefox.&lt;/p&gt;

&lt;p&gt;Nothing.&lt;/p&gt;

&lt;p&gt;CSS shapes. Don't. Work. In. Firefox.&lt;/p&gt;

&lt;p&gt;I sat there staring at my screen like... what? Safari supports it. Chrome supports it. Edge supports it. But Firefox? Nope. &lt;a href="https://caniuse.com/css-shapes" rel="noopener noreferrer"&gt;Can I Use&lt;/a&gt; confirmed it, Firefox has zero support for CSS Shapes.&lt;/p&gt;

&lt;p&gt;This was genuinely the first time I'd hit a feature that Safari had but Firefox didn't. Usually it's the other way around! I'd built this whole thing assuming cross-browser support was fine because MDN documented it and Chrome/Safari were good. Wrong assumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Check Can I Use &lt;em&gt;before&lt;/em&gt; you build the whole thing, not after.&lt;/p&gt;

&lt;p&gt;For now, CyberTechUI gracefully degrades in Firefox (aka: it just shows regular boxes). Not ideal, but it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tab Component Hell
&lt;/h2&gt;

&lt;p&gt;I made each component individually first, buttons, cards, inputs, all looking sharp. Then I tried putting them together into a cohesive design system.&lt;/p&gt;

&lt;p&gt;Cue: hours of tiny adjustments while i watching Youtube.&lt;/p&gt;

&lt;p&gt;The worst offender? The &lt;strong&gt;Tab component&lt;/strong&gt;. I wanted each tab to have a unique cyberpunk shape. Not just one shape for all tabs, no, I wanted &lt;em&gt;seven different shapes&lt;/em&gt; depending on the tab position and state.&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%2F809blelj7494e45fpggk.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%2F809blelj7494e45fpggk.png" alt=" " width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was absurd. I spent way too much time on it. But when it finally worked, it looked &lt;em&gt;so good&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Build the system first, components second. Or at least test how they fit together before you commit to seven different clip-paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fake Border Hack That Saved Everything
&lt;/h2&gt;

&lt;p&gt;Here's the thing about CSS shapes: borders don't play nice with &lt;code&gt;clip-path&lt;/code&gt;. The border gets clipped too, which means you lose half of it or it looks janky.&lt;/p&gt;

&lt;p&gt;I knew this from my own site. It's always been annoying.&lt;/p&gt;

&lt;p&gt;But for the checkbox component, I needed borders. The design didn't work without them.&lt;/p&gt;

&lt;p&gt;So I faked it.&lt;/p&gt;

&lt;p&gt;I tried two approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: The ::before pseudo-element&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.cyber-checkbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--primary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;clip-path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.cyber-checkbox&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;content&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="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* The "border" width */&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--background&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;clip-path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;90%&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="m"&gt;10%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt; &lt;span class="m"&gt;100%&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 main div is the "border" color. The &lt;code&gt;::before&lt;/code&gt; is slightly smaller and sits on top as the background.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2: Nested divs with calc (this is what I went with)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CLIP_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;polygon(0 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-5 h-5 bg-primary"&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clipPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CLIP_PATH&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; 
    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-[calc(100%-2px)] h-[calc(100%-2px)] bg-background"&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clipPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CLIP_PATH&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Inner content */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second approach worked &lt;em&gt;way&lt;/em&gt; better for me. More control over the border width, easier to adjust per component, and plays nicer with dynamic states (checked, focus, error).&lt;/p&gt;

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

&lt;p&gt;This started as a UI component library, but honestly, I'm just getting started. The same technique, converting vectors to CSS shapes, works for way more than buttons and cards.&lt;/p&gt;

&lt;p&gt;I'm definitely making high-tech HUDs, game interfaces, sci-fi displays. The kind of stuff you'd see in a space simulator or a cyberpunk dashboard. Now that I know the pipeline works, I can crank these out.&lt;/p&gt;

&lt;p&gt;Also, CSS aspect-ratio is a lifesaver for keeping shapes looking good across responsive layouts. Pair that with CSS shapes and you can make some genuinely wild stuff that still works on mobile.&lt;/p&gt;




&lt;p&gt;If you're into this aesthetic, &lt;a href="https://ehsanpo.github.io/CyberTechUI/" rel="noopener noreferrer"&gt;check out CyberTechUI&lt;/a&gt;. It's open source, it's weird, and it definitely doesn't work in Firefox yet.&lt;/p&gt;

&lt;p&gt;But hey, it looks cool.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>design</category>
    </item>
    <item>
      <title>The WordPress Blocks I Built in 2016 Still Work in 2026 (Just Different Syntax)</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Tue, 13 Jan 2026 15:55:51 +0000</pubDate>
      <link>https://dev.to/ehsanpo/the-wordpress-blocks-i-built-in-2015-still-work-in-2026-just-different-syntax-2ngh</link>
      <guid>https://dev.to/ehsanpo/the-wordpress-blocks-i-built-in-2015-still-work-in-2026-just-different-syntax-2ngh</guid>
      <description>&lt;p&gt;So I found myself scrolling through old GitHub repos last week (we all do it, right?), and I stumbled on &lt;strong&gt;Blockpress&lt;/strong&gt; - this WordPress thing I built like 10 years ago when I was shipping 20+ sites at an agency.&lt;/p&gt;

&lt;p&gt;It was just a collection of content blocks with ACF (Advanced Custom Fields). Hero sections, testimonials, feature grids - boring stuff, but reusable. I got tired of building the same "About Us" section for the 47th time, so I made blocks I could just drop in.&lt;/p&gt;

&lt;p&gt;Looking at it now? The structure still made sense. So I ported it to React + Shadcn. Called it &lt;a href="https://github.com/ehsanpo/atlasBlocks" rel="noopener noreferrer"&gt;AtlasBlocks&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Thing That Surprised Me
&lt;/h2&gt;

&lt;p&gt;Reading 10-year-old PHP and converting it to React was... &lt;strong&gt;weirdly easy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not because I'm some genius (definitely not), but because the patterns are basically identical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 2015 WordPress/ACF&lt;/span&gt;
&lt;span class="nf"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 2026 React&lt;/span&gt;
&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;
&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same concept. Different words.&lt;/p&gt;

&lt;p&gt;WordPress loops? → &lt;code&gt;Array.map()&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Template parts? → React components&lt;br&gt;&lt;br&gt;
ACF repeaters? → Array of objects in props&lt;/p&gt;

&lt;p&gt;The syntax evolved. The logic didn't. We're still passing data into templates and rendering stuff. 🤷‍♂️&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dumb Mistake (30 Minutes I'll Never Get Back)
&lt;/h2&gt;

&lt;p&gt;I added MCP (Model Context Protocol) support so people could install blocks with AI agents. Setup was surprisingly easy - like 1-2 hours with some Vercel functions.&lt;/p&gt;

&lt;p&gt;But then I got &lt;strong&gt;stuck for 30 minutes&lt;/strong&gt; getting 401/404 errors. I was convinced Vercel had security issues or was blocking my requests.&lt;/p&gt;

&lt;p&gt;Nope.&lt;/p&gt;

&lt;p&gt;I was posting to an &lt;strong&gt;old deploy URL&lt;/strong&gt; instead of the production URL. Copy-paste error. Changed one URL, everything worked. Classic. 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  One Tradeoff I'm Still Thinking About
&lt;/h2&gt;

&lt;p&gt;The world has &lt;strong&gt;way too many component libraries&lt;/strong&gt;. I know this. You know this.&lt;/p&gt;

&lt;p&gt;But here's the thing - I wanted blocks for &lt;em&gt;content&lt;/em&gt;, not UI components. The stuff every site needs but nobody wants to build for the 100th time. And I wanted them styled with Shadcn/Tailwind so I could actually reuse my own work.&lt;/p&gt;

&lt;p&gt;So yeah, I added another library to the pile. Is that good for the ecosystem? Probably not. Is it good for my personal DX? Definitely yes.&lt;/p&gt;

&lt;p&gt;Sometimes you build things for yourself first. 🤷&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Stuck
&lt;/h2&gt;

&lt;p&gt;Web development &lt;em&gt;looks&lt;/em&gt; different now. Modern React, Vite, Tailwind, Shadcn - it all feels shiny and new.&lt;/p&gt;

&lt;p&gt;But fundamentally? We're solving the same problems we solved a decade ago. We're just doing it with better syntax and faster tools.&lt;/p&gt;

&lt;p&gt;Your old code probably isn't as outdated as you think. The patterns age better than the syntax.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;AtlasBlocks&lt;/strong&gt; is on &lt;a href="https://github.com/ehsanpo/atlasBlocks" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; if you want to check it out. It's open source, uses Shadcn + Tailwind, and installs with MCP support.&lt;/p&gt;

&lt;p&gt;But honestly, the real takeaway for me was realizing how little has fundamentally changed in 10 years. Makes me wonder what my 2036 self will think when they port this to whatever comes after React. 🚀&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>How I Built a Music Game in One Sunday (Powered by Tea, Chaos and AI 🤣🎧🔥)</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Tue, 09 Dec 2025 15:50:54 +0000</pubDate>
      <link>https://dev.to/ehsanpo/how-i-built-a-music-game-in-one-sunday-powered-by-tea-chaos-and-ai--4b20</link>
      <guid>https://dev.to/ehsanpo/how-i-built-a-music-game-in-one-sunday-powered-by-tea-chaos-and-ai--4b20</guid>
      <description>&lt;p&gt;It all started 7:30 in the morning. Sunday. I made my breakfast, egg 🥚 in a butty and a cup ☕ of Cardemon Ahmed tea. Peak comfort. Peak genius mode. I was lurking around the internet like a bored raccoon trying to catch what’s new, scrolling, scrolling, scrolling, until my brain suddenly went "yo... build something". And of course I listen to that voice, because that voice has gotten me into some pretty fun trouble before. I wanted to code something new, something silly, something cool, something that would make me go "🤣🤣 look at this weird thing I made".&lt;/p&gt;

&lt;p&gt;And then the idea 💡 came back to me, like an old meme you forgot but still love. Ride inside my music. I have tons of unreleased tracks 😎 just sitting on my hard drive collecting dust like ancient artifacts, so why not use those. And I knew Expo and React Native already so boom, decision made. Web, Android, iOS, full cross platform madness. I also wanted tilt controls. Tilt on phone. Mouse on web. Tilt on browser mobile too because why not. Full chaos.&lt;/p&gt;

&lt;p&gt;So I opened bolt.new because they support Expo and it gives you a nice base to work with, like a boilerplate but with vibes. I asked it to help me setup the project and even in the very first step I added collision detection because I knew I was going to need it later anyway. Felt good to have that in place early instead of trying to duct tape it at the end like I usually do 😭.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🔊 Audio Analysis: Scan First, Upload Later&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The plan was very clear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyze my tracks locally&lt;/li&gt;
&lt;li&gt;Extract all the frequency bands, envelopes, beats, bpm&lt;/li&gt;
&lt;li&gt;Save that analysis into a database, So the game never analyzes audio again&lt;/li&gt;
&lt;li&gt;Instant geometry loading everywhere&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bolt.new helped me configure &lt;strong&gt;Supabase&lt;/strong&gt;. When everything was ready, I simply &lt;strong&gt;changed the database owner&lt;/strong&gt; to my own Supabase project and it migrated automatically. Honestly one of the smoothest “move to my account plz” moments I’ve ever had.&lt;/p&gt;

&lt;p&gt;Then me and my AI helper gremlins wrote a local script to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyze each track&lt;/li&gt;
&lt;li&gt;generate geometry data&lt;/li&gt;
&lt;li&gt;upload that data to Supabase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only &lt;strong&gt;after&lt;/strong&gt; the analysis finished did the script upload the actual audio files to Supabase Storage. Correct order. Everything clean and organized (for once 😭).&lt;/p&gt;

&lt;p&gt;This whole pipeline took maybe 2 hours and suddenly I had a full library of levels ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🌀 Drawing the Level: Frequency Torture Testing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next I had to use the analyzed data to actually shape the tunnel. This part took a lot of testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;some frequencies made the tunnel too chaotic&lt;/li&gt;
&lt;li&gt;some were too soft&lt;/li&gt;
&lt;li&gt;some made everything look like melted spaghetti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But bolt.new made testing super fast, push code, it rebuilds, test instantly via Expo QR or web preview. After tweaking values on different tracks, I finally found combinations I liked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bass = big movement&lt;/li&gt;
&lt;li&gt;kicks = tunnel squeeze&lt;/li&gt;
&lt;li&gt;treble = tiny flicks&lt;/li&gt;
&lt;li&gt;quiet moments = wide open space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When it started to look and feel fun, I knew I was on the right path.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🎮 Game Logic, Pages, UI, The Gameplay Skeleton&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After the tunnel felt good, I moved on to building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;main menu&lt;/li&gt;
&lt;li&gt;game screen&lt;/li&gt;
&lt;li&gt;scoring&lt;/li&gt;
&lt;li&gt;movement&lt;/li&gt;
&lt;li&gt;collision updates&lt;/li&gt;
&lt;li&gt;restart logic&lt;/li&gt;
&lt;li&gt;loading screen&lt;/li&gt;
&lt;li&gt;small UI fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually switched from bolt.new to VS Code when I needed fine control over spacing, padding, margins, and a preloader. &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🧠 Using Multi Agents in VS Code for the First Time&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This was the first time I really used &lt;strong&gt;multi-agent workflows&lt;/strong&gt; in VS Code, and honestly it clicked for me in a cool way.&lt;/p&gt;

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

&lt;p&gt;👉 One agent can “hold the context” for a task&lt;br&gt;
👉 If I needed something totally different, I could open a new agent&lt;br&gt;
👉 That way I didn’t confuse a single agent by jumping topics&lt;/p&gt;

&lt;p&gt;So I had different agents working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent 1: handling gameplay logic&lt;/li&gt;
&lt;li&gt;Agent 2: adjusting projectile speeds and physics&lt;/li&gt;
&lt;li&gt;Agent 3: fixing UI spacing&lt;/li&gt;
&lt;li&gt;Agent 4: generating helper components&lt;/li&gt;
&lt;li&gt;Agent 5: working on enemy patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It ended up feeling like I had a tiny chaotic dev team living inside my editor. Except nobody complained. And nobody asked for coffee ☕🤣&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;🎨 Getting Graphics: Enter Gemini Nanobanana 🍌✨&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Time for visuals. I can’t draw anything, so I used &lt;strong&gt;Gemini Nanobanana&lt;/strong&gt; to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;generate a color palette&lt;/li&gt;
&lt;li&gt;generate assets using that palette&lt;/li&gt;
&lt;li&gt;export everything&lt;/li&gt;
&lt;li&gt;clean up in Photoshop (crop, resize, remove backgrounds)&lt;/li&gt;
&lt;li&gt;ask VS Code agents to replace placeholder SVGs with the new PNGs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suddenly the whole game became alive. Colorful. A little too neon. Just how I like it.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  &lt;strong&gt;⚡ Adding Enemies, Powerups, Shields and Other Fun Stuff&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once the graphics looked good, it was time for more gameplay elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enemies&lt;/li&gt;
&lt;li&gt;powerups&lt;/li&gt;
&lt;li&gt;shields&lt;/li&gt;
&lt;li&gt;visual effects&lt;/li&gt;
&lt;li&gt;hit reactions&lt;/li&gt;
&lt;li&gt;tiny details everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time I thought “ok done”, my brain quietly said&lt;br&gt;
“hmmm… but what if… more stuff?”&lt;br&gt;
and then I added more stuff.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;🏆 Leaderboard Time&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since levels are endless (the music loops), I wanted high scores and user profiles.&lt;/p&gt;

&lt;p&gt;I went back to bolt.new, asked it to set up &lt;strong&gt;Supabase Auth&lt;/strong&gt;, made a few policy changes, and soon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users got auto-created&lt;/li&gt;
&lt;li&gt;they could update their display name&lt;/li&gt;
&lt;li&gt;leaderboard worked great&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the easiest setups of the whole day thanks to AI helping me config everything.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;🚀 Final Build, Deploy and Bedtime&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Once everything worked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;built the app&lt;/li&gt;
&lt;li&gt;pushed to GitHub&lt;/li&gt;
&lt;li&gt;deployed the web version on GitHub Pages&lt;/li&gt;
&lt;li&gt;tested on phone&lt;/li&gt;
&lt;li&gt;fixed small bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time I finished, it was already 22:00. I was tired, happy, a bit confused how fast the day went. I tried the game a few times in bed, smiled at my own weird creation, and fell asleep 😴&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Final thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Could I spend more time polishing? Yes.&lt;br&gt;
Fix rendering and loading issues? Sure.&lt;br&gt;
Add more ships, enemies, power-ups? Absolutely.&lt;br&gt;
Turn it into a full commercial game? Maybe one day.&lt;/p&gt;

&lt;p&gt;But for a &lt;strong&gt;single Sunday coding session&lt;/strong&gt;, this is insane.&lt;/p&gt;

&lt;p&gt;And honestly, I’m super happy with what I built. AI didn’t replace me, it amplified me. Gave me momentum. Removed boring stuff. Let me stay in “flow mode.”&lt;/p&gt;

&lt;p&gt;This Sunday was one of my most fun coding days in a long time.&lt;br&gt;
And now I can literally ride inside my own music.&lt;/p&gt;

&lt;p&gt;Life = good ❤️🎧🚀&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Roast My Portfolio</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Sun, 09 Feb 2025 14:06:40 +0000</pubDate>
      <link>https://dev.to/ehsanpo/roast-my-portfolio-10c0</link>
      <guid>https://dev.to/ehsanpo/roast-my-portfolio-10c0</guid>
      <description>&lt;p&gt;Hello everyone,&lt;br&gt;
After getting a little feedback am here with another version of my portfolio.&lt;br&gt;
All the data for portfolio is coming from 1 json file.&lt;br&gt;
Feel free to explore the website here: &lt;a href="https://ehsan-pourhadi.com/" rel="noopener noreferrer"&gt;https://ehsan-pourhadi.com/&lt;/a&gt;&lt;br&gt;
You can also check out the source code on GitHub: &lt;a href="https://github.com/ehsanpo/astro-template" rel="noopener noreferrer"&gt;https://github.com/ehsanpo/astro-template&lt;/a&gt;&lt;br&gt;
Looking forward to your feedback!&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>astro</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Roast my portfolio</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Mon, 23 Dec 2024 10:06:35 +0000</pubDate>
      <link>https://dev.to/ehsanpo/roast-my-portfolio-1ibh</link>
      <guid>https://dev.to/ehsanpo/roast-my-portfolio-1ibh</guid>
      <description>&lt;p&gt;ello everyone,&lt;/p&gt;

&lt;p&gt;I've been working on my personal portfolio website and would love to hear your thoughts and feedback! It's built using Astro.js, Tailwind CSS, and TypeScript.&lt;/p&gt;

&lt;p&gt;Feel free to explore the website here: &lt;a href="https://ehsan-pourhadi.com/" rel="noopener noreferrer"&gt;https://ehsan-pourhadi.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also check out the source code on GitHub: &lt;a href="https://github.com/ehsanpo/portfolio-astro" rel="noopener noreferrer"&gt;https://github.com/ehsanpo/portfolio-astro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking forward to your feedback!&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>astro</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My Dev Tools 2024: Streamlining Development</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Fri, 16 Aug 2024 13:36:55 +0000</pubDate>
      <link>https://dev.to/ehsanpo/my-dev-tools-2024-streamlining-development-5f0i</link>
      <guid>https://dev.to/ehsanpo/my-dev-tools-2024-streamlining-development-5f0i</guid>
      <description>&lt;p&gt;For a developer, possessing a proficient collection of tools is crucial for optimizing processes and enhancing productivity. By 2024, my toolbox comprises essential applications and configurations that I deem indispensable. Below is a summary of the tools and their respective justifications that I employ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Browsers; Firefox and Chrome
&lt;/h3&gt;

&lt;p&gt;Firefox is my preferred browser for development work because of its powerful developer tools, advanced privacy features, and compatibility with the newest web standards.&lt;/p&gt;

&lt;p&gt;Although Firefox is my preferred browser, I also use Chrome. Due to its widespread use and extensive set of development tools, Chrome continues to be essential for testing and debugging purposes.&lt;/p&gt;

&lt;p&gt;I optimize my Firefox browsing experience by utilizing a variety of essential plugins.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Empty Cache Button&lt;/strong&gt;: A simple extension to clear the cache without needing to dig into the settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Developer Tools&lt;/strong&gt;: Essential for working with React applications, providing a detailed view of component hierarchies and props.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redux DevTools&lt;/strong&gt;: Critical for debugging Redux state changes in complex applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RescueTime&lt;/strong&gt; for Firefox: Tracks time spent on various sites, helping me stay productive and focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apollo Client Devtools&lt;/strong&gt;: A must-have for developers working with GraphQL, this tool allows for deep inspection of GraphQL queries and caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FoxyProxy&lt;/strong&gt;: Simplifies proxy management, allowing easy switching between multiple proxy configurations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WAVE Evaluation Tool&lt;/strong&gt;: Useful for accessibility testing, providing visual feedback about the accessibility of web content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Agent Switcher&lt;/strong&gt;: Allows quick switching between different user-agent strings for testing purposes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Command Line Interface; Warp
&lt;/h3&gt;

&lt;p&gt;The Command Line Interface, sometimes known as CLI, is a user interface that allows users to interact with a computer program or operating system through text commands. One example of a CLI is Warp.&lt;/p&gt;

&lt;p&gt;Warp is a terminal that provides a user-friendly interface. The software is equipped with AI-powered command recommendations, block-based workflows, and a range of keyboard shortcuts, which distinguishes it as an alternative to traditional terminals.&lt;/p&gt;




&lt;h3&gt;
  
  
  IDE: Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Visual Studio Code functions as my integrated programming environment (IDE).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install  &lt;/span&gt;cask visual studio code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exploring VS Code Extensions&lt;/p&gt;

&lt;p&gt;General Development:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- actionforge.actionforge: Automate routine tasks and boost productivity.
- amodio.tsl-problem-matcher: Simplifies TypeScript linting and problem matching.
- better-ts-errors.better-ts-errors: Enhances TypeScript error messages for easier debugging.
- bradlc.vscode-tailwindcss: Tailwind CSS IntelliSense support for rapid UI development.
- christian-kohler.npm-intellisense: Autocompletes npm modules, saving time during development.
- dbaeumer.vscode-eslint: Integrates ESLint into VS Code, ensuring consistent code quality.
- esbenp.prettier-vscode: Formats code consistently across projects using Prettier.
- github.copilot: AI-powered code completion for faster and smarter coding.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Specialized Tools:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- ms-azuretools.vscode-docker: A must-have for containerized application development.
- ms-vscode-remote.remote-containers: Seamlessly connect to and develop within containers.
- vscode-icons-team.vscode-icons: Customizable icons for a visually pleasing workspace.
- yoavbls.pretty-ts-errors: Further improves the clarity of TypeScript error messages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Productivity Enhancers:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- gruntfuggly.todo-tree: Organizes TODO comments in your code.
- oderwat.indent-rainbow: Colorizes indent levels, making code structure more visible.
- silofy.hackthebox: A specialized extension for cybersecurity enthusiasts.
- vscjava.vscode-java-pack: Comprehensive tools for Java development.
- wix.vscode-import-cost: Displays the cost of importing npm packages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h3&gt;
  
  
  Additional Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Password Manager: I utilize the Keeper® Password Manager &amp;amp; Digital Vault to effectively handle and safeguard my passwords, guaranteeing that all my accounts are shielded using robust and distinct passwords.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API Testing: I utilize both Postman and Insomnia for the creation and testing of APIs. Both tools have robust capabilities for testing RESTful APIs, with Postman offering a wider range of functions and Insomnia standing out for its simplicity and superior performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web performance analysis can be effectively conducted using the remarkable tool called &lt;strong&gt;YellowLabTools&lt;/strong&gt;. The tool offers comprehensive analyses on performance bottlenecks, aiding in the optimization of online applications for enhanced speed and efficiency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note-Taking: I utilize the software application &lt;strong&gt;Obsidian&lt;/strong&gt; to fulfill all of my note-taking requirements. Obsidian's versatility and robust linking structure make it well-suited for effectively organizing intricate information. The plugins that are crucial for me include:&lt;br&gt;
    - &lt;strong&gt;Dataview&lt;/strong&gt;: Enables me to retrieve and exhibit notes in a well-organized fashion.&lt;br&gt;
    - The &lt;strong&gt;GitHub Link&lt;/strong&gt; feature facilitates convenient connecting of notes to GitHub repositories.&lt;br&gt;
    - &lt;strong&gt;Jira Issue&lt;/strong&gt;: Enables the direct monitoring of Jira issues within Obsidian.&lt;br&gt;
    - &lt;strong&gt;The Templater&lt;/strong&gt; feature offers sophisticated templating capabilities, making it easier to create new notes and documents.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Automating Routine Tasks
&lt;/h3&gt;

&lt;p&gt;In order to ensure that all aspects are current and functioning well, I employ a daily script that automates updates and carries out regular maintenance tasks. This script guarantees that my environment is consistently prepared for the day's tasks.&lt;/p&gt;

&lt;p&gt;The link provided is a GitHub gist with the URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/ehsanpo/1c205438c1e67b7c8e12a35e996e50f3" rel="noopener noreferrer"&gt;https://gist.github.com/ehsanpo/1c205438c1e67b7c8e12a35e996e50f3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s a breakdown of the script:&lt;/p&gt;

&lt;p&gt;Homebrew Updates:&lt;br&gt;
The script checks for and installs updates for all Homebrew packages, including cask applications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew update
brew upgrade
brew upgrade --cask 
brew cleanup -s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;System Diagnostics:&lt;br&gt;
It runs diagnostics to ensure the system is in good health.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew doctor
brew missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log Maintenance:&lt;br&gt;
To manage disk space and keep the system clean, the script deletes logs on the first Monday of each month.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DAY_OF_WEEK=$(date +%u)
DAY_OF_MONTH=$(date +%d)

if [ "$DAY_OF_WEEK" -eq 1 ] &amp;amp;&amp;amp; [ "$DAY_OF_MONTH" -le 7 ]; then
    rm ~/bin/brew_update_logs.txt
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MAC Address Spoofing:&lt;br&gt;
For privacy and security, the script changes the MAC address each day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NEWMAC=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
sudo ifconfig en0 ether $NEWMAC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weather Report:&lt;br&gt;
The script greets me with the weather forecast, adding a personal touch to my start of the day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Weather=$(curl -s http://wttr.in/malmo?T | grep -m 1 -Eo -e '-?[[:digit:]].*°.+')
say "Weather today is $Weather"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tools Powered by Artificial Intelligence
&lt;/h3&gt;

&lt;p&gt;By 2024, AI tools have seamlessly integrated into my development workflow, offering indispensable aid, streamlined automation, and innovative contributions throughout different phases of development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ChatGPT is utilized for various purposes such as ideation, code debugging, content generation, and document drafting. The natural language comprehension of this tool simplifies intricate problem-solving tasks and enhances my productivity by delivering prompt and precise responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub Copilot is seamlessly integrated into Visual Studio Code, providing advanced coding assistance by offering code completions, producing complete functions, and even predicting the subsequent steps in my code. It is akin to having an always available AI-driven partner coder to provide assistance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I depend on Midjourney to create AI-powered visual content for my design and creative projects. Midjourney specializes on transforming abstract concepts into visually captivating outcomes, expediting the design workflow. Their expertise lies in producing graphics, concept art, and UI elements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suno offers cutting-edge audio tools powered by artificial intelligence, which are highly valuable for producing soundscapes, voiceovers, and several other types of audio content. Suno enhances my work by providing great audio capabilities, whether it's for an application, a game, or even just improving a presentation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>vscode</category>
      <category>frontend</category>
    </item>
    <item>
      <title>looking for a side game while developing</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Mon, 20 Jun 2022 11:29:23 +0000</pubDate>
      <link>https://dev.to/ehsanpo/looking-for-a-side-game-while-developing-gce</link>
      <guid>https://dev.to/ehsanpo/looking-for-a-side-game-while-developing-gce</guid>
      <description>&lt;p&gt;Hi! my task this week to fix some issues in our web app build, so i have 2-3 min between every build test that i want to play some game in browser while i wait for my build!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Portfolio 22</title>
      <dc:creator>Ehsan Pourhadi</dc:creator>
      <pubDate>Sun, 22 May 2022 07:50:20 +0000</pubDate>
      <link>https://dev.to/ehsanpo/portfolio-22-4gin</link>
      <guid>https://dev.to/ehsanpo/portfolio-22-4gin</guid>
      <description>&lt;p&gt;Hi! &lt;br&gt;
Just wanted to share my work on my portfolio here and see what you think is missing. Right now I'm mostly working to get all of my work in my portfolio, and have about ten more projects to add.&lt;/p&gt;

&lt;p&gt;Am having a hard time writing a descriptions text for every project! mostly because I have done the same job and that is converting a design to code in different languages and frameworks.&lt;/p&gt;

&lt;p&gt;The site is built with Gatsby JS, SaSS, and lot s of clip-path&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ehsanpo.github.io/Portfolio22/" rel="noopener noreferrer"&gt;https://ehsanpo.github.io/Portfolio22/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>gatsby</category>
      <category>career</category>
    </item>
  </channel>
</rss>
