<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>
<title>Adële&#039;s blog</title>
<link>https://adele.pages.casa/md/</link>
<atom:link href="https://adele.pages.casa/md/blog/rss.xml" rel="self" type="application/rss+xml" />
<description>Posts about SmolWeb, Gemini protocol and LowTech</description>
<language>en</language>
<lastBuildDate>Sat, 02 May 2026 19:15:06 +0000</lastBuildDate>
<pubDate>Sat, 02 May 2026 19:15:00 +0000</pubDate>
<generator>smolmd</generator>
<copyright>by Adële (2026)</copyright>
<item>
<title>I am a smolweb advocate and, sometimes, I use LLMs.</title>
<description>&lt;h1&gt;I am a smolweb advocate and, sometimes, I use LLMs.&lt;/h1&gt;
&lt;p&gt;2026-05-02 19:15&lt;/p&gt;
&lt;p&gt;I spend a lot of time thinking about simplicity. Fewer dependencies, lighter
pages, tools that do one thing well. So yes, it might look strange that I also
spend time talking to large language models. Let me explain where I draw the
line, and why I think the contradiction is smaller than it appears.&lt;/p&gt;
&lt;h2&gt;What I avoid&lt;/h2&gt;
&lt;p&gt;I do not use LLMs to generate images, musics or videos. Not because I am against
creativity, but because that kind of generation has a cost I can feel: massive
compute, opaque training data, and an output that tends to look like everything
and nothing at the same time. I am not interested in that.&lt;/p&gt;
&lt;p&gt;More broadly, I avoid using a LLM as a replacement for thinking. The risk is
real: ask, copy, ship, forget. That is not a workflow, that is a shortcut to
not understanding your own codebase.&lt;/p&gt;
&lt;h2&gt;What I actually use them for&lt;/h2&gt;
&lt;p&gt;Debugging a tricky regex for example. Understanding an obscure error message at 11pm.
Getting a quick skeleton for a function I know how to write but do not want to
type from scratch. Reformulating something I wrote and cannot read anymore.&lt;/p&gt;
&lt;p&gt;In short: acceleration, not delegation.&lt;/p&gt;
&lt;p&gt;I never use a LLM as a starting point in unknown territory. If I do not
understand the domain, I will not be able to evaluate the output, and a
confident wrong answer is worse than no answer. I learn first, then I use the
tool.&lt;/p&gt;
&lt;h2&gt;The environmental argument, in context&lt;/h2&gt;
&lt;p&gt;There is a fair criticism: LLMs consume a lot of energy. Fair. But I think the
comparison is sometimes done badly. So true to generate a useless image to decorate a blog post. But false if it avoids other hard tasks.&lt;/p&gt;
&lt;p&gt;A single LLM query costs more than a single web search, roughly ten times
more, according to estimates floating around. But the right comparison is not
one query vs. one search. It is five minutes of focused LLM use vs. one hour
of tab-juggling, reading half-articles, and reformulating the same search query
twelve times. That math is less obvious.&lt;/p&gt;
&lt;p&gt;I am not using this to justify anything. I still try to keep sessions short
and intentional. But I think the nuance is worth stating.&lt;/p&gt;
&lt;h2&gt;The smolweb angle nobody talks about&lt;/h2&gt;
&lt;p&gt;Here is something I did not expect: LLMs work &lt;em&gt;better&lt;/em&gt; on simple stacks.&lt;/p&gt;
&lt;p&gt;I work with plain PHP, vanilla JS, semantic HTML, lighttpd, Dolibarr (at work). No heavy framework, no abstraction layers, no magic. And the LLM handles that very well.
The answers are short, precise, and mostly correct. No hallucinated method names
from a framework it half-knows, no suggestions to install a package that wraps
another package.&lt;/p&gt;
&lt;p&gt;The more complex your stack, the more the LLM struggles, and the more
back-and-forth you need. Every iteration has a cost. A simpler stack means
shorter sessions, fewer tokens, more reliable answers.&lt;/p&gt;
&lt;p&gt;So in a way, choosing the smolweb is also choosing a better LLM experience.
Not because I optimized for that, but because simplicity compounds.&lt;/p&gt;
&lt;h2&gt;I always try to understand what it gives me&lt;/h2&gt;
&lt;p&gt;This is probably the most important thing I want to say.&lt;/p&gt;
&lt;p&gt;Skill erosion is real. If you let a tool think for you often enough, you stop
thinking. I have seen it happen. The LLM writes the function, you run it, it
works, you move on, and three months later you cannot explain what it does.&lt;/p&gt;
&lt;p&gt;My rule is simple: I read what it generates. I understand it before I use it.
Sometimes I rewrite it my way. Sometimes it teaches me something I genuinely
did not know, a cleaner approach, a built-in function I had forgotten, an
edge case I had not considered. That is useful. That is the LLM as a fast
colleague, not as a replacement for thinking.&lt;/p&gt;
&lt;p&gt;And sometimes it is wrong. Not hallucinating exactly, just... slightly off.
Missing context, outdated assumption, plausible but incorrect. I catch it
because I read it. If I had just shipped it, I would not have.&lt;/p&gt;
&lt;h2&gt;One more thing: where the query goes&lt;/h2&gt;
&lt;p&gt;I run Ollama at home on my own machine. For personal projects and exploratory
work, that is my first stop. No data sent anywhere, no privacy concern, no
dependency on an external service when I can.&lt;/p&gt;
&lt;p&gt;For more complex tasks I use an external model such as Claude, and I am
conscious of what I send. No client code, no credentials, nothing sensitive.
That is a deliberate choice, not an afterthought.&lt;/p&gt;
&lt;h2&gt;So&lt;/h2&gt;
&lt;p&gt;I am a smolweb advocate who uses LLMs. Not to generate fluff, not to avoid
thinking, not as an oracle. As a tool, fast, sometimes very useful, always
verified, occasionally wrong.&lt;/p&gt;
&lt;p&gt;The key is knowing what you are doing with it.&lt;/p&gt;
&lt;p&gt;Discuss about it &lt;a href=&quot;https://social.pollux.casa/@adele/statuses/01KQN1TSCPB9RZF5Q2KZWAX15X&quot;&gt;on the Fediverse&lt;/a&gt;&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/sometimes-i-use-llms.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/sometimes-i-use-llms.md</guid>
<pubDate>Sat, 02 May 2026 19:15:00 +0000</pubDate>
<modDate>Sat, 02 May 2026 19:15:06 +0000</modDate>
</item>
<item>
<title>The Fediverse deserves a dumb graphical client</title>
<description>&lt;h1&gt;The Fediverse deserves a dumb graphical client&lt;/h1&gt;
&lt;p&gt;2026-04-09 18:30&lt;/p&gt;
&lt;p&gt;I love the Fediverse. I have been on it for years, and it remains the only social network where I actually enjoy spending time. No algorithmic feed pushing outrage, no dark patterns, no surveillance capitalism. Just people talking to each other over an open protocol.&lt;/p&gt;
&lt;p&gt;But every time I wanted to recommend it to someone, I ran into the same wall: the clients are heavy. Mastodon&#039;s web interface ships megabytes of JavaScript. Elk, Phanpy, Ivory, beautiful apps, but they require a modern browser, a fast connection, and a device manufactured in the last five years.&lt;/p&gt;
&lt;p&gt;There are CLI clients, &lt;a href=&quot;https://toot.bezdomni.net/&quot;&gt;toot&lt;/a&gt; and &lt;a href=&quot;https://tut.anv.nu/&quot;&gt;tut&lt;/a&gt; are both solid, genuinely lightweight, and a pleasure to use in a terminal. But the Fediverse without images is a lesser experience. People share photos, artwork, screenshots. A terminal client gets you the text; it does not get you the whole picture.&lt;/p&gt;
&lt;p&gt;What I wanted was something in between: a client that runs in a plain browser, handles images properly, but does not require a JavaScript engine to display a list of posts. The API returns JSON; a server-side script can turn that JSON into HTML just fine. We have been doing that for 25 years.&lt;/p&gt;
&lt;p&gt;So I built &lt;strong&gt;&lt;a href=&quot;https://codeberg.org/adele/smolfedi&quot;&gt;SmolFedi&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It is a PHP application. No npm, no Composer, no build step. It uses a SQLite database and basic PHP sessions. Every page is generated server-side and sent as plain HTML. It supports multiple accounts, timelines, notifications, polls, media attachments with alt text, content warnings, compose, reply, boost, favourite, everything I actually use day to day. CSS stays within &lt;a href=&quot;https://smolweb.org/css-grading.html&quot;&gt;smolweb Grade B&lt;/a&gt;. There is not a single line of JavaScript in the codebase.&lt;/p&gt;
&lt;p&gt;It works with Mastodon, GoToSocial and certainly other compatible Fediverse platforms. It works in Firefox, in Chromium, in Safari, in any browser that can render HTML and display a JPEG such as Dillo or Netsurf.&lt;/p&gt;
&lt;p&gt;I am not claiming this is the right client for everyone. If you want a smooth single-page experience with live updates and animations, SmolFedi is not that. But if you want to browse the Fediverse on a modest device, a slow connection, or simply a setup where you would rather not run megabytes of JavaScript fetched from the web, SmolFedi is for you.&lt;/p&gt;
&lt;p&gt;The source is on &lt;a href=&quot;https://codeberg.org/adele/smolfedi&quot;&gt;Codeberg&lt;/a&gt; and a demo instance on &lt;a href=&quot;https://smolfedi.pollux.casa&quot;&gt;Pollux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What do you think of that ? Let me know &lt;a href=&quot;https://smolfedi.pollux.casa/post.php?a=0&amp;amp;id=01KNSREVW9KMSJKH05RJ1Q9M2N&quot;&gt;on the Fediverse&lt;/a&gt;&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/the-fediverse-deserves-a-dumb-graphical-client.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/the-fediverse-deserves-a-dumb-graphical-client.md</guid>
<pubDate>Thu, 09 Apr 2026 18:30:00 +0000</pubDate>
<modDate>Thu, 09 Apr 2026 18:40:14 +0000</modDate>
</item>
<item>
<title>All my clients wanted a carousel, now it&#039;s an AI chatbot!</title>
<description>&lt;h1&gt;All my clients wanted a carousel, now it&#039;s an AI chatbot!&lt;/h1&gt;
&lt;p&gt;2026-03-14 12:55&lt;/p&gt;
&lt;p&gt;It always starts the same way. The client pulls out their phone mid-meeting, navigates to a competitor&#039;s website, and holds the screen up like evidence. &lt;em&gt;&quot;You see? They have one of those.&quot;&lt;/em&gt; A little bubble. Bottom right corner. Blinking...&lt;/p&gt;
&lt;p&gt;For years, that gesture was about carousels. Every homepage had to have one, big, slow, full of stock photos that nobody asked for. I built dozens of them. They spun. They faded. They slid. Visitors ignored them completely, scrolled past in half a second, and went looking for the phone number.&lt;/p&gt;
&lt;p&gt;Then the trend quietly died, as trends do. Not because anyone decided carousels were bad. Just because something newer came along to copy.&lt;/p&gt;
&lt;p&gt;Cookie consent banners came next. Every site needed one, even the ones with no cookies whatsoever. Then Google Tag Manager, even for clients who never once opened an analytics report. I asked one of them, eighteen months after launch, if he&#039;d ever looked at the traffic stats. He hadn&#039;t. He didn&#039;t even remember the login.&lt;/p&gt;
&lt;p&gt;Now it&#039;s the chatbot.&lt;/p&gt;
&lt;p&gt;I&#039;ve started asking clients a simple question when they bring it up. Not to be difficult, just to understand.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Do you actually use chatbots when you visit other websites?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There&#039;s usually a pause. Then a laugh.&lt;/p&gt;
&lt;p&gt;No, not really. They close them immediately. They find them annoying. Half the time they answer something completely unrelated to the question. Once, a client told me about a competitor&#039;s chatbot that confidently gave out wrong opening hours for months. He thought it was hilarious.
And yet: &lt;em&gt;&quot;but we should have one, right?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&#039;s the moment I find both fascinating and exhausting.&lt;/p&gt;
&lt;p&gt;It&#039;s not about utility. It&#039;s not even really about the chatbot. It&#039;s about visibility, the fear of looking behind. A website without a chatbot in 2026 risks feeling unfinished, like something&#039;s missing. Even if what&#039;s missing is a half-broken widget that most visitors dismiss in three seconds.
The chatbot has become a social signal, not a tool. A way of saying: &lt;em&gt;we&#039;re keeping up.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&#039;ve tried the opposite approach. When a client mentions the chatbot, I&#039;ll sometimes open a few smolweb sites, fast, minimal, readable, calm. No pop-ups. No blinking corners. Just content, clear and immediate.&lt;/p&gt;
&lt;p&gt;Their eyes change. &lt;em&gt;&quot;Oh, that loads fast.&quot;&lt;/em&gt; &lt;em&gt;&quot;That&#039;s easy to read.&quot;&lt;/em&gt; &lt;em&gt;&quot;I like that.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And they mean it. Genuinely.&lt;/p&gt;
&lt;p&gt;Then I ask if they&#039;d want something like that.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Well... but it looks a bit simple, doesn&#039;t it?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Simple is the word that keeps coming up. And I&#039;ve learned that when a client says &lt;em&gt;simple&lt;/em&gt;, they don&#039;t mean easy to use. They mean &lt;em&gt;not impressive enough&lt;/em&gt;. They mean &lt;em&gt;what will people think&lt;/em&gt;. A lean, fast website doesn&#039;t look like it cost anything. It doesn&#039;t signal effort. It doesn&#039;t say: &lt;em&gt;we take this seriously.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The real irony is that building something genuinely simple, something that loads instantly and says exactly what it needs to say and nothing more, is often harder than bolting on a chatbot. But that&#039;s invisible work. Nobody sees the restraint.&lt;/p&gt;
&lt;p&gt;I don&#039;t have a solution to offer here. I&#039;m not going to end this with a tidy list of tips for convincing clients to embrace the smolweb. That&#039;s not how it works, and pretending otherwise would be its own kind of dishonesty.&lt;/p&gt;
&lt;p&gt;The pressure isn&#039;t really coming from clients anyway. It&#039;s coming from the web itself, from a decade of bloated pages, dark patterns, and feature arms races that quietly redefined what a &quot;real&quot; website looks like. Clients are just reading the room. The room is wrong, but they&#039;re not imagining it.&lt;/p&gt;
&lt;p&gt;The shift might come from users, not decision-makers. It might come when enough people notice that the fast, calm site was easier to use. That they actually found what they came for. That they didn&#039;t have to close three things before reading a single line.&lt;/p&gt;
&lt;p&gt;Maybe we plant the seed and wait.&lt;/p&gt;
&lt;p&gt;In the meantime, the chatbot is live. It sits in the corner of my client&#039;s homepage, blinking patiently. It doesn&#039;t know the opening hours. It doesn&#039;t know the prices. It doesn&#039;t really know anything.&lt;/p&gt;
&lt;p&gt;But it&#039;s there. Just like everyone else&#039;s.&lt;/p&gt;
&lt;p&gt;You encounter the same behaviour? &lt;a href=&quot;https://social.pollux.casa/@adele/statuses/01KKP6J908C2TB7TQR7EP8Y9HV&quot;&gt;Share it with me on the Fediverse&lt;/a&gt;&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/all-my-clients-wanted-a-carousel-now-it-s-an-ai-chatbot.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/all-my-clients-wanted-a-carousel-now-it-s-an-ai-chatbot.md</guid>
<pubDate>Sat, 14 Mar 2026 12:55:00 +0000</pubDate>
<modDate>Sat, 14 Mar 2026 12:55:42 +0000</modDate>
</item>
<item>
<title>Building your first smolweb page</title>
<description>&lt;h1&gt;Building your first smolweb page&lt;/h1&gt;
&lt;p&gt;2026-03-01 12:05&lt;/p&gt;
&lt;p&gt;A simple news article that takes ten seconds to load and eats 50 MB of data. You&#039;ve seen that. We all have. Mountains of JavaScript, giant CSS frameworks, third-party trackers, custom fonts pulled from remote servers... all of that to display a few paragraphs of text.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;smolweb&lt;/strong&gt; pushes back against that. The goal is to write small, clean, accessible HTML that works on any device, any browser, any screen, even without CSS or JavaScript. A smolwebsite should load on a smartphone from 2010, work in a text browser like Lynx, and be readable on a Braille display. Not because those are common cases, but because if your page works there, it works everywhere.&lt;/p&gt;
&lt;p&gt;This is a hands-on guide for building your first smolweb page. No framework, no build tool, no npm. A text editor and a browser are all you need.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The philosophy in a few lines&lt;/h2&gt;
&lt;p&gt;A smolwebsite has a few core rules. No element unless it adds real value. Structure comes from HTML, not from styles: the page must be readable without any CSS. JavaScript is allowed, but the page must remain usable without it. No external dependencies: no CDN, no Google Fonts, no remote scripts. Use the right HTML tag for the right content. Think less about visual style and more about discipline.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 1: the bare minimum&lt;/h2&gt;
&lt;p&gt;Create a file called &lt;code&gt;index.html&lt;/code&gt; and open it in your text editor:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;My smolwebsite&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;p&amp;gt;Hello, world!&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#039;s already a valid, working webpage. Here&#039;s what each line does.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;&lt;/strong&gt; tells the browser this is HTML5. It must always be the very first line.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;html lang=&quot;en&quot;&amp;gt;&lt;/code&gt;&lt;/strong&gt; is the root element. The &lt;code&gt;lang&lt;/code&gt; attribute matters: screen readers use it to pronounce content correctly, and search engines use it to understand what language your page is in. Use the &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes&quot;&gt;ISO 639-1 code&lt;/a&gt; for your language (&lt;code&gt;fr&lt;/code&gt;, &lt;code&gt;de&lt;/code&gt;, &lt;code&gt;es&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;charset=utf-8&lt;/code&gt;&lt;/strong&gt; prevents browsers from misinterpreting accented characters. UTF-8 covers every language and special character you will ever need. Always declare it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;viewport&lt;/code&gt;&lt;/strong&gt; is one line that makes your page usable on mobile. Without it, a smartphone will try to render your page as a shrunken desktop screen, which makes the text unreadably small.&lt;/p&gt;
&lt;p&gt;Open the file in your browser. It already works.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 2: filling the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section contains information &lt;em&gt;about&lt;/em&gt; your page, things the browser and search engines need but the reader does not see directly. Here is a complete one:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;head&amp;gt;
  &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&amp;gt;
  &amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;default-src &#039;self&#039;;&quot;&amp;gt;
  &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
  &amp;lt;meta name=&quot;color-scheme&quot; content=&quot;light dark&quot;&amp;gt;
  &amp;lt;meta name=&quot;description&quot; content=&quot;A page about my hobbies and projects.&quot;&amp;gt;
  &amp;lt;link href=&quot;/style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&amp;gt;
  &amp;lt;link rel=&quot;icon&quot; href=&quot;/favicon.ico&quot; type=&quot;image/x-icon&quot;&amp;gt;
  &amp;lt;link rel=&quot;icon&quot; href=&quot;/favicon.png&quot; type=&quot;image/png&quot;&amp;gt;
  &amp;lt;title&amp;gt;My smolwebsite&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Content-Security-Policy: default-src &#039;self&#039;&lt;/code&gt;&lt;/strong&gt; tells the browser to only load resources from your own server. No external fonts, no remote scripts, no third-party images. It is both a security header and a smolweb commitment in one. As a side effect, if you write &lt;code&gt;&amp;lt;p style=&quot;color:red&quot;&amp;gt;&lt;/code&gt; directly in your HTML, this header will block it. That is intentional. CSS belongs in a stylesheet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;color-scheme: light dark&lt;/code&gt;&lt;/strong&gt; respects whatever dark or light mode the user has set in their system. The browser will automatically adjust default colors for backgrounds, text, and form controls. Zero extra CSS needed.&lt;/p&gt;
&lt;p&gt;About the favicon: browsers look for &lt;code&gt;/favicon.ico&lt;/code&gt; on every page request, even when you have not provided one. That is a failed HTTP request on every page load. Provide a favicon once, it gets cached, and the problem disappears.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 3: semantic tags&lt;/h2&gt;
&lt;p&gt;HTML has a tag for every major part of a webpage. Using them correctly costs nothing and gains a lot: better accessibility, cleaner code, and a page that still makes sense when CSS is stripped away.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;body&amp;gt;

  &amp;lt;header&amp;gt;
    &amp;lt;strong&amp;gt;My smolwebsite&amp;lt;/strong&amp;gt;
    &amp;lt;nav&amp;gt;
      &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;index.html&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;about.html&quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href=&quot;contact.html&quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;/nav&amp;gt;
  &amp;lt;/header&amp;gt;

  &amp;lt;main&amp;gt;
    &amp;lt;article&amp;gt;
      &amp;lt;h1&amp;gt;My first post&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;This is the content of my first post.&amp;lt;/p&amp;gt;
    &amp;lt;/article&amp;gt;
    &amp;lt;aside&amp;gt;
      &amp;lt;p&amp;gt;Related: &amp;lt;a href=&quot;another-post.html&quot;&amp;gt;Another post&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/aside&amp;gt;
  &amp;lt;/main&amp;gt;

  &amp;lt;footer&amp;gt;
    &amp;lt;p&amp;gt;Published by me under &amp;lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&amp;gt;CC BY-SA&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
  &amp;lt;/footer&amp;gt;

&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is a quick reference:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tag&lt;/th&gt;
&lt;th&gt;Used for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Site name, logo, navigation at the top&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Links to other pages of your site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The main content, used once per page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A self-contained piece of content: a post, a story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Secondary content related to the main article&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Credits, license, bottom links&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Avoid scattering &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; everywhere. A &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; carries no meaning, it is just a box. If an appropriate semantic tag exists, use it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 4: a small stylesheet&lt;/h2&gt;
&lt;p&gt;Your page must remain readable without CSS, but a small stylesheet can still improve it. Here is one that stays within smolweb principles:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;/* style.css */

html {
  font-size: 100%;          /* Inherit the user&#039;s font size preference */
  font-family: sans-serif;  /* System default, no download required */
  max-width: 65ch;          /* Comfortable line length for reading */
  margin: 0 auto;
  padding: 1rem;
}

h1 { font-size: 2rem; }
h2 { font-size: 1.6rem; }
h3 { font-size: 1.2rem; }
small { font-size: 0.8rem; }

nav ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

nav ul li {
  display: inline-block;
  border-right: 1px solid black;
  padding: 2px 10px;
  margin: 0;
}

footer {
  border-top: 1px solid;
  margin-top: 2rem;
  padding-top: 1rem;
  font-size: 0.8rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A few things worth explaining here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;font-size: 100%&lt;/code&gt;&lt;/strong&gt; on the &lt;code&gt;html&lt;/code&gt; element inherits whatever font size the user has configured in their browser. A lot of people, particularly those with visual impairments, set it larger than the default. Writing &lt;code&gt;font-size: 16px&lt;/code&gt; overrides their choice. Using sizes in &lt;code&gt;rem&lt;/code&gt; units afterward keeps everything proportional to that base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;max-width: 65ch&lt;/code&gt;&lt;/strong&gt; keeps line lengths around 60 to 70 characters, which is generally considered the most comfortable range for reading.&lt;/p&gt;
&lt;p&gt;Skip &lt;code&gt;float&lt;/code&gt;. Floated elements force the browser to do extra layout work. Stacking blocks vertically is simpler and lighter.&lt;/p&gt;
&lt;p&gt;Skip web fonts entirely. The &lt;code&gt;sans-serif&lt;/code&gt; keyword maps to whatever font the user has set as their preferred one in their browser. It loads instantly and costs nothing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 5: things that will trip you up&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Inline styles&lt;/strong&gt; are blocked by your Content-Security-Policy header and break the separation between content and presentation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- avoid this --&amp;gt;
&amp;lt;p style=&quot;color: red; font-weight: bold;&quot;&amp;gt;Warning!&amp;lt;/p&amp;gt;

&amp;lt;!-- do this instead --&amp;gt;
&amp;lt;p class=&quot;warning&quot;&amp;gt;Warning!&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Misnested tags&lt;/strong&gt; cause browsers to guess what you meant, and they often guess wrong:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- wrong --&amp;gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;text&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt;

&amp;lt;!-- right --&amp;gt;
&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;text&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Tables are for data&lt;/strong&gt;, not for positioning parts of your page. If you are using a table to put your navigation next to your content, that is the wrong tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;External scripts and stylesheets&lt;/strong&gt; break the &lt;code&gt;default-src &#039;self&#039;&lt;/code&gt; policy and introduce a dependency on a server you do not control:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- wrong --&amp;gt;
&amp;lt;script src=&quot;https://cdn.example.com/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;!-- right --&amp;gt;
&amp;lt;script src=&quot;/js/myscript.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Missing &lt;code&gt;alt&lt;/code&gt; attributes on images&lt;/strong&gt; leave users with broken image icons and screen reader users with nothing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- wrong --&amp;gt;
&amp;lt;img src=&quot;photo.jpg&quot;&amp;gt;

&amp;lt;!-- right --&amp;gt;
&amp;lt;img src=&quot;photo.jpg&quot; alt=&quot;A sunset over the mountains in July 2024&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Step 6: before you publish&lt;/h2&gt;
&lt;p&gt;Two validators are worth running before putting your page online.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://validator.w3.org/nu/&quot;&gt;W3C validator&lt;/a&gt; checks that your HTML conforms to the standard. The &lt;a href=&quot;https://smolweb.org/validator/&quot;&gt;smolweb validator&lt;/a&gt; checks that you are staying within the smolweb HTML subset.&lt;/p&gt;
&lt;p&gt;Then do these four quick tests. Open your page in a regular browser. Disable CSS (in Firefox: View &amp;gt; Page Style &amp;gt; No Style) and check that the content is still readable and logically ordered. Try &lt;a href=&quot;https://lynx.invisible-island.net/&quot;&gt;Lynx&lt;/a&gt; or &lt;a href=&quot;https://w3m.sourceforge.net/&quot;&gt;w3m&lt;/a&gt; in a terminal if you have access to one: a text-only browser is about as demanding a test as you can run. Finally, resize your browser window down to a narrow width and see if the layout stays usable.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The complete template&lt;/h2&gt;
&lt;p&gt;Copy and adapt from here:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;default-src &#039;self&#039;;&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;meta name=&quot;color-scheme&quot; content=&quot;light dark&quot;&amp;gt;
    &amp;lt;meta name=&quot;description&quot; content=&quot;A short description of this page.&quot;&amp;gt;
    &amp;lt;link href=&quot;/style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;&amp;gt;
    &amp;lt;link rel=&quot;icon&quot; href=&quot;/favicon.ico&quot; type=&quot;image/x-icon&quot;&amp;gt;
    &amp;lt;link rel=&quot;icon&quot; href=&quot;/favicon.png&quot; type=&quot;image/png&quot;&amp;gt;
    &amp;lt;title&amp;gt;Page title - My smolwebsite&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;header&amp;gt;
      &amp;lt;strong&amp;gt;My smolwebsite&amp;lt;/strong&amp;gt;
      &amp;lt;nav&amp;gt;
        &amp;lt;ul&amp;gt;
          &amp;lt;li&amp;gt;&amp;lt;a href=&quot;index.html&quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;&amp;lt;a href=&quot;about.html&quot;&amp;gt;About&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;&amp;lt;a href=&quot;contact.html&quot;&amp;gt;Contact&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
      &amp;lt;/nav&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
      &amp;lt;article&amp;gt;
        &amp;lt;h1&amp;gt;My first post&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;Hello! This is my first smolweb page. It&#039;s small, fast, and works everywhere.&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;No framework, no tracker, no bloat. Just HTML.&amp;lt;/p&amp;gt;
      &amp;lt;/article&amp;gt;
    &amp;lt;/main&amp;gt;

    &amp;lt;footer&amp;gt;
      &amp;lt;p&amp;gt;Published by me under &amp;lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&amp;gt;CC BY-SA 4.0&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/footer&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;A few more things, once you are up and running&lt;/h2&gt;
&lt;p&gt;Consider adding an RSS feed. Smolweb readers tend to follow sites through RSS rather than social media, and it is not complicated to set up a basic XML file.&lt;/p&gt;
&lt;p&gt;Enable HTTPS if your host supports it. &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let&#039;s Encrypt&lt;/a&gt; provides free certificates. You can also use the &lt;code&gt;w.&lt;/code&gt; subdomain (like &lt;code&gt;w.yoursite.tld&lt;/code&gt; instead of &lt;code&gt;www.yoursite.tld&lt;/code&gt;) to signal that your site follows the smolweb guidelines.&lt;/p&gt;
&lt;p&gt;When you add images, optimize them before uploading and always write an &lt;code&gt;alt&lt;/code&gt; description. Better yet, ask yourself whether the image is necessary at all. Sometimes a sentence says more.&lt;/p&gt;
&lt;p&gt;The smolweb is not about building something ugly or retro. It is about building something that loads fast, respects its readers, and will still work ten years from now. Start with the template above, add only what you actually need, and keep it that way.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Further reading:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://smolweb.org&quot;&gt;smolweb.org&lt;/a&gt; - the official guidelines&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://htmlforpeople.com&quot;&gt;HTML for People&lt;/a&gt; - a gentle HTML introduction for beginners&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modernfontstacks.com&quot;&gt;Modern Font Stacks&lt;/a&gt; - system font combinations that look great everywhere&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiby.me&quot;&gt;Wiby&lt;/a&gt; - a search engine for small, simple websites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Discuss about this post &lt;a href=&quot;https://social.pollux.casa/@adele/statuses/01KJMMSNF6AR28Z6Q2HQE32SFF&quot;&gt;on the Fediverse&lt;/a&gt;&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/building-your-first-smolweb-page.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/building-your-first-smolweb-page.md</guid>
<pubDate>Sun, 01 Mar 2026 12:05:00 +0000</pubDate>
<modDate>Sun, 01 Mar 2026 15:11:36 +0000</modDate>
</item>
<item>
<title>fen2board for chess players</title>
<description>&lt;h1&gt;fen2board for chess players&lt;/h1&gt;
&lt;p&gt;2026-01-26 07:40&lt;/p&gt;
&lt;p&gt;A Python script to convert chess positions (FEN notation) and games (PGN format) into beautiful chessboard diagrams.&lt;/p&gt;
&lt;p&gt;Available on &lt;a href=&quot;https://codeberg.org/adele/fen2board&quot;&gt;codeberg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Supports multiple output formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terminal display&lt;/strong&gt; with Unicode chess pieces and ANSI colors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ASCII text&lt;/strong&gt; with monochrome or color modes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTF documents&lt;/strong&gt; with Chess Cases font or ASCII characters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perfect for creating printable chess study materials, generating game annotations, or displaying positions in the terminal.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FEN to diagram&lt;/strong&gt;: Convert any chess position to a visual board&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PGN to diagrams&lt;/strong&gt;: Generate diagrams for every move in a game&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple display modes&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;Unicode with ANSI colors (default terminal display)&lt;/li&gt;
&lt;li&gt;ASCII monochrome (&lt;code&gt;-am&lt;/code&gt;/&lt;code&gt;--ascii-monochrome&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ASCII with colors (&lt;code&gt;-ac&lt;/code&gt;/&lt;code&gt;--ascii-color&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Chess Cases font for professional RTF output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RTF export&lt;/strong&gt;: Generate professional documents with the Chess Cases font or ASCII art&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Board orientation&lt;/strong&gt;: View from White&#039;s or Black&#039;s perspective (&lt;code&gt;--black&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move filtering&lt;/strong&gt;: Display specific move ranges (&lt;code&gt;--start&lt;/code&gt;, &lt;code&gt;--end&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-game support&lt;/strong&gt;: Process PGN files with multiple games (hide variants)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.10 or higher&lt;/li&gt;
&lt;li&gt;For RTF output with Chess Cases: &lt;a href=&quot;https://www.dafont.com/chess-cases.font&quot;&gt;Chess Cases font&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;For ASCII RTF output: Microsoft Consolas font (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Clone or download the script
git clone https://codeberg.org/adele/fen2board.git
cd fen2board

# Make it executable (optional)
chmod +x fen2board.py&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;h3&gt;Display a position in the terminal&lt;/h3&gt;
&lt;h4&gt;Unicode display (default)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img/terminal-unicode-display.png&quot; alt=&quot;Terminal Unicode display&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;ASCII monochrome&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; -am
  +----------------+
8 |r n b q k b n r |
7 |p p p p p p p p |
6 |  =   =   =   = |
5 |=   =   =   =   |
4 |  =   =   =   = |
3 |=   =   =   =   |
2 |P P P P P P P P |
1 |R N B Q K B N R |
  +----------------+
   a b c d e f g h
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ASCII with colors&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; -ac&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img/terminal-ascii-color.png&quot; alt=&quot;ASCII color&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;View from Black&#039;s perspective&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; --black&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Process a PGN game&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Display all moves in terminal
python fen2board.py --pgn &quot;1. e4 e5 2. Nf3 Nc6 3. Bb5 a6&quot;

# Display moves 5-10 only
python fen2board.py --pgn &quot;...&quot; --start 5 --end 10

# Read PGN from stdin
cat mygame.pgn | python fen2board.py --pgn&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Generate RTF documents&lt;/h3&gt;
&lt;h4&gt;Chess Cases font font (default)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; -r output.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img/rtf-chess-cases.png&quot; alt=&quot;RTF with Chess Cases font&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;ASCII monochrome RTF&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; -am -r output.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img/rtf-ascii-mono.png&quot; alt=&quot;RTF ASCII Mono&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;ASCII color RTF&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1&quot; -ac -r output.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;img/rtf-ascii-color.png&quot; alt=&quot;RTF ASCII Color&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;PGN game to RTF with Chess Cases font&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py --pgn mygame.pgn -r analysis.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;PGN game to ASCII color RTF&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat mygame.pgn | python fen2board.py --pgn -ac -r analysis.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Command-line Options&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Short&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--black&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display board from Black&#039;s perspective&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--pgn [FILE]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p [FILE]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Process PGN game (use &lt;code&gt;-&lt;/code&gt; or omit for stdin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--start N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-s N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Starting move number (PGN only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--end N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-e N&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ending move number (PGN only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--format-rtf FILE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-r FILE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate RTF file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ascii-monochrome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-am&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use ASCII characters (monochrome)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ascii-color&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-ac&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use ASCII characters with ANSI colors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Display Modes&lt;/h2&gt;
&lt;h3&gt;Unicode Mode (Default)&lt;/h3&gt;
&lt;p&gt;Uses Unicode chess pieces (♔♕♖♗♘♙) with ANSI colors for terminal display. Best for modern terminals with Unicode support.&lt;/p&gt;
&lt;h3&gt;ASCII Monochrome (&lt;code&gt;-am&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Uses standard ASCII characters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pieces: &lt;code&gt;K Q R B N P&lt;/code&gt; (uppercase) and &lt;code&gt;k q r b n p&lt;/code&gt; (lowercase)&lt;/li&gt;
&lt;li&gt;Empty squares: space (light) and &lt;code&gt;=&lt;/code&gt; (dark)&lt;/li&gt;
&lt;li&gt;Portable, works in any terminal or text editor&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ASCII Color (&lt;code&gt;-ac&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Uses ASCII characters with ANSI color codes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pieces: &lt;code&gt;K Q R B N&lt;/code&gt; (uppercase), &lt;code&gt;o&lt;/code&gt; (pawns)&lt;/li&gt;
&lt;li&gt;Color distinguishes White (white text) from Black (black text)&lt;/li&gt;
&lt;li&gt;Background colors: gold (light squares), brown (dark squares)&lt;/li&gt;
&lt;li&gt;Same colors in console and RTF output&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Chess Cases Font (RTF)&lt;/h3&gt;
&lt;p&gt;Optimal output using the Chess Cases font. Requires the font to be installed. Generates publication-quality diagrams.&lt;/p&gt;
&lt;h2&gt;RTF Output Details&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Font sizes&lt;/strong&gt;: 14pt titles, 11pt text, 11pt Chess Cases boards, 10pt ASCII boards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pagination&lt;/strong&gt;: PGN meta data and starting position on page 1, then 2 complete moves (4 boards) per page&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headers&lt;/strong&gt;: Game information (Event, Players, Date, etc.) on first page&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move labels&lt;/strong&gt;: Include move numbers and piece icons (Chess Cases mode)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments&lt;/strong&gt;: PGN comments are included in italic&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;h3&gt;Tactic puzzle in terminal&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;python fen2board.py &quot;r3r1k1/ppp2ppp/2n5/3p2N1/N2P2n1/2P4P/PP1Bb1Pq/R3Q1K1 w - - 1 22&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Game analysis to RTF&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Create a professional game booklet
python fen2board.py --pgn mygame.pgn -r analysis.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Study material in ASCII&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Generate printable ASCII diagrams (compact, good for emails)
python fen2board.py --pgn study.pgn -am -r study.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Color diagrams for presentation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Beautiful colored ASCII diagrams
python fen2board.py --pgn game.pgn -ac -r presentation.rtf&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;This project is licensed under the GNU General Public License v3.0 - see the &lt;a href=&quot;LICENSE&quot;&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;
&lt;p&gt;By Adële - &lt;a href=&quot;https://adele.pages.casa&quot;&gt;adele.pages.casa&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Credits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chess Cases font&lt;/strong&gt; by Matthieu Leschemelle - &lt;a href=&quot;https://www.dafont.com/chess-cases.font&quot;&gt;https://www.dafont.com/chess-cases.font&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ANSI 256-color palette for terminal display&lt;/li&gt;
&lt;li&gt;Consolas font by Microsoft (used as fallback for ASCII RTF output)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Special thanks to the chess community for the PGN and FEN standards that make chess software interoperable.&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/fen2board-a-script-to-generate-chess-board.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/fen2board-a-script-to-generate-chess-board.md</guid>
<pubDate>Mon, 26 Jan 2026 07:40:00 +0000</pubDate>
<modDate>Mon, 26 Jan 2026 07:41:31 +0000</modDate>
</item>
<item>
<title>A mailbox for Christmas</title>
<description>&lt;h1&gt;A mailbox for Christmas&lt;/h1&gt;
&lt;p&gt;2025-12-18 09:45&lt;/p&gt;
&lt;p&gt;Christmas is often the time when geeks get bombarded with technical questions from their loved ones. Last year, I gave my opinion on Gmail accounts and was asked what alternative to use for email. I was a bit stumped for an answer: ProtonMail or Tuta? But they regularly encourage users to switch to their paid service and use their other services (VPN, drive, password vault, etc.). What&#039;s more, standard email clients are not compatible.&lt;/p&gt;
&lt;p&gt;That&#039;s what gave me the idea to offer &lt;a href=&quot;https://message.casa/&quot;&gt;message.casa&lt;/a&gt;, an email account (with an XMPP account) that is limited in size but free and complies with standard IMAP/POP3/SMTP protocols.&lt;/p&gt;
&lt;p&gt;So, if you too are asked about email accounts at Christmas, you can suggest &lt;a href=&quot;https://message.casa/&quot;&gt;message.casa&lt;/a&gt; ;-)&lt;/p&gt;
&lt;p&gt;Comment &lt;a href=&quot;https://social.pollux.casa/@adele/statuses/01KCRDCXFBF2RTMPYEBHQRSRC1&quot;&gt;on the fediverse&lt;/a&gt;&lt;/p&gt;</description>
<link>https://adele.pages.casa/md/blog/a-mailbox-for-christmas.md</link>
<guid isPermaLink="true">https://adele.pages.casa/md/blog/a-mailbox-for-christmas.md</guid>
<pubDate>Thu, 18 Dec 2025 09:45:00 +0000</pubDate>
<modDate>Thu, 18 Dec 2025 09:49:17 +0000</modDate>
</item>
</channel></rss>