summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--TODO.md12
-rw-r--r--WORKFLOW.md35
-rw-r--r--content/en/_index.md2
-rw-r--r--content/en/articles/git-setup-own-server-part2/index.md48
-rw-r--r--content/en/articles/manage-your-passwords-with-password-store/index.md92
-rw-r--r--content/en/articles/my-hugo-workflow/index.md346
-rw-r--r--content/en/articles/playing-with-colors/index.md2
-rw-r--r--content/en/articles/poker-time/index.md3
-rw-r--r--content/en/articles/pure-nerdgasm/index.md8
-rw-r--r--content/en/articles/r-i-p-steve-jobs/index.md2
-rw-r--r--content/en/articles/responsibility/index.md6
-rw-r--r--content/en/repository/index.md48
-rw-r--r--content/it/_index.md2
-rw-r--r--content/it/articles/le-email-queste-sconosciute/index.md6
-rw-r--r--content/it/articles/my-hugo-workflow/index.md346
-rw-r--r--content/it/articles/myself-as-a-droid/index.md4
-rw-r--r--content/it/articles/speak-to-me/index.md10
-rw-r--r--content/it/articles/wp_patcher-un-metodo-per-aggiornare-wordpress/index.md14
-rw-r--r--content/it/articles/xrandr-e-dual-head-su-slackware-12-2-e-intel/index.md6
-rw-r--r--content/it/repository/index.md67
-rw-r--r--data/repos.yaml35
-rw-r--r--docs/superpowers/specs/2026-04-28-adaptive-repo-grid-design.md67
-rw-r--r--hugo.toml78
-rw-r--r--i18n/en.yaml56
-rw-r--r--i18n/it.yaml56
-rw-r--r--static/uppies/2026/04/sl-hack-ware.jpgbin0 -> 603288 bytes
m---------themes/danix-xyz-hacker0
28 files changed, 1104 insertions, 248 deletions
diff --git a/.gitignore b/.gitignore
index fc3ea8e..db40613 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,3 +23,4 @@ danixxyz.tar.gz
# Brainstorming artifacts
.superpowers/
+.worktrees/
diff --git a/TODO.md b/TODO.md
index 89fd74c..7f19220 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,12 +1,16 @@
# danix.xyz TODO List
+## Urgent
+- [✅] missing related articles logic in sidebar for articles
+- [✅] article stats in sidebar (Author, number of words, reading time, thumbnail, etc.)
+
+## no top priority
+- [ ] lazy loading in list view should honor the article side (not all from left)
- [⏳] Content review (correct post type, fix thumbnails, metadata, etc.)
-- [✅] Related Articles widget in sidebar.
- [✅] social sharing sidebar widget
- [✅] titles redesign (mono font // Title)
- [✅] Sidebar widgets redesign (no box, mono font "# Title")
- [✅] Footer redesign (3-column, social badges, fortune cookie, tech badges, etc.)
-- [✅] related articles debug
- [✅] shortcodes cleanup (remove duplicates)
- [✅] Search functionality
- [✅] Open Graph meta tags for social sharing
@@ -21,8 +25,8 @@
- [✅] remove article type labels from static pages
- [✅] Create accessibility badges component (WCAG 2.1 AA, Keyboard Accessible, Screen Reader Compatible)
- [✅] Add badges to footer with links to A11Y-AUDIT-REPORT.md
-- [ ] theme and content should live on two separate git repos
-- [ ] Add accessibility section to About page
+- [✅] theme and content should live on two separate git repos
+- [✅] Add accessibility section to About page
### Optional Enhancements
- [ ] Analytics (privacy-respecting)
diff --git a/WORKFLOW.md b/WORKFLOW.md
index 6743d9d..e7cafd5 100644
--- a/WORKFLOW.md
+++ b/WORKFLOW.md
@@ -76,6 +76,41 @@ git commit -m "config: ..."
git push origin master
```
+### Mark an article as obsolete
+
+Add `obsolete = true` to the article's front matter. Optionally link to a successor article with `successor = "/path/to/article"`:
+
+```toml
++++
+title = "My Old Article"
+# ... other fields ...
+obsolete = true
+successor = "/articles/my-new-article"
++++
+```
+
+The banner appears automatically below the article header. If `successor` is set, it resolves the article title and links to it. Both EN and IT i18n strings are customizable in `i18n/en.yaml` and `i18n/it.yaml`.
+
+Paths are Hugo permalinks — for English articles, use `/articles/slug`, not `/en/articles/slug`.
+
+### Add an external link to the main menu
+
+Add a menu entry in `hugo.toml` with `params.external = true`:
+
+```toml
+[[menus.main]]
+ name = "GitHub"
+ url = "https://github.com/youruser"
+ weight = 10
+ [menus.main.params]
+ external = true
+```
+
+- `name` is used as-is (not looked up in i18n)
+- `url` must be a full URL including scheme
+- `weight` controls order relative to other menu items
+- External links open in a new tab with `rel="noopener noreferrer"` and include a screen-reader-only "(opens in new tab)" label for WCAG 2.1 AA compliance
+
---
## Working on the Theme
diff --git a/content/en/_index.md b/content/en/_index.md
index 450e04e..68fb715 100644
--- a/content/en/_index.md
+++ b/content/en/_index.md
@@ -7,4 +7,4 @@ description: "Portfolio and blog by Danilo Macrì"
Welcome to danix.xyz, my name is Danilo but you can call me danix.
-> Here I write about stuff I find interesting. On this site you may read about WordPress, Hugo, bash, Slackware, and lots of other things. Feel free to have a look and take what you like. \ No newline at end of file
+> Here I write about stuff I find interesting. On this site you may read about web development in WordPress, Hugo, AI, bash, Slackware GNU/Linux, and lots of other things. Feel free to have a look and take what you like. \ No newline at end of file
diff --git a/content/en/articles/git-setup-own-server-part2/index.md b/content/en/articles/git-setup-own-server-part2/index.md
index 42c50c4..2b10f29 100644
--- a/content/en/articles/git-setup-own-server-part2/index.md
+++ b/content/en/articles/git-setup-own-server-part2/index.md
@@ -12,32 +12,48 @@ tags = [ "git", "linux", "python", "howto", "automation", "ssh", "flask", "do it
This is a followup on [my previous article about how to setup your server][1] to handle a GIT repository and deploy to a web server like apache.
-Since I started experimenting with python and web publishing with it I wanted a way to push all the changes to my codebase directly to a web server, in a similar way as to what I already do with php and apache.<figure class="wp-block-pullquote" style="border-color:#abb8c3">
+Since I started experimenting with python and web publishing with it I wanted a way to push all the changes to my codebase directly to a web server, in a similar way as to what I already do with php and apache.
-<blockquote class="has-text-color has-very-dark-gray-color">
- <p>
- I want to do it myself, the way I like it..
- </p>
-
- <cite>danix</cite>
-</blockquote></figure>
+> I want to do it myself, the way I like it..
+>
+> — danix
-Serving python scripts is slightly different than serving html or php, here&#8217;s a scheme that shows what happens when using python (flask in this example) to serve some web content.
-
-
-<div class="wp-block-image">
- <figure class="aligncenter"><img loading="lazy" width="1024" height="393" src="https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-1024x393.png" alt="" class="wp-image-3852" srcset="https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-1024x393.png 1024w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-300x115.png 300w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme-768x294.png 768w, https://danix.xyz/wp-content/uploads/2018/12/flask-scheme.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>a simple scheme of how python scripts are served on the web.</figcaption></figure>
-</div>
+Serving python scripts is slightly different than serving html or php, here's a scheme that shows what happens when using python (flask in this example) to serve some web content.
As you can see the web server is acting as a reverse proxy to the [WSGI][2] server Gunicorn, Apache receives a request from a client, forwards the request to Gunicorn which in turn asks the python web service, in our case our flask web app. Other than as a reverse proxy, apache is used also to serve static content which is not originated in python, like images, css or js scripts.
In order to deploy a python web app I had to install the mod_wsgi extension for apache, then I decided to use a folder in my system to install the virtual environment for python to run my web app and point to that directory in my vhost configuration file inside apache. After that I created a directory where to store all files for my web app and instructed apache to serve them using the virtualenv I created earlier. This is more or less what I did:
-<pre class="wp-block-preformatted"># create the virtual environment for python inside<br /># the folder /usr/local/virtualenvs/my-app:<br />virtualenv /usr/local/virtualenvs/my-app<br /><br /># now create the directory inside the apache root<br /># to store our web app<br />mkdir /var/www/htdocs/my-app<br /></pre>
+```bash
+# create the virtual environment for python inside
+# the folder /usr/local/virtualenvs/my-app:
+virtualenv /usr/local/virtualenvs/my-app
+
+# now create the directory inside the apache root
+# to store our web app
+mkdir /var/www/htdocs/my-app
+```
Now if we put all the py files for our flask web app we can run it inside apache, this is the configuration for the vhost I used:
-<pre class="wp-block-preformatted">&lt;VirtualHost *:80><br /><code> ServerName my-app.mysite.ext</code><br /><code> ErrorLog "/var/log/httpd/my-app.error_log"</code><br /><code> CustomLog "/var/log/httpd/my-app.access_log" common</code><br /><code> WSGIDaemonProcess my-app user=apache group=apache threads=5 python-home=/usr/local/virtualenvs/my-app</code><br /><code> WSGIScriptAlias / /var/www/htdocs/my-app/my-app.wsgi</code><br /><code> WSGIProcessGroup my-app</code><br /><code> Alias "/static/" "/var/www/htdocs/my-app/static/"</code><br /><code> &lt;Directory "/var/www/htdocs/my-app/static/"></code><br /><code> Order allow,deny</code><br /><code> Allow from all</code><br /><code> &lt;/Directory></code><br /><code> &lt;Directory "/var/www/htdocs/my-app/"></code><br /><code> Require all granted</code><br /><code> &lt;/Directory></code><br />&lt;/VirtualHost><br /><br /></pre>
+```apache
+<VirtualHost *:80>
+ ServerName my-app.mysite.ext
+ ErrorLog "/var/log/httpd/my-app.error_log"
+ CustomLog "/var/log/httpd/my-app.access_log" common
+ WSGIDaemonProcess my-app user=apache group=apache threads=5 python-home=/usr/local/virtualenvs/my-app
+ WSGIScriptAlias / /var/www/htdocs/my-app/my-app.wsgi
+ WSGIProcessGroup my-app
+ Alias "/static/" "/var/www/htdocs/my-app/static/"
+ <Directory "/var/www/htdocs/my-app/static/">
+ Order allow,deny
+ Allow from all
+ </Directory>
+ <Directory "/var/www/htdocs/my-app/">
+ Require all granted
+ </Directory>
+</VirtualHost>
+```
With this setting I can now reach my web app and test it after restarting the web server.
diff --git a/content/en/articles/manage-your-passwords-with-password-store/index.md b/content/en/articles/manage-your-passwords-with-password-store/index.md
index 275f5bf..9b1a580 100644
--- a/content/en/articles/manage-your-passwords-with-password-store/index.md
+++ b/content/en/articles/manage-your-passwords-with-password-store/index.md
@@ -13,25 +13,19 @@ Hello everyone,
lately I&#8217;ve decided not to use the password manager offered by all major browsers nowadays, but instead try to manage all my passwords using some open source software in order to have a better control over my passwords.
-I&#8217;ve decided to write this article after reading this <a rel="noreferrer noopener" href="https://alien.slackbook.org/blog/sync-and-share-your-chromium-and-more-browser-data-among-all-your-computers/" target="_blank">blog entry by AlienBob</a> where he speaks of KeepassXC, and since I&#8217;ve used it, I wanted to give a valid alternative to some downsides that I&#8217;ve stumbled upon while using it.
+I've decided to write this article after reading this [blog entry by AlienBob](https://alien.slackbook.org/blog/sync-and-share-your-chromium-and-more-browser-data-among-all-your-computers/) where he speaks of KeepassXC, and since I've used it, I wanted to give a valid alternative to some downsides that I've stumbled upon while using it.
-The first approach I&#8217;ve attempted, as I said, was using <a rel="noreferrer noopener" href="https://keepassxc.org/" target="_blank">KeepassXC</a>, quoting their website:
+The first approach I've attempted, as I said, was using [KeepassXC](https://keepassxc.org/), quoting their website:
-<blockquote class="wp-block-quote">
- <p>
- KeePassXC &#8211; Cross-Platform Password Manager
- </p>
-
- <p>
- Never forget a password again.<br />Securely store passwords using industry standard encryption, quickly auto-type them into desktop applications, and use our browser extension to log into websites.
- </p>
-
- <cite><a rel="noreferrer noopener" style="" href="https://keepassxc.org/" target="_blank">KeepassXC website</a></cite>
-</blockquote>
+> **KeePassXC – Cross-Platform Password Manager**
+>
+> Never forget a password again. Securely store passwords using industry standard encryption, quickly auto-type them into desktop applications, and use our browser extension to log into websites.
+>
+> — [KeepassXC website](https://keepassxc.org/)
What I did was install keepassXC on my Slackware64-current, export all my passwords from my main browser, save them as CSV and import them inside keepassXC. Now I have to remember just one password to access my database and I can install the browser integration add-on for chromium (or firefox) to have all my passwords readily available. Neat!!
-To share my passwords between my devices, I simply made a private git repository on my server and synced the password database with it. I then went and installed <a rel="noreferrer noopener" href="https://github.com/bpellin/keepassdroid" target="_blank">KeePassDroid</a>, which is an Android implementation of keepassXC.
+To share my passwords between my devices, I simply made a private git repository on my server and synced the password database with it. I then went and installed [KeePassDroid](https://github.com/bpellin/keepassdroid), which is an Android implementation of keepassXC.
Since keepassdroid doesn&#8217;t sync automatically from a remote server, I had to use git on my phone to pull/push to my remote in order to keep the password database up to date, and even if that&#8217;s not a big deal, I wasn&#8217;t happy with my password workflow so, while still using this approach, I was looking for alternatives.
@@ -39,73 +33,83 @@ Since keepassdroid doesn&#8217;t sync automatically from a remote server, I had
## Meet password-store
-I stumbled upon <a rel="noreferrer noopener" href="https://www.passwordstore.org" target="_blank">password-store</a>, which claims to be the standard unix password manager.
+I stumbled upon [password-store](https://www.passwordstore.org), which claims to be the standard unix password manager.
-The way it works is simple yet brilliant in my opinion, each password is kept secure in a gpg encrypted text file inside a known directory structure, the file itself as well as the directory containing it can have whatever naming convention you want, and everything can be manipulated with standard unix tools (cp, mv, rm, etc.). <acronym title="Keep It Simple, Stupid">KISS</acronym> rule, am I right?!
+The way it works is simple yet brilliant in my opinion, each password is kept secure in a gpg encrypted text file inside a known directory structure, the file itself as well as the directory containing it can have whatever naming convention you want, and everything can be manipulated with standard unix tools (cp, mv, rm, etc.). {{< acronym title="Keep It Simple, Stupid" >}}KISS{{< /acronym >}} rule, am I right?!
-Here&#8217;s how it looks like, standard tree view from the shell:
+Here's how it looks like, standard tree view from the shell:
-<pre class="wp-block-code language-bash"><code>.password-store/
-&#91;...]
+```bash
+.password-store/
+[...]
├── facebook/
-│&nbsp;&nbsp; └── facebook-username
+│ └── facebook-username
├── twitter/
-│&nbsp;&nbsp; └── twitter-username
+│ └── twitter-username
├── www.instagram.com/
-│&nbsp;&nbsp; └── instagram-username
-&#91;...]</code></pre>
+│ └── instagram-username
+[...]
+```
-In this example, facebook is a directory, containing a gpg encrypted text file named &#8220;facebook-username&#8221;, in that file is written my password for that user on facebook, pretty straightforward.
+In this example, facebook is a directory, containing a gpg encrypted text file named "facebook-username", in that file is written my password for that user on facebook, pretty straightforward.
-The beauty of the pass program, is that it also includes git subcommands, so you can use it to sync your password database to a remote. Here&#8217;s how it works:
+The beauty of the pass program, is that it also includes git subcommands, so you can use it to sync your password database to a remote. Here's how it works:
-The first thing you want to do is create a remote repository on your git server, there&#8217;s a million ways to do so, and it depends on your git provider. If you want to host a git server I have an howto on this site, <a href="https://danix.xyz/2018/07/git-setup-own-server/" data-type="post" data-id="3748">give it a look</a>.
+The first thing you want to do is create a remote repository on your git server, there's a million ways to do so, and it depends on your git provider. If you want to host a git server I have an howto on this site, [give it a look](https://danix.xyz/2018/07/git-setup-own-server/).
-After creating the remote repository, you want to clone it in `~/.password-store`, the default directory where pass will store all your credentials, and to do so you&#8217;ll do:
+After creating the remote repository, you want to clone it in `~/.password-store`, the default directory where pass will store all your credentials, and to do so you'll do:
-<pre class="wp-block-code language-bash"><code>git clone myserver.com:git-repository ~/.password-store</code></pre>
+```bash
+git clone myserver.com:git-repository ~/.password-store
+```
-Assuming you already have a gpg key pair for johndoe@youremailaddress.com, you&#8217;ll have to initialize the password repository like this:
+Assuming you already have a gpg key pair for johndoe@youremailaddress.com, you'll have to initialize the password repository like this:
-<pre class="wp-block-code language-bash"><code>pass init johndoe@youremailaddress.com</code></pre>
+```bash
+pass init johndoe@youremailaddress.com
+```
Now pass will use the gpg key pair for that email address when encrypting and decrypting your passwords. Since it also understands when the directory is a local clone of a git repository, after initializing with the previous command, it created a commit ready to be pushed, so all you have to do is
-<pre class="wp-block-code language-bash"><code>cd ~/.password-store && git push
+```bash
+cd ~/.password-store && git push
# or you can use pass internal git capabilities with:
-pass git push</code></pre>
+pass git push
+```
and your password database will be synced.
From there you can simply invoke pass to see all your passwords, you can search your database, add or remove passwords, modify them etc. For more info you can check the manual where you also have advanced examples on how to use git with pass.
-On my android phone I&#8217;ve installed the mobile version of <a rel="noreferrer noopener" href="https://play.google.com/store/apps/details?id=dev.msfjarvis.aps" target="_blank">Password Store</a>, I&#8217;ve setup my ssh key in order to be able to pull/push from my git remote, and now I have all my passwords syncronized to my mobile as well.
+On my android phone I've installed the mobile version of [Password Store](https://play.google.com/store/apps/details?id=dev.msfjarvis.aps), I've setup my ssh key in order to be able to pull/push from my git remote, and now I have all my passwords syncronized to my mobile as well.
## On the phone
The process for installing password-store on the phone is a bit tricky, but nothing really difficult. The two apps we need are:
- * <a href="https://play.google.com/store/apps/details?id=dev.msfjarvis.aps" target="_blank" rel="noreferrer noopener">Password-store</a>
- * <a href="https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain" target="_blank" rel="noreferrer noopener">OpenKeyChain</a>
+ * [Password-store](https://play.google.com/store/apps/details?id=dev.msfjarvis.aps)
+ * [OpenKeyChain](https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain)
-After installing both those apps, we&#8217;ll need to go on our computer and export our public and private gpg keys in order to import them inside OpenKeyChain, to do so we&#8217;ll go in the terminal and type away:
+After installing both those apps, we'll need to go on our computer and export our public and private gpg keys in order to import them inside OpenKeyChain, to do so we'll go in the terminal and type away:
-<pre class="wp-block-code language-bash"><code>gpg --export-secret-keys --armor johndoe@youremailaddress.com &gt; private.asc
-gpg --export --armor johndoe@youremailaddress.com &gt; public.asc</code></pre>
+```bash
+gpg --export-secret-keys --armor johndoe@youremailaddress.com > private.asc
+gpg --export --armor johndoe@youremailaddress.com > public.asc
+```
-now we have both our private and public key stored in a file, which we can transfer to the phone and import inside OpenKeyChain. I&#8217;ve imported the private key first and then the public one, and while importing the latter, OpenKeyChain confirmed that the key was updated, so both are essentially on the same keypair.
+now we have both our private and public key stored in a file, which we can transfer to the phone and import inside OpenKeyChain. I've imported the private key first and then the public one, and while importing the latter, OpenKeyChain confirmed that the key was updated, so both are essentially on the same keypair.
-One important note regarding git, depending on how your git repository is setup, you might be needed to import your ssh key inside password-store on your phone in order to access the repository, that&#8217;s really easy as the app will ask for your git configuration the first time you open it.
+One important note regarding git, depending on how your git repository is setup, you might be needed to import your ssh key inside password-store on your phone in order to access the repository, that's really easy as the app will ask for your git configuration the first time you open it.
-Once you&#8217;ve setup your git access, it will ask you to allow OpenKeyChain to manage your gpg key pair whenever you use password-store, and that&#8217;s it! You have now your passwords securely stored through GnuPG and synced between your devices with git.
+Once you've setup your git access, it will ask you to allow OpenKeyChain to manage your gpg key pair whenever you use password-store, and that's it! You have now your passwords securely stored through GnuPG and synced between your devices with git.
## Bonus note
-password-store is a command line program that you can access via it&#8217;s command `pass`, but there are also graphical interfaces to access it.
+password-store is a command line program that you can access via its command `pass`, but there are also graphical interfaces to access it.
-One of them is <a rel="noreferrer noopener" href="https://qtpass.org/" target="_blank">qtpass</a>, you should find it in most distros, on Slackware I found it on <a rel="noreferrer noopener" href="https://slackbuilds.org/repository/14.2/desktop/qtpass/?search=qtpass" target="_blank">SBo</a> and compiled it without any problems. It performs very well, allows you to manipulate your password repository from a graphical interface, performs push/pull operations on git and makes it easier to create complex passwords whenever you need. Just a headsup, if you install this setup on raspbian, remember to install one of the pinentry programs to be able to insert your passkey when you are not in the terminal.
+One of them is [qtpass](https://qtpass.org/), you should find it in most distros, on Slackware I found it on [SBo](https://slackbuilds.org/repository/14.2/desktop/qtpass/?search=qtpass) and compiled it without any problems. It performs very well, allows you to manipulate your password repository from a graphical interface, performs push/pull operations on git and makes it easier to create complex passwords whenever you need. Just a headsup, if you install this setup on raspbian, remember to install one of the pinentry programs to be able to insert your passkey when you are not in the terminal.
-I hope you&#8217;ll find this article useful, remember to drop me a [comment][1] if you need any help and I&#8217;ll be happy to help you as best as I can.
+I hope you'll find this article useful, remember to drop me a [comment][1] if you need any help and I'll be happy to help you as best as I can.
Cheers!!
diff --git a/content/en/articles/my-hugo-workflow/index.md b/content/en/articles/my-hugo-workflow/index.md
new file mode 100644
index 0000000..60e6bbd
--- /dev/null
+++ b/content/en/articles/my-hugo-workflow/index.md
@@ -0,0 +1,346 @@
++++
+title = "The Git Config Settings I Actually Use"
+author = "Danilo M."
+type = "tech"
+date = "2026-04-28T19:53:46+02:00"
+draft = false
+excerpt = "A tour through my ~/.gitconfig, covering the settings I've grown to rely on daily and why each one earns its place."
+tags = ["git", "workflow", "linux", "gpg", "hugo", "configuration", "howto"]
+categories = ["DIY", "Code"]
++++
+
+A few years back, I set up a two-repository system for this site: one repo for content, another for the theme (living as a submodule). It's a clean architecture in theory, but in practice, managing two repos means you're constantly juggling branch updates, resolving submodule pointer conflicts, and pushing to two remotes in sequence. I started carrying around a `.gitconfig` file between machines, tweaking it bit by bit as I discovered settings that eliminated friction.
+
+This isn't a guide to every git option, that would be a book. Instead, it's a personal tour through the settings I've actually integrated into my workflow, why they matter, and what changed once each one was on.
+
+<!--more-->
+
+## The Setup Glue: `push.autoSetupRemote` and `pull.rebase`
+
+These two live together because they're about the boundaries of your branches: pushing them up and pulling them back down.
+
+### push.autoSetupRemote
+
+The old frustration: cut a new branch locally, write code, run `git push`, and get:
+
+```
+fatal: The current branch feature/my-new-branch has no upstream branch.
+To push the current and set the upstream branch, use:
+
+ git push --set-upstream origin feature/my-new-branch
+```
+
+It's boilerplate ceremony every time you push a new branch. The fix:
+
+```ini
+[push]
+ autoSetupRemote = true
+```
+
+Now `git push` on a new branch just works. It infers the tracking branch automatically. The first time I used this with Hugo content branches, cutting `content/new-article` on Monday and pushing immediately, I realized I'd eliminated maybe fifty typos a year of `--set-upstream`.
+
+### pull.rebase
+
+Linear history matters more on a single-author site. Without `pull.rebase = true`, pulling changes creates merge commits like "Merge branch 'main' of origin/main" even when you're just syncing. These commits don't represent work; they're noise. They clutter `git log`, make bisecting slower, and add confusion to the graph.
+
+```ini
+[pull]
+ rebase = true
+```
+
+With this on, pulling rebases your local work on top of the remote tip. When you're managing a Hugo site with a theme submodule, this is especially helpful: submodule pointer updates stay tidy in the log instead of hiding inside merge commits.
+
+## Identity and Trust: `commit.gpgsign`
+
+GPG signing commits isn't about compliance or passing audits. It's about provenance. Every commit on my repos carries my cryptographic signature, proof that it came from me and hasn't been tampered with.
+
+```ini
+[user]
+ signingkey = YOUR_GPG_KEY_ID
+ email = danix@danix.xyz
+ name = Danilo M.
+
+[commit]
+ gpgsign = true
+```
+
+The first time you set this up, know that `gpg-agent` needs to be running and your key needs to be imported locally. Once both are in place, every commit is signed automatically. If you want to dive deeper into GPG keys, I wrote about [managing passwords with password-store](/en/articles/manage-your-passwords-with-password-store/), which covers key setup.
+
+## Reducing Friction: `help.autocorrect`, `fetch.prune`, and `fetch.prunetags`
+
+Three small settings that save daily typing and mental overhead.
+
+### help.autocorrect
+
+Typos happen. I often type `git statsu` instead of `git status`, or `git comit` instead of `git commit`. The old behavior is an error message and a suggested fix. With:
+
+```ini
+[help]
+ autocorrect = 10
+```
+
+Git autocorrects and runs the command after a 1-second countdown:
+
+```
+$ git statsu
+WARNING: You called a Git command named 'statsu', which does not exist.
+Continuing in 0.9 seconds, assuming that you meant 'status'.
+```
+
+The `10` here means 1 second (git measures in tenths). It's long enough to notice and interrupt if the correction is wrong, but short enough not to interrupt workflow.
+
+### fetch.prune and fetch.prunetags
+
+When teammates delete branches on the remote, stale refs accumulate in your local repository. These settings clean them up:
+
+```ini
+[fetch]
+ prune = true
+ prunetags = true
+```
+
+Now `git fetch` silently removes local branches that no longer exist upstream, and does the same for tags. For a Hugo theme repo, old release tags get cleaned up on the server, and `prunetags` means they don't linger in your local `git tag` output.
+
+## When Conflicts Happen: `merge.conflictstyle` and `rerere`
+
+Two settings that make merge conflicts less painful.
+
+### merge.conflictstyle = zdiff3
+
+Conflict markers normally show you two sides:
+
+```
+<<<<<<< HEAD
+your code
+=======
+their code
+>>>>>>> branch
+```
+
+You see what you wrote and what they wrote, but not what you both started from. The `zdiff3` conflict style shows the ancestor:
+
+```
+<<<<<<< HEAD
+your code
+||||||| base
+original code
+=======
+their code
+>>>>>>> branch
+```
+
+The `||||||| base` section is what both sides changed from. Now you can see the full story: you changed this line to X, they changed it to Y, and the original was Z. Intent becomes obvious.
+
+```ini
+[merge]
+ conflictstyle = zdiff3
+```
+
+### rerere.enabled and rerere.autoupdate
+
+`rerere` stands for "reuse recorded resolution." When you resolve a conflict manually, git remembers the resolution. The next time you hit the same conflict:
+
+```ini
+[rerere]
+ enabled = true
+ autoupdate = true
+```
+
+Git resolves it automatically. This is invaluable when rebasing a content branch over a main that includes a submodule pointer update. The first time there's a conflict in the submodule reference, you resolve it. On a second branch with the same conflict, `rerere` handles it silently, and `autoupdate` stages the resolution so you don't have to `git add` it manually.
+
+## Looking Around: Branch Display, Logs, and Diffs
+
+Four settings that make reading your repository history faster.
+
+### branch.sort and column.ui
+
+```ini
+[branch]
+ sort = -committerdate
+
+[column]
+ ui = auto
+```
+
+By default, `git branch` lists branches alphabetically. Useless past ten branches. The `-committerdate` sort shows newest first, so the branch you're probably about to switch to is at the top.
+
+`column.ui = auto` displays branches in multiple columns when your terminal is wide enough, cutting down on scrolling through a long list.
+
+### log.abbrevCommit and log.follow
+
+```ini
+[log]
+ abbrevCommit = true
+ follow = true
+```
+
+`abbrevCommit` shows short SHAs (7 chars) instead of full 40-character hashes. Cleaner logs, faster to read.
+
+`follow` tracks files through renames. When you run `git log -- path/to/article.md` and that file was once named `old-article.md`, log doesn't break, it follows the file through the rename and shows the full history.
+
+### diff.mnemonicPrefix, diff.renames, and diff.wordRegex
+
+```ini
+[diff]
+ mnemonicPrefix = true
+ renames = true
+ wordRegex = [^[:space:]]
+```
+
+`mnemonicPrefix` changes the diff headers from `a/` and `b/` to more descriptive labels like `i/` (index), `w/` (working tree), `o/` (object), `c/` (commit). More information at a glance.
+
+`renames = true` detects file renames and shows them as `file.old => file.new` instead of a delete and a create. Cleaner diffs.
+
+`wordRegex` defines what counts as a "word" in word-level diffs (`git diff --word-diff`). The pattern `[^[:space:]]` treats any non-whitespace as a word, which means punctuation gets its own boundaries, useful for prose-heavy files like Markdown articles.
+
+## Shorthand That Earns Its Place: Aliases
+
+I keep aliases minimal on purpose. Aliases that hide what git is doing are noise; these two are worth the keystroke savings.
+
+### lg: Pretty-print log with graph
+
+```ini
+[alias]
+ lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
+```
+
+Running `git lg` shows a colored graph with commit hashes, dates, messages, authors, and branch pointers:
+
+```
+* abc1234 - (3 hours ago) Add git config article - Danilo M. (HEAD -> master)
+* def5678 - (1 day ago) Fix theme CSS - Danilo M.
+|\
+| * ghi9012 - (2 days ago) WIP: new feature - Danilo M. (content/draft)
+|/
+* jkl3456 - (5 days ago) Bump theme submodule - Danilo M. (origin/master)
+```
+
+Much better than plain `git log`.
+
+### sw: Switch shorthand
+
+```ini
+[alias]
+ sw = switch
+```
+
+`git sw main` is faster than `git switch main`, and `git sw -c feature/new` creates and switches in one command.
+
+## A Typical Day
+
+Here's how these settings work together in practice.
+
+Morning: sync with the repo. `git fetch` fires silently in the background, `fetch.prune` and `prunetags` cleaning up any deleted branches and old tags without you thinking about it.
+
+I'm starting the week's Hugo article. Cut a new content branch:
+
+```bash
+git sw -c content/git-config-deep-dive
+```
+
+No typing `--set-upstream` later. `push.autoSetupRemote` has me covered.
+
+Write, commit. The commit is GPG-signed automatically. No extra steps.
+
+```bash
+git commit -m "Add first draft of git config article"
+```
+
+Push when done:
+
+```bash
+git push
+```
+
+No upstream error. Just works.
+
+Later, the main branch gets a theme submodule update. I rebase my work on top:
+
+```bash
+git fetch
+git rebase main
+```
+
+There's a conflict in the submodule pointer, the theme repo moved forward. `merge.conflictstyle = zdiff3` shows me exactly what changed. I resolve it once.
+
+Later, a second branch has the same submodule conflict. `rerere` remembers my resolution and applies it automatically with `rerere.autoupdate`. No re-resolving.
+
+Before merging back to main, check the graph:
+
+```bash
+git lg
+```
+
+Pretty output shows the timeline clearly.
+
+Merge to main:
+
+```bash
+git switch main
+git merge content/git-config-deep-dive
+```
+
+If there's a conflict here (unlikely given we rebased), `zdiff3` shows the ancestor context.
+
+Done. All the settings worked together transparently.
+
+## The Full Config
+
+Here's the complete block as it sits in my `~/.gitconfig`:
+
+```ini
+[user]
+ name = Danilo M.
+ email = danix@danix.xyz
+ signingkey = YOUR_KEY_ID_HERE
+
+[pull]
+ rebase = true
+
+[push]
+ autoSetupRemote = true
+
+[commit]
+ gpgsign = true
+
+[help]
+ autocorrect = 10
+
+[fetch]
+ prune = true
+ prunetags = true
+
+[merge]
+ conflictstyle = zdiff3
+
+[rerere]
+ enabled = true
+ autoupdate = true
+
+[branch]
+ sort = -committerdate
+
+[column]
+ ui = auto
+
+[log]
+ abbrevCommit = true
+ follow = true
+
+[diff]
+ mnemonicPrefix = true
+ renames = true
+ wordRegex = [^[:space:]]
+
+[alias]
+ lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
+ sw = switch
+```
+
+Copy what you need. Leave what doesn't fit your workflow.
+
+## A Config That Evolves
+
+This isn't the "correct" git configuration, it's the one that fits how I work. I've been refining it for years, and it'll keep evolving as I hit new friction points and discover new settings. The point isn't to follow mine exactly, but to think about what's slowing you down and look for the git setting that fixes it.
+
+If you use any of these settings, or if you've found others that changed your workflow, let me know in the comments. I'm always curious how other people configure their tools.
diff --git a/content/en/articles/playing-with-colors/index.md b/content/en/articles/playing-with-colors/index.md
index 9085d6a..b6c05c9 100644
--- a/content/en/articles/playing-with-colors/index.md
+++ b/content/en/articles/playing-with-colors/index.md
@@ -18,6 +18,6 @@ I was having a look at some color palettes for _**I'm not gonna tell ya**_, and
It's actually very simple, there's a large preview where you can modify each color on the fly, and then you can send them to a fake page preview. that's it.
-I put it on <a href="https://github.com/danixland/palette-viewer" target="_blank" rel="noopener noreferrer">github</a>, just in case you want to give it a look.
+I put it on [github](https://github.com/danixland/palette-viewer), just in case you want to give it a look.
Let me know what you think about it. Cheers ;) \ No newline at end of file
diff --git a/content/en/articles/poker-time/index.md b/content/en/articles/poker-time/index.md
index dd64777..67064e4 100644
--- a/content/en/articles/poker-time/index.md
+++ b/content/en/articles/poker-time/index.md
@@ -8,6 +8,3 @@ categories = [ "Photography"]
tags = [ "poker", "feste", "gioco"]
+++
-<figure style="width: 500px" class="wp-caption aligncenter"><img loading="lazy" style="margin-right: auto;margin-left: auto" src="http://danixland.net/wp-content/uploads/2010/12/wpid-2010-12-19-21.45.121.jpg" alt="image" width="500" height="375" /><figcaption class="wp-caption-text">seratina relax a base di poker.. ovviamente senza soldi veri :-) il modo migliore per passare le serate quando non si ha voglia di uscire..</figcaption></figure>
-
-&nbsp; \ No newline at end of file
diff --git a/content/en/articles/pure-nerdgasm/index.md b/content/en/articles/pure-nerdgasm/index.md
index 0326fd0..6be196a 100644
--- a/content/en/articles/pure-nerdgasm/index.md
+++ b/content/en/articles/pure-nerdgasm/index.md
@@ -7,9 +7,5 @@ excerpt = "An EPIC video of two floppy disks playing the imperial march.. nerdga
image = "/uppies/2011/10/vader.jpg"
categories = [ "Blogging"]
tags = [ "web", "floppy disks", "imperial march", "nerdgasm", "nerds", "star wars", "youtube"]
-+++
-
-<figure class="wp-block-embed-youtube aligncenter wp-block-embed is-type-rich is-provider-embed-handler wp-embed-aspect-4-3 wp-has-aspect-ratio">
-
-<div class="wp-block-embed__wrapper">
-</div><figcaption>can&#8217;t get nerdier than this&#8230;</figcaption></figure> \ No newline at end of file
+draft = true
++++ \ No newline at end of file
diff --git a/content/en/articles/r-i-p-steve-jobs/index.md b/content/en/articles/r-i-p-steve-jobs/index.md
index 0a04ed9..b155316 100644
--- a/content/en/articles/r-i-p-steve-jobs/index.md
+++ b/content/en/articles/r-i-p-steve-jobs/index.md
@@ -9,4 +9,4 @@ categories = [ "Blogging"]
tags = [ "Steve Jobs"]
+++
-<figure id="attachment_3691" aria-describedby="caption-attachment-3691" style="width: 1024px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-3691 size-large" src="https://danix.xyz/wp-content/uploads/2011/10/jobs-1024x741.jpg" alt="" width="1024" height="741" srcset="https://danix.xyz/wp-content/uploads/2011/10/jobs-1024x741.jpg 1024w, https://danix.xyz/wp-content/uploads/2011/10/jobs-300x217.jpg 300w, https://danix.xyz/wp-content/uploads/2011/10/jobs-768x556.jpg 768w, https://danix.xyz/wp-content/uploads/2011/10/jobs.jpg 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption id="caption-attachment-3691" class="wp-caption-text">Today a truly beautiful mind has left our world. Today is a very sad day.</figcaption></figure> \ No newline at end of file
+{{< image src="/uppies/2011/10/jobs.jpg" alt="Steve Jobs" caption="Today a truly beautiful mind has left our world. Today is a very sad day." >}}{{< /image >}} \ No newline at end of file
diff --git a/content/en/articles/responsibility/index.md b/content/en/articles/responsibility/index.md
index b82273a..9b9aed3 100644
--- a/content/en/articles/responsibility/index.md
+++ b/content/en/articles/responsibility/index.md
@@ -8,8 +8,4 @@ categories = [ "Blogging", "Self Reflection"]
tags = [ "life", "responsibility"]
+++
-<blockquote class="wp-block-quote">
- <p>
- Accept responsibility for your life. Know that it is you who will get you where you want to go, no one else.
- </p>
-</blockquote> \ No newline at end of file
+> Accept responsibility for your life. Know that it is you who will get you where you want to go, no one else. \ No newline at end of file
diff --git a/content/en/repository/index.md b/content/en/repository/index.md
index cbab271..96a41ed 100644
--- a/content/en/repository/index.md
+++ b/content/en/repository/index.md
@@ -1,20 +1,40 @@
+++
title = "Slackware Repository"
date = 2026-04-17T00:00:00Z
-draft = true
+++
+This is a **Slackware64-current** repository, my packages are built on and managed for slackware64-current. When I release a package that can build on the latest stable version of Slackware, I'll try to publish it to [slackbuilds.org](https://slackbuilds.org/), but if the package comes from this repository, you can assume it's for `-current` only.
+
## Quick Start
-Add the repository to your Slackware system:
+To add the repository to your Slackware system you'll need [slackpkg+](https://slakfinder.org/slackpkg+.html), edit `/etc/slackpkg/slackpkgplus.conf` and use **"danix"** as the repository name:
+
+```bash
+# Add repository to the PKGS_PRIORITY
+PKGS_PRIORITY=( multilib danix alien restricted slackers)
+# Add danix to the REPOPLUS array
+REPOPLUS=( slackpkgplus restricted alien multilib slackers hyprwm danix )
+# Lastly, define the "danix" MIRRORPLUS entry
+MIRRORPLUS['danix']=https://packages.danix.xyz/
+```
+
+You can have my repository alongside other repos.
+
+Now that it is configured you can simply update the list and search for my packages directly using `slackpkg`.
```bash
-# Add repository configuration (example command)
-wget -O - https://danix.xyz/packages/slackware.asc | gpg --import
-echo "deb https://danix.xyz/packages/slackware/ stable main" >> /etc/apt/sources.list.d/danix.list
-apt-get update
+# update the packages signatures
+slackpkg update gpg
+# update the packages lists
+slackpkg update
+# search for a package
+slackpkg search <package name>
+# install a package
+slackpkg install <package name>
```
+
+
## Installation
### Prerequisites
@@ -25,15 +45,15 @@ apt-get update
### Steps
-1. Download and import the repository GPG key
-2. Add the repository to your package manager configuration
+1. Add the repository to your slackpkg+ configuration
+2. import the GPG key for my repository
3. Update your package lists
4. Install packages as needed
### Repository URL
```
-https://danix.xyz/packages/slackware/
+https://packages.danix.xyz/
```
## Usage
@@ -41,20 +61,22 @@ https://danix.xyz/packages/slackware/
### Installing a Package
```bash
-apt-get install package-name
+slackpkg install package-name
```
### Updating Packages
```bash
-apt-get update
-apt-get upgrade
+slackpkg update
+slackpkg upgrade
+# to update all packages, including the Slackware system ones:
+slackpkg upgrade-all
```
### Searching for Packages
```bash
-apt-cache search keyword
+slackpkg search keyword
```
## Available Packages
diff --git a/content/it/_index.md b/content/it/_index.md
index 2fe3516..fea839d 100644
--- a/content/it/_index.md
+++ b/content/it/_index.md
@@ -7,4 +7,4 @@ description: "Portfolio e blog di Danilo Macrì"
Benvenuto su danix.xyz, io sono Danilo, ma puoi chiamarmi danix.
-> Su queste pagine scrivo di tutto ciò che trovo interessante. Potrai leggere articoli riguardanti WordPress, Hugo, bash, Slackware, e molte altre cose. Dai pure un'occhiata e prendi ciò che più ti piace. \ No newline at end of file
+> Su queste pagine scrivo di tutto ciò che trovo interessante. Potrai leggere articoli riguardanti lo sviluppo web su WordPress, Hugo, intelligenza artificiale, bash, Slackware GNU/Linux, e molte altre cose. Dai pure un'occhiata e prendi ciò che più ti piace. \ No newline at end of file
diff --git a/content/it/articles/le-email-queste-sconosciute/index.md b/content/it/articles/le-email-queste-sconosciute/index.md
index c790d42..71eb7b7 100644
--- a/content/it/articles/le-email-queste-sconosciute/index.md
+++ b/content/it/articles/le-email-queste-sconosciute/index.md
@@ -20,7 +20,7 @@ Eh già, si chiama oggetto perchè serve a descrivere ciò di cui l'email parla,
Un'altra cosa piuttosto bruttina da vedere è il corpo del messaggio vuoto con tutto il contenuto relegato negli allegati, se ricevo una mail così non è che mi precipito a leggere l'allegato, piuttosto la cestino direttamente! Gli allegati servono per allegare qualcosa che non si può mettere nel corpo del messaggio, non per contenere il messaggio!
-Un altro problema che affligge spesso chi riceve email è l'invio di foto! Su questo punto potremmo spendere fiumi di parole parlando del fatto che al giorno d'oggi con le adsl super veloci che ci ritroviamo non sia più un problema ricevere allegati pesanti, ma non capisco perchè io debba stare a scaricare una foto da 12 megapixel a 300 <acronym title="dot per inches (punti per pollice)">dpi</acronym> se non dovrò nemmeno stamparla, ma al massimo condividerla sul blog o su facebook; perdete un attimino del vostro <span style="text-decoration: line-through">prezioso</span> tempo anche voi e riducete le dimensioni delle foto che inviate, già ridurre la risoluzione da 300 a 72 [dpi][4] aiuterà notevolmente chi dovrà ricevere la mail oltre che farvi risparmiare molto tempo in invio.. Un altro appunto relativo alle dimensioni delle foto, se state mandando una foto di un tenero cucciolo che dovrà fare da sfondo al piccì del vostro/a amato/a, che senso ha che misuri 4000 pixel sul lato corto?! Una risoluzione decente potrebbe essere 1600 pixel sul lato lungo e il lato corto dimensionato in proporzione, in questo modo le dimensioni scenderanno ulteriormente senza che si perda la qualità del vostro pregevolissimo scatto! ;)
+Un altro problema che affligge spesso chi riceve email è l'invio di foto! Su questo punto potremmo spendere fiumi di parole parlando del fatto che al giorno d'oggi con le adsl super veloci che ci ritroviamo non sia più un problema ricevere allegati pesanti, ma non capisco perchè io debba stare a scaricare una foto da 12 megapixel a 300 {{< acronym title="dot per inches (punti per pollice)" >}}dpi{{< /acronym >}} se non dovrò nemmeno stamparla, ma al massimo condividerla sul blog o su facebook; perdete un attimino del vostro ~~prezioso~~ tempo anche voi e riducete le dimensioni delle foto che inviate, già ridurre la risoluzione da 300 a 72 [dpi][4] aiuterà notevolmente chi dovrà ricevere la mail oltre che farvi risparmiare molto tempo in invio.. Un altro appunto relativo alle dimensioni delle foto, se state mandando una foto di un tenero cucciolo che dovrà fare da sfondo al piccì del vostro/a amato/a, che senso ha che misuri 4000 pixel sul lato corto?! Una risoluzione decente potrebbe essere 1600 pixel sul lato lungo e il lato corto dimensionato in proporzione, in questo modo le dimensioni scenderanno ulteriormente senza che si perda la qualità del vostro pregevolissimo scatto! ;)
{{< image src="/uploads/2010/11/url-300x197.jpg" alt="URL structure illustration" >}}{{< /image >}}
[5]Il punto successivo di questa carrellata potrebbe avere un titolo e un articolo a se, "_come inviare link. Il modo corretto di condividere i famigerati [URL][6]_"; fin dagli albori di internet si è avvertita infatti la necessità di condividere link interessanti con i nostri contatti, e sopratutto negli ultimi tempi i link sono diventati sempre più lunghi e complessi, cose tipo:
@@ -29,11 +29,11 @@ Un altro problema che affligge spesso chi riceve email è l'invio di foto! Su qu
http://www.example.net/test/sample_page.php?variable00=aldsgfqeworslkdf2934523&variable01=abbecceddario&variable02=tomorrow+will+rain#bookmark539
```
-e nonostante io capisca che condividere i link sia fondamentale proprio non riesco a concepire il fatto che chi invia i link non si prenda la briga di controllare che siano quantomeno funzionanti prima di inviare la mail, il copia/incolla è una conquista stupenda, ma perchè fare la figura dei <span style="text-decoration: line-through">pirla</span> (a dir poco) inviando link chilometrici spezzettati in 20 parti che per ricostruirli si impiega più tempo che a leggere il resto della posta, col rischio poi che ci si dimentichi di un minuscolo carattere tipo un punto e il link non funzioni?! Per ovviare a questo tipo di inconvenienti, si può fare più attenzione riguardando la mail prima di inviarla, oppure si può utilizzare uno dei tanti servizi di URL shortening presenti sul web, ~~come ad esempio [uri.danixland.net][7],~~ in questo modo i link diventeranno molto più brevi e semplici da gestire, e si eviteranno tanti problemi per chi legge le email!
+e nonostante io capisca che condividere i link sia fondamentale proprio non riesco a concepire il fatto che chi invia i link non si prenda la briga di controllare che siano quantomeno funzionanti prima di inviare la mail, il copia/incolla è una conquista stupenda, ma perchè fare la figura dei ~~pirla~~ (a dir poco) inviando link chilometrici spezzettati in 20 parti che per ricostruirli si impiega più tempo che a leggere il resto della posta, col rischio poi che ci si dimentichi di un minuscolo carattere tipo un punto e il link non funzioni?! Per ovviare a questo tipo di inconvenienti, si può fare più attenzione riguardando la mail prima di inviarla, oppure si può utilizzare uno dei tanti servizi di URL shortening presenti sul web, ~~come ad esempio [uri.danixland.net][7],~~ in questo modo i link diventeranno molto più brevi e semplici da gestire, e si eviteranno tanti problemi per chi legge le email!
Ancora un altro consiglio, **ricontrollate ciò che avete scritto**, no seriamente, consegnereste mai un compito senza averlo nemmeno riguardato? E allora perchè prima di inviare una mail che vi sarà costata probabilmente meno tempo per scriverla, non le date una rilettura veloce?! Sono fantastiche le email con l'oggetto ma senza il testo, o quelle con il testo "_Allegato pronto per la spedizione_: ma senza l'allegato! Suvvia, che ci vuole a soffermarsi un attimo su ciò che si sta facendo?!
-Per ultimo mi lascio probabilmente la madre di tutti i comportamenti sbagliati quando si invia un'email, il disrispetto della privacy! di cosa sto parlando?! Avete presente quelle stupende catene di S. Antonio che vanno tanto di moda nei periodi di festa? Quelle con allegate le presentazioni strappalacrime in PowerPoint che "_se non le inoltri a 140 amici entro i prossimi 7 minuti non hai cuore e ti morirà il gatto strozzandosi mentre sta mangiando il pesce rosso e morendo cadrà in testa al cane al quale si spezzerà una gamba e per la tristezza l'uccellino non mangerà più e si lascerà morire?_" Bene, quelle catene sono l'eden degli spammer, ricevere una di quelle email è come ricevere in regalo tutta la lista dei propri amici su facebook moltiplicata per tutti gli amici di ogni singolo amico, a volte sono più lunghe le liste di indirizzi email che il corpo stesso del messaggio.. Questo accade perchè probabilmente non si conosce bene il mezzo di comunicazione che si sta usando, il campo "A:: dovrebbe contenere il destinatario dell'email, e fin qui non ci piove, ma come comportarsi quando ci sono più destinatari? Ecco che ci viene in aiuto il campo "[Bcc:][8]: altrimenti detto "<acronym title="Copia carbone nascosta">Ccn:</acronym>". Questo campo viene utilizzato per inserire i destinatari secondari dell'email e far si che il loro indirizzo non sia visibile ai destinatari principali specificati nel campo "To:; quando ci sono tantissimi destinatari e non tutti si conoscono tra loro, è buona norma evitare che gli indirizzi email siano visibili onde evitare che qualcuno possa accusarvi di violazione della privacy! Io personalmente sono spesso tentato di denunciare i mittenti di email del genere :/
+Per ultimo mi lascio probabilmente la madre di tutti i comportamenti sbagliati quando si invia un'email, il disrispetto della privacy! di cosa sto parlando?! Avete presente quelle stupende catene di S. Antonio che vanno tanto di moda nei periodi di festa? Quelle con allegate le presentazioni strappalacrime in PowerPoint che "_se non le inoltri a 140 amici entro i prossimi 7 minuti non hai cuore e ti morirà il gatto strozzandosi mentre sta mangiando il pesce rosso e morendo cadrà in testa al cane al quale si spezzerà una gamba e per la tristezza l'uccellino non mangerà più e si lascerà morire?_" Bene, quelle catene sono l'eden degli spammer, ricevere una di quelle email è come ricevere in regalo tutta la lista dei propri amici su facebook moltiplicata per tutti gli amici di ogni singolo amico, a volte sono più lunghe le liste di indirizzi email che il corpo stesso del messaggio.. Questo accade perchè probabilmente non si conosce bene il mezzo di comunicazione che si sta usando, il campo "A:: dovrebbe contenere il destinatario dell'email, e fin qui non ci piove, ma come comportarsi quando ci sono più destinatari? Ecco che ci viene in aiuto il campo "[Bcc:][8]: altrimenti detto "{{< acronym title="Copia carbone nascosta" >}}Ccn:{{< /acronym >}}". Questo campo viene utilizzato per inserire i destinatari secondari dell'email e far si che il loro indirizzo non sia visibile ai destinatari principali specificati nel campo "To:; quando ci sono tantissimi destinatari e non tutti si conoscono tra loro, è buona norma evitare che gli indirizzi email siano visibili onde evitare che qualcuno possa accusarvi di violazione della privacy! Io personalmente sono spesso tentato di denunciare i mittenti di email del genere :/
Mi sembra di aver esaurito gli argomenti riguardo le email, mi auguro di ricevere tante comunicazioni da voi, e spero proprio che farete tesoro di ciò che vi ho consigliato, altrimenti potete anche risparmiarvi il tempo di scrivermi, tanto probabilmente non leggerò mai ciò che mi mandate ;)
diff --git a/content/it/articles/my-hugo-workflow/index.md b/content/it/articles/my-hugo-workflow/index.md
new file mode 100644
index 0000000..a482a62
--- /dev/null
+++ b/content/it/articles/my-hugo-workflow/index.md
@@ -0,0 +1,346 @@
++++
+title = "Le Impostazioni Git che Uso Davvero"
+author = "Danilo M."
+type = "tech"
+date = "2026-04-28T19:53:46+02:00"
+draft = false
+excerpt = "Un giro nel mio ~/.gitconfig: le impostazioni su cui mi appoggio ogni giorno e perché ognuna si guadagna il suo posto."
+tags = ["git", "workflow", "linux", "gpg", "hugo", "configurazione", "howto"]
+categories = ["DIY", "Code"]
++++
+
+Qualche anno fa ho impostato un sistema a due repository per questo sito: uno per i contenuti, l'altro per il tema (come submodule). È un'architettura pulita in teoria, ma in pratica gestire due repository significa destreggiarsi continuamente tra aggiornamenti di branch, conflitti sul puntatore del submodule e push su due remote in sequenza. Ho cominciato a portarmi in giro un file `.gitconfig` tra macchine diverse, modificandolo un po' alla volta man mano che scoprivo impostazioni che eliminano l'attrito.
+
+Questo non è una guida a ogni opzione di git, ci vorrebbe un libro. È invece un tour personale delle impostazioni che ho davvero integrato nel mio flusso di lavoro, perché contano e cosa è cambiato da quando sono attive.
+
+<!--more-->
+
+## La Colla del Flusso: `push.autoSetupRemote` e `pull.rebase`
+
+Queste due stanno insieme perché riguardano i confini dei branch: come li mandi su e come li riporti giù.
+
+### push.autoSetupRemote
+
+La vecchia frustrazione: creare un branch locale, scrivere codice, eseguire `git push` e ricevere:
+
+```
+fatal: The current branch feature/my-new-branch has no upstream branch.
+To push the current and set the upstream branch, use:
+
+ git push --set-upstream origin feature/my-new-branch
+```
+
+Ogni volta la stessa cerimonia inutile. La soluzione:
+
+```ini
+[push]
+ autoSetupRemote = true
+```
+
+Ora `git push` su un nuovo branch funziona e basta. Git deduce il branch di tracciamento automaticamente. La prima volta che ho usato questa impostazione con i branch di contenuto Hugo, creando `content/nuovo-articolo` il lunedì e facendo subito push, ho capito di aver eliminato forse cinquanta digitazioni l'anno di `--set-upstream`.
+
+### pull.rebase
+
+La storia lineare conta di più su un sito a singolo autore. Senza `pull.rebase = true`, fare pull dei cambiamenti crea commit di merge come "Merge branch 'main' of origin/main" anche quando stai solo sincronizzando. Questi commit non rappresentano lavoro: sono rumore. Intasano `git log`, rendono il bisect più lento e aggiungono confusione al grafo.
+
+```ini
+[pull]
+ rebase = true
+```
+
+Con questa impostazione attiva, fare pull ribasa il lavoro locale sopra la punta remota. Quando gestisci un sito Hugo con un submodule del tema, questo è particolarmente utile: gli aggiornamenti del puntatore del submodule restano ordinati nel log invece di nascondersi dentro commit di merge.
+
+## Identità e Fiducia: `commit.gpgsign`
+
+Firmare i commit con GPG non riguarda la conformità o il superamento di audit. Riguarda la provenienza. Ogni commit sui miei repository porta la mia firma crittografica, la prova che viene da me e non è stata manomessa.
+
+```ini
+[user]
+ signingkey = IL_TUO_KEY_ID_GPG
+ email = danix@danix.xyz
+ name = Danilo M.
+
+[commit]
+ gpgsign = true
+```
+
+La prima volta che si configura, è necessario che `gpg-agent` sia in esecuzione e che la chiave sia importata localmente. Una volta fatto, ogni commit viene firmato automaticamente. Se vuoi approfondire le chiavi GPG, ho scritto di [gestire le password con password-store](/it/articles/manage-your-passwords-with-password-store/), che copre la configurazione delle chiavi.
+
+## Ridurre l'Attrito: `help.autocorrect`, `fetch.prune` e `fetch.prunetags`
+
+Tre piccole impostazioni che risparmiano digitazioni quotidiane e carichi mentali.
+
+### help.autocorrect
+
+I refusi capitano. Scrivo spesso `git statsu` invece di `git status`, o `git comit` invece di `git commit`. Il vecchio comportamento è un messaggio di errore con una correzione suggerita. Con:
+
+```ini
+[help]
+ autocorrect = 10
+```
+
+Git autocorregge ed esegue il comando dopo un conto alla rovescia di 1 secondo:
+
+```
+$ git statsu
+WARNING: You called a Git command named 'statsu', which does not exist.
+Continuing in 0.9 seconds, assuming that you meant 'status'.
+```
+
+Il `10` qui significa 1 secondo (git misura in decimi). È abbastanza lungo da notarlo e interrompere se la correzione è sbagliata, ma abbastanza breve da non spezzare il ritmo.
+
+### fetch.prune e fetch.prunetags
+
+Quando si eliminano branch sul remote, i riferimenti obsoleti si accumulano nel repository locale. Queste impostazioni li puliscono:
+
+```ini
+[fetch]
+ prune = true
+ prunetags = true
+```
+
+Ora `git fetch` rimuove silenziosamente i branch locali che non esistono più upstream, e fa lo stesso per i tag. Per un repository del tema Hugo, i vecchi tag di release vengono rimossi dal server, e `prunetags` fa sì che non restino nel tuo output di `git tag`.
+
+## Quando Arrivano i Conflitti: `merge.conflictstyle` e `rerere`
+
+Due impostazioni che rendono i conflitti di merge meno dolorosi.
+
+### merge.conflictstyle = zdiff3
+
+I marcatori di conflitto normalmente mostrano due lati:
+
+```
+<<<<<<< HEAD
+il tuo codice
+=======
+il loro codice
+>>>>>>> branch
+```
+
+Vedi cosa hai scritto tu e cosa hanno scritto loro, ma non da dove entrambi sono partiti. Lo stile di conflitto `zdiff3` mostra l'antenato comune:
+
+```
+<<<<<<< HEAD
+il tuo codice
+||||||| base
+codice originale
+=======
+il loro codice
+>>>>>>> branch
+```
+
+La sezione `||||||| base` è ciò che entrambi i lati hanno modificato. Ora vedi la storia completa: tu hai cambiato questa riga in X, loro in Y, e l'originale era Z. L'intenzione diventa ovvia.
+
+```ini
+[merge]
+ conflictstyle = zdiff3
+```
+
+### rerere.enabled e rerere.autoupdate
+
+`rerere` sta per "reuse recorded resolution" (riutilizza la risoluzione registrata). Quando risolvi un conflitto manualmente, git ricorda la risoluzione. La prossima volta che si presenta lo stesso conflitto:
+
+```ini
+[rerere]
+ enabled = true
+ autoupdate = true
+```
+
+Git lo risolve automaticamente. Questo è prezioso quando si ribasa un branch di contenuto su un main che include un aggiornamento del puntatore del submodule. La prima volta che c'è un conflitto nel riferimento del submodule, lo risolvi tu. Su un secondo branch con lo stesso conflitto, `rerere` lo gestisce silenziosamente, e `autoupdate` mette in staging la risoluzione così non devi fare `git add` manualmente.
+
+## Orientarsi: Visualizzazione Branch, Log e Diff
+
+Quattro impostazioni che rendono più veloce leggere la storia del repository.
+
+### branch.sort e column.ui
+
+```ini
+[branch]
+ sort = -committerdate
+
+[column]
+ ui = auto
+```
+
+Di default, `git branch` elenca i branch in ordine alfabetico. Inutile dopo dieci branch. L'ordinamento per `-committerdate` mostra i più recenti per primi, il branch su cui probabilmente stai per passare è in cima.
+
+`column.ui = auto` mostra i branch su più colonne quando il terminale è abbastanza largo, riducendo lo scorrimento di una lista lunga.
+
+### log.abbrevCommit e log.follow
+
+```ini
+[log]
+ abbrevCommit = true
+ follow = true
+```
+
+`abbrevCommit` mostra SHA corti (7 caratteri) invece degli hash completi da 40 caratteri. Log più puliti, più veloci da leggere.
+
+`follow` traccia i file attraverso i rename. Quando esegui `git log -- path/to/article.md` e quel file si chiamava prima `old-article.md`, il log non si interrompe, segue il file attraverso il rename e mostra la storia completa.
+
+### diff.mnemonicPrefix, diff.renames e diff.wordRegex
+
+```ini
+[diff]
+ mnemonicPrefix = true
+ renames = true
+ wordRegex = [^[:space:]]
+```
+
+`mnemonicPrefix` cambia le intestazioni dei diff da `a/` e `b/` a etichette più descrittive come `i/` (index), `w/` (working tree), `o/` (object), `c/` (commit). Più informazioni a colpo d'occhio.
+
+`renames = true` rileva i rename dei file e li mostra come `file.old => file.new` invece di una cancellazione e una creazione. Diff più puliti.
+
+`wordRegex` definisce cosa conta come "parola" nei diff a livello di parola (`git diff --word-diff`). Il pattern `[^[:space:]]` tratta qualsiasi carattere non-spazio come una parola, il che significa che la punteggiatura ottiene i propri confini, utile per file ricchi di testo come gli articoli Markdown.
+
+## Le Abbreviazioni che si Guadagnano il Posto: Alias
+
+Tengo gli alias al minimo di proposito. Gli alias che nascondono cosa fa git sono rumore; questi due valgono il risparmio di battiture.
+
+### lg: Log formattato con grafo
+
+```ini
+[alias]
+ lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
+```
+
+Eseguendo `git lg` si ottiene un grafo colorato con hash, date, messaggi, autori e puntatori ai branch:
+
+```
+* abc1234 - (3 hours ago) Aggiungo articolo git config - Danilo M. (HEAD -> master)
+* def5678 - (1 day ago) Fix CSS tema - Danilo M.
+|\
+| * ghi9012 - (2 days ago) WIP: nuova funzione - Danilo M. (content/bozza)
+|/
+* jkl3456 - (5 days ago) Bump submodule tema - Danilo M. (origin/master)
+```
+
+Molto meglio del semplice `git log`.
+
+### sw: Abbreviazione per switch
+
+```ini
+[alias]
+ sw = switch
+```
+
+`git sw main` è più veloce da digitare di `git switch main`, e `git sw -c feature/nuovo` crea e passa in un solo comando.
+
+## Una Giornata Tipo
+
+Ecco come queste impostazioni lavorano insieme nella pratica.
+
+Mattina: sincronizzo con il repository. `git fetch` parte silenziosamente, `fetch.prune` e `prunetags` puliscono branch cancellati e tag vecchi senza che ci pensi.
+
+Inizio l'articolo della settimana per il sito Hugo. Creo un nuovo branch di contenuto:
+
+```bash
+git sw -c content/git-config-in-profondita
+```
+
+Niente `--set-upstream` dopo. `push.autoSetupRemote` ci pensa lui.
+
+Scrivo, committo. Il commit viene firmato con GPG automaticamente. Nessun passaggio extra.
+
+```bash
+git commit -m "Aggiungo prima bozza articolo git config"
+```
+
+Push quando ho finito:
+
+```bash
+git push
+```
+
+Nessun errore di upstream. Funziona e basta.
+
+Più tardi, il branch main riceve un aggiornamento del submodule del tema. Ribaso il mio lavoro sopra:
+
+```bash
+git fetch
+git rebase main
+```
+
+C'è un conflitto nel puntatore del submodule, il repository del tema è andato avanti. `merge.conflictstyle = zdiff3` mi mostra esattamente cosa è cambiato. Lo risolvo una volta.
+
+Più tardi, un secondo branch ha lo stesso conflitto del submodule. `rerere` ricorda la mia risoluzione e la applica automaticamente con `rerere.autoupdate`. Nessuna ri-risoluzione.
+
+Prima di unire su main, controllo il grafo:
+
+```bash
+git lg
+```
+
+L'output ordinato mostra la timeline chiaramente.
+
+Merge su main:
+
+```bash
+git switch main
+git merge content/git-config-in-profondita
+```
+
+Se c'è un conflitto qui (improbabile dato che abbiamo ribassato), `zdiff3` mostra il contesto dell'antenato.
+
+Fatto. Tutte le impostazioni hanno lavorato insieme in modo trasparente.
+
+## La Configurazione Completa
+
+Ecco il blocco completo così come sta nel mio `~/.gitconfig`:
+
+```ini
+[user]
+ name = Danilo M.
+ email = danix@danix.xyz
+ signingkey = IL_TUO_KEY_ID_QUI
+
+[pull]
+ rebase = true
+
+[push]
+ autoSetupRemote = true
+
+[commit]
+ gpgsign = true
+
+[help]
+ autocorrect = 10
+
+[fetch]
+ prune = true
+ prunetags = true
+
+[merge]
+ conflictstyle = zdiff3
+
+[rerere]
+ enabled = true
+ autoupdate = true
+
+[branch]
+ sort = -committerdate
+
+[column]
+ ui = auto
+
+[log]
+ abbrevCommit = true
+ follow = true
+
+[diff]
+ mnemonicPrefix = true
+ renames = true
+ wordRegex = [^[:space:]]
+
+[alias]
+ lg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
+ sw = switch
+```
+
+Prendi quello che ti serve. Lascia quello che non si adatta al tuo flusso di lavoro.
+
+## Una Configurazione che Evolve
+
+Questa non è la configurazione git "corretta", è quella che si adatta a come lavoro io. La sto raffinando da anni e continuerà a evolversi man mano che trovo nuovi punti di attrito e scopro nuove impostazioni. L'obiettivo non è seguire la mia configurazione alla lettera, ma pensare a cosa ti rallenta e cercare l'impostazione git che lo risolve.
+
+Se usi qualcuna di queste impostazioni, o se ne hai trovate altre che hanno cambiato il tuo flusso di lavoro, fammelo sapere nei commenti. Sono sempre curioso di sapere come gli altri configurano i loro strumenti.
diff --git a/content/it/articles/myself-as-a-droid/index.md b/content/it/articles/myself-as-a-droid/index.md
index 0ec3758..4816cc0 100644
--- a/content/it/articles/myself-as-a-droid/index.md
+++ b/content/it/articles/myself-as-a-droid/index.md
@@ -7,8 +7,6 @@ draft = true
categories = ["Blogging"]
tags = ["web", "android", "droidify", "market"]
+++
-<figure style="width: 500px" class="wp-caption aligncenter"><img loading="lazy" style="margin-right: auto; margin-left: auto;" src="http://danixland.net/wp-content/uploads/2011/02/wpid-android21.png" alt="image" width="500" height="500" /><figcaption class="wp-caption-text">che ve ne pare? il mio autoritratto in stile android!!</figcaption></figure>
-
-l&#8217;ho creato usando [droidify yourself][1], un&#8217;app di google per il market di android.. ;-)
+l'ho creato usando [droidify yourself][1], un'app di google per il market di android.. ;-)
[1]: https://market.android.com/details?id=com.google.android.apps.androidify \ No newline at end of file
diff --git a/content/it/articles/speak-to-me/index.md b/content/it/articles/speak-to-me/index.md
index 84ee91c..a11cb81 100644
--- a/content/it/articles/speak-to-me/index.md
+++ b/content/it/articles/speak-to-me/index.md
@@ -7,12 +7,8 @@ categories = [ "Blogging"]
tags = [ "mad", "pink floyd"]
+++
-<blockquote class="wp-block-quote">
- <p>
- I&#8217;ve always been mad, I know I&#8217;ve been mad, like the most of us are. It&#8217;s very hard to explain why you&#8217;re mad, even if you&#8217;re not mad.
- </p>
-
- <cite>Pink Floyd &#8211; Speak to Me</cite>
-</blockquote>
+> I've always been mad, I know I've been mad, like the most of us are. It's very hard to explain why you're mad, even if you're not mad.
+>
+> — Pink Floyd – Speak to Me
Credo che questo sarà il mio primo tattoo.. :) \ No newline at end of file
diff --git a/content/it/articles/wp_patcher-un-metodo-per-aggiornare-wordpress/index.md b/content/it/articles/wp_patcher-un-metodo-per-aggiornare-wordpress/index.md
index cdb77a6..dbfc23b 100644
--- a/content/it/articles/wp_patcher-un-metodo-per-aggiornare-wordpress/index.md
+++ b/content/it/articles/wp_patcher-un-metodo-per-aggiornare-wordpress/index.md
@@ -22,7 +22,8 @@ Detto fatto, mi sono messo a giocare un po&#8217; con Vim e ho tirato fuori **wp
Questo è lo script:
-<pre class="wp-block-preformatted language-bash"><code>#! /bin/bash
+```bash
+#! /bin/bash
# WP-patcher - script che si occupa di recuperare le differenze
# tra 2 versioni differenti di WordPress, scaricando le revisioni
# tramite svn.
@@ -70,7 +71,7 @@ svn export $new_vrs wp_$sane_new_vrs
rm -rf $old_vrs $new_vrs
echo "ho esportato correttamente le 2 versioni di wordpress"
echo "adesso procedo alla creazione della patch"
-diff -qr wp_$sane_old_vrs wp_$sane_new_vrs |cut -d" " -f4 &gt; patch_file.txt
+diff -qr wp_$sane_old_vrs wp_$sane_new_vrs |cut -d" " -f4 > patch_file.txt
mkdir $patchdir
mods=`cat patch_file.txt`
for i in $mods;do
@@ -89,7 +90,8 @@ rm -rf $workdir
echo "l'archivio contenente i files da sostituire"
echo "è il file 'wp_${patchdir}.tar.bz2"
# fine :)
-exit 0</code></pre>
+exit 0
+```
E&#8217; molto semplice e non dovrebbe essere difficile modificarlo secondo le vostre necessità&#8230;
@@ -105,11 +107,7 @@ Perchè lo script funzioni è necessario che nel sistema sia installato svn, tar
Una volta creato l&#8217;archivio con i files da aggiornare vi basterà decomprimerlo e caricare i files sul vostro spazio web sovrascrivendo quelli già presenti. Nel caso in cui fosse necessario un aggiornamento del database di WordPress vi basterà lanciare dal browser la pagina **http://urldelblog/wp-admin/upgrade.php**.
-<blockquote class="wp-block-quote alert">
- <p>
- <strong><em>Come sempre vale il consiglio, prima di aggiornare WordPress, di effettuare un backup dei files e del database, in modo da poter ripristinare una situazione funzionante in caso di problemi.</em></strong>
- </p>
-</blockquote>
+> **_Come sempre vale il consiglio, prima di aggiornare WordPress, di effettuare un backup dei files e del database, in modo da poter ripristinare una situazione funzionante in caso di problemi._**
Questo script come potete vedere è rilasciato sotto la GPL v3, quindi è liberamente utilizzabile e modificabile entro i termini di questa licenza appunto.
diff --git a/content/it/articles/xrandr-e-dual-head-su-slackware-12-2-e-intel/index.md b/content/it/articles/xrandr-e-dual-head-su-slackware-12-2-e-intel/index.md
index 3a82dba..c750a32 100644
--- a/content/it/articles/xrandr-e-dual-head-su-slackware-12-2-e-intel/index.md
+++ b/content/it/articles/xrandr-e-dual-head-su-slackware-12-2-e-intel/index.md
@@ -23,7 +23,8 @@ Ovviamente facendo in questo modo ho una superficie del desktop di circa il 120%
A questo punto, ogni qualvolta io voglia attivare il doppio desktop, mi basterà lanciare questo script che mi sono creato, l&#8217;ho chiamato **dualhead.sh**:
-<pre>#! /bin/bash
+```bash
+#! /bin/bash
case $1 in
start ) xrandr --output LVDS --mode 1280x800 \
@@ -35,7 +36,8 @@ case $1 in
exit 1
;;
esac
-exit</pre>
+exit
+```
lanciandolo con flag &#8220;start&#8221; avvierà il dualhead mentre lanciando lo script con &#8220;stop&#8221; tutto il desktop ritornerà sul solo schermo del laptop in quanto xrandr spegnerà l&#8217;uscita vga esterna.
diff --git a/content/it/repository/index.md b/content/it/repository/index.md
index f4c7972..7026640 100644
--- a/content/it/repository/index.md
+++ b/content/it/repository/index.md
@@ -1,62 +1,83 @@
+++
title = "Repository Slackware"
date = 2026-04-17T00:00:00Z
-draft = true
+++
-## Inizio Rapido
+Questo è un repository **Slackware64-current**; i miei pacchetti sono compilati e gestiti per slackware64-current. Quando rilascio un pacchetto che può essere compilato sull'ultima versione stable di Slackware, provo a pubblicarlo su [slackbuilds.org](https://slackbuilds.org/), ma se il pacchetto proviene da questo repository, date per certo che sia solo per `-current`.
-Aggiungi il repository al tuo sistema Slackware:
+## Setup rapido
+
+Per usare il mio repository nel tuo sistema Slackware ti serve [slackpkg+](https://slakfinder.org/slackpkg+.html). Modifica `/etc/slackpkg/slackpkgplus.conf` e usa **"danix"** come nome del repository:
```bash
-# Aggiungi configurazione repository (comando di esempio)
-wget -O - https://danix.xyz/packages/slackware.asc | gpg --import
-echo "deb https://danix.xyz/packages/slackware/ stable main" >> /etc/apt/sources.list.d/danix.list
-apt-get update
+# Aggiungi il repository a PKGS_PRIORITY
+PKGS_PRIORITY=( multilib danix alien restricted slackers)
+# Aggiungi danix all'array REPOPLUS
+REPOPLUS=( slackpkgplus restricted alien multilib slackers hyprwm danix )
+# Infine, definisci la voce MIRRORPLUS per "danix"
+MIRRORPLUS['danix']=https://packages.danix.xyz/
```
+Puoi tenere il mio repository insieme ad altri repo di terze parti.
+
+Una volta configurato, ti basta aggiornare la lista e cercare i miei pacchetti direttamente con `slackpkg`.
+
+```bash
+# aggiorna le firme dei pacchetti
+slackpkg update gpg
+# aggiorna le liste dei pacchetti
+slackpkg update
+# cerca un pacchetto
+slackpkg search <nome pacchetto>
+# installa un pacchetto
+slackpkg install <nome pacchetto>
+```
+
+
## Installazione
### Prerequisiti
-- Slackware 15.0 o successivi
+- Slackware 15.0 o successiva
- Accesso root o sudo
- wget o curl
### Passaggi
-1. Scarica e importa la chiave GPG del repository
-2. Aggiungi il repository alla configurazione del gestore di pacchetti
-3. Aggiorna gli elenchi dei pacchetti
-4. Installa i pacchetti come necessario
+1. Aggiungi il repository alla tua configurazione di slackpkg+
+2. Importa la chiave GPG del mio repository
+3. Aggiorna le liste dei pacchetti
+4. Installa i pacchetti secondo necessità
-### URL Repository
+### URL del Repository
```
-https://danix.xyz/packages/slackware/
+https://packages.danix.xyz/
```
## Utilizzo
-### Installazione di un Pacchetto
+### Installare un pacchetto
```bash
-apt-get install nome-pacchetto
+slackpkg install nome-pacchetto
```
-### Aggiornamento dei Pacchetti
+### Aggiornare i pacchetti
```bash
-apt-get update
-apt-get upgrade
+slackpkg update
+slackpkg upgrade
+# per aggiornare tutti i pacchetti, inclusi quelli di sistema di Slackware:
+slackpkg upgrade-all
```
-### Ricerca di Pacchetti
+### Cercare pacchetti
```bash
-apt-cache search parola-chiave
+slackpkg search parola-chiave
```
-## Pacchetti Disponibili
+## Pacchetti disponibili
-Controlla il repository per i pacchetti disponibili più recenti. Consulta i repository GitHub SlackBuild di seguito per informazioni sulla compilazione e file di origine.
+Dai un'occhiata al repository per gli ultimi pacchetti disponibili. Vedi i repository SlackBuild su GitHub qui sotto per i dettagli sulle build e i file sorgente.
diff --git a/data/repos.yaml b/data/repos.yaml
index 4e1c2f7..3f7c897 100644
--- a/data/repos.yaml
+++ b/data/repos.yaml
@@ -1,24 +1,23 @@
repos:
- - name: "slackbuild-example-1"
+ - name: "Slackware Pentesting Suite"
description_key: "repo_example_1_desc"
- github_url: "https://github.com/danix/slackbuild-example-1"
- image: "images/repo-icons/example-1.png"
+ github_url: "https://github.com/danixland/Slackware-Pentesting-Suite"
+ image: "/uppies/2026/04/sl-hack-ware.jpg"
tags:
- "Slackware"
- - "Build System"
+ - "Pentesting"
- - name: "slackbuild-example-2"
- description_key: "repo_example_2_desc"
- github_url: "https://github.com/danix/slackbuild-example-2"
- image: "images/repo-icons/example-2.png"
- tags:
- - "Slackware"
- - "Package"
+ # - name: "My SlackBuilds"
+ # description_key: "repo_example_2_desc"
+ # github_url: "https://github.com/danixland/my-slackbuilds"
+ # image: ""
+ # tags:
+ # - "Packages"
- - name: "slackbuild-example-3"
- description_key: "repo_example_3_desc"
- github_url: "https://github.com/danix/slackbuild-example-3"
- image: "images/repo-icons/example-3.png"
- tags:
- - "Slackware"
- - "Utilities"
+ # - name: "slackbuild-example-3"
+ # description_key: "repo_example_3_desc"
+ # github_url: "https://github.com/danix/slackbuild-example-3"
+ # image: "images/repo-icons/example-3.png"
+ # tags:
+ # - "Slackware"
+ # - "Utilities"
diff --git a/docs/superpowers/specs/2026-04-28-adaptive-repo-grid-design.md b/docs/superpowers/specs/2026-04-28-adaptive-repo-grid-design.md
new file mode 100644
index 0000000..c3f7de6
--- /dev/null
+++ b/docs/superpowers/specs/2026-04-28-adaptive-repo-grid-design.md
@@ -0,0 +1,67 @@
+# Adaptive Repository Grid Design
+
+**Date:** 2026-04-28
+**Branch:** `feature/adaptive-repo-grid`
+**Worktree:** `.worktrees/adaptive-repo-grid`
+
+## Context
+
+The repository page (`themes/danix-xyz-hacker/layouts/repository/single.html`) has a hardcoded `grid-cols-1 md:grid-cols-2 lg:grid-cols-3` layout for Slackware package repo cards. The card data lives in `data/repos.yaml`. When only 1 repo is defined, the card stretches full width — visually poor. When 2 repos are defined, the 3-col grid leaves an empty slot. Maintainability: adding or removing repos from the YAML file requires manual CSS adjustment.
+
+**Goal:** Grid adapts automatically to however many repos are in `data/repos.yaml`. No Hugo template logic required for N > 1. Single-repo edge case handled by CSS `:only-child`.
+
+## Design
+
+### Approach: CSS `auto-fit/minmax` + `:only-child`
+
+Replace the fixed Tailwind grid with a semantic CSS class backed by a custom rule:
+
+**Grid container** (`auto-fit` handles 2+ repos automatically):
+```css
+.repo-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 1.5rem;
+}
+```
+
+**Single-card centering** (fires only when exactly 1 card is in the grid):
+```css
+.repo-card:only-child {
+ max-width: 50%;
+ margin-inline: auto;
+}
+```
+
+The `:only-child` rule fires only when the element has no siblings inside the grid — safe for 2, 3, N repos. If a non-card element is ever added inside `.repo-grid`, this rule still works correctly as long as there is only one `.repo-card`.
+
+### Responsive behaviour by count
+
+| Repos | Result |
+|-------|--------|
+| 1 | Card centered, 50% container width |
+| 2 | Two equal columns (each ~50%) |
+| 3 | Three equal columns (~33% each) |
+| 4+ | Wraps to new rows, min 280px per card |
+
+On small screens `minmax(280px, 1fr)` collapses to a single column naturally — no breakpoint overrides needed.
+
+## Files to Modify
+
+**Theme repo** (`/home/danix/Programming/GIT/danix2-hugo-theme/`):
+
+1. `layouts/repository/single.html` — replace `grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6` class on wrapper div with `repo-grid`; add `repo-card` class to each card div
+2. `assets/css/main.css` — add `.repo-grid` and `.repo-card:only-child` rules
+
+**Content repo** (`/home/danix/Programming/GIT/danix.xyz-hacker-theme/`):
+
+3. After CSS change: run `npm run build` to recompile `main.min.css`
+4. Commit theme changes, push theme repo, bump submodule pointer in content repo
+
+## Verification
+
+1. `data/repos.yaml` — test with 1 entry: card should be centered at ~50% width
+2. `data/repos.yaml` — test with 2 entries: two equal-width columns
+3. `data/repos.yaml` — test with 3 entries: three equal-width columns (current default)
+4. Resize viewport to mobile: all counts collapse to single column
+5. `hugo server` from worktree root (after `git submodule update --init`) to preview live
diff --git a/hugo.toml b/hugo.toml
index 885cbd2..2c94197 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -10,6 +10,11 @@ enableRobotsTXT = true
author = "Danilo Macrì"
email = "danix@danix.xyz"
twitterHandle = "danixland"
+ readingTime = true
+ shareButtons = true
+ relatedPosts = true
+ primaryAccent = "#a855f7"
+ secondaryAccent = "#00ff88"
# Output format definitions
[outputFormats]
@@ -69,11 +74,11 @@ enableRobotsTXT = true
name = "here"
weight = 3
- # [[languages.it.menus.main]]
- # identifier = "repository"
- # pageRef = "/repository"
- # name = "repo"
- # weight = 4
+ [[languages.it.menus.main]]
+ identifier = "repository"
+ pageRef = "/repository"
+ name = "repo"
+ weight = 4
[[languages.it.menus.main]]
identifier = "legal"
@@ -108,11 +113,11 @@ enableRobotsTXT = true
name = "here"
weight = 3
- # [[languages.en.menus.main]]
- # identifier = "repository"
- # pageRef = "/repository"
- # name = "repo"
- # weight = 4
+ [[languages.en.menus.main]]
+ identifier = "repository"
+ pageRef = "/repository"
+ name = "repo"
+ weight = 4
[[languages.en.menus.main]]
identifier = "legal"
@@ -125,44 +130,35 @@ enableRobotsTXT = true
tag = "tags"
category = "categories"
- # Theme options
- readingTime = true
- shareButtons = true
- relatedPosts = true
-
- # Colors
- primaryAccent = "#a855f7"
- secondaryAccent = "#00ff88"
-
- # Article types with color mapping
- [params.articleTypes.life]
- label = "Life"
- color_dark = "#f59e0b"
- color_light = "#d97706"
+# Article types with color mapping
+[params.articleTypes.life]
+ label = "Life"
+ color_dark = "#f59e0b"
+ color_light = "#d97706"
- [params.articleTypes.photo]
- label = "Photo"
- color_dark = "#ec4899"
- color_light = "#be185d"
+[params.articleTypes.photo]
+ label = "Photo"
+ color_dark = "#ec4899"
+ color_light = "#be185d"
- [params.articleTypes.link]
- label = "Link"
- color_dark = "#38bdf8"
- color_light = "#0284c7"
+[params.articleTypes.link]
+ label = "Link"
+ color_dark = "#38bdf8"
+ color_light = "#0284c7"
- [params.articleTypes.quote]
- label = "Quote"
- color_dark = "#00ff88"
- color_light = "#008f5a"
+[params.articleTypes.quote]
+ label = "Quote"
+ color_dark = "#00ff88"
+ color_light = "#008f5a"
- [params.articleTypes.tech]
- label = "Tech"
- color_dark = "#a855f7"
- color_light = "#7c3aed"
+[params.articleTypes.tech]
+ label = "Tech"
+ color_dark = "#a855f7"
+ color_light = "#7c3aed"
# Related content configuration
[related]
- threshold = 80
+ threshold = 65
includeNewer = true
toLower = true
diff --git a/i18n/en.yaml b/i18n/en.yaml
index fe50254..bf35bb4 100644
--- a/i18n/en.yaml
+++ b/i18n/en.yaml
@@ -10,6 +10,7 @@ toggleTheme: "Theme"
toggleMenu: "Menu"
closeMenu: "Close"
mainMenu: "Main navigation"
+opensInNewTab: "(opens in new tab)"
skipToContent: "Skip to main content"
email: "Email"
contact: "Contact"
@@ -44,6 +45,8 @@ updated: "Updated"
readingTime: "reading time"
min: "min"
author: "Author"
+words: "words"
+articleStats: "stat"
category: "Category"
categories: "Categories"
tag: "Tag"
@@ -57,6 +60,11 @@ postCount:
one: "1 post"
other: "{{ . }} posts"
+# Obsolete articles
+obsolete_label: "Obsolete article"
+obsolete_warning: "This article is outdated and may no longer be accurate."
+obsolete_read_updated: "Read the updated version"
+
# Article types
life: "Life"
photo: "Photo"
@@ -145,30 +153,30 @@ redPill:
easterEggTitle:
other: "Choose Your Path"
-# # Repository Page
-# repositoryTitle:
-# other: "Slackware Repository"
-# repositorySubtitle:
-# other: "Download and install my curated Slackware packages"
-# quickStartTitle:
-# other: "Quick Start"
-# copyCommand:
-# other: "Copy"
-# copiedMessage:
-# other: "Copied to clipboard!"
-# installationTitle:
-# other: "Installation"
-# usageTitle:
-# other: "Usage"
-# availablePackagesTitle:
-# other: "Available Packages"
-# githubReposTitle:
-# other: "GitHub SlackBuild Repositories"
-# visitGithub:
-# other: "Visit GitHub"
-# repo_example_1_desc:
-# other: "SlackBuild scripts for Example Package 1. Build system and tools for Slackware package management."
+# Repository Page
+repositoryTitle:
+ other: "Slackware Repository"
+repositorySubtitle:
+ other: "Download and install my curated Slackware packages"
+quickStartTitle:
+ other: "Quick Start"
+copyCommand:
+ other: "Copy"
+copiedMessage:
+ other: "Copied to clipboard!"
+installationTitle:
+ other: "Installation"
+usageTitle:
+ other: "Usage"
+availablePackagesTitle:
+ other: "Available Packages"
+githubReposTitle:
+ other: "GitHub SlackBuild Repositories"
+visitGithub:
+ other: "Visit GitHub"
+repo_example_1_desc:
+ other: "A curated collection of programs, tools, libraries and various utilities, ready to be compiled and installed on Slackware."
# repo_example_2_desc:
-# other: "SlackBuild scripts for Example Package 2. A comprehensive package with full documentation and support."
+# other: "Various SlackBuild scripts, following SlackBuilds.org conventions wherever is possible."
# repo_example_3_desc:
# other: "SlackBuild scripts for Example Package 3. Utility package for system administration and configuration."
diff --git a/i18n/it.yaml b/i18n/it.yaml
index 907acf8..31424ea 100644
--- a/i18n/it.yaml
+++ b/i18n/it.yaml
@@ -10,6 +10,7 @@ toggleTheme: "Tema"
toggleMenu: "Menu"
closeMenu: "Chiudi"
mainMenu: "Navigazione principale"
+opensInNewTab: "(si apre in una nuova scheda)"
skipToContent: "Salta al contenuto principale"
email: "Email"
contact: "Contatti"
@@ -44,6 +45,8 @@ updated: "Aggiornato"
readingTime: "tempo di lettura"
min: "min"
author: "Autore"
+words: "parole"
+articleStats: "stat"
category: "Categoria"
categories: "Categorie"
tag: "Tag"
@@ -57,6 +60,11 @@ postCount:
one: "1 articolo"
other: "{{ . }} articoli"
+# Obsolete articles
+obsolete_label: "Articolo obsoleto"
+obsolete_warning: "Questo articolo è obsoleto e potrebbe non essere più accurato."
+obsolete_read_updated: "Leggi la versione aggiornata"
+
# Article types
life: "Vita"
photo: "Foto"
@@ -145,32 +153,32 @@ redPill:
easterEggTitle:
other: "Scegli il Tuo Percorso"
-# # Repository Page
-# repositoryTitle:
-# other: "Repository Slackware"
-# repositorySubtitle:
-# other: "Scarica e installa i miei pacchetti Slackware curati"
-# quickStartTitle:
-# other: "Inizio Rapido"
-# copyCommand:
-# other: "Copia"
-# copiedMessage:
-# other: "Copiato negli appunti!"
-# installationTitle:
-# other: "Installazione"
-# usageTitle:
-# other: "Utilizzo"
-# availablePackagesTitle:
-# other: "Pacchetti Disponibili"
-# githubReposTitle:
-# other: "Repository GitHub SlackBuild"
-# visitGithub:
-# other: "Visita GitHub"
+# Repository Page
+repositoryTitle:
+ other: "Repository Slackware"
+repositorySubtitle:
+ other: "Scarica e installa i miei pacchetti Slackware curati"
+quickStartTitle:
+ other: "Inizio Rapido"
+copyCommand:
+ other: "Copia"
+copiedMessage:
+ other: "Copiato negli appunti!"
+installationTitle:
+ other: "Installazione"
+usageTitle:
+ other: "Utilizzo"
+availablePackagesTitle:
+ other: "Pacchetti Disponibili"
+githubReposTitle:
+ other: "Repository GitHub SlackBuild"
+visitGithub:
+ other: "Visita GitHub"
# # Repository Descriptions
-# repo_example_1_desc:
-# other: "Script SlackBuild per Pacchetto Esempio 1. Sistema di compilazione e strumenti per la gestione dei pacchetti Slackware."
+repo_example_1_desc:
+ other: "Una raccolta di programmi, tool, librerie e varie utility selezionate; pronte per essere compilate e installate su Slackware."
# repo_example_2_desc:
-# other: "Script SlackBuild per Pacchetto Esempio 2. Un pacchetto completo con documentazione e supporto completi."
+# other: "Vari script SlackBuild, seguo gli standard di SlackBuilds.org ovunque possibile."
# repo_example_3_desc:
# other: "Script SlackBuild per Pacchetto Esempio 3. Pacchetto di utilità per amministrazione di sistema e configurazione."
diff --git a/static/uppies/2026/04/sl-hack-ware.jpg b/static/uppies/2026/04/sl-hack-ware.jpg
new file mode 100644
index 0000000..e24b7f7
--- /dev/null
+++ b/static/uppies/2026/04/sl-hack-ware.jpg
Binary files differ
diff --git a/themes/danix-xyz-hacker b/themes/danix-xyz-hacker
-Subproject 2bb102971ce560e5e72fc5dca53916f94570efa
+Subproject 997ea90b7f85329476771e8b30a38fb86c18a07