Ángel
@angel@triptico.com
Location: 40.4235492,-3.6617828
101 following, 198 followers
El microrrelato:
#FollowFriday yea i know it's thursday or whatever
What a piece of technology this snac is.
"When you can buy your way out of any mistake, when you can fire anyone who disagrees with you, when your social circle consists entirely of people who need something from you, the basic mechanism by which humans learn that other people are real goes dark."
Tal día como hoy, en 1865, nacía en Brooklyn Robert William Chambers. Para recordarle a él y a su maravilloso ciclo de El Rey de Amarillo, os proponemos nuestra versión de uno de los relatos que lo componen.
«En la corte del dragón», de Robert W. Chambers
https://go.ivoox.com/rf/85510314
(* Por cierto, para nuestro bochorno, hay una error en la lectura del relato. como os daréis cuenta fácilmente: es "púlpito", no "pálpito". Nuestras disculpas... 😓 *)
https://my-notes.dragas.net/2026/05/22/my-city/
#MyNotes #Life #Memories #Reflections #People #Change #Friendship #LifeLessons
No se lo digas de Santiago Eximeno
Una pequeña joya narrativa de horror sobrenatural.
Del autor me han dicho que a veces se pone explícito así que puede que de esta me cierren el canal... No os lo perdáis!! 😂
For some reason, I used to read "Meanwhile" as "Menaville"Menaville being a non-existent place in a virtual world is an incredibly beautiful concept
"The literal meaning of life is whatever you're doing that prevents you from killing yourself."-- Albert Camus
the rubber wrapped around
a thousand miles
of hair thin lines
in the back, there and outside
on heads with one too many eyes
there, back and way out
#unix_surrealism #tarot #occult #comic #foss #computers #sun #ibm #triapul
When I wrote about FediMeteo (https://it-notes.dragas.net/2025/02/26/fedimeteo-how-a-tiny-freebsd-vps-became-a-global-weather-service-for-thousands/) for the first time, I told the story from the beginning: the idea born almost by chance while checking the weather for a holiday, the memory of my grandfather, who for years had been my personal meteorologist, the decision to build something small and useful, and then the surprise of seeing people actually use it. What began as a personal experiment quickly became a small global service, still running with the same philosophy: FreeBSD, jails, simple scripts, snac, text, emoji, and a lot of small pieces doing their work quietly.
That article was mostly about the birth and growth of the project. This one is about one of the less romantic parts of the same story, although I have to admit that I find a certain beauty in it too: keeping the service light as it grows.
FediMeteo (https://fedimeteo.com) is still intentionally simple from the outside. A homepage, some numbers, a list of countries, and many ActivityPub accounts publishing weather forecasts. The posts are text and emoji. There is no JavaScript requirement to read the pages, no heavy frontend, no unnecessary media attached to every forecast, and no dynamic homepage recalculated at every visit just to show the same numbers. This is not accidental. It is the way I wanted the service to behave from the beginning.
But the more the service is used, the more the small details matter. A request that looks harmless when there are ten followers may become a repeated request when there are thousands of followers, remote instances, crawlers, previews, and other servers fetching the same public objects. In the Fediverse, the same small thing can be asked many times by many different places, each one with a perfectly legitimate reason. The backend doesn't care: it just needs to deal with the requests.
And in FediMeteo, the backend is snac (https://codeberg.org/grunfink/snac2).
I like snac very much precisely because it is small, clear, and efficient. It is not a giant application that tries to be everything. It does a focused job and does it well. But this also means that I want to respect its shape. I do not want to waste its threads on work that the reverse proxy can safely do. A snac thread serving the same public avatar again and again is not a tragedy, but it is still a waste. A snac thread answering the same public ActivityPub object several times in the same minute is doing real work, but often not necessary work.
This is the reason behind the HAProxy (https://www.haproxy.org) tuning I am currently using in front of FediMeteo.
It is not about making the configuration look clever. It is about keeping snac quiet.
This is especially important because snac uses a limited number of threads. I like that. Limits are healthy. They force us to understand what the service is doing, and they prevent a small program from pretending to be an infinite resource. But limits also make waste visible. If a few threads are busy serving files that could have been served from cache, those threads are not available for something more useful.
With FediMeteo the implementation is different because the reverse proxy is HAProxy, but the reasoning is the same. I have many small snac instances, each one in its own FreeBSD (Bastille (https://github.com/BastilleBSD/bastille)) jail, and one public entry point that has to route, terminate TLS, compress, cache, and generally remove as much repetitive work as possible from the backends.
This is, in a way, the natural continuation of the original FediMeteo design. In the first article I wrote that I wanted to manage everything according to the Unix philosophy: small pieces working together. This is another piece of that same puzzle. HAProxy does the edge work. snac does the ActivityPub work. Scripts generate forecasts. cron launches updates. ZFS gives me snapshots. FreeBSD jails keep countries separated. Nothing is particularly heroic by itself, but the whole system becomes pleasant because each part has a clear responsibility.
FediMeteo does not use media in its forecasts.
No images attached to the posts, no generated weather cards, no maps for each city, no decorative banners. The forecasts are text and emoji. This was a deliberate decision. Weather information does not become more useful just because it is put inside an image, and every media file used by the service would become something to store, serve, cache, federate, expire, back up, and occasionally debug.
Text and emoji are enough. They are accessible, light, readable in text browsers, friendly to timelines, and understandable even when someone does not know the local language perfectly. This was one of the original design principles of FediMeteo, and it also helps the infrastructure. Less media means less work, fewer cache entries, fewer repeated fetches, fewer surprises.
There is one exception: the avatar.
All FediMeteo accounts use the same avatar, and this is also intentional. I could have used a different avatar for each country, or for each city, or created something visually richer. It would have been nicer in some screenshots, perhaps. It would also have been operationally worse.
With one shared avatar, the reverse proxy has one very useful object to cache. It is public, identical for everyone, small, requested often, and therefore almost always hot in cache. HAProxy can serve it directly instead of asking each snac instance to return the same file. Since avatars are requested by remote instances, browsers, profile previews, and all sorts of federation-related fetches, this single decision removes a surprising amount of pointless backend traffic.
So the avatar is not only a visual identity. It is part of the architecture.
This is the kind of optimization I like most, because it starts before the software. It starts with deciding not to create a problem.
It is a static HTML page generated from a template. Once per hour, a cron script updates the numbers and statistics. It counts the data I want to show, regenerates the page, and then the page remains static until the next run.
This is not because I cannot make a dynamic page. It is because I do not need one. Boring is good.
The homepage does not need to query all the country instances on every visit. It does not need a database request for each user who opens it. It does not need to ask snac anything in real time. The numbers are useful, but they do not need to be updated every second. Once per hour is enough, and it also fits the spirit of the whole project: do the work when it is needed, then serve the result cheaply.
I have seen too many small services become heavy because the first implementation was convenient rather than appropriate. A cron job and a template are not fashionable, but they are often exactly what a page like this needs.
fedimeteo.comAnd many more.
www.fedimeteo.com
it.fedimeteo.com
uk.fedimeteo.com
jp.fedimeteo.com
us.fedimeteo.com
usa.fedimeteo.com
can.fedimeteo.com
canada.fedimeteo.com
At the beginning, it is always tempting to write one ACL after another in the HAProxy frontend. It is quick, it is explicit, and for five hostnames it is perfectly fine. But FediMeteo did not remain at five hostnames. As countries and aliases grew, a long chain of ACLs would have turned the frontend into a list of names instead of a description of how the proxy behaves.
So I moved the hostname to backend mapping into a map file:
fedimeteo.com backend_fedimeteoThe frontend then needs only one rule:
www.fedimeteo.com backend_fedimeteo
it.fedimeteo.com backend_it
uk.fedimeteo.com backend_uk
jp.fedimeteo.com backend_jp
us.fedimeteo.com backend_us
usa.fedimeteo.com backend_us
can.fedimeteo.com backend_ca
canada.fedimeteo.com backend_ca
use_backend %[req.hdr(host),field(1,:),lower,map(/usr/local/etc/fedimeteo.map,backend_fedimeteo)]This reads the
Host header, removes the port if present, lowercases the result, and looks it up in /usr/local/etc/fedimeteo.map. If nothing matches, it falls back to the main FediMeteo backend.I like this because it keeps the configuration honest. The frontend contains the policy. The map contains the data. Adding a country means adding an entry to the map and defining a backend. I do not need to make the frontend more complicated every time the service grows.
backend backend_itOne backend, one jail, one snac instance. This is exactly the same organizational principle as the rest of the project. If I need to reason about Italy, I look at the Italian jail. If I need to reason about the United Kingdom, I look at the UK jail. If one day I need to move a country elsewhere, the separation is already there.
mode http
http-reuse safe
server srv1 10.0.0.2:8001 maxconn 30backend backend_uk
mode http
http-reuse safe
server srv1 10.0.0.7:8001 maxconn 30backend backend_jp
mode http
http-reuse safe
server srv1 10.0.0.32:8001 maxconn 30
The maxconn 30 value is not a magic number. It is a ceiling. I want each small backend to have a visible limit in front of it. If something starts hammering a country instance, I prefer the pressure to appear at the HAProxy layer instead of becoming unlimited concurrent work inside snac.
http-reuse safe lets HAProxy reuse backend connections where appropriate. This is another small reduction in unnecessary work. Opening connections repeatedly is not the biggest problem in the world, but avoiding it is still better, especially when many small services sit behind the same proxy.
frontend https_inTLS defaults are set globally:
bind :::443 v4v6 ssl crt /usr/local/etc/certs/ alpn h2,http/1.1
mode http
option http-keep-alive
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256Port 80 only redirects to HTTPS, except for Let's Encrypt challenges:
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
acl letsencrypt-acl path_beg /.well-known/acme-challenge/In the HTTPS frontend I also set the usual forwarding headers:
http-request redirect scheme https code 301 unless letsencrypt-acl
use_backend letsencrypt-backend if letsencrypt-acl
http-request set-header X-Real-IP %[src]And I add HSTS:
http-request set-header X-Forwarded-Proto https
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"None of this is unusual, and that is fine. The interesting parts of an infrastructure are not always the parts that should be unusual.
cache mediacacheI keep media and ActivityPub JSON separate because they are not the same kind of traffic.
total-max-size 128
max-object-size 10000000
max-age 3600
process-vary on
max-secondary-entries 12cache jsoncache
total-max-size 16
max-object-size 1000000
max-age 60
process-vary on
max-secondary-entries 12
The media cache is larger and has a longer maximum age. In FediMeteo, this mostly means the shared avatar and a few static-looking objects. Since there is intentionally almost no media, the important cached object is requested very often and remains warm.
The JSON cache is smaller and short-lived. It is there for public ActivityPub GET requests, not to store federation state forever. A 60 second cache is enough to collapse many repeated requests that arrive close together in time, without pretending that ActivityPub responses should be treated like immutable files.
This distinction is important. Caching is not one decision. It is a set of small decisions about what a response means, who can see it, how often it changes, and what happens if it is served again.
acl is_media path_end -i .jpg .jpeg .png .gif .webp .svg .ico .mp4 .webm .mp3 .ogg .wav .flac .mov .avi .mkv .m4vThen I store the result in a transaction variable:
http-request set-var(txn.is_media) bool(true) if is_mediaThe cache lookup is straightforward:
http-request cache-use mediacache if { var(txn.is_media) -m bool true }
And on the response side:http-response set-header Cache-Control "max-age=3600, public" if { var(txn.is_media) -m bool true }
http-response del-header Set-Cookie if { var(txn.is_media) -m bool true }
http-response del-header Vary if { var(txn.is_media) -m bool true }
http-response cache-store mediacache if { var(txn.is_media) -m bool true }
The Cache-Control header makes the intent explicit. Set-Cookie is removed because a public media object should not carry session information. Vary is removed because I do not want the same avatar to fragment into many cache entries because of harmless header differences.This is aggressive only if removed from its context. In this service, with this media policy, it is a reasonable choice. FediMeteo is not serving private media under these paths. It is mostly serving the same public avatar over and over.
For the same reason, I clean the request before it reaches the backend:
http-request del-header Authorization if { var(txn.is_media) -m bool true }
http-request del-header Cookie if { var(txn.is_media) -m bool true }
I would not do this globally. I do it after deciding that the request is media. Scope is what makes these rules safe.The result is exactly what I want: the shared avatar becomes an almost perfect cache object. Small, public, repeatedly requested, and served by HAProxy instead of snac.
Accept header:acl is_ap_json req.hdr(Accept),lower -m sub application/activity+jsonThis part matters because ActivityPub uses content negotiation. The same path may return HTML to a browser and JSON to a remote instance. If the proxy pretends that a URL is always one thing, it will eventually cache the wrong representation.
acl is_ap_ldjson req.hdr(Accept),lower -m sub application/ld+json
acl is_outbox path_end /outbox
acl is_get method GET
acl has_auth req.hdr(Authorization) -m found
acl has_cookie req.hdr(Cookie) -m found
So I only mark public ActivityPub GET requests as cacheable:
http-request set-var(txn.is_activitypub) bool(true) if is_get !is_outbox is_ap_json !has_auth !has_cookieThere are several decisions here, all important.
http-request set-var(txn.is_activitypub) bool(true) if is_get !is_outbox is_ap_ldjson !has_auth !has_cookie
It must be a GET, because I am not caching deliveries or anything that changes state. It must not be /outbox, because outbox collections are not the traffic I want to cache here. It must not have Authorization, and it must not have cookies, because authenticated or user-specific requests do not belong in a shared public cache.
Then the cache can be used and populated:
http-request cache-use jsoncache if { var(txn.is_activitypub) -m bool true }http-response set-header Cache-Control "max-age=60, public" if { var(txn.is_activitypub) -m bool true }
http-response cache-store jsoncache if { var(txn.is_activitypub) -m bool true }
Sixty seconds is short, but useful. Federation often creates small clusters of identical requests. A remote server fetches an actor, another fetches the same actor, something asks for the same object, something retries. I do not need to cache these responses for hours. I only need HAProxy to answer the second and third identical request during the same small burst.This is microcaching in the most practical sense. It reduces repeated work without changing the nature of the service.
acl is_short_path path_reg ^/[^/]+/s/This comes from the same observation that led me to cache snac media with nginx. snac uses static media paths, and those paths often represent the kind of public, repeatable traffic that should not consume backend threads if the proxy can serve it. I call them "short", not because they are, but because the first time I saw them, I thought the 's' stood for "short", not "static". The name just stuck.
http-request cache-use mediacache if is_short_path
In FediMeteo this is less central than on a normal social instance, because I deliberately do not use media except for the avatar and basic static objects. Still, the rule fits the general policy: let HAProxy handle repeatable edge work, and let snac spend its threads where they are actually needed.
Vary, but not without limitsprocess-vary onI want HAProxy to process
max-secondary-entries 12
Vary, because content negotiation is real, especially when ActivityPub is involved. But I also want variation to be bounded. If every slightly different header creates another cache entry, the cache becomes a complicated way to miss.For media, I remove Vary before storing the response. A shared avatar does not need to vary by Accept. For ActivityPub JSON, I am more careful because the representation matters.
Again, the important thing is not the number itself. It is the decision to make variation explicit and limited.
http-response set-header X-Cache-Status HIT if !{ srv_id -m found }
http-response set-header X-Cache-Status MISS if { srv_id -m found }
This is intentionally simple. If HAProxy selected a backend server, I call it a miss. If no backend server was selected, the response came from cache, so I call it a hit. It is not a complete observability system, but it is enough to answer the first question I usually have after changing a cache rule.Did this request reach snac?
A test can be as simple as:
curl -I https://it.fedimeteo.com/path/to/avatar.pngThe second request should be a hit.
curl -I https://it.fedimeteo.com/path/to/avatar.png
For ActivityPub JSON, the test must use the right Accept header:
curl -I \And I also want to verify that cookies and authorization prevent public caching:
-H 'Accept: application/activity+json' \
https://it.fedimeteo.com/some/activitypub/object
curl -I \A cache that works should be visible. A cache that is invisible can be correct, but it can also be silently wrong. I prefer to know.
-H 'Cookie: test=value' \
-H 'Accept: application/activity+json' \
https://it.fedimeteo.com/some/activitypub/objectcurl -I \
-H 'Authorization: Bearer fake' \
-H 'Accept: application/activity+json' \
https://it.fedimeteo.com/some/activitypub/object
filter compressionThis keeps another common responsibility at the edge. The country instances can stay focused on snac and the forecast data, while HAProxy deals with client-facing compression for HTML, JSON, and ActivityPub responses.
compression algo gzip
compression type text/css text/html text/javascript application/javascript text/plain text/xml application/json application/activity+json
There is also a local Prometheus exporter:
frontend prometheusAnd I keep internal operational paths, such as statistics and Grafana, handled before the hostname map. These are small details, but ordering matters. Special paths should be explicit and early. The hostname map is for FediMeteo routing, not for every internal tool I happen to expose behind the same proxy.
bind 127.0.0.1:8405
mode http
http-request use-service prometheus-exporter
no log
The map keeps hostname routing manageable. The backend definitions keep each country isolated and limited. The static homepage avoids dynamic work for something that changes once per hour. The shared avatar gives HAProxy one very hot media object to serve directly. The media cache keeps public files away from snac. The JSON microcache absorbs short ActivityPub bursts. Header cleanup prevents useless variation. Connection reuse avoids unnecessary backend connection churn.
But all of this is only a longer way of saying one thing:
fewer requests reach snac.
That is the metric I care about here.
Not because snac is slow. If anything, FediMeteo exists in its current form because snac is efficient enough to make this kind of project possible on a very small VPS. But precisely because the whole architecture is small and pleasant, I do not want to waste resources where there is no need.
This is also consistent with the rest of the project. Forecasts are serialized by scripts. Updates happen every six hours. The homepage is regenerated hourly. Countries live in separate jails. Snapshots and backups are handled outside the application. No single component tries to be the entire system.
HAProxy is just another small piece, but it sits in the right place to remove a lot of repeated work.
It matches FediMeteo as it is now: almost no media, one shared avatar, static homepage, public forecasts, many small snac instances, and ActivityPub traffic that can benefit from a short public cache when there are no cookies or authorization headers.
If I decide one day to use media in forecasts, the media cache rules will need to be reviewed. If I use different avatars for each city or country, the cache will still work, but I will lose the very nice property of one shared, always-hot avatar. If ActivityPub responses become actor-dependent, public JSON caching must be reconsidered. If one country grows a very different traffic pattern from the others, it may deserve a different limit or policy.
This is why I do not like presenting configurations as magic. A good configuration is a written form of the assumptions behind a service. When the assumptions change, the configuration must change too.
The HAProxy layer follows this idea. It terminates TLS, routes hostnames through a map, reuses backend connections, serves the shared avatar from cache, microcaches public ActivityPub JSON, avoids authenticated and cookie-based traffic, and gives me a small diagnostic header to see what is happening.
There is no single brilliant directive here. There is only the usual work of matching infrastructure to reality.
FediMeteo publishes weather forecasts as text and emoji. The homepage is static HTML updated every hour. The accounts share the same avatar because it is enough, and because it is better for the cache. Each country has its own snac instance in its own FreeBSD jail. HAProxy stands in front of them and tries, quietly, not to bother them unless it has to.
I like this kind of infrastructure.
Not because it is invisible, but because when it works well, it leaves very little to say.
https://it-notes.dragas.net/2026/05/18/fedimeteo-haproxy-and-the-art-of-not-wasting-snac-threads/
#ITNotes #NoteHUB #fediverse #freebsd #haproxy #hosting #jail #networking #ownyourdata #server #snac #snac2 #social #web
Location: CNT-AIT Alcalá de Henares, C/ Río Eresma, 4. Alcalá de Henares
Time: 2026-05-21 19:00:00+02:00 / 21:00:00+02:00
@crse There is no mention of Fediverse or ActivityPub in the project description on GitHub and their website is not working for me (Cloudflare error).
As a general rule, if the developer does not prioritise the Fediverse, the app will not be included.
More amazing response from Stefano: "fuck off"
"AI is going to replace a lot of jobs."
Ok, what do you think is gonna happen when you stop paying the "don't riot" bill? How long can you go without paying that bill before an angry mob is gonna come to collect? You can tell from their vacant eyes that they never considered that.
They're gonna go in their bunkers... And then what? They all care about getting into the bunkers and never consider that the doors can be welded shut and the vents filled with concrete.
LLMs can do a lot of the work people are tasked with doing on a regular basis, because a lot of the work people do is bullshit. The majority of what we do isn't to achieve any goal, it's a way to distribute just enough wealth to keep things calm while keeping us all too busy to actually make things better.
We aren't paid to make stuff or do things. We're paid not to riot. Elites used to know that. The fact that they've forgotten how the machine works is evident in its current implosion, and will only become more obvious as they forget the one thing that actually keeps them safe.
I'm mostly only good for complaining and shitposting but I like reading the stuff you people post
As I was heading home, I was listening to the radio for a bit. The host said something that made me think:
"I won't read the comments, because I've been studying and living what I talk about for thirty years, and I'm full of doubts. Almost everyone who comments, by contrast, heard about it yesterday and already has it all figured out. I don't want to feel stupid, so I'll gloss over them."
in the
darkest hour
of man
saddle the steed
of apocalypse
and ride with
angels of hell
#unix_surrealism #comic #tarot #occult #computers #art #fediart #triapul









Kind of translation for non-french reading people:
Dolhikhare
Vampire minimale
Minimal vampire
Quand j’étais petite, je voulais devenir une vampire.
When i was a little girl, i wanted to be a female vampire
Ok, j’étais pas petite petite.
Okay, i was not that small
J’étais même un peu trop grande je dirais. Un peu trop maigre, aussi, peut-être.
I was even a little too tall i think A little too skinny, too, maybe
C’était pas quand j’étais, genre, enfant. Ado plûtot.
It was when i was, like, a teen
Et comme tous les ados j’avais lu le livre sur les vampires beaux gosses et forts et tristes.
And as all teens i have read the book on the good looking powerful sad vampires
Alors je voulais devenir un vampire.
So i wanted to become a vampire
Tout le monde a voulu devenir vampire à un moment non ? Toi aussi ? Qu’est-ce que tu voulais fuir toi ?
Everybody wanted to become a vampire at some point, no? You too? What did you want to run away from?
Moi c’était le ciel.
Me, it was the sky
J’étais trop grande et j’arrêtais pas de grandir.
I was too tall and didn’t stop growing up
Je m’approchais dangereusement du ciel.
I was dangerously getting close to the sky
Et dans le ciel, je croyais qu’il y avait tous les morts dont on m’avait dit qu’ils étaient au ciel.
And in the sky i thought there were all the dead that they’ve told me were in the sky.
Et je n’étais pas pressée de les retrouver.
And i wasn’t eager to meet them
Alors que la plupart des filles restaient dans leur lit à écouter des cassettes avec leur walkman, attendant qu’un vampire vienne s’occuper de leur ennui, Moi j’ai décidé de prendre les choses en main.
While most girls stayed in bed listening to tapes on their walkman, waiting for a vampire to come and take care of their boredom, i decided to take matters into my own hands.
Je ne pouvais pas sérieusement compter sur mon charme mystérieux pour attirer un vampire qui aurait traîné en plein jour aux abords du collège.
I couldn’t seriously count on my mysterious charm to attract a vampire who happened to be hanging around my middle school in broad daylight.
C’était avant que ne sorte l’autre livre avec des vampires.
It was before the release of the other book with vampire
Du coup je me suis lâché les cheveux. Je les ai teints en noir corbeau avec une boite de schwarztkopf.
So i released my hair. Tainted them in crow black with a box of schwarztkopf
J’ai fait le tri dans ma garde robe.
I decluttered my wardrobe
La mère “Mais tu va pas jeter ça c’est trop mignon ! ”
The mother: “Don’t trash that it’s so nice! “
Et j’ai commencé à faire le mur la nuit.
And I started sneaking out at night.
La mère “Oublie pas ton portable ! ”
The mother: “don’t forget your phone! “
En vrai c’était super dangereux.
The truth is that it was very dangerous
Dans les années 90, en France, dans les petites villes, tout le monde croyait que les tueurs en série, les pédophiles et les violeurs, c’étaient juste dans les films américains.
In the 90’s, in France, in small towns, everybody thought that the serial killers, pedophiles and rapists existed only in american movies
Mais c’était faux.
But it was not
J’ai parcouru les ruelles les plus sombres. Sans relâche.
I scoured the darkest alleys. Relentlessly.
Et les cimetières les plus kitchs. Sans relâche.
And the cheesiest cemeteries. Relentlessly.
Je m’ennuyais pas mal. Passé 23h, en semaine, il n’y a plus personne.
I was pretty bored. Past 11 p.m. on a weekday, there’s no one left.
Des petits rats qui font les acrobates pour fouiller les poubelles. Des chiens pouilleux qui ont peur des voitures. Parfois un clodo qui arrive pas à dormir à cause de la chaleur.
Just little rats doing acrobatics to scavenge through the trash. Mangy dogs that are afraid of cars. And sometimes a vagrant who can’t sleep because of the heat.
Le weekend, par contre, c’est plein de jeunes qui font boire les filles pour les violer. Le samedi, du coup, je restais à la maison pour regarder Bichette avec mes copines.
On the weekends, though, it’s full of guys getting girls drunk so they can rape them.
So on Saturdays, I’d stay home and watch Bichette with my friends.
La copine : “Boudi, elle a le chic pour se trouver que des sales types celle-là ! ”
The friend: "Fuck, she sure has a knack for picking nothing but losers, that one! “
Malgré tous mes efforts, je n’ai jamais croisé de vampire. Ou, en tout cas, je n’ai pas réussi à attirer leur attention.
Despite all my efforts, I never crossed paths with a vampire. Or, at least, I never managed to catch their eye.
Puis, à un moment, il a bien fallu que je dorme pour pouvoir aller bosser la journée.
Then, at some point, I actually had to get some sleep so I could go to work during the day.
Et avec le temps mon envie de devenir vampire est passée.
And over time, my desire to become a vampire faded away.
Maintenant je suis à la moitié de ma vie. Heureusement j’ai arrêté de grandir. Et j’ai pris du gras, un peu, aussi.
Now, I’m halfway through my life. Fortunately, I’ve stopped growing. And I’ve put on a bit of weight, too.
Je crois que je me serais ennuyée, comme ça, toute seule, la nuit.
I think I would have been quite bored, like that, all alone at night.
À devoir tuer des gens pour manger.
Having to kill people just to eat.
Qui sait ?
Who knows?
Photo by Zoshua Colah on Unsplash
While I was doing some work around the house, a screwdriver slipped and I gave myself a small cut on my hand. Nothing serious, but I decided to disinfect it and put on a plaster. But where are the plasters? My wife thought she had put them in the bathroom cabinet, but... nothing. Failing that, I remembered there were some in the cabinet that had been moved - eleven years ago - from the old house. Old, perhaps, but probably still usable. When I opened the cabinet, I found a small cotton swab, still sealed, whose existence I had completely forgotten. I smiled - which drew my wife's curiosity - because...
That afternoon in 2011, I was on top of the world. I was getting ready for a series of connected events I had been looking forward to for some time. I was going to an introductory meeting with an important potential client - one that would have allowed me to do wonderful things - and then a journey of around 150 kilometres to somewhere else, for a rather important evening, and the following morning, another work meeting. In those two days I would lay the foundations for my entire future and, after such a long time, I was truly, truly proud. I looked at myself in the mirror before leaving the house, and I liked what I saw. My smile was full, rich, bright. I decided to take a photo of myself in front of the mirror, to capture that moment.
Keys - taken. Wallet - taken. Laptop - of course. Suitcase with everything I'll need - yes. Does the car have a full tank of diesel? Yes. After closing the shutters and taking one last satisfied look at the living room, I locked up and got into the car.
The Thick as a Brick CD - to get myself going - and off. The journey went smoothly, filled with thoughts about what I would propose, how I would play it. And the meeting was a success: their situation was a disaster, and my project would give them stability within a few days. They approved it immediately, without any hesitation. In the meantime, an unexpected message had arrived, which I only saw at the end of the meeting. This message carried considerable weight - perhaps as much as the previous meeting, though in an entirely different context - and I read it twice, feeling my heartbeat shift. I arranged an evening programme, given how close my hotel was to this person.
I put on the Thick as a Brick CD again, this time turning up the volume and driving more calmly. I watched the people in the other cars and tried to read their expressions. Now and then, someone would look back at me. Who knows whether my expression gave away my emotions. What I do know is that I got a few smiles in return.
While I was comfortably overtaking, I felt something strange in my mouth. I paid no attention - I had eaten a sandwich not long before - and carried on singing. Until the moment I glanced down and saw fresh blood on my shirt. I pulled down the sun visor and looked in the mirror. My entire mouth was red, and a trickle of blood was running down my face. I opened my mouth and saw a whole pool of fresh blood, with no way of understanding where it was coming from. I froze. I turned off the music. I indicated right and pulled into the first service area I could find.
I couldn't make sense of anything. On instinct, I just thought about rinsing. I opened a small bottle of water I had brought with me, rinsed and spat out of the car door. Again and again, but the more I rinsed, the more the blood increased. The pool beside my door had become enormous, swelled by the blood diluting with water. I decided to run to the service station bathroom.
I don't like the sight of blood - but I immediately thought to bring my bag with me, with my precious laptop inside. They get stolen all the time, precisely when you're travelling alone and you step away toward the bathroom. The blood kept flowing, kept filling my mouth. That taste, that terrible taste, wouldn't leave me. I couldn't understand. The more I tried to find the source, the more agitated I became, the more it accumulated in my mouth.
I started to feel dizzy. I couldn't tell whether it was from the fright or from losing too much blood, but in either case, there was no time to work it out. I decided to sit down, not far from the sinks, on the floor. The service station was fortunately clean, and various people were coming and going. I had come from a work meeting - I was well dressed, with my bag. I was pale, my shirt stained, and visibly worried. I decided to half-close my eyes for a moment, without allowing myself to faint - and I decided that no, I was not going to die there, like that.
Meanwhile, dozens of people came and went. Lorry drivers, family men, businesspeople, young people and not so young - it was a busy service station at peak time. And I was there, worried and deeply ashamed, sitting in the corner of a motorway service station bathroom, alone, with blood coming out of my mouth. Many people saw me. Nobody asked if I needed help. I didn't need help - I would have asked - but nobody cared. Nobody alerted the staff. At best, I was invisible. At worst, someone to glance at sideways with disgust.
I could have cried - from shame, from fear, from the sense of emptiness. Then, all at once, I understood that no, I was not going to die in this corner of a service station, and that, in fact, the bleeding had stopped a few minutes ago.
I waited a moment longer and stood up. I rinsed the shirt - cold water removes fresh blood, a friend had taught me - and decided I would change it as soon as I got back to the car. Or perhaps not - what if the blood started flowing again?
I rinsed my mouth once more and returned to the car. I saw the pool of my blood beside the door, stepped over it, and continued on my way, with the headache of someone who had come close to passing out.
After about ten kilometres, I felt the taste of blood again. I opened my mouth and saw it was coming from a tooth - that wisdom tooth. It had decided to push through on exactly that day, far from home, with such important plans ahead. I reassured myself and simply managed the situation. I understood that by breathing through my mouth and letting air in, it would stop. My dear old platelets - you just have to stop rinsing them away.
Calmer, I continued my journey to my destination, my hotel. I checked in and went to my room to have a long shower. I didn't cancel the rest of my plans, but adapted accordingly. I took off the shirt, looked at it carefully, and decided that if the blood didn't come out, I would dye it a dark colour once I got home. I checked that the others were in order - they were, and I always pack at least one spare. The shower was long and relaxing. I changed into the other shirt - the one I had packed not for work, but for the evening - and checked myself in the mirror one more time before going out.
That night I fell asleep very, very late. The room was exactly as I had left it - yet somehow emptier. And no, I wouldn't have wanted to be alone. I didn't feel calm. Yes, the wisdom tooth and the bleeding seemed to have stopped hours ago - but I was alone, in an anonymous, clean, sterile hotel room. And no, I wouldn't have wanted to die there either - I thought - though this time almost mocking myself for the excessive fear of the afternoon.
When I woke the next morning, I made an unpleasant discovery: the pillow and the sheets were heavily stained with blood. I felt guilty. White sheets, a wonderfully comfortable pillow - ruined. After a shower, I went down for breakfast, making sure to eat only soft things. I went back to the room and got ready for the next appointment, though worried about this new episode of blood loss.
I went down to reception to check out. The receptionist was different from the one the previous evening: an older man, professional, with a reassuring smile - but with wrinkles that showed the smile was simply a professional habit. I handed over the room key and explained what had happened, asking to pay for the extra cleaning or any damage my blood might have caused to their linen.
All at once, his smile became real. "You can't imagine what we find in the rooms", he murmured. And he asked me to wait. After about a minute, he came back with a small white bag. "These are two gum swabs. If it happens again, place one on the affected area. It will absorb the blood and help the wound close." He wouldn't let me pay for them. I thanked him warmly and said I hoped we'd meet again. "Oh, that won't happen. Today is my last day." As he said it, though, his smile shifted, and his face settled back into the shape of his wrinkles, until the greeting for the next guest.
"I've never understood what that thing is, but I suppose it's ready to be thrown away by now?" My wife knew about my adventure on that trip, but some details were and will remain mine alone.
"Nothing, just a swab to absorb blood in case of problems with a tooth. It's fifteen years old, but I want to keep it anyway."
She asked no more questions, and carried on looking for a plaster to cover my slight abrasion.
To my #SSH folks:
Is there some documented process of moving SSH from one machine to another transparently?
I get that I can copy the server-keys from $OLDSERVER to $NEWSERVER, but my understanding is that SSH will still notice the IP address (they connect via name, and DNS will point to the new IP address) changing and still raise alarms.
Short of also migrating the IP address too (not an option here since they're owned by different orgs), is there a least-painful route?
The current/painful option is just "sorry, suckas, IP changed, host-key & its fingerprints changed, and all your automated SFTP tasks break until you accept the new host key" which I'm trying to avoid ☺
Thanks for any recommendations!
Not to mention the exhaustion of water supplies caused by that infrastructure (that better may not exist)....
In case you missed it. Germany’s Social Democratic Party (SPD), Greens and The Left have decided to leave the US corporate billionaire owned social media network X and move to the US corporate venture capitalist owned social media network Bluesky. 🤷
https://brusselssignal.eu/2026/05/german-left-wing-parties-quit-x-in-co-ordinated-move/
Great news, you can now post a picture to https://subversive.pics interactively from your favorite internet browser!
You can achieve this by making a picture post inside the fediverse and tagging @subversive_pics (this works with snac, lemmy, mastodon, but not all of its forks, your mileage may vary)
If your picture makes it past the horp censors, your picture will appear on the subversive.pics website and the rss feed!
Incredible.
---
if you post something that you think should've passed the vibe and it doesn't get through within a reasonable time period, let me know. So i can update this list...
what it definitely works with:
- snac
- lemmy
- (some) mastodon
- akkoma
- gotosocial
- misskey (some?)
what it doesn't work with
:
- hometown
- glitch
A Fediverse experiment! an "Exquisite Corpse" collab with artist @prahou (left), and me (right). Fun fun!
Full original thread: https://fe.disroot.org/notice/B5c8qmENlmX1kjRXMm
As https://subversive.pics keeps expanding, I've written a little about it here:
"Sé que lunas se extinguen, renacen, viven, lloran.
Sé que dos cuerpos aman, dos almas se confunden"
Dos últimos versos de 'Triunfo del amor'
Un 26 de abril nace en Sevilla,
🖋️ Vicente Aleixandre (1898-1984)
Gran poeta español de la genial #GeneraciónDel27 y en general, de todo el siglo XX.
🥉 #PremioNobel de #Literatura en 1977
#Poesía #LiteraturaEspañola #EscritoresRecomendados #PoesíaEspañola
David Chisnall (*Now with 50% more sarcasm!*) » 🌐
@david_chisnall@infosec.exchange
Speaking as a former young man, I suspect any strategy that relies on stopping young men doing stupid things is doomed to failure.
These days I've been quieter than usual, but spending a lot of time at the computer. There's a reason for that. I'm working on something that's giving me a lot of adrenaline, joy, and passion. Something I've had in mind for many years but never had the courage to pursue. Something that will probably never fully come to light, or maybe it will, but it won't be my light 😉
Anyway, I've relaxed and I can't seem to pull myself away from the computer. And no, it's not new software. It's not a BSD. It's not a videogame. It's something very, very different, and for all of this I have to thank a wonderful person I met on the fediverse, namely @angel
Tomorrow is Monday, and I can't wait to sit down in front of my computer.
It’s International Haiku Day apparently and so for today’s poetry offering, here are a few assorted haiku.
Unsurprisingly, it will be used to promote the same old internet-rockstars and to ignore the rest of us like other things like "Hacker News" or Lobsters or the other zillon of similar sites, but only time will tell.
How much gas are you importing from fascist governments right now?Spain imports crude oil, sorted by quantity, from the USA (14.9%), Brazil (13.8%), Mexico (13.2%), Nigeria (10.2%) and other minor percentages from Africa and the Americas. Grouped, 33.4% from North America (USA, Mexico and Canada), 29.6% from Africa, and 19.1% from Center and South America.
Which of these countries qualify as "fascist governments" is up to debate.
Source (in Spanish): https://www.elperiodico.com/es/economia/20260118/petroleo-espana-compra-importaciones-125754955
Some asshat out here calling themselves an "ethical AI vegan" because they only use corporate AI tools in "uwu smol" ways, and, I dunno, I guess they do a land acknowledgment before they boil a lake or whatever.
If anyone is an "AI vegan" it's me -- I don't use these tools at all, ever, because they are unethical. Telling me that they are delicious is not going to make them ethical.
Also, I will endlessly berate you about your use.
That's veganism, you're welcome.
https://jwz.org/b/yk6V
My grandfather, at a certain age, realized that he no longer recognized the people he met on the street. He forgot the roads. He decided to stop going out on his own, staying at home peacefully, and to entrust the main responsibilities to his son, "so as not to cause problems for himself or others", even though he was calm and certainly not aggressive.
My grandfather showed wisdom and intelligence.
Unfortunately, my grandfather never ran for President.
Photo by Othman Alghanmi on Unsplash
I was driving. Thinking. Listening to music. Resetting my mind. Left and right, haze, flatland and cultivated fields. I watched the road markings follow one another, all identical, in time with the prog-rock I was listening to. Hypnotic. They seemed to do it on purpose. I smiled. Suddenly, the mix changed, and one of Ivan Graziani's masterpieces began to play. And my smile faded.
When I was a teenager, I regarded him with suspicion. He had been born a few kilometres from me, many years earlier, had studied in my city, and yet he didn't appreciate it. Somehow, I disliked him. I liked his sounds, not his words - so hostile towards the places I held dear.
And yet his music made me fly. I would travel, remember. The few memories of a teenager, but already precious. His sea - my sea - I could have written those words myself. Or perhaps not, but the feeling is the same. Too complex for a teenager. I didn't think about it.
One evening I crossed paths with him, right in "our" city. I recognised him and gave him a nod. He returned it with a smile - eloquent, communicative. To an idiotic kid who still hadn't understood a thing. He, on the other hand, had already understood everything. A few years later, when I read about his death, it didn't touch me. He was young - but old enough and distant enough from me. Very distant. But he stayed forever young, and I, year after year, drew closer to him. In age, certainly. But I gradually understood that he had been right - oh, how right he had been - about so many other things. And his warm words became a comfort, breaking through the solitude, knowing I was not the only one to feel those specific emotions.
As he described our sea, the asphalt turned to sand and the road markings to waves. Yes, it is our sea he is singing about! I can hear it in the details. In the depth of the emotions. How much he missed it, just as I miss it now. We are like two seashells, he and I. We can be anywhere, but hold one to your ear and you will always hear the sound of the sea.
My smile returned, wider, calmer. If I could go back to that evening in the mid-nineties, I would thank him. But there is no need. He had already understood. Long before I could understand myself, long before life taught me to listen to my own voice.
Thank you, Ivan.
I flick the indicator. Time to park.
What American people think the political spectrum is:
Far right: Trump
Right: Bush
Center: Bloomberg
Left: Warren
Far left: Sanders
What it actually is:
Far right: Trump, Bush, Bloomberg
Right: Warren
Center: Sanders
Left/Far-left: anybody here gets killed by the CIA
Por la manchega llanuraQué grande. Gracias por traerlo a nuestra memoria.
se vuelve a ver la figura
de Don Quijote pasar.
The use of “hallucinate” is a stroke of true evil genius in the AI world.
In ANY other context we’d just call them errors & the fail rate would be crystal clear.
Instead, “hallucinate” implies genuine sentience & the *absence* of real error.
Aw, this software isn’t shit! Boo’s just dreaming!
CC: @reiddragon@fedi.catto.garden @coconutcannibal@misskey.fryer.net.au @jollyorc@social.5f9.de
I had already implemented multi-provider support, but after this morning’s issues I decided to change the behavior: we will continue using the excellent OpenMeteo as the primary provider, but in case of malfunction, the bot will automatically fetch data from MET Norway (https://www.met.no and still provide forecasts, citing the source.
In the coming days, I will also update the website to reflect these changes.
Jedná se o seznam českých smolwebovek, osobních blogů, deníčků atp. V posledních dnech zde ve fedi kolovaly výkřiky po něčem takovém - tak tady to je!
Přidali jsme to, o čem jsme věděli. Pokud máte vlastní web a chcete jej najít na tomto seznamu, dejte vědět!
boostni pls ❤️
novinky lze sledovat přes lab8 holuba: @holub@snac.lab8.cz ( a jeho rss https://snac.lab8.cz/holub.rss )
edit: uvedené weby mohou být v angličtině. přidali jsme pro to sloupek.
edit2: přidali jsme odkazovatelné ikonky (a odkaz), pokud chcete ze svých webů odkázat na tenhle seznam
<a href="//ring.lab8.cz"><img src="//ring.lab8.cz/ring_lab8.png"></a> # černá#lab8 #webring #česky
<a href="//ring.lab8.cz"><img src="//ring.lab8.cz/ring_lab8_inv.png"></a> # bílá
<a href="//ring.lab8.cz">ring.lab8.cz</a> # bez ikony
El 5 de abril de 1997, muere en Nueva York a los 70 años,
🖊️ Allen Ginsberg
Poeta importante del movimiento Beat.
Con intereses básicos del 'hippismo' de los 60:
#FilosofíaOriental #LiteraturaLibre #Antimilitarismo... Drogas y lucha por una libertad sexual, en algún caso, más que cuestionable 😉
#Poesía #LiteraturaEstadounidense
A bureaucrat, dressed in a dull grey suit, crossed the door, moved behind a forest of microphones and began talking.
"Starting today, and after last month sad happenings, the World Space Agency nominates cosmonaut Ilya Iskanderovich Takashvili as the third satellite of planet Earth. This is a homage and this is an eulogy. God bless him. Thank you very much for your attention."
"God? What is this joke?", said the young man.
"Is that all?", said the old man, looking up from what he was writing.
"So it seems", said the woman.
The young man turned back to listen, then looked at me and smiled.
"Oh, you are Miroslav Corbett from documentation, aren't you?"
"Yes, it's me. Do I...?"
"We shared a table at the last convention of the Cinematik Ausfahrt Biotech Aréopage."
That was probably true.
"Sorry, but can any of you tell me who this cosmonaut was?", said the old man in golden glasses.
The woman in military attire started talking: "He was a member of ISS Nova's repairing staff. His umbilical link was broken while repairing the right solar panel and..."
Suddenly, a deep, nasal voice from the back of the room silenced everyone.
"Sorry, I have a question."
All of us looked back. His large silhouette opaqued the back lights; his bright red skin, black scar tatoos and pointy horns contrasted wildly against the immaculate white tuxedo he was wearing.
He was one of the demons that crossed the Seam. Many of them were shoved back or killed, but a few of them, peaceful in nature, stayed here among us and adapted to our society as especial guests. Their world view and opinions, so different than those from the humanity, were always appreciated and taken into account.
He continued his mesmerizing, gutural speech.
"First, I want to give my condolences to Ilya Takashvili's family and friends; I'm sure he will be missed. His oval orbit will produce an eclipse with the Moon every three days, so he will hardly be forgotten. But I want to remark something you all, human beings, have trouble remembering."
The silence was total, awkward, frightening.
"What is the second satellite of planet Earth?", he finally said.
I tried to remember. While doing it, my brain entered something like a cloud, a mist, a fog of dread. Simply, I was lost. The rest of the people there (excluding the demon and the mechanical butlers, shiny grey eyes like pearls) found themselves in the same trance state.
The demon kept talking.
"The damage caused by the Mind Sickers from the Great Anomaly is still here. No one of you remember what the second satellite is. You may consider it while counting, you may recall old photos and tales and drawings, but every time you try to concentrate in the details, your brains crash and reboot."
Slowly, I recovered, but my stomach was still twirling.
The old man with the notebook was lying on the floor; the woman in combat clothes was helping him. Some people were crying. Others were bleeding from their ears and nostrils.
"I wish I could help", finished the demon, "but don't know how, yet."
Invoking that memory in the middle of a massive crowd was a despicable act; but demons, even while trying to help, behave this way.
Half an hour passed before the press room was finally empty.
II Certamen Cuentos del bosque oscuro 2025 - Ciencia ficción, ganador y finalista