<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chess &amp; Friends on Christian Martínez De La Rosa</title><link>https://christt105.github.io/categories/chess--friends/</link><description>Recent content in Chess &amp; Friends on Christian Martínez De La Rosa</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 23 Aug 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://christt105.github.io/categories/chess--friends/index.xml" rel="self" type="application/rss+xml"/><item><title>Chess &amp; Friends: a website to keep score of the beatings my brothers give me at chess</title><link>https://christt105.github.io/blog/chess-and-friends/</link><pubDate>Sun, 23 Aug 2026 00:00:00 +0200</pubDate><guid>https://christt105.github.io/blog/chess-and-friends/</guid><enclosure url="https://christt105.github.io/blog/chess-and-friends/cover.webp" length="71956" type="image/webp"/><description>&lt;p&gt;Hi again.&lt;/p&gt;&#10;&lt;p&gt;My brothers are chess nerds, most of the time I see them they&amp;rsquo;re either playing games or watching videos about it. I play every once in a while, I&amp;rsquo;ve always liked it, but that&amp;rsquo;s it, a casual player who plays the occasional game. Every so often my brothers challenge me to a game and it always ends the same way, a beating.&lt;/p&gt;&#10;&lt;p&gt;The other day my sister sent me, out of nowhere, an accuracy chart of our latest games on Discord that she&amp;rsquo;d pulled from who knows where. Honestly the chart was pretty pathetic, it was worse than losing the game itself. But it gave me an idea: instead of a one-off chart, why not something more alive, that kept updating on its own?&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="439px" data-flex-grow="183" height="485" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/chess-and-friends/Chart.webp" srcset="https://christt105.github.io/blog/chess-and-friends/Chart_hu_936c5ee92dd7f8b8.webp 800w, https://christt105.github.io/blog/chess-and-friends/Chart.webp 889w" width="889"&gt;&lt;/p&gt;&#10;&lt;h2 id="getting-to-work"&gt;Getting to work&#10;&lt;/h2&gt;&lt;p&gt;Chess.com has a public API with no key or anything weird needed: for each player you can request the games archive for a given month, and it returns, among other things, the accuracy for each side when available (since ~2023 chess.com calculates it for almost every game). With that as a base, the plan was a simple website that would go fetch the games between us and plot them in a couple of charts.&lt;/p&gt;&#10;&lt;p&gt;I pitched it to Claude just like that, with what I wanted and little else, and from there it was a matter of iterating: a Node script that hits the API and saves a &lt;code&gt;games.json&lt;/code&gt;, a static website that reads it and plots it with Chart.js, and while at it, giving it a chessboard vibe instead of the typical generic website. We refined things along the way: caching months that were already closed out so as not to repeat requests for no reason, a different icon depending on how each game ended (checkmate, resignation, timeout, draw), and a GitHub Action that runs every night to refresh the data on its own, so the site never needs me to touch it to stay up to date.&lt;/p&gt;&#10;&lt;a class="github-repo-card" href="https://github.com/christt105/chess-and-friends" target="_blank" rel="noopener"&gt;&#10; &lt;img src="https://avatars.githubusercontent.com/u/36189169?v=4" alt="christt105 avatar" class="repo-avatar"&gt;&#10; &lt;h3&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-github" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"&gt;&#10; &lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&#10; &lt;path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" /&gt;&#10;&lt;/svg&gt;&#10;&#10;&#10; christt105/chess-and-friends&lt;/h3&gt;&#10; &lt;p&gt;&lt;/p&gt;&#10; &lt;div class="repo-stats"&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" class="icon icon-tabler icons-tabler-filled icon-tabler-star"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M8.243 7.34l-6.38 .925l-.113 .023a1 1 0 0 0 -.44 1.684l4.622 4.499l-1.09 6.355l-.013 .11a1 1 0 0 0 1.464 .944l5.706 -3l5.693 3l.1 .046a1 1 0 0 0 1.352 -1.1l-1.091 -6.355l4.624 -4.5l.078 -.085a1 1 0 0 0 -.633 -1.62l-6.38 -.926l-2.852 -5.78a1 1 0 0 0 -1.794 0l-2.853 5.78z" /&gt;&lt;/svg&gt; 0&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-git-fork"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M10 18a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M5 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M15 6a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /&gt;&lt;path d="M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2" /&gt;&lt;path d="M12 12l0 4" /&gt;&lt;/svg&gt; 0&lt;/span&gt;&#10; &lt;span&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-calendar-event"&gt;&lt;path stroke="none" d="M0 0h24v24H0z" fill="none"/&gt;&lt;path d="M4 7a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2l0 -12" /&gt;&lt;path d="M16 3l0 4" /&gt;&lt;path d="M8 3l0 4" /&gt;&lt;path d="M4 11l16 0" /&gt;&lt;path d="M8 15h2v2h-2l0 -2" /&gt;&lt;/svg&gt; 2026-08-26&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;h2 id="the-website"&gt;The website&#10;&lt;/h2&gt;&lt;p&gt;You can find it here: &lt;a class="link" href="https://christt105.github.io/chess-and-friends/" target="_blank" rel="noopener"&#10; &gt;https://christt105.github.io/chess-and-friends/&lt;/a&gt;. It has two views. The individual one, with my accuracy evolution and my numbers solo:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Individual view of the Chess &amp; Friends dashboard" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1400" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/chess-and-friends/dashboard-individual.png" srcset="https://christt105.github.io/blog/chess-and-friends/dashboard-individual_hu_d9f021192e2318f0.png 800w, https://christt105.github.io/blog/chess-and-friends/dashboard-individual.png 1400w" width="1400"&gt;&lt;/p&gt;&#10;&lt;p&gt;And the &amp;ldquo;Friends&amp;rdquo; one, which compares everyone we play among ourselves and adds a head-to-head table:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Comparison view between siblings in Chess &amp; Friends" class="gallery-image" data-flex-basis="339px" data-flex-grow="141" height="989" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://christt105.github.io/blog/chess-and-friends/dashboard-amigos.png" srcset="https://christt105.github.io/blog/chess-and-friends/dashboard-amigos_hu_dae8f4b3557ec75f.png 800w, https://christt105.github.io/blog/chess-and-friends/dashboard-amigos.png 1400w" width="1400"&gt;&lt;/p&gt;&#10;&lt;p&gt;Nothing too complicated under the hood (one HTML file, a fetch script and a dashboard script, no build step or frameworks), but for what I needed it&amp;rsquo;s exactly what I wanted: zero maintenance and it looks like a real project.&lt;/p&gt;&#10;&lt;h2 id="the-beatings-in-numbers"&gt;The beatings, in numbers&#10;&lt;/h2&gt;&lt;p&gt;Honestly it&amp;rsquo;s pretty pathetic, and I should probably even be ashamed to publish this. But whatever, it&amp;rsquo;s just a game. I already suspected it, but seeing it in a neat little table is a whole other level of humiliation.&lt;/p&gt;&#10;&lt;h2 id="sign-off"&gt;Sign off&#10;&lt;/h2&gt;&lt;p&gt;A one-morning project while doing chores around the house, to laugh at myself a bit (as I write this I can already hear my brothers laughing, the bastards). I&amp;rsquo;ve made it public, anyone can clone the repo and edit the data file to generate their own website.&lt;/p&gt;&#10;&lt;p&gt;See you next time.&lt;/p&gt;&#10;&lt;div class="video-wrapper"&gt;&#10; &lt;iframe loading="lazy" &#10; src="https://www.youtube.com/embed/c7BVtGnlxT8" &#10; allowfullscreen &#10; title="YouTube Video"&#10; &gt;&#10; &lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&#10;</description></item></channel></rss>