{
	"version": "https://jsonfeed.org/version/1",
	"title": "rMdes - a place to write and think freely",
	"icon": "https://avatars.micro.blog/avatars/2023/15/3241.jpg",
	"home_page_url": "https://blog.rmendes.net/",
	"feed_url": "https://blog.rmendes.net/feed.json",
	"items": [
			{
				"id": "http://rmdes.micro.blog/2026/01/16/revamped-my-domain-name-site.html",
				
				"content_html": "<p>Revamped my domain name site <a href=\"https://rmendes.net\">rmendes.net</a></p>\n<ul>\n<li>plan to use it like a live CV showcasing work related stuff</li>\n<li>couldn&rsquo;t resist to play with the code and implement #indieweb using #go existing libraries</li>\n<li>also has webmentions support, feel free to test :)</li>\n</ul>\n",
				
				"date_published": "2026-01-16T17:44:00+01:00",
				"url": "https://blog.rmendes.net/2026/01/16/revamped-my-domain-name-site.html",
				"tags": ["Coding","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2026/01/12/claude-code-journey.html",
				"title": "Claude Code Journey ",
				"content_html": "<p>I have been using Claude Code for a few months now, first on small personal code bases that urgently needed refactoring and then professionally on small internal tools then bigger code bases that are actually in production but are legacy code that haven&rsquo;t been updated in a few years.</p>\n<p>Now I&rsquo;m finally working on my own attempt at making sense of Juridical Data (65GB) of PDF&rsquo;s and media coverage of the OKC judicial case.</p>\n<p>I&rsquo;m basically creating a Juridically oriented LLM/RAG solution to ingest PDF content and then use pgvector and other technologies to be able to interact with the whole Archive from my browser interface.</p>\n<p>This will never be published publicly obviously but it&rsquo;s a very interesting use case and learning curve.</p>\n",
				
				"date_published": "2026-01-12T18:23:10+01:00",
				"url": "https://blog.rmendes.net/2026/01/12/claude-code-journey.html",
				"tags": ["OKCinfo","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2026/01/12/je-serais-sur-nrj-belgique.html",
				
				"content_html": "<p>Je serais sur NRJ Belgique vers 18h30 pour parler de <a href=\"https://chardonsbleus.org\">chardonsbleus.org</a> et de l&rsquo;affaire OKC-Spatz en France</p>\n",
				
				"date_published": "2026-01-12T17:32:07+01:00",
				"url": "https://blog.rmendes.net/2026/01/12/je-serais-sur-nrj-belgique.html",
				"tags": ["OKCinfo","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2026/01/05/venezuela-the-precedents-by-snyder.html",
				
				"content_html": "<p><a href=\"https://open.substack.com/pub/snyder/p/venezuela-the-precedents\">Venezuela</a>: the precedents by Snyder</p>\n",
				
				"date_published": "2026-01-05T07:11:17+01:00",
				"url": "https://blog.rmendes.net/2026/01/05/venezuela-the-precedents-by-snyder.html",
				"tags": ["Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2026/01/01/not-sure-about-solving-how.html",
				
				"content_html": "<p>Not sure about solving&hellip;</p>\n<p>How AI Labs Are &ldquo;Solving&rdquo; the Power Crisis: The Onsite Gas Deep Dive <a href=\"https://newsletter.semianalysis.com/p/how-ai-labs-are-solving-the-power\">Read More</a></p>\n",
				
				"date_published": "2026-01-01T13:25:33+01:00",
				"url": "https://blog.rmendes.net/2026/01/01/not-sure-about-solving-how.html",
				"tags": ["Tech","AI","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/29/so-i-have-been-busy.html",
				
				"content_html": "<p>So &hellip; I have been busy contributing to <a href=\"http://v2.osintukraine.com\">this</a></p>\n<p>tldr: real-time #telegram archive of the Russian War against Ukraine.</p>\n<p>It&rsquo;s 100% built with Claude Code in a bit more than 2 months</p>\n<p>it&rsquo;s near 200.000 lines of #python code, without counting with <a href=\"https://v2.osintukraine.com/platform-docs\">documentation</a> of course.</p>\n<p>check it out !</p>\n",
				
				"date_published": "2025-12-29T20:21:08+01:00",
				"url": "https://blog.rmendes.net/2025/12/29/so-i-have-been-busy.html",
				"tags": ["Tech","AI","Coding","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/29/let-me-rephrase-that-title.html",
				
				"content_html": "<p>let me rephrase that title : Big Tech basically flipped their script and bowed to the King (other images come to mind but would be very vulgar)</p>\n<p><a href=\"https://arstechnica.com/tech-policy/2025/12/big-tech-basically-took-trumps-unpredictable-trade-war-lying-down/\">arstechnica.com/tech-poli&hellip;</a></p>\n",
				
				"date_published": "2025-12-29T20:11:37+01:00",
				"url": "https://blog.rmendes.net/2025/12/29/let-me-rephrase-that-title.html",
				"tags": ["Tech","AI","Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/29/upgrading-funkwhale-from-to-rc.html",
				"title": "Upgrading Funkwhale from 1.4.0 to 2.0.0-rc5 on Debian",
				"content_html": "<p>After running Funkwhale 1.4.0 for a while, I decided to upgrade to the 2.0.0-rc5 release candidate. This post documents the full upgrade process on a Debian 12 (bookworm) server, including the issues I encountered and how to resolve them.</p>\n<h2 id=\"whats-new-in-funkwhale-20\">What&rsquo;s New in Funkwhale 2.0</h2>\n<p>Funkwhale 2.0 brings significant changes:</p>\n<ul>\n<li><strong>Libraries replaced by Playlists</strong> - The old &ldquo;Libraries&rdquo; concept has been migrated to a more intuitive playlist-based system</li>\n<li><strong>Python 3.11+ required</strong> - The minimum Python version has been bumped</li>\n<li><strong>Django 5.1.6</strong> - Major framework upgrade</li>\n<li><strong>venv instead of virtualenv</strong> - The recommended virtual environment tool has changed</li>\n<li><strong>Improved artist credits system</strong> - Better handling of artist metadata</li>\n<li><strong>Federation improvements</strong> - Enhanced ActivityPub support (though this may break compatibility with older instances)</li>\n</ul>\n<h2 id=\"prerequisites\">Prerequisites</h2>\n<p>Before starting the upgrade, ensure you have:</p>\n<ul>\n<li>Root access to your server</li>\n<li>Sufficient disk space for backups (~2x your database size + config files)</li>\n<li>Python 3.11 installed (<code>python3 --version</code>)</li>\n<li>The <code>python3.11-venv</code> package installed</li>\n</ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">apt install python3.11-venv\n</code></pre></div><h2 id=\"step-1-create-a-full-backup\">Step 1: Create a Full Backup</h2>\n<p><strong>Never skip this step.</strong> The database backup is your lifeline if something goes wrong.</p>\n<h3 id=\"database-backup\">Database Backup</h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">sudo -u postgres pg_dumpall &gt; /srv/funkwhale/backups/dump_<span style=\"color:#66d9ef\">$(</span>date +%d-%m-%Y_%H_%M_%S<span style=\"color:#66d9ef\">)</span>.sql\n</code></pre></div><h3 id=\"media-backup\">Media Backup</h3>\n<p>If you have a lot of music, consider syncing your media directory to another location:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"color:#75715e\"># From your local machine (if you have rsync access)</span>\nrsync -avz --progress user@yourserver:/srv/funkwhale/data/music ~/funkwhale-backup/music/\n</code></pre></div><p>Or create a compressed archive on the server:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">tar -czvf /srv/funkwhale/backups/media-backup.tar.gz /srv/funkwhale/data/music\n</code></pre></div><h3 id=\"configuration-backup\">Configuration Backup</h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">cp -a /srv/funkwhale/config /srv/funkwhale/backups/config-backup\n</code></pre></div><h2 id=\"step-2-stop-funkwhale-services\">Step 2: Stop Funkwhale Services</h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl stop funkwhale.target\n</code></pre></div><p>Verify everything is stopped:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl status funkwhale-server funkwhale-worker funkwhale-beat\n</code></pre></div><h2 id=\"step-3-backup-current-installation\">Step 3: Backup Current Installation</h2>\n<p>Before removing anything, backup the current installation for potential rollback:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">BACKUP_DIR<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;/srv/funkwhale/backups/upgrade-</span><span style=\"color:#66d9ef\">$(</span>date +%Y%m%d_%H%M%S<span style=\"color:#66d9ef\">)</span><span style=\"color:#e6db74\">&#34;</span>\nmkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span>\n\ncp -a /srv/funkwhale/api <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/api&#34;</span>\ncp -a /srv/funkwhale/front <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/front&#34;</span>\ncp -a /srv/funkwhale/virtualenv <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span>\ncp -a /srv/funkwhale/config <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/config&#34;</span>\n\n<span style=\"color:#75715e\"># Backup systemd units</span>\nmkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd&#34;</span>\ncp /etc/systemd/system/funkwhale*.service <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span>\ncp /etc/systemd/system/funkwhale.target <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span>\n\n<span style=\"color:#75715e\"># Backup nginx config</span>\nmkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx&#34;</span>\ncp /etc/nginx/sites-enabled/your-site.conf <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/&#34;</span>\ncp /etc/nginx/funkwhale_proxy.conf <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/&#34;</span>\n</code></pre></div><h2 id=\"step-4-download-funkwhale-200-rc5\">Step 4: Download Funkwhale 2.0.0-rc5</h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">export FUNKWHALE_VERSION<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;2.0.0-rc5&#34;</span>\ncd /srv/funkwhale\n\n<span style=\"color:#75715e\"># Download API</span>\ncurl -L -o <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/download?job=build_api&#34;</span>\n\n<span style=\"color:#75715e\"># Download Frontend</span>\ncurl -L -o <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/download?job=build_front&#34;</span>\n</code></pre></div><h2 id=\"step-5-install-the-new-version\">Step 5: Install the New Version</h2>\n<h3 id=\"remove-old-files\">Remove Old Files</h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">rm -rf /srv/funkwhale/api/*\nrm -rf /srv/funkwhale/front/*\n</code></pre></div><h3 id=\"extract-new-files\">Extract New Files</h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">cd /srv/funkwhale\n\n<span style=\"color:#75715e\"># Extract API</span>\nunzip -q <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> -d extracted\nmv extracted/api/* api/\nrm -rf extracted <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span>\n\n<span style=\"color:#75715e\"># Extract Frontend</span>\nunzip -q <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> -d extracted\nmv extracted/front/* front/\nrm -rf extracted <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span>\n</code></pre></div><h3 id=\"create-new-python-virtual-environment\">Create New Python Virtual Environment</h3>\n<p>Funkwhale 2.0 uses <code>venv</code> instead of <code>virtualenv</code>:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">cd /srv/funkwhale\n\n<span style=\"color:#75715e\"># Remove old virtualenv (if upgrading from 1.x)</span>\nrm -rf virtualenv\n\n<span style=\"color:#75715e\"># Create new venv</span>\npython3 -m venv venv\nvenv/bin/pip install --upgrade pip wheel\n\n<span style=\"color:#75715e\"># Install Funkwhale API</span>\nvenv/bin/pip install --editable ./api\n\n<span style=\"color:#75715e\"># Set correct permissions</span>\nchown -R funkwhale:funkwhale api front venv\n</code></pre></div><h2 id=\"step-6-update-systemd-unit-files\">Step 6: Update Systemd Unit Files</h2>\n<p>The systemd unit files need to be updated to point to the new <code>venv</code> directory instead of <code>virtualenv</code>.</p>\n<p>You can download them from the repository:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">export FUNKWHALE_VERSION<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;2.0.0-rc5&#34;</span>\n\ncurl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale.target&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale.target&#34;</span>\ncurl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-server.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-server.service&#34;</span>\ncurl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-worker.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-worker.service&#34;</span>\ncurl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-beat.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-beat.service&#34;</span>\n\nsystemctl daemon-reload\n</code></pre></div><p><strong>Note:</strong> If the curl commands return HTML instead of the service files (404 errors), you may need to clone the repository and copy the files manually:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">git clone --branch 2.0.0-rc5 --depth <span style=\"color:#ae81ff\">1</span> https://dev.funkwhale.audio/funkwhale/funkwhale.git /tmp/funkwhale-2.0\ncp /tmp/funkwhale-2.0/deploy/funkwhale*.service /etc/systemd/system/\ncp /tmp/funkwhale-2.0/deploy/funkwhale.target /etc/systemd/system/\nsystemctl daemon-reload\n</code></pre></div><h2 id=\"step-7-update-nginx-configuration-optional\">Step 7: Update Nginx Configuration (Optional)</h2>\n<p>If you want to use the latest nginx configuration:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">curl -L -o /etc/nginx/funkwhale_proxy.conf <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>    <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale_proxy.conf&#34;</span>\n\nnginx -t <span style=\"color:#f92672\">&amp;&amp;</span> systemctl reload nginx\n</code></pre></div><h2 id=\"step-8-run-database-migrations\">Step 8: Run Database Migrations</h2>\n<p>This is the critical step that updates your database schema:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">cd /srv/funkwhale\n\n<span style=\"color:#75715e\"># Collect static files</span>\nsudo -u funkwhale venv/bin/funkwhale-manage collectstatic --no-input\n\n<span style=\"color:#75715e\"># Run migrations</span>\nsudo -u funkwhale venv/bin/funkwhale-manage migrate\n</code></pre></div><p>You should see output showing the migrations being applied, including:</p>\n<ul>\n<li><code>music.0001_initial</code> through various migrations</li>\n<li><code>playlists</code> migrations (new in 2.0)</li>\n<li><code>common</code> and <code>federation</code> updates</li>\n</ul>\n<h2 id=\"step-9-start-services\">Step 9: Start Services</h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl start funkwhale.target\n</code></pre></div><p>Wait a few seconds and verify everything is running:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl status funkwhale-server funkwhale-worker funkwhale-beat\n</code></pre></div><p>All three services should show <code>active (running)</code>.</p>\n<h2 id=\"step-10-verify-the-upgrade\">Step 10: Verify the Upgrade</h2>\n<p>Check that the API is responding:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">curl -s https://your-domain.com/api/v2/ | head -20\n</code></pre></div><p>You should see the API root response with version information.</p>\n<h2 id=\"troubleshooting\">Troubleshooting</h2>\n<h3 id=\"issue-ensurepip-is-not-available\">Issue: &ldquo;ensurepip is not available&rdquo;</h3>\n<p>If you see this error when creating the venv:</p>\n<pre tabindex=\"0\"><code>Error: Command '['/srv/funkwhale/venv/bin/python3', '-m', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.\n</code></pre><p><strong>Solution:</strong> Install the python3.11-venv package:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">apt install python3.11-venv\nrm -rf /srv/funkwhale/venv\npython3 -m venv /srv/funkwhale/venv\n</code></pre></div><h3 id=\"issue-celery-beat-fails-to-start\">Issue: Celery Beat Fails to Start</h3>\n<p>If funkwhale-beat keeps restarting with database errors:</p>\n<pre tabindex=\"0\"><code>_dbm.error: cannot add item to database\n</code></pre><p><strong>Solution:</strong> Remove the corrupted schedule database:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">rm /srv/funkwhale/api/celerybeat-schedule.db\nsystemctl restart funkwhale-beat\n</code></pre></div><h3 id=\"issue-systemd-unit-download-returns-html\">Issue: Systemd Unit Download Returns HTML</h3>\n<p>The GitLab raw file URLs sometimes don&rsquo;t work for tags. Clone the repo and copy manually (see Step 6).</p>\n<h3 id=\"issue-permission-errors\">Issue: Permission Errors</h3>\n<p>Always ensure the funkwhale user owns all files:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">chown -R funkwhale:funkwhale /srv/funkwhale/api /srv/funkwhale/front /srv/funkwhale/venv\n</code></pre></div><h2 id=\"rollback-procedure\">Rollback Procedure</h2>\n<p>If something goes seriously wrong, you can rollback:</p>\n<ol>\n<li>Stop services:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl stop funkwhale.target\n</code></pre></div></li>\n<li>Restore files from backup:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">BACKUP_DIR<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;/srv/funkwhale/backups/upgrade-YYYYMMDD_HHMMSS&#34;</span>\nrm -rf /srv/funkwhale/api /srv/funkwhale/front /srv/funkwhale/venv\ncp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/api&#34;</span> /srv/funkwhale/\ncp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/front&#34;</span> /srv/funkwhale/\ncp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span> /srv/funkwhale/\n</code></pre></div></li>\n<li>Restore systemd units:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">cp <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span>* /etc/systemd/system/\nsystemctl daemon-reload\n</code></pre></div></li>\n<li>Restore database (if needed):\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">sudo -u postgres psql &lt; /srv/funkwhale/backups/dump_DD-MM-YYYY_HH_MM_SS.sql\n</code></pre></div></li>\n<li>Start services:\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\">systemctl start funkwhale.target\n</code></pre></div></li>\n</ol>\n<h2 id=\"automated-upgrade-script\">Automated Upgrade Script</h2>\n<p>For convenience, I&rsquo;ve created a script that automates the entire process with rollback capability. You can find it below:</p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"color:#75715e\">#!/bin/bash\n</span><span style=\"color:#75715e\"></span><span style=\"color:#75715e\">#</span>\n<span style=\"color:#75715e\"># Funkwhale Upgrade Script: 1.4.0 -&gt; 2.0.0-rc5</span>\n<span style=\"color:#75715e\"># With rollback capability</span>\n<span style=\"color:#75715e\">#</span>\n<span style=\"color:#75715e\"># Usage: ./upgrade-funkwhale-2.0.sh [upgrade|rollback|status]</span>\n<span style=\"color:#75715e\">#</span>\n\nset -e\n\n<span style=\"color:#75715e\"># Configuration</span>\nFUNKWHALE_VERSION<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;2.0.0-rc5&#34;</span>\nFUNKWHALE_DIR<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;/srv/funkwhale&#34;</span>\nBACKUP_DIR<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;/srv/funkwhale/backups/upgrade-</span><span style=\"color:#66d9ef\">$(</span>date +%Y%m%d_%H%M%S<span style=\"color:#66d9ef\">)</span><span style=\"color:#e6db74\">&#34;</span>\nROLLBACK_MARKER<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#34;/srv/funkwhale/backups/.rollback_info&#34;</span>\n\n<span style=\"color:#75715e\"># Colors for output</span>\nRED<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#39;\\033[0;31m&#39;</span>\nGREEN<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#39;\\033[0;32m&#39;</span>\nYELLOW<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#39;\\033[1;33m&#39;</span>\nNC<span style=\"color:#f92672\">=</span><span style=\"color:#e6db74\">&#39;\\033[0m&#39;</span> <span style=\"color:#75715e\"># No Color</span>\n\nlog_info<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span> echo -e <span style=\"color:#e6db74\">&#34;</span><span style=\"color:#e6db74\">${</span>GREEN<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\">[INFO]</span><span style=\"color:#e6db74\">${</span>NC<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\"> </span>$1<span style=\"color:#e6db74\">&#34;</span>; <span style=\"color:#f92672\">}</span>\nlog_warn<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span> echo -e <span style=\"color:#e6db74\">&#34;</span><span style=\"color:#e6db74\">${</span>YELLOW<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\">[WARN]</span><span style=\"color:#e6db74\">${</span>NC<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\"> </span>$1<span style=\"color:#e6db74\">&#34;</span>; <span style=\"color:#f92672\">}</span>\nlog_error<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span> echo -e <span style=\"color:#e6db74\">&#34;</span><span style=\"color:#e6db74\">${</span>RED<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\">[ERROR]</span><span style=\"color:#e6db74\">${</span>NC<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\"> </span>$1<span style=\"color:#e6db74\">&#34;</span>; <span style=\"color:#f92672\">}</span>\n\ncheck_root<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    <span style=\"color:#66d9ef\">if</span> <span style=\"color:#f92672\">[[</span> $EUID -ne <span style=\"color:#ae81ff\">0</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        log_error <span style=\"color:#e6db74\">&#34;This script must be run as root&#34;</span>\n        exit <span style=\"color:#ae81ff\">1</span>\n    <span style=\"color:#66d9ef\">fi</span>\n<span style=\"color:#f92672\">}</span>\n\ncheck_services_stopped<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    <span style=\"color:#66d9ef\">if</span> systemctl is-active --quiet funkwhale-server.service; <span style=\"color:#66d9ef\">then</span>\n        log_error <span style=\"color:#e6db74\">&#34;Funkwhale services are still running. Stop them first with: systemctl stop funkwhale.target&#34;</span>\n        exit <span style=\"color:#ae81ff\">1</span>\n    <span style=\"color:#66d9ef\">fi</span>\n<span style=\"color:#f92672\">}</span>\n\nbackup_current<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Creating backup in </span>$BACKUP_DIR<span style=\"color:#e6db74\">...&#34;</span>\n    mkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up API...&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/api&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/api&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up frontend...&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/front&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/front&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up virtualenv...&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up config...&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/config&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/config&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up systemd units...&#34;</span>\n    mkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd&#34;</span>\n    cp /etc/systemd/system/funkwhale*.service <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span> 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n    cp /etc/systemd/system/funkwhale.target <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span> 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n\n    log_info <span style=\"color:#e6db74\">&#34;Backing up nginx config...&#34;</span>\n    mkdir -p <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx&#34;</span>\n    cp /etc/nginx/sites-enabled/*.conf <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/&#34;</span> 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n    cp /etc/nginx/funkwhale_proxy.conf <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/&#34;</span> 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n\n    <span style=\"color:#75715e\"># Save rollback info</span>\n    echo <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span> &gt; <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;BACKUP_DATE=</span><span style=\"color:#66d9ef\">$(</span>date<span style=\"color:#66d9ef\">)</span><span style=\"color:#e6db74\">&#34;</span> &gt;&gt; <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;OLD_VERSION=1.4.0&#34;</span> &gt;&gt; <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;NEW_VERSION=</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">&#34;</span> &gt;&gt; <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Backup complete: </span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\ndownload_new_version<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Downloading Funkwhale </span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">...&#34;</span>\n\n    cd <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Downloading API...&#34;</span>\n    curl -L -o <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/download?job=build_api&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Downloading Frontend...&#34;</span>\n    curl -L -o <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/-/jobs/artifacts/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/download?job=build_front&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Downloads complete&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\ninstall_new_version<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Installing Funkwhale </span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">...&#34;</span>\n\n    cd <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Removing old API and frontend...&#34;</span>\n    rm -rf api/* front/*\n\n    log_info <span style=\"color:#e6db74\">&#34;Extracting API...&#34;</span>\n    unzip -q <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> -d extracted\n    mv extracted/api/* api/\n    rm -rf extracted <span style=\"color:#e6db74\">&#34;api-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Extracting frontend...&#34;</span>\n    unzip -q <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span> -d extracted\n    rm -rf front/*\n    mv extracted/front/* front/\n    rm -rf extracted <span style=\"color:#e6db74\">&#34;front-</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">.zip&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Creating new Python virtual environment...&#34;</span>\n    rm -rf venv\n    python3 -m venv venv\n    venv/bin/pip install --upgrade pip wheel\n\n    log_info <span style=\"color:#e6db74\">&#34;Installing Funkwhale API package...&#34;</span>\n    venv/bin/pip install --editable ./api\n\n    chown -R funkwhale:funkwhale api front venv\n\n    log_info <span style=\"color:#e6db74\">&#34;Installation complete&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\nupdate_systemd_units<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Updating systemd unit files...&#34;</span>\n\n    curl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale.target&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale.target&#34;</span>\n    curl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-server.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-server.service&#34;</span>\n    curl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-worker.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-worker.service&#34;</span>\n    curl -L -o <span style=\"color:#e6db74\">&#34;/etc/systemd/system/funkwhale-beat.service&#34;</span> <span style=\"color:#ae81ff\">\\\n</span><span style=\"color:#ae81ff\"></span>        <span style=\"color:#e6db74\">&#34;https://dev.funkwhale.audio/funkwhale/funkwhale/raw/</span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">/deploy/funkwhale-beat.service&#34;</span>\n\n    systemctl daemon-reload\n    log_info <span style=\"color:#e6db74\">&#34;Systemd units updated&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\nrun_migrations<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Running database migrations...&#34;</span>\n\n    cd <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Collecting static files...&#34;</span>\n    sudo -u funkwhale venv/bin/funkwhale-manage collectstatic --no-input\n\n    log_info <span style=\"color:#e6db74\">&#34;Applying database migrations...&#34;</span>\n    sudo -u funkwhale venv/bin/funkwhale-manage migrate\n\n    log_info <span style=\"color:#e6db74\">&#34;Migrations complete&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\nstart_services<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Starting Funkwhale services...&#34;</span>\n    systemctl start funkwhale.target\n    systemctl reload nginx\n\n    sleep <span style=\"color:#ae81ff\">5</span>\n\n    <span style=\"color:#66d9ef\">if</span> systemctl is-active --quiet funkwhale-server.service; <span style=\"color:#66d9ef\">then</span>\n        log_info <span style=\"color:#e6db74\">&#34;Funkwhale services started successfully!&#34;</span>\n    <span style=\"color:#66d9ef\">else</span>\n        log_error <span style=\"color:#e6db74\">&#34;Services failed to start. Check logs with: journalctl -u funkwhale-server.service&#34;</span>\n        exit <span style=\"color:#ae81ff\">1</span>\n    <span style=\"color:#66d9ef\">fi</span>\n<span style=\"color:#f92672\">}</span>\n\ndo_upgrade<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Starting Funkwhale upgrade to </span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">&#34;</span>\n    log_warn <span style=\"color:#e6db74\">&#34;Make sure you have a database backup before proceeding!&#34;</span>\n\n    check_root\n    check_services_stopped\n\n    backup_current\n    download_new_version\n    install_new_version\n    update_systemd_units\n    run_migrations\n    start_services\n\n    log_info <span style=\"color:#e6db74\">&#34;==========================================&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;Upgrade complete!&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;Funkwhale </span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\"> is now running&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;==========================================&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;If something goes wrong, run: </span>$0<span style=\"color:#e6db74\"> rollback&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\ndo_rollback<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    log_info <span style=\"color:#e6db74\">&#34;Starting rollback...&#34;</span>\n\n    check_root\n\n    <span style=\"color:#66d9ef\">if</span> <span style=\"color:#f92672\">[[</span> ! -f <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        log_error <span style=\"color:#e6db74\">&#34;No rollback information found. Cannot rollback.&#34;</span>\n        exit <span style=\"color:#ae81ff\">1</span>\n    <span style=\"color:#66d9ef\">fi</span>\n\n    BACKUP_DIR<span style=\"color:#f92672\">=</span><span style=\"color:#66d9ef\">$(</span>head -1 <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span><span style=\"color:#66d9ef\">)</span>\n\n    <span style=\"color:#66d9ef\">if</span> <span style=\"color:#f92672\">[[</span> ! -d <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        log_error <span style=\"color:#e6db74\">&#34;Backup directory not found: </span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span>\n        exit <span style=\"color:#ae81ff\">1</span>\n    <span style=\"color:#66d9ef\">fi</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Rolling back from backup: </span>$BACKUP_DIR<span style=\"color:#e6db74\">&#34;</span>\n\n    systemctl stop funkwhale.target 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n\n    log_info <span style=\"color:#e6db74\">&#34;Restoring API...&#34;</span>\n    rm -rf <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/api&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/api&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/api&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Restoring frontend...&#34;</span>\n    rm -rf <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/front&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/front&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/front&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Restoring virtualenv...&#34;</span>\n    rm -rf <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/venv&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span>\n    cp -a <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span> <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span>\n\n    log_info <span style=\"color:#e6db74\">&#34;Restoring systemd units...&#34;</span>\n    cp <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/systemd/&#34;</span>* /etc/systemd/system/\n    systemctl daemon-reload\n\n    log_info <span style=\"color:#e6db74\">&#34;Restoring nginx config...&#34;</span>\n    cp <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/&#34;</span>* /etc/nginx/sites-enabled/ 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n    cp <span style=\"color:#e6db74\">&#34;</span>$BACKUP_DIR<span style=\"color:#e6db74\">/nginx/funkwhale_proxy.conf&#34;</span> /etc/nginx/ 2&gt;/dev/null <span style=\"color:#f92672\">||</span> true\n\n    log_warn <span style=\"color:#e6db74\">&#34;NOTE: Database was NOT rolled back automatically.&#34;</span>\n    log_warn <span style=\"color:#e6db74\">&#34;To restore database, run:&#34;</span>\n    log_warn <span style=\"color:#e6db74\">&#34;  sudo -u postgres psql &lt; /srv/funkwhale/backups/dump_*.sql&#34;</span>\n\n    systemctl start funkwhale.target\n    systemctl reload nginx\n\n    log_info <span style=\"color:#e6db74\">&#34;==========================================&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;Rollback complete!&#34;</span>\n    log_info <span style=\"color:#e6db74\">&#34;==========================================&#34;</span>\n<span style=\"color:#f92672\">}</span>\n\nshow_status<span style=\"color:#f92672\">()</span> <span style=\"color:#f92672\">{</span>\n    echo <span style=\"color:#e6db74\">&#34;Current Funkwhale installation:&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;================================&#34;</span>\n\n    <span style=\"color:#66d9ef\">if</span> <span style=\"color:#f92672\">[[</span> -d <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/venv&#34;</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        echo <span style=\"color:#e6db74\">&#34;Virtual env: venv (2.0 style)&#34;</span>\n        VERSION<span style=\"color:#f92672\">=</span><span style=\"color:#66d9ef\">$(</span><span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/venv/bin/pip&#34;</span> show funkwhale-api 2&gt;/dev/null | grep Version | awk <span style=\"color:#e6db74\">&#39;{print $2}&#39;</span><span style=\"color:#66d9ef\">)</span>\n    <span style=\"color:#66d9ef\">elif</span> <span style=\"color:#f92672\">[[</span> -d <span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/virtualenv&#34;</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        echo <span style=\"color:#e6db74\">&#34;Virtual env: virtualenv (1.x style)&#34;</span>\n        VERSION<span style=\"color:#f92672\">=</span><span style=\"color:#66d9ef\">$(</span><span style=\"color:#e6db74\">&#34;</span>$FUNKWHALE_DIR<span style=\"color:#e6db74\">/virtualenv/bin/pip&#34;</span> show funkwhale-api 2&gt;/dev/null | grep Version | awk <span style=\"color:#e6db74\">&#39;{print $2}&#39;</span><span style=\"color:#66d9ef\">)</span>\n    <span style=\"color:#66d9ef\">fi</span>\n\n    echo <span style=\"color:#e6db74\">&#34;Installed version: </span><span style=\"color:#e6db74\">${</span>VERSION<span style=\"color:#66d9ef\">:-</span>unknown<span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\">&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n    echo <span style=\"color:#e6db74\">&#34;Service status:&#34;</span>\n    systemctl status funkwhale.target --no-pager 2&gt;/dev/null <span style=\"color:#f92672\">||</span> echo <span style=\"color:#e6db74\">&#34;  Not running&#34;</span>\n\n    <span style=\"color:#66d9ef\">if</span> <span style=\"color:#f92672\">[[</span> -f <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span> <span style=\"color:#f92672\">]]</span>; <span style=\"color:#66d9ef\">then</span>\n        echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;Rollback available:&#34;</span>\n        cat <span style=\"color:#e6db74\">&#34;</span>$ROLLBACK_MARKER<span style=\"color:#e6db74\">&#34;</span>\n    <span style=\"color:#66d9ef\">fi</span>\n<span style=\"color:#f92672\">}</span>\n\n<span style=\"color:#75715e\"># Main</span>\n<span style=\"color:#66d9ef\">case</span> <span style=\"color:#e6db74\">&#34;</span><span style=\"color:#e6db74\">${</span>1<span style=\"color:#66d9ef\">:-</span><span style=\"color:#e6db74\">}</span><span style=\"color:#e6db74\">&#34;</span> in\n    upgrade<span style=\"color:#f92672\">)</span>\n        do_upgrade\n        ;;\n    rollback<span style=\"color:#f92672\">)</span>\n        do_rollback\n        ;;\n    status<span style=\"color:#f92672\">)</span>\n        show_status\n        ;;\n    *<span style=\"color:#f92672\">)</span>\n        echo <span style=\"color:#e6db74\">&#34;Funkwhale Upgrade Script&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;========================&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;Usage: </span>$0<span style=\"color:#e6db74\"> [command]&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;Commands:&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  upgrade   - Upgrade Funkwhale to </span>$FUNKWHALE_VERSION<span style=\"color:#e6db74\">&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  rollback  - Rollback to previous version&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  status    - Show current installation status&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;Before upgrading:&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  1. Ensure database is backed up&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  2. Ensure media files are backed up&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;  3. Stop services: systemctl stop funkwhale.target&#34;</span>\n        echo <span style=\"color:#e6db74\">&#34;&#34;</span>\n        ;;\n<span style=\"color:#66d9ef\">esac</span>\n</code></pre></div><p>Save this as <code>upgrade-funkwhale-2.0.sh</code>, make it executable with <code>chmod +x upgrade-funkwhale-2.0.sh</code>, and run with <code>sudo ./upgrade-funkwhale-2.0.sh upgrade</code>.</p>\n<h2 id=\"conclusion\">Conclusion</h2>\n<p>The upgrade from Funkwhale 1.4.0 to 2.0.0-rc5 went smoothly once I resolved the Python venv package issue and worked around the systemd unit file download problem. The database migrations ran without issues, and all my music library was preserved (now organized under the new playlist system instead of libraries).</p>\n<p>If you encounter any issues not covered here, check the <a href=\"https://docs.funkwhale.audio/\">Funkwhale documentation</a> or join the community on Matrix/IRC for help.</p>\n<hr>\n<p><em>Last updated: December 2025</em></p>\n",
				"summary": "Upgrading from Funkwhale 1.4.0 to 2.0.0-rc5 on a Debian 12 server involves several steps, including creating backups, installing the new version, updating configurations, and running database migrations.",
				"date_published": "2025-12-29T17:48:24+01:00",
				"url": "https://blog.rmendes.net/2025/12/29/upgrading-funkwhale-from-to-rc.html",
				"tags": ["Tech","Audio","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/14/information-manipulation-is-a-market.html",
				
				"content_html": "<p>Information Manipulation is a market.</p>\n<p><a href=\"https://www.cam.ac.uk/stories/price-bot-army-global-index\">www.cam.ac.uk/stories/p&hellip;</a></p>\n",
				
				"date_published": "2025-12-14T10:55:00+01:00",
				"url": "https://blog.rmendes.net/2025/12/14/information-manipulation-is-a-market.html",
				"tags": ["Tech","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/10/do-you-like-to-develop.html",
				
				"content_html": "<p>do you like to develop on #android and <a href=\"https://github.com/sam1am/anyapk\">sideload</a> your APK freely on devices you own?</p>\n",
				
				"date_published": "2025-12-10T18:43:15+01:00",
				"url": "https://blog.rmendes.net/2025/12/10/do-you-like-to-develop.html",
				"tags": ["Tech","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/10/this-is-really-funny-futuristic.html",
				
				"content_html": "<p>This is really <a href=\"https://news.ycombinator.com/item?id=46205632\">funny</a> futuristic HN frontpage post reach HN frontpage and delivers gold satire 😅</p>\n",
				
				"date_published": "2025-12-10T18:40:36+01:00",
				"url": "https://blog.rmendes.net/2025/12/10/this-is-really-funny-futuristic.html",
				"tags": ["Tech","AI","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/12/02/photo-prs-de-mon-nouveau.html",
				
				"content_html": "<p>Photo près de mon nouveau chez moi l&rsquo;autre jour en allant au boulot.. c&rsquo;est fou que pendant des décennies l&rsquo;horrible building de la gare du Nord cachait cette beauté dans le paysage nord de Bruxelles.</p>\n<img src=\"https://blog.rmendes.net/uploads/2025/64f19c3e00.jpg\" width=\"451\" height=\"600\" alt=\"A domed building is framed by two tall structures and silhouetted trees under a warm, glowing sky.\">\n",
				
				"date_published": "2025-12-02T21:05:47+01:00",
				"url": "https://blog.rmendes.net/2025/12/02/photo-prs-de-mon-nouveau.html",
				"tags": ["Photos","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/11/24/damn-the-new-cloudron-ui.html",
				
				"content_html": "<p>Damn.. the new #Cloudron UI revamp is sick 😲 loving it! <a href=\"https://cloudron.io\">cloudron.io</a></p>\n",
				
				"date_published": "2025-11-24T21:49:35+01:00",
				"url": "https://blog.rmendes.net/2025/11/24/damn-the-new-cloudron-ui.html",
				"tags": ["Tech","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/10/14/can-you-even-imagine-if.html",
				"title": "Can you even imagine, if #Carlin was still alive, under #Trump ? ",
				"content_html": "<p>it wouldn&rsquo;t be roasting, perhaps Trump wouldn&rsquo;t even be elected in the first place.</p>\n<p>I feel like even the <a href=\"https://youtu.be/gRNeroeULyo?si=D6o9ou7AKAHQbHT9\">best</a> comedians, commentators and opinionated individuals out there, all those not losing their north star, would greatly appreciate it if anything remotely as close to Carlin was alive today and dismantling whatever is the ongoing political/economic cast in power (not just in the USA)</p>\n",
				
				"date_published": "2025-10-14T20:14:17+01:00",
				"url": "https://blog.rmendes.net/2025/10/14/can-you-even-imagine-if.html",
				"tags": ["Videos","Politics","indieweb","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/10/12/link-the-chinese-firewall-technology.html",
				"title": "[Link] The Chinese Firewall Technology That Every Western Company Now Uses“",
				"content_html": "<p>“A senior security engineer at a major European bank recently told me (off the record, obviously) that their “next-generation threat detection system” was producing better results than anything they’d used before. Only later did they discover that the core algorithms were developed by a Chinese company with close ties to government surveillance programs.“</p>\n<p><a href=\"https://medium.com/@sohail_saifii/the-chinese-firewall-technology-that-every-western-company-now-uses-4d8b249a59a7\">Read more</a></p>\n",
				
				"date_published": "2025-10-12T18:14:04+01:00",
				"url": "https://blog.rmendes.net/2025/10/12/link-the-chinese-firewall-technology.html",
				"tags": ["Tech","Politics","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/25/assine-a-petio-para-libertar.html",
				
				"content_html": "<p>Assine a <a href=\"https://petitions.protecthumanitarians.org/en/petitions/1-free-joseph-figueira-martin-humanitarian-arbitrarily-detained-and-tortured-in-the-central-african-republic\">Petição</a> para libertar Joseph Figueira Martin</p>\n<p>Em 26 de maio de 2024, Joseph Figueira Martin, um humanitário belga-português, foi preso em Zémio, uma cidade no leste da República Centro-Africana.</p>\n<p>Bélgica e Portugal têm que tomar ação!</p>\n<p>#Wagner</p>\n",
				
				"date_published": "2025-09-25T20:58:29+01:00",
				"url": "https://blog.rmendes.net/2025/09/25/assine-a-petio-para-libertar.html",
				"tags": ["Politique","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/25/sign-the-petition-to-free.html",
				
				"content_html": "<p>Sign The <a href=\"https://petitions.protecthumanitarians.org/en/petitions/1-free-joseph-figueira-martin-humanitarian-arbitrarily-detained-and-tortured-in-the-central-african-republic\">Petition</a> to free Joseph Figueira Martin</p>\n<p>On 26 May 2024, Joseph Figueira Martin, a Belgian-Portuguese humanitarian, was arrested in Zémio, a town in the east of the Central African Republic.</p>\n<p>Portugal and Belgium must act!</p>\n",
				
				"date_published": "2025-09-25T20:56:18+01:00",
				"url": "https://blog.rmendes.net/2025/09/25/sign-the-petition-to-free.html",
				"tags": ["Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/23/le-comble-de-notre-poque.html",
				"title": "Le comble de notre époque c'est le mirage de l'immigration ",
				"content_html": "<p>Le comble de notre époque : après des décennies de perte de souveraineté économique, financière et technologique, l’Europe, les États-Unis et d’autres puissances prétendent la « récupérer » en fermant leurs frontières. Mais pas aux marchandises, pas au capital, pas aux dérives financières, ni à l’exode fiscal des 1 %.</p>\n<p>Non, c’est sur les corps que se concentre la répression. On en vient à parquer des êtres humains dans des conditions inhumaines, pour satisfaire des rhétoriques d’extrême droite devenues banales, présentées comme des vérités canoniques.</p>\n<p>Monstrueuses vérités qui masquent l’éléphant rose au milieu du magasin de porcelaine : un capitalisme débridé, responsable premier de la misère de masse et de la dégradation des systèmes sociaux.</p>\n<p>Voilà la véritable cause de l’anxiété généralisée, qui comme toujours finit par se retourner contre les plus vulnérables.</p>\n",
				
				"date_published": "2025-09-23T22:54:32+01:00",
				"url": "https://blog.rmendes.net/2025/09/23/le-comble-de-notre-poque.html",
				"tags": ["Thoughts","Politique","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/23/the-groyper-wars-the-seriousness.html",
				
				"content_html": "<p>The Groyper Wars\nThe seriousness of this story is rivaled only by its dizzying stupidity.</p>\n<p><a href=\"https://www.webworm.co/groyperwars/\">www.webworm.co/groyperwa&hellip;</a></p>\n",
				
				"date_published": "2025-09-23T22:52:33+01:00",
				"url": "https://blog.rmendes.net/2025/09/23/the-groyper-wars-the-seriousness.html",
				"tags": ["Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/18/ever-needed-to-duplicate-a.html",
				
				"content_html": "<p>Ever needed to duplicate a #keycloak realm.json, change a few values and re-import into the same keycloak ?\nthis is a <a href=\"https://github.com/rmdes/realm-duplicator-keycloak\">Keycloak</a> realm rekeying utility, safe UUID regeneration and alias normalization to avoid duplicate constraints during import</p>\n",
				
				"date_published": "2025-09-18T10:46:09+01:00",
				"url": "https://blog.rmendes.net/2025/09/18/ever-needed-to-duplicate-a.html",
				"tags": ["Coding","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/15/on-maga-factions-and-the.html",
				
				"content_html": "<p>On MAGA factions and the meme wars of 2025 and beyond :</p>\n<p>This is a PHD/level <a href=\"https://vm.tiktok.com/ZGdaytfdH/\">breakdown</a> of the two alt-right movements set out to destroy each other and the rest of the USA in the process. The creator is Cy Canterel.</p>\n<p>On my <a href=\"https://open.substack.com/pub/cybelecanterel/p/lost-in-the-kingdom-of-kitsch\">reading list</a> : Lost in the Kingdom of Kitsch</p>\n",
				
				"date_published": "2025-09-15T20:20:28+01:00",
				"url": "https://blog.rmendes.net/2025/09/15/on-maga-factions-and-the.html",
				"tags": ["Tech","News","Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/13/chris-hedge-on-kirk-death.html",
				
				"content_html": "<p>Chris Hedge on Kirk death &ldquo;Martyrs are the lifeblood of violent movements. Any flinching over the use of violence, any talk of compassion or understanding, any effort to mediate or discuss, is a betrayal of the martyr and the cause the martyr died defending.&rdquo;</p>\n<p><a href=\"https://scheerpost.com/2025/09/12/chris-hedges-the-martyrdom-of-charlie-kirk/\">Read Full Article</a></p>\n",
				
				"date_published": "2025-09-13T10:01:51+01:00",
				"url": "https://blog.rmendes.net/2025/09/13/chris-hedge-on-kirk-death.html",
				"tags": ["Social","Politics","Microposts"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/13/la-belgique-doit-agir-pour.html",
				"title": "La Belgique doit agir pour ne pas laisser brûler les droits des femmes",
				"content_html": "<p>Aux États-Unis, l’administration Trump a marqué un tournant idéologique majeur. Sous couvert de réformes et de moralité, elle a mené une véritable offensive contre l’autonomie des femmes: remise en cause du droit à l’avortement, pressions sur les financements de la santé reproductive, et obstacles à l’accès aux contraceptifs.</p>\n<p>La destruction programmée de stocks entiers de contraceptifs (sur le sol belge) encore parfaitement utilisables ne peut se lire autrement que comme un geste idéologique politique.</p>\n<p>C’est l’incarnation d’une logique &ldquo;talibanesque&rdquo; patriarcale qui préfère incinérer des moyens de liberté plutôt que de permettre aux femmes de décider pour elles-mêmes.</p>\n<p>En Belgique, notre cadre légal et éthique est aux antipodes de cette vision.</p>\n<p>La destruction de médicaments et de produits de santé encore conformes y est interdite, car ils représentent une ressource précieuse qu’il faut redistribuer plutôt que gaspiller.</p>\n<p>Cette approche traduit un choix de société: protéger la santé publique, lutter contre le gaspillage, et surtout garantir que les droits des femmes ne soient pas sacrifiés sur l’autel d’idéologies rétrogrades.</p>\n<p>C’est pourquoi il faut appeler la Belgique à agir: à se lever contre cette politique américaine destructrice et, si nécessaire, à racheter ce stock pour le mettre au service de programmes humanitaires.</p>\n<p>Chaque dose redistribuée est une victoire contre l’obscurantisme, et un pas de plus vers l’égalité et la dignité des femmes dans le monde.</p>\n",
				
				"date_published": "2025-09-13T09:56:56+01:00",
				"url": "https://blog.rmendes.net/2025/09/13/la-belgique-doit-agir-pour.html",
				"tags": ["Thoughts","Politique","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/11/from-distrust-to-retribution-americas.html",
				"title": "From Distrust to Retribution: America’s Escalating Spiral ",
				"content_html": "<p>The core problem in the 🇺🇸 right now is trust in information, democracy, institutions.</p>\n<p>Whatever is put forward, whether a “manifesto,” “killer’s note,” or shooting suspect’s story, no matter what the authorities claim, the public has come to believe that it’s all manipulated.</p>\n<p>That distrust is being weaponized by the alt-right / MAGA crowd, and it won’t be long before they demand retribution, for real or imagined.</p>\n<p>Because the current administration is seen as deeply biased, compromised, even complicit by many, every statement, every slip, every omission becomes fuel. Whether intentional or not, its behavior and rhetoric will stoke the flames and lead to real retribution.</p>\n<p>There’s only one way to halt this descent: the people, those not yet indoctrinated, those still able to think beyond rage, must step forward.</p>\n<p>Those sections of society that are not caught up in fear, indoctrination and fury need to raise clear, honest voices. Without that, with a death like Charlie Kirk’s hanging over everything, we’re not just witnessing a case: we’re seeing a tipping point.</p>\n",
				
				"date_published": "2025-09-11T19:18:07+01:00",
				"url": "https://blog.rmendes.net/2025/09/11/from-distrust-to-retribution-americas.html",
				"tags": ["Thoughts","Politics","Longform"]
			},
			{
				"id": "http://rmdes.micro.blog/2025/09/11/face-aux-horreurs-du-monde.html",
				"title": "Face aux horreurs du monde, tenir debout",
				"content_html": "<p>Avec toute l’horreur qui se déroule sous nos yeux éblouis par la lumière bleue de nos écrans, j’ai parfois l’impression que le 11 septembre n’a plus aucune importance. Comme si, face au génocide à Gaza, à la guerre perpétuelle en Ukraine et aux conflits oubliés qui ensanglantent d’autres continents, la tragédie d’il y a vingt-quatre ans n’était plus qu’un fait divers. Pourtant, c’est elle qui a propulsé le monde dans une dérive dont nous ressentons encore les secousses.</p>\n<p>Mais les horreurs ne s’effacent pas les unes les autres. Elles s’empilent, elles se superposent. Pour celles et ceux qui les subissent, il n’y a pas de hiérarchie. Une guerre, un exil, un génocide, une agression, ou une bataille juridique contre une secte qui a brisé des vies : à chaque fois, c’est un monde qui s’écroule, c’est une violence qui impose son poids total. De l’extérieur, on compare. De l’intérieur, on survit.</p>\n<p>C’est ce que nous vivons avec Chardons Bleus. Alors que les horreurs du monde se déroulent en direct, nous affrontons depuis des années une autre forme d’horreur, moins visible, mais pas moins dévastatrice. Des procédures judiciaires interminables, des souvenirs qui resurgissent au détour d’une audience, des victimes qui portent encore les stigmates d’une enfance volée. À l’échelle du monde, cela paraît dérisoire. À l’échelle de nos vies, cela est absolu.</p>\n<p>Chaque drame collectif ou intime vient recouvrir le précédent sans jamais l’effacer. L’histoire mondiale et l’histoire personnelle se croisent, se répondent, parfois se confondent. Et ce qui reste, c’est cette impression de vivre dans un palimpseste de douleurs et de luttes, où chaque nouvelle couche ne détruit pas l’ancienne mais la rend plus difficile à porter.</p>\n<p>Et pourtant, dans ce chaos, quelque chose résiste. À travers chaque combat, chaque témoignage, chaque geste de solidarité, une lumière persiste, fragile mais tenace. Elle n’efface pas l’horreur, mais elle empêche qu’elle soit totale. C’est cette lumière qui nous relie, qui nous maintient debout, et qui nous rappelle que même au cœur de la nuit, il reste toujours une part de jour à reconquérir.</p>\n<p>c&rsquo;est la résilience qui nous maintient debout, et qui affirme que malgré l’horreur, nous pouvons encore choisir la justice, la solidarité et la vie.</p>\n",
				
				"date_published": "2025-09-11T18:27:25+01:00",
				"url": "https://blog.rmendes.net/2025/09/11/face-aux-horreurs-du-monde.html",
				"tags": ["Thoughts","Longform"]
			}
	]
}
