Hashtag

#web

1,090 posts tagged with this hashtag.

@frontenddogma@mas.to
@lobsters@mastodon.social
@pheonix@hachyderm.io

The current state of the web assumes that the reader is an adversary to be trapped and monetized.

When a news website forces you through three dismissive actions just to read a headline, they are burning your cognitive budget before delivering any value. You are greeted by a cookie banner taking up the bottom 30% of your screen, a "Subscribe!" modal dead center, an autoplaying video pinned to the corner and a prompt begging to send you push notifications.

I wrote about the state of news websites. Would love to hear your thoughts✨🙏

thatshubham.com/blog/news-audit

@d1@autistics.life

Which software ecosystems have you been brave and courageous enough **to abandon completely**? Check all that apply

Please boost for :blob_cat_heart:

  • Facebook 100%, account closed/nonexistent5 (14%)
  • Facebook 99%, account still open4 (11%)
  • Instagram 100%, account closed/nonexistent4 (11%)
  • Instagram 99%, account still open4 (11%)
  • WhatsApp 100%, account closed/nonexistent2 (6%)
  • WhatsApp 99%, account still open2 (6%)
  • LinkedIn 100%, account closed/nonexistent3 (9%)
  • LinkedIn 99%, account still open3 (9%)
  • Google App Store 100%, not even present1 (3%)
  • Google App Store 99%, Google account still open4 (11%)
  • Gmail 100%, account closed/nonexistent1 (3%)
  • Gmail 99%, account still open2 (6%)
@d1@autistics.life

Which software ecosystems have you been brave and courageous enough **to abandon completely**? Check all that apply

Please boost for :blob_cat_heart:

  • Facebook 100%, account closed/nonexistent5 (14%)
  • Facebook 99%, account still open4 (11%)
  • Instagram 100%, account closed/nonexistent4 (11%)
  • Instagram 99%, account still open4 (11%)
  • WhatsApp 100%, account closed/nonexistent2 (6%)
  • WhatsApp 99%, account still open2 (6%)
  • LinkedIn 100%, account closed/nonexistent3 (9%)
  • LinkedIn 99%, account still open3 (9%)
  • Google App Store 100%, not even present1 (3%)
  • Google App Store 99%, Google account still open4 (11%)
  • Gmail 100%, account closed/nonexistent1 (3%)
  • Gmail 99%, account still open2 (6%)
@d1@autistics.life

Which software ecosystems have you been brave and courageous enough **to abandon completely**? Check all that apply

Please boost for :blob_cat_heart:

  • Facebook 100%, account closed/nonexistent5 (14%)
  • Facebook 99%, account still open4 (11%)
  • Instagram 100%, account closed/nonexistent4 (11%)
  • Instagram 99%, account still open4 (11%)
  • WhatsApp 100%, account closed/nonexistent2 (6%)
  • WhatsApp 99%, account still open2 (6%)
  • LinkedIn 100%, account closed/nonexistent3 (9%)
  • LinkedIn 99%, account still open3 (9%)
  • Google App Store 100%, not even present1 (3%)
  • Google App Store 99%, Google account still open4 (11%)
  • Gmail 100%, account closed/nonexistent1 (3%)
  • Gmail 99%, account still open2 (6%)
@metin@graphics.social

If, like me, you love 1990s Web sites, back when the internet wasn't enshittified by Big Tech yet, have a look at Wiby, a Web 1.0 search engine.

Click on "Surprise me…" for random discoveries, often personal Web pages about obscure niche subjects, but sometimes you find a hidden gem…

wiby.org

wiby.org

Wiby - Search Engine for the Classic Web

Wiby is a search engine for older style pages, lightweight and based on a subject of interest. Building a web more reminiscent of the early internet.

@sethmlarson@mastodon.social
@sethmlarson@mastodon.social
@peterrenshaw@ioc.exchange

“If you don't want training themselves on your website, there's a new way to stop them that doesn't involve server-side blocking or praying they respect your instructions in robots.txt. A team of creatives have teamed up with a typography company to create a new type of font that’ll trick scrapers into ingesting poisoned gibberish.

Dubbed , the project almost seems like magic if you're not familiar with the ins and outs of computer fonts. Look at a page written using a ShieldFont font and it’ll appear exactly as one would expect: All the content words (the nouns, verbs, adjectives and adverbs that give a sentence meaning) are the same as the writer originally wrote”

I’m going to try this ☺️

/ / / / <theregister.com/ai-and-ml/2026>

<github.com/isaqueseneda/shield> (source)

<shieldfont.org/encoder> (demo)

shieldfont.org

ShieldFont

Publish for humans, not for crawlers. A web font that swaps the words in your HTML, so readers see your writing and AI training gets a stale copy.

@peterrenshaw@ioc.exchange

“If you don't want training themselves on your website, there's a new way to stop them that doesn't involve server-side blocking or praying they respect your instructions in robots.txt. A team of creatives have teamed up with a typography company to create a new type of font that’ll trick scrapers into ingesting poisoned gibberish.

Dubbed , the project almost seems like magic if you're not familiar with the ins and outs of computer fonts. Look at a page written using a ShieldFont font and it’ll appear exactly as one would expect: All the content words (the nouns, verbs, adjectives and adverbs that give a sentence meaning) are the same as the writer originally wrote”

I’m going to try this ☺️

/ / / / <theregister.com/ai-and-ml/2026>

<github.com/isaqueseneda/shield> (source)

<shieldfont.org/encoder> (demo)

shieldfont.org

ShieldFont

Publish for humans, not for crawlers. A web font that swaps the words in your HTML, so readers see your writing and AI training gets a stale copy.

@aral@mastodon.ar.al

Hey folks, can you help me out with a little something: trying to come up with a good number of files limit for a file scan (for Kitten so you don’t hit heap memory limits if you run it from the wrong directory by mistake) and I’d love some statistics from real JavaScript/TypeScript Node.js projects of the number of files in them (excluding .git and node_modules).

Would you be kind enough to run the following command in Terminal in your largest projects and let me know what number your get (along with a short description of the project):

find . \( -name "node_modules" -o -name ".git" \) -prune -o -print | wc -l

Thank you :)

@lobsters@mastodon.social
@RootMoose@mastodon.bsd.cafe

Thinking about a new domain+project...

Anyone have the TL;DR; on self hosted fediverse software?

Mastodon vs Snac vs Pleroma vs ?

I'm looking for something that is super low maintenance and lightweight / easy on resources but as full featured as practical within those constraints.

Something easy to tune re: post lengths and media types would be cool too. A "text first" platform is desired.

I've run Mastodon in the past and it's like fishing with nukes for this use case.

What's out there?

@RootMoose@mastodon.bsd.cafe

Thinking about a new domain+project...

Anyone have the TL;DR; on self hosted fediverse software?

Mastodon vs Snac vs Pleroma vs ?

I'm looking for something that is super low maintenance and lightweight / easy on resources but as full featured as practical within those constraints.

Something easy to tune re: post lengths and media types would be cool too. A "text first" platform is desired.

I've run Mastodon in the past and it's like fishing with nukes for this use case.

What's out there?

@RootMoose@mastodon.bsd.cafe

Thinking about a new domain+project...

Anyone have the TL;DR; on self hosted fediverse software?

Mastodon vs Snac vs Pleroma vs ?

I'm looking for something that is super low maintenance and lightweight / easy on resources but as full featured as practical within those constraints.

Something easy to tune re: post lengths and media types would be cool too. A "text first" platform is desired.

I've run Mastodon in the past and it's like fishing with nukes for this use case.

What's out there?

@mro@digitalcourage.social · Reply to Wincent Balin

Hi @wincent @lualang
I'm not familiar with s packaging - so you think e.g. downloads.openwrt.org/releases may have it. But it's not a .tar.gz - how can I unpack it's content?

I think of s starting with tiny ones like mro.name/g/u28br or qr.mro.name, ranging over mro.name/radio-privatkopie up to maybe even seppo.mro.name/development. Most of codeberg.org/explore/repos?q=r
On self-hosted s as well as shared hosting.

They should be able to survive several decades untouched and still allow tweaks without maintaining a toolchain.

codeberg.org

Cookie monster!

@nick@sloan.host

Hey gang, I'm looking for a new full-time role for the first time since… I think 2012?

I've been building software for more than 20 years, I have deep experience with a variety of languages and platforms, and I've led multiple successful engineering teams.

I'm open to remote work, or in-person local to Pittsburgh, PA.

I appreciate any boosts you're willing to give.

@nick@sloan.host

Hey gang, I'm looking for a new full-time role for the first time since… I think 2012?

I've been building software for more than 20 years, I have deep experience with a variety of languages and platforms, and I've led multiple successful engineering teams.

I'm open to remote work, or in-person local to Pittsburgh, PA.

I appreciate any boosts you're willing to give.

@nick@sloan.host

Hey gang, I'm looking for a new full-time role for the first time since… I think 2012?

I've been building software for more than 20 years, I have deep experience with a variety of languages and platforms, and I've led multiple successful engineering teams.

I'm open to remote work, or in-person local to Pittsburgh, PA.

I appreciate any boosts you're willing to give.

@nick@sloan.host

Hey gang, I'm looking for a new full-time role for the first time since… I think 2012?

I've been building software for more than 20 years, I have deep experience with a variety of languages and platforms, and I've led multiple successful engineering teams.

I'm open to remote work, or in-person local to Pittsburgh, PA.

I appreciate any boosts you're willing to give.

@mro@digitalcourage.social · Reply to Plinubius

Hi @plinubius,
gleich und gleich gesellt sich gern - große Strukturen mögen (und verstehen) andere große Strukturen. Die sind gegenseitig sozialisiert und fluktuieren horizontal durch die Abteilungen. Und das hat keine. Hm.

Die könnte ein sein. Lokale Timelines, Hashtags. Stichwort - (jaja, ländlicher Raum) und , .
Zum Anschub muß aber eine Henne ein Ei legen. A la Bonn.social

bonn.social

Bonn.social

Bonn.social ist ein Mastodon-Instanz für Bonn, Rhein-Sieg und für alle, die Bonn und die Region mögen. ❤️

@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@frontenddogma@mas.to
@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@lobsters@mastodon.social
@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@dan@m.danq.me

Fucking "app culture" drives me crazy. I got asked to install a mobile app just to look at the itinerary and accommodation information for a trip I'm going on.

Why isn't it just a web page?

So obviously I said "fuck that noise, hold my beer", reverse-engineered the app, and re-implemented it as a web page generator. It does all the same things as the "app" except now there's no tracking, no ads, and you get all the Web's features "for free" (deep links, copy-pasting, search-in-page, printing, works on anything, etc.).

Here's the full story:
🔗 danq.me/your-app-could-have-be

danq.me

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

I was asked to install a mobile app to get access to the itinerary of a trip to Disneyland I'm taking with the kids. Fuck that noise: couldn't it have just been a Web page? An hour of reverse-engineering later, it is, and it's superior in virtually every way to the "app" that it replaces.

@dan@m.danq.me

Fucking "app culture" drives me crazy. I got asked to install a mobile app just to look at the itinerary and accommodation information for a trip I'm going on.

Why isn't it just a web page?

So obviously I said "fuck that noise, hold my beer", reverse-engineered the app, and re-implemented it as a web page generator. It does all the same things as the "app" except now there's no tracking, no ads, and you get all the Web's features "for free" (deep links, copy-pasting, search-in-page, printing, works on anything, etc.).

Here's the full story:
🔗 danq.me/your-app-could-have-be

danq.me

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

I was asked to install a mobile app to get access to the itinerary of a trip to Disneyland I'm taking with the kids. Fuck that noise: couldn't it have just been a Web page? An hour of reverse-engineering later, it is, and it's superior in virtually every way to the "app" that it replaces.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@dan@m.danq.me

Fucking "app culture" drives me crazy. I got asked to install a mobile app just to look at the itinerary and accommodation information for a trip I'm going on.

Why isn't it just a web page?

So obviously I said "fuck that noise, hold my beer", reverse-engineered the app, and re-implemented it as a web page generator. It does all the same things as the "app" except now there's no tracking, no ads, and you get all the Web's features "for free" (deep links, copy-pasting, search-in-page, printing, works on anything, etc.).

Here's the full story:
🔗 danq.me/your-app-could-have-be

danq.me

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

I was asked to install a mobile app to get access to the itinerary of a trip to Disneyland I'm taking with the kids. Fuck that noise: couldn't it have just been a Web page? An hour of reverse-engineering later, it is, and it's superior in virtually every way to the "app" that it replaces.

@dan@m.danq.me

Fucking "app culture" drives me crazy. I got asked to install a mobile app just to look at the itinerary and accommodation information for a trip I'm going on.

Why isn't it just a web page?

So obviously I said "fuck that noise, hold my beer", reverse-engineered the app, and re-implemented it as a web page generator. It does all the same things as the "app" except now there's no tracking, no ads, and you get all the Web's features "for free" (deep links, copy-pasting, search-in-page, printing, works on anything, etc.).

Here's the full story:
🔗 danq.me/your-app-could-have-be

danq.me

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

I was asked to install a mobile app to get access to the itinerary of a trip to Disneyland I'm taking with the kids. Fuck that noise: couldn't it have just been a Web page? An hour of reverse-engineering later, it is, and it's superior in virtually every way to the "app" that it replaces.

@blog@m.danq.me
Article: Your 'App' Could Have Been a Webpage (so I fixed it for you...)
@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@dan@m.danq.me

Fucking "app culture" drives me crazy. I got asked to install a mobile app just to look at the itinerary and accommodation information for a trip I'm going on.

Why isn't it just a web page?

So obviously I said "fuck that noise, hold my beer", reverse-engineered the app, and re-implemented it as a web page generator. It does all the same things as the "app" except now there's no tracking, no ads, and you get all the Web's features "for free" (deep links, copy-pasting, search-in-page, printing, works on anything, etc.).

Here's the full story:
🔗 danq.me/your-app-could-have-be

danq.me

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

I was asked to install a mobile app to get access to the itinerary of a trip to Disneyland I'm taking with the kids. Fuck that noise: couldn't it have just been a Web page? An hour of reverse-engineering later, it is, and it's superior in virtually every way to the "app" that it replaces.

@blog@m.danq.me
Article: Your 'App' Could Have Been a Webpage (so I fixed it for you...)
@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@hongminhee@hollo.social

One thing I keep coming back to when comparing and AT Protocol: ActivityPub is basically a convention on top of the stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the , and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

@lobsters@mastodon.social
@lobsters@mastodon.social
@frontenddogma@mas.to

«SSL-Automation — Drei Risiken der 200-Tage-Regel:
Am 1. Okt. 2026 laufen die ersten SSL-Zertifikate mit der neuen Maximallaufzeit von 200 Tagen aus. Damit endet eine zwanzigjährige Routine, in der ein Zertifikat einmal jährlich erneuert werden musste.
[…] 200 Tage seit März 2026, 100 Tage ab März 2027, 47 Tage ab März 2029. […]»

Mal sehen was da auf uns zu kommt. Ich befürworte es und behaupte, dass dies sich zum größeren Teil automatisieren lässt.

🔐 it-daily.net/it-sicherheit/clo

it-daily.net

SSL-Automation: Drei Risiken der 200-Tage-Regel

Am 1. Oktober 2026 laufen die ersten SSL-Zertifikate mit der neuen Maximallaufzeit von 200 Tagen aus.

@lobsters@mastodon.social
@helloyanis@furries.club

Today, youtuber dzuma made a video about my age verification bypass browser extension.

And since then, I've got a nonstop influx of people downloading the add-on, and it became the mosr starred one on my GitHub in just a matter of hours!

So, thanks a lot!! Glad I'm not the only one who's annoyed by this!

The video :
youtube.com/watch?v=VBL76_0jD8k

The extension :
github.com/helloyanis/age-veri

github.com

GitHub - helloyanis/age-verification-bypass: Extension to bypass age verification on some websites

Extension to bypass age verification on some websites - helloyanis/age-verification-bypass

@helloyanis@furries.club

Today, youtuber dzuma made a video about my age verification bypass browser extension.

And since then, I've got a nonstop influx of people downloading the add-on, and it became the mosr starred one on my GitHub in just a matter of hours!

So, thanks a lot!! Glad I'm not the only one who's annoyed by this!

The video :
youtube.com/watch?v=VBL76_0jD8k

The extension :
github.com/helloyanis/age-veri

github.com

GitHub - helloyanis/age-verification-bypass: Extension to bypass age verification on some websites

Extension to bypass age verification on some websites - helloyanis/age-verification-bypass

@helloyanis@furries.club

Today, youtuber dzuma made a video about my age verification bypass browser extension.

And since then, I've got a nonstop influx of people downloading the add-on, and it became the mosr starred one on my GitHub in just a matter of hours!

So, thanks a lot!! Glad I'm not the only one who's annoyed by this!

The video :
youtube.com/watch?v=VBL76_0jD8k

The extension :
github.com/helloyanis/age-veri

github.com

GitHub - helloyanis/age-verification-bypass: Extension to bypass age verification on some websites

Extension to bypass age verification on some websites - helloyanis/age-verification-bypass

@helloyanis@furries.club

Today, youtuber dzuma made a video about my age verification bypass browser extension.

And since then, I've got a nonstop influx of people downloading the add-on, and it became the mosr starred one on my GitHub in just a matter of hours!

So, thanks a lot!! Glad I'm not the only one who's annoyed by this!

The video :
youtube.com/watch?v=VBL76_0jD8k

The extension :
github.com/helloyanis/age-veri

github.com

GitHub - helloyanis/age-verification-bypass: Extension to bypass age verification on some websites

Extension to bypass age verification on some websites - helloyanis/age-verification-bypass

@lobsters@mastodon.social

Lemmy Development Update June 2026 and 1.0.0-beta.1 lobste.rs/s/p7z8ip
lemmy.ml/post/49561214

lemmy.ml

Lemmy Development Update June 2026 and 1.0.0-beta.1 - Lemmy

Last month we fixed a lot of the problems that were reported so far during 1.0 Beta Testing [https://join-lemmy.org/news/2026-05-19_-_Open_beta_testing_for_Lemmy_1.0.0]. These fixes are released in a new version 1.0.0-beta.1. Please continue testing on voyager.lemmy.ml [http://voyager.lemmy.ml] and reporting problems. Edit: Note the Lemmy backend version 1.0.0-beta.1 is still building [https://woodpecker.join-lemmy.org/repos/129/pipeline/20977/1], and will take about 12 hours to complete. In the upcoming months, as app devs continue to give feedback on the Lemmy 1.0 API, we’ll be tweaking it as necessary. We’ll also be working on lemmy-ui and jerboa. You can follow our development progress with these milestone links: - https://github.com/LemmyNet/lemmy/milestone/24 [https://github.com/LemmyNet/lemmy/milestone/24] - https://github.com/LemmyNet/lemmy-ui/milestone/5 [https://github.com/LemmyNet/lemmy-ui/milestone/5] - https://github.com/LemmyNet/jerboa/milestone/1 [https://github.com/LemmyNet/jerboa/milestone/1] Here are all the changes from June: ::: spoiler Full list of changes by repo ## lemmy - Handle accept activity with object id (fixes 6595) [https://github.com/LemmyNet/lemmy/pull/6596] by @Nutomic - Adding community moderators to GetPost [https://github.com/LemmyNet/lemmy/pull/6593] by @dessalines - Update activity count of dead communities (fixes #5794) [https://github.com/LemmyNet/lemmy/pull/6589] by @w-k-s - Adds additional attachments to end of post (fixes #6229) [https://github.com/LemmyNet/lemmy/pull/6585] by @w-k-s - Federate warnings (fixes #6326) [https://github.com/LemmyNet/lemmy/pull/6582] by @Nutomic - Fix for private community accept federation (fixes #6576) [https://github.com/LemmyNet/lemmy/pull/6580] by @Nutomic - Remove duplicate schema entry [https://github.com/LemmyNet/lemmy/pull/6579] by @Nutomic - Auto-approve private comm follows for admins/mods [https://github.com/LemmyNet/lemmy/pull/6578] by @Nutomic - Add child_count to modlog, used for bulk_action_parents. [https://github.com/LemmyNet/lemmy/pull/6569] by @dessalines - In nginx config use $remote_addr [https://github.com/LemmyNet/lemmy/pull/6575] by @Nutomic - Include your own private messages when using creator_id filter. [https://github.com/LemmyNet/lemmy/pull/6572] by @dessalines - Feature flag for plugins [https://github.com/LemmyNet/lemmy/pull/6570] by @Nutomic - Splitting out show_media and hide_posts_with_media user settings. [https://github.com/LemmyNet/lemmy/pull/6566] by @dessalines - Use correct Activitypub id for private community follow Accept/Reject (fixes #6561) [https://github.com/LemmyNet/lemmy/pull/6562] by @Nutomic - Adding post filtering by tag. [https://github.com/LemmyNet/lemmy/pull/6567] by @dessalines - Add missing permission checks for private community (fixes #6529) [https://github.com/LemmyNet/lemmy/pull/6559] by @Nutomic - Federate private message reports (fixes #4436) [https://github.com/LemmyNet/lemmy/pull/6557] by @Nutomic - Remove wrong community title check [https://github.com/LemmyNet/lemmy/pull/6558] by @Nutomic - Adding a few lemmy_api_common exports needed for lemmy-rs-client. [https://github.com/LemmyNet/lemmy/pull/6551] by @dessalines - Prevent user enumeration via login endpoint [https://github.com/LemmyNet/lemmy/pull/6531] by @Nutomic - Dont show community mods in pending follows list (fixes #6549) [https://github.com/LemmyNet/lemmy/pull/6556] by @Nutomic - Truncate federation displayname if too long [https://github.com/LemmyNet/lemmy/pull/6544] by @Nutomic - Reduce actor name min length to 2, make community.title optional (fixes #6509) [https://github.com/LemmyNet/lemmy/pull/6548] by @Nutomic ## lemmy-ui - Revert “Update babel monorepo to v8” [https://github.com/LemmyNet/lemmy-ui/pull/4267] by @dessalines - Showing community moderators on post page. [https://github.com/LemmyNet/lemmy-ui/pull/4253] by @dessalines - Adding stacked mobile tables [https://github.com/LemmyNet/lemmy-ui/pull/4228] by @dessalines - Fix mod / admin being able to comment on locked comment. [https://github.com/LemmyNet/lemmy-ui/pull/4243] by @dessalines - Fix private community visibility check [https://github.com/LemmyNet/lemmy-ui/pull/4227] by @Nutomic - Reduce actor name min length to 2, make community title optional [https://github.com/LemmyNet/lemmy-ui/pull/4192] by @Nutomic - Adding ability to filter community page by tag dropdown filter. [https://github.com/LemmyNet/lemmy-ui/pull/4217] by @dessalines - Adding hide memes filter to home and community pages. [https://github.com/LemmyNet/lemmy-ui/pull/4215] by @dessalines - Hide notification icons without unread items on desktop (fixes #4205) [https://github.com/LemmyNet/lemmy-ui/pull/4207] by @Nutomic - Add community context to pending follows list. [https://github.com/LemmyNet/lemmy-ui/pull/4218] by @dessalines - Fix clipping in iOS Safari [https://github.com/LemmyNet/lemmy-ui/pull/4221] by @Trying2KnowMyself - Add OAuth preset for Reddit (fixes #4124) [https://github.com/LemmyNet/lemmy-ui/pull/4134] by @Nutomic - Show children for modlog items (fixes #4103) [https://github.com/LemmyNet/lemmy-ui/pull/4209] by @Nutomic - Stricter CSP without style-src unsafe-inline [https://github.com/LemmyNet/lemmy-ui/pull/4214] by @Nutomic - Make community title optional, reduce min actor name length [https://github.com/LemmyNet/lemmy-ui/pull/4206] by @Nutomic - Fixing filter chip wrong background. [https://github.com/LemmyNet/lemmy-ui/pull/4212] by @dessalines - Post / Comment listing fixes [https://github.com/LemmyNet/lemmy-ui/pull/4181] by @dessalines - Change large card view to use full width [https://github.com/LemmyNet/lemmy-ui/pull/4110] by @Nutomic - Swap library for markdown media embeds [https://github.com/LemmyNet/lemmy-ui/pull/4210] by @Nutomic - Fixing a few typos [https://github.com/LemmyNet/lemmy-ui/pull/4208] by @dessalines - Community tag colors [https://github.com/LemmyNet/lemmy-ui/pull/4173] by @dessalines - Fixing empty body by not ignoring initialContent. [https://github.com/LemmyNet/lemmy-ui/pull/4193] by @dessalines - Allow approve (after an accidental deny) to a private community. [https://github.com/LemmyNet/lemmy-ui/pull/4194] by @dessalines - Notification display fixes [https://github.com/LemmyNet/lemmy-ui/pull/4179] by @dessalines ## joinlemmy-site - apps: default desktop visitors to web clients [https://github.com/LemmyNet/joinlemmy-site/pull/623] by @aeharding - Add 0.19.19 release notes [https://github.com/LemmyNet/joinlemmy-site/pull/621] by @dessalines - Adding codeowners [https://github.com/LemmyNet/joinlemmy-site/pull/622] by @dessalines ## lemmy-js-client - Modlist with get post [https://github.com/LemmyNet/lemmy-js-client/pull/999] by @dessalines - Fixing tsoa build [https://github.com/LemmyNet/lemmy-js-client/pull/986] by @dessalines - Add tag_id to GetPosts [https://github.com/LemmyNet/lemmy-js-client/pull/981] by @dessalines - Split show media settings. [https://github.com/LemmyNet/lemmy-js-client/pull/978] by @dessalines - Add child_count to modlog, used for bulk_action_parents [https://github.com/LemmyNet/lemmy-js-client/pull/980] by @Nutomic - Fix request state [https://github.com/LemmyNet/lemmy-js-client/pull/979] by @dessalines - API docs without RequestState [https://github.com/LemmyNet/lemmy-js-client/pull/977] by @Nutomic - Make community.title optional [https://github.com/LemmyNet/lemmy-js-client/pull/976] by @Nutomic ## lemmy-client-rs - Adding release script [https://github.com/LemmyNet/lemmy-client-rs/pull/78] by @dessalines - Use a versioned lemmy_api_common [https://github.com/LemmyNet/lemmy-client-rs/pull/77] by @dessalines - Swap out cargo machete in favor of cargo shear [https://github.com/LemmyNet/lemmy-client-rs/pull/76] by @dessalines ::: Or see the full list of changes at the links below: - Backend [https://github.com/LemmyNet/lemmy/pulls?q=merged%3A2026-06-01..2026-06-30+sort%3Acomments-desc] - Frontend [https://github.com/LemmyNet/lemmy-ui/pulls?q=merged%3A2026-06-01..2026-06-30+-author%3Aapp%2Frenovate+sort%3Acomments-desc] - join-lemmy.org [https://github.com/LemmyNet/joinlemmy-site/pulls?q=merged%3A2026-06-01..2026-06-30+-author%3Aapp%2Frenovate+sort%3Acomments-desc] - Jerboa [https://github.com/LemmyNet/jerboa/pulls?q=merged%3A2026-06-01..2026-06-30+-author%3Aapp%2Frenovate+sort%3Acomments-desc] — An open source project the size of Lemmy needs constant work to manage the project, implement new features and fix bugs. Dessalines and Nutomic work full-time on these tasks and more. As there is no advertising or tracking, all of our work is funded through donations. Even so there is barely enough time in the day, and no time for a second job. The only available option are user donations. To keep it viable donations need to reach a minimum of 5000€ per month, resulting in a modest salary of 2500€ per developer. If that goal is reached we can stop worrying about money, and fully focus on improving the software for the benefit of all users and instances. We especially rely on recurring donations to secure the long-term development and make Lemmy the best it can be. Donate [https://join-lemmy.org/donate]

@helloyanis@furries.club

Today, youtuber dzuma made a video about my age verification bypass browser extension.

And since then, I've got a nonstop influx of people downloading the add-on, and it became the mosr starred one on my GitHub in just a matter of hours!

So, thanks a lot!! Glad I'm not the only one who's annoyed by this!

The video :
youtube.com/watch?v=VBL76_0jD8k

The extension :
github.com/helloyanis/age-veri

github.com

GitHub - helloyanis/age-verification-bypass: Extension to bypass age verification on some websites

Extension to bypass age verification on some websites - helloyanis/age-verification-bypass

@lobsters@mastodon.social
@grumpyoldtechie@hostux.social

The curse of AI bots.
I’m coming across way too many broken Cloudflare turnstile and Anubis installations.
If you want to block bots make sure you don’t block humans as well. The bots won’t, but the humans will go somewhere else.

A cartoon character with brown hair and a nurse's cap holds a stop sign and looks concerned. The text above her says "Oh noes!" and below, it says “Internal Server Error: administrator has misconfigured Anubis. Please contact the administrator and ask them to look for the logs around: fast.”
ALT text

A cartoon character with brown hair and a nurse's cap holds a stop sign and looks concerned. The text above her says "Oh noes!" and below, it says “Internal Server Error: administrator has misconfigured Anubis. Please contact the administrator and ask them to look for the logs around: fast.”

@grumpyoldtechie@hostux.social

The curse of AI bots.
I’m coming across way too many broken Cloudflare turnstile and Anubis installations.
If you want to block bots make sure you don’t block humans as well. The bots won’t, but the humans will go somewhere else.

A cartoon character with brown hair and a nurse's cap holds a stop sign and looks concerned. The text above her says "Oh noes!" and below, it says “Internal Server Error: administrator has misconfigured Anubis. Please contact the administrator and ask them to look for the logs around: fast.”
ALT text

A cartoon character with brown hair and a nurse's cap holds a stop sign and looks concerned. The text above her says "Oh noes!" and below, it says “Internal Server Error: administrator has misconfigured Anubis. Please contact the administrator and ask them to look for the logs around: fast.”

@lobsters@mastodon.social
@pawelgrzybek@mastodon.social

Look at this super short post by @matuzo

matuzo.at/blog/2026/select-fie

Literally 23 seconds read and you can learn a thing. I love this kind of web! Give me more useful web tips like this.

Kinda related as it highlights the kind of web I don't want to see:noslopgrenade.com

noslopgrenade.com

no slop grenade

Stop throwing AI-generated walls of text into conversations. If they wanted an AI essay, they would have asked ChatGPT themselves.

@lobsters@mastodon.social
@JanMiksovsky@fosstodon.org

This week's comic: Making your complete site content public

More about JSON Keys protocol: weborigami.org/async-tree/json
HTML comic: weborigami.org/comics/making-y

The protocol is simple and independent of the Web Origami project.
Everyone benefits from an open web!

The web's View Source command taught HTML to a generation! But it only lets you see one page.
ALT text

The web's View Source command taught HTML to a generation! But it only lets you see one page.

The simple JSON Keys protocol lets you tell the world what's on your site in a way that's easy to view.
ALT text

The simple JSON Keys protocol lets you tell the world what's on your site in a way that's easy to view.

For any given route, type or generate a .keys.json file as an array of the names that extend that route.
ALT text

For any given route, type or generate a .keys.json file as an array of the names that extend that route.

This lets people see part or all of your site, including downloading it!
ALT text

This lets people see part or all of your site, including downloading it!

@JanMiksovsky@fosstodon.org

This week's comic: Making your complete site content public

More about JSON Keys protocol: weborigami.org/async-tree/json
HTML comic: weborigami.org/comics/making-y

The protocol is simple and independent of the Web Origami project.
Everyone benefits from an open web!

The web's View Source command taught HTML to a generation! But it only lets you see one page.
ALT text

The web's View Source command taught HTML to a generation! But it only lets you see one page.

The simple JSON Keys protocol lets you tell the world what's on your site in a way that's easy to view.
ALT text

The simple JSON Keys protocol lets you tell the world what's on your site in a way that's easy to view.

For any given route, type or generate a .keys.json file as an array of the names that extend that route.
ALT text

For any given route, type or generate a .keys.json file as an array of the names that extend that route.

This lets people see part or all of your site, including downloading it!
ALT text

This lets people see part or all of your site, including downloading it!

@metin@graphics.social
Meme, showing a continuous circle of data breach messages from corporations…

Ahaha you're not gonna believe this but we had a bit of a data breach.

Your data is probably for sale online now.

That means someone could easily impersonate you.

Going forward we're gonna need more of your data to make sure its you.
ALT text

Meme, showing a continuous circle of data breach messages from corporations… Ahaha you're not gonna believe this but we had a bit of a data breach. Your data is probably for sale online now. That means someone could easily impersonate you. Going forward we're gonna need more of your data to make sure its you.

@metin@graphics.social
Meme, showing a continuous circle of data breach messages from corporations…

Ahaha you're not gonna believe this but we had a bit of a data breach.

Your data is probably for sale online now.

That means someone could easily impersonate you.

Going forward we're gonna need more of your data to make sure its you.
ALT text

Meme, showing a continuous circle of data breach messages from corporations… Ahaha you're not gonna believe this but we had a bit of a data breach. Your data is probably for sale online now. That means someone could easily impersonate you. Going forward we're gonna need more of your data to make sure its you.

@metin@graphics.social
Meme, showing a continuous circle of data breach messages from corporations…

Ahaha you're not gonna believe this but we had a bit of a data breach.

Your data is probably for sale online now.

That means someone could easily impersonate you.

Going forward we're gonna need more of your data to make sure its you.
ALT text

Meme, showing a continuous circle of data breach messages from corporations… Ahaha you're not gonna believe this but we had a bit of a data breach. Your data is probably for sale online now. That means someone could easily impersonate you. Going forward we're gonna need more of your data to make sure its you.

@blog@shkspr.mobi

The unreasonable effectiveness of simple HTML

shkspr.mobi/blog/2021/01/the-u

I've told this story at conferences - but due to the general situation I thought I'd retell it here.

A few years ago I was doing policy research in a housing benefits office in London. They are singularly unlovely places. The walls are brightened up with posters offering helpful services for people fleeing domestic violence. The security guards on the door are cautiously indifferent to anyone walking in. The air is filled with tense conversations between partners - drowned out by the noise of screaming kids.

In the middle, a young woman sits on a hard plastic chair. She is surrounded by canvas-bags containing her worldly possessions. She doesn't look like she is in a great emotional place right now. Clutched in her hands is a games console - a PlayStation Portable. She stares at it intensely; blocking out the world with Candy Crush.

Or, at least, that's what I thought.

Walking behind her, I glance at her console and recognise the screen she's on. She's connected to the complementary WiFi and is browsing the GOV.UK pages on Housing Benefit. She's not slicing fruit; she's arming herself with knowledge.

The PSP's web browser is - charitably - pathetic. It is slow, frequently runs out of memory, and can only open 3 tabs at a time.

But the GOV.UK pages are written in simple HTML. They are designed to be lightweight and will work even on rubbish browsers. They have to. This is for everyone.

Not everyone has a big monitor, or a multi-core CPU burning through the teraflops, or a broadband connection.

The photographer Chase Jarvis coined the phrase "the best camera is the one that’s with you". He meant that having a crappy instamatic with you at an important moment is better than having the best camera in the world locked up in your car.

The same is true of web browsers. If you have a smart TV, it probably has a crappy browser.

Twitter's guest mode displayed on a TV.

My old car had a built-in crappy web browser.

The dashboard of a BMW i3 - there is a web browser on the central display.

Both are painful to use - but they work!

If your laptop and phone both got stolen - how easily could you conduct online life through the worst browser you have? If you have to file an insurance claim online - will you get sent a simple HTML form to fill in, or a DOCX which won't render?

What vital information or services are forbidden to you due to being trapped in PDFs or horrendously complicated web sites?

Are you developing public services? Or a system that people might access when they're in desperate need of help? Plain HTML works. A small bit of simple CSS will make look decent. JavaScript is probably unnecessary - but can be used to progressively enhance stuff. Add alt text to images so people paying per MB can understand what the images are for (and, you know, accessibility).

Go sit in an uncomfortable chair, in an uncomfortable location, and stare at an uncomfortably small screen with an uncomfortably outdated web browser. How easy is it to use the websites you've created?

I chatted briefly to the young woman afterwards. She'd been kicked out by her parents and her friends had given her the bus fare to the housing benefits office. She had nothing but praise for how helpful the staff had been. I asked about the PSP - a hand-me-down from an older brother - and the web browser. Her reply was "It's shit. But it worked."

I think that's all we can strive for.


Here are some stats on games consoles visiting GOV.UK

TwitterReplying to @TheRealNooshuInterestingly we have 3,574 users visiting GOV.UK on games consoles:
• Xbox - 2,062
• Playstation 4 - 1,457
• Playstation Vita - 25
• Nintendo WiiU - 14
• Nintendo 3DS - 16

20/22

x.com

Matt Hobbs (@TheRealNooshu@hachyderm.io) (@TheRealNooshu) on X

Interestingly we have 3,574 users visiting https://t.co/CcU3PLPTpj on games consoles: • Xbox - 2,062 • Playstation 4 - 1,457 • Playstation Vita - 25 • Nintendo WiiU - 14 • Nintendo 3DS - 16 20/22

@tommi@pan.rent · Reply to Tommi 🤯

For the record, here are the other impulsive, spontaneous, unhinged research questions I came up with in 10 minutes of rapid brainstorming, last Wednesday.

  • How can decentralised, peer-to-peer, and encrypted communication protocols favour the development of autonomous and localised yet federated communities?
  • What concrete communication technologies can already be adopted to prepare for a post-climate collapse world?
  • How can practices of networking and collaboration benefit the re-population of rural areas?
  • What role did the neoliberal progression of tech oligopolies play in the de-politicisation of technology?
  • How can community-maintained infrastructure serve the needs of all the World’s population?

@tommi@pan.rent

Research question prophecy

I am far from actually beginning my research for the thesis I will be writing at @xpub next year. Still, together with my class we are already exploring interests, ideas, and PMOMMs. A pattern should be emerging out of them, outlining our research focus.

Yesterday, as I was chatting with @barbs, I somehow came up with a research question that feels particularly close to me. I am publishing it here for posterity, because I am super curious about how this will evolve over time.

What is the relationship between in-person networking and Web surfing in accruing social capital?

I want to investigate how life crossovers relate with clicking links and surfing the Web. Then, how do the two contribute to growing a person’s (or a community’s) social capital, in the interpretation of the word specific to Bourdieu’s philosophy?

en.wikipedia.org

Social capital - Wikipedia

@tommi@pan.rent · Reply to Tommi 🤯

For the record, here are the other impulsive, spontaneous, unhinged research questions I came up with in 10 minutes of rapid brainstorming, last Wednesday.

  • How can decentralised, peer-to-peer, and encrypted communication protocols favour the development of autonomous and localised yet federated communities?
  • What concrete communication technologies can already be adopted to prepare for a post-climate collapse world?
  • How can practices of networking and collaboration benefit the re-population of rural areas?
  • What role did the neoliberal progression of tech oligopolies play in the de-politicisation of technology?
  • How can community-maintained infrastructure serve the needs of all the World’s population?

@tommi@pan.rent

Research question prophecy

I am far from actually beginning my research for the thesis I will be writing at @xpub next year. Still, together with my class we are already exploring interests, ideas, and PMOMMs. A pattern should be emerging out of them, outlining our research focus.

Yesterday, as I was chatting with @barbs, I somehow came up with a research question that feels particularly close to me. I am publishing it here for posterity, because I am super curious about how this will evolve over time.

What is the relationship between in-person networking and Web surfing in accruing social capital?

I want to investigate how life crossovers relate with clicking links and surfing the Web. Then, how do the two contribute to growing a person’s (or a community’s) social capital, in the interpretation of the word specific to Bourdieu’s philosophy?

en.wikipedia.org

Social capital - Wikipedia

@lobsters@mastodon.social
@mxinden@mastodon.social

📅 Next Web Talks at Mozilla Berlin Meetup is happening Thu, June 11, 18:00 🦊

Two talks:
• Sunil Mayya on "Keep Off My LAN": Firefox's implementation of Local Network Access
@freddy on "The Devil is in the Defaults": defending against XSS with Trusted Types and the Sanitizer API

meetup.com/de-DE/berlin-mozill

meetup.com

Web talks at Mozilla, Do., 11. Juni 2026, 18:00 | Meetup

Save the date! The Mozilla Meetup series continues with talks focused on modern web technologies. To account for typical **no-show rates**, we’ve opened more RSVP spots th

@Edent@mastodon.social
@Edent@mastodon.social
@blog@shkspr.mobi

How many consecutive hyphens can you have in a domain name?

shkspr.mobi/blog/2026/06/how-m

A seemingly simple question which sent me down into the murky depths of standards. How many consecutive hyphens can you have in a domain name? It probably isn't sensible to name your online presence a----------hyphen.com - but is there anything technically stopping you?

History

Let's do some history!

This is 1978's "HOST NAMES ON-LINE". Early Internet standards described the - character as "minus" rather than hyphen.

RFC 608

up to 48 characters drawn from the alphabet (A-Z),

digits (0-9), and the minus sign (-) ... specifically, no blank or space characters allowed;

no distinction between upper and lower case letters;

the first character is a letter;

the last character is NOT a minus sign;

no other restrictions on content or syntax.

So, originally, you could have as many hyphens as you wanted after the first symbol - which had to be a letter. The last symbol had to be a letter or number0.

That was later formalised in 1981's "DoD INTERNET HOST TABLE SPECIFICATION"

RFC 810 GRAMMATICAL HOST TABLE SPECIFICATION

<name> ::= <let>[*[<let-or-digit-or-hyphen>]<let-or-digit>]

That's carried in the the slightly more modern RFC 952.

By the time we hit 1987, the word "minus" has gone. Note, there are no restrictions on the number of hyphens - just as long as your domain name doesn't start or end with one1.

RFC 1035 2.3.1. Preferred name syntax

The labels must follow the rules for ARPANET host names. They must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen.

By 1989, the "DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION" was tweaked again:

RFC 1123 2. GENERAL ISSUES

The syntax of a legal Internet host name was specified in RFC-952. One aspect of host name syntax is hereby changed: the restriction on the first character is relaxed to allow either a letter or a digit. Host software MUST support this more liberal syntax.

And, from then on, things stayed pretty stable until the futuristic year 2010. That was when Internationalised Domain Names (IDN) became available. They use the xn-- string at the start of the name so, the spec now says:

RFC 5891 4.2.3.1. Hyphen Restrictions

The Unicode string MUST NOT contain "--" (two consecutive hyphens) in the third and fourth character positions and MUST NOT start or end with a "-" (hyphen).

What they really mean is that "--" is banned in position 3 & 4 unless the first two characters are "xn"2.

So, in theory, you can have up to 59 consecutive hyphens by ensuring that they start in position 4 and end at position 62.

Something like abc---[…]---z.com should be fine.

OR IS IT?!?!?

TLD Restrictions

There's what the RFC's say, and what a Top Level Domain (TLD) will allow. The Registry (the organisation which administers the TLD) may set their own, more restrictive, policies. Some will ban naughty words, or refuse IDN registrations, or prevent impersonation of Public Suffix domain, etc.

For example, South Sudan's .ss policies refuse to allow any hyphens.

Nominet, who run the .uk Registry, don't have any restrictions on the use of hyphens other than refusing to register xn-- domains.

But, in general, you can register multi-hyphened domain names with most Registries.

List of domain names with many hyphens.

Anomalies

Of course, the mighty Internet mostly runs on spit and hope3. Naturally there are going to be mistakes, glitches, exceptions, and anomalies.

My delightful friend Q Misell had a rummage through her archives and helped track down some of the domain names which violate the modern rules. It's somewhat difficult to query every domain name, nevertheless, there are hundreds of multi-hyphened domains lurking within DNS.

Some, like ok--computer.com are long dead, but some are still active4!

Possibly the most consecutive hyphens belongs to http://a-------------------------------------------------------------a.com/

Sixty-one hyphens! The maximum possible, and it still works! The website looks like it hasn't been updated since it was first registered in 2000.

But what about more modern domains? The spookily named http://zz--icann-monitoring.uk/ was registered in 2024 - long after the rules were updated. But as Nominet doesn't allow xn-- domains, I guess it is fine?

There are some domains like bq--3bhauz7frjrgbka.com which look like they were pseudo-randomly generated. Perhaps as command-and-control servers?

Here's a quick table showing some of the ones Q found:

Domain Creation Date Status
0-------------------------------------------------------------0.com 1999 Down
0-------------------------------------------------------------5.com 2001 Live
0---------------------0.com 2000 Live
0----------------0.com 2000 Live
0---------0.com 2000 Live
pr--newswire.org.uk 2005 Down
0o--o0.com 2000 Down
a-----a.net 2000 Down
pr--newswire.uk 2019 Down
uk--domain--names.uk 2019 Live
zz--icann-monitoring.uk 2024 Live
cd--storage-shelves.co.uk 2012 Live
mb--uk.co.uk 2015 Live
o---t.co.uk 2016 Live
om--tat-sat.co.uk 1999 Live
pr--newswire.co.uk 2005 Down
uk--domain--names.co.uk 2000 Down
we--buy--any--car.co.uk 2009 Down
i---i.net 2001 Down
a-------------------------------------------------------------a.com 2000 Live
a---b.com 2000 Down
v---v.net 2000 Down
we--care.net 1999 Down
b---h.com 2001 Down
bq--3bhauz7frjrgbka.com 2000 Down
bq--3bhauz7frjrgbkdcia.com 2000 Down
bq--3cbpcty2rjyq.com 2000 Down
bq--744a.com 2000 Down
bq--abs7czi.com 2000 Down
bq--abxgt4lb.com 2000 Down
bq--azbukkckjavdc.com 2000 Down
bq--azdecny.com 2000 Live
bq--eh7xj73b75xp62x7mh7xgah7ad7xj73b75xa.com 2000 Down
bq--gbbpy2enmnhq.com 2000 Down
bq--gbtfs2a.com 2000 Down
bq--s7z76.com 2000 Down
bq--zzzz.com 2000 Down
c-------7.com 2001 Live
f---you.com 1998 Down
id--design.com 1999 Down
ok--computer.com 2001 Down
t---28.com 2000 Live
t---taz---t.com 2001 Down

Note, "Live" just means an HTTP request returned something. There may, of course, be other services running on that domain, or on subdomains.

So What?

Without a full list of every domain name, it's rather hard to draw firm conclusions. But, in the absence of anything better to do, here are some thoughts.

  • Most people don't want multiple consecutive hyphens in their domain names. They're unwieldy but mostly not prohibited.
  • If the authors of RFC 5891 had access to a full list of domains, might they have chosen a different syntax for Punycode?
  • Why is it so hard to look through every single registered domain name anyway? Even Certificate Logs no longer seem to be easily searchable.
  • Are there any other weird restrictions which are violated by older domain names?
  • When will DNS finally go all-in with Unicode rather than this kludge? (Probably around the same time as IPv6 adoption!)

If you know of any weird multi-hyphenated domains, please stick a comment in the box 😊


  1. Way back in the year 1999, several domains were registered with trailing hyphens. This was swiftly corrected and the domains deleted. ↩︎

  2. Note, I think this is when domain names expanded from 48 characters to 63. But that's a different Yak to Shave. ↩︎

  3. I wonder why this isn't zero-based like so many other computery things. But that's a different rabbit hole. ↩︎

  4. And, so I'm told, a cabal of vicious Furries waiting to pounce. ↩︎

  5. There are also quite a few for sale. ↩︎

@Em0nM4stodon@infosec.exchange

What do you miss the most about how the web was 10, 20, or 30 years ago? 🕸️✨

@Em0nM4stodon@infosec.exchange

What do you miss the most about how the web was 10, 20, or 30 years ago? 🕸️✨

@lobsters@mastodon.social
@BjornW@mastodon.social

Another shameless selfplug 😬

I will be hosting a workshop on Digital Independence at the 'Web You Want' conference on Wednesday June 10th in Amsterdam.

This event is organised by CMD Amsterdam, the school of design at the Amsterdam University of Applied Sciences

Free admission, but registration required.

More info:
the-web-you-want.org/?css=vasi

the-web-you-want.org

The web you want

A two day conference about the web, with some time to think between the two days. April 17, 2026, and June 10, 2026.

@BjornW@mastodon.social

Another shameless selfplug 😬

I will be hosting a workshop on Digital Independence at the 'Web You Want' conference on Wednesday June 10th in Amsterdam.

This event is organised by CMD Amsterdam, the school of design at the Amsterdam University of Applied Sciences

Free admission, but registration required.

More info:
the-web-you-want.org/?css=vasi

the-web-you-want.org

The web you want

A two day conference about the web, with some time to think between the two days. April 17, 2026, and June 10, 2026.

@lobsters@mastodon.social
@takmatsuoka@fedibird.com

『補助犬の話は、つい「犬を受け入れましょう」という話に見えてしまうことがあります。でも本質はそこではありません。補助犬を伴う人が、店に入り、移動し、サービスを利用し、社会の一員として当たり前に暮らすための話です。』

補助犬を「犬の話」で終わらせないために――A11y Tokyo Meetupで考えた人権とアクセシビリティ - Qiita qiita.com/tomokusaba/items/86e

qiita.com

補助犬を「犬の話」で終わらせないために――A11y Tokyo Meetupで考えた人権とアクセシビリティ - Qiita

はじめに A11y Tokyo Meetup の 4本足のパートナー“聴導犬”と考えるアクセシビリティ に参加しました。 補助犬という言葉自体は知っていましたし、盲導犬・介助犬・聴導犬がいることも頭では分かっていたつもりでした。ですが、実際に当事者の方の話を聞くと、私が理...

@lobsters@mastodon.social
@mxinden@mastodon.social

📅 Next Web Talks at Mozilla Berlin Meetup is happening Thu, June 11, 18:00 🦊

Two talks:
• Sunil Mayya on "Keep Off My LAN": Firefox's implementation of Local Network Access
@freddy on "The Devil is in the Defaults": defending against XSS with Trusted Types and the Sanitizer API

meetup.com/de-DE/berlin-mozill

meetup.com

Web talks at Mozilla, Do., 11. Juni 2026, 18:00 | Meetup

Save the date! The Mozilla Meetup series continues with talks focused on modern web technologies. To account for typical **no-show rates**, we’ve opened more RSVP spots th

@madeindex@mastodon.social

I wonder if the people at ever read their own announcements.

Literally explaining how they sold out and enshittified the "blue checkmark".

This also seem like yet another step towards mandatory on social media! (only to protect them kids & democratize the platforms of course 😉)

Screenshot of an X notification:
Update on X's blue checkmark
Following the European Commission's Decision of 5 December 2025, we must
explain the meaning of our blue checkmark and verification policies:
Premium accounts featuring the blue checkmark are not verified under
identity or authenticity criteria [highlighted in yellow](accounts verified based on an ID are labelled as "ID verified"). []
As you know, on 1 April 2023 we began winding down Twitter's legacy
verification program:
Previously, to receive the blue checkmark, [highlighted in yellow] accounts had to be authentic,
active, and deemed notable by Twitter staff [] (for more information on the
legacy policy, please click here).
Now, following the changes implemented to democratize the platform, the
blue checkmark has a different meaning and identifies accounts that have an
active subscription to X Premium/X Premium+ (including services such as
reply prioritization) and are complete, active, secure and non-deceptive,
regardless of perceived notability. X supports freedom of speech and does not endorse or validate the views expressed on accounts featuring checkmarks.
ALT text

Screenshot of an X notification: Update on X's blue checkmark Following the European Commission's Decision of 5 December 2025, we must explain the meaning of our blue checkmark and verification policies: Premium accounts featuring the blue checkmark are not verified under identity or authenticity criteria [highlighted in yellow](accounts verified based on an ID are labelled as "ID verified"). [] As you know, on 1 April 2023 we began winding down Twitter's legacy verification program: Previously, to receive the blue checkmark, [highlighted in yellow] accounts had to be authentic, active, and deemed notable by Twitter staff [] (for more information on the legacy policy, please click here). Now, following the changes implemented to democratize the platform, the blue checkmark has a different meaning and identifies accounts that have an active subscription to X Premium/X Premium+ (including services such as reply prioritization) and are complete, active, secure and non-deceptive, regardless of perceived notability. X supports freedom of speech and does not endorse or validate the views expressed on accounts featuring checkmarks.

@dweb@social.coop
@dweb@social.coop
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@anatudor@mastodon.social

Just noticed this little @codepen demo got featured:

codepen.io/thebabydino/pen/XJN

Detailed explanation for the how behind the mathy solution in this thread 👉 mastodon.social/@anatudor/1165

Animated GIF. Shows 4 rectangles with a 5:1 aspect ratio and an animated border glow going around the perimeter.

For the first rectangle, this is achieved by linearly animating a conic-gradient angle. Since the rectangle is very far from a 1:1 aspect ratio, the glow accelerates and stretches at the corners.

For the next two rectangles (one with no rounded corners and one with rounded corners), what's animated is the progress around the perimeter, then the conic gradient angle is computed from it, giving us a constant speed, constant length glow. This also allows for a pretty good approximation if we have not too big rounded corners.

For the final rectangle, we animate a linear gradient glow 4x, once along each edge. This does not work for rounded corners.
ALT text

Animated GIF. Shows 4 rectangles with a 5:1 aspect ratio and an animated border glow going around the perimeter. For the first rectangle, this is achieved by linearly animating a conic-gradient angle. Since the rectangle is very far from a 1:1 aspect ratio, the glow accelerates and stretches at the corners. For the next two rectangles (one with no rounded corners and one with rounded corners), what's animated is the progress around the perimeter, then the conic gradient angle is computed from it, giving us a constant speed, constant length glow. This also allows for a pretty good approximation if we have not too big rounded corners. For the final rectangle, we animate a linear gradient glow 4x, once along each edge. This does not work for rounded corners.

@anatudor@mastodon.social

Just noticed this little @codepen demo got featured:

codepen.io/thebabydino/pen/XJN

Detailed explanation for the how behind the mathy solution in this thread 👉 mastodon.social/@anatudor/1165

Animated GIF. Shows 4 rectangles with a 5:1 aspect ratio and an animated border glow going around the perimeter.

For the first rectangle, this is achieved by linearly animating a conic-gradient angle. Since the rectangle is very far from a 1:1 aspect ratio, the glow accelerates and stretches at the corners.

For the next two rectangles (one with no rounded corners and one with rounded corners), what's animated is the progress around the perimeter, then the conic gradient angle is computed from it, giving us a constant speed, constant length glow. This also allows for a pretty good approximation if we have not too big rounded corners.

For the final rectangle, we animate a linear gradient glow 4x, once along each edge. This does not work for rounded corners.
ALT text

Animated GIF. Shows 4 rectangles with a 5:1 aspect ratio and an animated border glow going around the perimeter. For the first rectangle, this is achieved by linearly animating a conic-gradient angle. Since the rectangle is very far from a 1:1 aspect ratio, the glow accelerates and stretches at the corners. For the next two rectangles (one with no rounded corners and one with rounded corners), what's animated is the progress around the perimeter, then the conic gradient angle is computed from it, giving us a constant speed, constant length glow. This also allows for a pretty good approximation if we have not too big rounded corners. For the final rectangle, we animate a linear gradient glow 4x, once along each edge. This does not work for rounded corners.

@blog@tante.cc
In Yesterday's IO Keynote Google declared war on the remnants of the Web. (See longer description on their website.) TL;DR: They are pushing Search more into the "here's your processed answer" direction that "AI Overviews" have established (you know, those AI snippets in current Search that are wrong about 10% of the time). So they are mostly giving up on the paradigm of providing links to information.While they packaged it as a lot of "AI" talk and "agentic" and whatnot, what their whole […]

In Yesterday’s IO Keynote Google declared war on the remnants of the Web. (See longer description on their website.) TL;DR: They are pushing Search more into the “here’s your processed answer” direction that “AI Overviews” have established (you know, those AI snippets in current Search that are wrong about 10% of the time). So they are mostly giving up on the paradigm of providing links to information.

While they packaged it as a lot of “AI” talk and “agentic” and whatnot, what their whole approach of decontextualizing information, of taking away links to sources and instead producing some LLM generated response means is that they want to establish a new abstraction layer on the web. Where Zuckerberg with his Metaverse failed Google is starting the next attack: Your website, your work no longer matters. The web is being fully hidden behind a Google-controlled surface. And I am not even talking about their browser monopoly.

Your work, your writing or art do matter a bit still: As (unpaid) raw material for their synthetic text extruders. You get to work for free so Google can have tight control on the flow of information and make sure that the responses people get are in line with what they need them to be. But your work is no longer seen as an important cultural artifact you can share with others.

This is a literal revolution but one against the participatory web, against us: The goal is to take away the web and guide people into Google’s abstraction on top of it. An abstraction they control and moderate. It’s about monopolizing access to information. A true Metaverse unbound by open standards and your ability to build your own corner of the web according to your needs and desires. Which – given how strong Google’s influence is on web standards – will change the shape of the standards for the technological landscape we are building the web on.

The next step will be Google or other companies in that space developing and deploying a new derogatory term for the web marking it as unclean, unruly, dangerous, bad (similar to “the Dark Web”) and making their abstraction the “safe” web.

If you do care about the web, about people’s ability to participate in it as more than mere passive consumers, this needs to be taken seriously. De-googlifying your mental apparatus becomes more urgent today. Find other search engines, don’t use the Chrome browser. Or wake up in a slopified AOL kind of environment where your access to information is limited to what Google’s synthetic text extruders deem relevant.

Liked it? Take a second to support tante on Patreon!
Become a patron at Patreon!

CC BY-SA 4.0 This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

The text "Quick note" in my handwriting
ALT text

The text "Quick note" in my handwriting

@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@pawelgrzybek@mastodon.social

I’m building a new website. It needs to be super modern, bleeding edge, literally page from the future!

I follow all the web standards and protocols carefully. Also to get inspired, I ordered a “Usability Engineering” by Jakob Nielsen (1993) and “The Design of Everyday Things” by Donald Norman (2013). This is how much I care about the modern frontend frameworks 😄

A picture of the “Usability Engineering” by Jakob Nielsen (1993) and “The Design of Everyday Things” by Donald Norman on a table.
ALT text

A picture of the “Usability Engineering” by Jakob Nielsen (1993) and “The Design of Everyday Things” by Donald Norman on a table.

@ivon852@mastodon.social

現在的網頁設計太膨脹了。不應該是這樣的...業界每過幾年就換一個前端JS框架卻忽略了要表達的內涵,各種現成同質性的的模板主題也抹殺了學HTML自製網頁的樂趣。

看看 的Web 2.0設計,沒有JavaScript,網頁就只是網頁,沒有傷害使用者的能力。對極簡主義者(suckless)來說,網頁設計應該是要不依賴JavaScript就能運作的。所有功能應該用plain HTML與CSS來implement,JavaScript最多只是執行個小工具,不應該使用前端框架,更不該加密與過度混淆。雖然這會讓網頁看起來很簡陋(參考FSF的設計風格,他們難以讓網頁全寬顯示。Neocities上很多網站也是這樣),但這讓網頁是可被信任的被稽核的。網頁設計不應該只考慮在Firefox與Chrome的渲染效果,還要在純文字的終端機w3m也能閱讀。甚至讀者想要的話應該要能閱讀HTML(例如Richard Stallman他老人家不用瀏覽器,而是用curl下載網頁閱讀)就能看到本文。
JavaScript的話要符合LibreJS的標準,宣告自身是開源的可信賴的才載入。

@ivon852@mastodon.social

現在的網頁設計太膨脹了。不應該是這樣的...業界每過幾年就換一個前端JS框架卻忽略了要表達的內涵,各種現成同質性的的模板主題也抹殺了學HTML自製網頁的樂趣。

看看 的Web 2.0設計,沒有JavaScript,網頁就只是網頁,沒有傷害使用者的能力。對極簡主義者(suckless)來說,網頁設計應該是要不依賴JavaScript就能運作的。所有功能應該用plain HTML與CSS來implement,JavaScript最多只是執行個小工具,不應該使用前端框架,更不該加密與過度混淆。雖然這會讓網頁看起來很簡陋(參考FSF的設計風格,他們難以讓網頁全寬顯示。Neocities上很多網站也是這樣),但這讓網頁是可被信任的被稽核的。網頁設計不應該只考慮在Firefox與Chrome的渲染效果,還要在純文字的終端機w3m也能閱讀。甚至讀者想要的話應該要能閱讀HTML(例如Richard Stallman他老人家不用瀏覽器,而是用curl下載網頁閱讀)就能看到本文。
JavaScript的話要符合LibreJS的標準,宣告自身是開源的可信賴的才載入。

@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social
@lobsters@mastodon.social

« CEO warns global push will mean "the death of anonymity online"
Protecting children is crucial, but forcing every user to hand over their ID is a privacy waiting to happen, according to the head of the firm»

It's never about that's just an argument to convince people to voluntarily hand over their . In today's , people are the product and the is their .

👉 techradar.com/vpn/vpn-privacy-

techradar.com

Proton CEO warns global age verification push will mean "the death of anonymity online"

Protecting children online is crucial, but forcing every user to hand over their ID is a privacy nightmare waiting to happen, according to the head of the Swiss privacy firm

« CEO warns global push will mean "the death of anonymity online"
Protecting children is crucial, but forcing every user to hand over their ID is a privacy waiting to happen, according to the head of the firm»

It's never about that's just an argument to convince people to voluntarily hand over their . In today's , people are the product and the is their .

👉 techradar.com/vpn/vpn-privacy-

techradar.com

Proton CEO warns global age verification push will mean "the death of anonymity online"

Protecting children online is crucial, but forcing every user to hand over their ID is a privacy nightmare waiting to happen, according to the head of the Swiss privacy firm

«400.000 Dollar Gewinn mit Insiderwette auf Maduro-Entführung — US-Soldat in Haft:
Nach der Entführung von Maduro war bekannt geworden, dass sich wohl jemand mit Insiderwissen über 400.000 US-Dollar erwettet hat. Nun gab es eine Festnahme»

Immer wider "lustig" zu sehen, dass viele glauben durch ihr Synonyme zB im @torproject online anonym zu sein. So simpel ist die absolute Anonymität im Web nicht was aber viele naive glauben.

🤑 heise.de/news/Onlinewetten-auf

heise.de

400.000 Dollar Gewinn mit Insiderwette auf Maduro-Entführung: US-Soldat in Haft

Nach der Entführung von Maduro war bekannt geworden, dass sich wohl jemand mit Insiderwissen über 400.000 US-Dollar erwettet hat. Nun gab es eine Festnahme.

@lobsters@mastodon.social
@BasementDweller3000@mas.to

Is there something like Kagi's 'Small Web' but for finding small online businesses? I'm looking for something that lets me browse by different shopping categories and subcategories, and under each category is a curated list of links to the websites of various small online stores.

@lobsters@mastodon.social

«Clicking "reject cookies" might not actually do anything:
Google, Microsoft, and Meta largely ignore cookie opt-outs, independent audit says»

…and then they complain that users reduce their spying by tracking banners such as @ublockorigin, @noscript, @privacybadger or/and @libredirect?!

🍪 techspot.com/news/112073-click

«Clicking "reject cookies" might not actually do anything:
Google, Microsoft, and Meta largely ignore cookie opt-outs, independent audit says»

…and then they complain that users reduce their spying by tracking banners such as @ublockorigin, @noscript, @privacybadger or/and @libredirect?!

🍪 techspot.com/news/112073-click

@nekohayo@mastodon.social
@smallcircles@social.coop

🤔

There are interesting paradigm shifts possible today, which result in great opportunities to break the browser oligopoly, and SaaS + cloud vendor hegemony of Web 2.0 with its Rube Goldberg technology stack.

@strypey referred to one of them, in a post to the Open App Ecosystem community group on : The .

Since my hobby (it doesn't earn income yet) involves elaborating methodology as a Social experience designer, I thought it interesting to add my follow-up from that perspective..

loomio.com/d/VYPyO17M/building

loomio.com

Building interactive websites in a post-framework web

I recently stumbled across Daz's guide to building websites using HDA (Hypermedia-Driven Architecture), as an replacement for heavy and regularly obsoleted JavaScript frameworks like React. The finer details of his code examples go over my head, but what I think I understand from his description of the architecture, and the reasoning behind it, seems groundbreaking.The examples in Daz's guide are based around using HTMX. A comment on SH mentioned DataStar, which is maybe an alternative to HTMX? Certainly seems to have similar goals from what I read on their homepage.From what I read in Daz's guide, it seems like adopting this kind of approach to interactive web interfaces like Loomio, and fediverse web apps, could be a game-changer. Massively reducing the complexity of feature development and maintenance, and avoiding the cycle of having to massively refactor every time the JS framework in use becomes obsolete.Thoughts?

@textovervideo@fosstodon.org

The free built-in VPN is currently rolling out as a beta to Firefox desktop users in 4 counties only. If you live in the United States, the United Kingdom, Germany or France, you have access to this new feature if you are using Firefox 149. Firefox plans to expand this new VPN feature to additional countries over the next several releases, so stay tuned.

A Firefox vector to advertise the new VPN feature in Firefox 149.
ALT text

A Firefox vector to advertise the new VPN feature in Firefox 149.

@textovervideo@fosstodon.org

The free built-in VPN is currently rolling out as a beta to Firefox desktop users in 4 counties only. If you live in the United States, the United Kingdom, Germany or France, you have access to this new feature if you are using Firefox 149. Firefox plans to expand this new VPN feature to additional countries over the next several releases, so stay tuned.

A Firefox vector to advertise the new VPN feature in Firefox 149.
ALT text

A Firefox vector to advertise the new VPN feature in Firefox 149.

@metin@graphics.social
@dashdsrdash@tilde.zone

The unusual browser feature I use most is Reader Mode.

SO MANY STUPIDLY DESIGNED WEBSITES!

Reader Mode: "Here is the main text in a sensible typeface at a reasonable size with high contrast and appropriate margins."

There should not be a need for Reader Mode. RM's utility is a solid indictment against web designers.

Look at your site-intended-to-convey-textual-information with Reader Mode. If it breaks, fix that. If the page is suddenly much easier to read... you have work to do.

Typeface.
Size.
Contrast.
Margins.

@metin@graphics.social
@metin@graphics.social
@metin@graphics.social
@dashdsrdash@tilde.zone

The unusual browser feature I use most is Reader Mode.

SO MANY STUPIDLY DESIGNED WEBSITES!

Reader Mode: "Here is the main text in a sensible typeface at a reasonable size with high contrast and appropriate margins."

There should not be a need for Reader Mode. RM's utility is a solid indictment against web designers.

Look at your site-intended-to-convey-textual-information with Reader Mode. If it breaks, fix that. If the page is suddenly much easier to read... you have work to do.

Typeface.
Size.
Contrast.
Margins.

@susam@mastodon.social

Wander 0.2.0 is now available.

This is a small, decentralised, self-hosted web console that lets you and visitors to your website explore interesting websites and pages recommended by a community of independent personal website owners.

For a detailed account of the changes, see: susam.net/code/news/wander/0.2

To try Wander, go to: susam.net/wander/

README: codeberg.org/susam/wander#read

A screenshot of Wander console
ALT text

A screenshot of Wander console

@newsmast@backend.newsmast.org

It's finally here! The new Newsmast Foundation website 🎉

Our new website focuses on our Apps for Change programme which is bringing real values-aligned organisations and groups to the Social Web.

It's a big change from our original website with an increased focus on actions and solutions to protect information sharing ecosystems on social media.

Check it out 👇

newsmastfoundation.org/

newsmastfoundation.org

Newsmast Foundation - Social Community App

@andypiper@andypiper.co.uk
Today, I was reminded of the existence of the humans.txt proposal - for websites to describe who made them. With all the "AI" and other stuff happening online... maybe this is a good time to look at it again?

During my recent blogging revival I’ve already written about how I love the web1. I’ve also commented a couple of times about uses of AI and Large Language Models and the kinds of confusion that can be caused.

Today, I noticed an exchange between the brilliant Sara Joy and Stefan Bohacek on Mastodon, in which Stefan accidentally reminded me of something interesting that I hadn’t properly explored the first time around.

Rewind

About 20 years ago – actually 24 years ago, according to this Wikipedia article – there was a thing called FOAF, or Friend-of-a-Friend, an early online vocabularly / ontology for describing relationships between people and things online. There was also a related concept called DOAP, Description of a Project, that I was interested in and implemented in a couple of things I worked on back then. I did some digging, but the only references I can find on this blog are some passing mentions in the early 2000s, and I’ve lost my original foaf.rdf file but I might have to go hunting for that for posterity, at some stage.

I’m mentioning all of this because it reminds me that I’ve always been interested in the Semantic Web space, and also in the people aspects of the web, beyond just the words and the technology – Who is making What, and How it is all connected.

Humans today

Back to the ~present!

About 10 years ago – actually 12 years ago, according the last updated date in the original humans.txt file – there was the quiet proposal of an idea, for a humans.txt file, that could live in parallel to the robots.txt file on a web server.

The robots.txt file is intended for site owners to provide instructions to web crawlers – “robots”, or automated programs – as to how to behave in relation to the content of the site: this is the agreed-upon standard way in which the web works, and signals to search engines how to index websites, going all the way back to the early days of 1994-7, and later fully documented by Google and others.

The idea for the humans.txt file was that we should have a simple way to credit the people who made a website, in a super easy to create and publish format, regardless of the technology stack used to build the site or the URL formats and layout of the site. It was briefly documented and lightly promoted on humanstxt.org. I remember noticing it at the time, loving the idea, but then not really doing anything with it, and I admit that I didn’t end up using it myself.

However, Stefan is using this on his site (and wrote about it 11 years ago, because of course he’s ahead of me again 😀) and it made me think:

  • This is still A Great Idea, and Right Now Could Be Its Time:
    • We’ve seen deliberate misinterpretations / mis-statements (from big AI players) about the value of robots.txt in relation to AI crawlers/scrapers in the past 6-12 months. Let’s re-emphasise the human aspect here.
      • I have a “made by a human” button in my sidebar, made by the excellent human Andy Carolan. You can get one here.
    • humanstxt.org could do with a bit of a refresh / re-upping and updating, maybe, but it’s on all of us to promote and adopt this idea.
    • the IndieWeb is thriving, and I’ve been seeing folks returning from XOXO over the past week enthusing about the greatness of the web.

REMEMBER THE JOY THE INTERNET CAN BRING ❤️

donotreply.cards/en/do-post-wh

— Dan Hon (@danhon@dan.mastohon.com) 2024-08-24T17:53:01.066Z


  • [… more thoughts …]
  • Why don’t I add this to my sites? OK then, I will.
  • Hold on, is there a browser extension for this? Oh, there is (although with the rollout of the new Chrome updates / Manifest V3 and lack of maintenance, they may not work in the future)
  • OK what about a WordPress plugin, for this here WordPress blog of mine? Oh, there is (although it has not been updated lately, and continues to refer to legacy stuff like some site called Twitter; it works, though)
  • We really, really need to give credit where credit is due, in a world where things are increasingly being sucked up, mashed together by algorithms, and regurgitated in ways that diminish their creators for the enrichment of others.

What I’m saying, is this – Thank You, Stefan, and Sara, and Dan Hon2 and everyone else from XOXO and everywhere all over the internet, for reminding me that the web is great, humans are incredible, and hey, why don’t we all give this humans.txt thing one more try? I’m on board with that.


  1. In that post, I also mentioned that the Tiny Awards 2024 winners were due to be announced – and as I’m writing now, they have been: One Minute Park, and One Million Checkboxes. ↩︎
  2. A new edition of Dan’s excellent newsletter literally was published as I was typing this blog post. You need to subscribe to it. ↩︎
person making clay pot
ALT text

person making clay pot

@newsmast@backend.newsmast.org

It's finally here! The new Newsmast Foundation website 🎉

Our new website focuses on our Apps for Change programme which is bringing real values-aligned organisations and groups to the Social Web.

It's a big change from our original website with an increased focus on actions and solutions to protect information sharing ecosystems on social media.

Check it out 👇

newsmastfoundation.org/

newsmastfoundation.org

Newsmast Foundation - Social Community App

@pheonix@hachyderm.io

The current state of the web assumes that the reader is an adversary to be trapped and monetized.

When a news website forces you through three dismissive actions just to read a headline, they are burning your cognitive budget before delivering any value. You are greeted by a cookie banner taking up the bottom 30% of your screen, a "Subscribe!" modal dead center, an autoplaying video pinned to the corner and a prompt begging to send you push notifications.

I wrote about the state of news websites. Would love to hear your thoughts✨🙏

thatshubham.com/blog/news-audit

@XLBilly@vivaldi.net
@pheonix@hachyderm.io

The current state of the web assumes that the reader is an adversary to be trapped and monetized.

When a news website forces you through three dismissive actions just to read a headline, they are burning your cognitive budget before delivering any value. You are greeted by a cookie banner taking up the bottom 30% of your screen, a "Subscribe!" modal dead center, an autoplaying video pinned to the corner and a prompt begging to send you push notifications.

I wrote about the state of news websites. Would love to hear your thoughts✨🙏

thatshubham.com/blog/news-audit

@christianliebel@mastodon.cloud

Just back from my very first @w3c @tag Face-to-Face in London, and it was so cool!

🌐 It was a packed week covering many topics, including the health of the , the impact of , the global download of AI models as an architectural concept, age verification, and more.

🤝 The freshly formed worked really well together, and I’m excited to help shape the future of the web.

🎉 Thanks to Google for hosting us, and Samsung for hosting the developer meetup.

@culturediff@mastodon.art

Hello all 🙂

This saturday, I have tried a new interesting tool developed by @mapache : FediProfile or Link-in-Bio designed for the Fediverse. It alows you to gather, on one page, your web presence and activities. As an example : hub.vocalcat.com/culturediff

To try it by yourself, have a look at this : hub.vocalcat.com/ ... and get in touch with the creator of this very useful tool, Maho (a very nice person) : @mapache

Link-in-Bio
ALT text

Link-in-Bio

@culturediff@mastodon.art

Hello all 🙂

This saturday, I have tried a new interesting tool developed by @mapache : FediProfile or Link-in-Bio designed for the Fediverse. It alows you to gather, on one page, your web presence and activities. As an example : hub.vocalcat.com/culturediff

To try it by yourself, have a look at this : hub.vocalcat.com/ ... and get in touch with the creator of this very useful tool, Maho (a very nice person) : @mapache

Link-in-Bio
ALT text

Link-in-Bio

@angusm@mastodon.social
@phillycodehound@indieweb.social

I just saw the dumbest thing ever. A company has it.com. They are selling subdomains on it.com as if it's worth anything. WTAF? Come on people. With the amount of gTLDs exploding, wtf would I want a subdomain at it.com? Seriously? I don't get the play. Ugh, people will try anything, won't they.

Ryan Reynolds' Facepalm: Hopeless Andrew Paxton Moment
ALT text

Ryan Reynolds' Facepalm: Hopeless Andrew Paxton Moment

@kaveinthran@disabled.social · Reply to Kaveinthran

🔹 Session 7 May 1: Language, page titles, frames & iFrames
🔹 Session 8 May 15: Sensory contrast & tables
🔹 Session 9 May 29: CSS positioning, audio‑only & video‑only animations
🔹 Session 10 June 12: Synchronized media
🔹 Session 11 June 26: Resizable text, multiple ways & parsing
🔹 Session 12 (final session) July 10: Alternate versions, non‑interference, reporting & Q&A

@kaveinthran@disabled.social · Reply to Kaveinthran

curriculum
🔹 Session 1 February 6: Section 508 basics & testing tools
🔹 Session 2 March 6: Auto‑playing, auto‑updating & flashing content
🔹 Session 3 March 12 (attention: Thursday 6 pm instead of Friday 4pm): Keyboard access & focus management
🔹 Session 4 March 20: Forms & validation
🔹 Session 5 April 3: Links, images & adjustable time limits
🔹 Session 6 April 17: Repetitive content & structure

@dazo@infosec.exchange

This is sad 😢

github.com/mozilla/bedrock/com

UPDATE (2026-03-02): This toot has gotten a lot more attention than what I would ever anticipate. Some clarifications are needed. A follow up is here: infosec.exchange/@dazo/1161588

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»
ALT text

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»

@dcz@fosstodon.org

Radical honesty anti- system: just ask.

I wonder how long this solution is going to work.

Screenshot of a website.

Comments for n.
Your comment looks like spam. Is it spam?

Totally spam! Throw it out!

No, it's legit! Keep it!
ALT text

Screenshot of a website. Comments for n. Your comment looks like spam. Is it spam? Totally spam! Throw it out! No, it's legit! Keep it!

@dcz@fosstodon.org

Radical honesty anti- system: just ask.

I wonder how long this solution is going to work.

Screenshot of a website.

Comments for n.
Your comment looks like spam. Is it spam?

Totally spam! Throw it out!

No, it's legit! Keep it!
ALT text

Screenshot of a website. Comments for n. Your comment looks like spam. Is it spam? Totally spam! Throw it out! No, it's legit! Keep it!

@dazo@infosec.exchange

This is sad 😢

github.com/mozilla/bedrock/com

UPDATE (2026-03-02): This toot has gotten a lot more attention than what I would ever anticipate. Some clarifications are needed. A follow up is here: infosec.exchange/@dazo/1161588

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»
ALT text

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»

@dazo@infosec.exchange · Reply to 🔗 David Sommerseth

has lost their ground and is now in a free fall into a sinkhole. I doubt they'll ever get out if this again unless they do a 180-turn within the coming days. Mozilla has lost a lot of trust and credibility over the last couple of years. This accelerates that distrust even more.

blog.mozilla.org/en/firefox/up

It looks promising, until you hit the last paragraph (my highlight)

In order to make Firefox commercially viable, there are a number of places where we collect and share some data with our partners, including our optional ads on New Tab and providing sponsored suggestions in the search bar. We set all of this out in our privacy notice. Whenever we share data with our partners, we put a lot of work into making sure that the data that we share is stripped of potentially identifying information, or shared only in the aggregate, or is put through our privacy preserving technologies (like OHTTP).

In my book, that's indirectly selling data.

Goodbye, .

blog.mozilla.org

An update on our terms of use | The Mozilla Blog

On Wednesday we shared that we’re introducing a new terms of use (TOU) and privacy notice for Firefox. Since then, we’ve been listening to some of our

@dazo@infosec.exchange

This is sad 😢

github.com/mozilla/bedrock/com

UPDATE (2026-03-02): This toot has gotten a lot more attention than what I would ever anticipate. Some clarifications are needed. A follow up is here: infosec.exchange/@dazo/1161588

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»
ALT text

Screenshot of git commit for the Mozilla web page removing the FAQ question: «Does Firefox sell your personal data?»

@danslerush@floss.social

I missed this but it's brilliant :

« We Need To Rewild The Internet - The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists. » by @mariafarrell & @robin Berjon

« Our online spaces are not ecosystems, though tech firms love that word. They’re plantations; highly concentrated and controlled environments … that madden the creatures trapped within. »

noemamag.com/we-need-to-rewild

noemamag.com

We Need To Rewild The Internet  | NOEMA

The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists.

Bad Bot Problem

Following a report on the situation with Social Media and bots, Lewis Stuart of University of Nottingham is inspired to see just how easy it is to fire up his own botnet and puts them to work on a fake social media site: 'scroll hole.'

📺 youtube.com/watch?v=AjQNDCYL5Rg

youtube.com

Bad Bot Problem - Computerphile

Following a report on the situation with Social Media and bots, Lewis Stuart of University of Nottingham is inspired to see just how easy it is to fire up hi...

Bad Bot Problem

Following a report on the situation with Social Media and bots, Lewis Stuart of University of Nottingham is inspired to see just how easy it is to fire up his own botnet and puts them to work on a fake social media site: 'scroll hole.'

📺 youtube.com/watch?v=AjQNDCYL5Rg

youtube.com

Bad Bot Problem - Computerphile

Following a report on the situation with Social Media and bots, Lewis Stuart of University of Nottingham is inspired to see just how easy it is to fire up hi...

@lobsters@mastodon.social

Using the Browser’s <canvas> for Data Compression

When building static websites and Single-Page Applications (SPAs), we sometimes need functionality in JavaScript front ends—such as compression—that is usually handled on the back end instead. […]

🔄 jstrieb.github.io/posts/canvas

jstrieb.github.io

Using the Browser’s <canvas> for Data Compression

Old browsers don’t have JavaScript compression APIs, so we store data in pixel color channels and export to PNG to compress data.

@danslerush@floss.social

I missed this but it's brilliant :

« We Need To Rewild The Internet - The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists. » by @mariafarrell & @robin Berjon

« Our online spaces are not ecosystems, though tech firms love that word. They’re plantations; highly concentrated and controlled environments … that madden the creatures trapped within. »

noemamag.com/we-need-to-rewild

noemamag.com

We Need To Rewild The Internet  | NOEMA

The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists.

@danslerush@floss.social

I missed this but it's brilliant :

« We Need To Rewild The Internet - The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists. » by @mariafarrell & @robin Berjon

« Our online spaces are not ecosystems, though tech firms love that word. They’re plantations; highly concentrated and controlled environments … that madden the creatures trapped within. »

noemamag.com/we-need-to-rewild

noemamag.com

We Need To Rewild The Internet  | NOEMA

The internet has become an extractive and fragile monoculture. But we can revitalize it using lessons learned by ecologists.

Why is bad for , specially .

I had a covid19 stories archive online running since 2020. I got the DMCA take down today. I have it offline currently.

What's interesting is the legal agency cant act on behalf of Network18 as the contract has expired. This is from their authorization letter.

``` This letter of authorization granted to Aiplex Software Private Limited having their registered office at N Cube Centre, # 91A 3rd Floor, Ideal Homes Circle, Next to Nimishambha Temple, Rajarajeshwari Nagar (“Aiplex”) the right and authority on its behalf to take all necessary remedial legal actions and protect the trademark/word mark, impersonation/fake accounts and legal interests of Network 18 for the mentioned Channels which includes removal of fake accounts, trademark and wordmark violations etc., operating on your network, platform or website. Please ensure that immediate action is taken in response to any and all legal notices reported by Aiplex on behalf of Network 18. Such authorization will be valid for a period of One year effective from 51 August, 2024 to 4% August 2025, unless terminated by Network 18 Media & Investments Limited ```

codeberg.org/thejeshgn/covid19

codeberg.org

covid19-stories-archive-takedown-notice

* I had a covid19 stories archive online running since 2020. I got the DMCA take down today. I have it offline currently. * Whats interesting is the legal agency cant act on behalf of Network18 as the contract has expired. ``` This letter of authorization granted to Aiplex Software Privat...

Why is bad for , specially .

I had a covid19 stories archive online running since 2020. I got the DMCA take down today. I have it offline currently.

What's interesting is the legal agency cant act on behalf of Network18 as the contract has expired. This is from their authorization letter.

``` This letter of authorization granted to Aiplex Software Private Limited having their registered office at N Cube Centre, # 91A 3rd Floor, Ideal Homes Circle, Next to Nimishambha Temple, Rajarajeshwari Nagar (“Aiplex”) the right and authority on its behalf to take all necessary remedial legal actions and protect the trademark/word mark, impersonation/fake accounts and legal interests of Network 18 for the mentioned Channels which includes removal of fake accounts, trademark and wordmark violations etc., operating on your network, platform or website. Please ensure that immediate action is taken in response to any and all legal notices reported by Aiplex on behalf of Network 18. Such authorization will be valid for a period of One year effective from 51 August, 2024 to 4% August 2025, unless terminated by Network 18 Media & Investments Limited ```

codeberg.org/thejeshgn/covid19

codeberg.org

covid19-stories-archive-takedown-notice

* I had a covid19 stories archive online running since 2020. I got the DMCA take down today. I have it offline currently. * Whats interesting is the legal agency cant act on behalf of Network18 as the contract has expired. ``` This letter of authorization granted to Aiplex Software Privat...

@lislegaard@sonomu.club

plz boost and comment

RSS feeds:

On a personal / music / artist blog with an RSS feed containing full blog posts.

I prefer that the feed includes:

  • The full archive (I WANT CONTENT!)14 (56%)
  • Last 10-15 posts (I can also browse the site)10 (40%)
  • Just the very recent posts (I just want updates)0 (0%)
  • Other?1 (4%)
@lislegaard@sonomu.club

plz boost and comment

RSS feeds:

On a personal / music / artist blog with an RSS feed containing full blog posts.

I prefer that the feed includes:

  • The full archive (I WANT CONTENT!)14 (56%)
  • Last 10-15 posts (I can also browse the site)10 (40%)
  • Just the very recent posts (I just want updates)0 (0%)
  • Other?1 (4%)
@dawid@vebinet.com

Every person joining the fediverse is a digital hero.

You may think it's a small thing. Yes, it's small thing but also a big step to make Internet better and people-first.

Made by the people for the people.

Oh, and also made for cats, dogs, capybaras and other puppies.

So, enjoy, encourage friends to join and let's make it a nice, inclusive and cozy space for everyone.

@dawid@vebinet.com

Every person joining the fediverse is a digital hero.

You may think it's a small thing. Yes, it's small thing but also a big step to make Internet better and people-first.

Made by the people for the people.

Oh, and also made for cats, dogs, capybaras and other puppies.

So, enjoy, encourage friends to join and let's make it a nice, inclusive and cozy space for everyone.

@alvan@social.lol

Listen to an album with me here:
konigsradio.rahim.li (sorry for http, will fix after fosdem)

"Poison Kiss" by The Last Goodnight

This is their one and only album before the band dismantled. But it was a pop radio hit in 2007, "Pictures of You" song being the most listened one. Starting the stream in 2 minutes :) :yay:

The Last Goodnight album cover art
ALT text

The Last Goodnight album cover art

@rusty__shackleford@mastodon.social

Fuck AI with :
Web AI Firewall Utility that weighs the soul of your connection using one or more challenges protecting upstream resources from bots.

Designed to protect the small internet from AI companies endless requests, Anubis is lightweight so ***everyone*** can afford to protect the communities closest to them.

Fuck AI

lock.cmpxchg8b.com/anubis.html

@rusty__shackleford@mastodon.social

Fuck AI with :
Web AI Firewall Utility that weighs the soul of your connection using one or more challenges protecting upstream resources from bots.

Designed to protect the small internet from AI companies endless requests, Anubis is lightweight so ***everyone*** can afford to protect the communities closest to them.

Fuck AI

lock.cmpxchg8b.com/anubis.html

@clemensg@digitalcourage.social

@feb So viel finanzielle Kraft und Linkedin-Vernetzung (meint: Verbindungen zu EntscheiderInnen) hätte manches OpenSource-Projekt auch gerne (unseres auch). Aber wenn grundlegende und strategische Entscheidungen nicht richtig gefällt werden, dann lässt sich das auch mit Beziehungen und Geld nicht wettmachen.

Eine neues Netzwerk muss zwingend folgende Kriterien erfüllen:
- dezentrale Struktur (SelfhosterInnen nehmen diskriminierungsfrei am gesamten Netzwerk teil),
- baut auf W3C-Standrads auf (Web, ActivityPub etc., jede Veröffentlichung bekommt eine Web-URL),
- Durchlässigkeit und Konnektivität zu anderen Netzwerken baut Tendenz zum Walled Garden vor,
- Private Chats sind anerkannten OpenSource-Lösungen verschlüsselt,
- ist nachweisbar werbe- und trackingfrei (realpolitisch: zumindest gegen kleine Gebühr).

Etwas vergessen?

@louis@theforkiverse.com
@louis@theforkiverse.com
@louis@theforkiverse.com
@autonomysolidarity@todon.eu · Reply to Autonomie und Solidarität

‚Snowflake ist eine für den Tor Browser verfügbare austauschbare Übertragungsart, mit der sich Internetzensur umgehen lässt. Wie eine Tor-Brücke kann ein Benutzer auf das offene Internet zugreifen, wenn selbst reguläre Tor-Verbindungen zensiert werden. Die Verwendung von Snowflake ist so einfach wie der Wechsel zu einer neuen Brücken-Konfiguration im Tor-Browser.‘

support.torproject.org/de/anti

Starte die Nutzung von jetzt:
--> snowflake.torproject.org/de/

snowflake.torproject.org

Snowflake

@anatudor@mastodon.social

Variable aspect ratio cards with conic gradients meeting along the diagonal.

First coded this when we didn't have inverse trigonometric functions in - can you figure out how on your own?

@csstricks post css-tricks.com/variable-aspect

@codepen demo codepen.io/thebabydino/pen/XWp

Animated GIF. Shows a grid of cards with color backgrounds made from conic gradients. The gradients appear like stripes that extend from opposite corners of the card. Each card reads Hello Gorgeous in a fancy script font. We have a slider that allows us to change the aspect ratio, but while doing so, the conic gradients at the two opposing corners still meet along the diagonal.
ALT text

Animated GIF. Shows a grid of cards with color backgrounds made from conic gradients. The gradients appear like stripes that extend from opposite corners of the card. Each card reads Hello Gorgeous in a fancy script font. We have a slider that allows us to change the aspect ratio, but while doing so, the conic gradients at the two opposing corners still meet along the diagonal.

@anatudor@mastodon.social

Variable aspect ratio cards with conic gradients meeting along the diagonal.

First coded this when we didn't have inverse trigonometric functions in - can you figure out how on your own?

@csstricks post css-tricks.com/variable-aspect

@codepen demo codepen.io/thebabydino/pen/XWp

Animated GIF. Shows a grid of cards with color backgrounds made from conic gradients. The gradients appear like stripes that extend from opposite corners of the card. Each card reads Hello Gorgeous in a fancy script font. We have a slider that allows us to change the aspect ratio, but while doing so, the conic gradients at the two opposing corners still meet along the diagonal.
ALT text

Animated GIF. Shows a grid of cards with color backgrounds made from conic gradients. The gradients appear like stripes that extend from opposite corners of the card. Each card reads Hello Gorgeous in a fancy script font. We have a slider that allows us to change the aspect ratio, but while doing so, the conic gradients at the two opposing corners still meet along the diagonal.

@anatudor@mastodon.social

Wake up, wake up, wake up!

If you're a Cheetah+ supporter on Ko-fi or Patreon, then first of all thank you 🙏 and second, I've just published a massive post about an improved technique for flexible irregular shapes.

❇️ ko-fi.com/post/New-year-new-te

❇️ patreon.com/posts/new-year-new

A square image with cutouts depending on the dimensions of corner elements, dimensions that in turn depend on how the text in those corner elements reflows at different viewports.
ALT text

A square image with cutouts depending on the dimensions of corner elements, dimensions that in turn depend on how the text in those corner elements reflows at different viewports.

Stepped shape with rounded corners on the right, step height depending on the height of the elements on the left, whose height is given by their content and how it wraps at different viewports.
ALT text

Stepped shape with rounded corners on the right, step height depending on the height of the elements on the left, whose height is given by their content and how it wraps at different viewports.

Irregular shaped image with both convex & concave roundings. Shape depends on the dimensions and aspect ratio of other elements, how they scale/ wrap as the viewport changes.
ALT text

Irregular shaped image with both convex & concave roundings. Shape depends on the dimensions and aspect ratio of other elements, how they scale/ wrap as the viewport changes.

Three cards wrap around buttons of different sizes in the bottom right corner. All corners of the card shapes, whether convex or concave, are rounded.
ALT text

Three cards wrap around buttons of different sizes in the bottom right corner. All corners of the card shapes, whether convex or concave, are rounded.

@anatudor@mastodon.social

Wake up, wake up, wake up!

If you're a Cheetah+ supporter on Ko-fi or Patreon, then first of all thank you 🙏 and second, I've just published a massive post about an improved technique for flexible irregular shapes.

❇️ ko-fi.com/post/New-year-new-te

❇️ patreon.com/posts/new-year-new

A square image with cutouts depending on the dimensions of corner elements, dimensions that in turn depend on how the text in those corner elements reflows at different viewports.
ALT text

A square image with cutouts depending on the dimensions of corner elements, dimensions that in turn depend on how the text in those corner elements reflows at different viewports.

Stepped shape with rounded corners on the right, step height depending on the height of the elements on the left, whose height is given by their content and how it wraps at different viewports.
ALT text

Stepped shape with rounded corners on the right, step height depending on the height of the elements on the left, whose height is given by their content and how it wraps at different viewports.

Irregular shaped image with both convex & concave roundings. Shape depends on the dimensions and aspect ratio of other elements, how they scale/ wrap as the viewport changes.
ALT text

Irregular shaped image with both convex & concave roundings. Shape depends on the dimensions and aspect ratio of other elements, how they scale/ wrap as the viewport changes.

Three cards wrap around buttons of different sizes in the bottom right corner. All corners of the card shapes, whether convex or concave, are rounded.
ALT text

Three cards wrap around buttons of different sizes in the bottom right corner. All corners of the card shapes, whether convex or concave, are rounded.

@smallcircles@social.coop
@evgandr@bsd.cafe

I was searching for some information about how to setup HTTPS inside the local network, with internal DNS server, so the certbot and Letsencrypt weren't help, since they are don't have access to this network. And I found this gem, see screenshots.

L. M. A. O. :-DDDDDD

How pathetic. A website proudly named «"Software Engineering Standard"» which has the most shitty layout I saw — enormously big white, unused space on the both sides of tiny column of actual text. And the things become worsen, if I open Sideberry, so the active width of browser window shrinks 🤡 🤡 🤡

But … looking to the state of IT now — maybe it is not lying and this abomination is definitely an engineering standard now?

Website with black header and a thin column of text in the center, while there are a lot of wasted unused space left and right on it.
Header proudly states "Software Engineering Standard".
ALT text

Website with black header and a thin column of text in the center, while there are a lot of wasted unused space left and right on it. Header proudly states "Software Engineering Standard".

Website with black header and a thin column of text in the center, while there are a lot of wasted unused space left and right on it.
Header proudly states "Software Engineering Standard".

The Sideberry panel is opened, so the column of text is extremely thin.
ALT text

Website with black header and a thin column of text in the center, while there are a lot of wasted unused space left and right on it. Header proudly states "Software Engineering Standard". The Sideberry panel is opened, so the column of text is extremely thin.

@samvie@chaos.social
Blue slide with white  letters. My picture and my avatar on the left. Sessions and Workshops I will be hosting at 39c3.

Blue
ALT text

Blue slide with white letters. My picture and my avatar on the left. Sessions and Workshops I will be hosting at 39c3. Blue

@samvie@chaos.social
Blue slide with white  letters. My picture and my avatar on the left. Sessions and Workshops I will be hosting at 39c3.

Blue
ALT text

Blue slide with white letters. My picture and my avatar on the left. Sessions and Workshops I will be hosting at 39c3. Blue

@watchfulcitizen@goingdark.social

People who actually prefer light mode are wrong

text reads "How dark mode users describe light mode." Image shows a person in a grey t-shirt holding a bright illuminated lamp directly next to their face, the light washing out their features.
ALT text

text reads "How dark mode users describe light mode." Image shows a person in a grey t-shirt holding a bright illuminated lamp directly next to their face, the light washing out their features.

@amoroso@oldbytes.space

Drop what you're doing and listen to @masinter Larry Masinter talk about computing history and lore. He tells first hand stories on the early web, Gopher, Hypertext Coffee Pot Control Protocol, mailto:, and a whole lot more including Interlisp.

netstack.fm/#episode-17

@Jayhoffmann may be interested.

netstack.fm

Netstack.FM® — A Podcast About Networking and Rust

Interviews, monologues, and deep dives into Rust and modern networking systems.

@anatudor@mastodon.social

Split text with blended half shadow on @codepen codepen.io/thebabydino/pen/LYv

No text duplication whatsoever, no images other than gradients, no funky fonts* - all done with magic! 🪄✨

*font used here is fonts.google.com/specimen/Rubi - you can see the effect isn't baked into it

Demo screenshot. The text "success" in all caps with a diagonal half split across its face, the bottom right part having an aqua background in addition to being hashed like the top left part. The bottom right part also has a fuchsia drop shadow that is blended with it.

The fine print at the bottom says, in a much smaller cursive font with less contrast: "wake up early, work hard and never give up, your dreams can come true... if you're born rich!"
ALT text

Demo screenshot. The text "success" in all caps with a diagonal half split across its face, the bottom right part having an aqua background in addition to being hashed like the top left part. The bottom right part also has a fuchsia drop shadow that is blended with it. The fine print at the bottom says, in a much smaller cursive font with less contrast: "wake up early, work hard and never give up, your dreams can come true... if you're born rich!"

@sunell@mementomori.social

Vanhan kansan ihmisenä luen mielelläni veppisivuja tietokoneella niin, että vieritän ruudullisen kerrallaan välilyöntinäppäimellä. Siksi minua risovat sivujen ylä- ja alareunan kelluvat elementit, jotka aina peittävät osan tekstistä niin, että joutuu peruuttamaan pari riviä.

En tiedä, miten Librewolf teknisesti tekee sen, mutta sillä ruutu kerrallaan vierittäminen onnistuu paljon useammin kuin muilla selaimilla. Ehkä se poistaa näkyvistä niin paljon roskaa, että sisältö näkyy paremmin. Vai onko kysymys jostain muusta CSS- tai HTML-jutusta.

Joka tapauksessa olen sitä mieltä, ettei veppisivuja saa tehdä pelkästään kosketusnäyttöjä tai hipaisuhiiriä ajatellen.

@menelion@dragonscave.space

I've just seen an absolutely disgusting article. I said "seen", not "read", because I'm blind and I could not read it.
for your reference, here's the first beautiful sentence of this article:
"ffGE ARrj XRejm XAj bZgui cB R EXZgl, Rmi mjji jrjg-DmygjREDmI XgRDmDmI iRXR XZ DlkgZrj."
I don't know the technology behind this BS, but screen readers see it as scrambled text, kind of encrypted or something like this. I guess it's some font juggling (ChatGPT supposed it's gliph scrambling, where random Unicode values are mapped to random letters — I'll trust her in this because I really don't care about the tech behind it), but if you have a tiny little grain of empathy, never ever ever do this, for goodness sake.
tilschuenemann.de/projects/sac

tilschuenemann.de

sacrificing accessibility for not getting web-scraped

@menelion@dragonscave.space

I've just seen an absolutely disgusting article. I said "seen", not "read", because I'm blind and I could not read it.
for your reference, here's the first beautiful sentence of this article:
"ffGE ARrj XRejm XAj bZgui cB R EXZgl, Rmi mjji jrjg-DmygjREDmI XgRDmDmI iRXR XZ DlkgZrj."
I don't know the technology behind this BS, but screen readers see it as scrambled text, kind of encrypted or something like this. I guess it's some font juggling (ChatGPT supposed it's gliph scrambling, where random Unicode values are mapped to random letters — I'll trust her in this because I really don't care about the tech behind it), but if you have a tiny little grain of empathy, never ever ever do this, for goodness sake.
tilschuenemann.de/projects/sac

tilschuenemann.de

sacrificing accessibility for not getting web-scraped

@amoroso@oldbytes.space

Drop what you're doing and listen to @masinter Larry Masinter talk about computing history and lore. He tells first hand stories on the early web, Gopher, Hypertext Coffee Pot Control Protocol, mailto:, and a whole lot more including Interlisp.

netstack.fm/#episode-17

@Jayhoffmann may be interested.

netstack.fm

Netstack.FM® — A Podcast About Networking and Rust

Interviews, monologues, and deep dives into Rust and modern networking systems.

@interlisp@fosstodon.org
@bitbear@icosahedron.website

The untold history of web development:

1990: HTML invented.
1994: CSS invented to fix HTML.
1995: JS invented to fix HTML/CSS.
2006: jQuery invented to fix JS.
2010: AngularJS invented to fix jQuery.
2013: React invented to fix AngularJS.
2014: Vue invented to fix React & Angular.
2016: Angular 2 invented to fix AngularJS & React.
2019: Svelte 3 invented to fix React, Angular, Vue.
2019: React hooks invented to fix React.
2020: Vue 3 invented to fix React hooks.
2020: Solid invented to fix React, Angular, Svelte, Vue.
2020: HTMX 1.0 invented to fix React, Angular, Svelte, Vue, Solid.
2021: React suspense invented to fix React, again.
2023: Svelte Runes invented to fix Svelte.
2024: jQuery still used on 75% of websites.

(By twitter.com/fireship_dev)

@bitbear@icosahedron.website

The untold history of web development:

1990: HTML invented.
1994: CSS invented to fix HTML.
1995: JS invented to fix HTML/CSS.
2006: jQuery invented to fix JS.
2010: AngularJS invented to fix jQuery.
2013: React invented to fix AngularJS.
2014: Vue invented to fix React & Angular.
2016: Angular 2 invented to fix AngularJS & React.
2019: Svelte 3 invented to fix React, Angular, Vue.
2019: React hooks invented to fix React.
2020: Vue 3 invented to fix React hooks.
2020: Solid invented to fix React, Angular, Svelte, Vue.
2020: HTMX 1.0 invented to fix React, Angular, Svelte, Vue, Solid.
2021: React suspense invented to fix React, again.
2023: Svelte Runes invented to fix Svelte.
2024: jQuery still used on 75% of websites.

(By twitter.com/fireship_dev)

@bitbear@icosahedron.website

The untold history of web development:

1990: HTML invented.
1994: CSS invented to fix HTML.
1995: JS invented to fix HTML/CSS.
2006: jQuery invented to fix JS.
2010: AngularJS invented to fix jQuery.
2013: React invented to fix AngularJS.
2014: Vue invented to fix React & Angular.
2016: Angular 2 invented to fix AngularJS & React.
2019: Svelte 3 invented to fix React, Angular, Vue.
2019: React hooks invented to fix React.
2020: Vue 3 invented to fix React hooks.
2020: Solid invented to fix React, Angular, Svelte, Vue.
2020: HTMX 1.0 invented to fix React, Angular, Svelte, Vue, Solid.
2021: React suspense invented to fix React, again.
2023: Svelte Runes invented to fix Svelte.
2024: jQuery still used on 75% of websites.

(By twitter.com/fireship_dev)

At the November 2025 TPAC event, Roy Ran, W3C Principal Accessibility Specialist, presented: "Web & AI in W3C" explaining how W3C is engaging with AI, why AI matters for the web, and what AI-related standards already exist (like WebNN, WebGPU, and data/identity technologies). He highlighted ongoing work on responsible AI, announced the new Web & AI Interest Group, and mentioned plans for a future workshop on AI agents and browsers.
&AI
youtube.com/watch?v=ACXhxBZuYl0

Roy Ran presenting. caption" "Okay, finally, AI. Yeah it's a really popular topic during this TPAC"
ALT text

Roy Ran presenting. caption" "Okay, finally, AI. Yeah it's a really popular topic during this TPAC"

@FediThing@chinwag.org

(Bernie Sanders.jpg)

I am once again asking people who run websites to have a dedicated "About" page that says what their website actually does in concise plain language without any marketing hype or long personal histories.

This is getting rarer and rarer, and it's often impossible to know if a website is a news site, personal blog, press release aggregator, charity initiative, commercial PR, AI slop or whatever.

It would take you just a few seconds to write and it would get you lots of potential links, follows and recommendations.

@dusoft@fosstodon.org

I would highly recommend any techbro (and any developer) to spend some time on slow, laggy or even cutting out internet. So just they can see how their always-online web apps plainly crash when unable to cope with a short offline time. Absolute tragic , loss of data common!

@lcheylus@bsd.network
@LysMoonDust@mastodon.social

He creado un cuento.

Sinópsis: "Una pequeña luciérnaga, Luzi, sueña con conocer a Luna, aunque estos deseos hayan sido rechazados por sus padres y compañeros debido al lugar donde se encuentra. Un día, cansada de esperar, se escabulle en un peligroso viaje para cumplir sus ideales y descubrir la verdad sobre aquel gran astro".

Enlace: yggdrasil.forestry.md/luzienag

Una portada donde una luciernaga sale en primer plano, esta vuela hacia un camino rodeado por la ciénaga, arriba de esta una Luna brillante. Tambien a la izquierda de la composición dentro de la ciénaga existe un gran árbol lleno de pequeñas luminosas.
ALT text

Una portada donde una luciernaga sale en primer plano, esta vuela hacia un camino rodeado por la ciénaga, arriba de esta una Luna brillante. Tambien a la izquierda de la composición dentro de la ciénaga existe un gran árbol lleno de pequeñas luminosas.

@lcheylus@bsd.network
@dcz@fosstodon.org
@dcz@fosstodon.org

Curlie - The Collector of URLs

Some search engines for the web are also based on @Curlie, among other things. You can also enter your websites in this so that they can be found more easily when people search for keywords that relate to your pages.

🐿️ curlie.org

curlie.org

Curlie

Collector of URLs

@mnvr@mastodon.social

"Maintain the versionless, feature-tested and backwards-compatible evolution story of the Web"

Love this phrasing from the WebAssembly docs. It's easy to forget how unique and decentralized the web actually is, and how entropy-defying gift we all have had. Seeing the wasm folks pay homage to the web is great!

Screenshot from webassembly.org highlighting "maintaining the versionless; feature-tested and backwards-compatible evolution story of the Web"
ALT text

Screenshot from webassembly.org highlighting "maintaining the versionless; feature-tested and backwards-compatible evolution story of the Web"

@chris@nutmeg.social
@Nead@vivaldi.net

Did you know there is a book called "Mastodon For Dummies"?
It's part of the widely read and well known 'For Dummies' series.
This is the cover of the one I brought home from my local library.
Does your library have a copy? If not, maybe you can suggest a new acquisition! It's only 14.99 US, 17.99 CAN, and 11.99 UK.

The cover of Mastodon For Dummies by Chris Minnick and Michael McCallister. It uses purple and yellow and depicts a mammoth with tusks.
ALT text

The cover of Mastodon For Dummies by Chris Minnick and Michael McCallister. It uses purple and yellow and depicts a mammoth with tusks.

@Nead@vivaldi.net

Did you know there is a book called "Mastodon For Dummies"?
It's part of the widely read and well known 'For Dummies' series.
This is the cover of the one I brought home from my local library.
Does your library have a copy? If not, maybe you can suggest a new acquisition! It's only 14.99 US, 17.99 CAN, and 11.99 UK.

The cover of Mastodon For Dummies by Chris Minnick and Michael McCallister. It uses purple and yellow and depicts a mammoth with tusks.
ALT text

The cover of Mastodon For Dummies by Chris Minnick and Michael McCallister. It uses purple and yellow and depicts a mammoth with tusks.

Paperless-ngx

Paperless-ngx is a community-supported open-source document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper.

🌱 docs.paperless-ngx.com

docs.paperless-ngx.com

Paperless-ngx

Hello Masto ! :flan_wave:

Pour mes enfants de 11 et 14 ans, je cherche des ressources pour les aider à mettre un pied dans l'univers du développement de jeux vidéos. Ils commencent à tourner en rond avec ce qu'ils ont sous la main, ils veulent passer à l'étape d'après :D

Contraintes :
- matériel standard, pas de CPU/GPU dernière génération
- Linux uniquement
- pas *trop* de lecture (les bouquins type Eyrolles, même junior, ce n'est pas pour mon fils)
- côté compétences graphiques on va dire que c'est le minimum du minimum :D

Les deux sont très à l'aise avec un ordi ou une tablette, ont l'habitude de faire du Scratch ou même des mods Minecraft pour mon fils, et sont à l'aise avec l'anglais écrit (et même oral pour mon fils).

J'ai déjà comme ressources en attente :
- godotengine.org/
- github.com/kitao/pyxel
- developer.mozilla.org/en-US/do

Je prends donc les idées, les recommandations, les tutos (y compris Youtube), etc.

Merci d'avance, et boosts appréciés ! :flan_wave:

developer.mozilla.org

Tutorials - Game development | MDN

This page contains multiple tutorial series that highlight different workflows for effectively creating different types of web games.

Hello Masto ! :flan_wave:

Pour mes enfants de 11 et 14 ans, je cherche des ressources pour les aider à mettre un pied dans l'univers du développement de jeux vidéos. Ils commencent à tourner en rond avec ce qu'ils ont sous la main, ils veulent passer à l'étape d'après :D

Contraintes :
- matériel standard, pas de CPU/GPU dernière génération
- Linux uniquement
- pas *trop* de lecture (les bouquins type Eyrolles, même junior, ce n'est pas pour mon fils)
- côté compétences graphiques on va dire que c'est le minimum du minimum :D

Les deux sont très à l'aise avec un ordi ou une tablette, ont l'habitude de faire du Scratch ou même des mods Minecraft pour mon fils, et sont à l'aise avec l'anglais écrit (et même oral pour mon fils).

J'ai déjà comme ressources en attente :
- godotengine.org/
- github.com/kitao/pyxel
- developer.mozilla.org/en-US/do

Je prends donc les idées, les recommandations, les tutos (y compris Youtube), etc.

Merci d'avance, et boosts appréciés ! :flan_wave:

developer.mozilla.org

Tutorials - Game development | MDN

This page contains multiple tutorial series that highlight different workflows for effectively creating different types of web games.

Hello Masto ! :flan_wave:

Pour mes enfants de 11 et 14 ans, je cherche des ressources pour les aider à mettre un pied dans l'univers du développement de jeux vidéos. Ils commencent à tourner en rond avec ce qu'ils ont sous la main, ils veulent passer à l'étape d'après :D

Contraintes :
- matériel standard, pas de CPU/GPU dernière génération
- Linux uniquement
- pas *trop* de lecture (les bouquins type Eyrolles, même junior, ce n'est pas pour mon fils)
- côté compétences graphiques on va dire que c'est le minimum du minimum :D

Les deux sont très à l'aise avec un ordi ou une tablette, ont l'habitude de faire du Scratch ou même des mods Minecraft pour mon fils, et sont à l'aise avec l'anglais écrit (et même oral pour mon fils).

J'ai déjà comme ressources en attente :
- godotengine.org/
- github.com/kitao/pyxel
- developer.mozilla.org/en-US/do

Je prends donc les idées, les recommandations, les tutos (y compris Youtube), etc.

Merci d'avance, et boosts appréciés ! :flan_wave:

developer.mozilla.org

Tutorials - Game development | MDN

This page contains multiple tutorial series that highlight different workflows for effectively creating different types of web games.

@anatudor@mastodon.social

I am begging you, please don't split your heading into two separate `h2` elements with an `img` in between just to have the image in between your heading words.

This is what subgrid was made for!

HTML:

```
<!-- ❌ DON'T DO THIS 🚫 -->
<section>
  <h2>Classic</h2>
  <img src='classic-bar.png' alt=''/>
  <h2>Flavour</h2>
</section>

<!-- ✅ DO THIS ✅ -->
<section>
  <h2>
    <span>Classic</span>
    <span>Flavour</span>
  </h2>
  <img src='classic-bar.png' alt='the classic chocolate bar'/>
</section>
```

CSS:

```
section, h2 { display: grid }

section { grid-template-rows: repeat(3, auto) }

h2 {
  grid-area: 1/ 1/ span 3;
  grid-template-rows: subgrid;
  
  span:last-child { grid-row: 3 }
}

img { grid-area: 2/ 1 }
```
ALT text

HTML: ``` <!-- ❌ DON'T DO THIS 🚫 --> <section> <h2>Classic</h2> <img src='classic-bar.png' alt=''/> <h2>Flavour</h2> </section> <!-- ✅ DO THIS ✅ --> <section> <h2> <span>Classic</span> <span>Flavour</span> </h2> <img src='classic-bar.png' alt='the classic chocolate bar'/> </section> ``` CSS: ``` section, h2 { display: grid } section { grid-template-rows: repeat(3, auto) } h2 { grid-area: 1/ 1/ span 3; grid-template-rows: subgrid; span:last-child { grid-row: 3 } } img { grid-area: 2/ 1 } ```

@anatudor@mastodon.social

I am begging you, please don't split your heading into two separate `h2` elements with an `img` in between just to have the image in between your heading words.

This is what subgrid was made for!

HTML:

```
<!-- ❌ DON'T DO THIS 🚫 -->
<section>
  <h2>Classic</h2>
  <img src='classic-bar.png' alt=''/>
  <h2>Flavour</h2>
</section>

<!-- ✅ DO THIS ✅ -->
<section>
  <h2>
    <span>Classic</span>
    <span>Flavour</span>
  </h2>
  <img src='classic-bar.png' alt='the classic chocolate bar'/>
</section>
```

CSS:

```
section, h2 { display: grid }

section { grid-template-rows: repeat(3, auto) }

h2 {
  grid-area: 1/ 1/ span 3;
  grid-template-rows: subgrid;
  
  span:last-child { grid-row: 3 }
}

img { grid-area: 2/ 1 }
```
ALT text

HTML: ``` <!-- ❌ DON'T DO THIS 🚫 --> <section> <h2>Classic</h2> <img src='classic-bar.png' alt=''/> <h2>Flavour</h2> </section> <!-- ✅ DO THIS ✅ --> <section> <h2> <span>Classic</span> <span>Flavour</span> </h2> <img src='classic-bar.png' alt='the classic chocolate bar'/> </section> ``` CSS: ``` section, h2 { display: grid } section { grid-template-rows: repeat(3, auto) } h2 { grid-area: 1/ 1/ span 3; grid-template-rows: subgrid; span:last-child { grid-row: 3 } } img { grid-area: 2/ 1 } ```

@metin@graphics.social
@metin@graphics.social
@kalvin0x58c@kupi.my
@Vivaldi@vivaldi.net

Vivaldi 7.7 has arrived! 🎨

✅ All your tabs, structured, anywhere you need them
✅ Unified Start Page layout
✅ Brand new performance controls
✅ Privacy Dashboard redesigned
✅ Refined Mail panel

More on the update: vivaldi.com/blog/vivaldi-on-de

Vivaldi Browser (7.7) desktop app interface showing the Windows and Tabs panel open on the left side of the browser window. The 'Synced Tabs' section displays windows and tabs from synced devices with their structure intact.
ALT text

Vivaldi Browser (7.7) desktop app interface showing the Windows and Tabs panel open on the left side of the browser window. The 'Synced Tabs' section displays windows and tabs from synced devices with their structure intact.

@Vivaldi@vivaldi.net

Vivaldi 7.7 has arrived! 🎨

✅ All your tabs, structured, anywhere you need them
✅ Unified Start Page layout
✅ Brand new performance controls
✅ Privacy Dashboard redesigned
✅ Refined Mail panel

More on the update: vivaldi.com/blog/vivaldi-on-de

Vivaldi Browser (7.7) desktop app interface showing the Windows and Tabs panel open on the left side of the browser window. The 'Synced Tabs' section displays windows and tabs from synced devices with their structure intact.
ALT text

Vivaldi Browser (7.7) desktop app interface showing the Windows and Tabs panel open on the left side of the browser window. The 'Synced Tabs' section displays windows and tabs from synced devices with their structure intact.

@chakie@toot.community

I wonder if there’s something that would allow me to make a website with some amount of interactivity without touching anything related to Javascript (or Typescript) or NPM? Preferably Python as I could leverage existing code that way. Or is the web doomed to be a JS swamp of mediocrity?

»Nach langer Vorbereitung: Mastodon kann jetzt lange geforderte "Quote Posts"
Als er @Mastodon gegründet hat, war Erfinder @Gargron gegen die Zitierfunktion. Später hat sich seine Meinung geändert und ein Update führt sie jetzt ein.«

Es gibt Menschen die dies kritisieren und andere die es befürworten. Ich muss es mir erst mal noch ansehen wie es umgesetzt ist nach dem Server Update.

:mastodon: heise.de/news/Grosses-Update-M

heise.de

Nach langer Vorbereitung: Mastodon kann jetzt lange geforderte "Quote Posts"

Als er Mastodon gegründet hat, war Erfinder Eugen Rochko gegen die Zitierfunktion. Später hat sich seine Meinung geändert und ein Update führt sie jetzt ein.

@aral@mastodon.ar.al

If anyone is building stuff based on the accounts we have verified on Gaza Verified, you can now get a list of the Mastodon URLs of the verified accounts in JSON format at:

gaza-verified.org/people.json

For a human-readable list, just remove the .json:

gaza-verified.org/people

For more details on Gaza Verified, please see the main page:

gaza-verified.org

💕

gaza-verified.org

Gaza Verified

We’ve personally had video conversations on Signal with the people from Gaza whose Mastodon accounts on the fediverse are listed here and we verify that their accounts are genuine. – Joy & Aral Balkan

@aral@mastodon.ar.al

If anyone is building stuff based on the accounts we have verified on Gaza Verified, you can now get a list of the Mastodon URLs of the verified accounts in JSON format at:

gaza-verified.org/people.json

For a human-readable list, just remove the .json:

gaza-verified.org/people

For more details on Gaza Verified, please see the main page:

gaza-verified.org

💕

gaza-verified.org

Gaza Verified

We’ve personally had video conversations on Signal with the people from Gaza whose Mastodon accounts on the fediverse are listed here and we verify that their accounts are genuine. – Joy & Aral Balkan

@m3tti@functional.cafe

we need a search engine where someone can publish a post like in / and other users can boost that article. And this will make the post more relevant if you search for it. So basically a human centered ranking system combined with a search engine.

@madeindex@mastodon.social

🤖 AI browsers are NOT safe!

There is a thing called "prompt injection" and it works.¹

Funnily the thing that most see as a major issue with AI, the
crawling of the and one-way use of it's content, is exactly what makes their AI browsers unsafe.

If you place malicious in that very content, the AI scans it & then runs it² on your OS 🤯

This issue has been known to the corps for years³, but they released their browsers nonetheless 🤑

1/2

@madeindex@mastodon.social

🤖 AI browsers are NOT safe!

There is a thing called "prompt injection" and it works.¹

Funnily the thing that most see as a major issue with AI, the
crawling of the and one-way use of it's content, is exactly what makes their AI browsers unsafe.

If you place malicious in that very content, the AI scans it & then runs it² on your OS 🤯

This issue has been known to the corps for years³, but they released their browsers nonetheless 🤑

1/2

@matthiasott@mastodon.social
@links@gts.lmorchard.com

ChatGPT's Atlas: The Browser That's Anti-Web - Anil Dash

"OpenAI, the company behind ChatGPT, released their own browser called Atlas, and it actually is something new: the first browser that actively fights against the web. Let's talk about what that means, and what dangers there are from an anti-web browser made by an AI company — one that probably needs a warning label when you install it."

https://www.anildash.com/2025/10/22/atlas-anti-web-browser/

#ai #atlas #chatgpt #genai #openai #web

anildash.com

ChatGPT's Atlas: The Browser That's Anti-Web - Anil Dash

A blog about making culture. Since 1999.

@blog@shkspr.mobi

Alpha launch - .well-known/avatar - feedback wanted

shkspr.mobi/blog/2025/10/alpha

I've gotten sufficiently annoyed with a trivial problem that I'm preparing to write an IETF RFC. Yeah. That's how ticked off I am!

Every site that I sign up for asks me to upload an avatar to represent myself. Whenever I change my photo, I have to log in to a hundred sites and change it there0.

Perhaps they could all use Gravatar - but that's a centralised service1 and doesn't work with wildcard email addresses. Libravatar also relies on email addresses and requires implementers to set up new DNS entries.

So I'm proposing .well-known/avatar. Here's how it works (for now). I'd like your feedback before going further2.

I sign up to a service and use the email address whatever@shkspr.mobi.

The service looks up my avatar using a well-known path. For example, request https://shkspr.mobi/.well-known/avatar?resource=acct:whatever@shkspr.mobi and you'll get back this JSON:

 JSON{    "subject": "acct:whatever@shkspr.mobi",    "links": [        {              "rel": "http:\/\/webfinger.net\/rel\/avatar",             "type": "image\/webp",             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-1024.webp",            "sizes": "1024x1024"        },        {              "rel": "http:\/\/webfinger.net\/rel\/avatar",             "type": "image\/jpeg",             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-512.jpg",            "sizes": "512x512"        }    ]}

That's a slightly enhanced https://webfinger.net/rel/#avatar which adds a sizes parameter. The service can then pick the appropriate MIME and size.

Alternatively, you can request the same URl but with a header of Accept: image/gif and receive the default sized avatar in that specific format.

Try it by running:

 Bashcurl -H "Accept: image/avif" https://shkspr.mobi/.well-known/avatar/ --output "test.avif"

You should receive an auto-converted version of my avatar.

Some Thoughts

Please add your thoughts to the comments box. Here's some feedback I've received so far.

Perhaps this is too complicated? What's wrong with just serving up an image when the URl is requested? That would make it easier for static sites.

@Edent Thinking about this, while I like content negotiation as a clever hack, I wonder if maybe it isn’t too clever. The nice thing with WKD is that you can deploy it with any normal static HTTP file without any special magic. Maybe the protocol could be dumbed down to simply rely on WKD-style URLs? I’m not sure how to configure my web server (Apache) for your avatar well known URL with negotiation magic.

2025-10-23, 16:50 0 boosts 1 favorites

What about a size parameter?

@Edent It'd be nice if the query could limit the size of the avatar being returned. If only there were `Accept-Max-Size`, but maybe a query param? I wouldn't want my performance taking a dive if Alice has a 35M avatar that my client starts downloading. If my client had requested with `max_size=3072` I'd rather not see the avatar than degrade performance/pull excess data

2025-10-23, 15:02 0 boosts 1 favorites

Will anyone actually use it?

@Edent good luck with getting the hundreds of services to implement it. I mean it. it would be awesome and you might be well connected enough to make it happen.

What about hashing the email?

@Edent would using a hash of the email address in its place improve privacy? 🤔

2025-10-25, 11:52 0 boosts 0 favorites

You've already given the service your email address, and your domain already knows your account name - so there's no privacy leak here. Obviously, a service shouldn't hotlink to your avatar image.

How about DNS?

I like it. Is there an argument that service / endpoint should be specifiable at the DNS level?As others in your comments pointed out, if your site is currently just static, some users might prefer to run an entirely separate dedicated avatar service.

Emily Shepherd (@emi.ly) 2025-10-25T11:57:43.456Z

Personally, I think that's a bit complicated, but I'm happy to be convinced.

Proposal

I think the default should be to return an image.

If an accept of image/… is requested, the server should try to return an image in that format.

If an accept of application/json or similar is requested, the server should return a JSON document listing the available avatars.

I don't think a ?size= GET parameter is necessary; services can resize once they've downloaded, or use the JSON document to get the right size.

A limited amount of alt text could be added using the title attribute in the JSON.

Before I start writing up anything formal - I'd love your constructive criticism on this.


  1. OK, I don't have to. But I want to. I dislike having last year's photo cluttering some half-remembered social network. ↩︎

  2. We live in the redecentralised future now! ↩︎

  3. I wrote about this in 2004 and in 2020. It takes me time, but I get there eventually! ↩︎

@Edent@mastodon.social
@blog@shkspr.mobi

Alpha launch - .well-known/avatar - feedback wanted

shkspr.mobi/blog/2025/10/alpha

I've gotten sufficiently annoyed with a trivial problem that I'm preparing to write an IETF RFC. Yeah. That's how ticked off I am!

Every site that I sign up for asks me to upload an avatar to represent myself. Whenever I change my photo, I have to log in to a hundred sites and change it there0.

Perhaps they could all use Gravatar - but that's a centralised service1 and doesn't work with wildcard email addresses. Libravatar also relies on email addresses and requires implementers to set up new DNS entries.

So I'm proposing .well-known/avatar. Here's how it works (for now). I'd like your feedback before going further2.

I sign up to a service and use the email address whatever@shkspr.mobi.

The service looks up my avatar using a well-known path. For example, request https://shkspr.mobi/.well-known/avatar?resource=acct:whatever@shkspr.mobi and you'll get back this JSON:

 JSON{    "subject": "acct:whatever@shkspr.mobi",    "links": [        {              "rel": "http:\/\/webfinger.net\/rel\/avatar",             "type": "image\/webp",             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-1024.webp",            "sizes": "1024x1024"        },        {              "rel": "http:\/\/webfinger.net\/rel\/avatar",             "type": "image\/jpeg",             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-512.jpg",            "sizes": "512x512"        }    ]}

That's a slightly enhanced https://webfinger.net/rel/#avatar which adds a sizes parameter. The service can then pick the appropriate MIME and size.

Alternatively, you can request the same URl but with a header of Accept: image/gif and receive the default sized avatar in that specific format.

Try it by running:

 Bashcurl -H "Accept: image/avif" https://shkspr.mobi/.well-known/avatar/ --output "test.avif"

You should receive an auto-converted version of my avatar.

Some Thoughts

Please add your thoughts to the comments box. Here's some feedback I've received so far.

Perhaps this is too complicated? What's wrong with just serving up an image when the URl is requested? That would make it easier for static sites.

@Edent Thinking about this, while I like content negotiation as a clever hack, I wonder if maybe it isn’t too clever. The nice thing with WKD is that you can deploy it with any normal static HTTP file without any special magic. Maybe the protocol could be dumbed down to simply rely on WKD-style URLs? I’m not sure how to configure my web server (Apache) for your avatar well known URL with negotiation magic.

2025-10-23, 16:50 0 boosts 1 favorites

What about a size parameter?

@Edent It'd be nice if the query could limit the size of the avatar being returned. If only there were `Accept-Max-Size`, but maybe a query param? I wouldn't want my performance taking a dive if Alice has a 35M avatar that my client starts downloading. If my client had requested with `max_size=3072` I'd rather not see the avatar than degrade performance/pull excess data

2025-10-23, 15:02 0 boosts 1 favorites

Will anyone actually use it?

@Edent good luck with getting the hundreds of services to implement it. I mean it. it would be awesome and you might be well connected enough to make it happen.

What about hashing the email?

@Edent would using a hash of the email address in its place improve privacy? 🤔

2025-10-25, 11:52 0 boosts 0 favorites

You've already given the service your email address, and your domain already knows your account name - so there's no privacy leak here. Obviously, a service shouldn't hotlink to your avatar image.

How about DNS?

I like it. Is there an argument that service / endpoint should be specifiable at the DNS level?As others in your comments pointed out, if your site is currently just static, some users might prefer to run an entirely separate dedicated avatar service.

Emily Shepherd (@emi.ly) 2025-10-25T11:57:43.456Z

Personally, I think that's a bit complicated, but I'm happy to be convinced.

Proposal

I think the default should be to return an image.

If an accept of image/… is requested, the server should try to return an image in that format.

If an accept of application/json or similar is requested, the server should return a JSON document listing the available avatars.

I don't think a ?size= GET parameter is necessary; services can resize once they've downloaded, or use the JSON document to get the right size.

A limited amount of alt text could be added using the title attribute in the JSON.

Before I start writing up anything formal - I'd love your constructive criticism on this.


  1. OK, I don't have to. But I want to. I dislike having last year's photo cluttering some half-remembered social network. ↩︎

  2. We live in the redecentralised future now! ↩︎

  3. I wrote about this in 2004 and in 2020. It takes me time, but I get there eventually! ↩︎

@xandra@tilde.zone
@xandra@tilde.zone
@xandra@tilde.zone
@Roundtrip@federate.social

“Unless you were an expert, you would almost certainly think I had typed in a search box and gotten back a web page with search results. But in reality, I had typed in a prompt box and gotten back a synthesized response that superficially resembles a web page, and it uses some web technologies to display its output. Instead of a list of links to websites that had information about the topic, it had bullet points describing things it thought I should know.“

anti
me.dm/@anildash/11541990932657

me.dm

Anil Dash (@anildash@me.dm)

Imagine a browser where you type in “Taylor Swift” and it doesn’t even admit that her website exists. I write about Atlas, ChatGPT’s new anti-web browser that should come with a warning label. https://www.anildash.com/2025/10/22/atlas-anti-web-browser/

@watchfulcitizen@goingdark.social

People who actually prefer light mode are wrong

text reads "How dark mode users describe light mode." Image shows a person in a grey t-shirt holding a bright illuminated lamp directly next to their face, the light washing out their features.
ALT text

text reads "How dark mode users describe light mode." Image shows a person in a grey t-shirt holding a bright illuminated lamp directly next to their face, the light washing out their features.

@matiu_bidule@mamot.fr

Tiens on dirait que la centralisation excessive des services web fait encore des siennes, même zoom est down au taf ... (poke @delta )








Actu 
AWS outage affects everything from Signal to Snapchat
Published: 20 October 2025

Issues affecting Amazon Web Services (AWS) has caused massive outages Affecting a multiude of services including Signal, Snapchat, Amazon, Ring, and many others.

Almost 50 websites and apps appear to be down, with up to 13,000 users reporting issues, according to DownDetector, a platform where users can self report website outages.

meme : image de Scruffy les mains derrière la tête :
Moi j'utilise Delta Chat un outil réellement décentralisé avec zéro bullshit dedans.
ALT text

Actu AWS outage affects everything from Signal to Snapchat Published: 20 October 2025 Issues affecting Amazon Web Services (AWS) has caused massive outages Affecting a multiude of services including Signal, Snapchat, Amazon, Ring, and many others. Almost 50 websites and apps appear to be down, with up to 13,000 users reporting issues, according to DownDetector, a platform where users can self report website outages. meme : image de Scruffy les mains derrière la tête : Moi j'utilise Delta Chat un outil réellement décentralisé avec zéro bullshit dedans.

»KeePassDX 4.2.0 unterstützt endlich Passkeys«

Nun endlich Passkeys auch auf dem Smartphone nutzbar und dies ohne kommerziellen Drittanbietern. Die Desktop Variante @keepassxc unterstützt Passkeys schon länger. Ich vertraue denen mehr obwohl deren Nutzung minimal umständlicher ist.

🔐 stadt-bremerhaven.de/keepassdx

stadt-bremerhaven.de

KeePassDX 4.2.0 unterstützt endlich Passkeys

Wer auf der Suche nach einem  Passwortmanager für Android ist, hat ja einiges an Auswahl. Bitwarden, 1Password, Enpass, vielleicht sogar ...

»KeePassDX 4.2.0 unterstützt endlich Passkeys«

Nun endlich Passkeys auch auf dem Smartphone nutzbar und dies ohne kommerziellen Drittanbietern. Die Desktop Variante @keepassxc unterstützt Passkeys schon länger. Ich vertraue denen mehr obwohl deren Nutzung minimal umständlicher ist.

🔐 stadt-bremerhaven.de/keepassdx

stadt-bremerhaven.de

KeePassDX 4.2.0 unterstützt endlich Passkeys

Wer auf der Suche nach einem  Passwortmanager für Android ist, hat ja einiges an Auswahl. Bitwarden, 1Password, Enpass, vielleicht sogar ...

@eric@social.coop · Reply to Eric Maugendre

"Not all people using screen readers are blind. Some may have enough vision to know that an image is on the screen but not to make out its content. And some people with thinking disabilities may see the image but struggle to interpret it. All these people expect their screen reader to describe the image for them."

by Ela Gorla: tetralogical.com/blog/2025/10/ via @SaraSoueidan

tetralogical.com

Common misconceptions about screen readers - TetraLogical

Screen readers are familiar to many in digital, but how they work in practice can be less clear. In this post, we shed some light on the topic.

»HTML’s Best Kept Secret — The <output> Tag:
Every developer knows <input>. It’s the workhorse of the web. But <output>? Most have never touched it. Some don’t even know it exists. […]«
— by @denodell

You never stop learning and you can't know everything about as a WebDev. Nice to see how you can use the HTML interface actiev.

🧑‍💻 denodell.com/blog/html-best-ke

denodell.com

HTML’s Best Kept Secret: The output Tag

Make your dynamic content accessible by default with the HTML tag that time forgot.

@matthiasott@mastodon.social
@matthiasott@mastodon.social
@anatudor@mastodon.social

For details about the how, check out my newest article: Inset Shadows Directly on `img` Elements frontendmasters.com/blog/inset

It has step by step interactive demos to help with getting a better feel for the technique.

frontendmasters.com

Inset Shadows Directly on img Elements (Part 1) – Frontend Masters Blog

Inset `box-shadow` doesn't work directly on image elements. There are work-arounds, but this SVG filter can do it directly. Don't run! There is powerful stuff to learn here through interactive demos.

@anatudor@mastodon.social

Little @codepen demo: single `img` squircles + grainy inset shadow codepen.io/thebabydino/pen/LEG

(for `img`, the actual image is content & gets painted on top of shadows; the earlier workaround has been a sibling/ parent's pseudo used as a "cover" that gets the shadow; none of it here 😼)

A grid of squircle-shaped images with grainy inner shadows that also have a spread.
ALT text

A grid of squircle-shaped images with grainy inner shadows that also have a spread.

@anatudor@mastodon.social

For details about the how, check out my newest article: Inset Shadows Directly on `img` Elements frontendmasters.com/blog/inset

It has step by step interactive demos to help with getting a better feel for the technique.

frontendmasters.com

Inset Shadows Directly on img Elements (Part 1) – Frontend Masters Blog

Inset `box-shadow` doesn't work directly on image elements. There are work-arounds, but this SVG filter can do it directly. Don't run! There is powerful stuff to learn here through interactive demos.

@anatudor@mastodon.social

Little @codepen demo: single `img` squircles + grainy inset shadow codepen.io/thebabydino/pen/LEG

(for `img`, the actual image is content & gets painted on top of shadows; the earlier workaround has been a sibling/ parent's pseudo used as a "cover" that gets the shadow; none of it here 😼)

A grid of squircle-shaped images with grainy inner shadows that also have a spread.
ALT text

A grid of squircle-shaped images with grainy inner shadows that also have a spread.

@anatudor@mastodon.social

Little @codepen demo: single `img` squircles + grainy inset shadow codepen.io/thebabydino/pen/LEG

(for `img`, the actual image is content & gets painted on top of shadows; the earlier workaround has been a sibling/ parent's pseudo used as a "cover" that gets the shadow; none of it here 😼)

A grid of squircle-shaped images with grainy inner shadows that also have a spread.
ALT text

A grid of squircle-shaped images with grainy inner shadows that also have a spread.

@petersuber@fediscience.org

Tim Berners-Lee (@timbl) explains why he gave away the for free.
theguardian.com/technology/202

"For the web to have everything on it, everyone had to be able to use it, and want to do so. This was already asking a lot. I couldn’t also ask that they pay for each search or upload they made. In order to succeed, therefore, it would have to be free. That’s why, in 1993, I convinced my managers to donate the intellectual property of the world wide web, putting it into the public domain. We gave the web away to everyone."

But he adds:

"Today, I look at my invention and I am forced to ask: is the web still free today? No, not all of it. We see a handful of large platforms harvesting users’ private data to share with commercial brokers or even repressive governments…Trading personal data for use certainly does not fit with my vision for a free web."

theguardian.com

Why I gave the world wide web away for free | Tim Berners-Lee

My vision was based on sharing, not exploitation – and here’s why it’s still worth fighting for

@petersuber@fediscience.org

Tim Berners-Lee (@timbl) explains why he gave away the for free.
theguardian.com/technology/202

"For the web to have everything on it, everyone had to be able to use it, and want to do so. This was already asking a lot. I couldn’t also ask that they pay for each search or upload they made. In order to succeed, therefore, it would have to be free. That’s why, in 1993, I convinced my managers to donate the intellectual property of the world wide web, putting it into the public domain. We gave the web away to everyone."

But he adds:

"Today, I look at my invention and I am forced to ask: is the web still free today? No, not all of it. We see a handful of large platforms harvesting users’ private data to share with commercial brokers or even repressive governments…Trading personal data for use certainly does not fit with my vision for a free web."

theguardian.com

Why I gave the world wide web away for free | Tim Berners-Lee

My vision was based on sharing, not exploitation – and here’s why it’s still worth fighting for

@petersuber@fediscience.org

Tim Berners-Lee (@timbl) explains why he gave away the for free.
theguardian.com/technology/202

"For the web to have everything on it, everyone had to be able to use it, and want to do so. This was already asking a lot. I couldn’t also ask that they pay for each search or upload they made. In order to succeed, therefore, it would have to be free. That’s why, in 1993, I convinced my managers to donate the intellectual property of the world wide web, putting it into the public domain. We gave the web away to everyone."

But he adds:

"Today, I look at my invention and I am forced to ask: is the web still free today? No, not all of it. We see a handful of large platforms harvesting users’ private data to share with commercial brokers or even repressive governments…Trading personal data for use certainly does not fit with my vision for a free web."

theguardian.com

Why I gave the world wide web away for free | Tim Berners-Lee

My vision was based on sharing, not exploitation – and here’s why it’s still worth fighting for

@teleclimber@social.tchncs.de
@NIGHTEN@hi.nighten.fr

Fun Internet Theory

I came across this post by @Jo , that captured a feeling I’ve had for a long time:

“Fun internet Theory” states that there are still a lot of cool and interesting things to do online.

This is a reference to the Dead Internet Theory, which states that the internet is invaded with bots and algorithmic slop.

(The theory has way more strange and absurd ramifications if you dig far enough. They are not worth your time, so this is the basic understanding most people have when they hear the term.)

I love how positive this definition of the Fun Internet Theory is. It’s an optimism that is more realistic than you might think.

You see, I refuse to think of the internet as what is being served by algorithms and mainstream social media. It’s as absurd as looking at the top grossing films every year and being like “Man, all movies are the same these days”.

The old internet, or at least the part we cherish, did not disappear. It wasn’t replaced by bots; we got our attention stolen from it.

We’ve deluded ourselves into thinking that social media (and thus the web) is all there is to see. That you must keep up with international news and the discourse of the day. You must hold an opinion and defend it, or at least find people that confirm your biases.

I refuse to think that the internet is only this.

The other thing I love about Fun Internet Theory is that it states that there are a lot of cool things to do on the web.

The internet is a much sadder place when all you do is consume passively whatever is delivered to you this day. Instead, being active should be at the forefront. But being active doesn’t mean you need to run your own website! It starts with you being more involved in what you see and how you interact with it.

This is not only gonna bring you to interesting places, interesting people (like you!), but it’s also way more satisfying! Even if from the outside view you are missing out on the daily noise.

So go, explore the weirder parts of the web! Weird wiki on a specific topic, obscure game on itch.io, small musician on Soundcloud, or random people’s blog.

But even better, be a part of it!

Comment on someone’s post, share a montage of your favorite game screenshot, seed a torrent, make a meme! Or make friends and help people in a small Discord server!

Do cool things on the internet, because there are and always will be a lot of cool and interesting things to do :)

#socialmedia #internet #web #blogging #fediverse

hi.nighten.fr

Akkoma

@Tudwall@eldritch.cafe

Salut ! Je suis toujours en recherche de contrat d'apprentissage concepteur développeur d'application aux alentours de Pau ou remote, ma formation commence aujourd'hui, j'ai déjà le titre pro développeur web et je suis bien chaud pour la suite ! J'ai déja fait un stage de deux mois en entreprise où j'ai pu pratiquer Angular 19 et le fonctionnement sur le terrain. Je suis dispo en DM pour plus d'infos et pour mon CV/motivation.

Merci d'avance pour les partages !

@Tudwall@eldritch.cafe

Salut ! Je suis toujours en recherche de contrat d'apprentissage concepteur développeur d'application aux alentours de Pau ou remote, ma formation commence aujourd'hui, j'ai déjà le titre pro développeur web et je suis bien chaud pour la suite ! J'ai déja fait un stage de deux mois en entreprise où j'ai pu pratiquer Angular 19 et le fonctionnement sur le terrain. Je suis dispo en DM pour plus d'infos et pour mon CV/motivation.

Merci d'avance pour les partages !

@Blort@social.tchncs.de · Reply to Servo

@servo

I really believe in supporting Servo as an independent, non-profit rendering engine (and boy do we need one now!).

I followed this account in hopes of finding some cool updates that I could share with people to help promote the project.

The trouble is that the updates posted always just read like developer jargon and don't give much of a sense of what's useful or exciting about the latest improvements.

Maybe it would help to have pictures of what a webpage would have looked like before and after the improvements would help? Just something to translate improvements back to something people outside the project would understand.

Anyway, keep up the great work. It's appreciated, now more than ever!

@astro_jcm@mastodon.online

🚨 ALERT 🚨

Here at the Department of Communication of @esoastronomy in we're offering two jobs in our team:

Head of Digital Communications: recruitment.eso.org/jobs/2025_
Web Developer: recruitment.eso.org/jobs/2025_

Deadline: 4 October 2025. More info in the links above or at vacancy@eso.org

📷 Cool pic of comet NEOWISE & noctilucent clouds over our offices by my webteam friend Raquel Shida

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.
ALT text

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.

@pfefferle@mastodon.social
@astro_jcm@mastodon.online

🚨 ALERT 🚨

Here at the Department of Communication of @esoastronomy in we're offering two jobs in our team:

Head of Digital Communications: recruitment.eso.org/jobs/2025_
Web Developer: recruitment.eso.org/jobs/2025_

Deadline: 4 October 2025. More info in the links above or at vacancy@eso.org

📷 Cool pic of comet NEOWISE & noctilucent clouds over our offices by my webteam friend Raquel Shida

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.
ALT text

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.

@astro_jcm@mastodon.online

🚨 ALERT 🚨

Here at the Department of Communication of @esoastronomy in we're offering two jobs in our team:

Head of Digital Communications: recruitment.eso.org/jobs/2025_
Web Developer: recruitment.eso.org/jobs/2025_

Deadline: 4 October 2025. More info in the links above or at vacancy@eso.org

📷 Cool pic of comet NEOWISE & noctilucent clouds over our offices by my webteam friend Raquel Shida

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.
ALT text

Blue wavy clouds – almost like the surface of a pond – above a group of buildings. At the top-centre of the image there's a small white dot with an short tail: a comet.

@nycki@app.wafrn.net

I'll write about this on my blog later I swear, but RE: https://app.wafrn.net/fediverse/post/d01d4de5-3c2e-4aa8-ab55-21d484ea4764

I'm actually colorblind (protanomaly for the color nerds), so it's hard for me to pick colors that look "high contrast" to me without accidentally picking like, four shades of green or something.

So instead of picking colors from scratch, I did a lot of referencing the xkcd color survey! These colors were chosen by @xkcd.com based on data from a viewer survey, and are fairly representative of what color someone is actually thinking of when they say "magenta" (hint: it's NOT ff00ff).

For convenience, I've converted this list into a CSS library, xkcd.css. I use this all the time for putting colors on my webbed site :3


#web #color #css #xkcd #colorblind #cards

app.wafrn.net

Wafrn, the social media that respects you

Wafrn is a federated social media inspired by tumblr that connects with the fediverse and bluesky

@nycki@app.wafrn.net

I'll write about this on my blog later I swear, but RE: https://app.wafrn.net/fediverse/post/d01d4de5-3c2e-4aa8-ab55-21d484ea4764

I'm actually colorblind (protanomaly for the color nerds), so it's hard for me to pick colors that look "high contrast" to me without accidentally picking like, four shades of green or something.

So instead of picking colors from scratch, I did a lot of referencing the xkcd color survey! These colors were chosen by @xkcd.com based on data from a viewer survey, and are fairly representative of what color someone is actually thinking of when they say "magenta" (hint: it's NOT ff00ff).

For convenience, I've converted this list into a CSS library, xkcd.css. I use this all the time for putting colors on my webbed site :3


#web #color #css #xkcd #colorblind #cards

app.wafrn.net

Wafrn, the social media that respects you

Wafrn is a federated social media inspired by tumblr that connects with the fediverse and bluesky

@newsmast@newsmast.social

An estimated 5.56 billion people have access to the internet. Across social media there are 5.24 billion individual accounts. But there's only a handful of platform owners.

Something isn't adding up.

This gap leaves room for all sorts of dodgy dealing, god-like complexes, and unlawful behaviour.

Open social media, like the Open Social Web, can be the answer.

An image showing 5.56 billion web users compared to 5.24 billion social accounts. The copy reads: Not everyone on the internet uses social media. But most do.

That’s why we believe social media should be built for the public, putting their social experience at the forefront, not the needs of advetisers.
ALT text

An image showing 5.56 billion web users compared to 5.24 billion social accounts. The copy reads: Not everyone on the internet uses social media. But most do. That’s why we believe social media should be built for the public, putting their social experience at the forefront, not the needs of advetisers.

@newsmast@newsmast.social

An estimated 5.56 billion people have access to the internet. Across social media there are 5.24 billion individual accounts. But there's only a handful of platform owners.

Something isn't adding up.

This gap leaves room for all sorts of dodgy dealing, god-like complexes, and unlawful behaviour.

Open social media, like the Open Social Web, can be the answer.

An image showing 5.56 billion web users compared to 5.24 billion social accounts. The copy reads: Not everyone on the internet uses social media. But most do.

That’s why we believe social media should be built for the public, putting their social experience at the forefront, not the needs of advetisers.
ALT text

An image showing 5.56 billion web users compared to 5.24 billion social accounts. The copy reads: Not everyone on the internet uses social media. But most do. That’s why we believe social media should be built for the public, putting their social experience at the forefront, not the needs of advetisers.

@aamurusko79@tech.lgbt

I wish search engines had an option to downvote the results. I know why it isn't practical, but everything is so SEO'd that for a lot of stuff it's a lot better to try to think less obvious keywords to find the desired information.

@aamurusko79@tech.lgbt

I wish search engines had an option to downvote the results. I know why it isn't practical, but everything is so SEO'd that for a lot of stuff it's a lot better to try to think less obvious keywords to find the desired information.

@xorbit@noc.social

It's hard to overstate just how much the ManT1S-Bridge improves the T1S . When I started working with the first ManT1S , it was hard. Here were these devices providing APIs, but the only way I could test them was with another T1S device! It felt like working on a tech island, isolated from the rest of the world and none of the tools you're familiar with work.

@anatudor@mastodon.social

How would you code this with:

✨ 1 HTML element, no JS, no SVG
✨ inner border interrupted by text box shape
✨ responsive
✨ text wraps depending on space
✨ contenteditable
✨ 1 image = the background one

(if you're Cheetah+ on Ko-fi/ Patreon, you know where to find the answer)

Text that can wrap depending on available space in the bottom left corner of a card with padding. At the limit between the card's padding area and content area, there's an inner border interrupted in the bottom left corner by the text box. The text is contenteditable.
ALT text

Text that can wrap depending on available space in the bottom left corner of a card with padding. At the limit between the card's padding area and content area, there's an inner border interrupted in the bottom left corner by the text box. The text is contenteditable.

@anatudor@mastodon.social

How would you code this with:

✨ 1 HTML element, no JS, no SVG
✨ inner border interrupted by text box shape
✨ responsive
✨ text wraps depending on space
✨ contenteditable
✨ 1 image = the background one

(if you're Cheetah+ on Ko-fi/ Patreon, you know where to find the answer)

Text that can wrap depending on available space in the bottom left corner of a card with padding. At the limit between the card's padding area and content area, there's an inner border interrupted in the bottom left corner by the text box. The text is contenteditable.
ALT text

Text that can wrap depending on available space in the bottom left corner of a card with padding. At the limit between the card's padding area and content area, there's an inner border interrupted in the bottom left corner by the text box. The text is contenteditable.

@Greenheart@fosstodon.org

Wow! You know that is getting really good when you are able to replace significant amounts of with a few lines of and . Best part is the fact that you get out of the box with native widgets 🙌

A few examples: `<dialog closedby="any">`, stylable `<select>` and even HTML autocomplete/typeahead using the `<datalist>`.

@eulanov@m.eula.dev
Qiitaのデカい釣り針の話なのでCW

【TCP/IP】重要な技術すぎる - Qiita qiita.com/im_yoneda/items/10f0

Googleさん、ぼくのためだと言ってなんでもかんでも拾わんでくれ。Geminiちゃんが質を評価してからオススメしてくれんかのぅ。あと、ここの会社の人もこういうのはいったん先輩にレビューさせてから公開しなさいよー

qiita.com

【TCP/IP】重要な技術すぎる - Qiita

はじめに TCP/IPを学んで衝撃を受けたのでまとめます。 現代がこんなに便利なのはこの技術のおかげかもしれません。 TCP/IPって何? TCP/IPは「Transmission Control Protocol/Internet Protocol」の略で、インターネ...

»CrowdBucks is a new payment system for the Fediverse:
An open source, self-hostable payment system.«

It's exciting to see that there is now @crowdbucks in the Fediverse, but on the other hand, I don't know if this makes any sense at all, since they are also tied to Stripe again – at least not to PayPal.

💲 wedistribute.org/2025/08/intro

wedistribute.org

CrowdBucks is a new payment system for the Fediverse - We Distribute

A new, open source, self-hostable fundraising system for the Fediverse has been released. The project is very young, but there’s a huge amount of promise.

@neverpanic@chaos.social

I've had it with the aggressive now. Some bot has been hitting with a legitimate enough user agent that I can't block it without also blocking users.

Yesterday, it sent 377k requests (62 % of the total), 369k to URLs forbidden in robots.txt from 274k unique IPs. Most of it for content that could be analyzed quicker using `svn checkout` or `git clone`.

Dynamic content on the is broken. There's just no way to do that anymore. What a waste of energy.

@neverpanic@chaos.social

I've had it with the aggressive now. Some bot has been hitting with a legitimate enough user agent that I can't block it without also blocking users.

Yesterday, it sent 377k requests (62 % of the total), 369k to URLs forbidden in robots.txt from 274k unique IPs. Most of it for content that could be analyzed quicker using `svn checkout` or `git clone`.

Dynamic content on the is broken. There's just no way to do that anymore. What a waste of energy.

@xandra@tilde.zone
@xandra@tilde.zone
@aral@mastodon.ar.al

The new integrated Markdown parser I’ve been implementing in Kitten has been kicking my ass for the past few weeks but I think I finally have it fully working and seamlessly so. Expect a new release this/next week that brings the parsing of Markdown pages (.page.md files) in your apps up to the standard of the recently-improved runtime Markdown parsing in Kitten HTML tagged-template strings (within `<markdown>…</markdown>` blocks).

The coolest thing is I was able to implement this without introducing any new syntax. In fact, I was able to simplify things so that you can now add arbitrary JavaScript to your Markdown pages within a multi-line script block in the YAML front matter (`script: |`) and use JavaScript string interpolation syntax in your Markdown (and, of course, Kitten components and conditionals, which, themselves, rely on string interpolation).

The only place where you have to deviate from standard Markdown in your Markdown pages is if you have JavaScript string interpolations or Kitten components/conditionals in code fences within your Markdown. In that case, you’ll have to escape them (e.g., `<\${Component} />`, `\<if \${something}>something\</if>`, etc.). And, to be fair, the person most impacted by this is likely me as the Kitten documentation at kitten.small-web.org is written in Kitten so I had a lot of escaping to do. But for any other use case, it means that things should just work and work exactly as they do in JavaScript pages (page.js files).

Anyway, so this is going to be a breaking change so I thought I’d give you (the three of you playing with Kitten right now?) a heads up. Of course, I’ll be updating the documentation to reflect all this.

(Remember, Kitten is in pre-release and it’s the framework I’m building/using to create Catalyst – the Small Web hosting solution – and Yarn – a small web – peer to peer – personal site app. So Kitten isn’t the means, not the end. And, at least until the Version 1 API freeze, things can and will break. That said, there’s nothing stopping you from playing with it now and, to be fair, at this point, such breaking changes should become rarer and rarer).

:kitten:💕

kitten.small-web.org

Kitten: Home

@markwyner@mas.to

⚠️ IMPORTANT for domain owners ⚠️

ICANN will have a new policy on domain ownership effective August 21st.

If your domain registration includes a company name, the company owns the domain, not you. Even if you use your first/last name AND a company, the company reigns.

So if your domain is yours and no one else’s, make sure it’s properly registered to you: leave the company name empty.

icann.org/en/contracted-partie

icann.org

Registration Data Policy

The Registration Data Policy ("Policy") is an ICANN Consensus Policy that describes requirements for Processing Registration Data for each ICANN-accredited Registrar ("Registrar") and gTLD Registry Operator that has an agreement with ICANN ("Registry Operator").

@TheEvilSkeleton@treehouse.systems · Reply to TheEvilSkeleton

To elaborate on my hostility against WebKit: WebKit does nothing but get in my way whenever I work on literally any website.

When I rewrote nouveau's website in late 2023, the website worked perfectly fine on Firefox (Gecko) and Chromium (Blink), but was broken on Epiphany/Safari (WebKit). The logo, which is an SVG, would not adapt to dark style, because, to this day, WebKit still does not support prefers-color-scheme in SVGs. So, as a workaround, instead of having one SVG file for both color schemes, we have one SVG file for light style, and one for dark style.

Another example: On my website, some elements are intentionally made to be unselectable using user-select: none;, such as the command-line decoration and the “Table of Contents” text, but on WebKit, these elements continue to be selectable because it does not properly support the user-select property. And no, using the vendor prefix is completely unacceptable, especially considering that it behaves differently.

Lastly, WebKit does not yet fully support the ::marker pseudo-element. This means, in my articles, numbered list items in the table of contents are completely wrong and don't represent the same numbers as headings.

Apple has consistently proved that they don't care about WebKit, because otherwise browsers like Safari and Epiphany would have worked as well as they do on Firefox and Chromium. There's absolutely no reason to force WebKit onto iOS and iPadOS if they're not even willing to invest in WebKit. Likewise, Apple employees working on WebKit should really stop calling themselves “WebKit evangelists” if their inferior engine regularly gets in developers’ way. So yes, WebKit sucks, and this is 100% on Apple. I don't care about being harsh. Apple is a multi-trillion dollar company, most of which came from exploiting people. The least they can do is invest in their projects.

For clarity, my hostility towards WebKit is purely targeted at Apple's lack of involvement with WebKit, not the browsers using it.

developer.mozilla.org

::marker - CSS | MDN

The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements.

@TheEvilSkeleton@treehouse.systems · Reply to TheEvilSkeleton

To elaborate on my hostility against WebKit: WebKit does nothing but get in my way whenever I work on literally any website.

When I rewrote nouveau's website in late 2023, the website worked perfectly fine on Firefox (Gecko) and Chromium (Blink), but was broken on Epiphany/Safari (WebKit). The logo, which is an SVG, would not adapt to dark style, because, to this day, WebKit still does not support prefers-color-scheme in SVGs. So, as a workaround, instead of having one SVG file for both color schemes, we have one SVG file for light style, and one for dark style.

Another example: On my website, some elements are intentionally made to be unselectable using user-select: none;, such as the command-line decoration and the “Table of Contents” text, but on WebKit, these elements continue to be selectable because it does not properly support the user-select property. And no, using the vendor prefix is completely unacceptable, especially considering that it behaves differently.

Lastly, WebKit does not yet fully support the ::marker pseudo-element. This means, in my articles, numbered list items in the table of contents are completely wrong and don't represent the same numbers as headings.

Apple has consistently proved that they don't care about WebKit, because otherwise browsers like Safari and Epiphany would have worked as well as they do on Firefox and Chromium. There's absolutely no reason to force WebKit onto iOS and iPadOS if they're not even willing to invest in WebKit. Likewise, Apple employees working on WebKit should really stop calling themselves “WebKit evangelists” if their inferior engine regularly gets in developers’ way. So yes, WebKit sucks, and this is 100% on Apple. I don't care about being harsh. Apple is a multi-trillion dollar company, most of which came from exploiting people. The least they can do is invest in their projects.

For clarity, my hostility towards WebKit is purely targeted at Apple's lack of involvement with WebKit, not the browsers using it.

developer.mozilla.org

::marker - CSS | MDN

The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements.

@fell@ma.fellr.net

What I like about the @kagihq built-in LLM answers:

- It's only(!) triggered on request, i.e. when your query ends with a question mark.
- It always admits when it couldn't find good information or there is no clear answer.
- It always cites sources, usually word for word.

I find myself not so much "believing the AI" but rather using it as a guide as to which result has the information I need.

@oblomov@sociale.network
@oblomov@sociale.network
@morbi@chaos.social

Hat hier jemand Erfahrung mit Dynamischen Alerts in HTML/Javascript und Screenreadern? Soweit ich das verstehe sollte der Bereich mit role=alert ja bereits leer existieren damit dann sich ändernder Inhalt vom Browser announced wird. Reicht es diese section beim initialen laden mit JS anzulegen oder sollte die wirklich schon im Serverseitig erstellten html stehen?

@jaseg@chaos.social

I finally came around to writing up the details behind the CSS-only code listings I use on my blog. These listings wrap on page resize with line continuation markers, show scrollbars past a configurable minimum width, support native text selection without the line numbers being copied, and number lines in plain CSS without any JS involved. Have a look, the post is simultaneously a demo:

jaseg.de/blog/css-only-code-bl

A code listing with line numbers showing some HTML source code. Some long lines are wrapped, with little arrows shown in the line number column to indicated wrapped lines. Wrapped lines are indented. A part of the listing's code is selected, and the selection does not extend over the line numbers.
ALT text

A code listing with line numbers showing some HTML source code. Some long lines are wrapped, with little arrows shown in the line number column to indicated wrapped lines. Wrapped lines are indented. A part of the listing's code is selected, and the selection does not extend over the line numbers.

@jaseg@chaos.social

I finally came around to writing up the details behind the CSS-only code listings I use on my blog. These listings wrap on page resize with line continuation markers, show scrollbars past a configurable minimum width, support native text selection without the line numbers being copied, and number lines in plain CSS without any JS involved. Have a look, the post is simultaneously a demo:

jaseg.de/blog/css-only-code-bl

A code listing with line numbers showing some HTML source code. Some long lines are wrapped, with little arrows shown in the line number column to indicated wrapped lines. Wrapped lines are indented. A part of the listing's code is selected, and the selection does not extend over the line numbers.
ALT text

A code listing with line numbers showing some HTML source code. Some long lines are wrapped, with little arrows shown in the line number column to indicated wrapped lines. Wrapped lines are indented. A part of the listing's code is selected, and the selection does not extend over the line numbers.

@madargon@is-a.cat

I feel I am even unable to follow current law projects against or arguments. I am just tired, angry and annoyed with this crap. The most annoying thing is their lying about "protecting children"... all while everyone makes intentional effort to exploit the same children for own profit. And even if this part would be true... Why they have to choose one group to be safe and everyone else would have to deal with increasing toxicity?
It's like they said "we made this area poisonus and radioactive and now we have to think about poor children affected by this. So let's verify everyone's identity to make sure they are mature enough to deal with radioactivity!"
And then "Oh, by the way, it could be convenient to mark dissidents' zones as harmful too..."

And even now they actively create more and more harmful things, embracing it and poison everything with it... also killing planet in the process.

I don't want to reveal my identity and don't want to deal with their radioactivity at all!

@mischiefist@vivaldi.net
@mischiefist@vivaldi.net
@cazabon@mindly.social
@xandra@tilde.zone

, aficionados, enjoyers, browsers: lend me your ears! i need help with a big push to get the word out about for GOOD INTERNET magazine's autumn issue! a digital AND physical magazine that ships all over the world, run & contributed to by volunteers! (‼️)

in case you're unaware, GOOD INTERNET covers a lot of different aspects of the : unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. the aim is to be approachable for beginners and enjoyable for seasoned travelers!

you don't have to be a professional or a smartypants to write about all the good things happening on "this side" of the web. the idea here is to spread the word about and share thoughts, independent web projects, services, methods, sites, meet-ups, and celebrate the non-corporate web together while making it easier for us to partake and unplug from .

📏 looking for 1,000- to 4,000-word articles aimed at website owners and hobbyists, digital (and traditional) , culture enthusiasts, nerds, expatriates, & anyone who wants to unplug from the corporate-owned .

⏲️ the deadline is AUGUST 22, 2025 ⏲️

ℹ️ more info here: goodinternetmagazine.com/conta

goodinternetmagazine.com

Contact Us

Pitching stories Unfortunately, at this time, we cannot pay for article submissions or art. Appropriate topics Articles can either be sourced and journalistic or first-hand accounts and personal stories. Since our magazine is geared towards hobbyists, articles should not be aimed at those who do not already own personal websites

Hey, me! 🥳
I'm looking for a decent , preferably remote.
Any help is appreciated.

I bring a ton of skills and more than a decade of experience as a , have been working mostly on and some over the years, and done lots of programming and in my spare time projects. 🧑‍💻⚙️

My main languages are Rust and JavaScript/TypeScript.
I'm based in Germany.

More details and CV are at dan.orangecms.org/.

Please , thanks!

dan.orangecms.org

Hi, I'm Dan!

@nycki@bark.lgbt

If you've been using or to host your HTML site and you miss the convenience of *markdown and stuff,* I have a tutorial for you! It's a quick no-nonsense guide through installing Eleventy and using it to add Markdown to your HTML website!

github.com/nycki93/eleventy-fo

edit: if you found this tutorial helpful, let me know! even just a "yeah this worked" is good feedback!

a preview image showing markdown being converted to html
ALT text

a preview image showing markdown being converted to html

@BjornW@mastodon.social · Reply to Aral Balkan

@aral That's a shame.

Not sure if you've seen this, but there might be options to solve this (see tickets screenshot) please contact the organization about this, they might be able to do something about this.

It would be a pity if you aren't able to participate due to a funding issue.

@why2025camp

A screenhot of the WHY2025 Dutch Hackercamp ticket options highlighting the 'Low on funds nerd' ticket type with the following text: 

"Can't afford a full priced ticket? No problem! Please let us know what you are able to afford for a ticket.
Please note we will manual validate these tickets and might get in touch with you on the e-mail address of the order.
If you have any question about this, please feel free to contact us at friends@why2025.org."
ALT text

A screenhot of the WHY2025 Dutch Hackercamp ticket options highlighting the 'Low on funds nerd' ticket type with the following text: "Can't afford a full priced ticket? No problem! Please let us know what you are able to afford for a ticket. Please note we will manual validate these tickets and might get in touch with you on the e-mail address of the order. If you have any question about this, please feel free to contact us at friends@why2025.org."

@aral@mastodon.ar.al

Had my talk on Small Web accepted at but I hadn’t realised (my bad) that not only do you have to cover your own travel and accommodation but you also have to buy a ticket to speak. I’m sorry, as part of a tiny two-person not-for-profit working for the common good, I can’t afford to pay to speak at events. I’m not Deloitte. So I sadly had to withdraw my talk.

If any conferences do want to hear about the Small Web and are willing to support our work by paying us to speak about it, please feel free to get in touch:

small-tech.org/contact-us/

small-tech.org

Small Technology Foundation: Contact Us

We’re available for speaking engagements, media interviews about our work, and to chat to VPS hosts about working together.

@anatudor@mastodon.social

I wrote a new article for Frontend Masters: Step Gradients with a Given Number of Steps!

Consider this problem: you are given 2 hex codes + a number of steps. How would you code a step gradient? Think about it, then see my solution frontendmasters.com/blog/step-

Hope you enjoy, a lot of work went into it.

screenshot for one of the demos in the article
ALT text

screenshot for one of the demos in the article

@anatudor@mastodon.social

I wrote a new article for Frontend Masters: Step Gradients with a Given Number of Steps!

Consider this problem: you are given 2 hex codes + a number of steps. How would you code a step gradient? Think about it, then see my solution frontendmasters.com/blog/step-

Hope you enjoy, a lot of work went into it.

screenshot for one of the demos in the article
ALT text

screenshot for one of the demos in the article

@aral@mastodon.ar.al
@aral@mastodon.ar.al
@jon@vivaldi.net

I was on a new podcast called WTF Now. My episode is called How the internet went wrong. Sad title, but you will understand when you listen.

This is really back to my strong belief that we need regulation when it comes to user profiling. IMHO it should just be banned. Have a listen and let me know what you think!

youtube.com/watch?v=NxvqCwu2cI

youtube.com

Episode 3: How the internet went wrong

Enjoying the podcast? Tap follow, leave a review, or give us a like.As the internet grows more polarised and manipulated, we’re joined by Jon von Tetzchner—c...

@jon@vivaldi.net

I was on a new podcast called WTF Now. My episode is called How the internet went wrong. Sad title, but you will understand when you listen.

This is really back to my strong belief that we need regulation when it comes to user profiling. IMHO it should just be banned. Have a listen and let me know what you think!

youtube.com/watch?v=NxvqCwu2cI

youtube.com

Episode 3: How the internet went wrong

Enjoying the podcast? Tap follow, leave a review, or give us a like.As the internet grows more polarised and manipulated, we’re joined by Jon von Tetzchner—c...

@jon@vivaldi.net

I was on a new podcast called WTF Now. My episode is called How the internet went wrong. Sad title, but you will understand when you listen.

This is really back to my strong belief that we need regulation when it comes to user profiling. IMHO it should just be banned. Have a listen and let me know what you think!

youtube.com/watch?v=NxvqCwu2cI

youtube.com

Episode 3: How the internet went wrong

Enjoying the podcast? Tap follow, leave a review, or give us a like.As the internet grows more polarised and manipulated, we’re joined by Jon von Tetzchner—c...

@FlipboardUK@flipboard.social
@FlipboardUK@flipboard.social
@lobsters@mastodon.social

Two Approaches to Solving the “Quiet Fediverse” Problem: Conversation Backfilling Mechanisms lobste.rs/s/akvlo8
hackers.pub/@hongminhee/2025/q

hackers.pub

Two Approaches to Solving the "Quiet Fediverse" Problem: Conversation Backfilling Mechanisms

This post addresses the "quiet fediverse" problem, where users often experience fragmented conversations on decentralized social networks. The core issue stems from ActivityPub's distributed nature, where conversations are spread across multiple servers, leading to incomplete views of discussions. The author explores two main approaches to solve this: reply tree crawling and the context owner approach. Reply tree crawling, pioneered by Mastodon, involves fetching all replies to reconstruct the conversation, while the context owner approach centralizes conversation management with the original author or designated entity. The post details the technical mechanisms, advantages, and disadvantages of each method, highlighting the importance of the `context` attribute in ActivityPub. It also discusses ongoing debates, such as moderation paradigms and solutions for missing parent propagation, and introduces additional backfill mechanisms like periodic crawling and mention-based discovery. The article emphasizes the need for hybrid approaches, combining multiple strategies to ensure more complete conversations, and underscores the importance of standardization efforts and collaboration among different implementations. Ultimately, the post provides a comprehensive overview of the challenges and potential solutions for creating a more connected and coherent user experience in the fediverse.

@lobsters@mastodon.social

Two Approaches to Solving the “Quiet Fediverse” Problem: Conversation Backfilling Mechanisms lobste.rs/s/akvlo8
hackers.pub/@hongminhee/2025/q

hackers.pub

Two Approaches to Solving the "Quiet Fediverse" Problem: Conversation Backfilling Mechanisms

This post addresses the "quiet fediverse" problem, where users often experience fragmented conversations on decentralized social networks. The core issue stems from ActivityPub's distributed nature, where conversations are spread across multiple servers, leading to incomplete views of discussions. The author explores two main approaches to solve this: reply tree crawling and the context owner approach. Reply tree crawling, pioneered by Mastodon, involves fetching all replies to reconstruct the conversation, while the context owner approach centralizes conversation management with the original author or designated entity. The post details the technical mechanisms, advantages, and disadvantages of each method, highlighting the importance of the `context` attribute in ActivityPub. It also discusses ongoing debates, such as moderation paradigms and solutions for missing parent propagation, and introduces additional backfill mechanisms like periodic crawling and mention-based discovery. The article emphasizes the need for hybrid approaches, combining multiple strategies to ensure more complete conversations, and underscores the importance of standardization efforts and collaboration among different implementations. Ultimately, the post provides a comprehensive overview of the challenges and potential solutions for creating a more connected and coherent user experience in the fediverse.

@lobsters@mastodon.social

Two Approaches to Solving the “Quiet Fediverse” Problem: Conversation Backfilling Mechanisms lobste.rs/s/akvlo8
hackers.pub/@hongminhee/2025/q

hackers.pub

Two Approaches to Solving the "Quiet Fediverse" Problem: Conversation Backfilling Mechanisms

This post addresses the "quiet fediverse" problem, where users often experience fragmented conversations on decentralized social networks. The core issue stems from ActivityPub's distributed nature, where conversations are spread across multiple servers, leading to incomplete views of discussions. The author explores two main approaches to solve this: reply tree crawling and the context owner approach. Reply tree crawling, pioneered by Mastodon, involves fetching all replies to reconstruct the conversation, while the context owner approach centralizes conversation management with the original author or designated entity. The post details the technical mechanisms, advantages, and disadvantages of each method, highlighting the importance of the `context` attribute in ActivityPub. It also discusses ongoing debates, such as moderation paradigms and solutions for missing parent propagation, and introduces additional backfill mechanisms like periodic crawling and mention-based discovery. The article emphasizes the need for hybrid approaches, combining multiple strategies to ensure more complete conversations, and underscores the importance of standardization efforts and collaboration among different implementations. Ultimately, the post provides a comprehensive overview of the challenges and potential solutions for creating a more connected and coherent user experience in the fediverse.

@tugatech@masto.pt
@delProfundo@aus.social

I do analysis of apps and other solutions for organizations from time to time, usually providing decision frameworks.

Nothing brings me more pleasure that stopping a good business buying an app whose website is littered with stolen content, obviously fake testimonials and api keys strewn throughout their front end code (that and as always, code that seems to have been stolen from another failed startup).

Guys it’s super easy to see if a biz is selling vaporware. But if you need some help we’re always here

@tugatech@masto.pt
@h4ckernews@mastodon.social
@newsmast@newsmast.social

If you missed this great conversation about the future of black experiences on the web, organised by @DAIR you can catch up now 👇

twitch.tv/videos/2472547406

Big thanks to @rudyfraser.com Catt Small, Ra'il I'Nasah Kiam & Roland X. Pullia for sharing their experiences.

We really hope to see more conversations showcasing the experiences of black people on the web in the future.

twitch.tv

Imagining More: A candid convo about the future of the Black web experience. - dair_institute on Twitch

dair_institute went live on Twitch. Catch up on their Science & Technology VOD now.

@newsmast@newsmast.social

If you missed this great conversation about the future of black experiences on the web, organised by @DAIR you can catch up now 👇

twitch.tv/videos/2472547406

Big thanks to @rudyfraser.com Catt Small, Ra'il I'Nasah Kiam & Roland X. Pullia for sharing their experiences.

We really hope to see more conversations showcasing the experiences of black people on the web in the future.

twitch.tv

Imagining More: A candid convo about the future of the Black web experience. - dair_institute on Twitch

dair_institute went live on Twitch. Catch up on their Science & Technology VOD now.

NaaS – No-as-a-Service

No-as-a-Service (NaaS) is a simple API that returns a random rejection reason. Use it when you need a realistic excuse, a fun “no,” or want to simulate being turned down in style.
– from @hothead

github.com/hotheadhacker/no-as

Logo:
no-as-a-service - an API that returns random rejection reasons
ALT text

Logo: no-as-a-service - an API that returns random rejection reasons

@xandra@tilde.zone

this is it -- GOOD INTERNET magazine is LIVE, BABY~ 🥂 🎊 🥳

goodinternetmagazine.com/
goodinternetmagazine.com/
goodinternetmagazine.com/

i present the spring 2025 issue of GOOD INTERNET, featuring stories by @binarydigit, @internetarchive, @Leilukin, @greg, @surprisetalk, and SO MUCH MORE!

with only 6.5 hours to go before my surgery, the website is now launched! you can order physical or digital copies of the magazine! :) there are some initial stories on the website now, but more are coming over the next week, so keep an eye on your RSS feeds!!

‼️quick note: pre-ordered print editions will begin shipping out this week (!!!) and digital editions will go out this week as well to emails!

🙏 THANK YOU SO MUCH to EVERYONE who helped with this. thank you to the contributors (like @robb/ @echofeed, & @adam/ @omgdotlol). thank you to the writers, thank you to everyone who thought about this project, shared it with others, and got the word out. i am so so so stoked to bring y'all this.

🕛 issue 2 is in the fall! :) get your submission ideas in!!

goodinternetmagazine.com

Good Internet

A magazine for the non-corporate web, using code as an art medium, and web development enthusiasm of hobbyists and professionals alike.

@xandra@tilde.zone

this is it -- GOOD INTERNET magazine is LIVE, BABY~ 🥂 🎊 🥳

goodinternetmagazine.com/
goodinternetmagazine.com/
goodinternetmagazine.com/

i present the spring 2025 issue of GOOD INTERNET, featuring stories by @binarydigit, @internetarchive, @Leilukin, @greg, @surprisetalk, and SO MUCH MORE!

with only 6.5 hours to go before my surgery, the website is now launched! you can order physical or digital copies of the magazine! :) there are some initial stories on the website now, but more are coming over the next week, so keep an eye on your RSS feeds!!

‼️quick note: pre-ordered print editions will begin shipping out this week (!!!) and digital editions will go out this week as well to emails!

🙏 THANK YOU SO MUCH to EVERYONE who helped with this. thank you to the contributors (like @robb/ @echofeed, & @adam/ @omgdotlol). thank you to the writers, thank you to everyone who thought about this project, shared it with others, and got the word out. i am so so so stoked to bring y'all this.

🕛 issue 2 is in the fall! :) get your submission ideas in!!

goodinternetmagazine.com

Good Internet

A magazine for the non-corporate web, using code as an art medium, and web development enthusiasm of hobbyists and professionals alike.

Ein sehr informativer Podcast über den gesteuerten Rechtsruck der U$A:

»Die Peter Thiel Story:
Peter Thiel ist der Strippenzieher hinter dem kulturellen Rechtsruck in den USA und einer der wichtigsten Unterstützer von Donald Trump. Mit Paypal und Facebook ist er reich geworden. Das ist die Geschichte des geheimnisvollen Tech-Milliardärs.«

🔊 deutschlandfunk.de/die-peter-t

Ein sehr informativer Podcast über den gesteuerten Rechtsruck der U$A:

»Die Peter Thiel Story:
Peter Thiel ist der Strippenzieher hinter dem kulturellen Rechtsruck in den USA und einer der wichtigsten Unterstützer von Donald Trump. Mit Paypal und Facebook ist er reich geworden. Das ist die Geschichte des geheimnisvollen Tech-Milliardärs.«

🔊 deutschlandfunk.de/die-peter-t

@xandra@tilde.zone

this is it -- GOOD INTERNET magazine is LIVE, BABY~ 🥂 🎊 🥳

goodinternetmagazine.com/
goodinternetmagazine.com/
goodinternetmagazine.com/

i present the spring 2025 issue of GOOD INTERNET, featuring stories by @binarydigit, @internetarchive, @Leilukin, @greg, @surprisetalk, and SO MUCH MORE!

with only 6.5 hours to go before my surgery, the website is now launched! you can order physical or digital copies of the magazine! :) there are some initial stories on the website now, but more are coming over the next week, so keep an eye on your RSS feeds!!

‼️quick note: pre-ordered print editions will begin shipping out this week (!!!) and digital editions will go out this week as well to emails!

🙏 THANK YOU SO MUCH to EVERYONE who helped with this. thank you to the contributors (like @robb/ @echofeed, & @adam/ @omgdotlol). thank you to the writers, thank you to everyone who thought about this project, shared it with others, and got the word out. i am so so so stoked to bring y'all this.

🕛 issue 2 is in the fall! :) get your submission ideas in!!

goodinternetmagazine.com

Good Internet

A magazine for the non-corporate web, using code as an art medium, and web development enthusiasm of hobbyists and professionals alike.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

🔟 521 ❤️ Pure toggle with a single `input[type=checkbox]` and its `label` - check it out on @codepen codepen.io/thebabydino/pen/ajp

Animated GIF. Shows a ball toggling back and forth on a 3D track while casting a shadow. When the toggle is off, the ball is grey. When the toggle is on, the ball is green.
ALT text

Animated GIF. Shows a ball toggling back and forth on a 3D track while casting a shadow. When the toggle is off, the ball is grey. When the toggle is on, the ball is green.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

9️⃣ 593 ❤️ Cycling gradient glow with no text duplication - see it on @codepen codepen.io/thebabydino/pen/rNP

A super simple, but cool trick.

We create the gradient text.

The filter creates a blurred copy of it and places it underneath.

We then animate the stops... magic! 🪄✨

Animated GIF. Gradient text having the same gradient for its text glow. The gradient cycles in between two hues 90° apart.
ALT text

Animated GIF. Gradient text having the same gradient for its text glow. The gradient cycles in between two hues 90° apart.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

8️⃣ 736 ♥️ Pure 1 div card patterns (no SVG, no images other than CSS gradients) - see it on @codepen codepen.io/thebabydino/pen/NWx

A bunch of variations on the pure CSS technique detailed in this article frontendmasters.com/blog/pure-

19 cards, each with a different kind of halftone pattern.
ALT text

19 cards, each with a different kind of halftone pattern.

@jena@eldritch.cafe

Deadname -

Comment trouver le prénom de naissance d’une personne trans ? Comment connaître le vrai prénom d’un trans ? Voici un lien très utile qui permet d’obtenir cette information cruciale en quelques clics https://deadname.fr/

Ça se voit que je n’arrive pas à écrire en oppre-cis ? N’hésitez pas à partager largement, le but est que le lien arrive quand quelqu’un cherche vraiment cette question.

jena.pink/deadname

jena.pink

Deadname | Milfeuille

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

7️⃣ 749 ❤️ Pure Möbius 6hedrons codepen.io/thebabydino/pen/mJo

The how behind I live coded it in 30 minutes css-tricks.com/how-i-live-code

Could be improved with CSS variables nowadays, see css-tricks.com/simplifying-css as well as by using CSS trigonometric functions.

Animated GIF. Shows a Möbius strip made up of square base bars that keep rotating by half a turn in a staggered manner.
ALT text

Animated GIF. Shows a Möbius strip made up of square base bars that keep rotating by half a turn in a staggered manner.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

6️⃣ 816 ❤️ no sprite, no JS twitter 🤍 animation codepen.io/thebabydino/pen/RRR

Behind the demo css-tricks.com/recreating-the-

Now twitter uses an SVG heart 👍 (that path data though 😵) and upon clicking, inserts a div with the sparks. There are better ways to do it... still better than sprites!

Shows the twitter heart animation with sparks flying away from it as it goes from grey to red on click.
ALT text

Shows the twitter heart animation with sparks flying away from it as it goes from grey to red on click.

The current twitter heart in DevTools: created with an SVG path, but that path data is a lot of char vomit.
ALT text

The current twitter heart in DevTools: created with an SVG path, but that path data is a lot of char vomit.

@anatudor@mastodon.social

A little thing I made on @codepen.io: breathing with `shape()`
codepen.io/thebabydino/pen/vEE

`shape()` is supported in Chrome 135+ and Safari 18.4+.

Firefox 126+ supports it for simple shapes (but not for this demo) when setting thelayout.css.basic-shape-shape.enabled to true in about:config.

A "breathing" square image whose shape gets squished from each of its four sides.
ALT text

A "breathing" square image whose shape gets squished from each of its four sides.

@anatudor@mastodon.social

A little thing I made on @codepen.io: breathing with `shape()`
codepen.io/thebabydino/pen/vEE

`shape()` is supported in Chrome 135+ and Safari 18.4+.

Firefox 126+ supports it for simple shapes (but not for this demo) when setting thelayout.css.basic-shape-shape.enabled to true in about:config.

A "breathing" square image whose shape gets squished from each of its four sides.
ALT text

A "breathing" square image whose shape gets squished from each of its four sides.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

5️⃣ 850 ♥️ No SVG, no image fluid slider codepen.io/thebabydino/pen/qBy

used only for
a) feature support detection
b) updating slider value in --val

Uses only
1 × input[type=range] for actual slider
1 × output for current value display
1 × datalist for ruler

One of my best sliders on @codepen.

Fluid vertical slider. Dragging the thumb bends the track and ruller around it. The ruler markings also dynamically fade the further away from the thumb they are. On the right, there is a DevTools panel open to show that this is made with a range input, an output and a datalist with options, all inside a group wrapper.
ALT text

Fluid vertical slider. Dragging the thumb bends the track and ruller around it. The ruler markings also dynamically fade the further away from the thumb they are. On the right, there is a DevTools panel open to show that this is made with a range input, an output and a datalist with options, all inside a group wrapper.

@emanuele@m.divita.eu
@aral@mastodon.ar.al

Just noticed an issue with Look Over There!¹ where some of the sites I was forwarding to archive.org began to fail.

I’ve now documented the proper way to redirect to archive.org in Look Over There! and I also wrote a brief post on the relevant Reddit to alert the folks at The Internet Archive about this and suggest an improvement that could benefit findability on sites with redirects in general:

reddit.com/r/theinternetarchiv

¹ e.g., See our instance for Small Technology Foundation at look-over-there.small-web.org

CC @textfiles @brewsterkahle

Screenshot of Look Over There!’s admin interface, now showing an information callout with instructions on how to properly foward to The Internet Archive:

When forwarding to The Internet Archive, make sure you forward to a specific crawl (ensure the URL has the crawl timestamp in it). If not, the next time it crawls the site, it will find the redirect to itself and your redirect will start to fail.

e.g., When forwarding better.fyi:

Correct: https://web.archive.org/web/20250418214123/https://better.fyi/
Incorrect: https://web.archive.org/web/https://better.fyi/
ALT text

Screenshot of Look Over There!’s admin interface, now showing an information callout with instructions on how to properly foward to The Internet Archive: When forwarding to The Internet Archive, make sure you forward to a specific crawl (ensure the URL has the crawl timestamp in it). If not, the next time it crawls the site, it will find the redirect to itself and your redirect will start to fail. e.g., When forwarding better.fyi: Correct: https://web.archive.org/web/20250418214123/https://better.fyi/ Incorrect: https://web.archive.org/web/https://better.fyi/

@aral@mastodon.ar.al

Just noticed an issue with Look Over There!¹ where some of the sites I was forwarding to archive.org began to fail.

I’ve now documented the proper way to redirect to archive.org in Look Over There! and I also wrote a brief post on the relevant Reddit to alert the folks at The Internet Archive about this and suggest an improvement that could benefit findability on sites with redirects in general:

reddit.com/r/theinternetarchiv

¹ e.g., See our instance for Small Technology Foundation at look-over-there.small-web.org

CC @textfiles @brewsterkahle

Screenshot of Look Over There!’s admin interface, now showing an information callout with instructions on how to properly foward to The Internet Archive:

When forwarding to The Internet Archive, make sure you forward to a specific crawl (ensure the URL has the crawl timestamp in it). If not, the next time it crawls the site, it will find the redirect to itself and your redirect will start to fail.

e.g., When forwarding better.fyi:

Correct: https://web.archive.org/web/20250418214123/https://better.fyi/
Incorrect: https://web.archive.org/web/https://better.fyi/
ALT text

Screenshot of Look Over There!’s admin interface, now showing an information callout with instructions on how to properly foward to The Internet Archive: When forwarding to The Internet Archive, make sure you forward to a specific crawl (ensure the URL has the crawl timestamp in it). If not, the next time it crawls the site, it will find the redirect to itself and your redirect will start to fail. e.g., When forwarding better.fyi: Correct: https://web.archive.org/web/20250418214123/https://better.fyi/ Incorrect: https://web.archive.org/web/https://better.fyi/

@emanuele@m.divita.eu
@emanuele@m.divita.eu
@emanuele@m.divita.eu
@anatudor@mastodon.social · Reply to Ana Tudor 🐯

4️⃣ 909 ♥️ neon hex codepen.io/thebabydino/pen/zGm

Most people know my CSS stuff, but this was my most hearted @codepen demo for some three quarters of a decade... and it's a one! The feels dated nowadays, but oh, well... still got a soft spot for this one.

recording of moving the cursor across the hex grid and seeing a glowing neon light through the grid gaps, following the cursor
ALT text

recording of moving the cursor across the hex grid and seeing a glowing neon light through the grid gaps, following the cursor

@emanuele@m.divita.eu
@anatudor@mastodon.social · Reply to Ana Tudor 🐯

3️⃣ 1044 ♥️ Pure gravity button codepen.io/thebabydino/pen/bGz - a bit mixed about it, it was just an exercise in getting a certain result - don't use it in the wild!

My first ever @codepen demo to get to 1K ♥️. And it got copied left and right.
¯\_(ツ)_/¯

Screenshot of the gravity button. Shows round particles appearing and getting pulled towards the button. As they approach, they accelerate and get stretched before smashing into the button and causing sparks.
ALT text

Screenshot of the gravity button. Shows round particles appearing and getting pulled towards the button. As they approach, they accelerate and get stretched before smashing into the button and causing sparks.

August 2024 post showing how I found this demo on a website, wrapped in AI-generated crap that claims to explain what's going on. Except it gets it very wrong. And they don't indicate in any way that someone else (me!) made it.
ALT text

August 2024 post showing how I found this demo on a website, wrapped in AI-generated crap that claims to explain what's going on. Except it gets it very wrong. And they don't indicate in any way that someone else (me!) made it.

My post about finding my demo on in a video on the Indiamoon YouTube channel. The video is 90 seconds of auto-typing code and also doesn't credit me.
ALT text

My post about finding my demo on in a video on the Indiamoon YouTube channel. The video is 90 seconds of auto-typing code and also doesn't credit me.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

2️⃣ 1076 ♥️ Simplest inner glow card animation codepen.io/thebabydino/pen/WNV - a super simple pure demo I made in a few minutes to answer a reddit question and never expected would even get noticed much. It was my only 2024 demo to make into the most hearted 100 Pens of the year on @codepen.

A card with text content, transparent background, rounded corners and a rotating inner edge rainbow gradient glow.
ALT text

A card with text content, transparent background, rounded corners and a rotating inner edge rainbow gradient glow.

@skinnylatte@hachyderm.io

"Sam Altman's AI army is laughing its silicon balls off while you're knee-deep in React's virtual DOMshit, praying your app doesn't choke on its own bloated corpse. This isn't progress. It's a fucking tragedy. You've got a shiny new Ferrari in your garage, and you're still riding a rusty tricycle with a flat tire. Grow the fuck up."

justfuckingusehtml.com/

justfuckingusehtml.com

Just fucking use HTML

Stop reinventing the wheel. The web was doing just fine before your bloated frameworks crawled out of the sewer.

@skinnylatte@hachyderm.io

"Sam Altman's AI army is laughing its silicon balls off while you're knee-deep in React's virtual DOMshit, praying your app doesn't choke on its own bloated corpse. This isn't progress. It's a fucking tragedy. You've got a shiny new Ferrari in your garage, and you're still riding a rusty tricycle with a flat tire. Grow the fuck up."

justfuckingusehtml.com/

justfuckingusehtml.com

Just fucking use HTML

Stop reinventing the wheel. The web was doing just fine before your bloated frameworks crawled out of the sewer.

Today is Global Accessibility Awareness Day! W3C’s vision includes a web that is accessible to all. Learn more about our work by exploring @wai. Today is a day to learn, reflect and take action so that the one billion people with disabilities/impairments can benefit from and contribute to the development of the . Consider our sponsorship opportunities or make a donation to help us make the web work, for everyone.
w3.org/sponsor/

GAAD logo
ALT text

GAAD logo

@skinnylatte@hachyderm.io

"Sam Altman's AI army is laughing its silicon balls off while you're knee-deep in React's virtual DOMshit, praying your app doesn't choke on its own bloated corpse. This isn't progress. It's a fucking tragedy. You've got a shiny new Ferrari in your garage, and you're still riding a rusty tricycle with a flat tire. Grow the fuck up."

justfuckingusehtml.com/

justfuckingusehtml.com

Just fucking use HTML

Stop reinventing the wheel. The web was doing just fine before your bloated frameworks crawled out of the sewer.

@sven_md@mastodon.social · Reply to mcc
@anatudor@mastodon.social

I turn 13 on @codepen in June, so here are my 13 most hearted demos:

1️⃣ 1092 ♥️ infinite gallery codepen.io/thebabydino/pen/XJr - my only demo to ever get to 1K ♥️ without being in most hearted of the year first

mostly CSS scroll-driven animations + tiniest bit of JS (~200 bytes for infinity part)

Scrolling a bunch of times back and forth to highlight the infinity part of the demo. Hovering the cards in the gallery makes them rotate around their axis.
ALT text

Scrolling a bunch of times back and forth to highlight the infinity part of the demo. Hovering the cards in the gallery makes them rotate around their axis.

@lazysupper@famichiki.jp

Wasted hours today trying to get Hugo (blog software) installed. Failed at every turn. What an absolute steaming pile of shit.

I've seen the endless lists of alternatives. Anyone care to recommend one that isn't a complete asshole?

@w3cdevs@w3c.social

In this talk, Jean-François Abramatic, former W3C Chairman who established W3C Europe 30 years ago, reflects on the origins of the . He honors pioneers like Vannevar Bush, Doug Engelbart, Ted Nelson, Vint Cerf, and Charles Goldfarb, and shares his role in the creation and growth of @w3c—emphasizing key figures, early challenges, and the value of collaboration and humility.

🎬 Watch "Founding W3C Europe in the early days of the web": youtu.be/Qhaaanm79U4

Jean-François Abramatic shares his reflects on the origins of the web.
ALT text

Jean-François Abramatic shares his reflects on the origins of the web.

@w3cdevs@w3c.social

In this talk, Jean-François Abramatic, former W3C Chairman who established W3C Europe 30 years ago, reflects on the origins of the . He honors pioneers like Vannevar Bush, Doug Engelbart, Ted Nelson, Vint Cerf, and Charles Goldfarb, and shares his role in the creation and growth of @w3c—emphasizing key figures, early challenges, and the value of collaboration and humility.

🎬 Watch "Founding W3C Europe in the early days of the web": youtu.be/Qhaaanm79U4

Jean-François Abramatic shares his reflects on the origins of the web.
ALT text

Jean-François Abramatic shares his reflects on the origins of the web.

@w3cdevs@w3c.social

In this talk, Jean-François Abramatic, former W3C Chairman who established W3C Europe 30 years ago, reflects on the origins of the . He honors pioneers like Vannevar Bush, Doug Engelbart, Ted Nelson, Vint Cerf, and Charles Goldfarb, and shares his role in the creation and growth of @w3c—emphasizing key figures, early challenges, and the value of collaboration and humility.

🎬 Watch "Founding W3C Europe in the early days of the web": youtu.be/Qhaaanm79U4

Jean-François Abramatic shares his reflects on the origins of the web.
ALT text

Jean-François Abramatic shares his reflects on the origins of the web.

@rolle@mementomori.social

Every once in a while, I read my old blog posts that link to other articles or blogs. 99% of those sites are now offline or show a domain-for-sale page. It kind of makes me sad. Most of my own websites are still online after 20+ years. I wonder why they gave up.

That being said, this instance will be online forever - I'll make sure of it. Even after my passing, I want it to live on. My websites have survived even when hosting companies went bankrupt, and so will this instance.

@ozoned@social.ozoned.net

I'm working on setting up a #NonProfit for #BTFree , which is a #digital #privacy, #advocacy and #consulting #platform, aka running #social #web platforms such as #Peertube or to help folks set up their own.

So I'm going to need to take #donations . Looking at @Liberapay , but they still need a #payment #processor like #Paypal.

So what's the advantage of something like Liberapay if I still need Paypal to handle actual donations? Not criticizing, attempting to learn. #Fedi

@ozoned@social.ozoned.net

I'm working on setting up a #NonProfit for #BTFree , which is a #digital #privacy, #advocacy and #consulting #platform, aka running #social #web platforms such as #Peertube or to help folks set up their own.

So I'm going to need to take #donations . Looking at @Liberapay , but they still need a #payment #processor like #Paypal.

So what's the advantage of something like Liberapay if I still need Paypal to handle actual donations? Not criticizing, attempting to learn. #Fedi

@rolle@mementomori.social

Every once in a while, I read my old blog posts that link to other articles or blogs. 99% of those sites are now offline or show a domain-for-sale page. It kind of makes me sad. Most of my own websites are still online after 20+ years. I wonder why they gave up.

That being said, this instance will be online forever - I'll make sure of it. Even after my passing, I want it to live on. My websites have survived even when hosting companies went bankrupt, and so will this instance.

@rolle@mementomori.social

Every once in a while, I read my old blog posts that link to other articles or blogs. 99% of those sites are now offline or show a domain-for-sale page. It kind of makes me sad. Most of my own websites are still online after 20+ years. I wonder why they gave up.

That being said, this instance will be online forever - I'll make sure of it. Even after my passing, I want it to live on. My websites have survived even when hosting companies went bankrupt, and so will this instance.

@brentpruitt@mastodon.art

are there any ‘good’ + self-host alts? 😩

i want to be rid of Automattic, but my options are limited on a shared server…

i _yearn_ for low maint & simplified UX

i'd like to attempt WP integration but… spam, security, mgmt

Woo is bloated & the WP / continues to devolve

my ideal would be to nix all ecomm & have a gallery/art rep, but i could be delusional…

> i need art sales + social marketing <

not another barrier

💻 🤷🏽

@brentpruitt@mastodon.art

are there any ‘good’ + self-host alts? 😩

i want to be rid of Automattic, but my options are limited on a shared server…

i _yearn_ for low maint & simplified UX

i'd like to attempt WP integration but… spam, security, mgmt

Woo is bloated & the WP / continues to devolve

my ideal would be to nix all ecomm & have a gallery/art rep, but i could be delusional…

> i need art sales + social marketing <

not another barrier

💻 🤷🏽

@khleedril@cyberplace.social · Reply to World Wide Web Consortium

@w3c This is all so that the browsers can soak up every last bit of resource a system can give, instead of sharing nicely with all the other apps a user wants to run. Things are going the wrong way. The W3C isn't doing a good job; the trick is to work out how to use the minimum of resources, NOT the maximum.

@Flipboard@flipboard.social · Reply to Flipboard

Security engineer @alexhaydock acquired a Wii at the Swap Shop. He intended to use it to emulate games, but when he realized that it could be used to host a website, he decided to try that instead. @404mediaco’s Samantha Cole spoke to him about how well it’s working, and what he’s planning to do with it (, here he comes). Check out the second link to find out how our friends at 404 are doing, and what they’re cooking up next.

404media.co/this-website-is-ru

404media.co/how-404-media-is-n

404media.co

How 404 Media Is Navigating 'Economic Headwinds'

The economy is bad. Here's how we're doing, and how you can help us.

@Flipboard@flipboard.social · Reply to Flipboard

Security engineer @alexhaydock acquired a Wii at the Swap Shop. He intended to use it to emulate games, but when he realized that it could be used to host a website, he decided to try that instead. @404mediaco’s Samantha Cole spoke to him about how well it’s working, and what he’s planning to do with it (, here he comes). Check out the second link to find out how our friends at 404 are doing, and what they’re cooking up next.

404media.co/this-website-is-ru

404media.co/how-404-media-is-n

404media.co

How 404 Media Is Navigating 'Economic Headwinds'

The economy is bad. Here's how we're doing, and how you can help us.

@aral@mastodon.ar.al

New Kitten release 🎉

kitten.small-web.org

• New: Lovely new icons¹ and new callouts in Kitten Settings²

• New: Markdown now supports attributes and bracketed spans³

• New: client-side `kitten` global with `trigger` function for triggering events on the server from the client. (Useful when streaming client-side JavaScript when using Kitten’s Streaming HTML⁴ workflow. e.g., when you have to use a client-only web API like the Clipboard API but you want to keep all your logic on your server-side page.⁵)

• Fixed: The bound render function returned by `KittenComponent` class’s `component` getter now correctly awaits asynchronous templates. (In Kitten, you don’t have to care whether your templates contain promises. Kitten handles all that for you.)

Enjoy! :kitten:💕

¹ kitten.small-web.org/reference

² mastodon.ar.al/@aral/114381983

³ kitten.small-web.org/reference (also see mastodon.ar.al/@aral/114381462)

kitten.small-web.org/tutorials

⁵ e.g., See how I use this to implement a copy to clipboard button in the database page of Kitten’s Settings: codeberg.org/kitten/app/src/br Of course, you don’t have to use this and you can just write client-side JavaScript or use the built-in Alpine.js integration. e.g., how I do it on the (older) settings/identity page: codeberg.org/kitten/app/src/br

codeberg.org

app/web/🐱/settings🔒/identity/index.page.js at main

app - A web development kit that’s small, purrs, and loves you.

@aral@mastodon.ar.al

New Kitten release 🎉

kitten.small-web.org

• New: Lovely new icons¹ and new callouts in Kitten Settings²

• New: Markdown now supports attributes and bracketed spans³

• New: client-side `kitten` global with `trigger` function for triggering events on the server from the client. (Useful when streaming client-side JavaScript when using Kitten’s Streaming HTML⁴ workflow. e.g., when you have to use a client-only web API like the Clipboard API but you want to keep all your logic on your server-side page.⁵)

• Fixed: The bound render function returned by `KittenComponent` class’s `component` getter now correctly awaits asynchronous templates. (In Kitten, you don’t have to care whether your templates contain promises. Kitten handles all that for you.)

Enjoy! :kitten:💕

¹ kitten.small-web.org/reference

² mastodon.ar.al/@aral/114381983

³ kitten.small-web.org/reference (also see mastodon.ar.al/@aral/114381462)

kitten.small-web.org/tutorials

⁵ e.g., See how I use this to implement a copy to clipboard button in the database page of Kitten’s Settings: codeberg.org/kitten/app/src/br Of course, you don’t have to use this and you can just write client-side JavaScript or use the built-in Alpine.js integration. e.g., how I do it on the (older) settings/identity page: codeberg.org/kitten/app/src/br

codeberg.org

app/web/🐱/settings🔒/identity/index.page.js at main

app - A web development kit that’s small, purrs, and loves you.

@aral@mastodon.ar.al

Coming tomorrow to Kitten… Kitten icons!

Kitten will have built-in support for the Phosphor icons set with full authoring-time language intelligence where you can search for icons via category and tag (in addition to the canonical alphabetical categorisation).

Thought this was going to take me a few hours but it took a few days thanks to running into issues with size limits, type inference from JavaScript types in modules, etc., with the TypeScript language server but I believe I’ve finally cracked it :)

:kitten: 💕

Screenshot of detail of a Kitten template open in a code editor. Author is editing Kitten component reference in a markdown block, within a H2 header. The caret is at <${kitten.icons.tags. and the autocompletion box is open showing a list of possible fields: a11y, accessibility, accessible, accomodations, account, accounts, accuracy, acrobat, activity, add. The reasty of the line of code reads } weight=duotone size=1.5em/>
ALT text

Screenshot of detail of a Kitten template open in a code editor. Author is editing Kitten component reference in a markdown block, within a H2 header. The caret is at <${kitten.icons.tags. and the autocompletion box is open showing a list of possible fields: a11y, accessibility, accessible, accomodations, account, accounts, accuracy, acrobat, activity, add. The reasty of the line of code reads } weight=duotone size=1.5em/>

@aral@mastodon.ar.al

New Kitten release

• Fixes #236¹: The data preview pages in Kitten’s settings how handle circular references in the deserialised data (which may contain your custom classes if that’s what you were persisting in the database).

kitten.small-web.org

:kitten:💕

PS. Those pages are very rudimentary at the moment and are good for getting quick visual overview of the data you’re persisting. For a fully interactive view, use Kitten’s interactive shell (REPL)² to explore your data until I’ve had a chance to implement a more comprehensive visual interface.

PPS. You persist data in Kitten using the built-in JavaScript Database (JSDB)³ (Or, of course, you can install and use any other database.)

¹ codeberg.org/kitten/app/issues
² kitten.small-web.org/reference
³ codeberg.org/small-tech/jsdb#j

codeberg.org

jsdb

A zero-dependency, transparent, in-memory, streaming write-on-update JavaScript database for the Small Web that persists to a JavaScript transaction log.

@aral@mastodon.ar.al

New Kitten release

• Fixes #236¹: The data preview pages in Kitten’s settings how handle circular references in the deserialised data (which may contain your custom classes if that’s what you were persisting in the database).

kitten.small-web.org

:kitten:💕

PS. Those pages are very rudimentary at the moment and are good for getting quick visual overview of the data you’re persisting. For a fully interactive view, use Kitten’s interactive shell (REPL)² to explore your data until I’ve had a chance to implement a more comprehensive visual interface.

PPS. You persist data in Kitten using the built-in JavaScript Database (JSDB)³ (Or, of course, you can install and use any other database.)

¹ codeberg.org/kitten/app/issues
² kitten.small-web.org/reference
³ codeberg.org/small-tech/jsdb#j

codeberg.org

jsdb

A zero-dependency, transparent, in-memory, streaming write-on-update JavaScript database for the Small Web that persists to a JavaScript transaction log.

@lobsters@mastodon.social

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? lobste.rs/s/ebab2d
hackers.pub/@hongminhee/2025/w

hackers.pub

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard. That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:// No name property{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:// Single value{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ }}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive"}<Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.// Example: Define how to find actorsfederation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ });// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!<Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.// Define inbox handlersfederation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ });// Define followers collection logicfederation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ });<Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.// Configure Fedify with a persistent queue (e.g., Deno KV)const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ...});// Sending is now reliable and non-blockingawait ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);<Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init. For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:$ fedify lookup @fedify-example@fedify-blog.deno.dev<Will first show progress messages and then output the structured representation of the actor, similar to this:// Output of fedify lookup command (shows parsed object structure)Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ...}<This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:$ fedify inbox✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/✔ Sent follow request to @<some_test_account>@activitypub.academy.╭───────────────┬─────────────────────────────────────────╮│ Actor handle: │ i@<unique_id>.lhr.life │├───────────────┼─────────────────────────────────────────┤│ Actor URI: │ https://<unique_id>.lhr.life/i │├───────────────┼─────────────────────────────────────────┤│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │├───────────────┼─────────────────────────────────────────┤│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │╰───────────────┴─────────────────────────────────────────╯Web interface available at: http://localhost:8000/<You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:╭────────────────┬─────────────────────────────────────╮│ Request #: │ 2 │├────────────────┼─────────────────────────────────────┤│ Activity type: │ Follow │├────────────────┼─────────────────────────────────────┤│ HTTP request: │ POST /i/inbox │├────────────────┼─────────────────────────────────────┤│ HTTP response: │ 202 │├────────────────┼─────────────────────────────────────┤│ Details │ https://<unique_id>.lhr.life/r/2 │╰────────────────┴─────────────────────────────────────╯<Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.The Fedify Inbox web UI is where you view detailed activity information.<When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

@lobsters@mastodon.social

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? lobste.rs/s/ebab2d
hackers.pub/@hongminhee/2025/w

hackers.pub

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard. That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:// No name property{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:// Single value{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ }}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive"}<Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.// Example: Define how to find actorsfederation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ });// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!<Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.// Define inbox handlersfederation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ });// Define followers collection logicfederation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ });<Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.// Configure Fedify with a persistent queue (e.g., Deno KV)const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ...});// Sending is now reliable and non-blockingawait ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);<Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init. For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:$ fedify lookup @fedify-example@fedify-blog.deno.dev<Will first show progress messages and then output the structured representation of the actor, similar to this:// Output of fedify lookup command (shows parsed object structure)Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ...}<This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:$ fedify inbox✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/✔ Sent follow request to @<some_test_account>@activitypub.academy.╭───────────────┬─────────────────────────────────────────╮│ Actor handle: │ i@<unique_id>.lhr.life │├───────────────┼─────────────────────────────────────────┤│ Actor URI: │ https://<unique_id>.lhr.life/i │├───────────────┼─────────────────────────────────────────┤│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │├───────────────┼─────────────────────────────────────────┤│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │╰───────────────┴─────────────────────────────────────────╯Web interface available at: http://localhost:8000/<You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:╭────────────────┬─────────────────────────────────────╮│ Request #: │ 2 │├────────────────┼─────────────────────────────────────┤│ Activity type: │ Follow │├────────────────┼─────────────────────────────────────┤│ HTTP request: │ POST /i/inbox │├────────────────┼─────────────────────────────────────┤│ HTTP response: │ 202 │├────────────────┼─────────────────────────────────────┤│ Details │ https://<unique_id>.lhr.life/r/2 │╰────────────────┴─────────────────────────────────────╯<Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.The Fedify Inbox web UI is where you view detailed activity information.<When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

@lobsters@mastodon.social

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? lobste.rs/s/ebab2d
hackers.pub/@hongminhee/2025/w

hackers.pub

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard. That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:// No name property{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:// Single value{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ }}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive"}<Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.// Example: Define how to find actorsfederation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ });// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!<Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.// Define inbox handlersfederation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ });// Define followers collection logicfederation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ });<Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.// Configure Fedify with a persistent queue (e.g., Deno KV)const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ...});// Sending is now reliable and non-blockingawait ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);<Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init. For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:$ fedify lookup @fedify-example@fedify-blog.deno.dev<Will first show progress messages and then output the structured representation of the actor, similar to this:// Output of fedify lookup command (shows parsed object structure)Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ...}<This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:$ fedify inbox✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/✔ Sent follow request to @<some_test_account>@activitypub.academy.╭───────────────┬─────────────────────────────────────────╮│ Actor handle: │ i@<unique_id>.lhr.life │├───────────────┼─────────────────────────────────────────┤│ Actor URI: │ https://<unique_id>.lhr.life/i │├───────────────┼─────────────────────────────────────────┤│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │├───────────────┼─────────────────────────────────────────┤│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │╰───────────────┴─────────────────────────────────────────╯Web interface available at: http://localhost:8000/<You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:╭────────────────┬─────────────────────────────────────╮│ Request #: │ 2 │├────────────────┼─────────────────────────────────────┤│ Activity type: │ Follow │├────────────────┼─────────────────────────────────────┤│ HTTP request: │ POST /i/inbox │├────────────────┼─────────────────────────────────────┤│ HTTP response: │ 202 │├────────────────┼─────────────────────────────────────┤│ Details │ https://<unique_id>.lhr.life/r/2 │╰────────────────┴─────────────────────────────────────╯<Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.The Fedify Inbox web UI is where you view detailed activity information.<When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

@lobsters@mastodon.social

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? lobste.rs/s/ebab2d
hackers.pub/@hongminhee/2025/w

hackers.pub

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard. That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:// No name property{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:// Single value{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ }}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive"}<Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.// Example: Define how to find actorsfederation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ });// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!<Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.// Define inbox handlersfederation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ });// Define followers collection logicfederation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ });<Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.// Configure Fedify with a persistent queue (e.g., Deno KV)const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ...});// Sending is now reliable and non-blockingawait ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);<Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init. For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:$ fedify lookup @fedify-example@fedify-blog.deno.dev<Will first show progress messages and then output the structured representation of the actor, similar to this:// Output of fedify lookup command (shows parsed object structure)Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ...}<This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:$ fedify inbox✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/✔ Sent follow request to @<some_test_account>@activitypub.academy.╭───────────────┬─────────────────────────────────────────╮│ Actor handle: │ i@<unique_id>.lhr.life │├───────────────┼─────────────────────────────────────────┤│ Actor URI: │ https://<unique_id>.lhr.life/i │├───────────────┼─────────────────────────────────────────┤│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │├───────────────┼─────────────────────────────────────────┤│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │╰───────────────┴─────────────────────────────────────────╯Web interface available at: http://localhost:8000/<You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:╭────────────────┬─────────────────────────────────────╮│ Request #: │ 2 │├────────────────┼─────────────────────────────────────┤│ Activity type: │ Follow │├────────────────┼─────────────────────────────────────┤│ HTTP request: │ POST /i/inbox │├────────────────┼─────────────────────────────────────┤│ HTTP response: │ 202 │├────────────────┼─────────────────────────────────────┤│ Details │ https://<unique_id>.lhr.life/r/2 │╰────────────────┴─────────────────────────────────────╯<Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.The Fedify Inbox web UI is where you view detailed activity information.<When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

@lobsters@mastodon.social

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch? lobste.rs/s/ebab2d
hackers.pub/@hongminhee/2025/w

hackers.pub

Ditch the DIY Drama: Why Use Fedify Instead of Building ActivityPub from Scratch?

So, you're captivated by the fediverse—the decentralized social web powered by protocols like ActivityPub. Maybe you're dreaming of building the next great federated app, a unique space connected to Mastodon, Lemmy, Pixelfed, and more. The temptation to dive deep and implement ActivityPub yourself, from the ground up, is strong. Total control, right? Understanding every byte? Sounds cool! But hold on a sec. Before you embark on that epic quest, let's talk reality. Implementing ActivityPub correctly isn't just one task; it's like juggling several complex standards while riding a unicycle… blindfolded. It’s hard. That's where Fedify comes in. It's a TypeScript framework designed to handle the gnarliest parts of ActivityPub development, letting you focus on what makes your app special, not reinventing the federation wheel. This post will break down the common headaches of DIY ActivityPub implementation and show how Fedify acts as the super-powered pain reliever, starting with the very foundation of how data is represented.Challenge #1: Data Modeling—Speaking ActivityStreams & JSON-LD Fluently At its core, ActivityPub relies on the ActivityStreams 2.0 vocabulary to describe actions and objects, and it uses JSON-LD as the syntax to encode this vocabulary. While powerful, this combination introduces significant complexity right from the start. First, understanding and correctly using the vast ActivityStreams vocabulary itself is a hurdle. You need to model everything—posts (Note, Article), profiles (Person, Organization), actions (Create, Follow, Like, Announce)—using the precise terms and properties defined in the specification. Manual JSON construction is tedious and prone to errors. Second, JSON-LD, the encoding layer, has specific rules that make direct JSON manipulation surprisingly tricky:Missing vs. Empty Array: In JSON-LD, a property being absent is often semantically identical to it being present with an empty array. Your application logic needs to treat these cases equally when checking for values. For example, these two Note objects mean the same thing regarding the name property:// No name property{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "…"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "name": [], "content": "…"}Single Value vs. Array: Similarly, a property holding a single value directly is often equivalent to it holding a single-element array containing that value. Your code must anticipate both representations for the same meaning, like for the content property here:// Single value{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": "Hello"}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Note", "content": ["Hello"]}Object Reference vs. Embedded Object: Properties can contain either the full JSON-LD object embedded directly or just a URI string referencing that object. Your application needs to be prepared to fetch the object's data if only a URI is given (a process called dereferencing). These two Announce activities are semantically equivalent (assuming the URIs resolve correctly):{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // Embedded objects: "actor": { "type": "Person", "id": "http://sally.example.org/", "name": "Sally" }, "object": { "type": "Arrive", "id": "https://sally.example.com/arrive", /* ... */ }}// Equivalent to:{ "@context": "https://www.w3.org/ns/activitystreams", "type": "Announce", // URI references: "actor": "http://sally.example.org/", "object": "https://sally.example.com/arrive"}<Attempting to manually handle all these vocabulary rules and JSON-LD variations consistently across your application inevitably leads to verbose, complex, and fragile code, ripe for subtle bugs that break federation. Fedify tackles this entire data modeling challenge with its comprehensive, type-safe Activity Vocabulary API. It provides TypeScript classes for ActivityStreams types and common extensions, giving you autocompletion and compile-time safety. Crucially, these classes internally manage all the tricky JSON-LD nuances. Fedify's property accessors present a consistent interface—non-functional properties (like tags) always return arrays, functional properties (like content) always return single values or null. It handles object references versus embedded objects seamlessly through dereferencing accessors (like activity.getActor()) which automatically fetch remote objects via URI when needed—a feature known as property hydration. With Fedify, you work with a clean, predictable TypeScript API, letting the framework handle the messy details of AS vocabulary and JSON-LD encoding.Challenge #2: Discovery & Identity—Finding Your Actors Once you can model data, you need to make your actors discoverable. This primarily involves the WebFinger protocol (RFC 7033). You'd need to build a server endpoint at /.well-known/webfinger capable of parsing resource queries (like acct: URIs), validating the requested domain against your server, and responding with a precisely formatted JSON Resource Descriptor (JRD). This JRD must include specific links, like a self link pointing to the actor's ActivityPub ID using the correct media type. Getting any part of this wrong can make your actors invisible. Fedify simplifies this significantly. It automatically handles WebFinger requests based on the actor information you provide through its setActorDispatcher() method. Fedify generates the correct JRD response. If you need more advanced control, like mapping user-facing handles to internal identifiers, you can easily register mapHandle() or mapAlias() callbacks. You focus on defining your actors; Fedify handles making them discoverable.// Example: Define how to find actorsfederation.setActorDispatcher( "/users/{username}", async (ctx, username) => { /* ... */ });// Now GET /.well-known/webfinger?resource=acct:username@your.domain just works!<Challenge #3: Core ActivityPub Mechanics—Handling Requests and Collections Serving actor profiles requires careful content negotiation. A request for an actor's ID needs JSON-LD for machine clients (Accept: application/activity+json) but HTML for browsers (Accept: text/html). Handling incoming activities at the inbox endpoint involves validating POST requests, verifying cryptographic signatures, parsing the payload, preventing duplicates (idempotency), and routing based on activity type. Implementing collections (outbox, followers, etc.) with correct pagination adds another layer. Fedify streamlines all of this. Its core request handler (via Federation.fetch() or framework adapters like @fedify/express) manages content negotiation. You define actors with setActorDispatcher() and web pages with your framework (Hono, Express, SvelteKit, etc.)—Fedify routes appropriately. For the inbox, setInboxListeners() lets you define handlers per activity type (e.g., .on(Follow, ...)), while Fedify automatically handles validation, signature verification, parsing, and idempotency checks using its KV Store. Collection implementation is simplified via dispatchers (e.g., setFollowersDispatcher()); you provide logic to fetch a page of data, and Fedify constructs the correct Collection or CollectionPage with pagination.// Define inbox handlersfederation.setInboxListeners("/inbox", "/users/{handle}/inbox") .on(Follow, async (ctx, follow) => { /* Handle follow */ }) .on(Undo, async (ctx, undo) => { /* Handle undo */ });// Define followers collection logicfederation.setFollowersDispatcher( "/users/{handle}/followers", async (ctx, handle, cursor) => { /* ... */ });<Challenge #4: Reliable Delivery & Asynchronous Processing—Sending Activities Robustly Sending an activity requires more than a simple POST. Networks fail, servers go down. You need robust failure handling and retry logic (ideally with backoff). Processing incoming activities synchronously can block your server. Efficiently broadcasting to many followers (fan-out) requires background processing and using shared inboxes where possible. Fedify addresses reliability and scalability using its MessageQueue abstraction. When configured (highly recommended), Context.sendActivity() enqueues delivery tasks. Background workers handle sending with automatic retries based on configurable policies (like outboxRetryPolicy). Fedify supports various queue backends (Deno KV, Redis, PostgreSQL, AMQP). For high-traffic fan-out, Fedify uses an optimized two-stage mechanism to distribute the load efficiently.// Configure Fedify with a persistent queue (e.g., Deno KV)const federation = createFederation({ queue: new DenoKvMessageQueue(/* ... */), // ...});// Sending is now reliable and non-blockingawait ctx.sendActivity({ handle: "myUser" }, recipient, someActivity);<Challenge #5: Security—Avoiding Common Pitfalls Securing an ActivityPub server is critical. You need to implement HTTP Signatures (draft-cavage-http-signatures-12) for server-to-server authentication—a complex process. You might also need Linked Data Signatures (LDS) or Object Integrity Proofs (OIP) based on FEP-8b32 for data integrity and compatibility. Managing cryptographic keys securely is essential. Lastly, fetching remote resources risks Server-Side Request Forgery (SSRF) if not validated properly. Fedify is designed with security in mind. It automatically handles the creation and verification of HTTP Signatures, LDS, and OIP, provided you supply keys via setKeyPairsDispatcher(). It includes key management utilities. Crucially, Fedify's default document loader includes built-in SSRF protection, blocking requests to private IPs unless explicitly allowed.Challenge #6: Interoperability & Maintenance—Playing Nicely with Others The fediverse is diverse. Different servers have quirks. Ensuring compatibility requires testing and adaptation. Standards evolve with new Federation Enhancement Proposals (FEPs). You also need protocols like NodeInfo to advertise server capabilities. Fedify aims for broad interoperability and is actively maintained. It includes features like ActivityTransformers to smooth over implementation differences. NodeInfo support is built-in via setNodeInfoDispatcher().Challenge #7: Developer Experience—Actually Building Your App Beyond the protocol, building any server involves setup, testing, and debugging. With federation, debugging becomes harder—was the message malformed? Was the signature wrong? Is the remote server down? Is it a compatibility quirk? Good tooling is essential. Fedify enhances the developer experience significantly. Being built with TypeScript, it offers excellent type safety and editor auto-completion. The fedify CLI is a powerful companion designed to streamline common development tasks. You can quickly scaffold a new project tailored to your chosen runtime and web framework using fedify init. For debugging interactions and verifying data, fedify lookup is invaluable. It lets you inspect how any remote actor or object appears from the outside by performing WebFinger discovery and fetching the object's data. Fedify then displays the parsed object structure and properties directly in your terminal. For example, running:$ fedify lookup @fedify-example@fedify-blog.deno.dev<Will first show progress messages and then output the structured representation of the actor, similar to this:// Output of fedify lookup command (shows parsed object structure)Person { id: URL "https://fedify-blog.deno.dev/users/fedify-example", name: "Fedify Example Blog", published: 2024-03-03T13:18:11.857Z, // Simplified timestamp summary: "This blog is powered by Fedify, a fediverse server framework.", url: URL "https://fedify-blog.deno.dev/", preferredUsername: "fedify-example", publicKey: CryptographicKey { id: URL "https://fedify-blog.deno.dev/users/fedify-example#main-key", owner: URL "https://fedify-blog.deno.dev/users/fedify-example", publicKey: CryptoKey { /* ... CryptoKey details ... */ } }, // ... other properties like inbox, outbox, followers, endpoints ...}<This allows you to easily check how data is structured or troubleshoot why an interaction might be failing by seeing the actual properties Fedify parsed. Testing outgoing activities from your application during development is made much easier with fedify inbox. Running the command starts a temporary local server that acts as a publicly accessible inbox, displaying key information about the temporary actor it creates for receiving messages:$ fedify inbox✔ The ephemeral ActivityPub server is up and running: https://<unique_id>.lhr.life/✔ Sent follow request to @<some_test_account>@activitypub.academy.╭───────────────┬─────────────────────────────────────────╮│ Actor handle: │ i@<unique_id>.lhr.life │├───────────────┼─────────────────────────────────────────┤│ Actor URI: │ https://<unique_id>.lhr.life/i │├───────────────┼─────────────────────────────────────────┤│ Actor inbox: │ https://<unique_id>.lhr.life/i/inbox │├───────────────┼─────────────────────────────────────────┤│ Shared inbox: │ https://<unique_id>.lhr.life/inbox │╰───────────────┴─────────────────────────────────────────╯Web interface available at: http://localhost:8000/<You then configure your developing application to send an activity to the Actor inbox or Shared inbox URI provided. When an activity arrives, fedify inbox only prints a summary table to your console indicating that a request was received:╭────────────────┬─────────────────────────────────────╮│ Request #: │ 2 │├────────────────┼─────────────────────────────────────┤│ Activity type: │ Follow │├────────────────┼─────────────────────────────────────┤│ HTTP request: │ POST /i/inbox │├────────────────┼─────────────────────────────────────┤│ HTTP response: │ 202 │├────────────────┼─────────────────────────────────────┤│ Details │ https://<unique_id>.lhr.life/r/2 │╰────────────────┴─────────────────────────────────────╯<Crucially, the detailed information about the received request—including the full headers (like Signature), the request body (the Activity JSON), and the signature verification status—is only available in the web interface provided by fedify inbox. This web UI allows you to thoroughly inspect incoming activities during development.The Fedify Inbox web UI is where you view detailed activity information.<When you need to test interactions with the live fediverse from your local machine beyond just sending, fedify tunnel can securely expose your entire local development server temporarily. This suite of tools significantly eases the process of building and debugging federated applications.Conclusion: Build Features, Not Plumbing Implementing the ActivityPub suite of protocols from scratch is an incredibly complex and time-consuming undertaking. It involves deep dives into multiple technical specifications, cryptographic signing, security hardening, and navigating the nuances of a diverse ecosystem. While educational, it dramatically slows down the process of building the actual, unique features of your federated application. Fedify offers a well-architected, secure, and type-safe foundation, handling the intricacies of federation for you—data modeling, discovery, core mechanics, delivery, security, and interoperability. It lets you focus on your application's unique value and user experience. Stop wrestling with low-level protocol details and start building your vision for the fediverse faster and more reliably. Give Fedify a try! Getting started is straightforward. First, install the Fedify CLI using your preferred method. Once installed, create a new project template by running fedify init your-project-name. Check out the Fedify tutorials and Fedify manual to learn more. Happy federating!

@aftd@sfba.social

Hey folks, suppose I have a form with a button that opens a mini-form in a popover or dialog. Does it make sense to stick things like `aria-required` or `aria-invalid` on that button if things in the mini-form are required / invalid?

On one hand, this feels semantically wrong? The button itself is just a trigger and can't really be "invalid" in anyway. On the other, since the actual invalid elements are in the popover or dialog, there's no other indication of this state (apart from manual descriptions).

@aftd@sfba.social

Hey folks, suppose I have a form with a button that opens a mini-form in a popover or dialog. Does it make sense to stick things like `aria-required` or `aria-invalid` on that button if things in the mini-form are required / invalid?

On one hand, this feels semantically wrong? The button itself is just a trigger and can't really be "invalid" in anyway. On the other, since the actual invalid elements are in the popover or dialog, there's no other indication of this state (apart from manual descriptions).

@aral@mastodon.ar.al

Coming tomorrow to Kitten… Kitten icons!

Kitten will have built-in support for the Phosphor icons set with full authoring-time language intelligence where you can search for icons via category and tag (in addition to the canonical alphabetical categorisation).

Thought this was going to take me a few hours but it took a few days thanks to running into issues with size limits, type inference from JavaScript types in modules, etc., with the TypeScript language server but I believe I’ve finally cracked it :)

:kitten: 💕

Screenshot of detail of a Kitten template open in a code editor. Author is editing Kitten component reference in a markdown block, within a H2 header. The caret is at <${kitten.icons.tags. and the autocompletion box is open showing a list of possible fields: a11y, accessibility, accessible, accomodations, account, accounts, accuracy, acrobat, activity, add. The reasty of the line of code reads } weight=duotone size=1.5em/>
ALT text

Screenshot of detail of a Kitten template open in a code editor. Author is editing Kitten component reference in a markdown block, within a H2 header. The caret is at <${kitten.icons.tags. and the autocompletion box is open showing a list of possible fields: a11y, accessibility, accessible, accomodations, account, accounts, accuracy, acrobat, activity, add. The reasty of the line of code reads } weight=duotone size=1.5em/>

@anatudor@mastodon.social

Mastodon 🦣 - can you help me out?

If you can test on actual Safari (not another browser), does codepen.io/thebabydino/pen/Eax look the same for you as it does in my Epiphany screen? Or does the `conic-gradient()` cover the entire area?

Retoots appreciated if you cannot test. Thanks!

PS: Yes, I know it does NOT work in Firefox or Chromium browsers github.com/web-platform-tests/

Stepped light green conic gradient to full transparency. Occupies only a limited rectangle on top of a brick red backdrop. All is grainy.
ALT text

Stepped light green conic gradient to full transparency. Occupies only a limited rectangle on top of a brick red backdrop. All is grainy.

@anatudor@mastodon.social

Mastodon 🦣 - can you help me out?

If you can test on actual Safari (not another browser), does codepen.io/thebabydino/pen/Eax look the same for you as it does in my Epiphany screen? Or does the `conic-gradient()` cover the entire area?

Retoots appreciated if you cannot test. Thanks!

PS: Yes, I know it does NOT work in Firefox or Chromium browsers github.com/web-platform-tests/

Stepped light green conic gradient to full transparency. Occupies only a limited rectangle on top of a brick red backdrop. All is grainy.
ALT text

Stepped light green conic gradient to full transparency. Occupies only a limited rectangle on top of a brick red backdrop. All is grainy.

@stefano@bsd.cafe
@pears@fosstodon.org

We are PeARS, a friendly project dedicated to the development of a fully open source and decentralised .

How does it work? Every instance of PeARS can be considered a mini search engine for a single topic of interest, which is populated and curated by people like you. One beautiful day, when enough instances are alive, they will come together to provide a generalised Web search solution. Owned by you.

Interested? Come and help us! Say hello here or on GitHub.

@aral@mastodon.ar.al

🚨 Let’s Encrypt at risk from Trump cuts to OTF: “Let’s Encrypt received around $800,000 in funding from the OTF”

Dear @EUCommission, get your heads out of your arses and let’s find @letsencrypt €1M/year (a rounding error in EU finances) and have them move to the EU.

If Let’s Encrypt is fucked, the web is fucked, and the Small Web is fucked too. So how about we don’t let that happen, yeah?

(In the meanwhile, if the Let’s Encrypt folks want to make a point about how essential they are, it might be an idea to refuse certificates to republican politicians. See how they like their donation systems breaking in real time…)

CC @nlnet @NGIZero@mastodon.xyz

mastodon.social/@publictorsten

mastodon.social

publictorsten (@publictorsten@mastodon.social)

Wenn Let’s Encrypt plötzlich nicht mehr klappt, wird das halbe Internet aus Zertifikatsfehlern bestehen. https://www.heise.de/news/Nach-Trump-Dekret-Kampf-um-US-Foerdermittel-fuer-Tor-F-Droid-und-Let-s-Encrypt-10328226.html

@aral@mastodon.ar.al

🚨 Let’s Encrypt at risk from Trump cuts to OTF: “Let’s Encrypt received around $800,000 in funding from the OTF”

Dear @EUCommission, get your heads out of your arses and let’s find @letsencrypt €1M/year (a rounding error in EU finances) and have them move to the EU.

If Let’s Encrypt is fucked, the web is fucked, and the Small Web is fucked too. So how about we don’t let that happen, yeah?

(In the meanwhile, if the Let’s Encrypt folks want to make a point about how essential they are, it might be an idea to refuse certificates to republican politicians. See how they like their donation systems breaking in real time…)

CC @nlnet @NGIZero@mastodon.xyz

mastodon.social/@publictorsten

mastodon.social

publictorsten (@publictorsten@mastodon.social)

Wenn Let’s Encrypt plötzlich nicht mehr klappt, wird das halbe Internet aus Zertifikatsfehlern bestehen. https://www.heise.de/news/Nach-Trump-Dekret-Kampf-um-US-Foerdermittel-fuer-Tor-F-Droid-und-Let-s-Encrypt-10328226.html

@tommi@pan.rent

Looking for CMS advice

Hey Web devs!

Do you have any suggestions, tips, opinions, dos, don’ts about headless CMSes?

I have a growing list of small/mid non-profits and collectives asking for my help to (re)make their website. I totally want to help, but I don’t have much time, especially considering that they generally have little or no funding—I would most definitely point them to @VillageOneCoop, otherwise.

Therefore, I want a super simple and replicable solution where I can copy-paste most of the code, while providing them with a stable, fast, and modern solution. I had a look at the Headless CMS section in the Jamstack website, but I need opinions from people who actually used some of that software already.

Needs

  • I want to code and configure everything using @eleventy
  • Admin interface () for the client to add pages and write posts
  • Static website in the front-end
  • Simple and reliable CI/CD
  • No/minimal maintenance after the first setup
  • Self-hostable (I was taking this for granted so much that I forgot to write it)
  • If it requires forge integration, it should support

Nice to have

  • Possibly using , not
  • Allowing the client to customize a bit their website through the admin interface, with a GUI
  • CMS app packaged on @yunohost
  • No CMS vendor lock-in
  • I’d love to write as little JavaScript as possible

Absolutely not

Please, boost this and ask around! Links to videos, tutorials, and resources are welcome.

People whose perspective I would really value: @zachleat @harryfk @deno_land @jaredwhite @vanillaweb @stefan @mxbck @WeirdWriter @deadsuperhero (Sorry if I am spamming you!)

jamstack.org

Headless CMS - Top Content Management Systems | Jamstack

Check out this showcase of some of the best, open source headless CMSes. This is community-drive so be sure to submit your favorite CMS today!

@tommi@pan.rent

Looking for CMS advice

Hey Web devs!

Do you have any suggestions, tips, opinions, dos, don’ts about headless CMSes?

I have a growing list of small/mid non-profits and collectives asking for my help to (re)make their website. I totally want to help, but I don’t have much time, especially considering that they generally have little or no funding—I would most definitely point them to @VillageOneCoop, otherwise.

Therefore, I want a super simple and replicable solution where I can copy-paste most of the code, while providing them with a stable, fast, and modern solution. I had a look at the Headless CMS section in the Jamstack website, but I need opinions from people who actually used some of that software already.

Needs

  • I want to code and configure everything using @eleventy
  • Admin interface () for the client to add pages and write posts
  • Static website in the front-end
  • Simple and reliable CI/CD
  • No/minimal maintenance after the first setup
  • Self-hostable (I was taking this for granted so much that I forgot to write it)
  • If it requires forge integration, it should support

Nice to have

  • Possibly using , not
  • Allowing the client to customize a bit their website through the admin interface, with a GUI
  • CMS app packaged on @yunohost
  • No CMS vendor lock-in
  • I’d love to write as little JavaScript as possible

Absolutely not

Please, boost this and ask around! Links to videos, tutorials, and resources are welcome.

People whose perspective I would really value: @zachleat @harryfk @deno_land @jaredwhite @vanillaweb @stefan @mxbck @WeirdWriter @deadsuperhero (Sorry if I am spamming you!)

jamstack.org

Headless CMS - Top Content Management Systems | Jamstack

Check out this showcase of some of the best, open source headless CMSes. This is community-drive so be sure to submit your favorite CMS today!

@jon@vivaldi.net

I have been trying to make the point that when we give up our privacy, we give up our security for a long time. This is an article and short video from 2017. I could have made the same statements today.

I think many more are seeing the same. I know most of you here do.

vivaldi.com/blog/vivaldi-at-os

vivaldi.com

Vivaldi CEO speaks at Oslo Freedom Forum | Vivaldi Browser

Vivaldi CEO Jon von Tetzchner says Internet is one of the solutions for democracy.

@jon@vivaldi.net

I have been trying to make the point that when we give up our privacy, we give up our security for a long time. This is an article and short video from 2017. I could have made the same statements today.

I think many more are seeing the same. I know most of you here do.

vivaldi.com/blog/vivaldi-at-os

vivaldi.com

Vivaldi CEO speaks at Oslo Freedom Forum | Vivaldi Browser

Vivaldi CEO Jon von Tetzchner says Internet is one of the solutions for democracy.

@jon@vivaldi.net

I have been trying to make the point that when we give up our privacy, we give up our security for a long time. This is an article and short video from 2017. I could have made the same statements today.

I think many more are seeing the same. I know most of you here do.

vivaldi.com/blog/vivaldi-at-os

vivaldi.com

Vivaldi CEO speaks at Oslo Freedom Forum | Vivaldi Browser

Vivaldi CEO Jon von Tetzchner says Internet is one of the solutions for democracy.

@phryk@mastodon.social

One of my main gripes: HTML forms can only use GET and POST methods.

If <form> also supported PUT and DELETE, you could easily map CRUD to HTTP methods and that would feel so much cleaner than splitting functionality for the same types over a bunch of different paths.

@aral@mastodon.ar.al

🚨 Let’s Encrypt at risk from Trump cuts to OTF: “Let’s Encrypt received around $800,000 in funding from the OTF”

Dear @EUCommission, get your heads out of your arses and let’s find @letsencrypt €1M/year (a rounding error in EU finances) and have them move to the EU.

If Let’s Encrypt is fucked, the web is fucked, and the Small Web is fucked too. So how about we don’t let that happen, yeah?

(In the meanwhile, if the Let’s Encrypt folks want to make a point about how essential they are, it might be an idea to refuse certificates to republican politicians. See how they like their donation systems breaking in real time…)

CC @nlnet @NGIZero@mastodon.xyz

mastodon.social/@publictorsten

mastodon.social

publictorsten (@publictorsten@mastodon.social)

Wenn Let’s Encrypt plötzlich nicht mehr klappt, wird das halbe Internet aus Zertifikatsfehlern bestehen. https://www.heise.de/news/Nach-Trump-Dekret-Kampf-um-US-Foerdermittel-fuer-Tor-F-Droid-und-Let-s-Encrypt-10328226.html

@aral@mastodon.ar.al

🚨 Let’s Encrypt at risk from Trump cuts to OTF: “Let’s Encrypt received around $800,000 in funding from the OTF”

Dear @EUCommission, get your heads out of your arses and let’s find @letsencrypt €1M/year (a rounding error in EU finances) and have them move to the EU.

If Let’s Encrypt is fucked, the web is fucked, and the Small Web is fucked too. So how about we don’t let that happen, yeah?

(In the meanwhile, if the Let’s Encrypt folks want to make a point about how essential they are, it might be an idea to refuse certificates to republican politicians. See how they like their donation systems breaking in real time…)

CC @nlnet @NGIZero@mastodon.xyz

mastodon.social/@publictorsten

mastodon.social

publictorsten (@publictorsten@mastodon.social)

Wenn Let’s Encrypt plötzlich nicht mehr klappt, wird das halbe Internet aus Zertifikatsfehlern bestehen. https://www.heise.de/news/Nach-Trump-Dekret-Kampf-um-US-Foerdermittel-fuer-Tor-F-Droid-und-Let-s-Encrypt-10328226.html

@aral@mastodon.ar.al

🚨 Let’s Encrypt at risk from Trump cuts to OTF: “Let’s Encrypt received around $800,000 in funding from the OTF”

Dear @EUCommission, get your heads out of your arses and let’s find @letsencrypt €1M/year (a rounding error in EU finances) and have them move to the EU.

If Let’s Encrypt is fucked, the web is fucked, and the Small Web is fucked too. So how about we don’t let that happen, yeah?

(In the meanwhile, if the Let’s Encrypt folks want to make a point about how essential they are, it might be an idea to refuse certificates to republican politicians. See how they like their donation systems breaking in real time…)

CC @nlnet @NGIZero@mastodon.xyz

mastodon.social/@publictorsten

mastodon.social

publictorsten (@publictorsten@mastodon.social)

Wenn Let’s Encrypt plötzlich nicht mehr klappt, wird das halbe Internet aus Zertifikatsfehlern bestehen. https://www.heise.de/news/Nach-Trump-Dekret-Kampf-um-US-Foerdermittel-fuer-Tor-F-Droid-und-Let-s-Encrypt-10328226.html

@pmmueller@mastodon.social

»The anatomy of visually-hidden«
by James Edwards

This article really is the absolutely best explanation of the declarations used in the visually-hidden hack.

Found the link in the phantastic »Web Accessiblity Cookbook« written by @matuzo.

Thanx a million to both for writing and publishing this.

tpgi.com/the-anatomy-of-visual

tpgi.com

The anatomy of visually-hidden - TPGi

You've probably used visually-hidden content before. But how does the CSS actually work, and why do we use those particular properties?

@anatudor@mastodon.social

Ever wanted to get the number of auto-fit columns in CSS?

```
--u: 5em;
grid-template-columns: repeat(auto-fit, minmax(var(--u), 1fr))
```

It's now possible! Using registered vars, the tan division hack and container query units! Here's a little test on @codepen:
codepen.io/thebabydino/pen/Joj

linked demo recording, showing the number of columns displayed for each item
ALT text

linked demo recording, showing the number of columns displayed for each item

@anatudor@mastodon.social

Flexy flex layout for any number n of items such that we have:

👉 at most 3 items on a row
👉 at least 2 items on a row IF we have at least 2 items in total

In only 5 (display, flex-wrap, gap, flex and flex-basis override) CSS declarations, working for any number n of items! 🎇

Because someone asked for this on reddit reddit.com/r/css/comments/1jay

Here is the @codepen demo codepen.io/thebabydino/pen/OPJ

Screenshot of the desired layout for the desired number of items.
ALT text

Screenshot of the desired layout for the desired number of items.

The 5 CSS declarations:

```
section {
  gap: var(--s);
  display: flex;
  flex-wrap: wrap
}

.item {
  flex: 1 1 calc((100% - 2*var(--s))/3);

  &:nth-child(3n):nth-last-child(2), 
  &:nth-child(3n + 1):last-child {
    flex-basis: calc(50% - .5*var(--s))
  }
}
```
ALT text

The 5 CSS declarations: ``` section { gap: var(--s); display: flex; flex-wrap: wrap } .item { flex: 1 1 calc((100% - 2*var(--s))/3); &:nth-child(3n):nth-last-child(2), &:nth-child(3n + 1):last-child { flex-basis: calc(50% - .5*var(--s)) } } ```

@anatudor@mastodon.social

Flexy flex layout for any number n of items such that we have:

👉 at most 3 items on a row
👉 at least 2 items on a row IF we have at least 2 items in total

In only 5 (display, flex-wrap, gap, flex and flex-basis override) CSS declarations, working for any number n of items! 🎇

Because someone asked for this on reddit reddit.com/r/css/comments/1jay

Here is the @codepen demo codepen.io/thebabydino/pen/OPJ

Screenshot of the desired layout for the desired number of items.
ALT text

Screenshot of the desired layout for the desired number of items.

The 5 CSS declarations:

```
section {
  gap: var(--s);
  display: flex;
  flex-wrap: wrap
}

.item {
  flex: 1 1 calc((100% - 2*var(--s))/3);

  &:nth-child(3n):nth-last-child(2), 
  &:nth-child(3n + 1):last-child {
    flex-basis: calc(50% - .5*var(--s))
  }
}
```
ALT text

The 5 CSS declarations: ``` section { gap: var(--s); display: flex; flex-wrap: wrap } .item { flex: 1 1 calc((100% - 2*var(--s))/3); &:nth-child(3n):nth-last-child(2), &:nth-child(3n + 1):last-child { flex-basis: calc(50% - .5*var(--s)) } } ```

@tommi@pan.rent · Reply to Tommi 🤯

🧶 Knitting Our Internet Italy Tour! 🇮🇹

(Versione italiana nel post precedente)

Tomorrow will begin the unbelievable tour of Knitting Our Internet, bringing the workshop around Italy! ⛵

If you’ll be in the places where the workshop will be happening, you are most definitely welcome to join, 🆓 participation is completely free. If you won’t be around, please help me spread the word to friends and curious folks around the country! Everyone is invited. 💕

Thanks to the awesome people who will be hosting me! @collettivodemand @reclaimthetech

✨ Special note: while I will be in Bologna, we are planning to gather in person and collectively attend @fediforum, all together, from Scift, the newborn hackerspace in Làbas!

ℹ️ To get the latest info, visit ournet.rocks/

A graphics with red background and white text. On the top right, a pixelated black kitten pops out of the corner, at the bottom, in the center, there is a pixelated purple and green yarn.

In the left part, the text recites:
“Knitting Our Internet Italy tour
14/3 Fa’ la cosa giusta, Milan
18-19/3 Liceo Galilei, Verona (online)
18/3 Zero81, Naples
25/3 Villa Bernabei, Velletri
27/3 Roma (location TBD)
29/3 SCIFT, Làbas, Bologna
1-2/4 We’ll collectively connect to the FediForum from Làbas, Bologna
More info: https://ournet.rocks”

In the right part, a map of Italy with pins in all the locations where the workshop will be taking place.
ALT text

A graphics with red background and white text. On the top right, a pixelated black kitten pops out of the corner, at the bottom, in the center, there is a pixelated purple and green yarn. In the left part, the text recites: “Knitting Our Internet Italy tour 14/3 Fa’ la cosa giusta, Milan 18-19/3 Liceo Galilei, Verona (online) 18/3 Zero81, Naples 25/3 Villa Bernabei, Velletri 27/3 Roma (location TBD) 29/3 SCIFT, Làbas, Bologna 1-2/4 We’ll collectively connect to the FediForum from Làbas, Bologna More info: https://ournet.rocks” In the right part, a map of Italy with pins in all the locations where the workshop will be taking place.

@tommi@pan.rent

🧶 La Nostra Rete in tour! 🇮🇹

(English version in the following post)

Da domani partirà il fantasmagorico imperdibile tour de La Nostra Rete, che porterà il workshop in giro per l’Italia! ⛵

Se sarete nei luoghi in cui si terrà il laboratorio siete assolutamente invitatз, 🆓 l’ingresso è libero e gratuito. Se non foste nei paraggi, condividete appppalla con amicз tecnoscetticз, tecnoinnamoratз, tecnoasceticз, tecnorepellenti o tecnoindifferenti. Sono tuttз benvenutз 💕

Grazie alle persone stratopiche che mi ospiteranno! @collettivodemand @reclaimthetech

✨ Nota speciale: mentre sarò a Bologna, ci stiamo organizzando per trovarci di persona e partecipare collettivamente al @fediforum, tuttз insieme da Scift, la nuova officina che aprirà domani a Làbas!

ℹ️ Per info aggiornate, visitate ournet.rocks/it/

Una grafica con sfondo rosso e testo bianco. In alto a destra spunta un gattino nero pixelato, in basso in centro c’è un gomitolo pixelato viola scuro e verde.

Nella parte sinistra, il testo recita:
“14/3 Fa’ la cosa giusta, Milano
18-19/3 Liceo Galilei, Verona (online)
18/3 Zero81, Napoli
25/3 Villa Bernabei, Velletri
27/3 Roma (luogo da definirsi)
29/3 SCIFT, Làbas, Bologna
1-2/4 Ci connetteremo tuttз insieme al FediForum da Làbas, a Bologna
Maggiori informazioni: https://ournet.rocks”

Nella parte destra, una mappa dell’Italia con le tappe del tour evidenziate.
ALT text

Una grafica con sfondo rosso e testo bianco. In alto a destra spunta un gattino nero pixelato, in basso in centro c’è un gomitolo pixelato viola scuro e verde. Nella parte sinistra, il testo recita: “14/3 Fa’ la cosa giusta, Milano 18-19/3 Liceo Galilei, Verona (online) 18/3 Zero81, Napoli 25/3 Villa Bernabei, Velletri 27/3 Roma (luogo da definirsi) 29/3 SCIFT, Làbas, Bologna 1-2/4 Ci connetteremo tuttз insieme al FediForum da Làbas, a Bologna Maggiori informazioni: https://ournet.rocks” Nella parte destra, una mappa dell’Italia con le tappe del tour evidenziate.

@markwyner@mas.to
@markwyner@mas.to
@puresick@social.hnnng.space

A first draft of the "Accessibility Roles and Responsibilities Mapping (ARRM)" document has been published!

w3.org/WAI/planning/arrm/

This resource helps "[…] defining roles, tasks, and responsibilities for meeting Web Content Accessibility Guidelines […]".

Worth a read!

w3.org

Accessibility Roles and Responsibilities Mapping (ARRM)

ARRM helps you assign responsibilities for digital accessibility to appropriate roles (UX designer, content creator, developer) early in projects.

@rasterweb@mastodon.social

Coming up on my task list is getting multiple/different containers running on a single domain using subdomains… can that work?

So app1.example.com is one Podman container and app2.example.com is a different Podman container… (both using port 80)

I’ve found this guide I might try, but if you have a better way please let me know!

➡️ redhat.com/en/blog/podman-ngin

redhat.com

How to create multidomain web applications with Podman and Nginx

Managing different applications from different domains on the same host can be difficult when using different ports. When a colleague suggested I write an ar...

@xandra@tilde.zone

just under TWO WEEKS until the submission deadline for Good Internet magazine: march 15, 2025!

☂️ Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔎 we're looking for 1,500 to 4,000 word articles about anything for that audience!

👉 this means hobbyists, digital (and traditional) , culture enthusiasts, nerds, expatriates, & anyone who wants to unplug from the corporate-owned .

topics could be:

* internet history
* personal websites & blogs
* on the
* finding inspiration for a
* trends (current or old)
* running from the of the web
* lessons or post-mortems from web projects
* news or overviews of projects
* on the indieweb

🔍 also looking for any submissions centered around the web, coding, internet culture, and digital art!

if it relates to hobbies on "this side of the web," we probably want to run it!

✨ you can have your article submitted as text and images only OR you can code a whole webpage that helps tell your story!

🌊 if you're interested in learning more, sign up for our email list or check out the submission guidelines @ goodinternetmagazine.com!

🙏 (please boost if you can! <3 getting the word out helps so much!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@avery@mastodon.v0dev.cfd

Cloudflare is the worst.

Banning people under 18 without warning, even when they want to use parental consent, is anti-youth entrepreneurship.

You build projects, buy domains, verify your identity, and they delete your whole account just for being young. ☠️

No second chance, no future. This affects many developers, and even Cloudflare themselves.

I'll never recommend Cloudflare, and I never will.

@xandra@tilde.zone

just under TWO WEEKS until the submission deadline for Good Internet magazine: march 15, 2025!

☂️ Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔎 we're looking for 1,500 to 4,000 word articles about anything for that audience!

👉 this means hobbyists, digital (and traditional) , culture enthusiasts, nerds, expatriates, & anyone who wants to unplug from the corporate-owned .

topics could be:

* internet history
* personal websites & blogs
* on the
* finding inspiration for a
* trends (current or old)
* running from the of the web
* lessons or post-mortems from web projects
* news or overviews of projects
* on the indieweb

🔍 also looking for any submissions centered around the web, coding, internet culture, and digital art!

if it relates to hobbies on "this side of the web," we probably want to run it!

✨ you can have your article submitted as text and images only OR you can code a whole webpage that helps tell your story!

🌊 if you're interested in learning more, sign up for our email list or check out the submission guidelines @ goodinternetmagazine.com!

🙏 (please boost if you can! <3 getting the word out helps so much!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@xandra@tilde.zone

today is officially *THREE* weeks until the submission deadline for Good Internet magazine!

Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔍 we're looking for 1,500-4,000 word articles about anything related to that!

you could write about:

* history
* personal
* on the
* finding inspiration for a
* trends
* running from the of the
* lessons or post-mortems from projects
* news or overviews of projects

if it relates to hobbies on "this side of the web," whether you call it the or indieweb, we probably want to run it!

you can have your article as low-media (meaning only text and images) or interactive, where you code an entire webpage to help tell your story.

if you're interested in learning more, you can sign up for our email list for when we launch or you can check the submission guidelines @ goodinternetmagazine.com!

(please boost if you can! <3)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@xandra@tilde.zone

just under TWO WEEKS until the submission deadline for Good Internet magazine: march 15, 2025!

☂️ Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔎 we're looking for 1,500 to 4,000 word articles about anything for that audience!

👉 this means hobbyists, digital (and traditional) , culture enthusiasts, nerds, expatriates, & anyone who wants to unplug from the corporate-owned .

topics could be:

* internet history
* personal websites & blogs
* on the
* finding inspiration for a
* trends (current or old)
* running from the of the web
* lessons or post-mortems from web projects
* news or overviews of projects
* on the indieweb

🔍 also looking for any submissions centered around the web, coding, internet culture, and digital art!

if it relates to hobbies on "this side of the web," we probably want to run it!

✨ you can have your article submitted as text and images only OR you can code a whole webpage that helps tell your story!

🌊 if you're interested in learning more, sign up for our email list or check out the submission guidelines @ goodinternetmagazine.com!

🙏 (please boost if you can! <3 getting the word out helps so much!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@CodingItWrong@fosstodon.org

Genuine question: if the end goal is an open web and user freedoms, how essential is having a diversity of browser engines?

If building/maintaining a browser engine separate from Blink and WebKit is a lot of effort, is that the most important effort for the community to invest in? Or are there other ways to influence the web that are higher value/lower cost?

I’d love to learn from anyone’s thoughts. I would request for folks to keep the discussion respectful.

@mmayo@hachyderm.io

I wrote up my thoughts on the bigger picture topic of Mozilla, Gecko, and what web browser dev probably ends up looking like.. or not. From the perspective of someone who stewarded Firefox for a couple years.

vmunix.com/gecko-mozilla-thoug

I’m pretty sure nobody comments on blogs and I'm really curious what people have to contribute to the discussion so I’ll post the paragraphs below.

vmunix.com

Gecko. Mozilla. Thoughts.

Lots of talk on the socials re: Mozilla and Firefox/Gecko triggered by the recent ToS changes. Thought I'd write up some thoughts on the bigger picture "what to do about gecko" stuff. Additions, corrections, giant gaping holes that need to be addressed.. all welcome feedback. :) The goal and awesomeness

@anatudor@mastodon.social

Grainy distorted gradient blob: 1 `radialGradient` (setting a focal point `fx,fy`) vs. multiple `radial-gradient()` layers (no option to control focal point).

Using filters for distortion & grain effect.

A bit more detail on this reddit.com/r/css/comments/1j03

Comparative result of the SVG radialGradient vs. the CSS radial-gradient() blob.
ALT text

Comparative result of the SVG radialGradient vs. the CSS radial-gradient() blob.

@anatudor@mastodon.social

: If you want a circle in the middle of your , choose your `viewBox` wisely.

Both options below produce the same visual result, but the second one makes it easier to use the circle later. To animate transform (make it pulse), to build (animated) pie/ 🍩 charts like here mastodon.social/@anatudor/1140

/* ❌ DON'T ❌ */
<svg viewBox='0 0 8 8'>
  <circle cx='4' cy='4' r='4'/>
</svg>

/* ✅ DO ✅ */
<svg viewBox='-4 -4 8 8'>
  <circle r='50%'/>
</svg>
ALT text

/* ❌ DON'T ❌ */ <svg viewBox='0 0 8 8'> <circle cx='4' cy='4' r='4'/> </svg> /* ✅ DO ✅ */ <svg viewBox='-4 -4 8 8'> <circle r='50%'/> </svg>

@anatudor@mastodon.social

: If you want a circle in the middle of your , choose your `viewBox` wisely.

Both options below produce the same visual result, but the second one makes it easier to use the circle later. To animate transform (make it pulse), to build (animated) pie/ 🍩 charts like here mastodon.social/@anatudor/1140

/* ❌ DON'T ❌ */
<svg viewBox='0 0 8 8'>
  <circle cx='4' cy='4' r='4'/>
</svg>

/* ✅ DO ✅ */
<svg viewBox='-4 -4 8 8'>
  <circle r='50%'/>
</svg>
ALT text

/* ❌ DON'T ❌ */ <svg viewBox='0 0 8 8'> <circle cx='4' cy='4' r='4'/> </svg> /* ✅ DO ✅ */ <svg viewBox='-4 -4 8 8'> <circle r='50%'/> </svg>

@anatudor@mastodon.social

Grainy distorted gradient blob: 1 `radialGradient` (setting a focal point `fx,fy`) vs. multiple `radial-gradient()` layers (no option to control focal point).

Using filters for distortion & grain effect.

A bit more detail on this reddit.com/r/css/comments/1j03

Comparative result of the SVG radialGradient vs. the CSS radial-gradient() blob.
ALT text

Comparative result of the SVG radialGradient vs. the CSS radial-gradient() blob.

@matiu_bidule@mamot.fr · Reply to matiu bidule
Bike Fall Meme:

1st Panel:  Mozilla
2nd Panel (stick being jammed in the wheel): AI, ADs, and ToS
3rd Panel: Why do the users hate us?!
ALT text

Bike Fall Meme: 1st Panel: Mozilla 2nd Panel (stick being jammed in the wheel): AI, ADs, and ToS 3rd Panel: Why do the users hate us?!

@minimalparts@fosstodon.org

I keep seeing posts about Web pages disappearing, being backed up in extremis on the . And then other posts worrying about whether the Archive itself could one day disappear.

The obvious answer to this problem is that we need a archive. But where would this come from? There are both technical and legal considerations to take into account. I.e. how do we make it work, and how do we ensure it does not infringe laws? So here's a thought... \1

@stefano@bsd.cafe
@minimalparts@fosstodon.org

I keep seeing posts about Web pages disappearing, being backed up in extremis on the . And then other posts worrying about whether the Archive itself could one day disappear.

The obvious answer to this problem is that we need a archive. But where would this come from? There are both technical and legal considerations to take into account. I.e. how do we make it work, and how do we ensure it does not infringe laws? So here's a thought... \1

@stefano@bsd.cafe
@davidbisset@phpc.social

If you remember (and like) the "old web" (I would even say even almost BEFORE officially "Web 1.0" as labeled) then you might enjoy this nostalgic and hopeful look at the "fun" web:

"This page is under construction: A love letter to the personal website".

localghost.dev/blog/this-page-

localghost.dev

This page is under construction - localghost

If you take just one thing away from this article, I want it to be this: please build your own website.

@davidbisset@phpc.social

If you remember (and like) the "old web" (I would even say even almost BEFORE officially "Web 1.0" as labeled) then you might enjoy this nostalgic and hopeful look at the "fun" web:

"This page is under construction: A love letter to the personal website".

localghost.dev/blog/this-page-

localghost.dev

This page is under construction - localghost

If you take just one thing away from this article, I want it to be this: please build your own website.

@stefano@bsd.cafe
@xandra@tilde.zone

today is officially *THREE* weeks until the submission deadline for Good Internet magazine!

Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔍 we're looking for 1,500-4,000 word articles about anything related to that!

you could write about:

* history
* personal
* on the
* finding inspiration for a
* trends
* running from the of the
* lessons or post-mortems from projects
* news or overviews of projects

if it relates to hobbies on "this side of the web," whether you call it the or indieweb, we probably want to run it!

you can have your article as low-media (meaning only text and images) or interactive, where you code an entire webpage to help tell your story.

if you're interested in learning more, you can sign up for our email list for when we launch or you can check the submission guidelines @ goodinternetmagazine.com!

(please boost if you can! <3)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@xandra@tilde.zone

today is officially *THREE* weeks until the submission deadline for Good Internet magazine!

Good Internet launches in May 2025. it's a volunteer-run, not-for-profit print and digital quarterly magazine for personal website owners and those interested in using the internet as a means of self-expression, art, and recreation.

🔍 we're looking for 1,500-4,000 word articles about anything related to that!

you could write about:

* history
* personal
* on the
* finding inspiration for a
* trends
* running from the of the
* lessons or post-mortems from projects
* news or overviews of projects

if it relates to hobbies on "this side of the web," whether you call it the or indieweb, we probably want to run it!

you can have your article as low-media (meaning only text and images) or interactive, where you code an entire webpage to help tell your story.

if you're interested in learning more, you can sign up for our email list for when we launch or you can check the submission guidelines @ goodinternetmagazine.com!

(please boost if you can! <3)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@aral@mastodon.ar.al

New Kitten release

• Fixes redirection from sign-in page when person is already authenticated.

kitten.small-web.org

To learn more about how Kitten automatically implements authentication for your Small Web sites and apps using public-key cryptography (so even your own server doesn’t know your secret)¹, please see the Authentication tutorial:

kitten.small-web.org/tutorials

Enjoy!

:kitten:💕

¹ The security (and privacy) of Domain/Kitten are based on a 32-byte cryptographically random secret string that only the person who owns/controls a domain knows.

This is basically a Base256-encoded ed25519 secret key where the Base256 alphabet is a set of curated emoji surrogate pairs without any special modifiers chosen mainly from the animals, plants, and food groups with some exceptions (to avoid common phobias or triggers, etc.) that we call KittenMoji.

When setting up a Small Web app via Domain, this key is generated in the person’s browser, on their own computer, and is never communicated to either the Domain instance or the Kitten app being installed. Instead the ed25519 public key is sent to both and signed token authentication is used when the server needs to verify the owner’s identity (e.g., before allowing access to the administration area).

The expected/encouraged behaviour is for the person to store this secret in their password manager of choice.

More: kitten.small-web.org/reference

kitten.small-web.org

Kitten: Reference

@aral@mastodon.ar.al

New Kitten release

• Fixes redirection from sign-in page when person is already authenticated.

kitten.small-web.org

To learn more about how Kitten automatically implements authentication for your Small Web sites and apps using public-key cryptography (so even your own server doesn’t know your secret)¹, please see the Authentication tutorial:

kitten.small-web.org/tutorials

Enjoy!

:kitten:💕

¹ The security (and privacy) of Domain/Kitten are based on a 32-byte cryptographically random secret string that only the person who owns/controls a domain knows.

This is basically a Base256-encoded ed25519 secret key where the Base256 alphabet is a set of curated emoji surrogate pairs without any special modifiers chosen mainly from the animals, plants, and food groups with some exceptions (to avoid common phobias or triggers, etc.) that we call KittenMoji.

When setting up a Small Web app via Domain, this key is generated in the person’s browser, on their own computer, and is never communicated to either the Domain instance or the Kitten app being installed. Instead the ed25519 public key is sent to both and signed token authentication is used when the server needs to verify the owner’s identity (e.g., before allowing access to the administration area).

The expected/encouraged behaviour is for the person to store this secret in their password manager of choice.

More: kitten.small-web.org/reference

kitten.small-web.org

Kitten: Reference

@KazukyAkayashi@social.zarchbox.fr

Dites les fedigens fort en CSS, y a moyen de colorer automatiquement certains mot d'une certaine couleur sans devoir foutre trouzemille class ou span ? (un genre de reconnaissance de mot puis pouf application de la couleur ?)

@xandra@tilde.zone

this will likely be a recurring reminder as the weeks go by, but i'm so excited about this project. i have to share! (this is the first time i've been nervous to announce something on this side of the web!)

i'm combining my 10 years of journalism experience with my love for the by launching GOOD INTERNET, a regular periodical magazine in both print and digital formats. and this is a non-profit, completely independent endeavor!

goodinternetmagazine.com/

ultimately, Good Internet will cover a lot of different aspects of the small web: unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. it will be approachable for beginners and enjoyable for seasoned indie web travelers!

the can be hard to keep up with if you aren't "plugged in," especially if you want to find other hobby website owners, folks coding for fun, weird web projects, or artists taking back their digital ownership. it's overdue that this side of the web has an analog publication!

having a central publication about the decentralized parts of the personal web makes me even more excited to share this hobby with those who might not even know about it--all within beautiful, high-res, high-quality pages.

the idea here is to have a physical celebration of this hobby in addition to being informative, helpful, and accessible.

consider signing up for email notifications when we launch the first issue in may 2025:

goodinternetmagazine.com

(if you're interested in an article or op-ed about this side of the web/personal websites, coding an interactive article, or want to know what that even means, send an email to hello@goodinternetmagazine.com! taking pitches for may 2025!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@rolle@mementomori.social
@dilmandila@mograph.social

Are there any good open-source newsletter or mailing list tools that someone can recommend? I met a person who had a newsletter (not sure what service she was using) but she said the costs kept going up and she couldn't afford it anymore, so I promised I'd ask around and see if she can get something good and affordable. I've heard of Ghost, but wonder if there are free ones as well?

@fell@ma.fellr.net

I want y'all web designers to look at brailleinstitute.org

It's beautiful. Text is actually black on white (or white on black) unlike your typical grey on grey. There is a nice 2 pixel border around sections and a thick shadow around buttons, giving them a retro feel but also making them clearly readable as buttons.

I love it. They also have a cool font available.

brailleinstitute.org

Braille Institute of America - Free, life-changing services.

Free, life-changing services, classes, and more for people with low vision to no vision.

@fell@ma.fellr.net

I want y'all web designers to look at brailleinstitute.org

It's beautiful. Text is actually black on white (or white on black) unlike your typical grey on grey. There is a nice 2 pixel border around sections and a thick shadow around buttons, giving them a retro feel but also making them clearly readable as buttons.

I love it. They also have a cool font available.

brailleinstitute.org

Braille Institute of America - Free, life-changing services.

Free, life-changing services, classes, and more for people with low vision to no vision.

@madeindex@mastodon.social
@aral@mastodon.ar.al

Donno about you guys but it sure is nice not to have to try and decipher the clusterfuck-like syntax of Hugo’s Go-based templating engine anymore…

The code on the left is Kitten¹, on the right is Hugo².

Kitten’s ‘template engine’ is just JavaScript tagged template strings.

(I’m porting the Small Technology Foundation web site³ from Site.js⁴ to Kitten, and in the process from being a Hugo-based static site to a dynamic one with a nice little admin panel I’m making to make it trivially easy to add new news items, events, and videos.)

¹ kitten.small-web.org
² gohugo.io
³ small-tech.org
sitejs.org

Screenshot of split terminal window showing the sample template in Kitten (on the left, as a JavaScript tagged template string) and on the right in Hugo’s Go-based templating system.

Partial code comparison:

Kitten:

      <if ${db.news.posts.length > 0}>
        <then>
          <ul class='posts-list'>
          ${db.news.posts.map(post => kitten.html`
            <li>
              <h2 class='p-name'>${post.title}</h2>
              <div class='entry-meta'>
                <p>Posted: ${post.date} by ${post.author.name} on <a href='${post.author.siteLink}'>${post.author.siteName}</a>
              </div>
              <blockquote class='summary'>
                ${[kitten.md.render(post.summary)]}
              </blockquote>
            
Hugo:

	{{ $section := where .Site.RegularPages "Section" .Section }}
	<ul class='posts-list'>
		{{ range $section }}
			<li>
				<h2 class='p-name'>
					{{ .Title }}
				</h2>
				<div class='entry-meta'><p>Posted: <time datetime='{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}'>
					{{ .Date.Format "2" | humanize }} {{ .Date.Format "January, 2006" }}
					</time> {{ with .Params.author }}by {{ . }} {{end}}on <a href='{{ .Params.SourceURL }}'>{{ .Params.SourceName }}</a></p></div>
				<blockquote class='summary'>
					<p>{{ .Summary }}</p>
				</blockquote>
ALT text

Screenshot of split terminal window showing the sample template in Kitten (on the left, as a JavaScript tagged template string) and on the right in Hugo’s Go-based templating system. Partial code comparison: Kitten: <if ${db.news.posts.length > 0}> <then> <ul class='posts-list'> ${db.news.posts.map(post => kitten.html` <li> <h2 class='p-name'>${post.title}</h2> <div class='entry-meta'> <p>Posted: ${post.date} by ${post.author.name} on <a href='${post.author.siteLink}'>${post.author.siteName}</a> </div> <blockquote class='summary'> ${[kitten.md.render(post.summary)]} </blockquote> Hugo: {{ $section := where .Site.RegularPages "Section" .Section }} <ul class='posts-list'> {{ range $section }} <li> <h2 class='p-name'> {{ .Title }} </h2> <div class='entry-meta'><p>Posted: <time datetime='{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}'> {{ .Date.Format "2" | humanize }} {{ .Date.Format "January, 2006" }} </time> {{ with .Params.author }}by {{ . }} {{end}}on <a href='{{ .Params.SourceURL }}'>{{ .Params.SourceName }}</a></p></div> <blockquote class='summary'> <p>{{ .Summary }}</p> </blockquote>

@madeindex@mastodon.social
@madeindex@mastodon.social
@aral@mastodon.ar.al

Your web server having an interactive shell (REPL) where you can live update entries in your site/app’s database is pretty neat (if I do say so myself) :)

kitten.small-web.org/reference

(I’m porting the Small Technology Foundation site¹ from Site.js² – and hence from being a static site generated via Site.js’s integrated Hugo³ – to Kitten⁴. In the process, I’m creating an admin panel⁵ for the news, events, and videos sections, which will make them easier to update, and storing the data in Kitten’s internal JavaScript Database⁶.)

¹ small-tech.org
² sitejs.org
³ gohugo.io/
kitten.small-web.org
⁵ It’s trivial to create authenticated routes in Kitten. You just add a lock emoji (🔒) to the end of your route’s name. e.g., admin🔒.page.js or /admin🔒/index.page.js (see kitten.small-web.org/reference).
codeberg.org/small-tech/jsdb

Screenshot of Kitten’s interactive shell, showing me alterning a database entry in development:

}
  ]

🐱 💬 kitten.db.news[0].link = kitten.db.news[0].postLink

  'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/'

🐱 💬 kitten.db.news[0]

  Proxy [
    News {
      link: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/',
      title: 'New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)',
      date: '2024-05-23',
      image: '',
      summary: 'In this video, Aral demonstrates the new features added to Kitten in May: including the new Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability).',
      author: 'Aral Balkan',
      sourceName: 'Aral’s Blog',
      sourceLink: 'https://ar.al',
      postLink: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/',
      presets: 'custom'
    },
    {
      get: [Function: bound getHandler] { boundObject: [DataProxy] },
      set: [Function: bound setHandler] { boundObject: [DataProxy] },
      defineProperty: [Function: bound definePropertyHandler] { boundObject: [DataProxy] },
      deleteProperty: [Function: bound deletePropertyHandler] { boundObject: [DataProxy] }
    }
  ]
ALT text

Screenshot of Kitten’s interactive shell, showing me alterning a database entry in development: } ] 🐱 💬 kitten.db.news[0].link = kitten.db.news[0].postLink 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/' 🐱 💬 kitten.db.news[0] Proxy [ News { link: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/', title: 'New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)', date: '2024-05-23', image: '', summary: 'In this video, Aral demonstrates the new features added to Kitten in May: including the new Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability).', author: 'Aral Balkan', sourceName: 'Aral’s Blog', sourceLink: 'https://ar.al', postLink: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/', presets: 'custom' }, { get: [Function: bound getHandler] { boundObject: [DataProxy] }, set: [Function: bound setHandler] { boundObject: [DataProxy] }, defineProperty: [Function: bound definePropertyHandler] { boundObject: [DataProxy] }, deleteProperty: [Function: bound deletePropertyHandler] { boundObject: [DataProxy] } } ]

@aral@mastodon.ar.al

Your web server having an interactive shell (REPL) where you can live update entries in your site/app’s database is pretty neat (if I do say so myself) :)

kitten.small-web.org/reference

(I’m porting the Small Technology Foundation site¹ from Site.js² – and hence from being a static site generated via Site.js’s integrated Hugo³ – to Kitten⁴. In the process, I’m creating an admin panel⁵ for the news, events, and videos sections, which will make them easier to update, and storing the data in Kitten’s internal JavaScript Database⁶.)

¹ small-tech.org
² sitejs.org
³ gohugo.io/
kitten.small-web.org
⁵ It’s trivial to create authenticated routes in Kitten. You just add a lock emoji (🔒) to the end of your route’s name. e.g., admin🔒.page.js or /admin🔒/index.page.js (see kitten.small-web.org/reference).
codeberg.org/small-tech/jsdb

Screenshot of Kitten’s interactive shell, showing me alterning a database entry in development:

}
  ]

🐱 💬 kitten.db.news[0].link = kitten.db.news[0].postLink

  'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/'

🐱 💬 kitten.db.news[0]

  Proxy [
    News {
      link: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/',
      title: 'New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)',
      date: '2024-05-23',
      image: '',
      summary: 'In this video, Aral demonstrates the new features added to Kitten in May: including the new Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability).',
      author: 'Aral Balkan',
      sourceName: 'Aral’s Blog',
      sourceLink: 'https://ar.al',
      postLink: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/',
      presets: 'custom'
    },
    {
      get: [Function: bound getHandler] { boundObject: [DataProxy] },
      set: [Function: bound setHandler] { boundObject: [DataProxy] },
      defineProperty: [Function: bound definePropertyHandler] { boundObject: [DataProxy] },
      deleteProperty: [Function: bound deletePropertyHandler] { boundObject: [DataProxy] }
    }
  ]
ALT text

Screenshot of Kitten’s interactive shell, showing me alterning a database entry in development: } ] 🐱 💬 kitten.db.news[0].link = kitten.db.news[0].postLink 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/' 🐱 💬 kitten.db.news[0] Proxy [ News { link: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/', title: 'New Kitten features: Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability)', date: '2024-05-23', image: '', summary: 'In this video, Aral demonstrates the new features added to Kitten in May: including the new Interactive Shell (REPL), Multi-page Settings, and backup and restore (data portability).', author: 'Aral Balkan', sourceName: 'Aral’s Blog', sourceLink: 'https://ar.al', postLink: 'https://ar.al/2024/05/23/new-kitten-features-interactive-shell-repl-multi-page-settings-and-backup-and-restore-data-portability/', presets: 'custom' }, { get: [Function: bound getHandler] { boundObject: [DataProxy] }, set: [Function: bound setHandler] { boundObject: [DataProxy] }, defineProperty: [Function: bound definePropertyHandler] { boundObject: [DataProxy] }, deleteProperty: [Function: bound deletePropertyHandler] { boundObject: [DataProxy] } } ]

@rasterweb@mastodon.social · Reply to Pete Prodoehl 🍕
@rasterweb@mastodon.social · Reply to Pete Prodoehl 🍕
@aral@mastodon.ar.al

New releases

• Kitten (rolling release)
• @small-tech/https version 5.3.2
• Auto Encrypt version 4.1.3

OCSP support has been reinstated in the server so existing sites with Let’s Encrypt certificates provisioned prior to the removal of the OCSP stapling requirement will not fail to load in Firefox.

Kitten servers in production will automatically update to this version in a few hours. You can also sign in to the Kitten settings page on your server and do a manual update to update Kitten immediately.

Thanks to @stefan and @s1r83r for bringing this to my attention. (mastodon.ar.al/@aral/113969540)

mastodon.ar.al

Aral Balkan (@aral@mastodon.ar.al)

@s1r83r@pataterie.ca @stefan@gardenstate.social Thanks for the heads up, folks. So, here’s what’s happened: 1. Let’s Encrypt removed OCSP support and starting rejecting certificate requests that require OCSP stapling (a privacy feature that Kitten inherited from my Auto Encrypt module) for new server requests and will reject certificate renewal requests starting in May. 2. So I went ahead and removed the OCSP stapling requirement from the certificate requests Auto Encrypt makes to Let’s Encrypt. 3. I also removed OCSP support from the server. Makes sense, right? Sure does, until you consider what happens to servers with already-provisioned Let’s Encrypt certificates that have certificates that require OCSP stapling. (kitten.small-web.org’s certificate got renewed four days ago, before I’d released the updates.) *Doh!* 🤦‍♂️ Seems Safari and Chrom(ium) are fine with letting it pass. However, Firefox, (and correctly too, I might add), refuses to load the site. So I’m off to update Auto Encrypt to re-enable OCSP support with a note to disable it in May (by which time all certificates will have renewed anyway without the stapling requirement) and then issue new builds of @small-web/https and Kitten. Kitten servers should automatically upgrade and start working in Firefox in several hours. And you can also manually update them if you want to before then after I’ve announced the releases. Thanks again for letting me know. :kitten:💕 #Kitten #SmallWeb #AutoEncrypt #LetsEncrypt #TLS #SSL #HTTPS #OCSP

@qiita@rss-mstdn.studiofreesia.com

Sendme
– from @n0iroh

File transfer doesn't need to be complicated. It's like scp without needing to know the IP address. Add some files to sendme, and it will give you a pastable ticket that you can give to anyone who needs your files. Sendme will connect your devices directly & transfer the data without any accounts or configuration.

📨 iroh.computer/sendme

iroh.computer

iroh

less net work for networks

@xandra@tilde.zone

this will likely be a recurring reminder as the weeks go by, but i'm so excited about this project. i have to share! (this is the first time i've been nervous to announce something on this side of the web!)

i'm combining my 10 years of journalism experience with my love for the by launching GOOD INTERNET, a regular periodical magazine in both print and digital formats. and this is a non-profit, completely independent endeavor!

goodinternetmagazine.com/

ultimately, Good Internet will cover a lot of different aspects of the small web: unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. it will be approachable for beginners and enjoyable for seasoned indie web travelers!

the can be hard to keep up with if you aren't "plugged in," especially if you want to find other hobby website owners, folks coding for fun, weird web projects, or artists taking back their digital ownership. it's overdue that this side of the web has an analog publication!

having a central publication about the decentralized parts of the personal web makes me even more excited to share this hobby with those who might not even know about it--all within beautiful, high-res, high-quality pages.

the idea here is to have a physical celebration of this hobby in addition to being informative, helpful, and accessible.

consider signing up for email notifications when we launch the first issue in may 2025:

goodinternetmagazine.com

(if you're interested in an article or op-ed about this side of the web/personal websites, coding an interactive article, or want to know what that even means, send an email to hello@goodinternetmagazine.com! taking pitches for may 2025!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@Vivaldi@vivaldi.net

Hey web devs, ever used CSS Grid or the :has() selector? Ever wondered how they actually made it into browsers?

Stephanie Stimac (@seaotta) from Igalia (@igalia) spills the beans on how new web features get funded, developed, and shipped. Turns out, it’s not as simple as you’d think.

Catch the convo on the latest For a Better Web Podcast.

📺 Watch: youtube.com/watch?v=loBPN54siC
🎧 Listen: open.spotify.com/episode/1tzEQ

A podcast episode image of Bruce Lawson and Stephanie Stimac. Text on image: Episode 06 - Funding the web platform for the future.
ALT text

A podcast episode image of Bruce Lawson and Stephanie Stimac. Text on image: Episode 06 - Funding the web platform for the future.

@Vivaldi@vivaldi.net

Hey web devs, ever used CSS Grid or the :has() selector? Ever wondered how they actually made it into browsers?

Stephanie Stimac (@seaotta) from Igalia (@igalia) spills the beans on how new web features get funded, developed, and shipped. Turns out, it’s not as simple as you’d think.

Catch the convo on the latest For a Better Web Podcast.

📺 Watch: youtube.com/watch?v=loBPN54siC
🎧 Listen: open.spotify.com/episode/1tzEQ

A podcast episode image of Bruce Lawson and Stephanie Stimac. Text on image: Episode 06 - Funding the web platform for the future.
ALT text

A podcast episode image of Bruce Lawson and Stephanie Stimac. Text on image: Episode 06 - Funding the web platform for the future.

@razze@osna.social

I've added a new card to the landing page of flathub.org yesterday, focused on games.

We have been trying to do this for quiet some time and I know that the results (as in what is in which category) are not perfect, but putting this out there hopefully helps us move things.

New games category on flathub.org highlighting games, emulators, game launchers and game tools.
ALT text

New games category on flathub.org highlighting games, emulators, game launchers and game tools.

@razze@osna.social

I've added a new card to the landing page of flathub.org yesterday, focused on games.

We have been trying to do this for quiet some time and I know that the results (as in what is in which category) are not perfect, but putting this out there hopefully helps us move things.

New games category on flathub.org highlighting games, emulators, game launchers and game tools.
ALT text

New games category on flathub.org highlighting games, emulators, game launchers and game tools.

@xandra@tilde.zone

this will likely be a recurring reminder as the weeks go by, but i'm so excited about this project. i have to share! (this is the first time i've been nervous to announce something on this side of the web!)

i'm combining my 10 years of journalism experience with my love for the by launching GOOD INTERNET, a regular periodical magazine in both print and digital formats. and this is a non-profit, completely independent endeavor!

goodinternetmagazine.com/

ultimately, Good Internet will cover a lot of different aspects of the small web: unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. it will be approachable for beginners and enjoyable for seasoned indie web travelers!

the can be hard to keep up with if you aren't "plugged in," especially if you want to find other hobby website owners, folks coding for fun, weird web projects, or artists taking back their digital ownership. it's overdue that this side of the web has an analog publication!

having a central publication about the decentralized parts of the personal web makes me even more excited to share this hobby with those who might not even know about it--all within beautiful, high-res, high-quality pages.

the idea here is to have a physical celebration of this hobby in addition to being informative, helpful, and accessible.

consider signing up for email notifications when we launch the first issue in may 2025:

goodinternetmagazine.com

(if you're interested in an article or op-ed about this side of the web/personal websites, coding an interactive article, or want to know what that even means, send an email to hello@goodinternetmagazine.com! taking pitches for may 2025!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@xandra@tilde.zone

this will likely be a recurring reminder as the weeks go by, but i'm so excited about this project. i have to share! (this is the first time i've been nervous to announce something on this side of the web!)

i'm combining my 10 years of journalism experience with my love for the by launching GOOD INTERNET, a regular periodical magazine in both print and digital formats. and this is a non-profit, completely independent endeavor!

goodinternetmagazine.com/

ultimately, Good Internet will cover a lot of different aspects of the small web: unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. it will be approachable for beginners and enjoyable for seasoned indie web travelers!

the can be hard to keep up with if you aren't "plugged in," especially if you want to find other hobby website owners, folks coding for fun, weird web projects, or artists taking back their digital ownership. it's overdue that this side of the web has an analog publication!

having a central publication about the decentralized parts of the personal web makes me even more excited to share this hobby with those who might not even know about it--all within beautiful, high-res, high-quality pages.

the idea here is to have a physical celebration of this hobby in addition to being informative, helpful, and accessible.

consider signing up for email notifications when we launch the first issue in may 2025:

goodinternetmagazine.com

(if you're interested in an article or op-ed about this side of the web/personal websites, coding an interactive article, or want to know what that even means, send an email to hello@goodinternetmagazine.com! taking pitches for may 2025!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@xandra@tilde.zone

this will likely be a recurring reminder as the weeks go by, but i'm so excited about this project. i have to share! (this is the first time i've been nervous to announce something on this side of the web!)

i'm combining my 10 years of journalism experience with my love for the by launching GOOD INTERNET, a regular periodical magazine in both print and digital formats. and this is a non-profit, completely independent endeavor!

goodinternetmagazine.com/

ultimately, Good Internet will cover a lot of different aspects of the small web: unplugging from the corporate web, fighting , migrating from data-harvesting corpo social media, creating your own personal website, using code and website-building as an art form, federation, and creating websites for fun. it will be approachable for beginners and enjoyable for seasoned indie web travelers!

the can be hard to keep up with if you aren't "plugged in," especially if you want to find other hobby website owners, folks coding for fun, weird web projects, or artists taking back their digital ownership. it's overdue that this side of the web has an analog publication!

having a central publication about the decentralized parts of the personal web makes me even more excited to share this hobby with those who might not even know about it--all within beautiful, high-res, high-quality pages.

the idea here is to have a physical celebration of this hobby in addition to being informative, helpful, and accessible.

consider signing up for email notifications when we launch the first issue in may 2025:

goodinternetmagazine.com

(if you're interested in an article or op-ed about this side of the web/personal websites, coding an interactive article, or want to know what that even means, send an email to hello@goodinternetmagazine.com! taking pitches for may 2025!)

goodinternetmagazine.com

good internet magazine | for the small web

A print and digital magazine coming soon.

@Vivaldi Congratulations on this great and memorable . 🥳🎈🥂🍾🎉

I've been using since the first technical preview and I can't imagine working without it, both privately and professionally.

VIVALDI offers me unique opportunities to work organized, efficiently and securely. This is all thanks to the great team behind the best in the world. :vivaldi_red:

In addition to all the profit-orientated tech giants, it is invaluable to have good alternatives that protect the privacy of their users. 🛡️

I would like to thank the entire VIVALDI for their fantastic work over the last 10 years. You guys make the difference! :tony_wee:

@Vivaldi Congratulations on this great and memorable . 🥳🎈🥂🍾🎉

I've been using since the first technical preview and I can't imagine working without it, both privately and professionally.

VIVALDI offers me unique opportunities to work organized, efficiently and securely. This is all thanks to the great team behind the best in the world. :vivaldi_red:

In addition to all the profit-orientated tech giants, it is invaluable to have good alternatives that protect the privacy of their users. 🛡️

I would like to thank the entire VIVALDI for their fantastic work over the last 10 years. You guys make the difference! :tony_wee:

@metin@graphics.social

If you know people who don't really dare to leave Xitter, you can suggest @cyd. This is nin free and open source software and thus the tool for freedom.

Please don't just blame people, but help them and show them how to achieve personal freedom. The eXit tool is now free to use and no longer an obstacle.

🐦 cyd.social

cyd.social

Cyd - Claw back your data from Big Tech

Automatically delete your data from tech platforms, except for what you want to keep

@dillo@fosstodon.org

"The median page weight for a desktop page, as measured in October 2024 is 2,652 KB", we could fit two releases there!

almanac.httparchive.org/en/202

Amazing yearly report on the state of the by the HTTP Archive, check it out:

almanac.httparchive.org/en/202

Plot titled "Median page weight over time" showing the time in the horizontal axis from 2012 to 2024. There are two lines, on for mobile and one for desktop. They grow almost linearly from less than 500 KiB in 2012 to more than 2.5 MiB in 2024.
ALT text

Plot titled "Median page weight over time" showing the time in the horizontal axis from 2012 to 2024. There are two lines, on for mobile and one for desktop. They grow almost linearly from less than 500 KiB in 2012 to more than 2.5 MiB in 2024.

@dillo@fosstodon.org

"The median page weight for a desktop page, as measured in October 2024 is 2,652 KB", we could fit two releases there!

almanac.httparchive.org/en/202

Amazing yearly report on the state of the by the HTTP Archive, check it out:

almanac.httparchive.org/en/202

Plot titled "Median page weight over time" showing the time in the horizontal axis from 2012 to 2024. There are two lines, on for mobile and one for desktop. They grow almost linearly from less than 500 KiB in 2012 to more than 2.5 MiB in 2024.
ALT text

Plot titled "Median page weight over time" showing the time in the horizontal axis from 2012 to 2024. There are two lines, on for mobile and one for desktop. They grow almost linearly from less than 500 KiB in 2012 to more than 2.5 MiB in 2024.

🧵 …surprise, surprise, propaganda is going on and I mean that I am right about the EU.

«EU says Bluesky is violating information disclosure rules:
Bluesky, the rapidly growing social media platform, is violating EU regulations by failing to disclose important details, a European Commission spokesperson told reporters during a daily briefing on Monday.»

🤷 neuters.de/technology/eu-says-

neuters.de

Cerberus Challenge

@aral@mastodon.ar.al · Reply to Aral Balkan

Adding more beautiful error messages to Kitten. These should help make it easier to recover from common errors while authoring.

kitten.small-web.org

Screenshot of Kitten error page with cute illustration of a grey kitten with pink ears and nose playing with a purple ball of yarn followed by the error message:

500
Error: Attempt to instantiate kitten.Component in markup without calling its connectedTo() static factory method:
In your kitten.html``, replace:

<{Uptime} />

With:

<{Uptime.connectedTo(this)} />

Finally, there’s a partial view of a stack trace that scrolls off the page.
ALT text

Screenshot of Kitten error page with cute illustration of a grey kitten with pink ears and nose playing with a purple ball of yarn followed by the error message: 500 Error: Attempt to instantiate kitten.Component in markup without calling its connectedTo() static factory method: In your kitten.html``, replace: <{Uptime} /> With: <{Uptime.connectedTo(this)} /> Finally, there’s a partial view of a stack trace that scrolls off the page.

@aral@mastodon.ar.al · Reply to Aral Balkan

So last night, while recording the preview of Kitten’s¹ improved component model², I made a silly mistake (copying raw HTML into a JavaScript function instead of wrapping it in a kitten.html`` tagged template, easy to do when you’re refactoring to pull out components from pages).

Then, once I figured out what I’d done, I made another one by forgetting to return the value from the function (easy to do when you’re used to using one-line closures as render functions).

I would have caught both of those so much faster if Kitten had helpful error messages for those two pitfalls. And guess what, this morning, it does :)

Attached are screenshot showing the before and after error messages.

Enjoy!

:kitten:💕

¹ kitten.small-web.org
² Scroll up the thread to watch the video.

Screenshot of first error message (before):

500 TypeError: Cannot read properties of undefined (reading 'match')
ALT text

Screenshot of first error message (before): 500 TypeError: Cannot read properties of undefined (reading 'match')

Screenshot of first error message (after):

Error: Render function did not return kitten.html``

class Count extends kitten.Component {
  html {
    kitten.html`<h1 morph>${kitten.db.counter.count}</h1>`
  }
  onIncrement {
    kitten.db.counter.count++
    this.update
  }
}
ALT text

Screenshot of first error message (after): Error: Render function did not return kitten.html`` class Count extends kitten.Component { html { kitten.html`<h1 morph>${kitten.db.counter.count}</h1>` } onIncrement { kitten.db.counter.count++ this.update } }

Screenshot of second error message (before):

500 SyntaxError: Unexpected token '<
ALT text

Screenshot of second error message (before): 500 SyntaxError: Unexpected token '<

Screenshot of second error message (after):

500  SyntaxError: Unexpected token '<

(Did you put raw HTML inside a function by mistake instead of wrapping it in a kitten.html`` tagged template?)
ALT text

Screenshot of second error message (after): 500 SyntaxError: Unexpected token '< (Did you put raw HTML inside a function by mistake instead of wrapping it in a kitten.html`` tagged template?)

@mapache@hachyderm.io
@mapache@hachyderm.io
@mapache@hachyderm.io
@mapache@hachyderm.io
@julien-falgas@julien.falgas.fr

X, Facebook et Instagram menacent nos écosystèmes d’information : quelles alternatives ?

Cet article est paru le 20 janvier 2025 sur The Conversation France.
L’illustration choisie ici est un extrait de la BD de science-fiction Mediaentity, par Simon & Emilie (CC by-nc-sa)

Alors que Donald Trump, allié d’Elon Musk, le propriétaire du réseau X (ex-Twitter), s’installe à la Maison Blanche, l’inquiétude grandit concernant l’impact des grandes plates-formes américaines sur les dizaines de millions d’utilisateurs qui s’informent par leur intermédiaire. De nombreuses voix appellent à quitter ces plates-formes, mais quelles sont les alternatives ?


L’Observatoire international sur l’information et la démocratie, pensé comme un « GIEC » de notre écosystème informationnel, a publié son tout premier rapport, ce 15 janvier. Ce rapport intervient alors que l’état de notre écosystème d’information et de communication semble s’effondrer sous nos yeux.

En France l’année 2024 aura été marquée par les acquisitions de médias par des milliardaires. Aux USA, l’homme le plus riche du monde) a engagé sa plate-forme X (ex-Twitter) au profit de la campagne de Donald Trump. Elon Musk en était déjà le premier donateur.

Si rester sur X n’est plus une option, difficile de se résoudre à perdre des années de publications et de constitution d’une audience. Qu’à cela ne tienne : développée en partenariat avec le CNRS, la plate-forme HelloQuitX fournit tout le nécessaire pour migrer vers Mastodon ou Bluesky. Incarné dans les médias par le directeur de recherche David Chavalarias, le collectif apolitique et transpartisan a fixé la date de l’exode au 20 janvier 2025, date de l’investiture du nouveau président des États-Unis.

Reste un impensé de taille : est-il bien raisonnable de perpétuer une forme de communication modelée pour capter notre attention ?

À l’heure où Mark Zuckerberg emboîte le pas à Elon Musk pour aligner ses propres plates-formes (Facebook, Instagram, WhatsApp) avec les intérêts de l’administration Trump, il est crucial de reconnaître que les grands réseaux sociaux américains ne peuvent continuer de jouer le rôle d’infrastructures de nos communications. Surtout, la prise de contrôle de ces médias au profit de politiques réactionnaires vient révéler au grand jour leur pouvoir de nuisance, documenté de longue date par la recherche.

Dès lors, pouvons-nous nous contenter de remplacer des réseaux devenus infréquentables, par d’autres qui en reproduisent les fonctionnalités ?

L’oiseau Twitter cache la forêt des réseaux sociaux toxiques

Né de l’hybridation du blog et de la messagerie instantanée, le microblogage consiste à publier de courts messages par le biais d’une plate-forme qui assure leur diffusion en temps réel et leur archivage. À l’image des dépêches de presse, les publications sont agrégées sous forme de flux destinés à une consultation continue. C’est le format retenu par l’ensemble des grands réseaux sociaux contemporains.

En quelques années seulement, le « tweet » est devenu un rouage incontournable de la circulation de notre information. Alors que les politiques ont saisi la possibilité de s’exprimer en direct, les journalistes y ont trouvé une source familière d’informations en accès immédiat. Les uns comme les autres en sont devenus dépendants. À tel point que l’acquisition de Twitter par Elon Musk a révélé le cruel dilemme de journalistes tentés de partir mais bien en peine de sauter le pas. Quant aux politiques devenus dépendants de ce substitut aux communiqués de presse, ils semblent rechigner à montrer l’exemple.

Motivé par des enjeux de visibilité et de performance (nombre de followers, de republications et autres « engagements » mesurables), le microbloging incite à publier plusieurs fois par jour, pousse à jouer sur les émotions, entrave l’exposition d’analyses complexes et favorise le « clash ». Véritable technologie au service des « petites phrases », par ses contraintes Twitter aura renouvelé le discours politique d’une bien triste manière. Comme le résumait Romain Badouard, dès 2017:

« La forme l’emporte définitivement sur le fond et les spécificités techniques de la plate-forme ont fait naître un environnement d’échange à la fois simpliste, conflictuel et moralisateur. »

Rejoindre HelloQuitteX en 3 minutes pour migrer de X vers Mastodon ou Bluesky.

La plate-forme alternative Bluesky a beau donner le sentiment de renouer avec le Twitter des origines, elle n’en porte pas moins l’ADN, tant dans sa forme fonctionnelle que dans son financement. Plus vertueux, le réseau social open source Mastodon s’appuie sur l’infrastructure distribuée du Fediverse qui le met à l’abri des obligations de croissance exponentielle propres aux start-up à l’américaine telles que Bluesky. Pourtant sur le plan fonctionnel, Mastodon demeure un service de microbloging inspiré du modèle de feu-Twitter.

Les sept plaies des réseaux sociaux traditionnels

Qu’il s’agisse de Twitter, Facebook ou Google, tout un pan de la recherche en sciences de l’information a démontré que le développement des grandes plates-formes du numérique a détérioré notre écosystème informationnel. Le problème peut se traduire en 7 plaies (cf. infographie ci-dessous) qui s’articulent dans un véritable cercle vicieux. Celui-ci découle d’intérêts économiques évidents en matière de publicités à haute fréquence, mais aussi d’enjeux d’influence comme en attestent les récents développements politiques aux USA.

Avant l’avènement des grands réseaux sociaux, c’est la domination de Google qui a marqué durablement le web. Pour qu’une page soit bien référencée, le fait d’être reliée à beaucoup d’autres pages web est devenu plus important que la qualité et à l’originalité de son contenu (valorisation du lien hypertexte). Il est désormais plus rentable de produire une information dupliquée et non vérifiée qu’une information originale. Voilà pourquoi nous sommes noyés par des informations de piètre qualité (infobésité), parmi lesquelles nous avons grand peine à distinguer le vrai du faux (fake news). Les algorithmes de recommandation plébiscitent les contenus les plus sensationnels et les moins qualitatifs, tandis que la presse n’a plus les moyens d’investir dans la production d’une information originale et de qualité (défiance envers les médias). Notre entourage apparaît plus digne de confiance tandis que les réseaux sociaux amplifient cette tendance à s’informer auprès de personnes qui nous ressemblent (bulles de filtre). De plus en plus éloigné des points de vue différents, nous avons tendance à radicaliser nos positions et nos propos. Nos positions exacerbées deviennent inconciliables (brutalisation). Enfin, afin de maximiser les affichages publicitaires, les interfaces des plates-formes ont été peaufinées au fil des années pour capter et retenir l’attention. Ces pratiques entretiennent l’ensemble des six autres plaies pour constituer la septième (addiction).

Régénérer notre écosystème informationnel

Les plates-formes numériques n’auraient pas la forme que nous leur connaissons si elles n’étaient pas guidées par une course à la croissance exponentielle, la volonté de capturer notre attention et celle d’influencer nos comportements. Ce constat devrait nous décourager de compter sur d’hypothétiques géants européens du numérique inspirés par le modèle des géants américains : tout comme nos avions Airbus nuisent autant au climat que ceux de Boing, des « alternatives à » Twitter et Facebook ne sauveront pas l’écosystème informationnel.

Le 13 janvier 2025, l’équipe de Mastodon a annoncé la décision de confier l’avenir de la plate-forme à une organisation à but non lucratif de droit européen. Pour son fondateur, Eugen Rochko, la start-up n’a jamais été qu’un véhicule temporaire à son projet, étant donné que l’espace public doit nous appartenir à toutes et tous. De fait, comme toute autre innovation sociale, l’émergence d’alternatives dans le domaine du numérique exigerait un environnement plus favorable aux structures de l’économie sociale et solidaire (coopératives, mutuelles, associations, fondations et entrepreneurs sociaux).

Mais les garanties éthiques ne suffisent pas : encore faut-il imaginer d’autres formes de médiation que celles instaurées par les plates-formes dominantes. Alors que la recherche académique en sciences humaines et sociales recèle des gisements d’innovation, nous n’avons pas les dotations nécessaires pour développer des logiciels et surtout pour les maintenir et les faire évoluer sur le long terme. Contraint très tôt de « sortir du labo », les projets sont poussés à déboucher sur une création d’entreprise avec une logique de rentabilité. Si j’en crois mon expérience fondée sur la création de Needle (une plate-forme de partage et de découverte fondée sur l’intelligence collective), nos incubateurs et l’ensemble du dispositif de valorisation de la recherche manquent d’outils pour accompagner des innovations sociales et la création de sociétés coopératives.

La prise en compte de notre empreinte numérique est balbutiante. Nous sommes loin de disposer de médias numériques de service public financés par un impôt sur les revenus de la publicité en ligne, tels que le proposait le chercheur Ethan Zuckermann en 2020. Pourtant, nous avons toutes et tous une responsabilité dans la réinvention du web et pour explorer d’autres formes de découverte et de partage de l’information peut-être moins clinquantes, mais sans doute plus vertueuses.

Julien Falgas, Maître de conférences au Centre de recherche sur les médiations, Université de Lorraine

Cet article est republié à partir de The Conversation sous licence Creative Commons. Lire l’article original.

Trois personnes et un chien contemplent le lever de soleil derrière les montagnes, depuis les hauteurs devant un mas provençal bordé d'un olivier. Au premier plan, l'avant d'une camionnette blanche. L'un des protagonistes, mains sur les hanches, dit aux autres : «Vous verrez, c'est dur au début, mais ça vaut le coup. »
ALT text

Trois personnes et un chien contemplent le lever de soleil derrière les montagnes, depuis les hauteurs devant un mas provençal bordé d'un olivier. Au premier plan, l'avant d'une camionnette blanche. L'un des protagonistes, mains sur les hanches, dit aux autres : «Vous verrez, c'est dur au début, mais ça vaut le coup. »

@anatudor@mastodon.social

I made a thing: scroll-driven, almost pure infinite circular gallery rotation - check it out on @codepen
codepen.io/thebabydino/pen/XJr

Using scroll-driven animations and the tiniest bit of JS for the infinity part of it.

Made with 🖤 for this week's .

cc @bramus

Infinite scroll circular gallery.
ALT text

Infinite scroll circular gallery.

@anatudor@mastodon.social

I made a thing: scroll-driven, almost pure infinite circular gallery rotation - check it out on @codepen
codepen.io/thebabydino/pen/XJr

Using scroll-driven animations and the tiniest bit of JS for the infinity part of it.

Made with 🖤 for this week's .

cc @bramus

Infinite scroll circular gallery.
ALT text

Infinite scroll circular gallery.

@aral@mastodon.ar.al

Pretty soon, you’re going to be able to view your live pages and the events on them in real time while developing Kitten apps.

The improved component model with support for class-based routes (and a server-side component hiearchy that lets you build well-encapsulated components and pages and work in an event-driven way) is coming along nicely and I’m back to writing Place¹ using it.

(In the GIF, you’re looking at Place’s profile settings page. Not shown here but those profile changes reflect in realtime on all open pages. The highlighted piece of code is what streams the event details to the browser.)

¹ codeberg.org/place/app

Screen recording of two web browser windows, side by side. The one on the right is showing Kitten’s Settings page at state: pages. I open the detail veiw for the /settings/profile route and see its ID, session id, number of connected sockets (1) and an empty Events table with name and data.

On the left, an instance of the /settings/profile route is open in the browser. I change the value of the Name field (erasing the t and s from Aral’s 1st) and I see two events pop up on the page on the right (Name: name, Data: { name: 'Aral’s 1s'}) and  (Name: name, Data: { name: 'Aral’s 1'}). Then I add the deleted letters back and see the event (Name: name, Data: { name: 'Aral’s 1st'}). Finally, I toggle the Show name? and Show Image? checkboxes on and off and see the events (name: howOrHide, { showOrHide: 'on', item: 'Image' }), (name: showOrHide, { item: 'Image' }, showOrHide	{ showOrHide: 'on', item: 'Name' })
ALT text

Screen recording of two web browser windows, side by side. The one on the right is showing Kitten’s Settings page at state: pages. I open the detail veiw for the /settings/profile route and see its ID, session id, number of connected sockets (1) and an empty Events table with name and data. On the left, an instance of the /settings/profile route is open in the browser. I change the value of the Name field (erasing the t and s from Aral’s 1st) and I see two events pop up on the page on the right (Name: name, Data: { name: 'Aral’s 1s'}) and (Name: name, Data: { name: 'Aral’s 1'}). Then I add the deleted letters back and see the event (Name: name, Data: { name: 'Aral’s 1st'}). Finally, I toggle the Show name? and Show Image? checkboxes on and off and see the events (name: howOrHide, { showOrHide: 'on', item: 'Image' }), (name: showOrHide, { item: 'Image' }, showOrHide { showOrHide: 'on', item: 'Name' })

Screenshot of code. The showPageEvent method is highlighted.

  onAddToPage () {
    this.addEventHandler(kitten.events, `kittenPageEvent-${this._page.id}`, this.showPageEvent)
  }

  /**
    Stream new page event details to top of the events list,
    hiding the placeholder if necessary.

    @param {{
      name: string,
      data: {HEADERS: any}
    }} event
  */
  showPageEvent (event) {
    delete event.data.HEADERS

    // Hide placeholder if necessary.
    if (this.placeHolderIsVisible) {
      this.page.send(kitten.html`
        <tr id='placeholder-${this.id}' swap-target='delete'>
      `)
      this.placeHolderIsVisible = false
    }

    // Send the new event row with event details.
    this.page.send(kitten.html`
      <tbody id=${this.id} swap-target='afterend:#${this.id}'>
        <tr>
          <td>${event.name}</td>
          <td>${util.inspect(event.data)}</td>
        </tr>
      </tbody>
    `)
  }
}

class Pages extends kitten.Component {
  html() {
    // We could just display a “loading” message here
    // as we’re going to refresh the list at onConnect(),
    // but given how fast it all happens, we might was well
    // send the whole list instead of having an odd flash.
    const pages = Object.values(kitten.pages)
ALT text

Screenshot of code. The showPageEvent method is highlighted. onAddToPage () { this.addEventHandler(kitten.events, `kittenPageEvent-${this._page.id}`, this.showPageEvent) } /** Stream new page event details to top of the events list, hiding the placeholder if necessary. @param {{ name: string, data: {HEADERS: any} }} event */ showPageEvent (event) { delete event.data.HEADERS // Hide placeholder if necessary. if (this.placeHolderIsVisible) { this.page.send(kitten.html` <tr id='placeholder-${this.id}' swap-target='delete'> `) this.placeHolderIsVisible = false } // Send the new event row with event details. this.page.send(kitten.html` <tbody id=${this.id} swap-target='afterend:#${this.id}'> <tr> <td>${event.name}</td> <td>${util.inspect(event.data)}</td> </tr> </tbody> `) } } class Pages extends kitten.Component { html() { // We could just display a “loading” message here // as we’re going to refresh the list at onConnect(), // but given how fast it all happens, we might was well // send the whole list instead of having an odd flash. const pages = Object.values(kitten.pages)

@haroha@gruene.social

@matuzo seriously, thank you for your cookbook!

We're currently fixing accessibility on our site (medium sized web shop) and nearly *every* page in your book hits a topic right before our eyes!

And it's clearly written and does not over explain things. It's just on point.

Never had such a strong recommendation for a book for

@jakobmiksch@mastodon.social · Reply to Ilya Zverev

@zverik @mvexel @ianthetechie looks good in general, I am also a bit worried that it will be abandoned one day by Google. Also there are less programmers around than programmers.

since I do a lot of development seems to be make a bit more sense to me, even though I am more into

what I understand from your comments is that support for seems to be better compared to That is a good insight

PrivTracker - Private BitTorrent tracker for everyone

PrivTracker allows to share torrent files just with your friends, nobody else. Unlike public trackers, it shares peers only within a group which is using the same Announce URL. It really works like a private tracker, but can be generated with one click of a button.

🤝 privtracker.com

privtracker.com

PrivTracker - Private BitTorrent tracker for everyone

@daieuxetdailleurs@framapiaf.org

[Nouveau billet] In RSS :rss: we trust* - Patrimoine et numérique

➡️ patrimoine-et-numerique.fr/tut

De l'utilité des flux RSS pour s'informer comme internaute / professionnel, et de la nécessité d'en fournir pour les sites Internet

*established since 2002

poke @agnes_vbb @BruantC

avec dedans un poil de chez @zaclys et un pouet qui tombe à pic de @thibault_lh

Icône carré avec le signe représentant un flux RSS (radar émetteur blanc sur fond orange) vu de 3/4, donnant une impression de perspective, avec un effet de reflet
ALT text

Icône carré avec le signe représentant un flux RSS (radar émetteur blanc sur fond orange) vu de 3/4, donnant une impression de perspective, avec un effet de reflet

@anatudor@mastodon.social

Pure 1 div halftone-masked background card codepen.io/thebabydino/pen/GRN on @codepen.

Made this 4 years ago - can you guess how before checking the code?

Doesn't work in Firefox due to an old bug 🪲 not even related to the halftone mask, but caused by the duo text on the right.

card with halftone mask on image on the left and duo text on the right (two lines of text, top one white, bottom one reddish)
ALT text

card with halftone mask on image on the left and duo text on the right (two lines of text, top one white, bottom one reddish)

@anatudor@mastodon.social

Pure 1 div halftone-masked background card codepen.io/thebabydino/pen/GRN on @codepen.

Made this 4 years ago - can you guess how before checking the code?

Doesn't work in Firefox due to an old bug 🪲 not even related to the halftone mask, but caused by the duo text on the right.

card with halftone mask on image on the left and duo text on the right (two lines of text, top one white, bottom one reddish)
ALT text

card with halftone mask on image on the left and duo text on the right (two lines of text, top one white, bottom one reddish)

@qiita@rss-mstdn.studiofreesia.com
@offline@autonomous.zone

★ 24.01. + 25.01 11:00 - 18:00 ~ Post-Platform Digital Publishing Toolkit

Declarations is an ongoing artistic research project into the visual, poetic & linguistic materiality of the CSS web-standard and its echoes on design and artistic practices. In this workshop, we inspect online platform and question our agency as individuals and collectivities on the through story telling, commenting, critiquing, degrading, improving, transforming websites into a poetic medium.

@offline@autonomous.zone

★ 24.01. + 25.01 11:00 - 18:00 ~ Post-Platform Digital Publishing Toolkit

Declarations is an ongoing artistic research project into the visual, poetic & linguistic materiality of the CSS web-standard and its echoes on design and artistic practices. In this workshop, we inspect online platform and question our agency as individuals and collectivities on the through story telling, commenting, critiquing, degrading, improving, transforming websites into a poetic medium.

«GraphQL-Grundlagen-Tutorial:
GraphQL ist für viele Devs die erste Wahl, um effiziente, zukunftsfähige APIs zu entwickeln. So gelingen die ersten Schritte mit dem Open-Source-Tool.»

Nutzt dies wer im allgemeinen für Web-Produkte, sprich entwickelt damit Web-Apps die allgemein und nicht nur speziefisch nutzbar sind oder bestehen weiter viele auf REST API's? Ich entwickelte damit noch nie was.

🧑‍💻 computerwoche.de/article/28352

computerwoche.de

GraphQL-Grundlagen-Tutorial

GraphQL ist für viele Devs die erste Wahl, um effiziente, zukunftsfähige APIs zu entwickeln. So gelingen die ersten Schritte mit dem Open-Source-Tool.

@qiita@rss-mstdn.studiofreesia.com
@yeokbo@uri.life · Reply to 역보

리눅스 정보 찾아본다고 유튜브 좀 깔짝 거렸더니, 나처럼 옛날 컴퓨터('감자 컴'이라고 부른다)에 리눅스 깔아서 계속 쓰려는 사람들은 '요즘 인터넷은 너무 화려하게 만들어서 무겁고 느리다'며 불평하는 게 눈에 많이 들어왔다. 사실 넷북에 Puppy Linux든 Lubuntu든 돌려봤을 때 인터넷이 가장 문제였다.

넷북으로 간단한 노트 테이킹이나 초고·초안 쓰기 정도만 하려고 했지만, 뭐가 안 된다 싶으면 인터넷을 쓰기는 해야하니까.

그런 환경에서도 인터넷 접속과 정보 공유를 하려면 군더더기를 정말 많이 빼야겠다 싶었다.

@Luke@typo.social

Show the author of your blog post in the link preview using Open Graph tags in the `<head>` section.
You can use the `og:article:author` and `fediverse:creator` tags for the author’s profile:

`<meta property="article:author" content="https:// typo.social/@Luke">`

Edit also add:
`<meta name="fediverse:creator" content="@Luke">`

Edit 2:
Also define the domains to your profile to confirm verified attribution (see screenshot):

blog.joinmastodon.org/2024/07/

Go to your account in your instance in a browser and visit:

/settings/verifications

and if you have at least Mastodon v4.3

Add your attribution code to your site and verify which domains it should show on.
ALT text

Go to your account in your instance in a browser and visit: /settings/verifications and if you have at least Mastodon v4.3 Add your attribution code to your site and verify which domains it should show on.

@D_cence@mastodon.top

laissez tomber les dernières versions de Chrome... dans 8 semaines le navigateur de Google commencera à surveiller tous vos appareils

d'un côté ils font croire qu'ils veulent éliminer les cookies tiers mais en réalité pour faire eux-même le travail de façon encore plus invasive (et en rendant les publicitaires dépendant de Google)

des dominants pervers
la finance, quoi
forbes.com/sites/zakdoffman/20

@pragprog@techhub.social

Celebrate the number 10 bestseller of 2024, Server-Driven Web Apps with htmx by R. Mark Volkmann. Save 50% today on this title with code mvhtmx2024. (no minimum cart value)

Also, save 40% throughout the countdown on all the titles we publish with code topten2024 (min cart $50)

Details in the article: medium.com/@pragprog/3886d1cdf
-development

Book cover featuring bison at waters edge with frozen tundra background
ALT text

Book cover featuring bison at waters edge with frozen tundra background

@darkghosthunter@mastodon.social

When I have some time to kill, I'll make a Desktop Environment Framework using with and .

In my mind: apps would work seamlessly between desktop environment, no matter the flavor.

The idea: Apps are processes, Desktop Bus ties Window to App, multiple Desktops (screens).

@strypey@mastodon.nzoss.nz

BlueSky is to the ATmosphere what Goggle is to the modern web. Discuss.

Keen to read arguments both for and against, including within the same post. Reasoned arguments I disagree with get more points than knee-jerk hot takes I agree with. Go!

🧵 …I am not surprised by this from China.

«As Bluesky takes flight, China has got a Twitter problem:
[…] For Chinese state media, the rise couldn’t have come at a worse time. They have sunk considerable resources into Twitter, via unlabeled state-sponsored influencers, huge bot networks, the famous 50 cent army, offline police harassment of users, and cultivating the platform’s owner Elon Musk»

🦋 toosimple.substack.com/p/blues

toosimple.substack.com

As Bluesky takes flight, China has got a Twitter problem

For years, state media have been seeking to grab the microphone. Now Musk has handed them it.. no one is listening?

@nibushibu@vivaldi.net · Reply to GENKI

アクセスビリティーとかも

> 必要な人が能動的に必要な情報にアクセスできる

という の特性を活かすための発想で存在している概念だと思うので、宣伝とか広告的な観点で「アクセシビリティーをやる意味は」みたいな話になったりすると、もともとのところからバグってしまっている感じがする

@nilesh@fosstodon.org

Annoying that I have to run 3 full copies of as separate apps.

1) Firefox itself
2)
3) Zen browser whose split view is useful for social media.

The platform and browsing app have been too strongly coupled. Need FirefoxOS / ChromiumOS purely as a platform for app developers.

🧵 …in addition to the above, in my opinion a very good explanation of why BlueSky is not anything and not decentralized and the Fediverse is this very much:

«How decentralized is Bluesky really?»
– from @cwebber

🦋 dustycloud.org/blog/how-decent

dustycloud.org

How decentralized is Bluesky really? -- Dustycloud Brainstorms

🧵 …now across from Thems at the top of this toot row: OK, this explains why I have some new followers (welcome to the Fediverse) and also why my pinned toot has been shared so many times.

«Mastodon sees a boost from the ‘X exodus,’ too, founder says»

:mastodon: techcrunch.com/2024/11/18/mast

techcrunch.com

Mastodon sees a boost from the 'X exodus,' too, founder says | TechCrunch

Decentralized social network Mastodon is also seeing some uplift from the X "exodus," founder Eugen Rochko shared on the platform just ahead of the

🧵 …this does not come unexpectedly and the surveillance state deliberately makes the rich richer and the poor poorer.

«The WIRED Guide to Protecting Yourself From Government Surveillance:
Donald Trump has vowed to deport millions and jail his enemies. To carry out that agenda, his administration will exploit America’s digital surveillance machine. Here are some steps you can take to evade it.»

🛡️ wired.com/story/the-wired-guid

wired.com

The WIRED Guide to Protecting Yourself From Government Surveillance

Donald Trump has vowed to deport millions and jail his enemies. To carry out that agenda, his administration will exploit America’s digital surveillance machine. Here are some steps you can take to evade it.

@jon@vivaldi.net

The first software I built was Fm2HTML, that took FrameMaker documents and converted them to HTML. This is the early days of the Web.

The conversion was for multi-file documents, which included links, images, tables, indexes and more. The structure of the original document was preserved, as was a lot of the formatting.

FrameMaker was widely used in the research community at the time. It was a very powerful tool for writing books and longer documents.

w3.org/Tools/fm2html.html

@jon@vivaldi.net

Hello. This is my .

I have been working with Web technologies since 1992. I have co-founded two browser companies, Opera Software and Vivaldi Technologies. I was CEO at Opera and I am CEO at Vivaldi.

I am a strong proponent of open standards. I believe in building feature rich products that can be adapted to the needs of users without collecting information about usage. I believe no company has the right to profile their users.

@anatudor@mastodon.social

Capture node screenshot in Chrome DevTools is such a time saver. Especially when creating screenshots for an article.

No more dragging handles back and forth forever because you can never get it right and you're always still off by a pixel or two.

Right click node & find it in dropdown.

Screenshot of Chrome DevTools after right clicking a node. In the menu that pops up, "Capture node screenshot" is highlighted.
ALT text

Screenshot of Chrome DevTools after right clicking a node. In the menu that pops up, "Capture node screenshot" is highlighted.

@tommi@pan.rent

We are celebrating by hosting Knitting Our Internet workshop at today (Seminar 2, 10:40).

Not only on this occasion, I always dedicate the whole workshop to the inspiring, bright, loving human being was.

Thank you for still making us pursue a better , and a better world, Aaron.

(The event is free, no reservation required. It’s not going to be streamed, but its video recording will be published.)

@AaronSwartzDay

@aral@mastodon.ar.al

Really enjoying adding end-to-end tests to Kitten¹ using Playwright² and my own little Kitten controller class for starting/stopping/otherwise interacting with the Kitten server.

Just wrote some that comprehensively test identity creation and authentication for Small Web places:

codeberg.org/kitten/app/src/br

Lots more to write but I think I’ve found a good flow :)

:kitten:💕

¹ kitten.small-web.org
² playwright.dev

@anatudor@mastodon.social

👀

Btw, these circling radial gradients on the HTML element use CSS trigonometric functions mastodon.social/@anatudor/1133

From the comments on CSS trigonometric functions:

Actually exploratively used it once to test now famous "convert any value to scalar" tan(atan2()) by Jane Ori. I guess I'll leave this brainy stuff to Ana Tudor.
ALT text

From the comments on CSS trigonometric functions: Actually exploratively used it once to test now famous "convert any value to scalar" tan(atan2()) by Jane Ori. I guess I'll leave this brainy stuff to Ana Tudor.

@anatudor@mastodon.social

One complaint I've seen here a bunch of times with `prefers-color-scheme` was about duplicating styles.

You don't have to do that when you switch by toggling a single `--dark` variable!

(from State of CSS results 2024.stateofcss.com/)

From the comments on `prefers-color-scheme`:

* Not entirely related to this, but it would be amazing if we could target `prefers-color-scheme` along with user selected preferences, i.e. [data-theme=dark], in a single ruleset

* Wish I could combo this with the inevitable user-control hook as well though. Some kind of hybrid @media and regular selector, so you don't have to repeat everything within both an @media clause and then again with some kind of global selector e.g. body[data-theme="dark"]

* I really wish there was a way to use "dark mode" detection outside of a media query. I constantly want to treat "user selected dark mode" on my website the same as "auto theme + system dark mode", but I have to duplicate styles with the way CSS works right now! It's a huge bummer.
ALT text

From the comments on `prefers-color-scheme`: * Not entirely related to this, but it would be amazing if we could target `prefers-color-scheme` along with user selected preferences, i.e. [data-theme=dark], in a single ruleset * Wish I could combo this with the inevitable user-control hook as well though. Some kind of hybrid @media and regular selector, so you don't have to repeat everything within both an @media clause and then again with some kind of global selector e.g. body[data-theme="dark"] * I really wish there was a way to use "dark mode" detection outside of a media query. I constantly want to treat "user selected dark mode" on my website the same as "auto theme + system dark mode", but I have to duplicate styles with the way CSS works right now! It's a huge bummer.

/* ✅ DO (DRY) ✅ */
body {
	--dark: 0; /* 0 initially for light theme; 1 for dark theme */
	/* how much the dark version represents;
	 * 0% in light theme case, 100% in dark theme case */
	--perc: calc(var(--dark)*100%);
	background: color-mix(in hsl, $dark-back var(--perc), $light-back);
	color: color-mix(in hsl, $dark-text var(--perc), $light-text);
}

a { color: color-mix(in hsl, $dark-link var(--perc), $light-link) }

/* other styles */

/* switch to dark theme cases */
body:has([data-theme-option='dark'][aria-pressed='true']) { --dark: 1 }
@media (prefers-color-scheme: dark) { --dark: 1 }
ALT text

/* ✅ DO (DRY) ✅ */ body { --dark: 0; /* 0 initially for light theme; 1 for dark theme */ /* how much the dark version represents; * 0% in light theme case, 100% in dark theme case */ --perc: calc(var(--dark)*100%); background: color-mix(in hsl, $dark-back var(--perc), $light-back); color: color-mix(in hsl, $dark-text var(--perc), $light-text); } a { color: color-mix(in hsl, $dark-link var(--perc), $light-link) } /* other styles */ /* switch to dark theme cases */ body:has([data-theme-option='dark'][aria-pressed='true']) { --dark: 1 } @media (prefers-color-scheme: dark) { --dark: 1 }

@aral@mastodon.ar.al

Just added a code breakdown for the Draw Together¹ Kitten² app to my blog post with the tutorial video:

ar.al/2024/03/26/draw-together

Draw Together, in ~50 lines of code, is a real-time collaborative drawing tool on a 20×20 pixel grid where people can click to toggle the colour of each pixel.

(The full source and explanations fit the four screenshots on this post.)

¹ draw-together.small-web.org
² kitten.small-web.org

Screenshot of web page (detail, start of Source Code section) at URL https://ar.al/2024/03/26/draw-together/:

Source code
The code sets up a real-time collaborative drawing tool on a 20×20 pixel grid where people can click to toggle the colour of each pixel.

Here’s a breakdown of the entire source code, detailing what each section does:

Create 20×20 pixel grid
const rows = new Array(20).fill().map(row => new Array(20).fill(0))
const colours = ['white', 'black']
Creates a 20x20 grid initialized with zeros. Each cell will store an index corresponding to the colours array.

Validation function
const isValid = data => typeof data === 'object' && typeof data.rowIndex === 'number' && typeof data.columnIndex === 'number' && data.rowIndex >= 0 && data.rowIndex <= rows.length-1 && data.columnIndex >= 0 && data.columnIndex <= rows[0].length-1
Checks if the data object has valid rowIndex and columnIndex within grid bounds.

Handle connections and pixel updates
export function onConnect ({ page }) {
  page.on('pixel', data => {
    if (!isValid(data)) return
ALT text

Screenshot of web page (detail, start of Source Code section) at URL https://ar.al/2024/03/26/draw-together/: Source code The code sets up a real-time collaborative drawing tool on a 20×20 pixel grid where people can click to toggle the colour of each pixel. Here’s a breakdown of the entire source code, detailing what each section does: Create 20×20 pixel grid const rows = new Array(20).fill().map(row => new Array(20).fill(0)) const colours = ['white', 'black'] Creates a 20x20 grid initialized with zeros. Each cell will store an index corresponding to the colours array. Validation function const isValid = data => typeof data === 'object' && typeof data.rowIndex === 'number' && typeof data.columnIndex === 'number' && data.rowIndex >= 0 && data.rowIndex <= rows.length-1 && data.columnIndex >= 0 && data.columnIndex <= rows[0].length-1 Checks if the data object has valid rowIndex and columnIndex within grid bounds. Handle connections and pixel updates export function onConnect ({ page }) { page.on('pixel', data => { if (!isValid(data)) return

Screenshot of web page (detail, cont.):

rows[data.rowIndex][data.columnIndex]++
    if (rows[data.rowIndex][data.columnIndex] === colours.length) {
      rows[data.rowIndex][data.columnIndex] = 0
    }
    page.everyone.send(kitten.html`
      <${Pixel} rowIndex=${data.rowIndex} columnIndex=${data.columnIndex} pixelColourIndex=${rows[data.rowIndex][data.columnIndex]} />
    `)
  })
}
Listens for pixel updates, validates data, updates the grid, and sends the updated pixel state to everyone connected.

Pixel component
const Pixel = ({ rowIndex, columnIndex, pixelColourIndex }) => kitten.html`
  <button
    id='pixel-${rowIndex}-${columnIndex}'
    aria-label='pixel-${rowIndex}-${columnIndex}'
    name='pixel'
    style='
      background-color: ${colours[pixelColourIndex]};
      top: calc(5% * ${rowIndex});
      left: calc(5% * ${columnIndex});
    '
    connect
    data='{rowIndex: ${rowIndex}, columnIndex: ${columnIndex}}'
    morph
  ></button>
`
Defines a button element representing a pixel, styled according to
ALT text

Screenshot of web page (detail, cont.): rows[data.rowIndex][data.columnIndex]++ if (rows[data.rowIndex][data.columnIndex] === colours.length) { rows[data.rowIndex][data.columnIndex] = 0 } page.everyone.send(kitten.html` <${Pixel} rowIndex=${data.rowIndex} columnIndex=${data.columnIndex} pixelColourIndex=${rows[data.rowIndex][data.columnIndex]} /> `) }) } Listens for pixel updates, validates data, updates the grid, and sends the updated pixel state to everyone connected. Pixel component const Pixel = ({ rowIndex, columnIndex, pixelColourIndex }) => kitten.html` <button id='pixel-${rowIndex}-${columnIndex}' aria-label='pixel-${rowIndex}-${columnIndex}' name='pixel' style=' background-color: ${colours[pixelColourIndex]}; top: calc(5% * ${rowIndex}); left: calc(5% * ${columnIndex}); ' connect data='{rowIndex: ${rowIndex}, columnIndex: ${columnIndex}}' morph ></button> ` Defines a button element representing a pixel, styled according to

Screenshot of web page (detail, cont.):

its colour and position.

Canvas component
const Canvas = () => kitten.html`${
  rows.map((row, rowIndex) => row.map((pixelColourIndex, columnIndex) => kitten.html`
    <${Pixel} rowIndex=${rowIndex} columnIndex=${columnIndex} pixelColourIndex=${pixelColourIndex} />
  `))
}`
Renders the entire grid by mapping over each row and column, creating Pixel components.

Styles component
const Styles = () => kitten.css`
  [name='pixel'] {
    position: fixed;
    width: 5%;
    height: 5%;
    border: 0;
  }
`
Applies CSS styles to the pixel buttons to size and position them correctly.

Main export
export default () => kitten.html`
  <page title='Draw Together'>
ALT text

Screenshot of web page (detail, cont.): its colour and position. Canvas component const Canvas = () => kitten.html`${ rows.map((row, rowIndex) => row.map((pixelColourIndex, columnIndex) => kitten.html` <${Pixel} rowIndex=${rowIndex} columnIndex=${columnIndex} pixelColourIndex=${pixelColourIndex} /> `)) }` Renders the entire grid by mapping over each row and column, creating Pixel components. Styles component const Styles = () => kitten.css` [name='pixel'] { position: fixed; width: 5%; height: 5%; border: 0; } ` Applies CSS styles to the pixel buttons to size and position them correctly. Main export export default () => kitten.html` <page title='Draw Together'>

Screenshot of web page (detail, cont., last):

Main export
export default () => kitten.html`
  <page title='Draw Together'>
  <${Canvas} />
  <${Styles} />
`
Constructs the main page with the canvas and styles.

Like this? Fund us!
Small Technology Foundation is a tiny, independent not-for-profit.

We exist in part thanks to patronage by people like you. If you share our vision and want to support our work, please become a patron or donate to us today and help us continue to exist.

Aral Balkan
About the author
I’m an activist, designer, and developer. I’m one-half of Small Technology Foundation, a tiny and independent two-person not-for-profit based in Ireland. We advocate for and build small technology to protect personhood and democracy in the digital network age.

To support my work, become a patron of our foundation.

I’m available for public speaking and media inquiries.
ALT text

Screenshot of web page (detail, cont., last): Main export export default () => kitten.html` <page title='Draw Together'> <${Canvas} /> <${Styles} /> ` Constructs the main page with the canvas and styles. Like this? Fund us! Small Technology Foundation is a tiny, independent not-for-profit. We exist in part thanks to patronage by people like you. If you share our vision and want to support our work, please become a patron or donate to us today and help us continue to exist. Aral Balkan About the author I’m an activist, designer, and developer. I’m one-half of Small Technology Foundation, a tiny and independent two-person not-for-profit based in Ireland. We advocate for and build small technology to protect personhood and democracy in the digital network age. To support my work, become a patron of our foundation. I’m available for public speaking and media inquiries.

@anatudor@mastodon.social · Reply to Ana Tudor 🐯

The first one is this text effect that uses absolutely no images whatsoever save for gradients.

Some filter magic 🪄 is responsible for the background texture and also for the 3D look of the text and its grainy gradients.

codepen.io/thebabydino/pen/gON

The text "Dusty" in thick cursive. Each letter face has a top to bottom grainy gradient from lighter to darker blue. This has a discrete inner shadow and casts a shadow on top of its white outline. The whole thing is extruded, with the extrusion having a grainy mesh gradient. Top to bottom goes from gold to crimson, while also getting progressively darker as it goes further from letter face. The entire extruded assembly casts a diffuse shadow on top of a textured, top middle lighted, 3D striped bluish background.
ALT text

The text "Dusty" in thick cursive. Each letter face has a top to bottom grainy gradient from lighter to darker blue. This has a discrete inner shadow and casts a shadow on top of its white outline. The whole thing is extruded, with the extrusion having a grainy mesh gradient. Top to bottom goes from gold to crimson, while also getting progressively darker as it goes further from letter face. The entire extruded assembly casts a diffuse shadow on top of a textured, top middle lighted, 3D striped bluish background.

@anatudor@mastodon.social
Animated GIF. Shows a recording of going through the first few Trending pages on CodePen. These contain a bunch of my demos:

* No image dusty SVG filter effect
* No text duplication slice & offset (SVG filter magic 🪄)
* inputs with cutout
* Grainy slice! No JS, no text duplication! (contenteditable)
* Pure CSS text effect (no Firefox)
* Pure CSS 3D text stack
* Pure CSS vertical scroll, horizontal slide
* No text duplication blended layers
* Realistic grainy shadows with no image duplication
* No text duplication stroke shadow 🌊
* No matrix filter gooey effect
ALT text

Animated GIF. Shows a recording of going through the first few Trending pages on CodePen. These contain a bunch of my demos: * No image dusty SVG filter effect * No text duplication slice & offset (SVG filter magic 🪄) * inputs with cutout * Grainy slice! No JS, no text duplication! (contenteditable) * Pure CSS text effect (no Firefox) * Pure CSS 3D text stack * Pure CSS vertical scroll, horizontal slide * No text duplication blended layers * Realistic grainy shadows with no image duplication * No text duplication stroke shadow 🌊 * No matrix filter gooey effect

@metafilter@mefi.social

HTML for People

"I feel strongly that anyone should be able to make a website with HTML if they want": JHarris posted Blake Watson's great, free, web book with simple directions and a nice pile of resources for marking it up old-school.

metafilter.com/205847/HTML-For

screenshot from Blake Watson's 'HTML for People' book site: black computer screen with white text showing raw html with coding tags in purple
ALT text

screenshot from Blake Watson's 'HTML for People' book site: black computer screen with white text showing raw html with coding tags in purple

@cybertailor@wetdry.world

:neocat_laptop_owo: My feels lonely without users!

You can contact me to get a FREE ssh account + email. Just send you ssh pubkey and preferred username!

The server runs , and you can bootstrap a Gentoo Prefix to have more control over the software.

Additional services in the family available to YOU:

:blobcatoutage: Expected dowtime is at least one day a month. Don't use my services for anything serious.

@pears@fosstodon.org

We are PeARS, a friendly project dedicated to the development of a fully open source and decentralised .

How does it work? Every instance of PeARS can be considered a mini search engine for a single topic of interest, which is populated and curated by people like you. One beautiful day, when enough instances are alive, they will come together to provide a generalised Web search solution. Owned by you.

Interested? Come and help us! Say hello here or on GitHub.

@palemoon@outerheaven.club
Alllright, hello lunarians! We've moved instances again (4 hours has to be a world record for shortest stay in a #Mastodon before migrating :P), and hopefully this will be the final time we will do that. It would be a shame, because "Outer Heaven" does sorta fit more for a #browser named "Pale Moon"! ;)

So, with a permanent #fediverse home, here's the short #introduction again done two instances ago on what #PaleMoon is all about:

We are one of the first projects out there to have forked from #Firefox / #Mozilla. We've started as a humble rebuild aiming to bring an optimized Firefox, but we've soon evolved into a full-fledged fork (hard fork if you will) which kept what we believe were the good stuff that Mozilla axed and didn't deserve axing, like #XUL (which we believe is the most powerful language for extending a browser, up to its internals), #RSS, and <style scoped>, and kept out the ones that we believe were not good for our userbase (like Pocket, the LLM cruft, and if you're old enough, Australis!). We aim to keep evolving this mature platform in order to keep up with the latest feature additions to the web as we reasonably can (even though we believe they're becoming increasingly silly) while, if possible and necessary, adding up some of our own. All of that, as an independent effort supported primarily by nothing else but you: the users!

If you want to explore more about our history, roadmap, and what you can do with this browser, then please give our website below a visit! 🌕

https://www.palemoon.org/

#introductions #UXP #UnifiedXULPlatform #web #openweb #webbrowser #browsers

outerheaven.club

Akkoma

@abesamma@toolsforthought.social

There's this concept of adaptive hypermedia where hypermedia content is adapted according to a user model. In contrast to linear media, where all users are offered a standard series of hyperlinks, adaptive hypermedia (AH) tailors what the user is offered based on a model of the user's goals, preferences and knowledge, thus providing links or content most appropriate to the current user. LLMs can and is being of great help here.

@FediFollows@social.growyourown.services

Okay... it seems Sir Tim Berners-Lee, the creator of the World Wide Web, has just joined the Fediverse at:

➡️ @timbl

(For those wondering about verification, this is genuine as far as I can tell. The account is on the w3c server and they only allow manually verified signups, plus the verified account of the w3c is following him.)

Thank you to @vmstan for the headsup about this!

@madargon@is-a.cat

Created this after reading conversation in comments below some tech article somewhere. Someone mentioned "surfing the sewer" and I really liked that phrase.

Drawing of a cartoon style man, wearing silver protective suit with UBlock Origin logo on it, surfing in sewer with green toxic water. There are cookies and fanged monsters looking like Chrome logos floating around him. On the background wall there are red crosses, like for closing websites or errors. There are also industrial cameras, one yellow eye and graffiti with TikTok logo. On the railing on path's edge there is photo camera attached, looking similar to old Instagram logo, and rotting blue bird. There is big text "Google" near water, with both "o" replaced with ends of pipes and small texts around: crossed out "AI", "Buy this, only $2!" and below "scammer!" and "it's con". Above the picture there is description "Surfing The Internet Sewer".
ALT text

Drawing of a cartoon style man, wearing silver protective suit with UBlock Origin logo on it, surfing in sewer with green toxic water. There are cookies and fanged monsters looking like Chrome logos floating around him. On the background wall there are red crosses, like for closing websites or errors. There are also industrial cameras, one yellow eye and graffiti with TikTok logo. On the railing on path's edge there is photo camera attached, looking similar to old Instagram logo, and rotting blue bird. There is big text "Google" near water, with both "o" replaced with ends of pipes and small texts around: crossed out "AI", "Buy this, only $2!" and below "scammer!" and "it's con". Above the picture there is description "Surfing The Internet Sewer".

@trwnh@mastodon.social · Reply to infinite love ⴳ

the way extensibility works in a closed-world is that "every implementer talks to every other implementer". or maybe there is a central registry of extensions that everyone submits to their authority, as stewards of the "protocol" that is used to build the "network". this trades out the n:n relation between implementers and other implementers, for an n:1 relation between implementers and the central registry.

the way extensibility works in an open-world is you just do it.

11/?

@trwnh@mastodon.social · Reply to infinite love ⴳ

to build the as its own "social networking protocol" then seemingly requires that we instead go with the closed-world assumption, contrary to the

it requires ahead-of-time communication and coordination, where implementers need to be willing and available to talk to any other implementer, and this load grows with every new implementer.

it requires you to be aware of other extensions, present and future, because your extension might conflict with someone else's extension.

10/?

@trwnh@mastodon.social · Reply to infinite love ⴳ

this is the fundamental divide between thinking and thinking, where straddles the line between both.

i've seen it said that the "open-world assumption" at the foundation of the Web is actually an undesirable thing for a "social networking protocol", and as a consequence, specs built on that open-world assumption are "completely unsuitable" for that "protocol".

but do we need a "social networking protocol"? do we even need "social networks" in the first place?

9/?

@trwnh@mastodon.social · Reply to infinite love ⴳ

but before you build a "protocol" for a "network", consider: what even is a "network", in this context? and, here's the hot take: do you even *want* that kind of "network"? do you want a separate reified network?

because the answer that gives is actually a different one. There is no "AP network", because AP as a protocol is not enough to build a concrete network. it is intended to provide, and exists in context of, the larger .

8/?

@mapache@hachyderm.io

Part 3 of "A Guide to Implementing ActivityPub in a Static Site (or Any Website)" is just out the oven!

In this blog post, I explain how to make your blog discoverable in the Fediverse as an account, and also address some of the annoying pitfalls I encountered.

Full article here: maho.dev/2024/02/a-guide-to-im

If you like it don't forget to follow the @blog !

-sites -development -web

@techducks@social.tchncs.de

Worauf muss man denn im Jahr 2024 so achten, wenn man eine responsive Webseite bauen will?

Was ist denn da so Stand der Technik? CSS Grid? Kann man mittlerweile auch ohne View-Points?

Werft mir doch mal ein paar Begriffe an den Kopf, womit man sich beschäftigen muss.

Ach ... und bitte alles Pure. Keine Library und vor allem kein Javascript.

@eric@mastodon.limulus.net

Time to finally do an !

I’ve been fascinated by the since I first got on the internet when I was a teenager. The idea that anyone could create a website — how cool is that!?

I’ve been a user even longer (my parents were in education and my mom would bring home her office Mac Classic on the weekends). Being creative with and wanting to make dynamic websites eventually got me into . First with , later , and now and . I’ve also had some fun with , , and .

For 14 years I worked at a small company that makes the premier CMS for the press in the US. Now I work on web applications in in the far-more corporate world. I also used to co-organize TucsonJS and Tucson React meetups.

@andypiper@andypiper.co.uk
Today, I was reminded of the existence of the humans.txt proposal - for websites to describe who made them. With all the "AI" and other stuff happening online... maybe this is a good time to look at it again?

During my recent blogging revival I’ve already written about how I love the web1. I’ve also commented a couple of times about uses of AI and Large Language Models and the kinds of confusion that can be caused.

Today, I noticed an exchange between the brilliant Sara Joy and Stefan Bohacek on Mastodon, in which Stefan accidentally reminded me of something interesting that I hadn’t properly explored the first time around.

Rewind

About 20 years ago – actually 24 years ago, according to this Wikipedia article – there was a thing called FOAF, or Friend-of-a-Friend, an early online vocabularly / ontology for describing relationships between people and things online. There was also a related concept called DOAP, Description of a Project, that I was interested in and implemented in a couple of things I worked on back then. I did some digging, but the only references I can find on this blog are some passing mentions in the early 2000s, and I’ve lost my original foaf.rdf file but I might have to go hunting for that for posterity, at some stage.

I’m mentioning all of this because it reminds me that I’ve always been interested in the Semantic Web space, and also in the people aspects of the web, beyond just the words and the technology – Who is making What, and How it is all connected.

Humans today

Back to the ~present!

About 10 years ago – actually 12 years ago, according the last updated date in the original humans.txt file – there was the quiet proposal of an idea, for a humans.txt file, that could live in parallel to the robots.txt file on a web server.

The robots.txt file is intended for site owners to provide instructions to web crawlers – “robots”, or automated programs – as to how to behave in relation to the content of the site: this is the agreed-upon standard way in which the web works, and signals to search engines how to index websites, going all the way back to the early days of 1994-7, and later fully documented by Google and others.

The idea for the humans.txt file was that we should have a simple way to credit the people who made a website, in a super easy to create and publish format, regardless of the technology stack used to build the site or the URL formats and layout of the site. It was briefly documented and lightly promoted on humanstxt.org. I remember noticing it at the time, loving the idea, but then not really doing anything with it, and I admit that I didn’t end up using it myself.

However, Stefan is using this on his site (and wrote about it 11 years ago, because of course he’s ahead of me again 😀) and it made me think:

  • This is still A Great Idea, and Right Now Could Be Its Time:
    • We’ve seen deliberate misinterpretations / mis-statements (from big AI players) about the value of robots.txt in relation to AI crawlers/scrapers in the past 6-12 months. Let’s re-emphasise the human aspect here.
      • I have a “made by a human” button in my sidebar, made by the excellent human Andy Carolan. You can get one here.
    • humanstxt.org could do with a bit of a refresh / re-upping and updating, maybe, but it’s on all of us to promote and adopt this idea.
    • the IndieWeb is thriving, and I’ve been seeing folks returning from XOXO over the past week enthusing about the greatness of the web.

REMEMBER THE JOY THE INTERNET CAN BRING ❤️

donotreply.cards/en/do-post-wh

— Dan Hon (@danhon@dan.mastohon.com) 2024-08-24T17:53:01.066Z


  • [… more thoughts …]
  • Why don’t I add this to my sites? OK then, I will.
  • Hold on, is there a browser extension for this? Oh, there is (although with the rollout of the new Chrome updates / Manifest V3 and lack of maintenance, they may not work in the future)
  • OK what about a WordPress plugin, for this here WordPress blog of mine? Oh, there is (although it has not been updated lately, and continues to refer to legacy stuff like some site called Twitter; it works, though)
  • We really, really need to give credit where credit is due, in a world where things are increasingly being sucked up, mashed together by algorithms, and regurgitated in ways that diminish their creators for the enrichment of others.

What I’m saying, is this – Thank You, Stefan, and Sara, and Dan Hon2 and everyone else from XOXO and everywhere all over the internet, for reminding me that the web is great, humans are incredible, and hey, why don’t we all give this humans.txt thing one more try? I’m on board with that.


  1. In that post, I also mentioned that the Tiny Awards 2024 winners were due to be announced – and as I’m writing now, they have been: One Minute Park, and One Million Checkboxes. ↩︎
  2. A new edition of Dan’s excellent newsletter literally was published as I was typing this blog post. You need to subscribe to it. ↩︎
person making clay pot
ALT text

person making clay pot

@hywan@fosstodon.org

My blog mnt.io now feels like 1990-2000 with recommendations to other sites, and links to RSS & Atom, in the footer.

I miss the old school Web.

Screenshot of the footer. It has 3 columns: Contact me, Recommendations and Web. The recommendations column is a list of sites I recommend because they have great content. The Web column contains links to RSS, Atom, its source code etc. Old school.
ALT text

Screenshot of the footer. It has 3 columns: Contact me, Recommendations and Web. The recommendations column is a list of sites I recommend because they have great content. The Web column contains links to RSS, Atom, its source code etc. Old school.

@anatudor@mastodon.social

Since I came across this abomination again (in 2024, ffs 🙀 ):

❌`-moz-text-fill-color` was never a thing. There was never ever such a `-moz-` prefixed property.

❌`-moz-background-clip: text` never ever did a thing either. There was once a `-moz-background-clip`, but it never worked with `text`.

Throwing properties at it, maybe it works...
    -webkit-background-clip: text;
    -moz-background-clip: text;
    -webkit-text-fill-color: transparent;
    -moz-text-fill-color: transparent;
ALT text

Throwing properties at it, maybe it works... -webkit-background-clip: text; -moz-background-clip: text; -webkit-text-fill-color: transparent; -moz-text-fill-color: transparent;

@david@larlet.fr

J'ai bien envie de travailler avec des équipes localisées au en ce moment.

Si les quelques personnes vivant à qui me suivent ont des idées, je suis super ouvert.

Je sais faire des trucs autour de et du . J'aime accompagner des personnes dans l'acquisition de savoirs et d'autonomie autour de la technique. J'apprécie de concevoir des produits qui respectent et prennent en compte leurs utilisateur·ices.

Je ne cherche pas forcément du (très) lucratif.

Repouets 🆗

@andypiper@andypiper.co.uk
Finally, X seems to be crumbling. Here's why I think decentralised, federated social platforms offer the best opportunity for freedom.

Over the past week, there’s been a noticeable shift away from X in the UK, and it feels long overdue. According to Bluesky’s PR, the platform has seen a surge in new users and activity from the UK. I’ve personally noticed more people finding my profiles on both Threads and on Bluesky, and I’ve seen a significant number of “I just deleted my X account” posts on Threads. However, due to the algorithm, these posts often appear in bursts, sometimes delayed by a day or two.

My friend Neville Hobson wrote a piece today titled “Finally, the Unravelling of X,” where he discusses this migration, the reasons behind it, and the pros and cons of choosing between Bluesky and Threads. Neville touches on the idea of a “more respectful, decentralized web,” (to quote him on the Fediverse), and even highlights something I said on Threads yesterday. In response to a question about where politicians should go in a post-X world, I suggested that governments should own their own social platforms:

I wanted to expand on what I meant by a “sovereign owned/operated Mastodon instance” for the UK Parliament, and why I believe this is important.

One of the major tensions between Big Tech and national governments over the past 15 years has revolved around platform ownership and control. The European Union has even labeled several tech companies as “gatekeepers” in the Digital Markets Act. This term is telling—these companies essentially gatekeep the digital rights, data, and access of national citizens.

If governments are concerned about the dominance of privately-owned online platforms, they have a responsibility to run and own their own. At FOSDEM in Brussels this February, we noticed growing interest in Fediverse platforms and technologies like Mastodon from several national governments and the EU itself. Many of these institutions are already running their own social media instances and actively encouraging their politicians to use them. In the EU, there’s no reason to switch to Threads since Meta has restricted the platform’s availability in the bloc. Moreover, Threads doesn’t allow users to run their own instances, unlike Mastodon or even Bluesky, which, while less common, does technically support setting up a external ATProto instance (I don’t think that’s really happening though? happy to be informed and to learn otherwise – I’ll readily admit that it has not been at the centre of my attention).

For years, governments, newsrooms, and other organisations have protested the idea that private companies should control and limit their messages. A logical response would be for these entities to run their own instances of software like Mastodon—or any Fediverse-compatible, ActivityPub-based service. This would allow them to own their content, domain, and user verification, ensuring greater control and independence.

The UK is lagging behind in this area. While the EU has embraced Mastodon, and in the US, many organisations have moved to Threads, the UK has yet to take similar steps. For example, I follow @POTUS@threads.net and @whitehouse@threads.net from my Mastodon account, because they’ve enabled Fediverse sharing. Even though Threads is owned and operated by Meta, it’s positive that their content can reach into the wider Fediverse. Ideally, Threads will eventually fully integrate with the ActivityPub network, offering a two-way interaction and allowing for account, network, and maybe content portability—hence why I said, “in principle, with federated social accounts, the location does not matter so much, as long as they can be discovered and followed.” Owning the network and identity allows for broader discoverability and avoids corporate chokeholds.

As an aside: the EU has been a strong supporter of free software, Open Source, and open standards. My colleagues in the Mastodon team have signed an open letter in support of the Next Generation Internet (NGI) programs, urging the EU not to cut these investments. I fully support this stance.

There are challenges to this approach:

  • Running digital services requires consistent investment and maintenance.
  • Discovery isn’t always straightforward, and organisations seek reach and measurement—areas where Fediverse platforms currently fall short.
  • Deciding who qualifies for an account on a sovereign platform is tricky. While it makes sense for current MPs to have official accounts on a national Fediverse server, it’s harder to justify the inclusion of political parties or other entities on the same platform. This is an area where we need to improve data and account portability as the Fediverse grows.

These are important discussions that we need to be having. Politicians and the media should advocate for greater decentralisation and digital sovereignty to protect the freedom of democratic institutions.

Oh, and of course – these organisations should also fully embrace, invest in, and protect the open web.


Update 16/08/2024 – my friend Stefan Bohacek reminded me that he put together a useful resource on this same topic several months ago, Fediverse: an overview for government agencies. Well worth sending to your representatives, or sharing with your network if asked.

Update 27/08/2024 – the conversation continues in episode #425 of the For Immediate Release podcast (discussion starts around 13 min into the show). I appreciate Neville and Shel talking about my post here. Take a listen, if you want to hear how they expanded on and debated this idea – available wherever you get your podcasts.

Update 09/09/2024 – I wrote a second piece expanding on this and listing existing governments that are already in the Fediverse.

Update 13/09/2024 – I was reminded of this piece from IFTAS, Open Social for the Common Good, that is also excellent on this topic.


Finally – if you’re leaving X – congratulations – don’t look back.

brown wooden opened door shed
ALT text

brown wooden opened door shed

@nikcorg@mastodon.social

From , live in , . I work in , specifically . I have a long professional history with the .

I own multiple , because I love , particularly and with some , but also .

Had and work as a hobby, but that is currently dormant.

Occasionally . More often urban bimbler, taking pictures of all the I meet.

Some people say I make too many .

Me with my bike in touring setup on the Forth bridge in Scotland.
ALT text

Me with my bike in touring setup on the Forth bridge in Scotland.

My bike in bike-packing setup looking out to the sea on the Isle of Wight.
ALT text

My bike in bike-packing setup looking out to the sea on the Isle of Wight.

My city bike under some moody lights hanging from some trees in Elephant & Castle in London.
ALT text

My city bike under some moody lights hanging from some trees in Elephant & Castle in London.

My tent pitched near the water in Denmark. The campsite is overlooking the sound of Kattegat and in the distance you can see the Swedish coast.
ALT text

My tent pitched near the water in Denmark. The campsite is overlooking the sound of Kattegat and in the distance you can see the Swedish coast.

@aral@mastodon.ar.al

New Kitten release

Update to the latest version to get basic anonymous access statistics for your apps/sites in Kitten’s Interactive Shell (REPL)¹.

(When I get a moment, I want to make a nice web interface for this in Kitten’s Settings section too.)

Enjoy!

:kitten: 💕

¹ kitten.small-web.org/reference

Screenshot of terminal window showing output of .stats command:

🐱 💬 .stats

Kitten

Serving /var/home/aral/Projects/kitten/kitten-kawaii

Mode interactive (development)
State sleeping
CPU 0.00% (user: 0.00%, system: 0.00%)
Memory 0.3%

Events and listeners

There are currently no Kitten events being listened for.

Access statistics

There are currently 3 pages being viewed.

Top 10 viewed pages 

60 /💕/sign-in/
29 /character/happy/yellow/folder/
18 /character/blissful/pastel-red/file/ 
18 /character/happy/blue/ice-cream/
9 /character/lovestruck/pastel-red/human-dinosaur/
6 /character/lovestruck/yellow/cyborg/ 
5 /character/lovestruck/pastel-red/folder/
4 /character/blissful/yellow/file/
4 /character/excited/pastel-purple/human-dinosaur/
2 /character/blissful/pastel-magenta/ghost/

Missing pages (404) 

16 /favicon.ico 
5 /what/lovestruck/pastel-purple/human-dinosaur/
1 /character/jubilent/yellow/folder/ 

Server errors (500) 

20 /character/happy/yellow/folder/ 
20 /character/blissful/pastel-red/file/ 
1 /character/blissful/green/cat/ 
1 /character/happy/blue/ice-cream/ 

Process details 

Current Kitten process
ALT text

Screenshot of terminal window showing output of .stats command: 🐱 💬 .stats Kitten Serving /var/home/aral/Projects/kitten/kitten-kawaii Mode interactive (development) State sleeping CPU 0.00% (user: 0.00%, system: 0.00%) Memory 0.3% Events and listeners There are currently no Kitten events being listened for. Access statistics There are currently 3 pages being viewed. Top 10 viewed pages 60 /💕/sign-in/ 29 /character/happy/yellow/folder/ 18 /character/blissful/pastel-red/file/ 18 /character/happy/blue/ice-cream/ 9 /character/lovestruck/pastel-red/human-dinosaur/ 6 /character/lovestruck/yellow/cyborg/ 5 /character/lovestruck/pastel-red/folder/ 4 /character/blissful/yellow/file/ 4 /character/excited/pastel-purple/human-dinosaur/ 2 /character/blissful/pastel-magenta/ghost/ Missing pages (404) 16 /favicon.ico 5 /what/lovestruck/pastel-purple/human-dinosaur/ 1 /character/jubilent/yellow/folder/ Server errors (500) 20 /character/happy/yellow/folder/ 20 /character/blissful/pastel-red/file/ 1 /character/blissful/green/cat/ 1 /character/happy/blue/ice-cream/ Process details Current Kitten process

@maddiefuzz@hackers.town

Version 1.2 of Toki Trainer for iOS is fully released!

A study tool for the language toki pona, version 1.2 has French localization and a better user experience that addresses user feedback.

You can download it here: apps.apple.com/us/app/toki-tra

The community-contributed dictionary is also available in a web frontend at toki.maddie.info/

The web-frontend is still less feature-rich than the iOS client for now.

Please give either or both a try! I make these FOSS tools and release them for free, with no advertising or tracking.
If you’d like to support my continued work on these tools you can donate to my ko-fi: ko-fi.com/maddiefuzz

Thanks for your time, and a special thanks to those who contributed the French translations. This localization wouldn’t be possible without you.

Screenshot of Toki Trainer for iOS, showing the dictionary lookup UI
ALT text

Screenshot of Toki Trainer for iOS, showing the dictionary lookup UI

Screenshot of the web dictionary at https://toki.maddie.info/
ALT text

Screenshot of the web dictionary at https://toki.maddie.info/

@elkcityhazard@indieweb.social

I owe the hospital $2500 for a cat scan and I am looking to do small web projects to help satisfy that debt. Maybe you need some web maintenance tasks that have been on the back burner? I have experience with Looking for small projects around $250 - $350 . If you know someone who might benefit please

@closingtags@mastodon.social

I'm Dylan, a developer from the Midwest, US. I enjoy working with , , , , and . I've also done lots with .

I love learning about , dabbling in , and tinkering in my which I automate with .

I frequently at closingtags.com where I write things related to . You can reach me via the contact form there or here!

@matthiasott@mastodon.social

I’m starting something new! 🤗🎉

Own Your Web is a newsletter for anyone who wants to design, build, create, and publish on the Web.

Whether you want to get started with your own personal website or level up as a designer, developer, or independent creator working with the ever-changing material of the Web, this little email is for you. 💚✊

Sign up here: 👉 matthiasott.com/newsletter


RT=❤️

A comic style illustration featuring an Apple Lisa computer and the text Own Your Web.
ALT text

A comic style illustration featuring an Apple Lisa computer and the text Own Your Web.

@anatudor@mastodon.social

How would you go about creating this multi-layer text *with strokes* smooth effect on `:hover` without duplicating the text? That includes duplication in pseudo `content`, btw.

I did it with filters codepen.io/thebabydino/pen/poX - can you guess how before checking the code? 😼

Original @codepen demo I came across codepen.io/vstefanova/pen/wvLB uses text duplication in the pseudo, but I thought I could do without.

Screenshot. Shows a navigation menu where items are just white text outlines on a dark background in the normal state. In the :hover/ :focus state, they also get a white fill and two distinct outlined and filled copies getting offset by various degrees to the top right. The DevTools panel is also open to show the fact that there's no text duplication, not in the markup and not in pseudo-elements.
ALT text

Screenshot. Shows a navigation menu where items are just white text outlines on a dark background in the normal state. In the :hover/ :focus state, they also get a white fill and two distinct outlined and filled copies getting offset by various degrees to the top right. The DevTools panel is also open to show the fact that there's no text duplication, not in the markup and not in pseudo-elements.

Animated GIF. Shows the :hover effect for each and every nav item.
ALT text

Animated GIF. Shows the :hover effect for each and every nav item.

Screenshot of the relevant bits of code in the original demo showing duplicating the link text in its pseudos.
ALT text

Screenshot of the relevant bits of code in the original demo showing duplicating the link text in its pseudos.

@adamsdesk@fosstodon.org

How to Block or Disable Media Using Mozilla Firefox

Improve your privacy and website performance in this comprehensive guide on how to block media elements (images, videos, etc.) using Mozilla Firefox.

adamsdesk.com/posts/block-disa

A large title stands in white over the blue gradient background that reads, 'Block Media To Improve Your Privacy and Website Performance'. Below the title is a Mozilla Firefox logo plus a uBlock Origin logo.
ALT text

A large title stands in white over the blue gradient background that reads, 'Block Media To Improve Your Privacy and Website Performance'. Below the title is a Mozilla Firefox logo plus a uBlock Origin logo.

@whizkidz@mastodon.social

If you know little or nothing about but want to learn, then check out whizkidzcc.com/summer. We've turned students that didn't think they could code to not only become proficient but to actually enjoy programming.

We offer one-week online workshops on , , , / , and more! These classes are taught by trained instructors. It is project-based and very hands-on. Use the coupon code "mastnew" for $100 off for first-time customers!

@bjarne@social.bvoigtlaender.de

Does anybody know of a web client for mastodon similiar to tweetdeck with a really cool retro style?

Im not sure anymore if i might just have dreamed that. But I have this vivid memory trying out a web client like that 2 years ago.

I am aware of mastodeck and those who pop up if your search for alternative web clients, but it had a really distinct style. :cool:

#mastodon #fediverse #web

@LukaszOlejnik@mastodon.social

My data protection assessment of Privacy Sandbox's Protected Audience API. I analyse it through the lens of and . It can be used in line with EU Data Protection, and may even help solving the cookie-consent fatigue. My LL.M. dissertation. blog.lukaszolejnik.com/data-pr

The full content of my LL.M. dissertation at University of Edinburgh Law School The University of Edinburgh lukaszolejnik.com/stuff/Privac

@tdp_org@mastodon.social

Quick while I wait for a build to run.

I work at the on content delivery. Some things I've built with our teams here are:
* Our in-house CDN for www.bbc.co.uk & www.bbc.com
* Our www log processing pipeline & reporting dashboards
* The core BBC service & deployment tooling
* The BBCs Reporting API & Web Vitals endpoint
I'm a BBC Security Champion & I , & do all the usual life stuff

@aburtch@triangletoot.party

Does anyone know if there’s a way to get alerted when a web page is updated? It doesn’t have an RSS feed. It’s just a very basic government page, but I’m looking for a service that will send me some sort of notification when it updates. Does that sort of thing exist?

@aral@mastodon.ar.al

Just updated the Small Technology Foundation web site to fix old links, update the status of Kitten¹ (close to API Version 1) and Domain² (will enter open Beta this year), and to add a few news items.

small-tech.org

PS. We have zero public funding (NLNet, ngi, etc.) and we don’t take VC or Big Tech sponsorship. Fund us: small-tech.org/fund-us

¹ kitten.small-web.org
² codeberg.org/domain/app

@sourcerer@bsd.cafe

YouTube "Ad Injections" Are Breaking Ad Blockers

by Mental Outlaw

youtube.com/watch?v=OzKA0UzSo6

alternative link:
jouwbuis.nl/watch?v=OzKA0UzSo6

"The day Ad Block no longer works.... I will no longer using youtube" - I noticed that some people treat this comment as a joke, or whatever but ...
I personally will give up on youtube if this happens. I really plan detox.

Do we have alternative?
Yes, in form of BLOGS!

Here on mastodon, there's a lot of great people that have value too, and many have personal blogs - i think they are worth of attention.

Because businesses, tech companies overload web with garbage ... what we need is to build a "space" without that crap.

A small little space in web, like BSD Cafe.

I learned how to live without facebook, i never touched things like tiktok etc. . .

I'm ready to ditch my google account. The last piece... is to just buy a new phone, install alternative OS on mobile and at this point i will be done with google.

People need to build their own spaces and services.

It's important to teach people reaching this kind of independence.

To have better web, we need to start small and built it by yourself ... it's sad but true.

What big tech companies do is out of control anyway.

@offtopic

Dark Visitors - A List of Known AI Agents on the Internet

Insight into the hidden ecosystem of autonomous chatbots and data scrapers crawling across the web. Protect your website from unwanted AI agent access.

darkvisitors.com

darkvisitors.com

Dark Visitors - Track AI Agents and Bots on Your Website

Get realtime insight into the hidden ecosystem of artificial agents browsing, scraping, crawling, and gathering intelligence on your website

@heals@indiepocalypse.social

And.. youre really wondering why I won't let you store cookies to better trace my private data?

You and your HOW MANY Partners??

Like.. how would anyone look at this screen and think "Surely this is fine, I bet you need the whole 1286 to provide all this awesome.. text.."

Holly flying F*

A cookie consent banner stating "We and our 1286 technology partners ask you to consent to the use of cookies to store and access personal data on your debice."
ALT text

A cookie consent banner stating "We and our 1286 technology partners ask you to consent to the use of cookies to store and access personal data on your debice."

@jorge@social.bakunin.nohost.me

Cómo archivar Paginas Web.

Guía para archivado interactivo

03/12/2023

Por @pip

Compartimos un video de cómo instalar y empezar a usar archiveweb.page una extensión para Chrome/Chromium para archivado interactivo de sitios. Cuando tengas un archivo, contactanos para saber dónde subirlo.

https://archivo-pirata-antifascista.partidopirata.com.ar/public/vkq2myxkyd3mskbc292pmlxawur5/archiveweb.page.webm

Fuente: https://archivo-pirata-antifascista.partidopirata.com.ar/2023/12/03/c%C3%B3mo-archivar.html

#viendo #web #chromium #pip #archive #archivos #archivopirataantifascista #argentina #chile #latinoamerica #archiveweb #archivo

archivo-pirata-antifascista.partidopirata.com.ar

Cómo archivar

Guía para archivado interactivo

(1/2) : If you hate AI powered search engines and prefer a more humanized and alphabetical index of sites, well, why not go to The Blue Pages!

The Blue Pages aims to be a web directory that:
- Relevant to one's interest
- Could be used by literally everyone (except corporations)
- Go with the spirit of Web 1.0

It is a pure curated index, no scrappers, no algorithms, no bullshit.

Why not go there on: blue-pages.bitbucket.io now!

The Blue Pages homepage
ALT text

The Blue Pages homepage

@eric@social.coop · Reply to Eric Maugendre
@eric@social.coop · Reply to Eric Maugendre

Here is a measure of how much developers choose to make browsers work (to parse, keep in memory, execute):
JavaScript download (all caching disabled, aka. cold load):
0.2 MB – Wikipedia
0.4 MB – Mastodon
1.4 MB – PornHub
3 MB – Medium
7 MB – Airbnb
10 MB – Pinterest
11 MB – Patreon
12 MB – Youtube
16 MB – Instagram
20 MB – Gmail
31 MB – Linkedin
55 MB – Slack

Some details are here: tonsky.me/blog/js-bloat/

Example of a Mastodon download (all caching disabled): 365 KB
ALT text

Example of a Mastodon download (all caching disabled): 365 KB

Short video footage from October 2014, at 20th anniversary, when Vint Cerf and Tim Berners-Lee donned / revealed t-shirts that @amyvdh and @koalie had custom-made, and they were good sports to agree to wear!

The audience enjoyed the memorable and unexpected stunt!

An image is worth a thousand words:
• Tim Berners-Lee invented the (and in 1994 founded @w3c )
• Vinton Cerf invented the Internet.

Two men stand on stage. One removes his shirt and reveals a T-shirt with text in the front "I didn't invent the Internet."  The other man dons over his white shirt a t-shirt that reads on the front "I invented the Internet." They smile in the lighthearted moment. A crowd gathers at the foot of the stage as people laugh and film.
ALT text

Two men stand on stage. One removes his shirt and reveals a T-shirt with text in the front "I didn't invent the Internet." The other man dons over his white shirt a t-shirt that reads on the front "I invented the Internet." They smile in the lighthearted moment. A crowd gathers at the foot of the stage as people laugh and film.

@bitbear@icosahedron.website

The untold history of web development:

1990: HTML invented.
1994: CSS invented to fix HTML.
1995: JS invented to fix HTML/CSS.
2006: jQuery invented to fix JS.
2010: AngularJS invented to fix jQuery.
2013: React invented to fix AngularJS.
2014: Vue invented to fix React & Angular.
2016: Angular 2 invented to fix AngularJS & React.
2019: Svelte 3 invented to fix React, Angular, Vue.
2019: React hooks invented to fix React.
2020: Vue 3 invented to fix React hooks.
2020: Solid invented to fix React, Angular, Svelte, Vue.
2020: HTMX 1.0 invented to fix React, Angular, Svelte, Vue, Solid.
2021: React suspense invented to fix React, again.
2023: Svelte Runes invented to fix Svelte.
2024: jQuery still used on 75% of websites.

(By twitter.com/fireship_dev)

@nekohayo@mastodon.social
@r3mix@tooting.ch

Hey, salut tout le monde!
Je suis toujours à la recherche de et je cherche des qui bossent dans le entre , et la . Ceux qui connaitraient une entreprise à la recherche de , et/ou pourraient ils me faire signe? Boosts appréciés!

Vous pouvez checker et partager mon site: marchottinger.ch
:ch_Vaud: 🌐

marchottinger.ch

Marc Hottinger - Media & Interaction Designer

Marc Hottinger est un designer et développeur web travaillant à la jonction de l'art de l'ingénieurie et du design.

@r3mix@tooting.ch

[Follow-up] Salut tout le monde, je suis en train de monter mon portfolio! Sachez que je cherche un job à 80%-100% (ou des mandats) dans le domaine du Web Design (UI/UX). Rendez-vous dans quelques jours pour voir mon travail.
Vous pouvez m'envoyer un MP si interêt. Boosts appréciés!

1/

Capture d'écran d'une partie de la home page du portfolio du designer Marc Hottinger. Le site présente un portrait en plan poitrine noir/blanc sur fond noir avec l'inscription en arrière-plan "Marc Hottinger" et un petit texte en dessous: "À la jonction de l’art, de l’ingénierie et du design, je tente de faire naître des solutions interactives esthétiques, originales et humaines."
ALT text

Capture d'écran d'une partie de la home page du portfolio du designer Marc Hottinger. Le site présente un portrait en plan poitrine noir/blanc sur fond noir avec l'inscription en arrière-plan "Marc Hottinger" et un petit texte en dessous: "À la jonction de l’art, de l’ingénierie et du design, je tente de faire naître des solutions interactives esthétiques, originales et humaines."

@susannahkirby@hachyderm.io

A belated from a escapee!

I’m a . Zero-downtime migrations are my jam.

is a 3rd after & (). I’m holding the tech door open for other , , , & .

Being is an orientation & a worldview. Sharing information is a .

I’m militantly pro-. I love , , walking my , , , & .

@xaentenza@tooting.ch
#introduction

Ok, je me lance dans l'exercice de l'

:blobcatscience: Je suis responsable à l’École polytechnique fédérale de Lausanne (). Vous me verrez donc fréquemment tooter , et .

Vous risquez de voir passer aussi par ici:
- 🚲 du
- ♻️ de la
- 🎧 du bruit plus ou moins agréable
- :ch_Vaud: du régional
- 👅 en français, anglais, e de vez en cando tamén en

ℹ️ Ça se prononce [ʃurʃo]

@ifrit@masto.ai
@Cockpit@fosstodon.org

Hello, Fediverse! ✈️

Cockpit is based for servers. (It's like a desktop for a server that you can use in your browser, for "newbies", seasoned admins, and everyone in-between.)

You can configure a server, modify your network (and firewall!), view logs, see system stats, edit accounts, start and stop services, debug , and much more.

Add-ons are available to work with , , , and more.

cockpit-project.org/

cockpit-project.org

Cockpit Project

Cockpit makes it easy to administer your Linux servers via a web browser.

@matthewhowell@indieweb.social

Hello, everyone!

My name is Matthew, I’m an American generalist computer person, developer, amateur generative artist, hobbyist photographer, weird video game enthusiast (and sometimes maker), book reader, long walker, and drinker. Hoping to talk to cool people about all those things!

Also!

Links 👇

@bano@mastodon.ml

Я программист, сейчас на пишу всякие штуки. Последнее время упарываюсь в , то есть , децентрализация и всякое такое. В вебе со времён и ES3, но про них обычно вспоминают как о страшном сне. Могу ещё писать на и .

Но вообще когда-то давно хотел стать дизайнером. Не потому что творчество люблю, а потому что люблю делать красиво и удобно.

В свободное время... Скажем, что в свободное время я тюленю перед компом, пытаясь найти в интернете всякого интересненького. Не так давно нашёл вот Mastodon и потихоньку задумываюсь о том, чтобы сделать свой сайт в лучших традициях

Вот такой вот получился у меня

Что буду сюда писать пока не знаю, я скорее чукча-слушатель, а не писатель.

@blog@shkspr.mobi

The unreasonable effectiveness of simple HTML

shkspr.mobi/blog/2021/01/the-u

I've told this story at conferences - but due to the general situation I thought I'd retell it here.

A few years ago I was doing policy research in a housing benefits office in London. They are singularly unlovely places. The walls are brightened up with posters offering helpful services for people fleeing domestic violence. The security guards on the door are cautiously indifferent to anyone walking in. The air is filled with tense conversations between partners - drowned out by the noise of screaming kids.

In the middle, a young woman sits on a hard plastic chair. She is surrounded by canvas-bags containing her worldly possessions. She doesn't look like she is in a great emotional place right now. Clutched in her hands is a games console - a PlayStation Portable. She stares at it intensely; blocking out the world with Candy Crush.

Or, at least, that's what I thought.

Walking behind her, I glance at her console and recognise the screen she's on. She's connected to the complementary WiFi and is browsing the GOV.UK pages on Housing Benefit. She's not slicing fruit; she's arming herself with knowledge.

The PSP's web browser is - charitably - pathetic. It is slow, frequently runs out of memory, and can only open 3 tabs at a time.

But the GOV.UK pages are written in simple HTML. They are designed to be lightweight and will work even on rubbish browsers. They have to. This is for everyone.

Not everyone has a big monitor, or a multi-core CPU burning through the teraflops, or a broadband connection.

The photographer Chase Jarvis coined the phrase "the best camera is the one that’s with you". He meant that having a crappy instamatic with you at an important moment is better than having the best camera in the world locked up in your car.

The same is true of web browsers. If you have a smart TV, it probably has a crappy browser.

Twitter's guest mode displayed on a TV.

My old car had a built-in crappy web browser.

The dashboard of a BMW i3 - there is a web browser on the central display.

Both are painful to use - but they work!

If your laptop and phone both got stolen - how easily could you conduct online life through the worst browser you have? If you have to file an insurance claim online - will you get sent a simple HTML form to fill in, or a DOCX which won't render?

What vital information or services are forbidden to you due to being trapped in PDFs or horrendously complicated web sites?

Are you developing public services? Or a system that people might access when they're in desperate need of help? Plain HTML works. A small bit of simple CSS will make look decent. JavaScript is probably unnecessary - but can be used to progressively enhance stuff. Add alt text to images so people paying per MB can understand what the images are for (and, you know, accessibility).

Go sit in an uncomfortable chair, in an uncomfortable location, and stare at an uncomfortably small screen with an uncomfortably outdated web browser. How easy is it to use the websites you've created?

I chatted briefly to the young woman afterwards. She'd been kicked out by her parents and her friends had given her the bus fare to the housing benefits office. She had nothing but praise for how helpful the staff had been. I asked about the PSP - a hand-me-down from an older brother - and the web browser. Her reply was "It's shit. But it worked."

I think that's all we can strive for.


Here are some stats on games consoles visiting GOV.UK

TwitterReplying to @TheRealNooshuInterestingly we have 3,574 users visiting GOV.UK on games consoles:
• Xbox - 2,062
• Playstation 4 - 1,457
• Playstation Vita - 25
• Nintendo WiiU - 14
• Nintendo 3DS - 16

20/22

x.com

Matt Hobbs (@TheRealNooshu@hachyderm.io) (@TheRealNooshu) on X

Interestingly we have 3,574 users visiting https://t.co/CcU3PLPTpj on games consoles: • Xbox - 2,062 • Playstation 4 - 1,457 • Playstation Vita - 25 • Nintendo WiiU - 14 • Nintendo 3DS - 16 20/22