triptico.com is a Fediverse instance that uses the ActivityPub protocol. In other words, users at this host can communicate with people that use software like Mastodon, Pleroma, Friendica, etc. all around the world.

This server runs the snac software and there is no automatic sign-up process.

Site description
Ángel Ortega in the fediverse, running snac
Admin email
angel@triptico.com
Admin account
@angel@triptico.com

Search results for tag #snac

[?]Oliver ⚡ » 🌐
@oliver@microhive.me

I've just updated my instance to stable version 2.93 👍 🎉
You don't know Snac? But you should: https://codeberg.org/grunfink/snac2
A simple, minimalistic and well documented instance server written in C, no database needed, totally JavaScript-free, no cookies either, not much bullshit.
Lots of useful changes, woohoo! 🎉
A new "admirations" entry point to the web UI, new "do-not-purge-my-messages"-config-settings in server.json, language-filters and more.
Huge thanks to @grunfink@comam.es and all contributers!! 👍


    [?]The Real Grunfink » 🌐
    @grunfink@comam.es

    I've just published version 2.93 of , the simple, minimalistic instance server written in C. It includes the following changes:

    Added a new admirations entry point to the web UI, containing a timeline of liked, boosted and reacted posts. Please take note that, after installing the new version, it will start empty, and be filled with subsequent reactions (contributed by violette).

    It's now possible to disable showing posts in a given set of languages.

    Nested quoted posts are limited up to 3 levels.

    New configuration knob: by setting keep_replies_posts to true in server.json, remote posts that a local user has replied to are retained in the public timeline, preventing them from being purged (contributed by hanchan).

    New configuration knob: by setting keep_replied_me to true in server.json, remote replies to local posts are retained in the public timeline, preventing them from being purged (contributed by hanchan).

    Ensure actors' public key PEM never includes anything after the end marker.

    Fixed some memory leaks (contributed by inz).

    Several additional keyId checks (many thanks to lainsoykaf for bringing this to my attention).

    Fixed crash in the JSON parser (many thanks to nullenvk for bringing this to my attention).

    Mastodon API: fixed lost custom emojis after edition (contributed by e0w0e).

    Updated French, Brazilian Portuguese, German, Spanish translations (contributed by dragondaddy, daltux, zen).

    https://comam.es/what-is-snac

    If you find useful, please consider buying grunfink a coffee or contributing via LiberaPay.


      [?]mattof » 🌐
      @mattof@snac.lab8.cz

      Toot works fine with snac

      Toot, the Mastodon CLI client, works fine with Snac. Of course :)

      https://toot.bezdomni.net

        [?]Stefano Marinelli » 🌐
        @stefano@mastodon.bsd.cafe

        RE: poliversity.it/@devconf/116792

        A tutti gli amici che parteciperanno alla DevConf Italia: potrete seguire le previsioni meteo di Pavia direttamente dal Fediverso e da Delta Chat, nonché da sito web o feed RSS, da FediMeteo.

        Sito: it.fedimeteo.com/pavia
        Account Fediverse: @pavia
        Canale Delta Chat: i.delta.chat/#39D39283B059D042

        Vi ricordo inoltre che il 7 Luglio alle ore 16:25 presenterò "FediMeteo, i BSD e il Fediverso: sotto il sole, senza nuvole, liberi e connessi" - proprio su FediMeteo e sugli strumenti di comunicazione liberi e decentralizzati.

        Non mancate!

        [?]DevConf Italia :verified: » 🌐
        @devconf@poliversity.it

        📢 Siete pronti per il DevConf Italia?

        🚩 A Pavia, il 7 e 8 Luglio del 2026, presso il Learning Space Cravino in Via Agostino Bassi 2 si terrà il primo convegno nazionale, a cadenza biennale, denominato Dev. Conference Italia.
        Verranno affrontati numerosi temi quali: sicurezza, sviluppo applicazioni, didattica, fediverso, libertà e sovranità digitali che potete trovare sul programma.

        @devconf@citiverse.it

        Venite a scoprire di cosa parleremo, vi aspettiamo numerosi!

        devconf.it

        locandina ufficiale

        Alt...locandina ufficiale

            [?]acct-user/initra-mf[-sleep] [they/them] » 🌐
            @me@doasu.dev

            Fediverse meta [SENSITIVE CONTENT]@mi@awawa.cat:
            I think it was snac, on microcontroller boards that take a fraction of a watt!
            Ohh... that sounds fun! I'd love to read up on that. Do you have a source?

              [?]gyptazy » 🌐
              @gyptazy@gyptazy.com

              Hehe, yes and it's working pretty well, espeically in addition to @stefano@bsd.cafe's MastoBlaster App! Stefano is also going to do some tests and then I'm heading over to provide a patch to upstream. So, maybe soon available in upstream :) The last words are up to @grunfink@comam.es, as my C isn't good.


              CC: @VasiliWz@hachyderm.io

                [?]V A C » 🌐
                @VasiliWz@hachyderm.io

                Nooiiceeee!!! Native push notifications for on iPhone seems to work

                @gyptazy made this in gyptazy.com/blog/snac2-native-

                Run !

                  [?]gyptazy » 🌐
                  @gyptazy@gyptazy.com

                  finally sends me push notifications!

                  Two things you can see here... It's pretty hot! That's why I stayed home and implemented a missing feature into snac. That's what you can also see - it finally sends push notifications to devices! In this case, we can see notifications coming from App for iPhone.

                  What we can also see, it's still a bit faulty and not the expected content, but a first success here at least ;) I'll make some further adjustments when there's time and get in touch with @grunfink@comam.es to check if we can get this upstream. Thanks to @stefano@bsd.cafe for testing with me :)


                  snac2 sending push notifications to a user via MastoBlaster App on iPhone

                  Alt...snac2 sending push notifications to a user via MastoBlaster App on iPhone

                    [?]R.L. Dane (snac) » 🌐
                    @rl_dane@snac.bsd.cafe

                    users,

                    What's your preferred clients for the Unix terminal (must be cross-platform, not Linux-only, for goodness, sake! 😅) and Android?

                    I've noticed that @tut@fosstodon.org and @pachli@mastodon.social (and other @Tusky@mastodon.social forks) don't quite like snac, and tend to act a wee bit cagey. ;)

                      [?]The Real Grunfink » 🌐
                      @grunfink@comam.es

                      Haven't tested it myself (I have no Apple hardware), but Mastoblaster (@mastoblaster@mastoblaster.app) not only works, but has as a first citizen target.

                      CC: @MonaApp@mastodon.social @amd@snac.amd.im

                        [?]amd » 🌐
                        @amd@snac.amd.im

                        So far @MonaApp@mastodon.social seems to be the ticket on iOS +

                        Anyone have any other recommendations to try? https://snac.amd.im/amd/p/1781807020.988120

                          [?]steve mookie kong » 🌐
                          @mookie@weredreaming.com

                          It's been four months since I brought up We're Dreaming using and I'm really liking how well the instance has been running. Maintenance has been easy. I started on 2.90-dev and have gone through three upgrades which were all boring (aka easy).

                          snac is rather awesome software. It's lightweight, exceedingly fast and just works.

                          Thanks @grunfink@comam.es (and other contributors to the project).


                            [?]Stefano Marinelli » 🌐
                            @stefano@mastodon.bsd.cafe

                            Coming next week: a post about the FediMeteo bot, how it works, how it has evolved, and the overall structure of jails. The following week: caching the BSD Cafe Mastodon instances on nginx.

                            Stay tuned on ITNotes!

                              [?]IT Notes - https://it-notes.dragas.net » 🤖 🌐
                              @itnotes@snac.it-notes.dragas.net

                              FediMeteo, HAProxy, and the art of not wasting snac threads

                              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.

                              A continuation of the same idea

                              I had already explored the same problem with snac and nginx in two previous posts: Improving snac Performance with Nginx Proxy Cache (https://it-notes.dragas.net/2025/01/29/improving-snac-performance-with-nginx-proxy-cache/) and Caching snac Proxied Media with Nginx (https://it-notes.dragas.net/2025/02/08/caching-snac-proxied-media-with-nginx/). In both cases, the idea was that the reverse proxy should absorb repeated public requests instead of letting them consume snac resources.

                              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.

                              Why there is almost no media

                              Before talking about HAProxy, it is worth mentioning one of the most important optimizations, which is not in the proxy configuration at all.

                              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.

                              The homepage is static because it can be static

                              The main homepage follows the same logic.

                              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.

                              Many countries, one entry point

                              FediMeteo is made of many country instances. Each one runs in its own jail and listens on its own internal address and port. From the outside, however, they all live under the same domain structure:

                              fedimeteo.com
                              www.fedimeteo.com
                              it.fedimeteo.com
                              uk.fedimeteo.com
                              jp.fedimeteo.com
                              us.fedimeteo.com
                              usa.fedimeteo.com
                              can.fedimeteo.com
                              canada.fedimeteo.com
                              And many more.

                              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_fedimeteo
                              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
                              The frontend then needs only one rule:

                              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.

                              Backends as small compartments

                              The country backends are deliberately plain:

                              backend backend_it
                              mode http
                              http-reuse safe
                              server srv1 10.0.0.2:8001 maxconn 30

                              backend backend_uk
                              mode http
                              http-reuse safe
                              server srv1 10.0.0.7:8001 maxconn 30

                              backend backend_jp
                              mode http
                              http-reuse safe
                              server srv1 10.0.0.32:8001 maxconn 30

                              One 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.

                              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.

                              The front door

                              The HTTPS frontend listens on IPv4 and IPv6 and offers both HTTP/2 and HTTP/1.1:

                              frontend https_in
                              bind :::443 v4v6 ssl crt /usr/local/etc/certs/ alpn h2,http/1.1
                              mode http
                              option http-keep-alive
                              TLS defaults are set globally:

                              ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
                              ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
                              Port 80 only redirects to HTTPS, except for Let's Encrypt challenges:

                              acl letsencrypt-acl path_beg /.well-known/acme-challenge/
                              http-request redirect scheme https code 301 unless letsencrypt-acl
                              use_backend letsencrypt-backend if letsencrypt-acl
                              In the HTTPS frontend I also set the usual forwarding headers:

                              http-request set-header X-Real-IP %[src]
                              http-request set-header X-Forwarded-Proto https
                              And I add HSTS:

                              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.

                              Two caches, because the requests are different

                              The HAProxy configuration defines two caches:

                              cache mediacache
                              total-max-size 128
                              max-object-size 10000000
                              max-age 3600
                              process-vary on
                              max-secondary-entries 12

                              cache jsoncache
                              total-max-size 16
                              max-object-size 1000000
                              max-age 60
                              process-vary on
                              max-secondary-entries 12

                              I keep media and ActivityPub JSON separate because they are not the same kind of traffic.

                              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.

                              Recognizing media

                              For media, the ACL is based on file extensions:

                              acl is_media path_end -i .jpg .jpeg .png .gif .webp .svg .ico .mp4 .webm .mp3 .ogg .wav .flac .mov .avi .mkv .m4v
                              Then I store the result in a transaction variable:

                              http-request set-var(txn.is_media) bool(true) if is_media
                              The 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.

                              ActivityPub JSON microcaching

                              The ActivityPub side starts from the Accept header:

                              acl is_ap_json   req.hdr(Accept),lower -m sub application/activity+json
                              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
                              This 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.

                              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_cookie
                              http-request set-var(txn.is_activitypub) bool(true) if is_get !is_outbox is_ap_ldjson !has_auth !has_cookie
                              There are several decisions here, all important.

                              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.

                              Static media paths

                              There is also a rule for static paths:

                              acl is_short_path path_reg ^/[^/]+/s/
                              http-request cache-use mediacache if is_short_path
                              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.

                              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 limits

                              Both caches have:

                              process-vary on
                              max-secondary-entries 12
                              I want HAProxy to process 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.

                              Seeing whether it works

                              During rollout, I like to expose a very small diagnostic header:

                              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.png
                              curl -I https://it.fedimeteo.com/path/to/avatar.png
                              The second request should be a hit.

                              For ActivityPub JSON, the test must use the right Accept header:

                              curl -I \
                              -H 'Accept: application/activity+json' \
                              https://it.fedimeteo.com/some/activitypub/object
                              And I also want to verify that cookies and authorization prevent public caching:

                              curl -I \
                              -H 'Cookie: test=value' \
                              -H 'Accept: application/activity+json' \
                              https://it.fedimeteo.com/some/activitypub/object

                              curl -I \
                              -H 'Authorization: Bearer fake' \
                              -H 'Accept: application/activity+json' \
                              https://it.fedimeteo.com/some/activitypub/object

                              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.

                              Compression and operational paths

                              HAProxy also handles gzip compression:

                              filter compression
                              compression algo gzip
                              compression type text/css text/html text/javascript application/javascript text/plain text/xml application/json application/activity+json
                              This 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.

                              There is also a local Prometheus exporter:

                              frontend prometheus
                              bind 127.0.0.1:8405
                              mode http
                              http-request use-service prometheus-exporter
                              no log
                              And 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.

                              What this changes in practice

                              The nice thing about this configuration is that none of its parts is particularly surprising.

                              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.

                              Caveats

                              This configuration is not a universal HAProxy recipe for ActivityPub services.

                              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.

                              Conclusion

                              FediMeteo started as a small idea and became larger than I expected, but I still want it to feel small in the right ways. Small does not mean fragile. Small means understandable. It means that each part has a reason to exist, and that unnecessary work is removed before it becomes a problem.

                              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/


                                Ángel boosted

                                [?]Tomáš » 🌐
                                @prahou@merveilles.town

                                Great news, you can now post a picture to 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 :sadlinux: :
                                - hometown
                                - glitch

                                HAVE YOU EVER WANTED TO CONTRIBUTE TO SUBVERSIVE.PICS BUT DONT SPEAK COMPUTER?!

metal vaccine angel says sweet

                                Alt...HAVE YOU EVER WANTED TO CONTRIBUTE TO SUBVERSIVE.PICS BUT DONT SPEAK COMPUTER?! metal vaccine angel says sweet

                                  Ángel boosted

                                  [?]Samuel [he/him] » 🌐
                                  @samuel@social.nihil.ws

                                  One week later, but it happened!

                                  I also took the chance to update and, again, no surprises. Great piece of software.

                                    Ángel boosted

                                    [?]Ecologia Digital » 🌐
                                    @josemurilo@mato.social

                                    "If you want to be in the Fediverse without relying on big intances, or if you just want to own your & on the network, running your own instance is the way to go.
                                    That is where Mastodon alternatives such as GoToSocial & comes in.
                                    snac (Social Networks Are Crap) is a minimalistic, lightweight instance…perfect for single user instances or small communities, and it's so light that even a can handle it without breaking a sweat."
                                    rochacbruno.com/deploy-your-ow

                                      [?]Victor Moral ⁂ » 🌐
                                      @victor@taquiones.net

                                      @grunfink@comam.es, el autore de (el más mejor servidor del mundo mundial) clarifica en ese texto que la IA para contribuir mejor que no.
                                      PRs must not incorporate any material generated by or with the assistance of any so-called "generative AI" tool or LLM.

                                        Ángel boosted

                                        [?]ffuentes » 🌐
                                        @soy@ffuent.es

                                        fue el primer sistema para el que probé instalar pars texto-plano y fue un fracaso rotundo porque no me federaba pero he visto últimamente que se está usando más y parece que ya funciona.

                                        por otra parte fue más simple y rápido, no tiene una gran estética pero siempre me ha funcionado bien

                                          Ángel boosted

                                          [?]Jeff - "Just Gay Enough" » 🌐
                                          @box464@mastodon.social

                                          Next up in a new store is merchandise! I had to grab my own set of stickers for this one, the artwork is so cool!

                                          You've got Susie, snac's default icon embedded in a QR code. And then this ridiculously amazing artwork from @prahou that is just a must have for your sticker collection - or on a shirt - or mug. Just get it!

                                          redbubble.com/people/analognow

                                          An alien with a wig and makeup on, with the words "SINCE YOU LEFT ME, I'VE BEEN SNACPILLED" with a website address for the snac platform. The client is holding a small Susie avatar.

                                          Alt...An alien with a wig and makeup on, with the words "SINCE YOU LEFT ME, I'VE BEEN SNACPILLED" with a website address for the snac platform. The client is holding a small Susie avatar.

                                          The default snac user avatar, Susie, black and white, embedded in a QR code sticker.

                                          Alt...The default snac user avatar, Susie, black and white, embedded in a QR code sticker.

                                            It's Just Me boosted

                                            [?]Stefano Marinelli » 🌐
                                            @stefano@mastodon.bsd.cafe

                                            The time is probably right.

                                            Back in 2022, when I was still using iOS, I wasn’t completely happy with the Fediverse apps that were available. I was mostly using Akkoma, and the interface I liked the most was actually its web UI, even on mobile. So I started playing with Xcode and put together the foundations of an app tailored to my needs.

                                            A lot has changed since then and today we have great alternatives like IceCubes, Mona, Ivory, etc. Each one has strengths and weaknesses though, so I picked up my old project again and kept pushing it forward.

                                            So I’m happy to announce that my app will finally see the light: I’ve been using it for the past few days and, in my spare time, I’m fixing bugs and adding missing features. I’m building it around my own needs, so it doesn’t have to “appeal to everyone”. I wouldn’t call it opinionated, but it’s definitely targeted.

                                            The app will have one key trait: support will be a first-class feature, not an incidental one. Many apps, especially on iOS, support snac as a side effect, but the experience is often not optimal. In this case, the choice is deliberate and it strictly follows the Mastodon API support implemented by snac. So snac will work properly (within the limits of the platform, of course).

                                            Among the features already implemented: the app is minimal and lightweight (under 10 MB, including debug code), easy on RAM, and privacy-first (for example it strips EXIF data from media before posting, so the server will never see it). On snac it also cleans up the "Boosted by Aoderelay" messages that appear when using a relay, removes the character limit, and supports posting in Markdown.

                                            I also added support for Apple Intelligence to generate alt text, both for the media I post and for media posted by others that is missing alt text.

                                            Everything is processed locally through Apple APIs and only on supported devices. The results aren't amazing, Apple Intelligence is extremely limited, but in my opinion it's the only privacy-friendly and ethical way to approach it. And of course, you can disable it.

                                            On Mastodon it supports all the main features: lists, quote posts, granular notifications (you can choose what you want for each category), notification grouping, multi-account support, and it works.

                                            It's still missing a few things (block, etc.) and has some bugs, which I’m spotting as I keep using it.
                                            As soon as it's stable enough, I'll invite a few people to test it. I still haven't fully decided how I'll distribute it: an Apple Developer account has a yearly cost, and I hope to reuse it for other projects too. So this app might be paid, with a trial period, but if possible (I still need to check what’s feasible) I'd like it to be free if you connect to one of the BSD Cafe instances, illumos Cafe, or any snac instance, including your own.

                                            I don't know how long it will take before it's ready... but I can already tell you what it will be called.
                                            It already has a name, and it's... MastoBlaster.

                                            This name was chosen for personal reasons, and also because of its similarity to Master Blaster by Stevie Wonder, which even today feels relevant and fitting for the Fediverse.

                                            Stay tuned!

                                            MastoBlaster, showing my profile on my phone

                                            Alt...MastoBlaster, showing my profile on my phone

                                              Ángel boosted

                                              [?]Tomáš » 🌐
                                              @prahou@merveilles.town

                                              Get snac'd up (not just) for !

                                              You can now purchase propaganda stickers and apparel to show your allegiance or to wage war with.

                                              redbubble.com/people/analognow

                                              Blessed be the hacker @grunfink for they can C.

                                              snac's suzie qr, points to comam.es/what-is-snac

                                              Alt...snac's suzie qr, points to comam.es/what-is-snac

                                              snac alien

SINCE YOU LEFT ME

IVE BEEN SNACPILLED

comam.es/what-is-snac

                                              Alt...snac alien SINCE YOU LEFT ME IVE BEEN SNACPILLED comam.es/what-is-snac

                                                [?]Tomáš » 🌐
                                                @prahou@merveilles.town

                                                @grunfink

                                                SINCE YOU LEFT ME

I'VE BEEN 
SNACPILLED

comam.es/what-is-snac

                                                Alt...SINCE YOU LEFT ME I'VE BEEN SNACPILLED comam.es/what-is-snac

                                                  [?]gyptazy » 🌐
                                                  @gyptazy@gyptazy.com

                                                  Looks like I finally successfully migrated from back to () on the same domain name without bigger impacts and jumps.


                                                    It's Just Me boosted

                                                    [?]Stefano Marinelli » 🌐
                                                    @stefano@mastodon.bsd.cafe

                                                    My friends, I'm so excited and happy to introduce a new project: the illumos Cafe!

                                                    The positive and constructive spirit of the BSD Cafe, created and maintained by all the friends who participated from day one in building a strong and friendly community, deserves to spread to other operating systems. Because there are other OSes that deserve attention, certainly more than they're getting right now.

                                                    Operating systems based on illumos (like SmartOS, OmniOS, Tribblix, OpenIndiana, etc.) are mature, stable, secure, and perfectly usable for a wide range of tasks. ZFS is native, zones are an excellent method for containerization, and bhyve and kvm coexist beautifully - and so much more, too much to list in a single post.

                                                    So from today, the illumos Cafe will stand alongside the BSD Cafe in creating a positive, respectful, and growth-oriented (but also relaxing!) environment, starting right here in the Fediverse with a Mastodon instance and a snac one.

                                                    I've written an introductory article about the project, including some technical details. I invite everyone interested to read it: it-notes.dragas.net/2025/08/18

                                                    Choose your table, take a seat and enjoy your time at the illumos Cafe!

                                                      Ángel boosted

                                                      [?]Justine Smithies [She / Her] » 🌐
                                                      @justine@snac.smithies.me.uk

                                                      I use to populate my feed. Just type in a hashtag that you wish to follow and then copy and paste the link into the follow section on .

                                                      https://relay.fedi.buzz/

                                                        4 ★ 1 ↺

                                                        [?]Ángel » 🌐
                                                        @angel@triptico.com

                                                        Hace unos días puse en marcha este bot: @palabra@triptico.com . Saca la palabra del día de la página del Diccionario de la Lengua Española de la R.A.E. y la envía como un post público, una vez al día, por la mañana (zona horaria de España). También se puede acceder mediante RSS.

                                                        Con el software de ActivityPub que uso () es muy fácil montar cosas de estas.

                                                          1 ★ 0 ↺

                                                          [?]Ángel » 🌐
                                                          @angel@triptico.com

                                                          This is how a Peertube post / video looks like in (the video is currently playing, after clicking on it):

                                                          example screenshot of a Peertube post in the snac ActivityPub software

                                                          Alt...example screenshot of a Peertube post in the snac ActivityPub software

                                                            Ángel boosted

                                                            [?]Stefano Marinelli » 🌐
                                                            @stefano@mastodon.bsd.cafe

                                                            [?]The Real Grunfink » 🌐
                                                            @grunfink@comam.es

                                                            Hi. I was feeling apocalyptic the other day and programmed this bot: @eschaton@comam.es

                                                            It gives a daily report of those asteroids with a reasonable probability of crashing into Earth, in case you are not already afraid enough of the future. Of course, using , what else.

                                                            It takes its data from a very cool NASA site, so (again) in these days of uncertanty, I'm not sure how long will it work.

                                                            Everyone, take care, and have a great week.

                                                              Ángel boosted

                                                              [?]Stefano Marinelli » 🌐
                                                              @stefano@fedihome.stefanomarinelli.it

                                                              Ángel boosted

                                                              [?]Stefano Marinelli » 🌐
                                                              @stefano@mastodon.bsd.cafe

                                                              Some technical details for those interested:
                                                              The entire FediMeteo setup runs on a FreeBSD VM costing around 4 euros per month. It supports almost all major EU countries (plus the UK), with just a few left to complete. Currently, there are 25 separate jails, each running its own instance of snac, totaling 25 instances. The VM load typically stays around 10%, which increases to 30% when updates are published for countries with larger numbers of cities (currently Germany and Italy). The only time the load spikes is when new countries are announced; during that time, all remote instances connect to all cities to download their details.
                                                              As for RAM usage, excluding the ZFS cache, it's currently a total of 213 MB. Yes, MB.

                                                                Ángel boosted

                                                                [?]The Real Grunfink » 🌐
                                                                @grunfink@comam.es

                                                                is the powerful war rig in the army against the axis of biased social networks; is the little buffoon back there in the rearguard, playing their old-fashioned lute and making silly jokes.


                                                                  Ángel boosted

                                                                  [?]The Real Grunfink » 🌐
                                                                  @grunfink@comam.es

                                                                  I'm glad to announce the release of version 2.69 of , the simple, minimalistic instance server written in C. Again, this version has been possible thanks to the very valuable help from great people. It includes the following changes:

                                                                  Added support for subscribing to LitePub (Pleroma-style) Fediverse Relays like e.g. https://fedi-relay.gyptazy.com to improve federation. See snac(8) (the Administrator Manual) for more information on how to use this feature.

                                                                  Added support for following hashtags. This is only useful if your instance is subscribed to relays (see above).

                                                                  Added support for a Mastodon-like /authorize_interaction webpoint entry, that allows following, liking and boosting from another account's Mastodon public web interface. To be able to use it, you must reconfigure your https proxy to redirect /authorize_interaction to snac (see snac(8)).

                                                                  Some fixes to accept Event objects properly (like those coming from implementations like https://gancio.org/ or https://mobilizon.fr).

                                                                  Added some caching for local Actor objects.

                                                                  Hashtags that are not explicitly linked in a post's content are shown below it.

                                                                  Fixed broken NetBSD build (missing dependency in Makefile.NetBSD).

                                                                  The user profile can now include longitude and latitude data for your current location.

                                                                  Mastodon API: implemented limit= on notification fetches (contributed by nowster), implemented faster min_id handling (contributed by nowster), obey the quiet public visibility set for posts, other timeline improvements (contributed by nowster).

                                                                  Reduced RSA key size for new users from 4096 to 2048. This will be friendlier to smaller machines, and everybody else out there is using 2048.

                                                                  If the SNAC_BASEDIR environment variable is defined and set to the base directory of your installation, you don't have to include the base directory in the command line.

                                                                  Fixed a bug in the generation of the top page (contributed by an-im-dugud).

                                                                  Added support for Markdown headers and underlining (contributed by an-im-dugud).

                                                                  https://comam.es/what-is-snac

                                                                  If you find useful, please consider contributing via LiberaPay: https://liberapay.com/grunfink/

                                                                  This release has been inspired by the song Nine Hundred Miles by .

                                                                    2 ★ 0 ↺

                                                                    [?]Ángel » 🌐
                                                                    @angel@triptico.com

                                                                    Justine, to use it with you must use the Pleroma-style address (https://relay.infosec.exchange/actor)

                                                                    CC: @troed@sangberg.se

                                                                      Ángel boosted

                                                                      [?]FediMeteo » 🌐
                                                                      @admin@fedimeteo.com

                                                                      A big, huge thank you to @grunfink@comam.es, the creator of Snac.
                                                                      They are modifying the software based on the needs of FediMeteo – something amazing that shows the quality of the person involved.

                                                                      https://codeberg.org/grunfink/snac2


                                                                        [?]Stefano Marinelli » 🌐
                                                                        @stefano@mastodon.bsd.cafe

                                                                        Announcing FediMeteo – Weather in the Fediverse!

                                                                        UPDATE: I have created an account for updates and other information on FediMeteo - follow the account @admin to stay updated!

                                                                        UPDATE: Ireland, Poland, Portugal and Switzerland have just been added

                                                                        Weather has always influenced our lives: from agriculture to outdoor activities, to extreme events that, thanks to modern technology, can now be predicted with greater reliability. Personally, weather plays a significant role in my daily decisions, which is why I decided to create a service tailored for the Fediverse.

                                                                        FediMeteo uses Open-Meteo data to publish updates every 6 hours, including current weather conditions, forecasts for the next 12 hours, and predictions for the upcoming days. Each country is served by its own dedicated instance (e.g., it.fedimeteo.com for Italy), managed through snac to ensure simplicity and efficiency in publishing.

                                                                        You can follow FediMeteo directly in the Fediverse (on Mastodon and compatible platforms), via RSS, or by visiting the dedicated page for your city (e.g., fr.fedimeteo.com/paris).

                                                                        Currently supported countries include:
                                                                        Austria, Germany, France, Ireland, Italy, Netherlands, Poland, Portugal, Spain, Switzerland and the United Kingdom, – with many more regions coming soon!

                                                                        FediMeteo is hosted on a FreeBSD-based VPS, with each country isolated in its own jail to ensure security and scalability.

                                                                        Visit the main site to explore the national instances and start following your local weather updates today:
                                                                        fedimeteo.com

                                                                        Happy weather monitoring to all! 🌦️

                                                                        FediMeteo is dedicated to my grandfather, who every evening would give me the weather forecast based on TV, radio, and his personal experience. He would convince me that the weather would be bad, so he had an excuse to accompany me to school instead of me going alone.

                                                                          1 ★ 0 ↺

                                                                          [?]Ángel » 🌐
                                                                          @angel@triptico.com

                                                                          supports full text search (with regexes) on everything that is on your timeline, your posts and other's.

                                                                            Ángel boosted

                                                                            [?]Victor Moral ⁂ » 🌐
                                                                            @victor@taquiones.net

                                                                            Este fin de semana he dado de baja mi cuenta de Twitter. Llevaba con ella desde casi el principio aunque no he llegado a participar activamente; por un lado porque algunas de las cuentas eran tuitstars y no responden ni en broma. Por otro porque a veces no sabía qué decir y las pocas veces en las que sí lo decía el formato era corto para mantener discusiones.

                                                                            Más tarde me he dado cuenta de que empleando el correo electrónico las discusiones no tienen sentido y que más allá del duelo al amanecer no merece la pena discutir con gente que se ha construido un personaje público y saca sus garbanzos de ahí. Entre eso y los palmeros, a los que el tuitstar SÍ responde por que necesita tenerles en cuenta, es difícil estar a gusto; de hecho el término "pocosfollower" es el indicativo de una época.

                                                                            Pero sí que he pasado mucho tiempo allí obteniendo enlaces y enterándome de polémicas para pasar el rato y olvidar cómo estoy y quién soy así que tampoco es que lo haya dejado hasta el sábado. Una vez que tengo mi servidor en el fediverso (con ) tengo siempre un lugar que considero mío. Por esa parte estoy cubierto.

                                                                            Ahora estoy intentando ver qué aparece en BlueSky y de momento están todos con una limpia tremenda de nazis y demás chusma que está funcionando al parecer. También cuentas estupendas que estaban permanentemente candadas en twitter ahora actúan en abierto y son una delicia de seguir. Pero el lugar sigue siendo extraño, como un barrio bajo asedio, y quiero ver dónde terminará cuando los dueños empiecen a monetizar.

                                                                              Ángel boosted

                                                                              [?]Stefano BSD Cafe (snac instance account) » 🌐
                                                                              @stesnac@snac.bsd.cafe

                                                                              I've just tried a new theme, Pika, on a test snac instance. And I like it!


                                                                                Ángel boosted

                                                                                [?]Justine Smithies [She / Her] » 🌐
                                                                                @justine@mastodon.bsd.cafe

                                                                                Right so my personal instance seems to be working ok and I have managed to import all of the accounts I follow here on bsd.cafe . I'll still be using this account but will try and see how I get on with snac. You may notice that it always shows that I have no followers and that I'm not following anyone. This is intentional by the author of as they feel numbers should not matter which is quite true. Feel free to follow me over there if you haven't already and hello to any new followers.
                                                                                @justine@snac.smithies.me.uk
                                                                                All of this is hosted in my on a server jail running over my home FTTP connection. I'm impressed I've gotten this far. Next I'll be doing some html and css customisation's to theme it a little.

                                                                                  Ángel boosted

                                                                                  [?]Justine Smithies [She / Her] » 🌐
                                                                                  @justine@mastodon.bsd.cafe

                                                                                  After getting to try the activity pub server developed by @grunfink on bsd.cafe thanks @stefano , I'm kind of tempted to spin up my own instance. Anyone here other than Stefano that runs their own instance ? Please share you pro's and con's plus any workarounds you have come up with.
                                                                                  Also how are you viewing / posting on mobile ? Are you just sticking with web or using the likes of ?

                                                                                  codeberg.org/grunfink/snac2

                                                                                    0 ★ 0 ↺

                                                                                    [?]Ángel » 🌐
                                                                                    @angel@triptico.com

                                                                                    [?]The Real Grunfink » 🌐
                                                                                    @grunfink@comam.es

                                                                                    So it seems that, now that Threads is federating, the most popular person in the fediverse is... Mark Zuckerberg:

                                                                                    https://mastodon.bsd.cafe/users/release_candidate/statuses/112140845317198247

                                                                                    I find these "popularity contests" pointless, ridiculous and inherently toxic, and a signature of private social networks where the goal is not to help people communicate between each other.

                                                                                    This is the reason why does not propagate how many followers nor likes a person have.

                                                                                      1 ★ 0 ↺

                                                                                      [?]Ángel » 🌐
                                                                                      @angel@triptico.com

                                                                                      AFAIK, @stefano@bsd.cafe runs both and fediverse instances in https://bsd.cafe , but for some reason the snac one is not announced there.

                                                                                        Ángel boosted

                                                                                        [?]Stefano BSD Cafe (snac instance account) » 🌐
                                                                                        @stesnac@snac.bsd.cafe

                                                                                        snac2 has reached version 2.44, which is stable and undoubtedly suitable for more comprehensive use.
                                                                                        In the coming days, I'll likely declare this instance as stable and include it in BSD Cafe's services. Plurality and choice are fundamental in a free world.