🥳 New Kitten Release

• Implement garbage collection timeout for unconnected pages

Added a timeout to KittenPage instances so that if they do not connect within 10 seconds, they are garbage collected.

This is to avoid a memory leak in the scenario where a person rapidly refreshes a class-based (state maintaining) Kitten page. In such a scenario, the almost instant page lifecycle does not allow enough time for the page’s default WebSocket to connect and disconnect from the client. As we normally garbage collect pages when their default WebSocket disconnects, this leaves the page object in memory, creating a memory leak.

Enjoy!

https://kitten.small-web.org

💕

#Kitten #KittenReleases #SmallWeb #SmallTech #bugFix

Kitten: Home

🥳 New Kitten Release

• Fix: Events on `KittenComponent` hierarchies are now bubbled in reverse (from children down to parents). This provides for predictable event firing in cases where parents might emit events (e.g., a page emitting an event from its `onConnect()` handler). Your existing code should work as before with certain edge cases that might have broken before no longer breaking.

Enjoy!

💕

#Kitten #KittenReleases #SmallWeb #SmallTech #web #dev #events #serverSide #eventBased #components #hypermedia #streamingHTML

🥳 New Kitten Release

• `KittenComponent` (and thereby `KittenPage`) gains an `emit()` method.

Use this to bubble events from your page to all child components or from any component to all of its child components.

This is useful, for example, for setting the state of a page or a component where each child component knows how to present itself for that state.

(That, in turn, is useful if you want to be able to restore state based on URLs.)

The naming convention-based mapping of event names to event handler names is the same as for the events you receive from the client. So an event called `myEvent` will result in `onMyEvent` handlers on child components being called.

(Also update @small-web/kitten to version 7.1.0 to get language intelligence for the new method.)

Enjoy!

💕

#Kitten #KittenReleases #SmallWeb #SmallTech #web #dev #events #serverSide #eventBased #components #hypermedia #streamingHTML

🥳 New @small-web/kitten (Kitten globals) release.

• Improved type information.
• Now plays nice with tsconfig.json and tsc.
• Adds `rawBody` to `KittenRequest`.

This is not really a breaking change (in that it won’t break your apps) but I’m releasing it as a major version update so as not to surprise you if you notice the type information is different (more detailed than before).

To update in your kitten apps:
npm install @small-web/kitten@7

For more information on how to use this module, see the Kitten Type Safety tutorial:
https://kitten.small-web.org/tutorials/type-safety/

Full change log:
https://codeberg.org/kitten/globals/src/branch/main/CHANGELOG.md#7-0-0-2026-03-19

Enjoy!

💕

#Kitten #KittenReleases #SmallWeb #SmallTech #web #dev #typeSafety #JavaScript #JS #nodeJS

Kitten: Tutorials

🥳 New Kitten¹ Release

• Fixes: Page infinitely refreshes if class does not extend `kitten.Page`

Kitten now shows a helpful error message for this authoring error.

(The issue was due to the page getting rendered without the necessary scaffolding provided by the base class for maintaining the web socket connection,. leading to Kitten thinking the socket connection had failed and triggering a reload to reestablish it.)

Full changelog of today’s updates: https://codeberg.org/kitten/app/src/branch/main/CHANGELOG.md#2026-03-18

Thanks to @joshhatesgithub (https://codeberg.org/joshhatesgithub) for discovering and reporting this last night.

Enjoy!

💕

¹ https://kitten.small-web.org

#Kitten #KittenReleases #SmallWeb #developerExperience #bugFix

app/CHANGELOG.md at main

app - A web development kit that’s small, purrs, and loves you.

Codeberg.org

🥳 New Kitten¹ Release

• Adds `rawBody` to non-multipart POST requests.

This property, which is a Buffer, is necessary if you want to verify signatures (e.g., for webhooks).

I had to fork express-busboy as they already ruled out adding it. The fork (@small-web/kitten-busboy²) also allowed me to type the middleware extension point for Polka³ instead of Express (Kitten uses Polka) so that’s one @ts-ignore removed (hey, dev is a string of little wins) :)

Change log: https://codeberg.org/kitten/app/src/branch/main/CHANGELOG.md#2026-03-18

Caught a bug and feeling a little under the weather at the moment (nothing major, mom and dad – no need to worry) so apologies if I’m not responsive here.

Enjoy!

💕

¹ https://kitten.small-web.org
² https://codeberg.org/kitten/busboy
³ https://github.com/lukeed/polka

#Kitten #SmallWeb #KittenReleases #busboy #polka #express #bodyParsing #middleware #NodeJS #web #dev

app/CHANGELOG.md at main

app - A web development kit that’s small, purrs, and loves you.

Codeberg.org

🥳 New Kitten¹ Release

• Fixed: Errors in a project’s _main.script.js_ now cause a hard crash without retry attempts. The errors are also now better classified and communicated.
• Housekeeping: Removed unmaintained dev dependency, updated supported ES versions to esnext and simplified jsconfig.json.

Full change log:
https://codeberg.org/kitten/app/src/branch/main/CHANGELOG.md#changelog

Enjoy!

💕

¹ https://kitten.small-web.org

#Kitten #KittenReleases #SmallWeb #SmallTech #web #dev

app/CHANGELOG.md at main

app - A web development kit that’s small, purrs, and loves you.

Codeberg.org

🥳 New Kitten release

Several but fixes, thanks to wunter8 (https://codeberg.org/wunter8):

• Default socket doesn't work when testing with a local mobile device (https://codeberg.org/kitten/app/issues/310)
• Apostrophes in the text content of <if> tags can cause problems (https://codeberg.org/kitten/app/issues/312)

Also, there’s now a canonical place to initialise state-maintaining child components when using the new (and still undocumented) class-based Kitten Component system. Until it’s all documented, please refer to this:

https://codeberg.org/kitten/app/issues/311#issuecomment-11126516

Enjoy!

💕

#Kitten #KittenReleases #SmallWeb #SmallTech

wunter8

Codeberg is a non-profit community-led organization that aims to help free and open source projects prosper by giving them a safe and friendly home.

Codeberg.org

🥳 New Kitten Release

I just reworked the fix for this to simplify the Kitten renderer (as this fix introduced a regression with components getting instantiated multiple times due to the fall-through logic between asynchronous and synchronous rendering). The renderer now treats every component render function as asynchronous, thereby avoiding the issue entirely.

https://kitten.small-web.org

Enjoy!

💕

#Kitten #KittenReleases #SmalWeb #SmallTech #web #dev #components #async #rendering

Kitten: Home

🥳 New Kitten Release

This one fixes a bug that you would have encountered had you had an asynchronous component (component with asynchronous render method) nested more than one-level deep within synchronous components.

(Kitten’s html renderer transparently supports both synchronous and asynchronous render methods.)

So, this (taken from my unit test), for example, works correctly now:

```js
class AsynchronousOtherName extends KittenComponent {
async html () {
await new Promise(resolve => setTimeout(resolve, 10))
return kitten.html`<i>Balkan</i>`
}
}

class SynchronousName extends KittenComponent {
/* NOT async */ html () {
return kitten.html`<strong>Aral</strong> <${AsynchronousOtherName.connectedTo(this)} />`
}
}

class SynchronousTemplate extends KittenComponent {
html ({ SLOT }) {
return kitten.html`[Before slot]${SLOT}[After slot]`
}
}

class MyPage extends KittenPage {
html () {
return kitten.html`
<${SynchronousTemplate.connectedTo(this)}>
<h1>This should render all at once after a short delay.</h1>
<p>Hello, <${SynchronousName.connectedTo(this)} /></p>
</>
`
}
}
```

Enjoy!

💕

https://kitten.small-web.org

#Kitten #KittenReleases #SmallWeb #SmallTech #web #dev #JavaScript #NodeJS #async #render

Kitten: Home