<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><title>Fundor333</title><subtitle>Fundor 333's personal space on the web</subtitle><id>urn:uuid:43c22089-5c06-4cc4-8fd2-5b3563d5d257</id><updated>2026-10-18T11:43:46+02:00</updated><link href="https://fundor333.com/"/><link rel="self" type="application/atom+xml" href="https://fundor333.com/atom.xml"/><author><name>Fundor333</name><uri>https://fundor333.com/</uri></author><logo>https://fundor333.com/img/logo.png</logo><icon>https://fundor333.com/favicon-196x196.png</icon><webfeeds:icon>https://fundor333.com/favicon-196x196.png</webfeeds:icon><entry><title>Week Note Nº 42/2026</title><id>tag:fundor333.com,2026-10-18:/weeknotes/2026/42/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/42/"/><published>2026-10-18T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 42 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/42/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.wellappointeddesk.com/2026/10/dont-fix-whats-not-broken/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Don’t Fix What’s Not Broken! – The Well-Appointed Desk <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://colly.com/journal/coastal-exposure?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Simon Collison | Coastal exposure <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://jefftriplett.com/2026/moving-my-websites-from-jekyll-and-hugo-to-django/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Jeff Triplett <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>124</strong></li>
<li>Total anime watched time: <strong>783h 9m</strong></li>
<li>Total anime watched episodes: <strong>1900</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27696</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 41/2026</title><id>tag:fundor333.com,2026-10-11:/weeknotes/2026/41/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/41/"/><published>2026-10-11T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 41 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/41/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://nelson.cloud/you-can-hide-languages-from-githubs-languages-bar/?ref=rss&amp;utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">You Can Hide Languages From GitHub&rsquo;s Languages Bar | Nelson Figueroa <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://adamj.eu/tech/2026/10/08/django-test-suite-uv/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Django: set up its test suite with uv - Adam Johnson <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.andreagrandi.it/posts/claude-code-subagents-to-save-usage/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">How I use Claude Code subagents to make my Claude Pro limits last longer <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>124</strong></li>
<li>Total anime watched time: <strong>783h 9m</strong></li>
<li>Total anime watched episodes: <strong>1900</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27696</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 40/2026</title><id>tag:fundor333.com,2026-10-04:/weeknotes/2026/40/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/40/"/><published>2026-10-04T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 40 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/40/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://adamj.eu/tech/2026/10/02/django-app-links/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Django: serve apple-app-site-association and assetlinks.json - Adam Johnson <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://adamj.eu/tech/2026/09/30/zsh-n-glob-qualifier/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Zsh: sort globs in natural order with the (n) glob qualifier - Adam Johnson <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.tokyotimes.org/recently-taken-tokyo-people-and-places/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Recently taken Tokyo people and places — Tokyo Times <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://github.blog/open-source/git/highlights-from-git-2-56/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Highlights from Git 2.56 - The GitHub Blog <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/weeknotes/2026/40/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 40/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>122</strong></li>
<li>Total anime watched time: <strong>777h 33m</strong></li>
<li>Total anime watched episodes: <strong>1886</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27693</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 39/2026</title><id>tag:fundor333.com,2026-09-27:/weeknotes/2026/39/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/39/"/><published>2026-09-27T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 39 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/39/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://baty.net/posts/2026/09/almost-went-back-to-my-mac/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Almost went back to my Mac — baty.net <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://hamatti.org/posts/make-your-website-printable-a-short-guide/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Make your website printable - a short guide : Juha-Matti Santala <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://adamj.eu/tech/2026/09/21/zsh-ol-glob-qualifiers/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Zsh: find the largest files with the (OL) glob qualifier - Adam Johnson <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://sals.place/blog/re-coyote-org-mode/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Re: Org mode | Sal&rsquo;s <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://sals.place/blog/hello-from-thinkpad/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Hello from my new Thinkpad | Sal&rsquo;s <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://sals.place/blog/i3-instant-workspace-switching/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Instant workspace switching in Linux | Sal&rsquo;s <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://sals.place/blog/macos-spaces-addendum/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Addendum: macOS Spaces transition time | Sal&rsquo;s <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.rusingh.com/back-on-a-static-site/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Ru - Back on a static site?! <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://boffosocko.com/2026/09/16/what-is-the-prettiest-typewriter-typeface/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">What is the prettiest typewriter typeface? | Chris Aldrich <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/weeknotes/2026/39/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 39/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-ph-portfolio" class="group scroll-mt-20">
  <a href="#my-ph-portfolio" class="no-underline">
    My ph portfolio
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="http://matteoscarpa.it/homo-faber-2026/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Homo Faber 2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>122</strong></li>
<li>Total anime watched time: <strong>777h 9m</strong></li>
<li>Total anime watched episodes: <strong>1885</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27680</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Proxmox Homelab Base Stack: AdGuard DNS, Nginx Proxy Manager, and HTTPS Domains for Every Service</title><id>tag:fundor333.com,2026-09-27:/post/2026/proxmox-homelab-base-stack-adguard-dns-nginx-proxy-manager-and-https-domains-for-every-service/</id><link rel="alternate" href="https://fundor333.com/post/2026/proxmox-homelab-base-stack-adguard-dns-nginx-proxy-manager-and-https-domains-for-every-service/"/><published>2026-09-27T08:54:53+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="homelab"/><category term="proxmox"/><category term="nginx"/><category term="adguard"/><category term="nginx-proxy-manager"/><category term="adguard-dns"/><summary type="text">Starting with the HomeLab and the first config for my network</summary><content type="html" xml:base="https://fundor333.com/post/2026/proxmox-homelab-base-stack-adguard-dns-nginx-proxy-manager-and-https-domains-for-every-service/"><![CDATA[<p>And after some searching and some buying (and some exchange with sombody I know) I built my HomeLab core/main server.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>&ldquo;It&rdquo; is</p>
<ul>
<li>ZimaBoard2 <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
<li>2 WD Red Plus Internal NAS HDD 3.5 4 TB<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></li>
</ul>
<p>I set the HDD in Raid1 for replication and I install ProxMox VE as OS<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>. The installation software for the distro make the RAID1 for my HDDs.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="homelab.jpg" loading="lazy" alt="homelab.jpg"></figure><p>After some problem (I only have the TV as monitor and I don&rsquo;t have very long cable) I had a working HomeLab for start.</p>
<h2 id="the-start" class="group scroll-mt-20">
  <a href="#the-start" class="no-underline">
    The start
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>Now I all setup (the hardware) I connect it to my local lan and start to toy with ProxMox. First thing it don&rsquo;t have a custom domain&hellip; I have ProxMox on a ip and I don&rsquo;t like it. So I need to have a local DNS with a proxy and a domain (for a cert) and it need to work only in my local network. And I need to be all working after rebooting the system (if I have a energy problem) without man assistant.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="hard_reboot.png" loading="lazy" alt="1495 from xkcd"></figure><h2 id="the-npm-nginx-proxy-manager" class="group scroll-mt-20">
  <a href="#the-npm-nginx-proxy-manager" class="no-underline">
    The NPM: Nginx Proxy Manager
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>The fist software I install is a proxy for redirect an url into a ip+port. Why? Because all the service I build are expose as an ip+port and I don&rsquo;t want to learn a lot of ip, I want something more like &lsquo;rss.mydomain.com&rsquo; or &lsquo;proxmox.mydom.com&rsquo;.</p>
<p>So I start searching the script for the Nginx Proxy Manager in the Community scripts<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> and following the instruction I build the LXC container with NPM inside on my proxmox server.</p>
<p>After the install and the post install I wrote down the ip (and the port if isn&rsquo;t a standard one) and I choose my personal domain for the HomeLab.</p>
<p>For the one with short term memory (like me) at this point in time I have</p>
<ul>
<li>A router at 192.168.1.1</li>
<li>A ProxMox at 192.168.1.176:8006</li>
<li>A NPM at 192.168.1.209:81</li>
<li>A domain f333lab.com</li>
<li>A Cloudflare free account</li>
</ul>
<p>And I want</p>
<ul>
<li>ProxMox at prox.f333lab.com</li>
<li>NPM ar nginx.f333lab.com</li>
<li>All the service with HTTPS and cert</li>
</ul>
<p>So we start with the config for the NPM</p>
<h3 id="config-the-proxy" class="group scroll-mt-20">
  <a href="#config-the-proxy" class="no-underline">
    Config the proxy
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<p>I start config the NPM for the first:</p>
<ul>
<li>I added the domain in Cloudflare and take the api for edit that domain<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup></li>
<li>I added the domain in the Certificates tab (in the top menu of NPM) as
<ul>
<li>*.f333lab.com with Cloudflare as provider (here is where i put the api key)</li>
<li>f333lab.com with Cloudflare as provider (here is where i put the api key)</li>
</ul>
</li>
<li>I added nginx.f333lab.com as
<ul>
<li>Scheme as http</li>
<li>Forward 127.0.0.1</li>
<li>Port 81</li>
<li>Force SSL</li>
<li>SSL Certificate *.f333lab.com</li>
</ul>
</li>
</ul>
<p>Some explanation are needed.</p>
<h4 id="why-cloudflare" class="group scroll-mt-20">
  <a href="#why-cloudflare" class="no-underline">
    Why Cloudflare?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h4>
<p>I need to use Cloudflare for generating a cert without having my server expose to the wild web. With this I can have the https for all my service and with autorenew for the certs.</p>
<h4 id="why-two-certs-for-one-domain" class="group scroll-mt-20">
  <a href="#why-two-certs-for-one-domain" class="no-underline">
    Why two certs for one domain?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h4>
<p>I add two cert because:</p>
<ul>
<li>the main domain will be use for the dashboarb/hub for the link for all the service I host in my HomeLab</li>
<li>the * domain will be use for all the service (they will be all subdomain of the domain)</li>
</ul>
<h4 id="why-127001-and-not-1921681209-" class="group scroll-mt-20">
  <a href="#why-127001-and-not-1921681209-" class="no-underline">
    Why 127.0.0.1 and not 192.168.1.209 ?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h4>
<p>If I set 127.0.0.1 as forward ip I can change the ip of the LXC without edit anything else and will allways work.</p>
<h2 id="and-now-dns-time" class="group scroll-mt-20">
  <a href="#and-now-dns-time" class="no-underline">
    And now DNS time
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>After setting the proxy I need a local DNS. And if it has more (spam filter, malware/phishing blocker&hellip;) it can be a better choise.</p>
<p>After some searching I found Adguard<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup> and can be installed with a LXC script from the same repo/project as NPM.</p>
<p>After installing it we have</p>
<ul>
<li>A router at 192.168.1.1</li>
<li>A domain f333lab.com</li>
<li>ProxMox at prox.f333lab.com</li>
<li>NPM ar nginx.f333lab.com</li>
<li>Adguard installed at 192.168.1.129:80</li>
</ul>
<p>I want</p>
<ul>
<li>Adguard set as the DNS for my local network</li>
<li>Adguard at adguard.f333lab.com</li>
<li>All service *.f333lab.com manage by the DNS</li>
</ul>
<figure>
  <img class="center-img u-photo rounded-lg" src="google_dns.png" loading="lazy" alt="1361 from xkcd"></figure><h3 id="adguard-config" class="group scroll-mt-20">
  <a href="#adguard-config" class="no-underline">
    Adguard config
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<p>First I need to set the NPM and the router</p>
<ul>
<li>I added adguard.f333lab.com as
<ul>
<li>Scheme as http</li>
<li>Forward 192.168.1.129 or the domain of the NPM</li>
<li>Port 80</li>
<li>Force SSL</li>
<li>SSL Certificate *.f333lab.com</li>
</ul>
</li>
<li>Set in Adguard the alternative DNS with your favorites (in my case 8.8.8.8 and 1.1.1.1)</li>
<li>Set in the router the DNS as 192.168.1.129 with the MAC address you find in proxmox-network info for the LXC</li>
</ul>
<p>After some time for all the device in the network to update the DNS AdGuard will be your bottolneck and Holy DNS for your network.</p>
<p>If you want to add a &ldquo;local service&rdquo; as url you must:</p>
<ul>
<li>Set it in NPM (for example I set adguard.f333lab.com and nginx.f333lab.com in this post)</li>
<li>Add the cert in the NPM for the domain (is one of the step I did setting adguard.f333lab.com and nginx.f333lab.com in this post)</li>
<li>Add in the <strong>#dns_rewrites</strong> the domain you want forwarding to the NPM ip or the domain</li>
</ul>
<p>I also tinkering with the AdGuard setting for config some antispam and other security stuff for more security for my network.</p>
<h4 id="why-i-can-put-nginxf333labcom-in-place-of-the-domain" class="group scroll-mt-20">
  <a href="#why-i-can-put-nginxf333labcom-in-place-of-the-domain" class="no-underline">
    Why i can put nginx.f333lab.com in place of the domain?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h4>
<p>You can put it because all you need is forwarding the subdomain to the NPM/proxie. In my case I can use nginx.f333lab.com for all the case (not for nginx.f333lab.com itself) because it forword to the proxie</p>
<h2 id="and-now" class="group scroll-mt-20">
  <a href="#and-now" class="no-underline">
    And now?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>And now I have a HomeLab with what I consider a basic config for it working. Yes, I need more stuff like a backup system and other utility but for now I have a starter configuration and I will post more about in the future.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Searching for a name for the server. If you have one comment this post with it thanks.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Suggestion from a friend to have it as a main server. <a href="https://www.zimaspace.com/it/products/single-board2-server" target="_blank" rel="noopener" class="a-post">ZimaBoard2 <span aria-hidden="true">↗</span></a>
 will be the main server and controller for the all system (for now)&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>This specific HDD are for NAS or Server soo&hellip; I take what I can buy <a href="https://www.westerndigital.com//products/internal-drives/wd-red-plus-sata-3-5-hdd?sku=WD40EFZZ" target="_blank" rel="noopener" class="a-post">link <span aria-hidden="true">↗</span></a>
&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://pve.proxmox.com/wiki/Main_Page" target="_blank" rel="noopener" class="a-post">ProxMox VE <span aria-hidden="true">↗</span></a>
 is a Debian (❤️‍🔥) base distribution for manage virtualization.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><a href="https://community-scripts.org/" target="_blank" rel="noopener" class="a-post">Community-driven scripts for Proxmox VE and Incus <span aria-hidden="true">↗</span></a>
 — browse, install, and manage containers and VMs with a single command.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p><a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank" rel="noopener" class="a-post">Here <span aria-hidden="true">↗</span></a>
 the link for getting the token&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:7">
<p><a href="https://adguard.com" target="_blank" rel="noopener" class="a-post">Link <span aria-hidden="true">↗</span></a>
 of the official site of the software&#160;<a href="#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></entry><entry><title>Week Note Nº 38/2026</title><id>tag:fundor333.com,2026-09-20:/weeknotes/2026/38/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/38/"/><published>2026-09-20T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 38 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/38/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://thepenguinpost.substack.com/p/best-san-francisco-pen-show-ever?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Best San Francisco Pen Show Ever 2026 Edition <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://journalingdan.substack.com/p/stationery-shopping-in-tokyo?publication_id=2883538&amp;post_id=212702433&amp;isFreemail=true&amp;r=16odki&amp;utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Stationery Shopping in Tokyo - by Daniela - Journaling Dan <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://puvvadi.net/posts/self-hosting-adguard-home-the-ultimate-dns-privacy-guide/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Self-Hosting AdGuard Home: The Ultimate DNS Privacy Guide | KD&rsquo;s Blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.cynicalsignals.com/installing-portainer-in-a-proxmox-lxc/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Installing Portainer in a Proxmox LXC | CynicalSignals <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://bpaulino.com/entries/https-for-your-homelab/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">HTTPS for your homelab, at local network speeds — bpaulino.com <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://cubicgarden.com/2026/09/13/getting-hot-in-athens-my-first-full-drift-zero-mix/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Getting hot in Athens – My first full Drift zero mix – Cubicgarden.com… <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://shkspr.mobi/blog/2026/09/activitypub-how-to-send-an-updated-user-profile-to-mastodon-and-the-fediverse/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">ActivityPub – How to send an updated user profile to Mastodon and the Fediverse – Terence Eden’s Blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://boffosocko.com/2026/09/11/emotional-support-typewriter/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">| Chris Aldrich <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/micro/2026/09/hopelab-start/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Hopelab Start <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://fundor333.com/post/2026/how-i-m-building-my-first-home-lab-from-scratch-/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">How I Am Building My First Home Lab From Scratch <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://fundor333.com/weeknotes/2026/38/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 38/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>122</strong></li>
<li>Total anime watched time: <strong>777h 9m</strong></li>
<li>Total anime watched episodes: <strong>1885</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27675</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Hopelab Start</title><id>tag:fundor333.com,2026-09-17:/micro/2026/09/hopelab-start/</id><link rel="alternate" href="https://fundor333.com/micro/2026/09/hopelab-start/"/><published>2026-09-17T11:41:25+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><summary type="text">Starting my homelab expirience</summary><content type="html" xml:base="https://fundor333.com/micro/2026/09/hopelab-start/">&lt;p>And now I understand why all the homelabs&amp;rsquo; owner I kwon are sys-admin or similar role&lt;/p>
</content></entry><entry><title>How I Am Building My First Home Lab From Scratch</title><id>tag:fundor333.com,2026-09-14:/post/2026/how-i-m-building-my-first-home-lab-from-scratch-/</id><link rel="alternate" href="https://fundor333.com/post/2026/how-i-m-building-my-first-home-lab-from-scratch-/"/><published>2026-09-14T13:32:09+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="homelab"/><category term="selfhosting"/><category term="hacking"/><summary type="text">Follow my journey as I build my first home lab from scratch. Discover the hardware I chose, the software I'm running, and why every developer needs one.</summary><content type="html" xml:base="https://fundor333.com/post/2026/how-i-m-building-my-first-home-lab-from-scratch-/"><![CDATA[<p>It is some time I am tinking of selfhosting some stuff and more and more time I read post/see video about HomeLabs. So I start thinking about making one.</p>
<p>So what is a HomeLab?</p>
<blockquote>
<p>A homelab is a self-contained IT environment that you design and control. It usually includes basic infrastructure like compute, storage, and networking, along with a hypervisor or virtualization layer (container). Some setups are modest and run on a single machine, while others resemble mini datacenters with multiple nodes and a shared storage such as SAN or NAS.</p>
<p><a href="https://stormagic.com/company/blog/what-is-homelab/" target="_blank" rel="noopener" class="a-post">StorMagic - What Is a Homelab and Why Is It Important? <span aria-hidden="true">↗</span></a>
</p>
</blockquote>
<p>So you can make a HomeLab with everything you havbe home, like an old pc or an potato-server.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="potato-server.gif" loading="lazy" alt="potato-server"></figure><p>In my case I am thinging to buy/recicling:</p>
<ul>
<li>A low powered PC</li>
<li>Some LARGE storage (SD? HDD?)</li>
<li>Cables</li>
</ul>
<p>At the time of the writing I don&rsquo;t buy anything for the project but I am planing to buy some things&hellip;</p>
<h2 id="what-i-want-to-run-on-it" class="group scroll-mt-20">
  <a href="#what-i-want-to-run-on-it" class="no-underline">
    What I want to run on it?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>First thing: what I want to have as a service on my HomeLab?</p>
<ul>
<li>Feed reader: I read a lot of feed from the web</li>
<li>Hosting for photo raw</li>
<li>Tracking for books</li>
<li>Tracking for anime/tv series/movies</li>
<li>Tracking for manga</li>
<li>Ad-Block for all the network</li>
<li>An eBook manager library, if I can a software where can I add book on the fly with the WiFi, no cable</li>
<li>Some home assistant/home automation</li>
</ul>
<p>I thing this is all I need as a start. But searching online I found that it will be something problematic with only this stuff. I need to add more software/network tools.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="fire.gif" loading="lazy" alt="fire"></figure><h2 id="so-what-i-need-to-add" class="group scroll-mt-20">
  <a href="#so-what-i-need-to-add" class="no-underline">
    So what I need to add?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li>A domain name: real or not<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
</ul>
<ul>
<li>A local DNS for the domain</li>
<li>A private Certificate Authority or automated reverse proxies for the local domain</li>
<li>A tool for manage and deploy Docker or other type of container on the network</li>
<li>A tool for backup</li>
<li>A centralize authentication system for the app and the server/servers</li>
<li>A dashboard as Home so I can go too every system</li>
<li>A local documentation for personale use</li>
</ul>
<p>If I not have all of this stuff the HomeLav will become something difficult to setup, mantain and manage.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="pc-trash.gif" loading="lazy" alt="pc-trash"></figure><h2 id="so-what-now" class="group scroll-mt-20">
  <a href="#so-what-now" class="no-underline">
    So what now?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>And now I am reasearching for the config, waiting for the parts, looking for the software and reading post and watching video about how to set up a HomeLab in my home (like where to put it). And I want to write more post about my homelab in the next future but it will be possible only when I have some hardware for build it. Ok I have some hardware for testing but I prefer to build it with the &ldquo;final&rdquo; hardware not the temp one.</p>
<p>The next post will be about how I set up all the things but It will not be a tutorial, it will be more like a diary about testing. At the end of all I will post some tutorial or, if I find something specific or something I find curiosus.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Real is a domain I bought, not real is a domain I create for my network without any real registry involved&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></entry><entry><title>Week Note Nº 37/2026</title><id>tag:fundor333.com,2026-09-13:/weeknotes/2026/37/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/37/"/><published>2026-09-13T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 37 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/37/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.tokyotimes.org/a-collection-of-old-japanese-coca-cola-signs/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">A collection of old Japanese Coca-Cola signs — Tokyo Times <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 36/2026</title><id>tag:fundor333.com,2026-09-06:/weeknotes/2026/36/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/36/"/><published>2026-09-06T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 36 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/36/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.tokyotimes.org/tokyo-street-photography-moments/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Tokyo street photography moments — Tokyo Times <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.steele.blue/microlighter/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">https://www.steele.blue/microlighter/ <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 35/2026</title><id>tag:fundor333.com,2026-08-30:/weeknotes/2026/35/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/35/"/><published>2026-08-30T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 35 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/35/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://hamatti.org/posts/u-is-for-uv-python-a-to-z/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">U is for uv - Python A to Z : Juha-Matti Santala <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.splitbrain.org/blog/2026-08/10-my_new_favorite_terminal?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">My new favorite Terminal [splitbrain.org] <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://jamesg.blog/2026/08/19/organising-my-blog-categories?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Organising my blog categories - with words, wonder <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://birchtree.me/blog/subscriber-rot/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Subscriber rot <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/photos/2026/red-metro/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Red Metro <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://fundor333.com/post/2026/moving-to-django-6-x/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Moving to Django 6.X <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Red Metro</title><id>tag:fundor333.com,2026-08-28:/photos/2026/red-metro/</id><link rel="alternate" href="https://fundor333.com/photos/2026/red-metro/"/><published>2026-08-28T02:30:55+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><content type="html" xml:base="https://fundor333.com/photos/2026/red-metro/">&lt;p>A little red metro sign from Paris. I love this estetic and I need to go there with a better camera and take a lot of pic every where.&lt;/p>
</content></entry><entry><title>Moving to Django 6.X</title><id>tag:fundor333.com,2026-08-24:/post/2026/moving-to-django-6-x/</id><link rel="alternate" href="https://fundor333.com/post/2026/moving-to-django-6-x/"/><published>2026-08-24T21:41:59+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="django"/><category term="python"/><summary type="text">Why I upgrade to Django 6.x and why I need it now</summary><content type="html" xml:base="https://fundor333.com/post/2026/moving-to-django-6-x/"><![CDATA[<p>A long time ago I start my personal server in Django (a lot of the stuff from <a href="/series/django-tricks/" class="a-post">Django tricks</a>
 were coded for my personal Django stuff) and some days ago I decide to upgrade to 6.1 or more. Why?</p>
<h2 id="new-things-in-60-and-61" class="group scroll-mt-20">
  <a href="#new-things-in-60-and-61" class="no-underline">
    New things in 6.0 and 6.1
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>The main thing in Django 6.0 is the <a href="https://docs.djangoproject.com/en/6.1/topics/tasks/" target="_blank" rel="noopener" class="a-post">Django Tasks Frameworks <span aria-hidden="true">↗</span></a>
.
Having a unique framework for the async task is a beautifull thing and made me clean a lot of code and make it more pythonic in multiple way.</p>
<p>I update my code for the Task Framework because I need it (I was using a Redis integration) but I want to change the backend without edit all my code so this is the best way to do it because the Django integration for multiple backend are easy to implement and update if needed.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<figure>
  <img class="center-img u-photo rounded-lg" src="Charlie_Chaplin_GIF_by_Coolidge_Corner_Theatre.gif" loading="lazy" alt="Modern Time Gif"></figure><p>I also love the new <a href="https://docs.djangoproject.com/en/6.1/releases/6.1/#model-field-fetch-modes" target="_blank" rel="noopener" class="a-post">Model Field Fetch Modes <span aria-hidden="true">↗</span></a>
. This is cleaner that my abuse of <em>prefetch_related</em> and add the FETCH_RAISE which raise error if you fetch data in the wrong section of your code. I don&rsquo;t know if the last one is usefull for me but I do understand the needed for this.</p>
<p>The last thing I was waiting in Django are the <a href="https://docs.djangoproject.com/en/6.1/ref/templates/language/#template-partials" target="_blank" rel="noopener" class="a-post">Template Partials <span aria-hidden="true">↗</span></a>
. I use something similar a lot on GoHugo for this blog and I understand how a Django module can use it and why I want something so simple but also so usefull for not duplicate code in the frontend.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="CatCodingGIF.gif" loading="lazy" alt="CatCoder"></figure><p>I also know that the template partials are usefull BUT aren&rsquo;t Htmx<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> so you can mixit with the Template Partials to make easyer manage your frontend and backend.</p>
<p>I also thing that the deprecation of PostgreSQL 14 is needed and can fix some vulnerability of my Django project.</p>
<h2 id="so-do-i-upgrade-without-problem" class="group scroll-mt-20">
  <a href="#so-do-i-upgrade-without-problem" class="no-underline">
    So do I upgrade without problem?
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>Yes, I haven&rsquo;t got any problem with the upgrade and the migration (PostgreSql14 was my db&hellip; Now I upgrade it a lot&hellip;) and all my dipendency are updated too&hellip;</p>
<p>In the end I am happy of the upgrade. I have less query in the db (I did a lot of not well optimize query) and the cleaner task code is a god sent for update or debugging. Ok I need to debug an async code (same problem of all the async code) but now I have a larger community for answer (yes, I can ask to an AI but I find a lot of the answer inside other blog or StackOverflow so, I can not use an AI, I don&rsquo;t uset it) than than the old module I was using.</p>
<p>Do you upgrade or do you wait more time for the upgrade?</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I am using <a href="https://github.com/tokibito/django-tasks-redis" target="_blank" rel="noopener" class="a-post">django-tasks-redis <span aria-hidden="true">↗</span></a>
 as the backend&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Another blog post about Django and Htmx <a href="/post/2026/django-table-filter-export-with-htmx/" class="a-post">Django Table, Filter and Export With Htmx</a>
&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></entry><entry><title>Week Note Nº 34/2026</title><id>tag:fundor333.com,2026-08-23:/weeknotes/2026/34/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/34/"/><published>2026-08-23T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 34 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/34/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://guy-evans.com/posts/2024-10-11_publishing-my-website-with-hugo-caddy-and-github-actions/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Hugo, Caddy and Github actions to publish my website - Guy Evans <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.rubenerd.au/answering-hacker-news-motherboards-on-shelves/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Rubenerd: Answering Hacker News: Retro motherboard rack <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://endler.dev/2026/github-was-never-about-the-source-code/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">GitHub Was Never About the Source Code | Matthias Endler <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/post/2026/framing-photos-with-python/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Framing Photos With Python <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Framing Photos With Python</title><id>tag:fundor333.com,2026-08-20:/post/2026/framing-photos-with-python/</id><link rel="alternate" href="https://fundor333.com/post/2026/framing-photos-with-python/"/><published>2026-08-20T21:00:09+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="python"/><category term="automation"/><summary type="text">How to frame your photos with python with all the data you want</summary><content type="html" xml:base="https://fundor333.com/post/2026/framing-photos-with-python/"><![CDATA[<p>Some time ago I decide to make a photo exhibition in my city and, before doing it, I make some research of what I need to do.
So I made the photo exhibition with some errors here and there but I love it.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<figure>
  <img class="center-img u-photo rounded-lg" src="mr_bean.gif" loading="lazy" alt="MRBean gif"></figure><p>So I find a lot of photographeres having a white or black framing of the pic<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> so I do it while printing (read as the source file has not framing but he printed one has one) but I want to have the source file with a frame and some info about the pic. So I search the web for something usefull.</p>
<h2 id="what-i-need-and-want" class="group scroll-mt-20">
  <a href="#what-i-need-and-want" class="no-underline">
    What I need and want
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>I have this pic and I want to add the frame and some text under the pic but inside the frame.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="original.jpg" loading="lazy" alt="original"></figure><p>For a pic like this I want info inside the frame:</p>
<ul>
<li>Camera info (camera model and companyß I taked the pic)</li>
<li>Lens info (lens model and company)</li>
<li>Camera and lens settings (aperture, iso, framerate )</li>
<li>Camera and Lens info need to be clear and not a string of serial code</li>
<li>The text under the pic is easy to read and don&rsquo;t take attention from the pic</li>
<li>Must look professional</li>
<li>I need to elaborate single picture but having also a directory mode is a good thing.</li>
</ul>
<h2 id="first-solution-make-yourself-with-photoshop-or-similar" class="group scroll-mt-20">
  <a href="#first-solution-make-yourself-with-photoshop-or-similar" class="no-underline">
    First solution: make yourself with Photoshop or similar
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>First thing I fount are tutorial for Photoshop or other tool for this result. I hate this solution and it isn&rsquo;t batch ready.
I also find this method slow and prone to make me angry or paranoic about errors.</p>
<h2 id="second-solution-web-page-with-a-tool" class="group scroll-mt-20">
  <a href="#second-solution-web-page-with-a-tool" class="no-underline">
    Second solution: web page with a tool
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>After more searching I found some <a href="https://benrilab.com/en/app/exif-styler/" target="_blank" rel="noopener" class="a-post">external tool <span aria-hidden="true">↗</span></a>
. It generates a good framing for the pic but has something I didn&rsquo;t like.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="framed-external-tool.jpg" loading="lazy" alt="framed-external-tool"></figure><p>This is a online tool and I don&rsquo;t like to upload the photos and has some limit/problem when you upload big or a lot photos at the same time. And this is not a problem for a single site but a limitation you need to have for all the free tools.</p>
<h2 id="the-best-solution-coding" class="group scroll-mt-20">
  <a href="#the-best-solution-coding" class="no-underline">
    The best solution: coding
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<p>So in the end I wrote this little script:</p>
<ul>
<li>set the font and fit its size</li>
<li>get the exif data (the lens, camera, &hellip;)</li>
<li>add the frame</li>
<li>add the text if present</li>
<li>use click for having a interactive cli for getting the input needed</li>
</ul>
<p>with this packages as dipendency</p>
<div class="highlight not-prose"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install pillow piexif click</span></span></code></pre></div>
<p>and the final code is this</p>
<div class="highlight not-prose"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span><span class="p">,</span> <span class="n">ImageDraw</span><span class="p">,</span> <span class="n">ImageFont</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">piexif</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">click</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">FONT_DIR</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)),</span> <span class="s2">&#34;fonts&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">BUNDLED_FONT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">FONT_DIR</span><span class="p">,</span> <span class="s2">&#34;Montserrat-Variable.ttf&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">FALLBACK_FONTS</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;/System/Library/Fonts/Avenir Next.ttc&#34;</span><span class="p">,</span>  <span class="c1"># macOS</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;/System/Library/Fonts/HelveticaNeue.ttc&#34;</span><span class="p">,</span>  <span class="c1"># macOS</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf&#34;</span><span class="p">,</span>  <span class="c1"># Linux</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf&#34;</span><span class="p">,</span>  <span class="c1"># Linux</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;C:</span><span class="se">\\</span><span class="s2">Windows</span><span class="se">\\</span><span class="s2">Fonts</span><span class="se">\\</span><span class="s2">segoeui.ttf&#34;</span><span class="p">,</span>  <span class="c1"># Windows</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;arial.ttf&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">CAMERA_WEIGHT</span> <span class="o">=</span> <span class="mi">600</span>
</span></span><span class="line"><span class="cl"><span class="n">CONFIG_WEIGHT</span> <span class="o">=</span> <span class="mi">400</span>
</span></span><span class="line"><span class="cl"><span class="n">CONFIG_SIZE_RATIO</span> <span class="o">=</span> <span class="mf">0.85</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_font</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">weight</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Load a font for the shot info, falling back to elegant alternatives.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">font</span> <span class="o">=</span> <span class="n">ImageFont</span><span class="o">.</span><span class="n">truetype</span><span class="p">(</span><span class="n">BUNDLED_FONT</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">font</span><span class="o">.</span><span class="n">set_variation_by_axes</span><span class="p">([</span><span class="n">weight</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">font</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">pass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">FALLBACK_FONTS</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="n">ImageFont</span><span class="o">.</span><span class="n">truetype</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">except</span> <span class="p">(</span><span class="ne">IOError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="k">continue</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ImageFont</span><span class="o">.</span><span class="n">load_default</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">fit_font</span><span class="p">(</span><span class="n">draw</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">weight</span><span class="p">,</span> <span class="n">max_width</span><span class="p">,</span> <span class="n">min_size</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Shrink the font size until the text fits within max_width.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">font</span> <span class="o">=</span> <span class="n">load_font</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">weight</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">text</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">font</span>
</span></span><span class="line"><span class="cl">    <span class="n">text_width</span> <span class="o">=</span> <span class="n">draw</span><span class="o">.</span><span class="n">textlength</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="n">font</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">text_width</span> <span class="o">&lt;=</span> <span class="n">max_width</span> <span class="ow">or</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="n">min_size</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">font</span>
</span></span><span class="line"><span class="cl">    <span class="n">smaller_size</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">min_size</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">size</span> <span class="o">*</span> <span class="n">max_width</span> <span class="o">/</span> <span class="n">text_width</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">load_font</span><span class="p">(</span><span class="n">smaller_size</span><span class="p">,</span> <span class="n">weight</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_exif_data</span><span class="p">(</span><span class="n">image_path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Extract the main EXIF shot data from the image.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">exif_data</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;make&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;lens&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;fstop&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;shutter&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;iso&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;focal&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">exif_dict</span> <span class="o">=</span> <span class="n">piexif</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">image_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># Camera</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="s2">&#34;0th&#34;</span> <span class="ow">in</span> <span class="n">exif_dict</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">ifd0</span> <span class="o">=</span> <span class="n">exif_dict</span><span class="p">[</span><span class="s2">&#34;0th&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ImageIFD</span><span class="o">.</span><span class="n">Make</span> <span class="ow">in</span> <span class="n">ifd0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;make&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ifd0</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ImageIFD</span><span class="o">.</span><span class="n">Make</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;utf-8&#34;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&#34;ignore&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ImageIFD</span><span class="o">.</span><span class="n">Model</span> <span class="ow">in</span> <span class="n">ifd0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;model&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">ifd0</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ImageIFD</span><span class="o">.</span><span class="n">Model</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;utf-8&#34;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&#34;ignore&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="s2">&#34;Exif&#34;</span> <span class="ow">in</span> <span class="n">exif_dict</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">exif</span> <span class="o">=</span> <span class="n">exif_dict</span><span class="p">[</span><span class="s2">&#34;Exif&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># Lens</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">LensModel</span> <span class="ow">in</span> <span class="n">exif</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;lens&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">exif</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">LensModel</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                    <span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;utf-8&#34;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&#34;ignore&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                    <span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1"># Aperture (F-Number)</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">FNumber</span> <span class="ow">in</span> <span class="n">exif</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">fnum</span> <span class="o">=</span> <span class="n">exif</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">FNumber</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fnum</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">fnum</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;fstop&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;f/</span><span class="si">{</span><span class="n">fnum</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">fnum</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1"># Shutter Speed</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">ExposureTime</span> <span class="ow">in</span> <span class="n">exif</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">exp</span> <span class="o">=</span> <span class="n">exif</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">ExposureTime</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">exp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="n">exp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">exp</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">                        <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;shutter&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="nb">int</span><span class="p">(</span><span class="n">exp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">exp</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="si">}</span><span class="s2">s&#34;</span>
</span></span><span class="line"><span class="cl">                    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                        <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;shutter&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">exp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">exp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">s&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1"># ISO</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">ISOSpeedRatings</span> <span class="ow">in</span> <span class="n">exif</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;iso&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;ISO </span><span class="si">{</span><span class="n">exif</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">ISOSpeedRatings</span><span class="p">]</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1"># Focal Length</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">FocalLength</span> <span class="ow">in</span> <span class="n">exif</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">focal</span> <span class="o">=</span> <span class="n">exif</span><span class="p">[</span><span class="n">piexif</span><span class="o">.</span><span class="n">ExifIFD</span><span class="o">.</span><span class="n">FocalLength</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">focal</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)</span> <span class="ow">and</span> <span class="n">focal</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">exif_data</span><span class="p">[</span><span class="s2">&#34;focal&#34;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="nb">int</span><span class="p">(</span><span class="n">focal</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">focal</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="si">}</span><span class="s2">mm&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Silent if there is no EXIF data, fields remain empty</span>
</span></span><span class="line"><span class="cl">        <span class="k">pass</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">exif_data</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">build_camera_label</span><span class="p">(</span><span class="n">make</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Combine make and model while avoiding duplication (e.g. &#39;Canon EOS R5&#39;).&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">make</span> <span class="o">=</span> <span class="n">make</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">model</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">model</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">make</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="n">make</span> <span class="ow">or</span> <span class="n">model</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">make</span><span class="o">.</span><span class="n">lower</span><span class="p">()):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">model</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">make</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">model</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">process_single_image</span><span class="p">(</span><span class="n">image_path</span><span class="p">,</span> <span class="n">output_path</span><span class="p">,</span> <span class="n">border_size_pct</span><span class="p">,</span> <span class="n">bottom_border_pct</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Add the white border and EXIF data to a single image.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Returns &#34;ok&#34;, &#34;skipped&#34; (no EXIF data) or &#34;error&#34;.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">img</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">image_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">img</span><span class="o">.</span><span class="n">mode</span> <span class="o">!=</span> <span class="s2">&#34;RGB&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">img</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">convert</span><span class="p">(</span><span class="s2">&#34;RGB&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Error opening </span><span class="si">{</span><span class="n">image_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="s2">&#34;error&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">exif</span> <span class="o">=</span> <span class="n">get_exif_data</span><span class="p">(</span><span class="n">image_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">exif</span><span class="o">.</span><span class="n">values</span><span class="p">()):</span>
</span></span><span class="line"><span class="cl">        <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;No EXIF data found, skipping: </span><span class="si">{</span><span class="n">image_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="s2">&#34;skipped&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">width</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="n">img</span><span class="o">.</span><span class="n">size</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Compute border size in pixels</span>
</span></span><span class="line"><span class="cl">    <span class="n">border_px</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span> <span class="o">*</span> <span class="n">border_size_pct</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">bottom_px</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span> <span class="o">*</span> <span class="n">bottom_border_pct</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># New overall dimensions</span>
</span></span><span class="line"><span class="cl">    <span class="n">new_width</span> <span class="o">=</span> <span class="n">width</span> <span class="o">+</span> <span class="p">(</span><span class="n">border_px</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">new_height</span> <span class="o">=</span> <span class="n">height</span> <span class="o">+</span> <span class="n">border_px</span> <span class="o">+</span> <span class="n">bottom_px</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Create the white canvas</span>
</span></span><span class="line"><span class="cl">    <span class="n">canvas</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&#34;RGB&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">new_width</span><span class="p">,</span> <span class="n">new_height</span><span class="p">),</span> <span class="s2">&#34;white&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">canvas</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="p">(</span><span class="n">border_px</span><span class="p">,</span> <span class="n">border_px</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Build the text strings: make/model (+ lens) on the left, config on the right</span>
</span></span><span class="line"><span class="cl">    <span class="n">camera_parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">build_camera_label</span><span class="p">(</span><span class="n">exif</span><span class="p">[</span><span class="s2">&#34;make&#34;</span><span class="p">],</span> <span class="n">exif</span><span class="p">[</span><span class="s2">&#34;model&#34;</span><span class="p">]),</span> <span class="n">exif</span><span class="p">[</span><span class="s2">&#34;lens&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="n">camera_text</span> <span class="o">=</span> <span class="s2">&#34; - &#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">camera_parts</span> <span class="k">if</span> <span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">config_parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">exif</span><span class="p">[</span><span class="s2">&#34;focal&#34;</span><span class="p">],</span> <span class="n">exif</span><span class="p">[</span><span class="s2">&#34;fstop&#34;</span><span class="p">],</span> <span class="n">exif</span><span class="p">[</span><span class="s2">&#34;shutter&#34;</span><span class="p">],</span> <span class="n">exif</span><span class="p">[</span><span class="s2">&#34;iso&#34;</span><span class="p">]]</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_text</span> <span class="o">=</span> <span class="s2">&#34; - &#34;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">config_parts</span> <span class="k">if</span> <span class="n">p</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">draw</span> <span class="o">=</span> <span class="n">ImageDraw</span><span class="o">.</span><span class="n">Draw</span><span class="p">(</span><span class="n">canvas</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">font_size</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">bottom_px</span> <span class="o">*</span> <span class="mf">0.32</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_size</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">font_size</span> <span class="o">*</span> <span class="n">CONFIG_SIZE_RATIO</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">available_width</span> <span class="o">=</span> <span class="n">new_width</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">border_px</span>
</span></span><span class="line"><span class="cl">    <span class="n">gap</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">bottom_px</span> <span class="o">*</span> <span class="mf">0.2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">camera_font</span> <span class="o">=</span> <span class="n">load_font</span><span class="p">(</span><span class="n">font_size</span><span class="p">,</span> <span class="n">CAMERA_WEIGHT</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_font</span> <span class="o">=</span> <span class="n">load_font</span><span class="p">(</span><span class="n">config_size</span><span class="p">,</span> <span class="n">CONFIG_WEIGHT</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">camera_w</span> <span class="o">=</span> <span class="n">draw</span><span class="o">.</span><span class="n">textlength</span><span class="p">(</span><span class="n">camera_text</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="n">camera_font</span><span class="p">)</span> <span class="k">if</span> <span class="n">camera_text</span> <span class="k">else</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_w</span> <span class="o">=</span> <span class="n">draw</span><span class="o">.</span><span class="n">textlength</span><span class="p">(</span><span class="n">config_text</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="n">config_font</span><span class="p">)</span> <span class="k">if</span> <span class="n">config_text</span> <span class="k">else</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">x_left</span> <span class="o">=</span> <span class="n">border_px</span>
</span></span><span class="line"><span class="cl">    <span class="n">x_right</span> <span class="o">=</span> <span class="n">new_width</span> <span class="o">-</span> <span class="n">border_px</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">camera_text</span> <span class="ow">and</span> <span class="n">config_text</span> <span class="ow">and</span> <span class="n">camera_w</span> <span class="o">+</span> <span class="n">gap</span> <span class="o">+</span> <span class="n">config_w</span> <span class="o">&gt;</span> <span class="n">available_width</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># Don&#39;t fit side by side: stack them on two lines to avoid overlap</span>
</span></span><span class="line"><span class="cl">        <span class="n">camera_font</span> <span class="o">=</span> <span class="n">fit_font</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">draw</span><span class="p">,</span> <span class="n">camera_text</span><span class="p">,</span> <span class="n">font_size</span><span class="p">,</span> <span class="n">CAMERA_WEIGHT</span><span class="p">,</span> <span class="n">available_width</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">config_font</span> <span class="o">=</span> <span class="n">fit_font</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="n">draw</span><span class="p">,</span> <span class="n">config_text</span><span class="p">,</span> <span class="n">config_size</span><span class="p">,</span> <span class="n">CONFIG_WEIGHT</span><span class="p">,</span> <span class="n">available_width</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">y_top</span> <span class="o">=</span> <span class="n">height</span> <span class="o">+</span> <span class="n">border_px</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">bottom_px</span> <span class="o">*</span> <span class="mf">0.35</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">y_bottom</span> <span class="o">=</span> <span class="n">height</span> <span class="o">+</span> <span class="n">border_px</span> <span class="o">+</span> <span class="nb">int</span><span class="p">(</span><span class="n">bottom_px</span> <span class="o">*</span> <span class="mf">0.7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">draw</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="p">(</span><span class="n">x_left</span><span class="p">,</span> <span class="n">y_top</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">camera_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">fill</span><span class="o">=</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">font</span><span class="o">=</span><span class="n">camera_font</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">anchor</span><span class="o">=</span><span class="s2">&#34;lm&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">draw</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="p">(</span><span class="n">x_left</span><span class="p">,</span> <span class="n">y_bottom</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">config_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">fill</span><span class="o">=</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">            <span class="n">font</span><span class="o">=</span><span class="n">config_font</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="n">anchor</span><span class="o">=</span><span class="s2">&#34;lm&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">y_center</span> <span class="o">=</span> <span class="n">height</span> <span class="o">+</span> <span class="n">border_px</span> <span class="o">+</span> <span class="n">bottom_px</span> <span class="o">//</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">camera_text</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">draw</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="p">(</span><span class="n">x_left</span><span class="p">,</span> <span class="n">y_center</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="n">camera_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">fill</span><span class="o">=</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">30</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="n">font</span><span class="o">=</span><span class="n">camera_font</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">anchor</span><span class="o">=</span><span class="s2">&#34;lm&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">config_text</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">draw</span><span class="o">.</span><span class="n">text</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                <span class="p">(</span><span class="n">x_right</span><span class="p">,</span> <span class="n">y_center</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="n">config_text</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">fill</span><span class="o">=</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">                <span class="n">font</span><span class="o">=</span><span class="n">config_font</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="n">anchor</span><span class="o">=</span><span class="s2">&#34;rm&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Save the result</span>
</span></span><span class="line"><span class="cl">    <span class="n">canvas</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="s2">&#34;JPEG&#34;</span><span class="p">,</span> <span class="n">quality</span><span class="o">=</span><span class="mi">95</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="s2">&#34;ok&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@click.command</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nd">@click.argument</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;path&#34;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="n">exists</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">file_okay</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">dir_okay</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">readable</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@click.option</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;--output&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;-o&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">Path</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">    <span class="n">help</span><span class="o">=</span><span class="s2">&#34;Destination file or folder. If omitted, creates an &#39;output&#39; folder.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@click.option</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;--border&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;-b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">default</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">help</span><span class="o">=</span><span class="s2">&#34;Side/top border thickness as a percentage (e.g. 0.05 = 5%).&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nd">@click.option</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;--bottom&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;-bt&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">default</span><span class="o">=</span><span class="mf">0.12</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">help</span><span class="o">=</span><span class="s2">&#34;Bottom border thickness for the text as a percentage (e.g. 0.12 = 12%).&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">border</span><span class="p">,</span> <span class="n">bottom</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;Add white borders and EXIF info to your photos.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    PATH can be the path to a single image file or a folder.
</span></span></span><span class="line"><span class="cl"><span class="s2">    Images with no EXIF data are skipped (no border added).
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">extensions</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&#34;.jpg&#34;</span><span class="p">,</span> <span class="s2">&#34;.jpeg&#34;</span><span class="p">,</span> <span class="s2">&#34;.png&#34;</span><span class="p">,</span> <span class="s2">&#34;.tiff&#34;</span><span class="p">,</span> <span class="s2">&#34;.webp&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Handle a single FILE input</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">extensions</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&#34;The given file is not a supported image.&#34;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">output</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">dirname</span><span class="p">,</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">output</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirname</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&#34;bordered_</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">            <span class="n">output</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Processing file: </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="n">process_single_image</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">border</span><span class="p">,</span> <span class="n">bottom</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="s2">&#34;ok&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Saved successfully to: </span><span class="si">{</span><span class="n">output</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Handle a FOLDER input</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">output</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">output</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s2">&#34;output_bordered&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># List all valid files in the folder</span>
</span></span><span class="line"><span class="cl">        <span class="n">files</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="n">extensions</span><span class="p">)]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="ow">not</span> <span class="n">files</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&#34;No valid images found in the folder.&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">            <span class="sa">f</span><span class="s2">&#34;Found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">files</span><span class="p">)</span><span class="si">}</span><span class="s2"> images in the folder. Starting processing...&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">skipped</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">        <span class="n">errors</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">        <span class="k">with</span> <span class="n">click</span><span class="o">.</span><span class="n">progressbar</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">&#34;Progress&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bar</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="k">for</span> <span class="n">file_name</span> <span class="ow">in</span> <span class="n">bar</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">input_file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">file_name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">output_file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">file_name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">result</span> <span class="o">=</span> <span class="n">process_single_image</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">                    <span class="n">input_file_path</span><span class="p">,</span> <span class="n">output_file_path</span><span class="p">,</span> <span class="n">border</span><span class="p">,</span> <span class="n">bottom</span>
</span></span><span class="line"><span class="cl">                <span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="s2">&#34;skipped&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">skipped</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">                <span class="k">elif</span> <span class="n">result</span> <span class="o">==</span> <span class="s2">&#34;error&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                    <span class="n">errors</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;All images have been saved to the folder: </span><span class="si">{</span><span class="n">output</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">skipped</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">skipped</span><span class="si">}</span><span class="s2"> images skipped (no EXIF data).&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">errors</span><span class="si">}</span><span class="s2"> images failed to process due to errors.&#34;</span><span class="p">,</span> <span class="n">err</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">main</span><span class="p">()</span></span></span></code></pre></div>
<p>And this is the script output from the example pic.</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="framed-script.jpg" loading="lazy" alt="framed-script"></figure><p>I will change something because I not full ok with how the text is print on the frame (font size etc&hellip;) but this is the best I have in this moment.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you want to see it you can find the info at <a href="https://matteoscarpa.it/in-piedi-da-solo/" target="_blank" rel="noopener" class="a-post">this site <span aria-hidden="true">↗</span></a>
.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Not all type of pic, only the colored one, not the black and white&rsquo;s one&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></entry><entry><title>Week Note Nº 33/2026</title><id>tag:fundor333.com,2026-08-16:/weeknotes/2026/33/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/33/"/><published>2026-08-16T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 33 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/33/"><![CDATA[<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/weeknotes/2026/33/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 33/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 32/2026</title><id>tag:fundor333.com,2026-08-09:/weeknotes/2026/32/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/32/"/><published>2026-08-09T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 32 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/32/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://maho.dev/2026/08/using-gotosocial-as-the-social-layer-for-your-apps/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Using GoToSocial as the Social Layer for Your Apps <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/weeknotes/2026/32/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 32/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 31/2026</title><id>tag:fundor333.com,2026-08-02:/weeknotes/2026/31/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/31/"/><published>2026-08-02T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 31 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/31/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.andreagrandi.it/posts/why-book-corners-wont-sync-contributions-back-to-openstreetmap/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Why Book Corners won&rsquo;t sync contributions back to OpenStreetMap <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://birchtree.me/blog/micro-app-21-ghosthunter-cli/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Micro app 21: ghosthunter CLI <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.tokyotimes.org/tokyo-people-and-their-homes/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Tokyo people and their homes — Tokyo Times <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/weeknotes/2026/31/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 31/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Week Note Nº 30/2026</title><id>tag:fundor333.com,2026-07-26:/weeknotes/2026/30/</id><link rel="alternate" href="https://fundor333.com/weeknotes/2026/30/"/><published>2026-07-26T09:00:00+01:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="weeknote"/><summary type="text">Personal notes for week 30 of 2026</summary><content type="html" xml:base="https://fundor333.com/weeknotes/2026/30/"><![CDATA[<h2 id="suggested-reading-linksposts" class="group scroll-mt-20">
  <a href="#suggested-reading-linksposts" class="no-underline">
    Suggested Reading Links/Posts
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://jefftriplett.com/posts/moving-my-website-from-jekyll-to-django/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Jeff Triplett <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://www.gentlemanstationer.com/blog/2026/7/25/whats-the-best-everyday-stationery-bag-my-own-considerations-and-5-options?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">What&rsquo;s the Best Everyday Stationery Bag? My Own Considerations and 5 Options for Pen Show Season — The Gentleman Stationer <span aria-hidden="true">↗</span></a>
</li>
<li><a href="http://example.com/posts/moving-my-website-from-jekyll-to-django/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Example Domain <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="new-post-from-my-blog" class="group scroll-mt-20">
  <a href="#new-post-from-my-blog" class="no-underline">
    New post from my blog
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://fundor333.com/micro/2026/07/standing-up-alone/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Standing Up Alone - In Piedi da Solo <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://fundor333.com/weeknotes/2026/30/?utm_source=fundor333.com" target="_blank" rel="noopener" class="a-post">Week Note Nº 30/2026 <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="my-links" class="group scroll-mt-20">
  <a href="#my-links" class="no-underline">
    My Links
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<ul>
<li><a href="https://www.fundor333.com" target="_blank" rel="noopener" class="a-post">My blog <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://digitaltearoom.com" target="_blank" rel="noopener" class="a-post">My newsletter <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://matteoscarpa.it" target="_blank" rel="noopener" class="a-post">My Ph portfolio <span aria-hidden="true">↗</span></a>
</li>
<li><a href="https://ko-fi.com/fundor333" target="_blank" rel="noopener" class="a-post">Support me <span aria-hidden="true">↗</span></a>
</li>
</ul>
<h2 id="anime-and-mangas-stats" class="group scroll-mt-20">
  <a href="#anime-and-mangas-stats" class="no-underline">
    Anime and manga&rsquo;s stats
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h2>
<h3 id="anime" class="group scroll-mt-20">
  <a href="#anime" class="no-underline">
    <strong>Anime</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total anime watched: <strong>119</strong></li>
<li>Total anime watched time: <strong>762h 46m</strong></li>
<li>Total anime watched episodes: <strong>1849</strong></li>
<li>Top 5 anime genres: 🏷️ Action, 🏷️ Adventure, 🏷️ Fantasy, 🏷️ Supernatural, 🏷️ Drama</li>
</ul>
<h3 id="manga" class="group scroll-mt-20">
  <a href="#manga" class="no-underline">
    <strong>Manga</strong>
    <span class="heading-anchor ml-2 text-primary opacity-0 transition-opacity group-hover:opacity-60" aria-hidden="true">¶</span>
  </a>
</h3>
<ul>
<li>Total manga read: <strong>270</strong></li>
<li>Total manga read chapters: <strong>27553</strong></li>
<li>Total manga read volumes: <strong>654</strong></li>
<li>Top 5 manga genres: 🏷️ Fantasy, 🏷️ Action, 🏷️ Adventure, 🏷️ Comedy, 🏷️ Drama</li>
</ul>
]]></content></entry><entry><title>Standing Up Alone - In Piedi da Solo</title><id>tag:fundor333.com,2026-07-20:/micro/2026/07/standing-up-alone/</id><link rel="alternate" href="https://fundor333.com/micro/2026/07/standing-up-alone/"/><published>2026-07-20T12:08:22+02:00</published><updated>2026-10-18T09:39:02Z</updated><author><name>Fundor333</name></author><category term="photography"/><category term="urban"/><content type="html" xml:base="https://fundor333.com/micro/2026/07/standing-up-alone/"><![CDATA[<p>And the next month I will have a little photographic exhibition in Venice, Italy.</p>
<p>Here the flyer for the exhibition and <a href="https://matteoscarpa.it/in-piedi-da-solo/" target="_blank" rel="noopener" class="a-post">here <span aria-hidden="true">↗</span></a>
 is the link at the webpage</p>
<figure>
  <img class="center-img u-photo rounded-lg" src="poster.png" loading="lazy" alt="poster.png"></figure>]]></content></entry></feed>