<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Unexpected cool pointer</title><description>This is my personal blog where I write about things I like.</description><link>https://followthetrace.com/</link><language>en-us</language><item><title>Deploying a Go Web App to a DigitalOcean VPS</title><link>https://followthetrace.com/blog/deploy-go-web-app-digital-ocean-2024-08-27.mdx/</link><guid isPermaLink="true">https://followthetrace.com/blog/deploy-go-web-app-digital-ocean-2024-08-27.mdx/</guid><pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;First we need to create a DigitalOcean account and create a new droplet. You can
find the instructions for this in the &lt;a href=&quot;https://www.digitalocean.com/docs/droplets/how-to/create/&quot;&gt;DigitalOcean documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Connect via ssh to the droplet to set up the environment&lt;/h2&gt;
&lt;p&gt;After creating the droplet, we need to connect to it using SSH. The following
steps will guide you through the process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open your terminal&lt;/li&gt;
&lt;li&gt;Run the following command to connect to your droplet:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;ssh root@your_droplet_ip # should be something else of course
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here you can create a new user and set up a password for it. This is a more
secure way to connect to your droplet. The root user has full access to the system,
it is recommended to create a new user with limited permissions.&lt;/p&gt;
&lt;p&gt;Run the following command to create a new user:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;adduser &quot;&amp;lt;username&amp;gt;&quot;
usermod -aG sudo &quot;&amp;lt;username&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then you would login with the new user this way:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh username@your_droplet_ip
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Enter your password when prompted. You are now connected to your droplet&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Run the following command to update the package list:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we will install the Git and Go programming language on the droplet.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install git golang
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Setup Git&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &quot;&amp;lt;Name&amp;gt;&quot;
git config --global user.email &quot;&amp;lt;GH-Mail&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Build the Go Web Application&lt;/h2&gt;
&lt;p&gt;First we create the directory for our Go web application:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir ~/go-web-app
cd ~/go-web-app
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we create the main file for our Go web application:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# you can use nano too
vim main.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To create a simple web server, add the following code to the &lt;code&gt;main.go&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;net/http&quot;
)

func main() {
	http.HandleFunc(&quot;/&quot;, func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, &quot;Hello World&quot;)
	})

	http.HandleFunc(&quot;/greet/&quot;, func(w http.ResponseWriter, r *http.Request) {
		name := r.URL.Path[len(&quot;/greet/&quot;):]
		fmt.Fprintf(w, &quot;Hello %s\n&quot;, name)
	})

	http.ListenAndServe(&quot;:9990&quot;, nil)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then build the binary:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;go build main.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create a binary file named &lt;code&gt;main&lt;/code&gt; in the go app directory.&lt;/p&gt;
&lt;h2&gt;Create the Systemd Service&lt;/h2&gt;
&lt;p&gt;Now we have the binary file for our Go web application, but running it manually
is not enough to ensure the application stays active after server restarts
or crashes. To address this, we need to create a systemd service file.&lt;/p&gt;
&lt;p&gt;This file will define how our application should be managed by the system,
ensuring it starts automatically on boot and restarts if it crashes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# you can name it as you like
sudo vim /etc/systemd/system/go-web-app.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The content of the &lt;code&gt;go-web-app.service&lt;/code&gt; file should look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=&amp;lt;name-of-your-app&amp;gt;

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/home/&amp;lt;username&amp;gt;/&amp;lt;path-to-go-app&amp;gt;/main

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To start the service and enable it to start on boot, run the following commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start go-web-app
sudo systemctl enable go-web-app
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Setup Nginx and reverse proxy&lt;/h2&gt;
&lt;p&gt;First of all, we need to install Nginx on the droplet. Run the following commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we need to configure Nginx to serve our Go web application. Create a new
file in the &lt;code&gt;/etc/nginx/sites-available&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/nginx/sites-available/&amp;lt;your_domain&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now add the following configuration to the file &lt;code&gt;/etc/nginx/sites-available/&amp;lt;your_domain&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    server_name your_domain www.your_domain;

    location / {
        proxy_pass http://localhost:8080;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;proxy_pass&lt;/code&gt; directive tells Nginx to forward all requests to the specified URL.&lt;/p&gt;
&lt;p&gt;Next we need to create a symbolic link to the &lt;code&gt;/etc/nginx/sites-enabled&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/&amp;lt;your_domain&amp;gt; /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And reload the Nginx service:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To make sure that the deployment is successful, you can visit your domain in a
web browser go to &lt;strong&gt;http://your_domain&lt;/strong&gt; and you should see the message &lt;code&gt;Hello World&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It might be that your domain service is not pointing to the correct DNS server.
For changing that you need to go to your domain provider and point the domain to the correct DNS server.&lt;/p&gt;
&lt;p&gt;For example for porkbun you can do the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your domain provider and login&lt;/li&gt;
&lt;li&gt;Go to the DNS settings&lt;/li&gt;
&lt;li&gt;Add a new A record with the IP of your droplet with no host&lt;/li&gt;
&lt;li&gt;Add a new A record with the IP of your droplet with www as the host&lt;/li&gt;
&lt;li&gt;Save the changes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is better explained in this link &lt;a href=&quot;https://kb.porkbun.com/article/54-pointing-your-domain-to-hosting-with-a-records&quot;&gt;Setup Porkbun DNS with external VPS&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Bonus: Firewall Setup&lt;/h2&gt;
&lt;h2&gt;Secure the Nginx with Let&apos;s Encrypt&lt;/h2&gt;
&lt;p&gt;This is an optional step, but it&apos;s recommended to secure your Nginx server with a
free SSL certificate from Let&apos;s Encrypt, so the domain can be accesed via HTTPS.&lt;/p&gt;
&lt;p&gt;TODO: Setup firewall&lt;/p&gt;
&lt;h1&gt;Generate a deploy SSH key&lt;/h1&gt;
&lt;p&gt;This step is necesary to allow the server to pull the code from the repository.&lt;/p&gt;
&lt;p&gt;First we need to generate a new SSH key on the server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &quot;deploy@your_domain&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command generates a new SSH key using the Ed25519 algorithm, which is more
secure and efficient than older algorithms. The &lt;code&gt;-C&lt;/code&gt; flag adds a comment to
identify the key.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; If you already have a key generated, you can skip this step.
Only proceed with creating a new key if you don&apos;t have one or want a separate
key for deployment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To know if you already have a key generated you can run the command above and
you will see something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
/root/.ssh/id_ed25519 already exists.
Overwrite (y/n)?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then we should say &lt;code&gt;n&lt;/code&gt; and we can use the existing key or generate a separated
one with the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &quot;deploy@your_domain&quot; -f ~/.ssh/id_ed25519_deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create a separated key that you can use specifically for the
deployment of your domain.&lt;/p&gt;
&lt;p&gt;After generating the key, you&apos;ll need to add it to your GitHub or GitLab account:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cat ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Copy the output and add it as a deploy key in your repository settings on GitHub
or GitLab. More info on how to add a deploy key can be found in the
&lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys#set-up-deploy-keys&quot;&gt;GitHub documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next, test the SSH connection to ensure it&apos;s working correctly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this setup, we can now clone the repository onto the server and implement
an automated deployment process. We can achieve this with GitHub Actions:&lt;/p&gt;
&lt;p&gt;In the next section, we&apos;ll explore how to set this up.&lt;/p&gt;
&lt;h2&gt;Setup GitHub Actions for Automated Deployment&lt;/h2&gt;
&lt;p&gt;Sources: &lt;br /&gt;
&lt;a href=&quot;https://www.digitalocean.com/docs/droplets/how-to/create/&quot;&gt;How to create a VPS on DigitalOcean&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-deploy-a-go-web-application-using-nginx-on-ubuntu-18-04&quot;&gt;How to deploy a Go web application using Nginx on Ubuntu 18.04&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://thecodebeast.com/auto-deploy-git-on-digital-ocean-or-any-other-vps/&quot;&gt;Auto deploy git on DigitalOcean or any other VPS&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-22-04&quot;&gt;Secure Ngix with Lets Encrypt&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>deploy</category><category>go</category><category>digitalocean</category><category>vps</category><category>nginx</category></item><item><title>Escape the algorithm with RSS</title><link>https://followthetrace.com/blog/escape-the-algorithm-with-rss.mdx/</link><guid isPermaLink="true">https://followthetrace.com/blog/escape-the-algorithm-with-rss.mdx/</guid><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Quote from &quot;../../components/Quote.vue&quot;;&lt;/p&gt;
&lt;h2&gt;How to unplug&lt;/h2&gt;
&lt;p&gt;&amp;lt;Quote author=&quot;Morpheus&quot; source=&quot;The Matrix (1999)&quot;&amp;gt;
I can only show you the door. You’re the one that has to walk through it.
&amp;lt;/Quote&amp;gt;&lt;/p&gt;
&lt;p&gt;A couple of months ago I started my journey to get off social media, at least
as much as possible. I removed the last-standing social apps that I had:
Instagram, to &quot;keep up&quot; with my friends, and TikTok, to &quot;keep up&quot; with the news,
and kept some like YouTube, Reddit, etc.&lt;/p&gt;
&lt;p&gt;This seemed hard at the start, and I had recurring thoughts about
how disconnected from my social circle and &quot;THE NEWS&quot; I was becoming. But surprisingly,
it got easier quickly, and I think this is not because I am not interested in
my friends or the accounts that I followed on TikTok, but because of how
unpleasant I felt when using these apps.&lt;/p&gt;
&lt;p&gt;For me, it is not only how the UI nowadays is at least 10 times more addictive
than before or how many more ads we now have everywhere. The main problem, and
the reason it was unpleasant, is how little control I had over what
I was seeing while using the app.&lt;/p&gt;
&lt;p&gt;The apps got completely algorithm-centric, and everything is made to take you away
from the plan that you had when opening the app to get you back into the algorithm.
You already know what I am talking about.&lt;/p&gt;
&lt;h2&gt;A world of illusion&lt;/h2&gt;
&lt;p&gt;Instagram was an easy one. I uninstalled the app and did not have any cravings again.
I am already in contact with my close friends and family via messaging apps, and when I used it,
the majority of the time I was simply doomscrolling accounts of other people that I
do not care about as much. The only problem was when friends sent me some links, or
I wanted to check the profile of some artist to look for tour dates or any other interesting topics.
In those cases, I used the browser version, and that sometimes got me back into Insta stories or doomscrolling.&lt;/p&gt;
&lt;p&gt;The solution that I found for that was to add a blocking rule in uBlock Origin
for the web version, so every time I open a link from &lt;code&gt;instagram.com&lt;/code&gt; I get a
screen with the message &quot;uBlock Origin has prevented the following page from loading&quot;
and &quot;Go back&quot; and &quot;Proceed&quot; buttons. This way at least I get a big warning to
remind me of the dangers of Instagram before diving in.&lt;/p&gt;
&lt;p&gt;{/* pics of instagram block in ublock origin here */}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TikTok&lt;/strong&gt; was harder to get out of. My brain got too addicted to having small dopamine
spikes during the day while feeling up to date with current geopolitical
affairs and tech news.&lt;/p&gt;
&lt;p&gt;&quot;How am I supposed to live my life without knowing what crazy thing Donald Trump
said 2 hours ago?!&quot;&lt;/p&gt;
&lt;p&gt;So in the end, of course, the solution was simply not using the app.
I uninstalled it and stuck with the demons I already knew: YouTube, Reddit, and HN.&lt;/p&gt;
&lt;p&gt;The problem is that &lt;strong&gt;YouTube&lt;/strong&gt; is falling into the same basket of addictive, algorithmic
apps. I want to keep it because I can still find high-quality content there,
but there is also a lot of content there nowadays that is made to release quick dopamine hits.&lt;/p&gt;
&lt;p&gt;This was dangerous because I would use it in the same way that I was using TikTok.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reddit&lt;/strong&gt; can sometimes have the same effect when doomscrolling comments, and some
of the tech communities that I follow can get too dramatic/toxic sometimes, so
I just use it to do some research about specific topics.&lt;/p&gt;
&lt;p&gt;The way I use &lt;a href=&quot;https://news.ycombinator.com/&quot;&gt;&lt;strong&gt;Hacker News&lt;/strong&gt;&lt;/a&gt; is not that bad,
given that I just check the &quot;Top Stories&quot; page in search of some tech- and
software-related news, and normally I don&apos;t get too interested in the comment
section if it&apos;s not something that I am specifically interested in.&lt;/p&gt;
&lt;p&gt;So I decided to keep those three apps as &quot;alternatives&quot; to the addictive TikTok,
but with some rules.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YouTube&lt;/strong&gt;: Love some content there, but it&apos;s getting more dangerous every day to
use their UI. I added a 1 h/day time limit and deleted it from my home screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reddit&lt;/strong&gt;: Doomscrollable UI, but in my case I just deleted it from my phone home
page and found that I do not use it as much anymore, just when doing web research
about topics. No need for limitation rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hacker News&lt;/strong&gt;: This is still on my phone home screen, can easily check it for 30 m
a day and forget about it. The UI is really simple and not addictive at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But still, I felt that I did not have as much control of the content that I
consume as I would like to; for sure there should be a better way.&lt;/p&gt;
&lt;h2&gt;The choosen one&lt;/h2&gt;
&lt;p&gt;I used RSS in the past, but it never stuck with me. I also did not love many of
the big reader apps that people recommended online, like &lt;a href=&quot;https://www.inoreader.com/&quot;&gt;Inoreader&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This time I got interested in RSS again because I was searching for a way to
subscribe to multiple sources in one feed and thought that I needed to create my
own app because I did not find something similar.&lt;/p&gt;
&lt;p&gt;But, of course, I was reinventing the wheel, given that this already existed-it’s RSS!
As my mother-in-law would say, I had a Milky Way moment[^1].&lt;/p&gt;
&lt;p&gt;The only feature that I was missing was a way to sync all my RSS sources across
different RSS reader apps, like, for example, &lt;a href=&quot;https://www.feedflow.dev/&quot;&gt;FeedFlow&lt;/a&gt;
or &lt;a href=&quot;https://newsboat.org/&quot;&gt;Newsboat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of course, this also already existed, and it’s one of the main reasons I got back
into RSS. It is called &lt;a href=&quot;https://miniflux.app/&quot;&gt;Miniflux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically, it&apos;s a self-hosted server where you can create multiple accounts to
store RSS feeds, and those feed sources can be consumed by multiple RSS reader
apps via an integration.&lt;/p&gt;
&lt;p&gt;You can also be perfectly happy simply using the default Miniflux UI, as it is
simple and performant.&lt;/p&gt;
&lt;p&gt;Miniflux is designed to use as few resources as possible. You can run an
instance on a Pi Zero or a NAS with no downtime at all.&lt;/p&gt;
&lt;p&gt;For now, I decided to use a PikaPod instance for the small price of $10/year +
$5 for daily backups. In the near future, I might get a NAS and run it there,
with some other self-hosted solutions like &lt;a href=&quot;https://immich.app/&quot;&gt;Immich&lt;/a&gt;, but
this is for another day, and in that case, it will get free fast.&lt;/p&gt;
&lt;h2&gt;There Is No Spoon&lt;/h2&gt;
&lt;p&gt;The sensible thing to do now is to ask: what do I gain from running this Miniflux
instance or with any form of RSS in general?
Yeah, it&apos;s techy and cool, but does it really make a difference?&lt;/p&gt;
&lt;p&gt;And the response to that is simple: control.&lt;/p&gt;
&lt;p&gt;Now when I see some blog post, podcast, or YouTube channel that I like, I simply add
it to my Miniflux instance, so every time any of those sources adds new content,
I will be updated in a minimal feed of my choice that only shows what I
want it to show. And of course, I would like to get lost in the
YouTube algorithm once in a while to find new interesting topics, but it will be willingly and
not when I just want to check an update of my favorite channel.&lt;/p&gt;
&lt;p&gt;And given that it is all on a Miniflux server, I can have multiple devices, with
the apps that I like the most for each device, without having to export, import, and
share my data with any venture capital company like Feedly or Google with Google
Reader.&lt;/p&gt;
&lt;p&gt;You own your feed, you own what you consume, and more importantly, you control
the way that you consume it. I hope it has been a useful quick read.&lt;/p&gt;
&lt;p&gt;[^1]: A Milky Way moment is a term used by my girlfriend and my mother-in-law
to describe when you have a revelation about the meaning or the etymology of some word
or phrase that you used for a while. Once you have the Milky Way moment, it now makes
sense and you can&apos;t unsee it. A good example would be Ray-Ban; it&apos;s not the last name
of the brand founder but just the wording used to describe glasses that ban rays.&lt;/p&gt;
</content:encoded><category>rant</category><category>rss</category></item><item><title>Xivat: Global notification marks</title><link>https://followthetrace.com/blog/project-idea-xivat-global-notif-marks.mdx/</link><guid isPermaLink="true">https://followthetrace.com/blog/project-idea-xivat-global-notif-marks.mdx/</guid><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Notification from &quot;../../components/Notification.vue&quot;;&lt;/p&gt;
&lt;p&gt;The app will be named Xivat. It means &lt;em&gt;snitch&lt;/em&gt; in catalan.&lt;/p&gt;
&lt;h2&gt;The idea&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;You create some type of identificator that its anoymous for everyone
&lt;ol&gt;
&lt;li&gt;Internally each phone should be identified&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;You give access to location and maybe other stuff&lt;/li&gt;
&lt;li&gt;The app will ask for what is happening where you are now?
&lt;ol&gt;
&lt;li&gt;This is part of the initial tutorial&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;You can add a question or create a snitch
&lt;ol&gt;
&lt;li&gt;Questions are answered by snitch, and those are &quot;planted&quot; in any area of the map&lt;/li&gt;
&lt;li&gt;Snitch can answer questions or leave answers in the area&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Each question/answer can contain a photo and the text&lt;/li&gt;
&lt;li&gt;There should be a trust system for all the users, questions can be downvoted
of course and there should be moderators.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;The main idea is that you activate the app and if you go around once in a while
it gets some information on the map, or if you want to keep it off it will
search for them when opening it.&lt;/p&gt;
&lt;p&gt;Then if you are on the map and you opened, you can configure in what radious you
want to answer, some questions will be urgent or need updated info. Other can be
static and grow for some time.&lt;/p&gt;
&lt;p&gt;Once the question is marked as answered by the owner it wille be archived, or
deleted if the oner put it as auto destructive.&lt;/p&gt;
&lt;p&gt;Important to note that this app will not be a socia network, all accounts will
be anoymous, to the users, Internally we have to identify all devices in case of report.&lt;/p&gt;
&lt;p&gt;The main idea is that the data will be the focus of the app, not the accounts/profiles
by doing this we will break the &quot;bussiness&quot; part of the internet that now reings
and created so many issues.&lt;/p&gt;
&lt;p&gt;If there is no account to follow, the importance is on the data, and the users will
not post what makes they have more subscribers, but what is interesting, because
they want to share something interesting.&lt;/p&gt;
&lt;p&gt;You can subscribe to the tags of the pins, or filter by context like pins created
in the last 12h that are urgent. Also you can subscribe to a location, an area.&lt;/p&gt;
&lt;h2&gt;Notifications by area&lt;/h2&gt;
&lt;p&gt;Also people could mark parts of the map where they want to get notification
from, for example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Enable 10km radious in location X, only urgent marks&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And when any new mark appears that is urgent in that radious it will get a notification.
We could have a way of knowing when the mark is already trusted or has some answers so the user does not get an empty notification if it does not want to.&lt;/p&gt;
&lt;p&gt;Some scenarios where this can be useful:&lt;/p&gt;
&lt;h2&gt;1. You are waiting for a package in the Correos station&lt;/h2&gt;
&lt;p&gt;You get the line ticket and it says that the current number is 230 and you are
the 265, that is 35 more people in front of you!&lt;/p&gt;
&lt;p&gt;You can leave a &quot;question&quot; in the map and go for a walk:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: &quot;Could anyone tell me the current number in the line?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This will be marked on the map, as a question thread where any user can answer:
You get some live updates on you phone:&lt;/p&gt;
&lt;p&gt;&amp;lt;Notification author=&quot;John&quot; replies={2} time=&quot;14:30&quot;&amp;gt;
232
&amp;lt;/Notification&amp;gt;&lt;/p&gt;
&lt;p&gt;Then you forget to check for a while and get another one:&lt;/p&gt;
&lt;p&gt;&amp;lt;Notification author=&quot;Cathy&quot; type=&quot;urgent&quot; replies={12} time=&quot;14:45&quot;&amp;gt;
260, hurry!
&amp;lt;/Notification&amp;gt;&lt;/p&gt;
&lt;p&gt;You come back on time and you got you package! There will be cases where some
app is already implemented for this, but for the cases that there is not this is
really useful.&lt;/p&gt;
&lt;h2&gt;2. You see some sidewalk blocked in you neighbourd&lt;/h2&gt;
&lt;p&gt;You add a picture with a comment in that location in the map so anyone can see,
with the tag of &quot;Construction&quot;. It can accept answers.&lt;/p&gt;
&lt;p&gt;Someone then can pass the next day and see that the construction is over, and
add an answer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q: &quot;Construction is done, finally!&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The answer has a pic of the finished construction and some user can verify the
answer if they are on the location or can justify being there recently.&lt;/p&gt;
&lt;h2&gt;3. You are new on the neighborhood and got robed in a street&lt;/h2&gt;
&lt;p&gt;Also one of the owners of the shop in the street tells you that its always a
problem in this street for ever.&lt;/p&gt;
&lt;p&gt;You don&apos;t want this to happen to anyone else, so you create a &quot;Wisdom pin&quot; in
the map!&lt;/p&gt;
&lt;p&gt;Wisdom Pin: &quot;Be carful with this street, I got robed yesterday and the locals say that this happens all the time!&quot;&lt;/p&gt;
&lt;p&gt;Then the users can validate how real its this wisom pin, if its still useful
after some time or this is already fixed.&lt;/p&gt;
&lt;p&gt;This is the main idea for now, also I think it would be really useful to have a
good search engine for the app so anyone can try to search for specific words
and filter by location, tags etc.&lt;/p&gt;
</content:encoded><category>project</category></item><item><title>HackRSS: URL centric discussion network</title><link>https://followthetrace.com/blog/project-idea-hackrss-rss-feed-with-comments.mdx/</link><guid isPermaLink="true">https://followthetrace.com/blog/project-idea-hackrss-rss-feed-with-comments.mdx/</guid><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;This idea came while writing the post &lt;a href=&quot;./escape-the-algorithm-with-rss.mdx&quot;&gt;Escape the algorithm with RSS&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
</content:encoded><category>project</category><category>rss</category></item><item><title>Setup pass as a multi device password manager</title><link>https://followthetrace.com/blog/setup-pass-2025-12-28.mdx/</link><guid isPermaLink="true">https://followthetrace.com/blog/setup-pass-2025-12-28.mdx/</guid><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I started to take password management more seriously lately.&lt;/p&gt;
&lt;p&gt;Reusing passwords is bad. Storing them in notes is worse. Depending on an external
service always puts you in a walled garden and that is never good.&lt;/p&gt;
&lt;p&gt;I want the password store to be &lt;strong&gt;mine&lt;/strong&gt;, portable, simple and boring.&lt;/p&gt;
&lt;p&gt;That is why &lt;code&gt;pass&lt;/code&gt; its perfect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Passwords are just GPG encrypted files&lt;/li&gt;
&lt;li&gt;Stored in a git repo&lt;/li&gt;
&lt;li&gt;Works on laptop and phone perfectly so far&lt;/li&gt;
&lt;li&gt;No servers, no accounts, no subscriptions!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;The idea is very simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There is a single password store&lt;/li&gt;
&lt;li&gt;It lives in a git repository&lt;/li&gt;
&lt;li&gt;All devices clone and sync that repo (yes, automatically, wait for a sec)&lt;/li&gt;
&lt;li&gt;The same GPG key is used everywhere&lt;/li&gt;
&lt;li&gt;Apps and browsers use pass for autofill&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;At a high level the flow looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
  R[(Password Store in git)]

  subgraph Laptop
    L1[Pass]
    L2[Apps]
  end

  subgraph Android
    P1[Pass]
    P2[Browser]
  end

  L1 --&amp;gt;|Autofill| L2
  P1 --&amp;gt;|Autofill| P2

  R &amp;lt;--&amp;gt;|Sync| L1
  R &amp;lt;--&amp;gt;|Sync| P1

  L1 --&amp;gt;|GPG key| P1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The laptop is usually the place where the store is created and managed but you do you.
The phone syncs and consumes it, you can always use tmux to setup everything in the phone of course.&lt;/p&gt;
&lt;h2&gt;1. Access your phone via SSH&lt;/h2&gt;
&lt;p&gt;On Android your best bet is to use &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.termux&amp;amp;pli=1&quot;&gt;Termux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the phone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pkg update
pkg install openssh sshd passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Start sshd and check the IP:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sshd
hostname -I
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the laptop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh u0_a482@PHONE_IP -p 8022
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once this works you can treat the phone almost like a normal machine.&lt;/p&gt;
&lt;h2&gt;2. Git access from the phone&lt;/h2&gt;
&lt;p&gt;The phone needs SSH access to your git host.&lt;/p&gt;
&lt;p&gt;On the phone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N &quot;&quot;
cat ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add that public key to your Git provider (GitHub, GitLab, etc).&lt;/p&gt;
&lt;p&gt;Test it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -T git@github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then clone the password store:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:username/password-store.git ~/password-store
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. Import the GPG key&lt;/h2&gt;
&lt;p&gt;The same GPG key must exist on all devices.&lt;/p&gt;
&lt;p&gt;On the laptop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --export-secret-keys --armor YOUR_KEY_ID &amp;gt; key.asc
scp -P 8022 key.asc u0_a482@PHONE_IP:~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On the phone:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpg --import ~/key.asc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you use an Android app like &lt;strong&gt;OpenKeychain&lt;/strong&gt;, also import &lt;code&gt;key.asc&lt;/code&gt; there.&lt;/p&gt;
&lt;h2&gt;4. Enable Autofill on Android&lt;/h2&gt;
&lt;p&gt;Go to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Android Settings -&amp;gt; Passwords &amp;amp; Accounts -&amp;gt; Autofill service&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Select &lt;strong&gt;Password Store&lt;/strong&gt; and grant the permissions it asks for.&lt;/p&gt;
&lt;p&gt;After this, browsers and apps can request credentials from pass.&lt;/p&gt;
&lt;h2&gt;5. Entry naming matters&lt;/h2&gt;
&lt;p&gt;Autofill matching is based on entry names.&lt;/p&gt;
&lt;p&gt;Use domains as paths:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;github.com/marcel
amazon.com/personal
mybank.co.uk/login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Avoid generic names without domains, those usually don&apos;t match.&lt;/p&gt;
&lt;h2&gt;Final result&lt;/h2&gt;
&lt;p&gt;You end up with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One encrypted password store&lt;/li&gt;
&lt;li&gt;Synced with git&lt;/li&gt;
&lt;li&gt;Works offline&lt;/li&gt;
&lt;li&gt;No third-party services&lt;/li&gt;
&lt;li&gt;Autofill on laptop and Android&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is not flashy, but it is reliable, transparent and fully under your control.&lt;/p&gt;
</content:encoded><category>learn</category><category>tools</category></item></channel></rss>