<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blog on Thanos Apollo</title>
    <link>https://thanosapollo.org/categories/blog/</link>
    <description>Recent content in Blog on Thanos Apollo</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 11 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://thanosapollo.org/categories/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Costs of AI Acceleration</title>
      <link>https://thanosapollo.org/posts/costs-of-ai-acceleration/</link>
      <pubDate>Fri, 11 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/costs-of-ai-acceleration/</guid>
      <description>&lt;p&gt;My recent posts about AI have been optimistic.  I still mean them.
After spending the past couple of months rebuilding my workflow around
agents, I hardly interact with the colleagues I used to study with,
and working has become so rewarding that I find it hard to stop.
Neither has made me want my old workflow back.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My recent posts about AI have been optimistic.  I still mean them.
After spending the past couple of months rebuilding my workflow around
agents, I hardly interact with the colleagues I used to study with,
and working has become so rewarding that I find it hard to stop.
Neither has made me want my old workflow back.</p>
<h2 id="what-changed-in-my-studying">What changed in my studying</h2>
<p>I&rsquo;ve recently switched to Omarchy for the built-in agent integration
and moved much of the &ldquo;computer&rdquo; out of my way.  I spend less time
coding by hand and more time studying with gnosis, while working with
my agent to improve the tools around it.  I&rsquo;ve added FSRS, 3D models
for anatomy, and agent support for creating custom study sessions.</p>
<video controls preload="metadata" style="max-width: 100%; height: auto;">
  <source src="/images/gnosis-demo-video-3d.mp4?v=silent" type="video/mp4">
  Your browser does not support embedded video.
  <a href="/images/gnosis-demo-video-3d.mp4?v=silent">Download the Gnosis anatomy demo.</a>
</video>
<p>For a concrete comparison, I can have my agent write lecture summaries
in about two minutes.  The same amount of work would take a colleague
three to five hours, often arriving later that day.  By the time the
summary arrives, I could already have spent those hours studying it.</p>
<p>I used to have average grades and was probably the laziest student in
my classes.  Now I&rsquo;m among the top students.  I haven&rsquo;t suddenly
become obsessed with grades or developed a love for every subject in
my syllabus.  I&rsquo;ve developed an itch to optimize my learning, and
making software around it has become cheap enough to keep scratching.</p>
<h2 id="the-social-cost">The social cost</h2>
<p>I used to collaborate with colleagues to create questions and notes
for our classes.  We maintained shared resources and passed them down
to the next generation of students.  Even as the lazy one, I used to
organize people so I could maintain my laziness :)</p>
<p>Now I hardly interact with most of them.  Until they are agent
accelerated as well, collaborating on this work slows me down.  A
lecture summary takes my agent two minutes and a colleague half a
working day.  Dividing up the work used to save me effort.  Now it
means coordinating with people and waiting for something I could
already have in front of me.</p>
<p>Most of my colleagues aren&rsquo;t into tech.  Some still take notes with
pencil and paper, while I&rsquo;m having an agent turn lecture material into
resources for my study environment.  We sit the same exams, but I
can no longer plan my studying around the pace of that workflow.</p>
<p>Working with people who also use agents is another matter.  But that
isn&rsquo;t the circle I&rsquo;m in.  For passing my classes, setting up my own
agentic bubble and staying inside it has become the most efficient
option.  I see less value in coordinating that work with other people
now.  I still want their company; I just don&rsquo;t need to organize a
study group to get a lecture summary written.</p>
<p>Maybe the issue is how much of my social life I built around getting
something done together.  There was always an exam to prepare for,
notes to divide up, some task to coordinate.  Remove the need for that
work and a surprising amount of the interaction disappears with it.
I probably need to get better at meeting people because I want to
spend time with them, without needing a shared task as the reason.</p>
<h2 id="why-i-find-it-hard-to-stop">Why I find it hard to stop</h2>
<p>Almost every waking hour now goes into studying, improving my study
tools, or working out.  My sleep schedule was already messed up; now
it&rsquo;s closer to a vampire&rsquo;s.  My adenosine receptors probably consider
caffeine a permanent tenant.</p>
<p>I study with the agent too.  I have it teach me the material, explain
things I don&rsquo;t understand, and constantly quiz me.  Studying becomes
an ongoing conversation: I ask questions, try to explain things back,
and answer its questions instead of just reading another page of
notes.  There is always something to respond to, and I want to keep
going until I understand it.</p>
<p>Getting more done hasn&rsquo;t made me want to work less.  Between that
conversation and improving gnosis, studying itself has become much
more rewarding.  When I notice a problem with how I&rsquo;m learning
something, I can have my agent help improve the tool and use the
change in the same study session.</p>
<p>An idea that would once have taken a weekend of coding can now be
worth trying before bed.  Or I want one more explanation, then another
round of questions to see whether I&rsquo;ve understood it.  Going to sleep
means putting down work that I actually want to do.  Being this
engaged in studying is much harder to walk away from than being bored.</p>
<h2 id="freedom-and-dependence-on-compute">Freedom and dependence on compute</h2>
<p>What attracted me to the hacker community was self-reliance.  I wanted
to learn how to adapt my tools to fit my needs, rather than accept
whatever a guy in a corpo decided I should want.</p>
<p>I want to own my software and decide what it does.  Agents have made
that cheap enough to act on.  Coding by hand is no longer worth my
time.  Knowing how to manage agents is worth more to me now than
being able to write all that code myself.  I&rsquo;ve had them produce
millions of lines, from Haskell to Python, that I could never have
written in the same period even as a full-time developer.</p>
<p>Writing my own OS, from the kernel up, used to be an absurd demand
on my time.  Now I look at it and think about how much compute I
could throw at it.</p>
<p>That puts an expensive condition on self-reliance.  I can make the
software do what I want, but keeping that ability independent of a
model provider requires compute of my own.  Having the source on my
disk doesn&rsquo;t give me the hardware to run the agents that produced it.</p>
<p>For the way I want to work, powerful hardware is becoming more
important than the software I start with.  I can have agents replace
software.  I can&rsquo;t prompt a GPU into existence.</p>
<p>I hope more smart people work on chips, manufacturing, and production
capacity so that what costs
$100K in compute today becomes accessible for $5K in the future.
<em>One can hope.</em>  Self-reliance gets a rather different meaning when
the equipment costs more than most people can afford.</p>
<p>Some people will want to yell at the cloud about this change.  I still
think it&rsquo;s for the best.  Programming often felt like a priesthood:
learn the language before you&rsquo;re allowed to ask the machine for
anything.  The &ldquo;agent reformation&rdquo; lets many more people build the
software they want.  But if the congregation still has to rent access
to the machine from a handful of companies, we haven&rsquo;t gone as far
as I want.</p>
<p>I want the means of production on my desk. :)</p>]]></content:encoded>
    </item>
    <item>
      <title>Deleting Codeberg</title>
      <link>https://thanosapollo.org/posts/deleting-codeberg/</link>
      <pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/deleting-codeberg/</guid>
      <description>&lt;p&gt;I am deleting my Codeberg presence: accounts, mirrors, the lazy habit
of treating a &amp;ldquo;nice&amp;rdquo; forge as neutral ground.  Not because self-hosting
got trendy.  Because a slice of FOSS I once assumed still meant free
software has turned into purity theater, copyright panic, and harassment
of anyone who will not cosplay pre-industrial labor.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am deleting my Codeberg presence: accounts, mirrors, the lazy habit
of treating a &ldquo;nice&rdquo; forge as neutral ground.  Not because self-hosting
got trendy.  Because a slice of FOSS I once assumed still meant free
software has turned into purity theater, copyright panic, and harassment
of anyone who will not cosplay pre-industrial labor.</p>
<p>I am a medical student who still ships free software.  My hours are
finite.  I will not burn them answering people who treat agent-assisted
work as a moral crime and then demand my attention on top of it.</p>
<h2 id="the-forge-was-never-neutral">The forge was never neutral</h2>
<p>Codeberg is not uniquely cursed.  It is just where a lot of this shows
up.  People moved there for decent reasons.  Fine.  That does not make
the surrounding culture immune to fashion, or to using a public desk as
a free harassment channel.</p>
<p>If your software politics mean other people owe you free labor on your
terms, that is not freedom.  That is a small tyranny with a FOSS
sticker on it: treat maintainers like unpaid hands, call refusal
immoral, and pretend the whip is principle.</p>
<p>Primary sources already live on <a href="https://git.thanosapollo.org/">git.thanosapollo.org</a>.  Mirrors were
convenience, not principle.  I am done maintaining <a href="https://git.thanosapollo.org/emacs-forgejo/">emacs-forgejo</a> too.
Own forge, own tracker.  Autonomy without the branding.</p>
<h2 id="the-pirates-became-the-copyright-cops">The pirates became the copyright cops</h2>
<p>I am anti-copyright.  I admire Aaron Swartz.  The old hacker line was
not subtle: information wants to be free; we are your worst nightmare.
That meant universal access, not &ldquo;free only when it flatters my
identity as an artisan.&rdquo;</p>
<p>Who is dissolving paywalls and locked-up code right now?  Mostly the
companies everyone loves to hate.  Models ingest everything and make
trapped material queryable.  Swartz&rsquo;s dream, approximated for profit.</p>
<p>And a large chunk of FOSS answered how?  Crying theft.  Crying
copyright.  Filing the same weapons they used to despise.  People who
correctly hated SOPA now beg copyright maximalism to save them from a
model that read their README.</p>
<p>The pirates became the copyright cops.  The corpos became the
accidental liberators.  I am not licking OpenAI or anyone else.  Profit
is not virtue.  The inversion is still real.  The purity crowd flipped
the second the information being liberated was <strong>theirs</strong>.</p>
<p>That is guild protection with better vocabulary.  Call it free software
if you want.  I will not.</p>
<h2 id="anti-human-is-historical-illiteracy">&ldquo;Anti-human&rdquo; is historical illiteracy</h2>
<p>Say agents are useful and that hand-coding routine first drafts is
mostly dead labor, and a certain type arrives on schedule: lazy, fake,
traitor to craft, anti-human.</p>
<p>Humans invent levers: fire, writing, compilers, package managers,
tests.  Using a stronger tool is the oldest human move there is.
Refusing one can be taste.  Do not dress slower labor up as morality.</p>
<p>Every serious GPL project already says it: <em>ABSOLUTELY NO WARRANTY</em>.
Not hand-typed by saints.  Useful software, as-is, your risk.  Calling
agent-built free tools anti-human while the license disclaims warranty
is fashion, not engineering.</p>
<h2 id="life-update">Life update</h2>
<p>I am back putting the boxing gloves on and training again, not just
talking about it.  Exams are going well enough that I am not living
entirely inside the next deadline.  That matters more than another
forge notification.</p>
<p>I still care about free software.  I care more about software that
answers to me.  Codeberg is no longer home base.  Free licenses stay.
Self-hosting stays.  The demand that I apologize for levers does not.</p>
<p>Current work: <a href="https://git.thanosapollo.org/gnosis/">gnosis</a> moving toward a <code>gnosis-core</code> with FSRS, plus
Emacs and web clients; <a href="https://git.thanosapollo.org/emacs-jabber/">emacs-jabber</a>, XMPP gateways, Nix machines,
local trackers, Emacs front-ends to the agents I run.  Agents under
review and constraints, not vibes as a personality cult.  Fewer
attention sinks; I already wrote about that in <a href="/posts/ai-and-foss/">Cheap Code, Expensive
Attention</a>.</p>
<p>If a project teaches me something, improves a tool I run, or puts me
next to people whose judgment I trust, it can have my attention.
Status anxiety and FOSS-skinned harassment cannot.</p>
<p>Want the code?  Use the git server.  Want an argument about whether
compilers were also cheating?  Keep it.  I have patients to study for,
rounds to throw, and a homelab to maintain.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cheap Code, Expensive Attention</title>
      <link>https://thanosapollo.org/posts/ai-and-foss/</link>
      <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/ai-and-foss/</guid>
      <description>&lt;h2 id=&#34;is-contributing-to-foss-worth-it&#34;&gt;Is contributing to FOSS worth it?&lt;/h2&gt;</description>
      <content:encoded><![CDATA[<h2 id="is-contributing-to-foss-worth-it">Is contributing to FOSS worth it?</h2>
<p>I used to contribute to quite a few FOSS projects.  Lately I have
stepped back from several, especially the ones where the attention
required started to feel out of proportion to what I got back.</p>
<p>Take packaging work for GNU Guix, where I was briefly involved.  <a href="https://codeberg.org/guix/guix/pulls/7636">This
PR</a> updated a package I maintain, <code>emacs-jabber</code>.  Writing the recipe
took roughly five minutes.  After an initial positive review, the
thread expanded into a longer discussion about dependency handling,
recursive checkouts, and vendored cryptographic code.  There was no
clear owner of the review and no obvious stopping point.  The total
attention cost ended up being many times higher than the original
contribution.</p>
<p>I am not singling Guix out.  Plenty of projects have the same
structural problem: review processes that can turn small patches into
open-ended attention sinks.  When I can point an agent at the same task
and iterate quickly, or just maintain the package outside the main
distribution, the old calculation stops making sense.</p>
<p>The question is no longer <em>&ldquo;can I do this?&rdquo;</em> It becomes: <strong>Is my limited
attention better spent here than somewhere else?</strong></p>
<p>This does not make all FOSS contribution pointless.  It just raises the
bar.  A contribution is worth my attention when it teaches me something
new, meaningfully improves a tool I actually use, or connects me with
people whose judgment I value.  That thread did none of those things.</p>
<p>Nobody becomes a better Schemer by writing yet another package recipe
and reading build logs.  An agent running a decent model could have
handled most of that loop and caught the obvious review points.
Without clear policy and explicit review expectations, even a
checklist-driven agent can be more useful than unstructured human
review.</p>
<blockquote>
<p>This applies to any contribution where the work itself is now cheap
enough that a model can do it for a few cents, but the human
coordination around it has stayed expensive.  At that point, doing it
by hand is no longer obviously worth your attention.</p>
</blockquote>
<h2 id="code-has-become-cheap">Code has become cheap</h2>
<p>ESR recently wrote that <a href="https://xcancel.com/esrtweet/status/2054288478750597593#m">the age of hand-coding is mostly over</a>.  I
think he is mostly right.  The real shift is not that humans stop
writing code.  It is that code has become cheap enough to meaningfully
increase individual autonomy.</p>
<p>When I already know what I want a tool to do, what stack it should
use, and how it should fit into my workflow, I no longer need to hunt
for an existing project, evaluate its abstractions, adapt my process
to it, or inherit its maintenance burden.  A local model can just
generate a focused implementation for me.</p>
<p>This changes the dependency relationship.  Instead of relying on
third-party developers I do not know, whose priorities, judgment, and
long-term commitment are always uncertain, I can produce exactly what
I need.  The result is often higher quality for personal use, because
it contains only the behavior I want and none of the assumptions or
baggage I do not want.</p>
<p>Cheap code does not just make development faster.  It reduces the need
to outsource small but important parts of my computing environment to
strangers.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cgit with GNU Guix</title>
      <link>https://thanosapollo.org/posts/cgit-guix/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/cgit-guix/</guid>
      <description>&lt;p&gt;Recently I switched my home server to &lt;a href=&#34;https://guix.gnu.org&#34;&gt;GNU Guix&lt;/a&gt;, this is a quick guide
on how I setup &lt;code&gt;cgit&lt;/code&gt;.  Hope this helps some of you.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently I switched my home server to <a href="https://guix.gnu.org">GNU Guix</a>, this is a quick guide
on how I setup <code>cgit</code>.  Hope this helps some of you.</p>
<h2 id="why-i-use-gnu-guix-for-my-server">Why I use GNU Guix for my server</h2>
<p>GNU Guix is my preferred system for every machine I use, recently I
even switched my home server (<em>back</em>) to Guix.  I use my home server to
host this blog as well as my <a href="https://git.thanosapollo.org">cgit instance</a>, so far I recommend using
Guix, as a hobbyist, for the following reasons:</p>
<ul>
<li><code>Roll backs</code>
<ul>
<li>I had tried both Gentoo and Debian before for my server, more than
once I had one or more of my self hosted services down because an
update broke my setup.  My time is limited and those breakages
would often occur at busy weeks where I didn&rsquo;t have the time to
fix them.  With Guix I can just roll back to a previous working
generation if an update or a misconfiguration of mine breaks something.</li>
</ul>
</li>
<li><code>Reproducibility</code>
<ul>
<li>Define your setup once, run anywhere.  I do not want to manually
setup anything.</li>
</ul>
</li>
<li><code>Simplicity</code>
<ul>
<li>The entirety of Guix code lives in <a href="https://codeberg.org/guix/guix">one repo</a> and is almost entirely
written in one language, guile scheme.  If you find any issues
with a service or a package you can redefine it as you like in
your configuration.</li>
</ul>
</li>
</ul>
<h2 id="why-self-host-a-git-server">Why self-host a git server?</h2>
<p>Why would you not self-host your own projects?  I find it antithetical
to the FOSS ethos, and perhaps even ironic, to rely on proprietary
platforms for distributing free software.</p>
<p>Hosting a Git server is straightforward and requires minimal resources.</p>
<h2 id="git-http-backend-uri-issue-and-fix">git-http-backend &ldquo;/&rdquo; uri issue and fix</h2>
<p>Guix has a separate configuration data type for serving Git
repositories over HTTP.  Currently, the regex it uses does not allow
the root <code>&quot;/&quot;</code> to be used a URI for serving (<a href="https://lists.gnu.org/archive/html/help-guix/2022-07/msg00002.html">ref archive</a>).</p>
<p>The issue is in the <code>(gnu services version-control)</code> module, specifically in this part:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(define* (git-http-nginx-location-configuration <span style="color:#e6db74">#:optional</span>
</span></span><span style="display:flex;"><span>                                                (config
</span></span><span style="display:flex;"><span>                                                 (git-http-configuration)))
</span></span><span style="display:flex;"><span>  (match config
</span></span><span style="display:flex;"><span>    (($ &lt;git-http-configuration&gt; package git-root export-all?
</span></span><span style="display:flex;"><span>                                 uri-path fcgiwrap-socket)
</span></span><span style="display:flex;"><span>     (nginx-location-configuration
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">;; ISSUE here: regex won&#39;t allow for &#34;/&#34;</span>
</span></span><span style="display:flex;"><span>      (uri (string-append <span style="color:#e6db74">&#34;~ /&#34;</span> (string-trim-both uri-path <span style="color:#960050;background-color:#1e0010">#</span>\/) <span style="color:#e6db74">&#34;(/.*)&#34;</span>))
</span></span><span style="display:flex;"><span>      (body
</span></span><span style="display:flex;"><span>       (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_pass &#34;</span> fcgiwrap-socket <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param SCRIPT_FILENAME &#34;</span>
</span></span><span style="display:flex;"><span>              package <span style="color:#e6db74">&#34;/libexec/git-core/git-http-backend&#34;</span>
</span></span><span style="display:flex;"><span>              <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param QUERY_STRING $query_string;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param REQUEST_METHOD $request_method;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param CONTENT_TYPE $content_type;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param CONTENT_LENGTH $content_length;&#34;</span>
</span></span><span style="display:flex;"><span>        (if export-all?
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;fastcgi_param GIT_HTTP_EXPORT_ALL \&#34;\&#34;;&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param GIT_PROJECT_ROOT &#34;</span> git-root <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param GIT_CONFIG_GLOBAL &#34;</span>
</span></span><span style="display:flex;"><span>              (plain-file <span style="color:#e6db74">&#34;gitconfig&#34;</span>
</span></span><span style="display:flex;"><span>                          (string-append <span style="color:#e6db74">&#34;[safe]\n\tdirectory = &#34;</span> git-root <span style="color:#e6db74">&#34;/*\n&#34;</span>))
</span></span><span style="display:flex;"><span>              <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param PATH_INFO $1;&#34;</span>))))))
</span></span></code></pre></div><p>Thankfully, we can easily resolve this by redefining
<code>(gnu services version-control)</code>.</p>
<ul>
<li>My changes (diff) to fix this issue, as well as specify git actions:</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
</span></span><span style="display:flex;"><span>index a7f40812a6c..e33e5de21f0 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/gnu/services/version-control.scm
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+++ b/gnu/services/version-control.scm
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">@@ -235,7 +235,11 @@ (define* (git-http-nginx-location-configuration #:optional
</span></span></span><span style="display:flex;"><span>     (($ &lt;git-http-configuration&gt; package git-root export-all?
</span></span><span style="display:flex;"><span>                                  uri-path fcgiwrap-socket)
</span></span><span style="display:flex;"><span>      (nginx-location-configuration
</span></span><span style="display:flex;"><span><span style="color:#f92672">-      (uri (string-append &#34;~ /&#34; (string-trim-both uri-path #\/) &#34;(/.*)&#34;))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      (uri (string-append &#34;~ &#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+			  (if (string=? uri-path &#34;/&#34;)
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+                              &#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+                              (string-append &#34;/&#34; (string-trim-both uri-path #\/)))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+			  &#34;/(info/refs|git-upload-pack|git-receive-pack)&#34;))
</span></span></span><span style="display:flex;"><span>       (body
</span></span><span style="display:flex;"><span>        (list
</span></span><span style="display:flex;"><span>         (list &#34;fastcgi_pass &#34; fcgiwrap-socket &#34;;&#34;)
</span></span><span style="display:flex;"><span><span style="color:#75715e">@@ -254,7 +258,7 @@ (define* (git-http-nginx-location-configuration #:optional
</span></span></span><span style="display:flex;"><span>               (plain-file &#34;gitconfig&#34;
</span></span><span style="display:flex;"><span>                           (string-append &#34;[safe]\n\tdirectory = &#34; git-root &#34;/*\n&#34;))
</span></span><span style="display:flex;"><span>               &#34;;&#34;)
</span></span><span style="display:flex;"><span><span style="color:#f92672">-        &#34;fastcgi_param PATH_INFO $1;&#34;))))))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        &#34;fastcgi_param PATH_INFO $uri;&#34;))))))
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> ;;;
</span></span></code></pre></div><p>You can find the full module that I use <a href="https://git.thanosapollo.org/dotfiles/tree/guix/services/version-control.scm">here</a> in my dotfiles repo.</p>
<p>I&rsquo;d recommend creating your own module and load it by running the following command:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo guix system reocnfigure ~/dotfiles/guix/server-config.scm -L ~/dotfiles/guix
</span></span></code></pre></div><h2 id="configuring-cgit-service-type">Configuring <code>cgit-service-type</code></h2>
<p>Guix provides a cgit service module <code>(gnu services cgit)</code>.</p>
<blockquote>
<p>A couple things to note:</p>
<ul>
<li>You can provide <code>css</code> and <code>favicon</code> using an external url.  You can
find the css styling that I use <a href="https://thanosapollo.org/cgit.css">here</a>.</li>
</ul>
</blockquote>
<p>Example <code>cgit-service-type</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#66d9ef">define </span>my/git-repos
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>   (<span style="color:#a6e22e">repository-cgit-configuration</span>
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">url</span> <span style="color:#e6db74">&#34;repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">name</span> <span style="color:#e6db74">&#34;repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">desc</span> <span style="color:#e6db74">&#34;Example Repo 1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">path</span> <span style="color:#e6db74">&#34;/srv/git/repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">section</span> <span style="color:#e6db74">&#34;Section 1&#34;</span>))
</span></span><span style="display:flex;"><span>   (<span style="color:#a6e22e">repository-cgit-configuration</span>
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">url</span> <span style="color:#e6db74">&#34;repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">name</span> <span style="color:#e6db74">&#34;repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">desc</span> <span style="color:#e6db74">&#34;Example Repo 2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">path</span> <span style="color:#e6db74">&#34;/srv/git/repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">homepage</span> <span style="color:#e6db74">&#34;https://myhomepage&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">section</span> <span style="color:#e6db74">&#34;Section 2&#34;</span>))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">service</span> cgit-service-type
</span></span><span style="display:flex;"><span>         (<span style="color:#a6e22e">cgit-configuration</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">package</span> cgit)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">root-desc</span> <span style="color:#e6db74">&#34;Root Desc&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">repository-directory</span> <span style="color:#e6db74">&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">root-title</span> <span style="color:#e6db74">&#34;Root Title&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">repositories</span> my/git-repos)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">enable-index-owner?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">enable-http-clone?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">clone-prefix</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;https://git.thanosapollo.org&#34;</span>)) <span style="color:#75715e">;; change this to your own url</span>
</span></span><span style="display:flex;"><span>           <span style="color:#75715e">;; Cache</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-root</span> <span style="color:#e6db74">&#34;/var/cache/cgit&#34;</span>)
</span></span><span style="display:flex;"><span>           <span style="color:#75715e">;; 20000 = 5 hours.  Feel free to adjust this.</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-size</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-static-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-dynamic-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-repo-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-root-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-scanrc-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-about-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-snapshot-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">case-sensitive-sort?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">css</span> <span style="color:#e6db74">&#34;https://thanosapollo.org/cgit.css&#34;</span>) <span style="color:#75715e">;; My personal css.</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">nginx</span>
</span></span><span style="display:flex;"><span>            (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">nginx-server-configuration</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">server-name</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;git.thanosapollo.org&#34;</span>))
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">root</span> cgit)
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">try-files</span> (list <span style="color:#e6db74">&#34;$uri&#34;</span> <span style="color:#e6db74">&#34;@cgit&#34;</span>))
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; I use cloudflare tunnel, which handles certs for me.</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">listen</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;80&#34;</span>))
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">ssl-certificate</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">ssl-certificate-key</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; ;; If you use certbot try the following:</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (listen &#39;(&#34;443 ssl&#34;))</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (ssl-certificate</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;;  &#34;/etc/certs/git.my-host.org/fullchain.pem&#34;)</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (ssl-certificate-key</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;;  &#34;/etc/certs/git.my-host.org/privkey.pem&#34;)</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">locations</span>
</span></span><span style="display:flex;"><span>                (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>                 (<span style="color:#a6e22e">nginx-location-configuration</span>
</span></span><span style="display:flex;"><span>                   (<span style="color:#a6e22e">uri</span> <span style="color:#e6db74">&#34;@cgit&#34;</span>)
</span></span><span style="display:flex;"><span>                   (<span style="color:#a6e22e">body</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;fastcgi_param SCRIPT_FILENAME $document_root/lib/cgit/cgit.cgi;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param PATH_INFO $uri;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param QUERY_STRING $args;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param HTTP_HOST $server_name;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_pass 127.0.0.1:9000;&#34;</span>)))
</span></span><span style="display:flex;"><span>                 (<span style="color:#a6e22e">git-http-nginx-location-configuration</span>
</span></span><span style="display:flex;"><span>                  (<span style="color:#a6e22e">git-http-configuration</span>
</span></span><span style="display:flex;"><span>                    (<span style="color:#a6e22e">uri-path</span> <span style="color:#e6db74">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span>                    (<span style="color:#a6e22e">export-all?</span> <span style="color:#66d9ef">#t</span>))))))))))
</span></span></code></pre></div><p>You can find my home server configuration <a href="https://git.thanosapollo.org/dotfiles/tree/guix/theodora.scm">here</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Daily Driving a Raspberry Pi 5</title>
      <link>https://thanosapollo.org/posts/daily-drive-pi5-01/</link>
      <pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/daily-drive-pi5-01/</guid>
      <description>Replacing my x220 laptop with a Raspberry Pi 5.</description>
      <content:encoded><![CDATA[<p>After switching from Apple devices to GNU/Linux, I&rsquo;ve enjoyed numerous
advantages. However, there&rsquo;s always been <em>one</em> thing that used to
make me look back: <em>battery life</em>, or the lack thereof.</p>
<p>Not anymore :)</p>
<p><strong>TLDR</strong>: I switched from a <a href="/images/setup-07-11-2023.jpg">thinkpad x220</a> to
a Raspberry Pi 5, which I use to access my desktop remotely.</p>
<figure>
    <img loading="lazy" src="/images/pi-monitor-back-01.png" width="80%" height="80%"/> 
</figure>

<blockquote>
<p>Raspberry Pi 5 with 3d printed custom VESA mount on Raspberry Pi Monitor</p>
</blockquote>
<h2 id="project-goals">Project Goals</h2>
<p>My aim with this &ldquo;project&rdquo; is to have a small, portable, and modular
device that I can simply toss in my bag and not worry about it&rsquo;s
battery life throughout the day.</p>
<p>The extra thing that I want, is to prove that you do not need to &ldquo;sell
your kidney&rdquo; and bow down to a corporation for the &lsquo;privilege&rsquo; to use
their hardware designed for obsolescence or their bloated software.</p>
<p>Hardware I&rsquo;m using:</p>
<ul>
<li>
<p>Things I&rsquo;ve purchased:</p>
<ul>
<li>Raspberry Pi 5 8GB</li>
<li>Raspberry Pi Monitor</li>
</ul>
</li>
<li>
<p>Things I&rsquo;ve already had:</p>
<ul>
<li>27000 mAh power bank</li>
<li>Keyboard</li>
</ul>
</li>
</ul>
<blockquote>
<p>I bought a Raspberry Pi 5 kit that came with a case fan for 100€.
The total cost for this project was 195€, for the Pi and the monitor.</p>
</blockquote>
<h3 id="battery-life">Battery Life</h3>
<p>I&rsquo;m usually out of home for over 7 hours a day for my studies, and I
enjoy studying in cafes and libraries. I&rsquo;ve missed having a device
with a battery life of 10+ hours, as my x220 barely lasts more than
4.5 hours.</p>
<p>Using a <code>27000mAh</code> power bank, I get ~15 hours of battery life.
I also carry an extra <em>&ldquo;emergency&rdquo;</em> power bank.</p>
<blockquote>
<p>With great power (and battery life) comes great productivity</p>
</blockquote>
<figure>
    <img loading="lazy" src="/images/pi-battery-usage.png" width="30%" height="30%"/> 
</figure>

<blockquote>
<p>The monitor consumes more energy than my Pi.</p>
</blockquote>
<h3 id="modularity">Modularity</h3>
<p>I strongly dislike laptop keyboards and I insist on using ones with a
trackpoint. I&rsquo;m currently using a <a href="https://tex.com.tw/products/shinobi">shinobi
keyboard</a>, which I can simply
plug into my Raspberry Pi and use just like on my desktop.</p>
<p>If I do not like something about my Pi setup, it&rsquo;d be trivial to
change, such using a new monitor, a new keyboard or another power bank.</p>
<h3 id="performance-file-synchronization">Performance &amp; File Synchronization</h3>
<p>Can the Pi outperform a modern laptop of &gt;1000€ price range? Yes and No :)</p>
<p>Now, you might be wondering; how can my Pi deliver better performance
than, say, a MacBook Air? A valid question, but as a GNU+Linux user,
I&rsquo;ve come to embrace the possibilities. Anything&rsquo;s possible with a
bit of hackery and FOSS magic.</p>
<p>I use <a href="https://github.com/neonkore/waypipe">waypipe</a>, a Wayland proxy,
to run Emacs remotely over a network. Emacs runs on my desktop, but I
access it from my Pi, great performance while seamlessly accessing all
my desktop files, such as my notes and PDFs, this also removes any
need for syncing files between devices.</p>
<blockquote>
<p>I have fiber connection, so there isn&rsquo;t any latency issues between
my devices using a wireguard VPN.</p>
</blockquote>
<figure>
    <img loading="lazy" src="/images/pi-waypipe-01.png"/> 
</figure>

<blockquote>
<p>Accessing my desktop Emacs session remotely, opening a PDF and eshell.</p>
</blockquote>
<h2 id="conclusion">Conclusion</h2>
<p>I will be using this setup for the rest of the academic year. I might
record a more detailed video with tips and tricks for others that
want to try something similar.</p>
<p>So far this has been more than an ideal setup for me, since I quite
often forget to sync my notes and projects between devices. Not
having to worry anymore about the battery life of my device is
quite relaxing as well.</p>]]></content:encoded>
    </item>
    <item>
      <title>Emacs Everywhere, even in Wayland</title>
      <link>https://thanosapollo.org/posts/use-emacs-everywhere/</link>
      <pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/use-emacs-everywhere/</guid>
      <description>How to use Emacs for input in any scenario in Wayland</description>
      <content:encoded><![CDATA[<p>If you are anything like me, you probably feel something is wrong
whenever you have to input text outside of Emacs. Fear not,
there&rsquo;s a solution.</p>
<p>Here&rsquo;s a simple code snippet to launch an emacs temp frame for input instead.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defun thanos/wtype-text (text)
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Process TEXT for wtype, handling newlines properly.&#34;</span>
</span></span><span style="display:flex;"><span>  (let* ((has-final-newline (string-match-p <span style="color:#e6db74">&#34;\n$&#34;</span> text))
</span></span><span style="display:flex;"><span>         (lines (split-string text <span style="color:#e6db74">&#34;\n&#34;</span>))
</span></span><span style="display:flex;"><span>         (last-idx (<span style="color:#a6e22e">1-</span> (<span style="color:#a6e22e">length</span> lines))))
</span></span><span style="display:flex;"><span>    (string-join
</span></span><span style="display:flex;"><span>     (cl-loop for line in lines
</span></span><span style="display:flex;"><span>              for i from <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>              collect (cond
</span></span><span style="display:flex;"><span>                       <span style="color:#75715e">;; Last line without final newline</span>
</span></span><span style="display:flex;"><span>                       ((and (<span style="color:#a6e22e">=</span> i last-idx) (not has-final-newline))
</span></span><span style="display:flex;"><span>                        (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;wtype -s 350 \&#34;%s\&#34;&#34;</span>
</span></span><span style="display:flex;"><span>                                (replace-regexp-in-string <span style="color:#e6db74">&#34;\&#34;&#34;</span> <span style="color:#e6db74">&#34;\\\\\&#34;&#34;</span> line)))
</span></span><span style="display:flex;"><span>                       <span style="color:#75715e">;; Any other line</span>
</span></span><span style="display:flex;"><span>                       (<span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>                        (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;wtype -s 350 \&#34;%s\&#34; &amp;&amp; wtype -k Return&#34;</span>
</span></span><span style="display:flex;"><span>                                (replace-regexp-in-string <span style="color:#e6db74">&#34;\&#34;&#34;</span> <span style="color:#e6db74">&#34;\\\\\&#34;&#34;</span> line)))))
</span></span><span style="display:flex;"><span>     <span style="color:#e6db74">&#34; &amp;&amp; &#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(defun thanos/type ()
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Launch a temporary frame with a clean buffer for typing.&#34;</span>
</span></span><span style="display:flex;"><span>  (interactive)
</span></span><span style="display:flex;"><span>  (let ((frame (make-frame <span style="color:#f92672">&#39;</span>((name <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;emacs-float&#34;</span>)
</span></span><span style="display:flex;"><span>                             (fullscreen <span style="color:#f92672">.</span> <span style="color:#ae81ff">0</span>)
</span></span><span style="display:flex;"><span>                             (undecorated <span style="color:#f92672">.</span> <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>                             (width <span style="color:#f92672">.</span> <span style="color:#ae81ff">70</span>)
</span></span><span style="display:flex;"><span>                             (height <span style="color:#f92672">.</span> <span style="color:#ae81ff">20</span>))))
</span></span><span style="display:flex;"><span>        (buf (<span style="color:#a6e22e">get-buffer-create</span> <span style="color:#e6db74">&#34;emacs-float&#34;</span>)))
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">select-frame</span> frame)
</span></span><span style="display:flex;"><span>    (switch-to-buffer buf)
</span></span><span style="display:flex;"><span>    (<span style="color:#a6e22e">erase-buffer</span>)
</span></span><span style="display:flex;"><span>    (org-mode)
</span></span><span style="display:flex;"><span>    (setq-local header-line-format
</span></span><span style="display:flex;"><span>                (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34; %s to insert text or %s to cancel.&#34;</span>
</span></span><span style="display:flex;"><span>                        (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;C-c C-c&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;help-key-binding</span>)
</span></span><span style="display:flex;"><span>            (<span style="color:#a6e22e">propertize</span> <span style="color:#e6db74">&#34;C-c C-k&#34;</span> <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;help-key-binding</span>)))
</span></span><span style="display:flex;"><span>    (local-set-key (kbd <span style="color:#e6db74">&#34;C-c C-k&#34;</span>)
</span></span><span style="display:flex;"><span>           (lambda () (interactive)
</span></span><span style="display:flex;"><span>             (kill-new (<span style="color:#a6e22e">buffer-string</span>))
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">delete-frame</span>)))
</span></span><span style="display:flex;"><span>    (local-set-key (kbd <span style="color:#e6db74">&#34;C-c C-c&#34;</span>)
</span></span><span style="display:flex;"><span>           (lambda () (interactive)
</span></span><span style="display:flex;"><span>             (start-process-shell-command
</span></span><span style="display:flex;"><span>              <span style="color:#e6db74">&#34;wtype&#34;</span> <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>              (thanos/wtype-text (<span style="color:#a6e22e">buffer-string</span>)))
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">delete-frame</span>)))))
</span></span></code></pre></div><blockquote>
<p><em>Make sure <code>wtype</code> is installed in your system for the above snippet to work.</em></p>
</blockquote>
<p>All you have to do now is just bind <code>emacsclient --eval '(thanos/type)'</code>
to a shortcut of your liking.</p>
<p>On my Hyprland setup I&rsquo;m using the following settings</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>bind = $mainMod, j, exec, emacsclient --eval &#39;(thanos/type)&#39;
</span></span><span style="display:flex;"><span>windowrulev2 = float,class:^(emacs)$,title:^(emacs-float)$ # Launch as a floating window.
</span></span></code></pre></div><blockquote>
<p>For xorg users, you can simply rely on the <a href="https://github.com/tecosaur/emacs-everywhere">Emacs Everywhere</a>
package. <em>Unfortunately it does not support Wayland yet and I have
not tried it.</em></p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>XMPP: Getting started with the universal communication standard</title>
      <link>https://thanosapollo.org/posts/moving-to-xmpp/</link>
      <pubDate>Tue, 30 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/moving-to-xmpp/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://xmpp.org/&#34;&gt;XMPP&lt;/a&gt; is a libre decentralized collection of technologies, alternative
to closed communication services.  I&amp;rsquo;ve started self hosting my own
xmpp server, and begun moving people from my close circle there.  This
is a summary of my collection of notes that I made for XMPP thus far,
published as a short article.  If you are interested in learning more
on XMPP I recommend reading their official &lt;a href=&#34;https://xmpp.org/&#34;&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;what-is-xmpp&#34;&gt;What is XMPP?&lt;/h2&gt;
&lt;p&gt;XMPP stands for eXtensible Messaging and Presence Protocol, it&amp;rsquo;s a set
of libre technologies that can be used for communication services,
such as instant messaging, voice &amp;amp; video calls as well as file
transfers.  This is done by routing &lt;code&gt;XML&lt;/code&gt; data.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p><a href="https://xmpp.org/">XMPP</a> is a libre decentralized collection of technologies, alternative
to closed communication services.  I&rsquo;ve started self hosting my own
xmpp server, and begun moving people from my close circle there.  This
is a summary of my collection of notes that I made for XMPP thus far,
published as a short article.  If you are interested in learning more
on XMPP I recommend reading their official <a href="https://xmpp.org/">website</a>.</p>
</blockquote>
<h2 id="what-is-xmpp">What is XMPP?</h2>
<p>XMPP stands for eXtensible Messaging and Presence Protocol, it&rsquo;s a set
of libre technologies that can be used for communication services,
such as instant messaging, voice &amp; video calls as well as file
transfers.  This is done by routing <code>XML</code> data.</p>
<p>XMPP operates similarly to HTTP, with the client initiating a
communication socket to an XMPP server and maintaining it open for the
entirety of the client&rsquo;s active session.</p>
<blockquote>
<p>XMPP was originally developed in the Jabber community to provide an
open decentralized alternative to closed messaging services.</p>
</blockquote>
<p>XMPP is used by a few popular platforms, these include <a href="https://medium.com/@rajendra_51543/how-whatsapp-works-197bfc6d6b95">WhatsApp</a>, Facebook
Messenger &amp; Jitsi.</p>
<h2 id="why-should-you-use-xmpp">Why should you use XMPP?</h2>
<p>For me, the primary appeal of XMPP lies in its interoperability,
versatility, and extensibility. Via transports or gateways, XMPP
enables a seamless connection with communities across various
platforms <em>including IRC, Matrix, WhatsApp, Telegram</em> all from a
single client.</p>
<p>Furthermore, the decentralized nature of XMPP is <strong>designed</strong> for self
hosting, <em>with minimal resources</em>.  This gives me the freedom to
establish and manage my own server, creating an ecosystem that
provides me with freedom &amp; respects my rights, to which I can bring my
family and friends.</p>
<h3 id="how-to-communicate-with-irc-and-matrix-using-xmpp">How to communicate with IRC &amp; Matrix using XMPP?</h3>
<p>You can use a gateway that connects to your desired
platform/protocol. For example, for IRC you&rsquo;d use <a href="https://github.com/louiz/biboumi">biboumi</a> or <a href="https://github.com/matrix-org/matrix-bifrost">btifrost</a>
for Matrix.</p>
<blockquote>
<p>There are publicly available gateways, for example you can use the the
biboumi gateway from <a href="https://jabberfr.org/">jabberfr.org</a> to connect to the emacs IRC channel
in libera.chat like this <code>#emacs%irc.libera.chat@irc.jabberfr.org</code></p>
</blockquote>
<h2 id="self-hosting-an-xmpp-server">Self hosting an XMPP server</h2>
<p>If you are not interested in self hosting an XMPP server, refer to
this <a href="https://list.jabber.at/">list</a> to find servers to register to.</p>
<h3 id="ejabberd">ejabberd</h3>
<p>I opted to use <a href="https://www.ejabberd.im/">ejabberd</a> server for my setup, which I found really
simple to setup with voice &amp; video calls.</p>
<p>Setting up an ejabberd server is that simple that it does not really
require instructions.  I&rsquo;d recommend you use their <a href="https://docs.ejabberd.im/admin/install/binary-installer/#linux-run-installer">RUN Installer</a> or if
you are on debian/fedora to check out their <a href="https://github.com/processone/ejabberd/releases">releases</a> for an rpm/deb
package.</p>
<p>Other server &amp; client options can be found <a href="https://xmpp.org/software/?platform=linux">here</a>.</p>
<h2 id="xmpp-clients">XMPP clients</h2>
<p>All in all, XMPP offers user friendly clients in all platforms, that
everyone can use, as always refer <a href="https://xmpp.org/software/?platform=linux">here</a> for up-to-date recommendations.</p>
<p>This is what I <em>personally</em> have been using this past week with XMPP &amp;
recommend.</p>
<h3 id="mobile">Mobile</h3>
<ul>
<li>For android, I&rsquo;d recommend to use <a href="https://f-droid.org/packages/com.cheogram.android/">cheogram</a>, it&rsquo;s based on
<a href="https://conversations.im/">conversations</a> with a few visual tweaks and additional features.</li>
<li>For iOS, I&rsquo;ve installed <a href="https://monal-im.org/">Monal</a> to my friends &amp; family.  I&rsquo;m not sure
if it&rsquo;s the best one available since the iOS ecosystem is foreign to
me, but the people I&rsquo;ve installed it on found it pleasant to use.</li>
</ul>
<h3 id="desktop">Desktop</h3>
<ul>
<li>I&rsquo;d recommend <a href="https://dino.im/">Dino</a>, it&rsquo;s been really easy to use with full
support of most xmpp features (<a href="https://en.wikipedia.org/wiki/OMEMO">OMEMO</a> encryption etc.)</li>
<li>There is also <a href="https://codeberg.org/emacs-jabber/emacs-jabber">emacs-jabber</a>, an emacs jabber extension, that
unfortunately does not support any kind of encryption.  It&rsquo;s decent
for public unencrypted channels.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Immich: Self-hosted Photo &amp; Video Management</title>
      <link>https://thanosapollo.org/posts/immich-setup/</link>
      <pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/immich-setup/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently transitioned to a pixel phone with GrapheneOS as my
primary device, moving from an iPhone.  The only thing that I was
missing is having my photos be in sync across all of my devices using
iCloud, but despite the convenience of Apple&amp;rsquo;s iCloud service for
syncing photos across devices, it frequently disregards user rights
and privacy.  Thankfully, &lt;a href=&#34;https://immich.app/&#34;&gt;Immich&lt;/a&gt; offers a self-hosted and
enhanced alternative while respecting my privacy &amp;amp; user rights.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve recently transitioned to a pixel phone with GrapheneOS as my
primary device, moving from an iPhone.  The only thing that I was
missing is having my photos be in sync across all of my devices using
iCloud, but despite the convenience of Apple&rsquo;s iCloud service for
syncing photos across devices, it frequently disregards user rights
and privacy.  Thankfully, <a href="https://immich.app/">Immich</a> offers a self-hosted and
enhanced alternative while respecting my privacy &amp; user rights.</p>
<p>Setting up immich is quite simple, just follow the official
<a href="https://immich.app/docs/overview/introduction">documentation</a>.  They even offer an <a href="https://immich.app/docs/install/script">installation script</a>.</p>
<h2 id="recommendations">Recommendations</h2>
<p>I advise against using services like Cloudflare Tunnel to make Immich
accessible publicly for security and privacy concerns. Instead,
consider using a VPN service such as tailscale/headscale for a more
secure &amp; convenient setup.</p>
<p>If you are using iCloud for your photos, there is a <a href="https://github.com/immich-app/immich/issues/3842#issuecomment-2008718176">memory leak bug</a>
that will cause the iOS app to crash when uploading large amounts of
media files.  Either first download all your photos from iCloud &amp; then
upload to them Imminch, or &ldquo;babysit&rdquo; your phone while it&rsquo;s uploading.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cloudflare Tunnel: Bye Bye VPS Services!</title>
      <link>https://thanosapollo.org/posts/bye-bye-vps/</link>
      <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/bye-bye-vps/</guid>
      <description>&lt;p&gt;VPS services, the pinnacle of freedom in the digital world!  Nothing
quite beats the thrill of entrusting your data and services to a
mysterious cloud entity, all while relinquishing control over your
hardware.  And do not forget the joy of relying on a third-party
cloud provider for your hosting needs, that may send you a &lt;a href=&#34;https://old.reddit.com/r/webdev/comments/1b14bty/netlify_just_sent_me_a_104k_bill_for_a_simple/&#34;&gt;104K bill&lt;/a&gt;
for your static site.  Who needs to own their hardware anyway?&lt;/p&gt;
&lt;h2 id=&#34;my-new-setup&#34;&gt;My new setup&lt;/h2&gt;
&lt;p&gt;For the past ~6 months, I have been relying on a VPS service from
&lt;a href=&#34;https://www.ionos.com/&#34;&gt;Ionos&lt;/a&gt;, &lt;em&gt;which offers a decent service for it&amp;rsquo;s price plans&lt;/em&gt;, to host
this site &amp;amp; my git server, as well as to occasionally port forward
media services such as jellyfin using an ssh tunnel.  This weekend, I
opted to migrate to an old thinkpad that I had collecting dust plus
&lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/&#34;&gt;cloudflare tunnel&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>VPS services, the pinnacle of freedom in the digital world!  Nothing
quite beats the thrill of entrusting your data and services to a
mysterious cloud entity, all while relinquishing control over your
hardware.  And do not forget the joy of relying on a third-party
cloud provider for your hosting needs, that may send you a <a href="https://old.reddit.com/r/webdev/comments/1b14bty/netlify_just_sent_me_a_104k_bill_for_a_simple/">104K bill</a>
for your static site.  Who needs to own their hardware anyway?</p>
<h2 id="my-new-setup">My new setup</h2>
<p>For the past ~6 months, I have been relying on a VPS service from
<a href="https://www.ionos.com/">Ionos</a>, <em>which offers a decent service for it&rsquo;s price plans</em>, to host
this site &amp; my git server, as well as to occasionally port forward
media services such as jellyfin using an ssh tunnel.  This weekend, I
opted to migrate to an old thinkpad that I had collecting dust plus
<a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/">cloudflare tunnel</a>.</p>
<p>Cloudflare tunnel is ideal for securely connecting a self hosted web
server to Cloudflare&rsquo;s global network.  But be aware that cloudflare
can decrypt your traffic.  I do not recommend using cloudflare
tunnel to host sensitive information, or to share large media files.</p>
<p>To share media with friends, I use <a href="https://tailscale.com/">tailscale</a>, I plan in the future to
host <a href="https://headscale.net/">headscale</a>, a self hosted implementation of tailscale.  Tailscale
is a zero config VPN, you can add your family &amp; friends to your
account or just &ldquo;funnel&rdquo; content to a public address to give someone
quick access.</p>
<h2 id="transition-tips">Transition Tips</h2>
<p>First of all, evaluate your current VPS usage and identify which
services can be easily self hosted.  I&rsquo;d recommend to start slowly
migrating your services to your own hardware &amp; use ssh tunnel for port
forwarding.</p>
<p>Test out cloudflare tunnel, tailscale and other similar services until you
find the one you like the most.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Spaced Repetition Software Gripes</title>
      <link>https://thanosapollo.org/posts/spaced-repetition-software-gripes/</link>
      <pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/spaced-repetition-software-gripes/</guid>
      <description>Issues with Spaced Repetition (Learning) Software &amp;amp; Announcement of Gnosis</description>
      <content:encoded><![CDATA[<p>In this post I&rsquo;m essentially publicizing my notes on spaced repetition
software, and announcing that I&rsquo;m working on
<a href="https://git.thanosapollo.org/gnosis">gnosis</a>, a spaced repetition
learning extension/package for GNU Emacs.</p>
<p>I should also note that I consider <a href="https://en.wikipedia.org/wiki/Spaced_repetition">Spaced
Repetition</a> to be a
cheat code for learning, <strong>that should be used by every student</strong>.</p>
<h2 id="what-is-spaced-repetition-learning">What is Spaced Repetition Learning</h2>
<p><a href="https://en.wikipedia.org/wiki/Spaced_repetition">Spaced Repetition</a>
is based on the following premise:
&gt; Repetitive exposure to information contributes to the elongation of memory retention.</p>
<p>Our cognitive faculties are inherently programmed to retain pertinent
information while discarding extraneous details, a process contingent
upon the frequency by which we encounter such information.</p>
<blockquote>
<p>TL;DR: The more frequently you are exposed to information, the longer you retain it</p>
</blockquote>
<h2 id="my-gripes-with-spaced-repetition-software">My &lsquo;gripes&rsquo; with spaced repetition software</h2>
<p>I have chosen to develop my own SRS (Spaced Repetition Software/System) instead
of relying on existing, well-established ones. Through my
implementation called &ldquo;gnosis&rdquo; (GNOH-sis, meaning knowledge in Greek)
I aim to address and overcome the challenges and limitations
associated with current SRS solutions. With gnosis, I hope to resolve
most, if not all, of these issues and provide a more refined and
<strong>advanced</strong> learning experience.</p>
<h3 id="not-libreware">Not libreware</h3>
<p>This refers to <a href="https://en.wikipedia.org/wiki/Proprietary_software">proprietary
software</a> that
implements spaced repetition, some of which are even guilty for
removing the spaced repetition feature that their users paid for. I
had a paid subscription with <a href="https://quizlet.com/">quizlet</a> only to
find out that they removed the spaced repetition feature I had already
paid &amp; was using, rendering my then workflow obsolete.</p>
<p>Do not depend on software you don&rsquo;t own for your work. <strong>You don&rsquo;t
&ldquo;own&rdquo; proprietary software, despite paying for it.</strong></p>
<blockquote>
<p>You should strive to use only <a href="https://en.wikipedia.org/wiki/Free_software">libreware</a> for your workflow.</p>
</blockquote>
<h3 id="lack-of-customization">Lack of customization</h3>
<p>Good software should fit your workflow like a glove, to do that it has
to give <em>a lot of</em> room for user customization. Trivial changes such
as color-scheme changes to more advanced feature customization like
adding your own custom card types and changing the spaced repetition
algorithm should be simple and easy to make. For example, a med
student would use a longer time interval for his algorithm than, let&rsquo;s
say, someone trying to expand their Japanese vocabulary.</p>
<p>Since we already established the need for our ideal software to be
<em>libreware</em>, making changes to the core components would be trivial.
But it should be added that customization to fit different needs &amp;
learning styles should be a primary goal when designing a SRS.</p>
<h3 id="flashcards-are-an-inferior-learning-method.">Flashcards are an inferior learning method.</h3>
<p>Flashcards are quite trivial to make, prototypical spaced repetition
methods utilized physical flashcards. Today&rsquo;s computers allows us for
more sophisticated &lsquo;review&rsquo; methods, <em>such as using user input</em>.</p>
<p>Utilizing user input to assess the effectiveness of a review is
preferable to simply revealing an answer and asking whether it was
known or not. This approach ensures not only the comprehension of the
answer but also the accurate spelling of it. Moreover, it leads to
more efficient retention compared to simply displaying the answer
without any active engagement from the user.</p>
<p>Ideally with <a href="https://git.thanosapollo.org/gnosis">Gnosis</a> I would
also like to implement
<a href="https://en.wikipedia.org/wiki/Multiple_choice">MCQ</a> type to simulate
the <a href="https://en.wikipedia.org/wiki/Usmle">USMLEs</a> exams which I will
<em>hopefully</em> soon be undertaking. <em>This will make it possible to simulate any other MCQ exam</em></p>
<h3 id="no-self-rating">No self-rating</h3>
<p>It is recommended that users do not self-rate their answers. The
review process should involve a binary assessment of success or
failure, where users either recall the answer correctly or not. This
success/failure rating will be used to determine the next interval for
the specific note, optimizing the spaced repetition system for
effective learning.</p>
<h3 id="collaboration">Collaboration</h3>
<p>Most spaced repetition software relies on databases for storage, but
the downside is that databases are not easily readable or editable by
humans, hindering sharing and collaboration.</p>
<p>To address this limitation, I intend to incorporate exporting
capabilities on gnosis. This feature would enable users to export a
deck of notes in a user-friendly format, which can then be easily
shared and collaborated on using tools like
<a href="https://en.wikipedia.org/wiki/Git">git</a> repositories.</p>
<p>This collaborative approach would allow us to work together, share,
and create valuable learning materials that can be used and modified
by everyone involved.</p>
<h3 id="syncing-between-devices">Syncing between devices</h3>
<p>Anki makes syncing between devices a breeze! But it gets terrible slow
if you are syncing a new device when you have a lot of material in
your account, plus you depend on Anki&rsquo;s servers for it to work.</p>
<p>Since on gnosis I will be using
<a href="https://en.wikipedia.org/wiki/Sqlite">sqlite</a> as my database
implementation, I would just be using git to keep my database in sync
between different devices.</p>
<h2 id="gnosis">Gnosis</h2>
<p>You can find gnosis on my git server
<a href="https://git.thanosapollo.org/gnosis">here</a>, <em>read the about section for installation instructions</em>.</p>
<p>It&rsquo;s still not even in alpha version yet, but it has the fundamental
functionality there already for you to test. Feel free to email me if
you have any questions or requests for gnosis.</p>]]></content:encoded>
    </item>
    <item>
      <title>Switching To Gentoo Linux</title>
      <link>https://thanosapollo.org/posts/gentoo-beginning/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/gentoo-beginning/</guid>
      <description>The end-game of my Linux journey has begun | Switching to Gentoo, the beginning.</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve leveled up to become a Gentoo user, the most elite nerd species
in GNU/Linux Land. All my devices have been transformed into Gentoo
machines, and needless to say, I&rsquo;m ecstatic about it.</p>
<p><em>Disclaimer: This post contains a healthy amount of sarcasm, just in
case you didn&rsquo;t catch on.</em></p>
<figure>
    <img loading="lazy" src="/images/setup-07-11-2023.jpg"
         alt="Gentoo Desktop and Thinkpad Setup" width="450"/> 
</figure>

<h2 id="about">About</h2>
<p>I&rsquo;ve been an <a href="https://archlinux.org">Arch Linux</a> user for a while now,
Arch Linux was the first distro I&rsquo;ve ever installed on hardware. It
treated me well over the past year, but after trying out gentoo on a virtual
machine I think I&rsquo;ve found my <code>$HOME</code>. Now I&rsquo;m running
<a href="https://gentoo.org">Gentoo</a> on all of my devices for the past 2+ weeks.</p>
<h2 id="what-did-you-enjoy-so-much-about-gentoo">What did you enjoy so much about Gentoo?</h2>
<h3 id="gentoo-handbook">Gentoo Handbook</h3>
<p><a href="https://wiki.gentoo.org/wiki/Handbook:Main_Page">The Gentoo Handbook</a>, I
can&rsquo;t really stress this enough, the Gentoo Handbook, is
<strong><em>extensively</em></strong> documented with every detail you might need,
<strong><em>specifically</em></strong> for using Gentoo. The Arch Wiki is awesome, it
includes documentation for a wide range of programs, but it&rsquo;s a
generic documentation that feels more like a general &ldquo;Linux wiki&rdquo;
rather than specific for Arch Linux. Even the parts that are specific
to Arch Linux, such as the installation instructions, are <em>severely</em> lacking,
which leads to most of the Arch Linux users to rely on third party
guides even on how to install their OS.</p>
<p>No other Linux Distribution has a centralized &ldquo;book&rdquo; that takes you
&ldquo;by the hand&rdquo; from the installation process all the way to working
with native software tools that you&rsquo;ll interact with on a daily basis, that
can compare to the Gentoo Handbook.</p>
<h3 id="community">Community</h3>
<p>One thing that I advocate about choosing which software to use is:</p>
<blockquote>
<p>Use software projects that you wouldn&rsquo;t mind / would like contributing to</p>
</blockquote>
<p>Gentoo community is the most helpful one that I&rsquo;ve found so far,
specifically I&rsquo;ve had people on the <a href="https://wiki.gentoo.org/wiki/Project:GURU">GURU
Project</a>, <em>analogous to the
AUR</em> package software that I needed as well as help me on
contributing, which has been a rather pleasant &amp; chill experience.</p>
<blockquote>
<p>If a project has a &ldquo;toxic&rdquo; community that you don&rsquo;t want to interact
with, its a huge red-flag for me.</p>
</blockquote>
<h2 id="but-why-would-you-compile-everything-from-source">But&hellip; Why would you compile everything from source?</h2>
<blockquote>
<p><em>Because someone has too&hellip;</em></p>
</blockquote>
<p>Jokes aside, there are many advantages to compiling your system from
source rather than installing an already made binary that someone
else compiled, hoping that it is compiled the way you want.</p>
<blockquote>
<p><a href="https://yewtu.be/watch?v=8QcI43IwkVc">Mental Outlaw (Invidious)</a>
has made a nice video explaining some important details/reasons for
running Gentoo, as well as <a href="https://yewtu.be/watch?v=6JUD-ZYuLPA">10leej
(Invidious)</a>, if you want to learn more.</p>
</blockquote>
<h2 id="it-takes-way-too-much-time-install-nobody-has-time-for-that">It takes way too much time install, nobody has time for that!</h2>
<p>It doesn&rsquo;t really take that much more time from installing Arch Linux,
I&rsquo;ve installed Gentoo on my desktop (Ryzen 7 5800X) the first time, in
~2 hours, most of which I&rsquo;ve spend reading the handbook. For reference,
my compile times are as follows:</p>
<p><em>output of <code>genlop -t &lt;package&gt;</code></em></p>
<blockquote>
<p>sys-kernel/gentoo-kernel-6.1.57 merge time: 15 minutes and 40 seconds.
www-client/firefox-115.4.0 merge time: 15 minutes and 26 seconds.
app-editors/emacs-29.1-r1 merge time: 52 seconds.
x11-wm/qtile-0.22.1-r2 merge time: 6 seconds.</p>
</blockquote>
<p>The only time consuming compile times I&rsquo;ve seen were for firefox &amp;
linux kernel, both of which are just 30 min combined, you also have
the option to use -bin packages instead. With the exception of those 2
packages mentioned above, I haven&rsquo;t spend more than 2 minutes
compiling a package.</p>
<p>I&rsquo;ve first considered setting up <a href="https://www.distcc.org/">distcc</a> for
my ThinkPad x220, but eventually I decided to let firefox &amp;
gentoo-kernel compile while I&rsquo;m on the gym for my workout.</p>
<blockquote>
<p>Note: I&rsquo;ve only installed ~700 packages on ThinkPad, and ~900 on my
desktop, most of that difference is due to installing
qemu/virt-manager on my desktop &amp; random fonts. I&rsquo;m not using a DE,
if you are planning to use GNOME or KDE etc. you might have a
different experience than me in that regard, since many DE&rsquo;s are
quite large and take a lot of time to compile.</p>
</blockquote>
<h2 id="summary">Summary</h2>
<p>I&rsquo;ve been enjoying running Gentoo on all my devices for the past
weeks. One of the main advantages of Gentoo is the control it provides
for tailoring your system to your liking. This is bundled with one of the
best documentation, if not the best, available to learn everything you
need to know about using your Linux system.</p>
<p>The community is rather chill &amp; friendly that welcomes new
contributions and will help you with any issue you might have.</p>
<blockquote>
<p>If you are able to read and follow instructions on how to install &amp; use your
system, you will find Gentoo to be a simple, reliable Linux
Distribution, with a helpful community. If you want a &ldquo;just works&rdquo;
experience, stay away from Gentoo, it&rsquo;s a &ldquo;Nerd&rsquo;s Only Allowed&rdquo;
place.</p>
</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Why we need more .org sites.</title>
      <link>https://thanosapollo.org/posts/more-org-sites/</link>
      <pubDate>Tue, 07 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/more-org-sites/</guid>
      <description>Why change the site extension to .org from .com</description>
      <content:encoded><![CDATA[<p>Today&rsquo;s web needs more .org sites. I&rsquo;m changing this site&rsquo;s extension
to thanosapollo.org from .com.</p>
<h2 id="about">About</h2>
<p>I&rsquo;ve first registered this site using <code>thanosapollo.com</code>, <code>.com</code> is
the <em>default</em> when it comes to today&rsquo;s websites, roughly 50% of
websites use it and that&rsquo;s what most users are familiar with.</p>
<blockquote>
<p><code>.com</code> stands for commercial/for profit, although it&rsquo;s sometimes
also used by blogs and nonprofit sites to capture more visitors. On
the other hand, <code>.org</code> is associated with nonprofit organizations,
or that generally provide free information and resources.</p>
</blockquote>
<!--quoteend-->
<blockquote>
<p>The context of this post refers to <code>.org</code> not just as a top level
domain, but as a freely accessible FOSS site.</p>
</blockquote>
<h2 id="why-switch-to-.org-and-why-we-need-more-.org-sites">Why switch to .org and why we need more .org sites</h2>
<p>I&rsquo;m not planning to use this site for any kind of commercial/for
profit purpose, having a <code>.org</code> extension implies that this site purpose
is non-commercial. Even though it&rsquo;s less popular, I find that today&rsquo;s
web landscape needs more <code>.org</code> sites and less <code>.com</code>.</p>
<p>About ~10 years ago, <em>when I was 13 years old</em>, the web seemed to be a
sanctuary of freely available information. 10 years later, even
useless information is behind a javascript pay-wall or login portal.
The web&rsquo;s increased traffic has been followed with lesser valuable
content creation, with today&rsquo;s users being accustomed to using the
&lsquo;web&rsquo; only through mobile social media apps, making them tied to a
proprietary ecosystem where they don&rsquo;t even own their profiles on said
platforms, their webmaster does.</p>
<p>We need more sites that offer free information for all and less people
behind proprietary platforms. I hope in the future we have more people
actually owning the sites they share their content. They might make
blogs or whatever else they like, as long as less of them end up at
the mercy of big tech <code>.com</code> companies.</p>
<blockquote>
<p>Even if you are after creating only for-profit content, making your
business depend entirely on a 3rd party is not the brightest idea.</p>
</blockquote>
<h2 id="difficulties-of-changing-my-site-to-.org">Difficulties of changing my site to .org</h2>
<p>The only issue with changing my site&rsquo;s extension was updating my
project&rsquo;s git remotes &amp; package recipes as well email services to the
new domain name. Although this is more of an inconvenience rather
than an actual difficulty.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
