Kitten is the signature web0
framework by Aral by https://small-web.org by https://small-tech.org. Kitten inherits the federalization of web3, but the corruption and centralization of control is subtracted. Hence web0
.
In practice Kitten is a loosely federalizing web framework with an emphasis on gemini-style TLS authentication leaning heavily on Aral’s powerful expertise in case-appropriate design.
Two more descriptions of Kitten would be that it is an anti-Facebook, anti-Google web server expert system.
There is no need to serve javascript web pages - javascript happens to have been the language with obvious existing support for web(0), used for dynamically generating and serving arbitrary web pages.
Kitten’s running, strongly persisted application database is directly available to the dynamic page generation.
There is a clearly stated distinction between Kitten’s use of first party cookies for two known parties to have TLS authenticated sessions, in contrast to evil, parasitic third party data mining cookies. Contrast a restaurant you are visiting remembering your gluten sensitivity while preparing your food, in contrast to the Sirius Cybernetics Corporation’s Marketing Department tracking your gluten sensitivity. We want to have the former and not the latter.
Kitten has a strong emphasis on serving md markdown markdown pages.
While I respect that Aral wants to see lots of everyperson-style static markdown Kittens, this is lisp alien country.
Note that I am not a web designer, and I have just guessed that the following are things based on occasionally having visited websites before.
This is just the last way that I was using CLIM spec’s native graph support.
(defparameter *site-tree*
'((:body
(:article
((:h1 (:|screwlisp proposes a kitten|))
((:p (:|lispy gopher climate|))
((:p (:|Mastodon|))
((:p (:|What do I even do|)))))))
(:nav
((:h1 (:|list of links|))
((:item (:|this lisp kitten|))
((:item (|Aral's episode|)))))))))
(find-application-frame 'graphs :graph *site-tree*)
(require :spinneret)
(use-package :spinneret)
(with-html-string
(:body
(:article
(:h1 (:raw "screwlisp proposes a kitten"))
(:p (:raw "lispy gopher climate"))
(:p (:raw "Mastodon"))
(:p (:raw "What do I even do")))
(:nav
(:h1 (:raw "list of links"))
(:ul
(:li (:raw "this kittentroduction"))
(:li (:raw "Aral's episode"))))))
(with-open-file (out "index.page.js"
:direction :output
:if-exists :supersede)
(format
out "
export default () => kitten.html`
~a
`
"
(with-html-string
(:body
(:article
(:h1 (:raw "screwlisp proposes a kitten"))
(:p (:raw "lispy gopher climate"))
(:p (:raw "Mastodon"))
(:p (:raw "What do I even do")))
(:nav
(:h1 (:raw "list of links"))
(:ul
(:li (:raw "this kittentroduction"))
(:li (:raw "Aral's episode"))))))))
export default () => kitten.html`
<body>
<article>
<h1>screwlisp proposes a kitten</h1>
<p>lispy gopher climate
<p>Mastodon
<p>What do I even do
</article>
<nav>
<h1>list of links</h1>
<ul>
<li>this kittentroduction
<li>Aral's episode
</ul>
</nav>
</body>
`
Using eepitch.
eepitch-shell
cd path/to/my/kittens
kitten
this serves that over eepitch. Note that it is tls-first. I visited https://localhost
with eww:
screwlisp proposes a kitten
lispy gopher climate
Mastodon
What do I even do
list of links
* this kittentroduction
* Aral's episode
I think that’s a solid mouthful. I need some follow-up pages to do as well after all.
Hope to see everyone on the Mastodon!
and at the weekly show at 000UTC every Wednesday. Check the Mastodon.
Aral Balkan - small-web.org and kitten :0UTC_Wed_30April_2025: