Skip to main content


Items tagged with: smallWeb

"Fediverse: Peopleverse!"

That's the way I'll campaign for #Fediverse and advocate it to others.

Notions of #Metaverse and #Web3 have in common that they lack humanity.

People, humans, mankind.. that's fedi right there.

There's the #SocialHub slogans of fedizens #UnitedInDiversity and #ReimagineSocialNetworking to help with that. Weaving a #SocialFabric together.

I'll also use #WEB0 #SmallWeb and #OpenWeb where appropriate to highlight specific characteristics.

Rise of the #Peopleverse

Just submitted my grant application for our Domain project to NLnet for their User-Operated Internet Fund.

I believe the process for public funding should itself be public so you can read the entire submission on my blog (with better formatting than the text-only original submission, a video, and pictures) and I’ll be posting future communication there also:

#nlnet #eu #funding #grant #foss #smallWeb #smallTech #domain #kitten #publicMoneyPublicProcessPublicCode

Hyperscript notes by Avatar
Andreas Rozek

A nice collection of thoughts and code on hyperscript (the client-side scripting language, not Dominic’s h()).

#hyperscript #web #dev #htmx #smallWeb #smallTech #kitten

Right, thanks to your feedback, this is what the “hello, world” would look like in htmx versus the equiavelent of what I have now in Svelte.

But there’s one big drawback to htmx… no ES modules and thus no components. That’s a biggie.


#htmx #svelte #javaScript #js #nodeKit #smallWeb #prototyping
Code listing, index.jsx (NodeKit with htmx, hypothetical):

let count = 0

export default () => {
  return (
      <h1>Hello, world!</h1>
      <p>I’ve greeted you {count} time{count > 1 ? 's' : ''}.</p>
Code listing: NodeKit with NodeScript (Svelte + server-side Node). (Current version.)

  let count = 1

  export default () => {
    return {count: count++}

  export let data

<h1>Hello, world!</h1>

<p>I’ve greeted you {data.count} time{data.count > 1 ? 's' : ''}.</p>

The Small Web isn’t about going back to the days of GeoCities. It’s about going forward differently, using modern tech in a non-colonial manner.

It’s not about building clones of Twitter, YouTube, etc. There’s no way anyone can self-host a dozen different services. Instead, it’s about having a single-tenant place on the Web that you own and control without technical knowhow; a place you can add Twitter, YouTube, etc., *features* to.

#SmallWeb #SmallTech #SingleTenant

Hmm, looks like # is going to be on my doorstep in Kilkenny (Ireland) this October. Anyone from the fediverse going? Wonder if there’d be any interest in an in-person small web meetup around the same time here.

# # # # # # #

Anyone fluent with tree sitter grammars (and/or LSPs) want to help me with implementing NodeKit ( code intelligence for Helix editor?

# # # # # # # # #

Node’s built-in error reporting leaves a lot to be desired so I just spent some time improving the error output for NodeScript runtime errors in Nodekit (

# # #
Screenshot of browser showing locahost with error message that shows the code around the error location and points out the error location with a red errow.

Full text of page:

Error: NodeScript runtime error

// (linked NodeScript bundle)

2: var node_script_default = async (request) => {
3:   const config = {
4:     payment: {
5:       provider: db.settings.payment.provider
6:     },
7:     dns: {
8:       domain: db.settings.dns.domain

TypeError: Cannot read properties of undefined (reading 'payment')
    at PageRoute.node_script_default [as nodeScriptHandler] (nodescript error in
    at PageRoute.lazilyLoadedHandler (file:///var/home/aral/Projects/nodekit/src/production/Routes/PageRoute.js:40:27)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Array. (file:///var/home/aral/Projects/nodekit/node_modules/tinyws/dist/index.js:1:352)

I've put together a survey about the Small Internet (#, #, individual webpages, small community sites) and I would love your input. If you are a small internet user, please spend a few minutes and fill in your thoughts. I'm especially interested in the open response questions. This will help inform an upcoming conference talk I'll be giving at

Also, please boost this on fedi as much as possible and feel free to re-share on other social networks and in other communities. The more responses the better.

# #

The Small Technology Foundation researches and promotes online services designed for human beings rather than corporate profits.

You can follow their live streaming account at:

➡️ @fedi

and to see more general posts on related topics follow their co-founder Aral Balkan at:

➡️ @aral

The Small Technology Foundation's website is at:

# # # # # # # # # # # #

Really love how our Owncast site is looking (if I do say so myself) :)

Also, remember that you can set up Owncast on a VPS with the following Site.js command:

site enable --owncast

That’s it.

It’ll be up and running with automatic TSL certificates and everything. You just need to sign into the admin, change your password/stream key and maybe take a few moments to customise your site info :)

# # # # #
Screenshot of in a browser. There’s a colourful banner wiht stylised photos of Laura and Aral talking into tin cans. The Followers (26) tab is active showing the latest followers from the fediverse.

To keep track of all our live streams, including Small is Beautiful tomorrow with @gabek, follow our Owncast from the fediverse via

# # # # #

Small Is Beautiful

I’m delighted to announce that @gabek will be joining us this Thursday at 5PM Irish Time (UTC+1) to talk to us about Owncast, federation, and why we should be shipping software not code (

Mark your calendars.

Also, follow us on the fediverse to get updates about all our live streams from

# # # #
Laura and I with tin can telephones to our ears in front of a background of pastel colour streaks. Text reads “Small is beautiful” is cursive.

I just updated our Owncast instance to the latest version using Site.js and took the time to customise it a bit also.

And you can now follow updates about our streams from the fediverse – just use the follow button on the link below :)

# # # #

Site.js version 17.7.1 released

This is a patch release that fixes a bug with Site.js’s HTTP Proxy server which meant that Owncast’s federation features were not working when installed through Site.js

# # #

Anyone know of an ActivityPub validator that I can just point to a site?

I’m trying to debug why Owncast’s federation features are not working when installed via Site.js and hitting a brick wall. Capturing https traffic, it doesn’t look like a remote follow request from Mastodon is hitting the server.

I’m pretty sure the problem is with Site.js’s HTTP proxy settings but not sure what.

This stuff is ridiculously complex to debug. How do y’all do it?

# # #

Site.js version 17.7.0 released

Updates the version of Owncast installed to 0.0.11 (this is the version that has fediverse features).

To setup and run your own Owncast server:

1. Install Site.js on a VPS (this is one terminal command)

2. Run: `site enable --owncast`

3. There is no three. You now have a server with auto-configured TLS running Owncast. Stream away! :)

# # #

We use Owncast for our Small is Beautiful streams at Small Technology Foundation (every third Thursday) and for any other one-off streams we do.

# # # #

Site.js version 17.6.0 released

This updates the automatic Let’s Encrypt (LE) functionality to ensure that certificates can continue to be provisioned and renewed past the breaking change LE will implement on September 15, 2022.

(Site.js is a small web server that we use to run all our own sites at Small Technology Foundation and personally.)

# # #

@small-tech/https versions 3.1.0 (ESM) and 2.2.0 (CJS) released.


- Use latest Auto Encrypt dependency to avoid certificate provisioning/renewal breaking in mid-September of this year.

@small-tech/https is a drop-in standard Node.js HTTPS module replacement with both automatic development-time (localhost) certificates via Auto Encrypt Localhost and automatic production certificates via Auto Encrypt.

# # # # #

Auto Encrypt versions 3.1.0 (ESM) and 2.3.0 (CJS) have now been released.


- Certificate signing request (CSR) now uses SHA-256 instead of obsolete SHA-1 which Let’s Encrypt will stop accepting as of September 15, 2022

Auto Encrypt is a library that adds automatic Let’s Encrypt provisioning to your Node.js servers. Your TLS certificates are automatically provisioned the first time someone hits your server.

# # # # # #

Phew, finally merged my “major refactor” NodeKit branch into main. The previous main branch is now archived in the prototype branch.

Only production mode is functional right now but it’s a maintainable codebase (not like the jumble the prototype was as I was working to get things working for the first time).

Also: So. Little. Code. 😍

Now to add more tests and the development mode server functionality as I go.

Yay, progress! :awesome:👍

# # #

Folks: “Oh, Small Web, isn’t that like Geocities?”

Meanwhile, my code: …

Screenshot of suppress-experimental.cjs file open in Helix Editor in GNOME Console:

// We know we’re using experimental features here as the whole system is based
// on them. And we document it, so no need to also mess up the console output.
// Requires Node to be started with:
// NODE_OPTIONS='--require=./suppress-experimental.cjs'
// Original method by Corey Farrell worked up to Node 16.x.
// (
// Current method based on the method used in Yarn works in Node 17+.
// (

const originalEmit = process.emit;

process.emit = function (name, data, ..._args) {
  if (
    name === 'warning' &&
    typeof data === 'object' && === 'ExperimentalWarning' &&
      data.message.includes('--experimental-loader') ||
      data.message.includes('Custom ESM Loaders is an experimental feature') ||
			data.message.includes('The Node.js specifier resolution flag is experimental') ||
			data.message.includes('Importing JSON modules is an experimental feature') ||
      data.message.includes('VM Modules is an experimental feature') ||
      data.message.includes('The Fetch API is an experimental feature')
  ) {
    return false

  return originalEmit.apply(process, arguments)

And, of course, you can go beyond attempting to simply mitigate economies of scale in systems designed to encourage them by designing systems that are inherently _hostile_ to economies of scale.


Through designing systems that use single-tenant servers owned and controlled by individuals as always-on nodes to provide findability and availability in an otherwise peer-to-peer topology.

# # #

Small is Beautiful – live stream, today at 5PM Irish Summer Time (UTC+1)

Journeys in Linux: Moving to Fedora Silverblue 36, Distrobox, and Helix Editor.

# # # # # # #

A web site designed for one person that aggregates functionality (don’t thing “app” but plug-in style “features”) is the idea behind the Small Web:

# # # #

The fediverse is federated so you can speak to anyone on any other instance. An instance of one means that you don’t have to moderate anyone else, just yourself.

Take that as a core tenet and you have the # (which doesn’t have to use ActivityPub but could interoperate with it if desired).

It’s not about not getting challenged. You can get challenged all you like (as anyone you haven’t blocked can reply and challenge you). And, as I said, no one is forced to listen to you either as anyone can block your account or the whole instance.

But what it does is correctly model personhood, which the “servers of many” model doesn’t.

It’s the small tech/web philosophy. Communities are made up of individuals. That’s what we model.

# #

Only I’m not an admin. It’s an instance of one. The only person I’m administrating is me. (As it should be.)

# # # #

PS. I’m the only person on my instance. It’s an instance of one.

# # #

Think you are making a reference to @aral (and by extension to @laura ) wrt # and # here?

The wonderful realization that # and in fact that # 🤯