<?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: KimDoYoon</title>
    <description>The latest articles on DEV Community by KimDoYoon (@doyoon530).</description>
    <link>https://dev.to/doyoon530</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%2F3871452%2Fd2ef0799-58b2-4955-ba76-9a0d1adb6f17.gif</url>
      <title>DEV Community: KimDoYoon</title>
      <link>https://dev.to/doyoon530</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/doyoon530"/>
    <language>en</language>
    <item>
      <title>I made a terminal-style SVG card generator for GitHub READMEs (and this is my first post ever, please be nice)</title>
      <dc:creator>KimDoYoon</dc:creator>
      <pubDate>Fri, 10 Apr 2026 09:58:57 +0000</pubDate>
      <link>https://dev.to/doyoon530/i-made-a-terminal-style-svg-card-generator-for-github-readmes-and-this-is-my-first-post-ever-59mo</link>
      <guid>https://dev.to/doyoon530/i-made-a-terminal-style-svg-card-generator-for-github-readmes-and-this-is-my-first-post-ever-59mo</guid>
      <description>&lt;p&gt;Hi. This is my first dev.to post. I've been lurking here for about two years, saving articles to my reading list and never actually reading them. Classic.&lt;/p&gt;

&lt;p&gt;Anyway, I built something and I wanted to share it, so here we are.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem (aka my excuse to build something)
&lt;/h2&gt;

&lt;p&gt;I kept seeing the same GitHub profile READMEs. GitHub Readme Stats. A badge. Another badge. Maybe a snake animation if you were feeling adventurous.&lt;/p&gt;

&lt;p&gt;Don't get me wrong — those tools are great. I use them too. But I wanted my profile to feel more like &lt;em&gt;me&lt;/em&gt; — something with a bit more personality. Something that looked like a deliberate design decision, not just "I copy-pasted this from someone else's README."&lt;/p&gt;

&lt;p&gt;So I did what any reasonable developer would do instead of just updating their bio:&lt;/p&gt;

&lt;p&gt;I spent way too long building a whole new tool.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Terminal Identity&lt;/strong&gt; — terminal-style SVG identity cards, generated from a single URL.&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%2Fjom6boe6td9cyj89a1nd.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%2Fjom6boe6td9cyj89a1nd.png" alt="Terminal Identity demo card" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. No tokens. No GitHub Actions. No setup at all.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://terminal-identity-opal.vercel.app/api?name=yourname&amp;amp;username=your-github&amp;amp;theme=amber/solar"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"my card"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Paste it in your README and it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it can do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live GitHub stats&lt;/strong&gt; — repos, stars, forks, followers pulled from the public API at render time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Top languages&lt;/strong&gt; — bar chart or skill icons (powered by skillicons.dev)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 provider shells&lt;/strong&gt; — Classic, Amber, Obsidian, Prism (each has a different layout feel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8 themes&lt;/strong&gt; — Solar, Ember, Aurora, Cobalt, Velvet, Graphite, Matcha, Sakura&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom bio&lt;/strong&gt; — with multi-line wrapping and &lt;code&gt;**bold**&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background patterns&lt;/strong&gt; — grid, rings, or pulse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fully customizable&lt;/strong&gt; — accent colors, card size, which stats to show, which languages to exclude&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the same card in a few different themes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obsidian / Cobalt&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Prism / Aurora&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Amber / Sakura&lt;/strong&gt;&lt;/p&gt;

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




&lt;h2&gt;
  
  
  How it works (the part where I pretend I knew what I was doing)
&lt;/h2&gt;

&lt;p&gt;The whole thing is a single serverless function on Vercel. When you hit the &lt;code&gt;/api&lt;/code&gt; endpoint:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It reads your query params&lt;/li&gt;
&lt;li&gt;Optionally fetches your GitHub public stats&lt;/li&gt;
&lt;li&gt;Builds an SVG string and returns it as &lt;code&gt;image/svg+xml&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The SVG is hand-crafted — no canvas, no headless browser, no Puppeteer. Just string templates, some math, and a pixel-based text wrapping function I'm probably too proud of.&lt;/p&gt;

&lt;p&gt;The same &lt;code&gt;terminal-card.js&lt;/code&gt; file runs both server-side (Node.js) and in the browser playground. Writing isomorphic JS across environments for the first time was genuinely one of those "oh so THAT'S why people do it this way" moments.&lt;/p&gt;




&lt;h2&gt;
  
  
  The live playground
&lt;/h2&gt;

&lt;p&gt;I also built a playground at &lt;a href="https://terminal-identity-opal.vercel.app" rel="noopener noreferrer"&gt;terminal-identity-opal.vercel.app&lt;/a&gt; where you can tweak everything visually and copy the URL or markdown directly.&lt;/p&gt;

&lt;p&gt;It renders the SVG live as you type, fetches your GitHub stats if you enter a username, and lets you download the SVG or copy the API URL.&lt;/p&gt;




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

&lt;p&gt;🔗 &lt;strong&gt;Live playground:&lt;/strong&gt; &lt;a href="https://terminal-identity-opal.vercel.app" rel="noopener noreferrer"&gt;https://terminal-identity-opal.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/doyoon530/terminal-identity" rel="noopener noreferrer"&gt;https://github.com/doyoon530/terminal-identity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you end up using it on your profile, I'd genuinely love to see it — drop a link in the comments. And if something looks broken or wrong, please tell me. This is my first real open source project and I'm still figuring out what "done" looks like.&lt;/p&gt;

&lt;p&gt;Thanks for reading my first post. I'll try to actually read some articles in return.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Vercel · SVG · vanilla JS · and a questionable amount of time spent on font metric calculations&lt;/em&gt;&lt;/p&gt;

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