<?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: Diyor</title>
    <description>The latest articles on DEV Community by Diyor (@diyoriko).</description>
    <link>https://dev.to/diyoriko</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%2F3857303%2Fb775776b-f08e-4cc0-8f3c-9516cc115f54.jpeg</url>
      <title>DEV Community: Diyor</title>
      <link>https://dev.to/diyoriko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diyoriko"/>
    <language>en</language>
    <item>
      <title>I built a zero-dependency portfolio template — here's what I learned</title>
      <dc:creator>Diyor</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:35:48 +0000</pubDate>
      <link>https://dev.to/diyoriko/i-built-a-zero-dependency-portfolio-template-heres-what-i-learned-1koh</link>
      <guid>https://dev.to/diyoriko/i-built-a-zero-dependency-portfolio-template-heres-what-i-learned-1koh</guid>
      <description>&lt;p&gt;Most portfolio templates come with React, Next.js, or at least a build step. I wanted something different: a template that designers can actually understand and modify without touching a terminal (beyond the initial setup).&lt;/p&gt;

&lt;p&gt;So I built one from scratch. &lt;strong&gt;300KB. Zero dependencies. Vanilla everything.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why vanilla?
&lt;/h2&gt;

&lt;p&gt;I'm a product designer who codes. My own portfolio (&lt;a href="https://diyor.design" rel="noopener noreferrer"&gt;diyor.design&lt;/a&gt;) runs on plain HTML, CSS, and JavaScript. When I decided to turn it into a template, I had a choice: rewrite it in a framework, or keep it simple.&lt;/p&gt;

&lt;p&gt;I kept it simple. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designers can read it.&lt;/strong&gt; No JSX, no components, no state management. Just HTML files you can open in a browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No build step.&lt;/strong&gt; Edit a file, refresh the browser. Done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It'll work in 10 years.&lt;/strong&gt; No deprecated packages, no breaking updates, no &lt;code&gt;npm audit&lt;/code&gt; warnings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;300KB total.&lt;/strong&gt; The entire template. Not the JavaScript bundle — the whole thing.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bilingual support&lt;/strong&gt; — Russian and English with a language switcher. Easy to adapt for any two languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark mode&lt;/strong&gt; — toggle button + automatic system preference, saved in localStorage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case study template&lt;/strong&gt; — numbered sections, stats grid, image lightbox with zoom, previous/next navigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal easter egg&lt;/strong&gt; — press &lt;code&gt;~&lt;/code&gt; for a secret terminal with design quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design system overlay&lt;/strong&gt; — press &lt;code&gt;Shift+G&lt;/code&gt; to see the 12-column grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-command setup&lt;/strong&gt; — &lt;code&gt;./setup.sh&lt;/code&gt; asks your name, generates a favicon, replaces all placeholders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO ready&lt;/strong&gt; — Open Graph, JSON-LD, sitemap, canonical tags, hreflang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible&lt;/strong&gt; — ARIA, keyboard nav, focus-visible, reduced motion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The setup experience
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/diyoriko/portfolio-template.git my-portfolio
&lt;span class="nb"&gt;cd &lt;/span&gt;my-portfolio
./setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The script asks for your name, domain, email, socials. Then it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaces "Jane Smith" everywhere&lt;/li&gt;
&lt;li&gt;Generates an SVG favicon with your initial&lt;/li&gt;
&lt;li&gt;Updates CNAME, sitemap, config.json&lt;/li&gt;
&lt;li&gt;Done. Push to GitHub Pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The dark mode architecture.&lt;/strong&gt; I started with just &lt;code&gt;prefers-color-scheme&lt;/code&gt; but quickly realized users want a manual toggle. I ended up with a dual system: &lt;code&gt;@media (prefers-color-scheme: dark) { :root:not(.light) { ... } }&lt;/code&gt; for auto mode, plus &lt;code&gt;html.dark { ... }&lt;/code&gt; for manual. It works, but the CSS is duplicated. Next time I'd use CSS layers or a single class-based approach from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardcoded colors.&lt;/strong&gt; My first pass had &lt;code&gt;rgba(0, 0, 0, 0.08)&lt;/code&gt; scattered everywhere for borders and shadows. In dark mode, they were invisible. I had to go back and replace them all with CSS custom properties. Lesson: use variables from day one, even for "obvious" values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://diyor.design" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/strong&gt; — my actual portfolio, built with the same code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/diyoriko/portfolio-template" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt; — fork it, clone it, use the template button&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/diyoriko/portfolio-template/generate" rel="noopener noreferrer"&gt;One-click deploy&lt;/a&gt;&lt;/strong&gt; — GitHub template, ready to go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. If you build something with it, I'd love to see it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Diyor, a product and brand designer. I write about design systems, automation, and building things from scratch. &lt;a href="https://diyor.design" rel="noopener noreferrer"&gt;diyor.design&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>portfolio</category>
      <category>github</category>
    </item>
  </channel>
</rss>
