<?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;-webkit-text-size-adjust:none;&#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;-webkit-text-size-adjust:none;"><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>emacs-forgejo</title>
      <link>https://thanosapollo.org/projects/emacs-forgejo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/projects/emacs-forgejo/</guid>
      <description>Emacs client for forgejo instances.</description>
      <content:encoded><![CDATA[<p>Emacs front-end for <a href="https://forgejo.org">Forgejo</a> instances (Codeberg, self-hosted, etc.).</p>
<ul>
<li>Browse, filter, and view issues and pull requests</li>
<li>Submit and merge PRs via <a href="https://forgejo.org/docs/latest/user/agit-support/">AGit-Flow</a> push options</li>
<li>Full code review workflow with threaded comments</li>
<li>Desktop notifications with mode-line indicator</li>
<li>Label, assignee, and milestone management</li>
<li><code>SQLite</code> cache for instant display and offline usage</li>
<li><code>#</code> and <code>@</code> completion in composition buffers</li>
<li>Repository settings editor</li>
</ul>
<blockquote>
<p>Requires Emacs 29.1+ (native JSON, native SQLite).
<em>Zero external dependencies.</em></p>
</blockquote>
<h2 id="installation">Installation</h2>
<h3 id="use-package--emacs-30-plus-recommended">use-package (Emacs 30+, recommended)</h3>
<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>(use-package forgejo-vc
</span></span><span style="display:flex;"><span>  :vc (:url <span style="color:#e6db74">&#34;https://codeberg.org/thanosapollo/emacs-forgejo&#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>  (forgejo-host <span style="color:#e6db74">&#34;https://codeberg.org&#34;</span>))
</span></span></code></pre></div><p>Store your token in <code>~/.authinfo.gpg</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-text" data-lang="text"><span style="display:flex;"><span>machine codeberg.org login YOUR_USERNAME password YOUR_TOKEN
</span></span></code></pre></div><p>Or set it directly (not recommended):</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>(setq forgejo-token <span style="color:#e6db74">&#34;your-personal-access-token&#34;</span>)
</span></span></code></pre></div><h3 id="manual">Manual</h3>
<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>(add-to-list <span style="color:#e6db74">&#39;load-path</span> <span style="color:#e6db74">&#34;/path/to/emacs-forgejo/lisp&#34;</span>)
</span></span><span style="display:flex;"><span>(require <span style="color:#e6db74">&#39;forgejo-vc</span>)
</span></span></code></pre></div><h3 id="guix">Guix</h3>
<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-sh" data-lang="sh"><span style="display:flex;"><span>guix package -f guix.scm
</span></span></code></pre></div><h2 id="usage">Usage</h2>
<p>From any git repository with a Forgejo remote, <code>C-x v f</code>
(<code>forgejo-vc</code>) opens the Forgejo transient menu.  All available
commands are listed there.</p>
<p><code>M-x forgejo</code> opens the top-level menu for repo search, issue/PR
browsing, and notifications.</p>
<p><code>M-x forgejo-modeline-mode</code> enables the mode-line notification
indicator with periodic polling.</p>
<h3 id="composition">Composition</h3>
<p>All composition buffers support <code>#</code> completion for issue/PR references
and <code>@</code> completion for user mentions.  Use <code>forgejo-compose-hook</code> for
custom setup:</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>(add-hook <span style="color:#e6db74">&#39;forgejo-compose-hook</span> <span style="color:#a6e22e">#&#39;</span>flyspell-mode)
</span></span></code></pre></div><h2 id="screenshots">Screenshots</h2>
<figure>
    <img loading="lazy" src="https://thanosapollo.org/images/emacs-forgejo--issue-01.png"
         alt="Figure 1: issue list"/> <figcaption>
            <p><span class="figure-number">Figure 1: </span>issue list</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="https://thanosapollo.org/images/emacs-forgejo--issue.png"
         alt="Figure 2: issue view"/> <figcaption>
            <p><span class="figure-number">Figure 2: </span>issue view</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="https://thanosapollo.org/images/emacs-forgejo--review-comment.png"
         alt="Figure 3: review comment"/> <figcaption>
            <p><span class="figure-number">Figure 3: </span>review comment</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="https://thanosapollo.org/images/emacs-forgejo--review-log.png"
         alt="Figure 4: review log"/> <figcaption>
            <p><span class="figure-number">Figure 4: </span>review log</p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="https://thanosapollo.org/images/emacs-forgejo--review-thread.png"
         alt="Figure 5: review thread"/> <figcaption>
            <p><span class="figure-number">Figure 5: </span>review thread</p>
        </figcaption>
</figure>

]]></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.gnu.org/packages/doc/gnosis.html">GNU 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;-webkit-text-size-adjust:none;"><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/about/">git.thanosapollo.org</a></li>
</ul>
</li>
</ul>
<h2 id="requirements">Requirements</h2>
<ul>
<li>Emacs 29.1 or later, compiled with dynamic module support</li>
<li><a href="https://elpa.gnu.org/packages/fsm.html">fsm</a> 0.2.0 or later</li>
<li><a href="https://elpa.gnu.org/packages/keymap-popup.html">keymap-popup</a> 0.2 or later</li>
</ul>
<h3 id="omemo-encryption--optional">OMEMO encryption (optional)</h3>
<p>OMEMO end-to-end encryption uses a native C module built from the
vendored <a href="https://github.com/mierenhoop/picomemo">picomemo</a> source.  Build dependencies: a C compiler,
<code>pkg-config</code>, and Mbed TLS 3.0 or later (<code>mbedcrypto</code>).</p>
<p>Build the module from the ELPA package directory:</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-sh" data-lang="sh"><span style="display:flex;"><span>cd /path/to/elpa/jabber-VERSION
</span></span><span style="display:flex;"><span>make module
</span></span></code></pre></div><p>The resulting <code>jabber-omemo-core.so</code> (or <code>.dylib</code> on macOS) lands
beside the Elisp files and is loaded automatically.  If the module is
missing, OMEMO use signals <code>OMEMO module not compiled</code>.</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>.  That is the only supported
install path.</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>(use-package jabber
</span></span><span style="display:flex;"><span>  :ensure <span style="color:#66d9ef">t</span>
</span></span><span style="display:flex;"><span>  :config
</span></span><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&#34;</span>)))))
</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><h2 id="configuration">Configuration</h2>
<h3 id="authentication">Authentication</h3>
<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;-webkit-text-size-adjust:none;"><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><h3 id="socks5-proxy">SOCKS5 proxy</h3>
<p>An account can connect through an unauthenticated SOCKS5 proxy:</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>(setq jabber-account-list
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;user@example.org&#34;</span>
</span></span><span style="display:flex;"><span>         (:proxy <span style="color:#f92672">.</span> (:type socks5 :host <span style="color:#e6db74">&#34;127.0.0.1&#34;</span> :port <span style="color:#ae81ff">9050</span>)))))
</span></span></code></pre></div><p>The destination hostname is sent to the proxy rather than resolved locally.
Proxy connections bypass SRV lookup and use the JID domain on port 5222, or
<code>:network-server</code> and <code>:port</code> when those are configured.  STARTTLS is supported.
Direct TLS discovery, proxy authentication, and other proxy protocols are not
supported for proxied accounts.</p>
<h3 id="bug-references">Bug references</h3>
<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>(add-hook <span style="color:#e6db74">&#39;jabber-chat-mode-hook</span> <span style="color:#a6e22e">#&#39;</span>bug-reference-mode)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; Customize references</span>
</span></span><span style="display:flex;"><span>(setq jabber-bug-reference-alist
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;jabber-el@conference\\.hmm\\.st&#34;</span>
</span></span><span style="display:flex;"><span>         <span style="color:#e6db74">&#34;\\(#\\([0-9]+\\)\\)&#34;</span>
</span></span><span style="display:flex;"><span>         <span style="color:#e6db74">&#34;https://todos.thanosapollo.org/r/emacs-jabber/%s&#34;</span>)))
</span></span></code></pre></div><h2 id="basic-commands">Basic commands</h2>
<ul>
<li>Use <code>M-x jabber-roster</code> or <code>C-x C-j C-r</code> to get started.</li>
</ul>
]]></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;-webkit-text-size-adjust:none;"><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;-webkit-text-size-adjust:none;"><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;-webkit-text-size-adjust:none;"><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;-webkit-text-size-adjust:none;"><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;-webkit-text-size-adjust:none;"><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;-webkit-text-size-adjust:none;"><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>
