Skip to main content


Items tagged with: SmallWeb

I could just work on improving these error pages for days but I’m going to stop here for now. I’m pretty happy with how they are now for the time being.

(Trying to learn not to go down rabbit holes.) :)

#kitten #smallWeb
Screenshot of browser showing a 500 error in a Kitten app . A cute little kitten plays with a ball of yarn (illustration). Heading: 500 ReferenceError: ONE_HOUR_IN_MILLISECONDS is not defined.

Underneath, there is a stack trace with the first section visible titled “From your app”. Below this is a syntax highlighted code snippet showing the line of code with the error as well as a look-around of the 3 lines of code to either side. It also states which scope the error was encountered in and its location (source file, error line, and error column). This is repeated for the prior stack frames.

I’m giving a (virtual) talk on Small Web at the Wizard Amigos Code Camp this Thursday, 5PM Irish time.

I’ll be demonstrating the latest state of development of Kitten ( and Domain ( and talking about how we must focus on topological decentralisation and tackle decentralisation from a non-colonial perspective.

#smallWeb #smallTech #WizardAmigos #web #dev #decentralisation #kitten #domain

With error pages this nice, you might actually want to introduce some bugs into your sites ;P

(Coming soon to Kitten… having a bit of Friday fun.) :)

#kitten #smallWeb #dev
Kitten 500 error page. Has a cute illustration of a kitten playing with a ball of violet yarn. The 500 text is in deep pink, the error “ReferenceError: pageNotFoundErrorTemplate is not defined” is in dark violet. Underneath, there is a stack trace section showing stack frames and the error location in a neat list.
Screenshot of Kitten 404 Page Not Found page. Large illustration of cute kitten looking at you sites on 404 in deep pink and “Page not found” in dark violet.

Oh, and I’ll be porting stuff like sessions back from Domain into Kitten so there will be out-of-the-box support for such basic functionality for any Kitten app. Building such things out in Domain first is helping me ensure that it’s fit for real-world use :)

#smallWeb #kitten #web #dev #sessions

I’m absolutely loving the experience of buiding Domain in Kitten. The best part is that it encourages progressive enhancement (aka building stuff for the web properly) and it’s great to see just how far things have come. You can do so much with HTML that you previously needed JavaScript for (e.g., see the inert navigation sections, that’s just the inert attribute).

Also, can’t wait to enhance it using htmx (& maybe even hyperscript) where necessary :)

#domain #kitten #smallWeb #smallTech
Screenshot of the Domain: Admin page. Left-hand-side navigation has an enabled General section with a highlighted Sign in page. The other sections (Setup and Places and their subnavigation) look disabled (faded out). The sign-in page has a password field that’s selected and a “Sign in” button.
Screenshot of Domain:Admin page. The navigation in the left-hand-side is the same as in the first screenshot but entirely active. The Setup > Organisation page is selected. A text input in the form labelled Web site is empty and has a browser-native validation error pop-up pointing at it with an exclamation mark and the message “Please fill in this field.”

I might be building Domain ( from scratch for the third time but it’s a joy to do so using Kitten ( and I think they’re both going to be better off for it.

Oh yeah, and there will be pink. LOTS of pink!

#smallWeb #kitten #domain
Screenshot of Domain index page design running in a browser. In an interface with violets and pinks. Header: A simple natural language interface (Mad Libs style) reads “I want my own (highlighted area) Kitten (end highlighted area) at (highlighted area with caret) meow (end highlighted area with caret) for €10/month. (Your new place will be ready in under a minute.)” Pink button:  Get started! Under the main interface reads: Already have a place? Sign in (link). Need help? Email Laura and Aral at The footer reads This is a Small Web host powered by Domain. It has the copyright notice and license (AGPL version 3.0) in smaller print.

Just implemented a fix for Kitten commands not exiting properly (regression from the new development-time process manager).

Things should be much smoother now. (Also, your pages will auto-refresh in the browser after you fix an error and save the page and/or a dependency of your page.)

#kitten #smallWeb #web #dev

It’s lovely to see projects like using Auto Encrypt (@small-tech/auto-encrypt). If you know of any others, do let me know. I’d love to mention them in the readme and in my talks.

#autoEncrypt #smallWeb #smallTech #tls #https #letsEncrypt #web #dev #nodeJS

Folks, if you’re using @small-tech/auto-encrypt in your projects, please make sure you’re running the latest version of the package (3.1.0) or certificate provisioning/renewal will fail due to the latest Let’s Encrypt protocol update.

#tls #https #letsEncrypt #autoEncrypt #js #javaScript #nodeJS #web #dev #smallWeb #smallTech

If you missed our Small is Beautiful live stream with special guests @tychi and Michael Toomim, you can now watch the recording at:

(We talked about Small Web, Kitten, DWeb Camp, and Braid.)

CC @laura

#SmallIsBeautiful #SmallWeb #SmallTech #web #dev #decentralisation #kitten #DWebCamp #braid #protocols #video

Join Laura, me, and our special guests TyChi and Michael Toomim live in one hour (5PM Dublin Time; UTC+1) to talk Small Web, DWeb Camp, and Braid (the HTTP synchronisation protocol).

#smallWeb #smallTech #dWebCamp #braid #HTTP #web #dev #liveStream #owncast

Join us for our live stream tomorrow at 5PM Irish time (UTC+1) with special guests @tychi and Michael Toomim to talk about Small Web, the recent DWeb Camp and Braid. I will also be demonstrating the latest Kitten updates.

Full info:

Stream link:

CC @laura

#SmallIsBeautiful #liveStream #kitten #dWebCamp #Braid #SmallTech #SmallWeb

Note: if you already have Owncast installed via Site.js, please follow the upgrade instructions for 0.0.11 instead of installing it again using Site.js so as to keep your database, etc.

#owncast #siteJS #smallWeb #smallTech #liveStreaming

Site.js 17.8.0 released.

- Updates the version of Owncast installed with site enable --owncast to the latest (0.0.12)

#owncast #siteJS #smallWeb #smallTech #liveStreaming

Maybe Kitten will be ready for use by then ;)


Meow! Kitten now has hot reload 😺

It’s still early days but if you want to play with the tutorials/examples, it should be a far better experience now.

In the end, I went with a tiny custom Node cluster-based process manager and a WebSocket that detects reconnections and requests a page reload. Simplest thing that could possibly work :)

(I’m planning on improving the developer experience further by removing the page refreshes soon.)

#kitten #smallWeb #linux

Can I trouble you to help me out with something? I typically work on really low levels systems stuff, so I don't have a lot of intuitions for web technology. What would a person use JSDB for? I've been following #SmallWeb stuff but I'm just out of my element.

Just released JavaScript Database (JSDB) version 2.1.0

Added: exposes compactOnLoad and alwaysUseLineByLineLoads options to

(JSDB is a zero-dependency, transparent, in-memory, streaming write-on-update JavaScript database for the Small Web that persists to a JavaScript transaction log.)

#JSDB #javascript #js #database #SmallTech #SmallWeb

So what do y’all think about this for all the code you need for a basic POST/redirect/GET guestbook web app with Kitten?

Does it all make sense?

Basically, you run kitten on that directory and hit https://localhost.

(Note: Kitten is not ready for use yet. I think the core design is solid now though. You can play with it but I’m only starting to work on the developer experience now. Should be far nicer in the next few weeks.)

#kitten #web #dev #smallTech #smallWeb

JavaScript Database (JSDB) version 2.0.6 (ESM) and 1.2.3 (CJS) released.


- Crash when key contains single quote
- npm warnings


ESM: npm i @small-tech/jsdb
CJS: npm i @small-tech/jsdb@cjs

(JSDB is a zero-dependency, transparent, in-memory, streaming write-on-update JavaScript database for the Small Web that persists to a JavaScript transaction log.)

Learn more:

#JavaScriptDatabase #JSDB #SmallTech #SmallWeb #database #dev #web #js #NodeJS #JavaScript

Just got deployments working on Kitten for the first time. This little kitty is shaping up just fine (still have loads to do before it’s ready for general use but it’s getting there) :)

#kitten #smallWeb #smallTech #web #dev

Small is Beautiful #21: Lipstick on a Pig and what it can teach us about the most important lesson in design.

If you missed today’s live stream, you can watch the recording here:

#SmallIsBeautiful #smallTech #smallWeb #design #video

Auto-encrypt localhost version 7.1.0 released

(Automatically provisions valid localhost certificates for Node.js development servers.)

Added: support for automatic NSS Tools (certutil) installation on Fedora (via dnf)

#smallTech #smallWeb #TLS #localhost #autoEncryptLocalhost #foss

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.

# #