<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title><![CDATA[@unmonoqueteclea]]></title>
<description><![CDATA[@unmonoqueteclea]]></description>
<link>https://unmonoqueteclea.github.io</link>
<lastBuildDate>Thu, 22 Jan 2026 17:55:30 +0100</lastBuildDate>
<item>
  <title><![CDATA[Re: Status of Voilib and building AI tools]]></title>
  <description><![CDATA[
<p>
Last week, a <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a> user reached out to me with two questions: how the project is
currently progressing, and whether I could recommend other AI-based tools that might
support his learning journey.
</p>

<p>
I’d like to share part of my reply here, since I believe it could be useful for others as
well:
</p>

<blockquote>
<p>
I’m glad to hear Voilib was useful for you. I have to admit that keeping it updated isn’t
one of my main priorities these days. It’s a project that’s a bit too big to simply
self-host on a Raspberry Pi and check in on every few weeks. It’s harder to maintain when
the number of channels grows: the transcription process uses a lot of CPU, and the
embeddings database grows really quickly.  Still, building it end-to-end was a lot of fun
and a huge learning experience.
</p>

<p>
If I had to rebuild it today, I would try to simplify every component much more. For
example, using <code>sqlite-vec</code> could be a nice way to store embeddings without relying on an
additional service. And without any doubt, I’d make heavy use of <a href="https://simonwillison.net/">Simon Willison</a>’s
excellent llm library (<a href="https://github.com/simonw/llm">https://github.com/simonw/llm</a>) as it handles embeddings, tool
calls, and supports any LLM provider. Both in a <code>CLI</code> and as a <code>Python</code> library.
</p>

<p>
In fact, that’s what I recommend to everyone: explore everything Simon has built on top of
that library. It’s impressive, and you can learn how agents really work without all the
unnecessary complexity others often add.  Write a <code>for</code> loop using tool calls and that
library and you will have built your own agent.
</p>

<p>
Good luck on your learning journey!
</p>

<p>
Best,
Pablo
</p>
</blockquote>


<p>
And that's it. AI hype or AI winter, just start small (really small),
build things, and you’ll see what’s signal and what’s just noise.
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> <a href="https://unmonoqueteclea.github.io/tag-llm.html">llm</a> <a href="https://unmonoqueteclea.github.io/tag-ml.html">ml</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <category><![CDATA[llm]]></category>
  <category><![CDATA[ml]]></category>
  <link>https://unmonoqueteclea.github.io/2025-09-15-re:-status-of-voilib-and-building-ai-tools.html</link>
  <guid>https://unmonoqueteclea.github.io/2025-09-15-re:-status-of-voilib-and-building-ai-tools.html</guid>
  <pubDate>Mon, 15 Sep 2025 19:45:00 +0200</pubDate>
</item>
<item>
  <title><![CDATA[Introducing jira.el: Emacs integration for Jira]]></title>
  <description><![CDATA[
<p>
I've just publised my first <code>Emacs</code> package: <a href="https://github.com/unmonoqueteclea/jira.el">jira.el</a>: an Emacs
integration for <code>Jira</code>.
</p>


<figure id="org125a203">
<a href="https://stable.melpa.org/#/jira"><img src="https://stable.melpa.org/packages/jira-badge.svg" alt="jira-badge.svg" class="org-svg"></a>

</figure>

<blockquote>
<p>
If you have no choice but to use Jira, at least do it without leaving Emacs.
</p>
</blockquote>

<p>
<a href="https://github.com/unmonoqueteclea/jira.el">jira.el</a> is an <code>Emacs</code> package that brings the "power" of Atlassian's
<code>Jira</code> right into your editor. It lets you list, filter, and inspect
issues, modify properties, and even add worklogs—all without leaving
Emacs.
</p>

<pre class="example" id="org55ad5fa">
ℹ️ Status &lt;2025-03-17 Mon&gt;: Jira is already part of MELPA! 🎉
</pre>

<p>
Key Features:
</p>

<ul class="org-ul">
<li><b>List &amp; Filter Issues</b>: Quickly view the issues assigned to you (or
your team) and apply custom JQL filters.</li>
<li><b>Issue Details</b>: Open and inspect detailed information about any Jira
issue.</li>
<li><b>Modify Issues</b>: Update properties and add worklogs directly from
your Emacs session.</li>
<li><b>Tempo Integration</b>: Seamlessly display <a href="https://www.tempo.io/">Tempo</a> worklogs to keep track
of time spent on tasks.</li>
</ul>



<figure id="org9614a89">
<img src="https://unmonoqueteclea.github.io/static/jirael-list-issues.png" alt="jirael-list-issues.png" width="100%">

<figcaption><span class="figure-number">Figure 1: </span>List issues in jira.el</figcaption>
</figure>


<figure id="org8272074">
<img src="https://unmonoqueteclea.github.io/static/jirael-list-worklogs.png" alt="jirael-list-worklogs.png" width="100%">

<figcaption><span class="figure-number">Figure 2: </span>List worklogs in jira.el</figcaption>
</figure>


<p>
<a href="https://github.com/unmonoqueteclea/jira.el">jira.el</a> combines a <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Tabulated-List-Mode.html">Tabulated List Mode</a>-based UI, with <a href="https://magit.vc/">Magit</a>-like
keyboard-driven menus, a combination loved by <code>Emacs</code> users.
</p>

<p>
Check out the <a href="https://github.com/unmonoqueteclea/jira.el">jira.el</a> documentation on <a href="https://github.com/unmonoqueteclea/jira.el">Github</a> for further details and
usage tips!
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> <a href="https://unmonoqueteclea.github.io/tag-emacs.html">emacs</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <category><![CDATA[emacs]]></category>
  <link>https://unmonoqueteclea.github.io/2025-02-28-introducing-jira.el:-emacs-integration-for-jira.html</link>
  <guid>https://unmonoqueteclea.github.io/2025-02-28-introducing-jira.el:-emacs-integration-for-jira.html</guid>
  <pubDate>Fri, 28 Feb 2025 19:20:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Voilib: Time to say goodbye]]></title>
  <description><![CDATA[
<p>
Voilib permanently shut down on December 14th, 2024.
</p>


<figure id="org97fd03d">
<img src="https://unmonoqueteclea.github.io/static/voilib-end.jpeg" alt="voilib-end.jpeg" width="80%">

<figcaption><span class="figure-number">Figure 1: </span>End of Voilib</figcaption>
</figure>

<p>
The decision wasn’t easy, but maintaining a project like this without
funding is challenging. While models like Whisper have revolutionized
transcription, processing countless hours of audio remains a complex
task. Additionally, managing large collections of embeddings requires
fine-tuning the retrieval system—something I currently don’t have the
time to tackle.
</p>

<p>
That said, <a href="https://github.com/unmonoqueteclea/voilib">Voilib is Open Source</a>, so anyone can set up their own
instance with ease. I plan to release updates soon to simplify
installation and enhance its robustness. And, of course, the project
is open for external contributions.
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <link>https://unmonoqueteclea.github.io/2024-12-22-voilib:-time-to-say-goodbye.html</link>
  <guid>https://unmonoqueteclea.github.io/2024-12-22-voilib:-time-to-say-goodbye.html</guid>
  <pubDate>Sun, 22 Dec 2024 13:31:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Introducing valencia-now: real-time traffic information about Valencia]]></title>
  <description><![CDATA[
<p>
<a href="https://valencianow.unmonoqueteclea.freemyip.com/">valencia-now</a>, a project that I announced a few days ago with great
reception on <a href="https://twitter.com/unmonoqueteclea/status/1769407185505644638">X</a>, is now public as of today 🎉.
</p>

<p>
This simple dashboard allows visualization of <b>real-time</b>, <b>historical</b>,
and <b>aggregated</b> data on <b>traffic</b> and <b>air quality</b> in Valencia.
</p>



<figure id="org03189f6">
<img src="https://unmonoqueteclea.github.io/static/valencianow.gif" alt="valencianow.gif" width="100%">

<figcaption><span class="figure-number">Figure 1: </span>valencia-now: real-time traffic information</figcaption>
</figure>
<div id="outline-container-org9233358" class="outline-2">
<h2 id="org9233358">Real-time information</h2>
<div class="outline-text-2" id="text-org9233358">
<p>
The <a href="https://valencia.opendatasoft.com">open data portal</a> of the Spanish city of Valencia provides
<b>real-time traffic data</b> for both <a href="https://valencia.opendatasoft.com/explore/dataset/punts-mesura-trafic-espires-electromagnetiques-puntos-medida-trafico-espiras-ele/">cars (and other motor vehicles)</a> and
<a href="https://valencia.opendatasoft.com/explore/dataset/punts-mesura-bicis-espires-electromagnetiques-puntos-medida-bicis-espiras-electr/table/">bicycles</a>. A series of electromagnetic loops distributed throughout the
city are capable of measuring the <b>intensity of vehicles</b> passing through
them. This information is published on an <code>hourly basis</code> for motor
vehicles and approximately every <code>30 minutes</code> for bicycles. With that
information, <a href="https://valencianow.unmonoqueteclea.freemyip.com/">valencia-now</a> is able to build these two maps representing
current traffic intensity:
</p>


<figure id="org43ee827">
<img src="https://unmonoqueteclea.github.io/static/valencianow-map.webp" alt="valencianow-map.webp" width="100%">

<figcaption><span class="figure-number">Figure 2: </span>Traffic maps in valencia-now</figcaption>
</figure>


<p>
The <b>bicycle traffic</b> is also represented in the same way, as well as
the <b>air quality</b> data obtained from various measurement stations
located in different parts of the city. In this case, we are
representing the air quality index, a value that can range from <code>1</code>
(<code>hazardous</code>) in color <b>purple</b> to <code>6</code> (<code>good</code>) in color <b>blue</b>.
</p>




<figure id="orgda4da11">
<img src="https://unmonoqueteclea.github.io/static/valencianow-ica.webp" alt="valencianow-ica.webp" width="100%">

<figcaption><span class="figure-number">Figure 3: </span>Air quality map in valencia-now</figcaption>
</figure>
</div>
</div>
<div id="outline-container-orgc254115" class="outline-2">
<h2 id="orgc254115">Historical and aggregated data</h2>
<div class="outline-text-2" id="text-orgc254115">
<p>
If I were to stop at that point, I wouldn't be adding much additional
value to this data, since the open data portal itself already provides
some simple visualizations of the current state of traffic and air
quality.
</p>

<p>
However, <a href="https://valencianow.unmonoqueteclea.freemyip.com/">valencia-now</a> is also <b>collecting and storing this information</b>
which allows me not only to see the current status but also the
<b>evolution</b>.
</p>


<figure id="org63e8b22">
<img src="https://unmonoqueteclea.github.io/static/valencianow-historical.webp" alt="valencianow-historical.webp" width="100%">

<figcaption><span class="figure-number">Figure 4: </span>Traffic data from a sensor on a bridge crossing the City Of Arts</figcaption>
</figure>

<p>
With that historical data, I am also able to provide aggregations such
as the following one that shows how the <b>air quality in the city centre
improved just a day after the <a href="https://en.wikipedia.org/wiki/Valencia_Fallas">Fallas</a> finished</b>.
</p>


<figure id="org8cdeeb3">
<img src="https://unmonoqueteclea.github.io/static/valencianow-agg.webp" alt="valencianow-agg.webp" width="100%">

<figcaption><span class="figure-number">Figure 5: </span>Air quality data by day from a sesnor located in the city centre</figcaption>
</figure>
</div>
</div>
<div id="outline-container-org6516eda" class="outline-2">
<h2 id="org6516eda">Next steps</h2>
<div class="outline-text-2" id="text-org6516eda">
<p>
In the following days, I would like to create some additional
blogposts.  I want to explain technical details about the <b>data
ingestion</b> and the <b>data transformation</b> processes (<code>spoiler</code>, <a href="https://www.tinybird.co/">tinybird</a>
made this extremly simple) and also about <b>public open data
iniciatives</b>.
</p>

<p>
At some point in time I would like to make the collected data
available for everyone, but this will require some work.
</p>

<p>
🗨️ As always, feel free to contact me (<code>unmonoqueteclea@gmail.com</code>) for
whatever doubt, suggestion or idea you may have. Happy to receive your
feedback!
</p>
</div>
</div>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <link>https://unmonoqueteclea.github.io/2024-03-21-introducing-valencia-now:-real-time-traffic-information-about-valencia.html</link>
  <guid>https://unmonoqueteclea.github.io/2024-03-21-introducing-valencia-now:-real-time-traffic-information-about-valencia.html</guid>
  <pubDate>Fri, 22 Mar 2024 09:00:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[The technology behind Voilib]]></title>
  <description><![CDATA[
<p>
Each week, <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a> diligently <b>collects and transcribes</b> hundreds of
podcast episodes. These valuable transcripts undergo a meticulous
indexing process, enabling a sophisticated <b>semantic search</b>
capability. As a result, our users can effortlessly execute
intelligent queries, pinpointing precisely the most relevant fragments
of podcast episodes.
</p>

<p>
I launched <b>Voilib</b> in December 2022 and, some months later, I decided
to embrace openness by making Voilib <a href="https://unmonoqueteclea.github.io/2023-07-02-voilib-is-now-open-source.html">Open Source</a>. This alowed everyone
to create their own instances, transcribe, and index their cherished
podcasts. You'll find it easily accessible on both <a href="https://github.com/unmonoqueteclea/voilib">Github</a> and
<a href="https://gitlab.com/unmonoqueteclea/voilib">Gitlab</a>. As promised, let me take you on a fascinating journey into the
captivating technology behind it.
</p>



<figure id="orgb825d8d">
<img src="https://unmonoqueteclea.github.io/static/voilib.gif" alt="voilib.gif" width="100%">

<figcaption><span class="figure-number">Figure 1: </span>Searching content in voilib.com</figcaption>
</figure>


<p>
Essentially, <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a>'s work can be divided into four main tasks:
<b>collecting</b> new episodes, <b>transcribing</b> them, <b>indexing</b> all the content,
and <b>querying</b> the vector database to find relevant fragments.
</p>
<div id="outline-container-orgae855a2" class="outline-2">
<h2 id="orgae855a2">🌐  Collect (new episodes)</h2>
<div class="outline-text-2" id="text-orgae855a2">
<p>
Almost all public podcasts have an associated <code>RSS feed</code> that contains
metadata about every episode, including a link to the audio file. As
an example, <a href="http://feeds.feedburner.com/TEDTalks_audio">this</a> is the feed from the <a href="https://www.ted.com/about/programs-initiatives/ted-talks/ted-talks-daily">Ted Talks Daily</a> podcast.
</p>

<p>
<b>Voilib</b> collects and stores <b>metadata</b> from the list of podcasts feeds
manually configured by the application admin. For each episode, it
stores in a <code>SQLite</code> database things such as the title, the description,
the language or the duration.
</p>

<p>
When I want to check if new episodes were published, I just need to
run this in a command line (although I have a <b>cron job</b> configured to
run it twice a day):
</p>

<div class="org-src-container">
<pre class="src src-bash">voilib-episodes --update
</pre>
</div>

<p>
If you want to dig into the code, check <a href="https://github.com/unmonoqueteclea/voilib/blob/main/backend/src/voilib/collection/feed.py">feed.py</a> and <a href="https://github.com/unmonoqueteclea/voilib/blob/main/backend/src/voilib/collection/crawler.py">crawler.py</a>
modules.
</p>
</div>
</div>
<div id="outline-container-org503845c" class="outline-2">
<h2 id="org503845c">🗨️ Transcript (episodes audios)</h2>
<div class="outline-text-2" id="text-org503845c">
<p>
The podcast episodes are transcribed using <a href="https://openai.com/research/whisper">Whisper, an Open Source
Speech Recognition Model developed by OpenAI</a>. <b>Voilib</b> effectively
leverages <code>Whisper</code>, utilizing the <a href="https://github.com/sanchit-gandhi/whisper-jax">whisper-jax</a> library. This
particular implementation of <code>Whisper</code> boasts exceptional efficiency,
showcasing speeds up to 70 times faster than comparable alternatives.
</p>

<p>
However, most <a href="https://github.com/sanchit-gandhi/whisper-jax">whisper-jax</a> optimizations are predominantly GPU-focused
(that <b>Voilib</b> is not using yet), I must admit that I have not observed
significant improvements in CPU performance when compared to the
<a href="https://github.com/openai/whisper">official implementation</a>. Nevertheless, the accuracy of this model is
nothing short of remarkable, even for the small version with "just"
39M parameters. It is truly astonishing to think that a few years ago,
having an Open Source Speech Recognition model as swift and accurate
as this one would have been deemed nearly implausible.
</p>

<p>
When I want to transcribe the new episodes from the last 3 days, I
just need to run this (I also have a <b>cron job</b> configured to run it):
</p>

<div class="org-src-container">
<pre class="src src-bash">voilib-episodes --transcribe-days 3
</pre>
</div>

<p>
For curious minds, you can check <a href="https://github.com/unmonoqueteclea/voilib/blob/main/backend/src/voilib/transcription.py">transcription.py</a> module.
</p>
</div>
</div>
<div id="outline-container-org3d14921" class="outline-2">
<h2 id="org3d14921">📇 Index (episodes trancriptions)</h2>
<div class="outline-text-2" id="text-org3d14921">
<p>
The process of generating episode transcripts involves breaking them
down into fragments, each comprising approximately 40 words. <b>Voilib</b>
employs the <a href="https://www.sbert.net/">sentence-transformers</a> <code>Python</code> library to calculate the
<b>embedding of each 40-words fragment</b>, effectively transforming it into
a <b>384-dimensional vector of floating point numbers</b>.
</p>

<p>
To shed light on the concept of <b>embeddings</b>, they can be defined as
lower-dimensional spaces that allow for the translation of
high-dimensional vectors.  The goal of embeddings is to capture
semantic similarity, ensuring that inputs with similar meanings are
placed closer together in the embedding space.
</p>

<p>
The <a href="https://www.sbert.net/">sentence-transformers</a> library stands out as the optimal choice for
creating text embeddings. This is the description from their <a href="https://www.sbert.net/">website</a>:
</p>

<blockquote>
<p>
You can use this framework to compute sentence / text embeddings for
more than 100 languages. These embeddings can then be compared
e.g. with cosine-similarity to find sentences with a similar
meaning. This can be useful for semantic textual similar, semantic
search, or paraphrase mining.
</p>

<p>
The framework is based on PyTorch and Transformers and offers a large
collection of pre-trained models tuned for various tasks. Further, it
is easy to fine-tune your own models.
</p>
</blockquote>

<p>
The model <b>Voilib</b> is using to calculate the embeddings is
<code>multi-qa-MiniLM-L6-cos-v1</code>. This model have been specifically trained
for Semantic Search with <a href="https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-dot-v1#training">215M question-answer pairs</a> from various
sources and domains.
</p>

<p>
You can find the code for Voilib's embedding calculation in the
<a href="https://github.com/unmonoqueteclea/voilib/blob/main/backend/src/voilib/embedding.py">embedding.py</a> module.
</p>

<p>
Those calculated vectors are then stored in a <b>vector database</b>, one of
the main components of the system. More on this in the next section.
</p>
</div>
</div>
<div id="outline-container-orge7b0a70" class="outline-2">
<h2 id="orge7b0a70">🔍 Query (embeddings)</h2>
<div class="outline-text-2" id="text-orge7b0a70">
<p>
Each episode's embeddings are meticulously preserved within a <b>vector
database</b>. In recent months, we have witnessed a surge in new
technologies specifically designed for storing embeddings. These
innovative solutions empower us to efficiently store embeddings and
seamlessly query them using cutting-edge <b>Approximate Nearest Neighbor
search</b> algorithms.
</p>

<p>
During the initial stages, <b>Voilib</b> relied on <a href="https://github.com/facebookresearch/faiss">Meta's FAISS</a> library for
embedding storage. However, to enhance the system and include
additional metadata for each embedding (that can be also used to
filter queries), I decided to migrate to <a href="https://qdrant.tech/">qdrant</a>, a higher-level
solution. With <a href="https://qdrant.tech/">qdrant</a>, we achieve the ability to incorporate
supplementary metadata while seamlessly managing embeddings. As part
of this evolution, <b>Voilib</b> now operates its own instance of the <a href="https://hub.docker.com/r/qdrant/qdrant/">qdrant
server</a>, further ensuring data autonomy and control.
</p>

<p>
For every <b>user prompt</b>, Voilib performs a swift calculation of the
corresponding embedding and efficiently queries the vector
database. This process enables the system to swiftly identify and
return the most relevant results, ensuring a seamless and satisfying
user experience.
</p>

<p>
Of course, there is another command to calculate and store embeddings
from all pending episodes:
</p>

<div class="org-src-container">
<pre class="src src-bash">voilib-episodes --store
</pre>
</div>

<p>
More, in the <a href="https://github.com/unmonoqueteclea/voilib/blob/main/backend/src/voilib/vector.py">vector.py</a> module.
</p>
</div>
</div>
<div id="outline-container-org57ac480" class="outline-2">
<h2 id="org57ac480">Happy to receive your feedback</h2>
<div class="outline-text-2" id="text-org57ac480">
<p>
Please feel free to reach out to me at <code>unmonoqueteclea@gmail.com</code> with
your thoughts, suggestions, or any inquiries.
</p>

<p>
I am eager to know which podcasts you would like to see available on
<a href="https://github.com/unmonoqueteclea/voilib">Voilib</a>. Additionally, if there are any specific features that you
believe would enhance your user experience and make your life easier,
please do not hesitate to share them with me. It's a fantastic
opportunity to contribute to the open-source community.
</p>

<p>
If you have been considering hosting your own instance, I would be
thrilled to support and guide you through the process.
</p>

<p>
I look forward to hearing from you!
</p>
</div>
</div>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <link>https://unmonoqueteclea.github.io/2023-08-03-the-technology-behind-voilib.html</link>
  <guid>https://unmonoqueteclea.github.io/2023-08-03-the-technology-behind-voilib.html</guid>
  <pubDate>Thu, 03 Aug 2023 20:26:00 +0200</pubDate>
</item>
<item>
  <title><![CDATA[Large Language Models (LLMs) as noise generators]]></title>
  <description><![CDATA[
<div id="outline-container-org6f49a2a" class="outline-2">
<h2 id="org6f49a2a">Introducing Jane: from bullet points to cover letter</h2>
<div class="outline-text-2" id="text-org6f49a2a">
<p>
Allow me to introduce you to <b>Jane Doe</b>, a seasoned <b>Software Engineer</b>
with 10 years of experience. Currently, Jane is exploring various job
opportunities and has come across a few enticing offers that demand a
cover letter as part of the application process.
</p>

<p>
In light of this circumstance, Jane has turned to <a href="https://chat.openai.com/">ChatGPT</a>, <b>seeking
assistance in crafting a compelling cover letter</b> tailored specifically
for a <b>healthcare startup</b>. The following <b>prompt</b> outlines the necessary
details for the task at hand.
</p>

<blockquote>
<p>
Imagine you are a Software Engineer with 10 years of experience that wants to apply for a Full-Stack Engineer position in a healthcare startup. Write a short cover letter with the following information:
</p>

<ul class="org-ul">
<li>I have more than 10 years of experience as a Software Engineer in multiple companies.</li>
<li>In one company, I led the migration from AWS to on-premises reducing infrastructure costs $400,000 a year.</li>
<li>I have experience working with sensitive healthcare data. I led a team of 50 Software Engineers that built a Hospital Management System currently being used in 10+ hospitals in the US.</li>
<li>I wrote a meditation app for iOS and Android with +5000 monthly  active users.</li>
</ul>
</blockquote>

<p>
You can find <a href="https://chat.openai.com/share/ee97f127-2a30-4613-8de2-8485cbb66135">here ChatGPT's response</a> (or just click <code>Details</code>
below). <a href="https://chat.openai.com/">ChatGPT</a>, as it usually does, produces an awesome 300+ words
cover letter including all the points asked by Jane.
</p>

<details id="org2b164bd">
<blockquote>
<p>
Dear [Recipient's Name],
</p>

<p>
I am writing to express my strong interest in the Full-Stack Engineer position at [Company Name]. As a highly skilled and motivated Software Engineer with over 10 years of industry experience, I am excited about the opportunity to contribute my expertise to a healthcare startup committed to making a positive impact on people's lives.
</p>

<p>
Over the course of my career, I have worked in diverse roles and companies, honing my technical skills and leadership capabilities. In one particular role, I spearheaded a critical project where I led the successful migration from AWS to an on-premises infrastructure, resulting in an impressive annual cost reduction of $400,000. This experience demonstrated my ability to strategize, plan, and execute complex technical initiatives while optimizing resources efficiently.
</p>

<p>
Additionally, I have had the privilege of working extensively with sensitive healthcare data, and I understand the importance of maintaining strict security and privacy standards. Leading a team of 50 Software Engineers in the development of a Hospital Management System deployed across 10+ hospitals in the US, I gained invaluable insights into the unique challenges and regulations surrounding healthcare technology. This project further solidified my commitment to building robust and reliable software solutions that enhance patient care and streamline healthcare operations.
</p>

<p>
Beyond my professional achievements, I have also successfully developed and launched a meditation app for both iOS and Android platforms. The app has garnered over 5000 monthly active users, showcasing my proficiency in delivering user-centric and engaging mobile applications.
</p>

<p>
Joining [Company Name] would be a tremendous opportunity for me to leverage my technical expertise, leadership experience, and passion for healthcare technology to contribute meaningfully to the company's mission. I am eager to collaborate with a dynamic team of like-minded individuals in driving innovation and positively impacting the healthcare industry.
</p>

<p>
Thank you for considering my application. I look forward to the possibility of discussing how my skills and experiences align with [Company Name]'s vision in greater detail.
</p>

<p>
Sincerely,
</p>
</blockquote>
</details>
</div>
</div>
<div id="outline-container-orgaef57e9" class="outline-2">
<h2 id="orgaef57e9">Introducing Joe: from cover letter to bullet points</h2>
<div class="outline-text-2" id="text-orgaef57e9">
<p>
Introducing now <b>Joe Shmoe</b>, the <b>HR leader</b> responsible for reviewing
Jane's captivating cover letter. In the fast-paced world of talent
acquisition, Joe faces the daunting task of sifting through an
impressive volume of cover letters daily. His goal is to identify the
standout applicants worthy of an interview. To accomplish this
challenging feat efficiently, Joe relies on the cutting-edge
capabilities of <b>ChatGPT to extract the key insights and main ideas</b>
from each cover letter:
</p>

<blockquote>
<p>
Could you please extract the 3 o 4 main pieces of information from this cover letter as bullet points?
</p>
</blockquote>

<p>
And this is the answer he obtains from ChatGPT (find it <a href="https://chat.openai.com/share/9c6a80fc-1974-4cbf-a61a-6d0119377c76">here)</a>:
</p>

<blockquote>
<ul class="org-ul">
<li>Highly skilled and motivated Software Engineer with over 10 years of industry experience</li>
<li>Led a successful migration project from AWS to on-premises infrastructure, resulting in an annual cost reduction of $400,000</li>
<li>Extensive experience in working with sensitive healthcare data and leading a team of 50 Software Engineers in the development of a Hospital Management System for 10+ hospitals in the US</li>
<li>Successfully developed and launched a meditation app for iOS and Android platforms with over 5000 monthly active users.</li>
</ul>
</blockquote>

<p>
Does it sounds familiar to you too?
</p>
</div>
</div>
<div id="outline-container-orgaf9fd46" class="outline-2">
<h2 id="orgaf9fd46">Is this the future?</h2>
<div class="outline-text-2" id="text-orgaf9fd46">
<p>
LLMs are beginning to change the process of <b>content generation</b> but
also <b>content consumption</b>, giving rise to some rather paradoxical
scenarios like the one I described.
</p>

<ul class="org-ul">
<li>When it comes to <b>content generation</b>, humans contribute valuable
information (<code>signal</code>), while LLMs (usually) decorate it with some
irrelevant elements, effectively adding <code>noise</code>.</li>

<li>During <b>content consumption</b>, humans trust LLMs to effectively
distinguish and eliminate <code>noise</code> from the essential information.</li>
</ul>

<p>
A fascinating <b>feedback loop</b> appears in this new paradigm, wherein
efforts are made to enhance the intelligence of LLMs by using text
sourced from the Internet, which in some cases might have been
generated by other LLMs (making the signal to noise ratio lower on
each iteration).
</p>

<p>
I'm intrigued by the future of Language Models and the potential
revolutionary applications they might enable but I wonder whether
we'll see a resurgence of encyclopedias as the primary source of
reliable information with a <b>high signal to noise ratio</b>.
</p>
</div>
</div>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-llm.html">llm</a> <a href="https://unmonoqueteclea.github.io/tag-ml.html">ml</a> </div>]]></description>
  <category><![CDATA[llm]]></category>
  <category><![CDATA[ml]]></category>
  <link>https://unmonoqueteclea.github.io/2023-07-30-large-language-models-(llms)-as-noise-generators.html</link>
  <guid>https://unmonoqueteclea.github.io/2023-07-30-large-language-models-(llms)-as-noise-generators.html</guid>
  <pubDate>Sun, 30 Jul 2023 17:48:00 +0200</pubDate>
</item>
<item>
  <title><![CDATA[Voilib is now Open Source]]></title>
  <description><![CDATA[
<p>
Today, I decided to <b>open-source</b> <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a> 🎉, the podcast search engine I
launched in December 2022. You can now <b>run your own instance</b> of it and
transcribe and index your favorite podcasts (or even your own
content!).You can find it on <a href="https://github.com/unmonoqueteclea/voilib">Github</a> or <a href="https://gitlab.com/unmonoqueteclea/voilib">Gitlab</a>.
</p>

<p>
Appearing in <a href="https://news.ycombinator.com/item?id=34115618">Show
HN</a> was a big boost for the project. That post was the main source of
traffic during the first days of life of <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a>. I am thrilled to see
that many of those initial users still use it today to discover
relevant podcast episodes on topics they are interested in. Throughout
these months, I have received valuable feedback and kind words from
some of them.
</p>


<figure id="org6ff3a38">
<img src="https://unmonoqueteclea.github.io/static/feedback-voilib.png" alt="feedback-voilib.png" width="100%">

<figcaption><span class="figure-number">Figure 1: </span>Feedback from a Voilib user</figcaption>
</figure>

<p>
Since I am not offering <code>Voilib PRO</code> any more (I may talk about this in
the future) the only funding for this project, to at least cover
server expenses, will come from <a href="https://ko-fi.com/unmonoqueteclea">donations</a> and <a href="https://ko-fi.com/unmonoqueteclea/commissions">customized assistance</a> to
people maintaining their own instances.
</p>

<p>
In the following weeks (well&#x2026; maybe months), I will publish some
blog posts explaining how the system works. I consider this is the
kind of content I would have loved to find some months ago when many
people suddenly became <code>prompt engineers</code>, but not so many people really
understood how to build actual LLM-based products beyond the chat
interface.
</p>

<p>
<b>UPDATE</b> <span class="timestamp-wrapper"><span class="timestamp">[2023-08-04 vie] </span></span> Read <a href="https://unmonoqueteclea.github.io/2023-08-03-the-technology-behind-voilib.html">here</a> about the technology behind <b>Voilib</b>.
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-projects.html">projects</a> </div>]]></description>
  <category><![CDATA[projects]]></category>
  <link>https://unmonoqueteclea.github.io/2023-07-02-voilib-is-now-open-source.html</link>
  <guid>https://unmonoqueteclea.github.io/2023-07-02-voilib-is-now-open-source.html</guid>
  <pubDate>Sun, 02 Jul 2023 12:32:00 +0200</pubDate>
</item>
<item>
  <title><![CDATA[Learning about Docker Contexts]]></title>
  <description><![CDATA[
<p>
A single <b>Docker CLI</b> to rule them all!  Let me show you a little
example of how I manage different Docker nodes.
</p>

<p>
My audio search engine, <a href="https://github.com/unmonoqueteclea/voilib">Voilib</a> is running on a remote machine,
configured in my <code>.ssh/config</code> file with the name <b>voilib</b>. I used to do
<code>ssh voilib</code> to open a new <b>SSH session</b> to execute commands such as
<code>docker stats</code> or <code>docker logs</code>. But then I discovered <a href="https://docs.docker.com/engine/context/working-with-contexts/">Docker Contexts</a>.
</p>

<p>
I created a new context just by doing:
</p>

<p>
<code>docker context create voilib --docker "host=ssh://voilib"</code>
</p>

<p>
Now, every time I need to run any Docker command in the <b>voilib</b> machine
I just do:
</p>

<p>
<code>docker context use voilib</code>.
</p>

<p>
From that moment, all the Docker commands such as <code>docker exec</code>, <code>docker
logs</code> or <code>docker stats</code> will be running inside the remote server!  When I
want to return to my local environment I do:
</p>

<p>
<code>docker context use default</code>
</p>


<p>
I even opened a new <a href="https://github.com/Silex/docker.el/pull/213">PR</a> in <a href="https://github.com/Silex/docker.el">docker.el</a> so that I can check available
contexts and change the active one from <code>Emacs</code>. How I wish I had
discovered it before!
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-docker.html">Docker</a> </div>]]></description>
  <category><![CDATA[Docker]]></category>
  <link>https://unmonoqueteclea.github.io/2023-02-18-learning-about-docker-contexts.html</link>
  <guid>https://unmonoqueteclea.github.io/2023-02-18-learning-about-docker-contexts.html</guid>
  <pubDate>Sat, 18 Feb 2023 21:54:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Emacs: Triggering rsync from dired]]></title>
  <description><![CDATA[
<p>
If you are a heavy <code>Emacs</code> user as me, you will have tried to move files
between different machines using <code>TRAMP</code>. But this approach is not nice
for large files. <code>TRAMP</code> is very slow for large files and it will block
<code>Emacs</code> during the file transfer.
</p>

<p>
Although <a href="https://github.com/stsquad/dired-rsync">dired-rsync</a> could help with that, I decided to write my own
solution, as this is a great usecase for the <a href="https://github.com/xenodium/dwim-shell-command">dwim-shell-command</a>
package I am testing these days.
</p>

<p>
And it turned out that the solution was as easy as this:
</p>

<div class="org-src-container">
<pre class="src src-emacs-lisp">(defun mono/dwim-rsync (output)
  "Use rsync to move selected files to OUTPUT."
  (interactive "D")
  (dwim-shell-command-on-marked-files
   (format "Moving selected files to %s" output)
   ;; we need to convert TRAMP ssh syntax (e.g. /ssh:myserver:/home)
   ;; to rsync syntax (e.g. myserver:/home). For the output file
   ;; it's easy, but for input files we need to do it in the command,
   ;; that is where '&lt;&lt;*&gt;&gt;' is expanded.
   (let ((clean-output (replace-regexp-in-string "\/ssh:" "" output))
         (clean-files-cmd "echo &lt;&lt;*&gt;&gt; | sed 's/\\/ssh://g'"))
     (format "%s | xargs -i rsync -aP {} %s" clean-files-cmd clean-output))
   :utils "rsync"))
</pre>
</div>

<p>
It could have been a one-liner but I had to add some additional logic
to transform <code>TRAMP</code> paths into valid <code>rsync</code> ones.
</p>

<p>
Now, I just need to select some files in <code>dired</code> and run
<code>mono/dwim-rsync</code>. This will let me specify in the minibuffer any path I
want (local or remote, using <code>ssh</code>), and <code>rsync</code> will be used to copy the
files. Bye, <code>Filezilla</code>!
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-emacs.html">emacs</a> </div>]]></description>
  <category><![CDATA[emacs]]></category>
  <link>https://unmonoqueteclea.github.io/2023-01-29-triggering-rsync-from-dired.html</link>
  <guid>https://unmonoqueteclea.github.io/2023-01-29-triggering-rsync-from-dired.html</guid>
  <pubDate>Sun, 29 Jan 2023 19:27:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[My public dotfiles]]></title>
  <description><![CDATA[
<p>
<b>tldr</b> My dotfiles are now public <a href="https://gitlab.com/unmonoqueteclea/dotfiles">on Gitlab</a> 🎉
</p>

<p>
Publishing one's <b>dotfiles</b> can feel like posting naked pictures. It may
show things that people wouldn't like to see. But I was finally brave
to do it (publishing dotfiles). I think it's fair to publish them, as
I have read many public dotfile repositories before writing mine. You
can find my dotfiles <a href="https://gitlab.com/unmonoqueteclea/dotfiles">on Gitlab</a>.
</p>
<div id="outline-container-org0e7cdb2" class="outline-2">
<h2 id="org0e7cdb2">GNU stow</h2>
<div class="outline-text-2" id="text-org0e7cdb2">
<p>
To keep a repository with all the dotfiles I am using <code>GNU Stow</code>. On its
<a href="https://www.gnu.org/software/stow/">website</a>, <code>GNU Stow</code> is defined as a <b>symlink farm manager</b>. It helps me to
manage automatically symlinks between <code>$HOME</code> (or any other place that
can contain dotfiles) and my dotfiles repository. I included a
<a href="https://gitlab.com/unmonoqueteclea/dotfiles/-/blob/main/makefile">makefile</a> in the repository to automatically create all the needed
links using this tool.
</p>
</div>
</div>
<div id="outline-container-orgb5d4453" class="outline-2">
<h2 id="orgb5d4453">Emacs config</h2>
<div class="outline-text-2" id="text-orgb5d4453">
<p>
The biggest part of my dotfiles repository is my <code>Emacs</code> configuration
in <a href="https://gitlab.com/unmonoqueteclea/dotfiles/-/tree/main/emacs/.emacs.d">emacs/.emacs.d</a>. I have a modularized <code>Emacs</code> configuration, keeping
<code>.el</code> files for things like agenda, theming, keybindings, etc. I try to
add explanations for everything I add there, so I hope they can be
useful to you.
</p>
</div>
</div>
<div id="outline-container-org25c8fb3" class="outline-2">
<h2 id="org25c8fb3">Secrets</h2>
<div class="outline-text-2" id="text-org25c8fb3">
<p>
There are always private things in your dotfiles that you don't want
to show.
</p>

<p>
For instance, in <a href="https://gitlab.com/unmonoqueteclea/dotfiles/-/tree/main/ssh/.ssh">ssh configuration</a>, there are some entries that I want
to keep secret. The solution was easy, I just need to add a new
<code>config.secret</code> file with those entries. That file will be included in
my <code>.gitignore</code> file and, to ensure I can access those entries, I added
the following to my main <a href="https://gitlab.com/unmonoqueteclea/dotfiles/-/blob/main/ssh/.ssh/config">config file</a>:
</p>

<div class="org-src-container">
<pre class="src src-bash">Include config.secret
</pre>
</div>

<p>
All your secret entries will be automatically imported!
</p>

<p>
I also keep some <i>gitignored</i> <code>*.secrets.sh*</code> files that include <b>APIs keys</b>
and similar things.
</p>
</div>
</div>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-linux.html">linux</a> <a href="https://unmonoqueteclea.github.io/tag-emacs.html">emacs</a> </div>]]></description>
  <category><![CDATA[linux]]></category>
  <category><![CDATA[emacs]]></category>
  <link>https://unmonoqueteclea.github.io/2022-12-26-my-public-dotfiles.html</link>
  <guid>https://unmonoqueteclea.github.io/2022-12-26-my-public-dotfiles.html</guid>
  <pubDate>Mon, 26 Dec 2022 20:20:00 +0100</pubDate>
</item>
<item>
  <title><![CDATA[Towards minimalism]]></title>
  <description><![CDATA[
<p>
<b>tldr</b> I moved the blog to an extremely simple static blog generator
with no dependencies, no <code>Javascript</code> and no magic tricks. Just plain
<code>HTML</code> and <code>CSS</code>. You can find the code <a href="https://github.com/unmonoqueteclea/unmonoqueteclea.github.io/">here</a>.
</p>

<p>
If you have been following this blog for some time you will have
noticed that I am not very good at keeping a routine of writing new
blog posts every week (or even every month). There was something that
created a lot of friction in the writing process (even more than the
white paper syndrome): every time I wanted to add new content, usually
after some months with no content, the blog build process was
broken. I spent more time fixing the blog than adding content to
it. This made me move to lightweight blogging systems like <a href="https://jekyllrb.com/">Jekyll</a>. But
it wasn't enough so I decided to embrace minimalism.
</p>

<p>
What is the very minimal list of features that I need in a blogging
framework?:
</p>

<ul class="org-ul">
<li>Convert from markup languages such as <code>markdown</code> or <code>org-mode</code> into
plain <code>html</code></li>
<li>Keep an updated <b>index</b> page</li>
<li>Automatically create a <code>rss.xml</code> file</li>
<li>Automatically create an <b>archive</b> page and, ideally, another page for
each <b>tag</b></li>
</ul>

<p>
Just that. Those are the only things that I need. And that is what
<a href="https://github.com/bastibe/org-static-blog">org-static-blog</a> gives me. One single dependency, integrated into
<code>Emacs</code>, my OS (well&#x2026; my code editor). No <code>Javascript</code>, just pure <code>HTML</code>
and <code>CSS</code>.
</p>
<div class="taglist"><a href="https://unmonoqueteclea.github.io/tags.html">Tags</a>: <a href="https://unmonoqueteclea.github.io/tag-blogging.html">blogging</a> </div>]]></description>
  <category><![CDATA[blogging]]></category>
  <link>https://unmonoqueteclea.github.io/2022-12-26-towards-minimalism.html</link>
  <guid>https://unmonoqueteclea.github.io/2022-12-26-towards-minimalism.html</guid>
  <pubDate>Mon, 26 Dec 2022 12:00:00 +0100</pubDate>
</item>
</channel>
</rss>
