#peerToPeerWeb

2026-01-22

Hah… just noticed something interesting that looks like it’s going to be another advantage to Web Numbers¹… look at these Kitten² screenshots and tell me if you can spot something unexpected.

Hint: it’s what’s missing.

There are no 404 errors for common hack attempts trying to exploit WordPress vulnerabilities, etc. In fact, it’s entirely quiet. Because those folks watch DNS :)

¹ ar.al/2025/06/25/web-numbers/
² kitten.small-web.org/

#WebNumbers #SmallWeb #peerToPeerWeb #personalWeb #Kitten #SmallTech

Screenshot of the .stats command in Kitten’s shell (REPL) with the list of missing pages highlighted:

 /chat.socket
1 / 1 /apple-touch-icon-precomposed.png
1 /apple-touch-icon.png
1 /favicon.ico

Full visible text:

©@ .stats

Kitten

Serving /home/aral/kitten/app/examples/streaming-html/kitten-chat/persisted --domain=ipv4
Mode interactive (development)
State sleeping
CPU 1.10% (user: 0.26%, system: 0.84%)
Memory 4.3%

Events and listeners
There are currently no Kitten events being listened for.

Access statistics
There are currently 7 pages being viewed.

Top 10 viewed pages
9 /s/hello/f14f71b9c10c8a1552feca19ee925d010f434a021d8db721cc1d775f60e09ea6/
/sign-in/
1 /%F0%9F%90%B1/settings/kitten/
1 /%F0%9F%90%B1/settings/domain/
1 /%F0%9F%90%B1/settings/app/
1 /%F0%9F%90%B1/settings/evergreen-web/
1 /%F0%9F%90%B1/settings/identity/
1 / %F0%9F%90%B1/settings/secrets/
1 /%F0%9F%90%B1/settings/state/overview/
Missing pages (404)
3 /chat.socket
1 / 1 /apple-touch-icon-precomposed.png
1 /apple-touch-icon.png
1 /favicon.ico
Server errors (500)
Yay, there haven't been any 500 errors yet!
Top 10 referrers
1 http://91.98.66.193:443/
Process details
Current Kitten processScreenshot of Kitten’s web-based Settings showing the last 25 requests: they’re all valid requests for routes that are part of the application being served.
2026-01-22

Hey, guess what?

I just saw the first Small Web site (the Kitten Chat example¹ from Kitten²) running at a Web Number³:

https://91.98.66.193/

👉 Update: I’m shutting it down in a few moments so it might not be there when you try it :)

Come say hi (I don’t know how long I’ll keep it on for, will update this when I turn it off.)

🥳

PS. This is only in the ip-address-support branch of Kitten right now and should be considered experimental. Will likely make it into main today.

¹ codeberg.org/kitten/app/src/br
² kitten.small-web.org
³ ar.al/2025/06/25/web-numbers/

#SmallWeb #WebNumbers #SmallTech #peerToPeerWeb #Kitten

2026-01-17

So, going forward, Auto Encrypt¹, Kitten², and Catalyst³ will be seamlessly (automatically; with zero config) supporting Web Numbers⁴ (IPv4, IPv6), and, of course, should you want to point one at your server for old time’s sake, legacy domain names too.

I still have some dev to do on this on the Kitten side of things but I’m hugely excited about being able to remove another centralised component – DNS – from the Small Web⁵ (peer-to-peer, personal web) as we inch nearer to making it available this year to everyday people who use technology as an everyday thing.

¹ codeberg.org/small-tech/auto-e
² kitten.small-web.org
³ catalyst.small-web.org
ar.al/2025/06/25/web-numbers/
ar.al/2024/06/24/small-web-com

#SmallWeb #SmallTech #SmallTechnologyFoundation #peerToPeerWeb #personalWeb #WebNumbers #decentralisation #web #dev #humanRights #democracy

Screenshot of ssh terminal connected to remote host (aral@linux):

> curl https: //91.98.66.193
Hello, world!

> curl https:// [2a01:4f8:1c1e: 4207:0:0:0:1]
Hello, world!

> curl https:// linux.ar.al
Hello, world!
2025-12-21

Just added Web Reachability API (at least that’s what I’m calling it) support to ip.small-web.org.

It’s for testing the reachability of your Small Web servers (using a domain or, more importantly, an IPv4/IPv6 address). I’m using it to implement Web Numbers¹ support in Auto Encrypt² and Kitten³.

Protocol:

• At http://<endpoint> return an empty HTTP 200 response that includes the following custom header: 'web-reachability-id': ‘<uuid>'
• Hit: ip.small-web.org/reach/<endpoint>/<uuid>/
• If you get a 200 response back, your endpoint is reachable. Anything else signals an error.

Enjoy! 💕

¹ ar.al/2025/06/25/web-numbers/
² codeberg.org/small-tech/auto-e
³ kitten.small-web.org

#WebReachabilityAPI #WebNumbers #IpAddresses #reachability #Kitten #AutoEncrypt #SmallWeb #peerToPeerWeb #SmallTech

2025-12-19

🎉 Another quick Node Pebble release (version 5.4.0)

• Adds short-lived profile support. (Thanks to Aaron Gable for showing me how¹)

This should help if you’re implementing support for IP-address certificates.

codeberg.org/small-tech/node-p

Related: Read up on how the Small Web will launch next year using Web Numbers:

ar.al/2025/06/25/web-numbers/

Enjoy! 💕

¹ github.com/letsencrypt/pebble/

#SmallWeb #SmallTech #NodePebble #LetsEncrypt #peerToPeerWeb #WebNumbers

2025-12-17

I updated the initial Kitten course based on our first lesson with @casey and your feedback here. So now we start with no tooling except for your default terminal app and Kitten and it serves as a gentle introduction to the command line and gets to you seeing your first web page in your web browser far more quickly.

kitten.small-web.org/course/he

The tooling chapter is now Chapter 2:

kitten.small-web.org/course/to

And there’s a new Chapter 3 that gets you editing your newly-created web page using Helix Editor:

kitten.small-web.org/course/he

I’m going to add an introduction to git to this chapter soon.

The course is being developed as Casey and I have our lessons so new chapters should trickle in and things may change with rewrites, etc., as we go.

kitten.small-web.org/course

Please feel free to follow along and pipe in with thoughts and suggestions if you have any.

Enjoy!

:kitten:💕

PS. There will be screenshots, etc., added as I work on it more. I know it’s a bit text-heavy at the moment.

#Kitten #KittenCourse #course #SmallWeb #PeerToPeerWeb #web #dev #HTML #CSS #JavaScript #NodeJS

2025-12-10

Another quick release, this one adds Alpine.js support for shorthand event handlers.

Just add a `@` before your shorthand event handler names to have them expanded as inline Alpine.js event handlers.

e.g., `on:connect` → `@on:connect`

Enjoy!

:kitten:💕

#Kitten #AlpineJS #HTMX #SmallWeb #peerToPeerWeb #web #dev #JavaScript #nodeJS #SmallTech #KittenRelease

2025-12-10

🥳 New Kitten Release

kitten.small-web.org

You can now use the simple `on:` prefix instead of `hx-on:htmx:` to define inline event handlers for HTMX events¹.

Also, there are three new event shorthands for responding to your Kitten page’s connection lifecycle:

• on:connecting
• on:connect
• on:disconnect

(These expand during render to `hx-on:htmx:ws-connecting.window`, `hx-on:htmx:ws-open.window`, and `hx-on:htmx:ws-close.window`, respectively.)

These are useful when using Kitten’s Streaming HTML workflow.

Full change log:
codeberg.org/kitten/app/src/br

Enjoy!

:kitten:💕

¹ htmx.org/events/
² kitten.small-web.org/tutorials

#Kitten #SmallWeb #peerToPeerWeb #web #dev #SmallTech #KittenRelease

2025-11-06

Guess who misremembered having 25 seconds per slide and instead has 15 seconds per slide on Monday?

FML! :)

Goodness, I hate formalistic presentation styles like Ignite. But don’t worry, I’m breaking the form three times in the talk – including starting with a minute of silence for Gaza (that’s four black slides and 1/5th of the 5-minute talk), a transition (ok, it’s a 15-second transition, but still), and a live demo (yep) – and using that to demonstrate the case that we do not have to accept the rigid confines of the status quo, that resistance and sabotage are always options, and that the way things are is just raw materials for the way things can be. That said, constraints are also good so the reduced slide duration will only make my talk more impactful if I edit it down right, it just means more work… and more than one thing can be true at the same time. ;)

If you’re in Dublin/Ireland and want to drop by, there are no tickets and it’s first-come first-served:

defuse.ixd.ie

#DefuseDublin #Dublin #Ireland #IxDA #TheSugarClub #talks #presentations #design #humanRights #democracy #Gaza #Palestine #BigTech #SmallTech #SmallWeb #Kitten #Domain #peerToPeerWeb

2025-06-26

Thanking the @letsencrypt folks for the excellent work they do, and especially for their upcoming support for security certificates for IP addresses which is nothing short of revolutionary for the future of the (Small) Web.

community.letsencrypt.org/t/ge

#SmallWeb #security #IPAddresses #WebNumbers #LetsEncrypt #SmallTech #decentralisation #peerToPeerWeb #findability

2025-05-26

👋🤓 Goodbye Site.js, Hello Kitten!

I started working on creating a Small Web¹ server (a peer-to-peer Web server) six years ago² with Site.js.

Building Site.js was my first attempt. And it resulted in:

• Auto Encrypt (automatic Let’s Encrypt certificates): codeberg.org/small-tech/auto-e

• Auto Encrypt Localhost (automatic localhost TLS certificates): codeberg.org/small-tech/auto-e

• @small-tech/https (drop-in Node.js https module replacement with automatic TLS certs everywhere): codeberg.org/small-tech/https

• JSDB: In-process, in-memory JavaScript database that persists to append-only JavaScript logs: codeberg.org/small-tech/jsdb

As Site.js reached an evolutionary dead-end, and as I learned from my experiements with replicated data types that replicated data types are *not* a prerequisite for a decentralised web (actual topological decentralisation and ease of use are), I started writing a new server/platform called Kitten from scratch while still making use of the tried and tested modules listed above.

Last week, I switched over our last site using Site.js to Kitten and, with that, today I’ve sunset³ Site.js:

sitejs.org

For its successor, please see Kitten:

kitten.small-web.org

If you want to support our work at the Small Technology Foundation, please consider becoming a patron:

small-tech.org/fund-us

:kitten:💕

¹ ar.al/2024/06/24/small-web-com
² ar.al/2019/08/26/introducing-s
³ Using our instance of Look Over There!: look-over-there.small-web.org

#SiteJS #SmallWeb #SmallTech #peerToPeerWeb #SmallTechnologyFoundation #AutoEncrypt #AutoEncryptLocalhost #JSDB #JavaScriptDatabase #https #TLS

Detail of Site.js web site:
Illustation of woman lying down with laptop. On screen is a twig with two green leaves.

Site.js
Small Web construction set.
Site.js is deprecated and no longer being actively maintained. Much of it lives on in Kitten.
2025-04-28

New Kitten Release 🥳

• New: Any attributes present in a <markdown> tag are now passed to the first rendered element. (This is useful if you want to add some quick inline styles to a <p> that’s rendered from markdown, etc., but for anything more complicated, you should likely just jump into HTML.)

To learn more about Markdown in Kitten, please see the Markdown reference¹.

Enjoy!

:kitten:💕

¹ kitten.small-web.org/reference

#Kitten #SmallWeb #PeerToPeerWeb #KittenRelease #markdown #web #dev

2025-04-28

New Kitten Release 🎉

• Fix: morph attributes¹ now support interpolated values.

kitten.small-web.org

Enjoy!

:kitten:💕

¹ The morph attribute is Kitten’s shorthand for the hx-swap-oob attribute of htmx, which Kitten uses – and extends – under the hood. To learn more about it, see Kitten’s Streaming HTML tutorial: kitten.small-web.org/tutorials

#Kitten #SmallWeb #PeerToPeerWeb #KittenRelease #htmx #hypermedia #web #dev

2025-04-28

New Kitten Release 🎉

kitten.small-web.org

Added:

• Support for local redirects and domain redirects (former will eventually have interface in Settings, latter can be programmatically used or, more likely, will be used via a small app I’m about to release next).

Fixed:

• Event bubbling in class-based Kitten pages and components is now correctly limited to just the event target if the component’s id starts with Kitten’s automatically generated universally-unique ID for the component.

• Fixed regular expression matching Kitten components in Markdown pages so it correctly captures self-closing components when followed by components with slotted content.

• The Kitten-specific trigger() mixin on the client-side WebSocket now correctly adds the contents of the data attribute on the triggering node to the data property received by the server-side event handler. This gives manually-triggered event handlers the same interface as automatically-triggered ones. (Previously it would create a separate `data` object in the received argument.)

Stay tuned for the a small and useful app release later today for web archiving/combatting link rot :)

Enjoy!

#Kitten #SmallWeb #PeerToPeerWeb #KittenRelease #web #dev

2025-02-08

@networkstring Just a heads up that peer-to-peer Small Web web sites running Place¹ will not be subject this or other similar laws as there is no “user generated content” on them and each web site merely holds the data created by its owner, who is responsible for the content and with complying with local laws, etc., themselves (and their ISPs and web hosts are responsible in turn, in their local jurisdictions, for the content they host).

What’s the Small Web, you ask?

👉 ar.al/2024/06/24/small-web-com

💕

¹ codeberg.org/place/app

#SmallWeb #peerToPeerWeb #SmallTech

2025-01-27

A quick demonstration of using the State: Overview page in Kitten’s¹ settings while developing to keep an eye on your event and event listener counts to avoid memory leaks.

Notice how the events and listeners counts change as I navigate between the People and Settings pages in my Place² node and that they are consistent. If they were rising as I navigated back and forth I’d know I had a memory leak somewhere.

If you use Kitten’s built-in features (e.g., the `addEventHandler()` method on your `kitten.Component` subclasses, Kitten will handle adding and removing listeners for you automatically during your component’s lifecycle. You can also do so manually in your component’s automatically-called `onConnect()` and `onDisconnect()` event handlers.

This view is useful during development to ensure you don’t have any memory leaks as pages are loaded and unloaded.

vimeo.com/1050714714

¹ kitten.small-web.org
² Place is in early development at the moment (codeberg.org/place/app)

#Kitten #SmallWeb #SmallTech #demo #developerExperience #developerTools #design #eventModel #events #memory #memoryLeaks #observerPattern #listeners #web #dev #HTML #CSS #JavaScript #NodeJS #server #platform #framework #WebSockets #hypermedia #htmx #StreamingHTML #place #peerToPeer #peerToPeerWeb

2025-01-22

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.

#Kitten #SmallWeb #PeerToPeerWeb #web #server #framework #platform #design #usability #errorMessages #authoring #dev #JavaScript #HTML #CSS #htmx #hypermedia #WebSocket #StreamingHTML #SmallTech

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
  }
}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?)
2024-10-27

I’m going to present a talk on Small Web at the Dub|Sec meetup this Wednesday (October 30th at 6:30PM). The event takes place at The Camden Court Hotel in Dublin.

Pop by and say hi if you’re around.

meetup.com/dub-sec/events/3038

#SmalWeb #peerToPeerWeb #Ireland #meetup #dublin #dubsec #Kitten #Domain #Place #NodeJS #HTML #CSS #JavaScript #htmx #WebSockets #web #dev

Client Info

Server: https://mastodon.social
Version: 2025.07
Repository: https://github.com/cyevgeniy/lmst