<?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: Luis A. Guisado</title>
    <description>The latest articles on DEV Community by Luis A. Guisado (@pushodev).</description>
    <link>https://dev.to/pushodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1218839%2F3224bab8-47e2-49dc-b18e-49d46b1793c6.png</url>
      <title>DEV Community: Luis A. Guisado</title>
      <link>https://dev.to/pushodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pushodev"/>
    <language>en</language>
    <item>
      <title>Add a living pixel-art koi to your GitHub profile README (in 5 minutes)</title>
      <dc:creator>Luis A. Guisado</dc:creator>
      <pubDate>Fri, 13 Nov 2026 20:14:31 +0000</pubDate>
      <link>https://dev.to/pushodev/add-a-living-pixel-art-koi-to-your-github-profile-readme-in-5-minutes-1827</link>
      <guid>https://dev.to/pushodev/add-a-living-pixel-art-koi-to-your-github-profile-readme-in-5-minutes-1827</guid>
      <description>&lt;p&gt;Your GitHub profile README can do more than list tech badges. With &lt;strong&gt;git-koi&lt;/strong&gt; you get a small pixel-art koi that is &lt;strong&gt;redrawn every night from your public activity&lt;/strong&gt;: languages color it, contributions make it grow, and streaks mark it.&lt;/p&gt;

&lt;p&gt;I added it to my own profile today, and it took a few minutes. Here is exactly how, plus the three things that surprised me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Credit:&lt;/strong&gt; git-koi is an open source project (MIT license) by &lt;a href="https://github.com/yalongwastaken/git-koi" rel="noopener noreferrer"&gt;yalongwastaken&lt;/a&gt;. I'm only showing how to set it up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;profile repository&lt;/strong&gt;: a public repo named exactly like your username (for example &lt;code&gt;PushoDev/PushoDev&lt;/code&gt;). Its &lt;code&gt;README.md&lt;/code&gt; is what GitHub shows on your profile.&lt;/li&gt;
&lt;li&gt;Nothing else. The Action uses the built-in &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, so there are no secrets to create, and you don't need Rust or the GitHub CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: add the workflow
&lt;/h2&gt;

&lt;p&gt;Create the file &lt;code&gt;.github/workflows/koi.yml&lt;/code&gt; in your profile repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Koi&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Just after midnight UTC, so the koi shows the day that just ended.
&lt;/span&gt;    &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"20 0 * * *"&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;.github/workflows/koi.yml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;koi&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;koi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yalongwastaken/git-koi@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;white&lt;/span&gt;
          &lt;span class="na"&gt;output-dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;koi&lt;/span&gt;
      &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commit the koi if it changed&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;git add koi/koi.gif&lt;/span&gt;
          &lt;span class="s"&gt;if git diff --cached --quiet; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "The koi is unchanged; nothing to commit."&lt;/span&gt;
            &lt;span class="s"&gt;exit 0&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
          &lt;span class="s"&gt;git config user.name "github-actions[bot]"&lt;/span&gt;
          &lt;span class="s"&gt;git config user.email "41898282+github-actions[bot]@users.noreply.github.com"&lt;/span&gt;
          &lt;span class="na"&gt;git commit --quiet --message "koi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;draw the day's koi"&lt;/span&gt;
          &lt;span class="s"&gt;git push --quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;every night at 00:20 UTC&lt;/strong&gt;, so each koi shows the day that just ended.&lt;/li&gt;
&lt;li&gt;Also runs &lt;strong&gt;when you push a change to this file&lt;/strong&gt;, so you don't have to wait until midnight for the first one.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permissions: contents: write&lt;/code&gt; lets the job commit the generated GIF back to your repo.&lt;/li&gt;
&lt;li&gt;The Action itself never commits; the last step does it, and only if the image changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: show it in your README
&lt;/h2&gt;

&lt;p&gt;Add this where you want the koi to appear:&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;p&lt;/span&gt; &lt;span class="na"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"koi/koi.gif"&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"256"&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"My GitHub koi"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GIF is drawn at twice the koi's pixel size, so &lt;code&gt;width="256"&lt;/code&gt; shows it at its native size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: push and check
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add .
git commit -m &lt;span class="s2"&gt;"Add koi"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the &lt;strong&gt;Actions&lt;/strong&gt; tab, and you should see the &lt;strong&gt;Koi&lt;/strong&gt; workflow running. In my case it finished in about 30 seconds and created &lt;code&gt;koi/koi.gif&lt;/code&gt; in the repo. If the workflow didn't start, run it by hand: &lt;strong&gt;Actions → Koi → Run workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it yours
&lt;/h2&gt;

&lt;p&gt;The Action has a few inputs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;white&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;white&lt;/code&gt;, &lt;code&gt;black&lt;/code&gt;, &lt;code&gt;asagi&lt;/code&gt;, &lt;code&gt;tea&lt;/code&gt;, &lt;code&gt;gold&lt;/code&gt; or &lt;code&gt;platinum&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;output-dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;koi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Folder for the output files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;repo owner&lt;/td&gt;
&lt;td&gt;Account whose koi is drawn&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To change the koi, edit &lt;code&gt;body: white&lt;/code&gt; in your workflow and push. If you change &lt;code&gt;output-dir&lt;/code&gt;, also update the path in the commit step and the image in your README.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three gotchas I hit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The image looks broken for a minute.&lt;/strong&gt; Right after my first push, the README showed a broken image. The workflow was still running, so &lt;code&gt;koi/koi.gif&lt;/code&gt; didn't exist yet, and GitHub cached the "missing" result. Wait for the workflow to finish and hard-refresh (&lt;code&gt;Ctrl+Shift+R&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Your local repo falls behind every night.&lt;/strong&gt; The bot commits the new GIF to your repo daily, so your local copy is always one commit behind. Before your next push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull --rebase origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise &lt;code&gt;git push&lt;/code&gt; will be rejected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Scheduled workflows pause after 60 days.&lt;/strong&gt; GitHub disables scheduled workflows in public repos with no activity for 60 days. If your koi stops changing, re-enable it from the Actions tab or run &lt;code&gt;gh workflow enable koi.yml&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One note about trust
&lt;/h2&gt;

&lt;p&gt;This workflow runs a third-party Action with &lt;strong&gt;write access&lt;/strong&gt; to your profile repo. It only uses the built-in token and the project is MIT-licensed, but it's a good habit to read the Action's code once, and if you want extra safety, pin it to a commit SHA instead of &lt;code&gt;@v1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;That's it: a small, living detail that makes your profile feel a bit more alive, with no secrets and almost no setup. If you try it, tell me how your koi looks!&lt;/p&gt;

&lt;p&gt;You can see mine at the bottom of my profile: &lt;a href="https://github.com/PushoDev" rel="noopener noreferrer"&gt;PushoDev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubactions</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
