<?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>Projects on Thanos Apollo</title>
    <link>https://thanosapollo.org/projects/</link>
    <description>Recent content in Projects on Thanos Apollo</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://thanosapollo.org/projects/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Bebliotheca</title>
      <link>https://thanosapollo.org/projects/bebliotheca/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/projects/bebliotheca/</guid>
      <description>&lt;p&gt;Bebliotheca is a digital recreation of the Library of Constantinople.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Currently under active development&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The site is accessible &lt;a href=&#34;https://bebliotheca.thanosapollo.org&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://git.thanosapollo.org/bebliotheca&#34;&gt;Upstream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://codeberg.org/bebliotheca/bebliotheca&#34;&gt;Codeberg Mirror&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;project-goals&#34;&gt;Project goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A repository with all the important works that someone would have
found in Constantinople during the Roman Era.&lt;/li&gt;
&lt;li&gt;Data in plain text &lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; format.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;latest-corpus-log&#34;&gt;Latest Corpus log&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CORPUS STATISTICS:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Total unique works:       &lt;span style=&#34;color:#ae81ff&#34;&gt;2690&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Greek texts:              &lt;span style=&#34;color:#ae81ff&#34;&gt;2316&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  English translations:     &lt;span style=&#34;color:#ae81ff&#34;&gt;757&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Latin texts:              &lt;span style=&#34;color:#ae81ff&#34;&gt;374&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TRANSLATION COVERAGE:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Greek with English:       &lt;span style=&#34;color:#ae81ff&#34;&gt;571&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;24%&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Greek with Latin:         &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  All three languages:      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Greek without translation:1745 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;75%&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  English-only works:       &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Latin-only works:         &lt;span style=&#34;color:#ae81ff&#34;&gt;188&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>Bebliotheca is a digital recreation of the Library of Constantinople.</p>
<blockquote>
<p>Currently under active development</p>
</blockquote>
<p>The site is accessible <a href="https://bebliotheca.thanosapollo.org">here</a>.</p>
<ul>
<li><a href="https://git.thanosapollo.org/bebliotheca">Upstream</a></li>
<li><a href="https://codeberg.org/bebliotheca/bebliotheca">Codeberg Mirror</a></li>
</ul>
<h2 id="project-goals">Project goals</h2>
<ul>
<li>A repository with all the important works that someone would have
found in Constantinople during the Roman Era.</li>
<li>Data in plain text <a href="https://orgmode.org/">org-mode</a> format.</li>
</ul>
<h2 id="latest-corpus-log">Latest Corpus log</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>CORPUS STATISTICS:
</span></span><span style="display:flex;"><span>  Total unique works:       <span style="color:#ae81ff">2690</span>
</span></span><span style="display:flex;"><span>  Greek texts:              <span style="color:#ae81ff">2316</span>
</span></span><span style="display:flex;"><span>  English translations:     <span style="color:#ae81ff">757</span>
</span></span><span style="display:flex;"><span>  Latin texts:              <span style="color:#ae81ff">374</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>TRANSLATION COVERAGE:
</span></span><span style="display:flex;"><span>  Greek with English:       <span style="color:#ae81ff">571</span> <span style="color:#f92672">(</span>24%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>  Greek with Latin:         <span style="color:#ae81ff">0</span> <span style="color:#f92672">(</span>0%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>  All three languages:      <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>  Greek without translation:1745 <span style="color:#f92672">(</span>75%<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>  English-only works:       <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>  Latin-only works:         <span style="color:#ae81ff">188</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Gnosis</title>
      <link>https://thanosapollo.org/projects/gnosis/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/projects/gnosis/</guid>
      <description>Spaced Repetition-like System for GNU Emacs.</description>
      <content:encoded><![CDATA[<p>GNU Emacs Knowledge System, for note taking and self testing.</p>
<ul>
<li>
<p>Git repositories:</p>
<ul>
<li><a href="https://git.thanosapollo.org/gnosis">Main Repository</a></li>
<li><a href="https://codeberg.org/ThanosApollo/emacs-gnosis">Codeberg Mirror</a></li>
</ul>
</li>
<li>
<p>Manual:</p>
<ul>
<li><a href="https://elpa.nongnu.org/nongnu/doc/gnosis.html">NonGNU ELPA</a></li>
</ul>
</li>
<li>
<p><a href="/log/gnosis/">Changelog</a></p>
</li>
</ul>
<h2 id="about">About</h2>
<p>Gnosis is a personal knowledge management and spaced repetition system
for Emacs.  It integrates two complementary subsystems in a single
package: a Zettelkasten-style note system called <strong>nodes</strong>, and a
flashcard-based self-testing system built around <strong>themata</strong>.  Both
subsystems share a single SQLite database, and their contents are
designed to be linked together so that flashcard questions can refer
directly to the notes they are drawn from.</p>
<p>The name gnosis (Greek: <em>γνῶσις</em>, knowledge) reflects the package&rsquo;s
philosophical orientation: the goal is not mere memorization but the
deliberate construction of knowledge over time.</p>
<h2 id="why-gnosis">Why Gnosis</h2>
<p>Most spaced repetition tools treat flashcards as isolated units.
You create a card, review it, and the system schedules the next
review.  The cards have no relationship to each other or to anything
outside the review loop.</p>
<p>Most note-taking tools do the opposite: they help you build a web of
interconnected ideas, but they offer no mechanism for systematically
testing and reinforcing what you have written.</p>
<p>Gnosis bridges these two approaches.  Your notes and your review
material live in the same system, linked together.  When you write a
node about a topic, you can create themata whose questions reference
that node.  When you review, you can review all the questions linked to
a given note, or follow the link graph to review related topics.  The
goal is a single system where understanding and recall reinforce each
other.</p>
<h2 id="installation">Installation</h2>
<p>Gnosis is available via <a href="https://elpa.gnu.org/packages/gnosis.html">GNU ELPA</a>, &amp; <a href="https://packages.guix.gnu.org/packages/emacs-gnosis">GNU Guix</a></p>
<p>Example using <code>use-package</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;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package gnosis
</span></span><span style="display:flex;"><span>  :init
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">define-prefix-command</span> <span style="color:#e6db74">&#39;my/gnosis-map</span>)
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">define-prefix-command</span> <span style="color:#e6db74">&#39;my/gnosis-nodes-map</span>)
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">define-prefix-command</span> <span style="color:#e6db74">&#39;my/journal-map</span>)
</span></span><span style="display:flex;"><span>  :config
</span></span><span style="display:flex;"><span>  (setf gnosis-journal-file (<span style="color:#a6e22e">expand-file-name</span> <span style="color:#e6db74">&#34;journal.org.gpg&#34;</span> gnosis-journal-dir)
</span></span><span style="display:flex;"><span>        gnosis-journal-as-gpg <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>        gnosis-nodes-show-tags <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>        gnosis-script-input-method-alist
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#39;</span>((greek <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;greek-polytonic&#34;</span>)
</span></span><span style="display:flex;"><span>          (cyrillic <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;cyrillic-translit&#34;</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (setf gnosis-custom-values
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#39;</span>((:tag <span style="color:#e6db74">&#34;demo&#34;</span> (:proto (<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">3</span>) :anagnosis <span style="color:#ae81ff">3</span> :amnesia <span style="color:#ae81ff">0.45</span> :epignosis <span style="color:#ae81ff">0.5</span>
</span></span><span style="display:flex;"><span>                                 :agnoia <span style="color:#ae81ff">0.4</span> :lethe <span style="color:#ae81ff">2</span>))
</span></span><span style="display:flex;"><span>          (:tag <span style="color:#e6db74">&#34;English&#34;</span> (:amnesia <span style="color:#ae81ff">0.55</span> :proto (<span style="color:#ae81ff">0</span> <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">3</span>) :lethe <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>                                      :epignosis))
</span></span><span style="display:flex;"><span>          (:tag <span style="color:#e6db74">&#34;vocabulary&#34;</span> (:amnesia <span style="color:#ae81ff">0.65</span> :proto (<span style="color:#ae81ff">0</span> <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">3</span>))))
</span></span><span style="display:flex;"><span>        gnosis-nodes-timestring <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>  :bind ((<span style="color:#e6db74">&#34;C-c c&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;my/gnosis-map</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;C-c n&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;my/gnosis-nodes-map</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;C-c j&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;my/journal-map</span>)
</span></span><span style="display:flex;"><span>         :map my/gnosis-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;d&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-dashboard</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;j j&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-journal</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;j f&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-journal-find</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;n i&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-insert</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;n t&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-insert-template</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;S&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-db-sync</span>)
</span></span><span style="display:flex;"><span>         :map my/gnosis-nodes-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;f&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-find</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;S&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-db-sync</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;t&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-insert-template</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;i&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-insert</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;d&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-nodes-delete-file</span>)
</span></span><span style="display:flex;"><span>         :map my/journal-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;j&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-journal</span>)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;f&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;gnosis-journal-find</span>)
</span></span><span style="display:flex;"><span>         :map gnosis-nodes-mode-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;C-c i&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;org-id-get-create</span>))
</span></span><span style="display:flex;"><span>  :custom
</span></span><span style="display:flex;"><span>  (gnosis-vc-auto-push <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>  (gnosis-default-average-review-period <span style="color:#ae81ff">30</span>)
</span></span><span style="display:flex;"><span>  (gnosis-algorithm-day-start-hour <span style="color:#ae81ff">3</span>))
</span></span></code></pre></div><h2 id="screenshots">Screenshots</h2>
<figure>
    <img loading="lazy" src="/images/gnosis-basic-example.png"
         alt="Figure 1: gnosis basic note"/> <figcaption>
            <p><span class="figure-number">Figure 1: </span>gnosis basic note</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/gnosis-basic-example-answer.png"
         alt="Figure 2: gnosis basic review answer"/> <figcaption>
            <p><span class="figure-number">Figure 2: </span>gnosis basic review answer</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/gnosis-cloze-basic.png"
         alt="Figure 3: gnosis cloze note type"/> <figcaption>
            <p><span class="figure-number">Figure 3: </span>gnosis cloze note type</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/gnosis-cloze-answered.png"
         alt="Figure 4: gnosis post review"/> <figcaption>
            <p><span class="figure-number">Figure 4: </span>gnosis post review</p>
        </figcaption>
</figure>]]></content:encoded>
    </item>
    <item>
      <title>jabber.el</title>
      <link>https://thanosapollo.org/projects/jabber/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/projects/jabber/</guid>
      <description>Emacs XMPP Client</description>
      <content:encoded><![CDATA[<h2 id="about">About</h2>
<figure>
    <img loading="lazy" src="https://elpa.nongnu.org/nongnu/jabber.svg"/> 
</figure>

<p><code>jabber.el</code> is an <a href="http://xmpp.org">XMPP</a> client for Emacs.</p>
<p>See the <a href="https://xmpp.org/software/jabber-el/">xmpp.org page</a> for the full list of supported XEPs.</p>
<ul>
<li>
<p><a href="https://thanosapollo.org/projects/jabber/">Homepage</a></p>
</li>
<li>
<p>Source:</p>
<ul>
<li><a href="https://git.thanosapollo.org/emacs-jabber/">Upstream</a></li>
<li><a href="https://codeberg.org/emacs-jabber/emacs-jabber/">Codeberg</a> <em>Mirror</em></li>
</ul>
</li>
</ul>
<h2 id="requirements">Requirements</h2>
<ul>
<li>Emacs 29.1 or later, compiled with dynamic module support</li>
</ul>
<h3 id="omemo-encryption--optional">OMEMO encryption (optional)</h3>
<p>OMEMO end-to-end encryption requires building a native C module.  You
need a C compiler, <code>pkg-config</code>, and <code>libmbedtls</code> (the development
headers).  On first load, Emacs will prompt to build the module
automatically.</p>
<h2 id="installation">Installation</h2>
<p><code>jabber.el</code> is available via <a href="https://elpa.nongnu.org/nongnu/jabber.html">NonGNU ELPA</a>.</p>
<p>You can install it via <code>M-x package-install RET jabber</code></p>
<h3 id="package-vc--emacs-30-plus">package-vc (Emacs 30+)</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package jabber
</span></span><span style="display:flex;"><span>  :ensure <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>  :vc (:url <span style="color:#e6db74">&#34;https://git.thanosapollo.org/emacs-jabber/&#34;</span>
</span></span><span style="display:flex;"><span>            :branch <span style="color:#e6db74">&#34;master&#34;</span>
</span></span><span style="display:flex;"><span>            :rev :newest
</span></span><span style="display:flex;"><span>            :lisp-dir <span style="color:#e6db74">&#34;lisp&#34;</span>)
</span></span><span style="display:flex;"><span>  :custom
</span></span><span style="display:flex;"><span>  (jabber-account-list <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;user@example.org&#34;</span>)))
</span></span><span style="display:flex;"><span>  :config
</span></span><span style="display:flex;"><span>  (jabber-modeline-mode <span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>  :bind-keymap ((<span style="color:#e6db74">&#34;C-x C-j&#34;</span> <span style="color:#f92672">.</span> jabber-global-keymap))
</span></span><span style="display:flex;"><span>  :hook (<span style="color:#a6e22e">kill-emacs</span> <span style="color:#f92672">.</span> jabber-disconnect))
</span></span></code></pre></div><h3 id="gnu-guix">GNU Guix</h3>
<p>The repository ships a <code>guix.scm</code> that builds straight from the
current working tree, so you never need to update hashes or pin a
commit.  Whatever is checked out is what gets installed.  Picomemo is
fetched as a pinned input by <code>guix.scm</code>, so the optional OMEMO
submodule does not need to be initialised.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>git clone https://git.thanosapollo.org/emacs-jabber/
</span></span><span style="display:flex;"><span>cd emacs-jabber
</span></span></code></pre></div><p>One-shot install into your user profile:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>guix package -f guix.scm
</span></span></code></pre></div><p>A development shell with all build dependencies:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>guix shell -D -f guix.scm
</span></span></code></pre></div><p>To use <code>emacs-jabber</code> from a Guix Home configuration, load the
package definition and reference it from your services:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#a6e22e">use-modules</span> (<span style="color:#a6e22e">gnu</span> home)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">gnu</span> home services)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">gnu</span> home services guix)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">gnu</span> services)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">guix</span> channels)
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">guix</span> gexp))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#66d9ef">define </span>emacs-jabber-git
</span></span><span style="display:flex;"><span>  (load <span style="color:#e6db74">&#34;/path/to/emacs-jabber/guix.scm&#34;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">home-environment</span>
</span></span><span style="display:flex;"><span> (<span style="color:#a6e22e">packages</span> (list emacs-jabber-git)))
</span></span></code></pre></div><p>Re-run <code>guix home reconfigure</code> after pulling new commits and the
package will be rebuilt from the updated checkout.</p>
<h2 id="configuration">Configuration</h2>
<p>Accounts are configured via <code>jabber-account-list</code>.  The simplest form
uses auth-source <code>~/.authinfo.gpg</code> for passwords:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq jabber-account-list <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;user@example.org&#34;</span>)
</span></span><span style="display:flex;"><span>                             (<span style="color:#e6db74">&#34;second@account.org&#34;</span>)))
</span></span></code></pre></div><p>With <code>pass</code> (password-store):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq jabber-account-list
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">`</span>((<span style="color:#e6db74">&#34;user@example.org&#34;</span>
</span></span><span style="display:flex;"><span>         (:password <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(auth-source-pass-get <span style="color:#e6db74">&#39;secret</span> <span style="color:#e6db74">&#34;xmpp/example.org/user&#34;</span>)))))
</span></span></code></pre></div><h2 id="basic-commands">Basic commands</h2>
<table>
  <thead>
      <tr>
          <th>Key</th>
          <th>Command</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>M-x jabber-connect</code></td>
          <td>Connect (prompts for account)</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-c</code></td>
          <td>Connect all accounts</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-d</code></td>
          <td>Disconnect</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-r</code></td>
          <td>Open roster buffer</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-j</code></td>
          <td>Start or switch to a chat</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-m</code></td>
          <td>Join/switch to a MUC (groupchat)</td>
      </tr>
      <tr>
          <td><code>C-x C-j C-b</code></td>
          <td>Switch to a chat buffer</td>
      </tr>
  </tbody>
</table>
]]></content:encoded>
    </item>
    <item>
      <title>YeeTube</title>
      <link>https://thanosapollo.org/projects/yeetube/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/projects/yeetube/</guid>
      <description>YouTube front-end for GNU Emacs.</description>
      <content:encoded><![CDATA[<p>GNU Emacs YouTube front-end.</p>
<ul>
<li><a href="https://git.thanosapollo.org/yeetube/">Git Repository</a></li>
<li><a href="https://codeberg.org/ThanosApollo/emacs-yeetube">Codeberg Mirror</a></li>
</ul>
<figure>
    <img loading="lazy" src="/images/yeetube-thumbnails.png"
         alt="Figure 1: yeetube showcase"/> <figcaption>
            <p><span class="figure-number">Figure 1: </span>yeetube showcase</p>
        </figcaption>
</figure>

<h2 id="about">About</h2>
<blockquote>
<p><em>Yee(t) (You)Tube</em></p>
</blockquote>
<p>This package provides the ability to scrape YouTube, with the results
displayed in a tabulated list.</p>
<p>Core features include:</p>
<ul>
<li>Executing queries on YouTube</li>
<li>Playing &amp; Downloading video(s)</li>
<li>A standalone, minimalist yt-dlp wrapper</li>
</ul>
<p><em>This package does not use Invidious or YouTube&rsquo;s API, just &ldquo;parses&rdquo;
html &amp; json.</em></p>
<h2 id="installation">Installation</h2>
<p><em>YeeTube is available via <a href="https://melpa.org/#/yeetube">MELPA</a></em></p>
<p>Example using <code>use-package</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;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package yeetube
</span></span><span style="display:flex;"><span>  :ensure <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>  :init (<span style="color:#a6e22e">define-prefix-command</span> <span style="color:#e6db74">&#39;my/yeetube-map</span>)
</span></span><span style="display:flex;"><span>  :bind ((<span style="color:#e6db74">&#34;C-c y&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;my/yeetube-map</span>)
</span></span><span style="display:flex;"><span>          :map my/yeetube-map
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;s&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-search</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;b&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-play-saved-video</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;d&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-download-videos</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;p&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-mpv-toggle-pause</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;v&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-mpv-toggle-video</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;V&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-mpv-toggle-no-video-flag</span>)
</span></span><span style="display:flex;"><span>          (<span style="color:#e6db74">&#34;k&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">&#39;yeetube-remove-saved-video</span>)))
</span></span></code></pre></div><h3 id="dependencies">Dependencies</h3>
<ul>
<li><a href="https://mpv.io/">mpv</a></li>
<li><a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a></li>
</ul>
<p><em>Debian/Ubuntu</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo apt install mpv yt-dlp
</span></span></code></pre></div><h2 id="configuration">Configuration</h2>
<h3 id="media-player">Media Player</h3>
<p>By default <code>yeetube-play-function</code> is set to <code>yeetube-mpv-play</code>, you can
use <a href="https://github.com/kljohann/mpv.el">mpv.el</a>,
<a href="https://www.gnu.org/software/emms/">GNU/Emms</a> or other similar
packages like so:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf yeetube-play-function <span style="color:#a6e22e">#&#39;</span>emms-play-url)
</span></span></code></pre></div><p>Make sure that the media player of your choice can directly play
youtube urls.</p>
<h3 id="thumbnails">Thumbnails</h3>
<p>Disable thumbnails:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf yeetube-display-thumbnails-p <span style="color:#66d9ef">nil</span>)
</span></span></code></pre></div><h3 id="apply-filters">Apply Filters</h3>
<p>To filter the search results based on a specific criterion, you can
modify the <code>yeetube-filter</code> value to your preferred option.</p>
<p>For example:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf yeetube-filter <span style="color:#e6db74">&#34;Views&#34;</span>)
</span></span></code></pre></div><p>This will filter &amp; sort the search results according to the number of views.</p>
<h3 id="tor-torsocks-support">Tor &amp; torsocks support</h3>
<p>For enhanced privacy, using tor &amp; torsocks:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf yeetube-enable-tor <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>      yeetube-mpv-enable-torsocks <span style="color:#66d9ef">t</span>) <span style="color:#75715e">;; if you are using yeetube-mpv as your media player</span>
</span></span></code></pre></div><p>It&rsquo;s recommended to disable thumbnail support to imrpove performance
when using tor.</p>
<p>Yeetube is configured to use tor via port 9050.</p>
<p><em>You can toggle that option for mpv with <code>yeetube-mpv-toggle-torsocks</code></em></p>]]></content:encoded>
    </item>
  </channel>
</rss>
