Rolling retrospective



  1. High-quality critique
  2. Critique sandbox / options
  3. Journal

Language: mostly English, some Norwegian.

“Should I read this?” Probably not. Dunno. Make up your mind, feel free to ask me a question :)


Attention is aimed here. success metric: strong language

I want to use to power up my language.

Source code listings are BAD

Just look at Recursive document transformations with Pandoc and Clojure.

  1. Hard to disambiguate code listings from text
  2. Code listing syntax highlighting has horrible contrast with the rest of the text.

I feel like I want to ask Oddmund for help / advice.

CSS pain points

I want to learn CSS. I want to use to learn CSS. As of 2022-08-20, Pandoc controls the CSS, and I don’t have too much leverage.

I cannot easily customize the CSS without building everything from scratch.

Pandoc provides CSS to me. But I want to configure stuff myself too. Does that mean I have to write all the CSS from scratch?

What is a good first step? Should I understand how the existing CSS works first? Or should I just remove it all and start from the start?

  1. Why just remove it all

    I can be okay with it looking a bit crap. I need to take responsibility for writing the CSS myself I want to become good at CSS at any point.

  2. Why tweak

    Pandoc’s look is good right now. And I can move incrementally. I don’t have to redo everything.

Tables are too narrow

I cannot use tables effectively. They wrap way before they are useful.

Example of a bad table:

the whole site is narrow

Here are two example lines from

I sometimes write bad commit messages. Here on, I write particularly bad commit messages. See for yourself:

That’s 68 characters.

Here are some example lines from

Mastodon, inspired by GNU social, together with Pleroma, form the most popular components of what we know as the “Fediverse” today. All of them are, in essence, federated, free software Twitter clones, interoperable with each other via the ActivityPub protocol.

That’s up to 95 characters.

Source code blocks are too narrow

And for source code, Drew DeVault is using an even smaller font. The article Porting Doom to Helios has some source code. Here are some of the longer lines:

static size_t writecons(FILE *f, const unsigned char *buf, size_t size) {
    sys_writecons(f->wbase, f->wpos - f->wbase);
    sys_writecons(buf, size);
    f->wend = f->buf + f->buf_size;
    f->wpos = f->wbase = f->buf;
    return size;

I think the source code too is meant to reach about a 100 characters in width.

A shallow link just points somewhere. A reified link carries meaning and metadata.

Cross site linking with org-roam.

So … getting Org-roam to find links here was easy. Just set the root dir, and add ID properties for each page that should be indexed.

Status: links are working in Emacs. Links are not working on the web. Why? I’m using Pandoc to parse org-mode links, and pandoc doesn’t know how to handle id links. Perhaps I can solve this myself with a filter? Hmm.


Filter architecture draft:

What would the “check in everything” approach mean?

  1. Simply link to folders
  2. Then simply manage that.

I wouldn’t be able to get the nice “straight to file” Org-Roam style navigation. But do I really need that?

I want reified links for

  1. Why reified links?

    Because I can model and query knowledge.

    A good first use case is being able to resolve the id: links I can insert with Org-Roam, like this: Feedback loops, interface design and how stuff works.

    1. Challenges

      Can I get the links out with Pandoc JSON and a Clojure filter with a walk? I think so.

      And how should I represent the links?

      Well, there’s not only the links. I need to resolve the links. Hmm, that could mean extracting links. And links could have some kind of ID. What if I simply keep the original link target, and use that as an ID? But … linking to the ID of a page and linking to the path of a page is different.

      ;; here's a link to this page:
      {:id   "658447a3-00e6-44aa-963e-d2f5938c50d3"
       :host ""
       :path ""}

      No, actually, that’s not a link. That’s a link target. If I want that as an entity, I’ll need … an ID too? Hmm.

      What can differentiate the links?

      ;; here is this page:
      {:id   "658447a3-00e6-44aa-963e-d2f5938c50d3"
       :host ""
       :path ""}
      ;; What does the link to this page look like?
      {:target/id "658447a3-00e6-44aa-963e-d2f5938c50d3"
       :source/id "abc123"
       ;; what's link ID?
       ;; what's link type?
       ;; What kind of link types can I have?

      How do we know the difference between one link and another?


      • source, target and increasing number
      • just source and target


      • I don’t control Org-mode’s UI. So I can’t add a link ID there. I probably don’t want to keep track of link IDs that detailed either. As long as I’m using plain text. Or … add a ?referrer=abc123?
    2. referrers not allowed

      Here’s some verbatim org-code:

      I tried linking to id:abc123?referrer=123 rather than id:abc123, but to no avail. How about linking to id:abc123#referrer-123? Nope.

I want to tag each article with :generality :novelty :precision :subjectivity

axis as 0 as 1
:generality event physical law
:novelty known by all known by 1
:precision dream logic
:subjectivity event taste

I believe reified links can model knowledge well. And on top of that model, we can build better UIs.

Here’s what an UI could look like:

how can i improve front page attention design?

i want a new category - not indexed

Relevant for example for external references.

so perhaps a :type :reference? :reference-target #{:book :web-essay ,,,}

Cultivate and learn from how others are doing their stuff

Bra / spennende:

  1. Godt eksempel på hvordan man kan vise “ting som linker hit” nederst
  2. Veldig oversiktelig struktur
  3. Simon Wilson strukturerer notatene sine i underkategorier.
    1. Han bruker der jeg bruker
    2. … men der jeg holder meg til ett suffiks (feks /maksimal-opsjonalitet), bruker han kategori først (sqlite). Så … litt som jeg samler tematiske ting i journaler. Tror ikke han har kategorier i kategorier, men det er i alle fall kategori -> ting.

Bra / spennende:

  1. Han bruker siden til aggregering av podcaster. Jeg er interessert i noe sånt for meg selv.
  2. Siden ser ut til å ha login og et redigerings-lag rett i nettleser
  3. Støtter gemini.

Ideas from others

Patrick Dubroy on how to build ideas in a shared space:

Like it's just so much harder to achieve what SPJ describes here with systems work

— Patrick Dubroy (@dubroy) August 26, 2022

Renaming an article is a pain

Right now:

  1. Rename in
  2. Rename in play.edn
  3. Then run teod-play-refresh (SPC å r)
  4. Then update articles (accidentally) when a link to then is encountered.


  1. Reduce the renaming to a single action
  2. Introduce explicit dependency from a page to the other pages which it refers to
  3. When / if I redo the build system (remove Make), I’ll use that opportunity to:
    1. Extract page dependencies to data
    2. Use that data to trigger rebuilds & stuff.



Working with pandoc --standalone is causing problems

As long as I’m using the --standalone stuff, I’m making problems for myself. Example: I loose roundtripping. If I try to roundtrip with --standalone, I get double table of contents and double title. I don’t want that.

Found a walkaround for roundtripping: avoid writing title info

pandoc  \
    --standalone \
    -V title:"" \
    -i index.html \
    --filter \
    -o rickroll-ourselves.html

Specifically, -V title:"" makes sure the title isn’t set twice. Regardless, I think I want to control the standalone stuff myself.

I want - site previews

When I post a Twitter link, Slack is able to create a nice preview. When I post a link, there is no preview.

Table of Content is confusing


Solve with Pandoc filter?

Now, I use the –toc pandoc option:

pandoc -s --shift-heading-level-by=1 --toc --from=org+smart -H live.html -i -o

If I create my own filter instead, I can do something else.

Something like:

pandoc --from org+smart -i --to json \
    | ./play.clj transform --generate-toc --link-up  \
    | pandoc --from json -o


How to?

Examples of nicely formatted table of contents:

Solved problems


Problem definition

  1. They don’t link to the right place
  2. They even link to id:… things that don’t work

Hmm, prehaps href is better. 🤔

2022-08-19 - solved.

All org documents now get their links rewritten. The link rewrite filter is written so that it only rewrites the links it should rewrite.

I need to “contract” / “narrow” before publishing

Problem statement — how can I use this site to grow messy stuff AND share reasonable stuff with others?

Early view

The stuff that’s published on my site right now is a real mess. Mess how? In many ways. But the big one: the ideas are intertwined. There’s coupling. I could remove that coupling. Or at least attempt to remove that coupling.

2022-07-12 says hello

At the time that I wrote the text above, everything was one big lump.

Merely splitting between “feedback welcome”, “forever incomplete” and “mess” helps me A LOT personally.

2022-07-14 says hello

I’ve recently published two small things on the Clojurians Slack. First a bit about Emacs — how to use read-string, completing-read and let* to write tiny UIs. Then a Interaction value differential page.

Am I happy with the results?


Very much, actually. Every publish-action gave me some nice interactions. In the Emacs case, I simply copied from my notes and Emacs config and wrote a small, little Slack message. In the Interaction value differential article, I published something. And I liked what i published.


2022-08-20 consid er this solved!

I’ve cleanly separated between stuff that people should consider reading, and stuff that people should ignore.

Creating new pages

Currently, I hand-roll my own new-page creation. I could also hook my logic into Org-Roam’s templating system Details:

2022-08-20 I’m happy with how it’s working now.

Solution: write my own Emacs lisp library to control page creation and page search.

Really happy. I consider it solved now.

comment system

Option: Comments on Twitter. Option: Comments on Hacker News. Option: Comments embedded straight into the text - via Github pull requests.

Option: Comments as Github issues. Example:

2022-08-20 Just share on relevant Slack, where there can be comments

Comment system is the sharing mechanism. Don’t expect to find too many people “just cause”.

Date tagging

Problem statement — should I encode dates (created, edited) in the metadata model?

Early view

I want metadata for :changed and :created. First because I want to filter / sort. Then perhaps later because that metadata is nice to have.

2022-07-12 says pikaboo

Date tagging would be nice. But by what semantics? And why?

Reasonable question — which vague idea was created when? Which vague idea was edited last? I could use OS mtime for editing. Sync into play.edn. Have play.edn files partially generated. Or just pull it out from source at the right time? Do the :relations trick?

  1. I really like the idea of just using file modification times.

    buuut I don’t think those get checked into git

  2. Can I just use git blame perhaps?


    Git knows when the file was changed last

  3. Outline — on page creation + git blame

    On creating a new page, write :created (now)

    On creating the metadata table, file edit time by asking Git

2022-07-14 👀

Well — haven’t really taken this any further.

I kinda want dates for my ephemeral stuff. So that it’s easier to handle the very incomplete stuff. Or at least sort by creation date.

Hmm, let’s just add a :created timestamp.

I want to derive :last-modified from git history of org-file.


From #teodor-discuss (Iterate slack)


Hva vil jeg egentlig å få ut av en nettside?

Effektivt å skrive tekst. Kan gjøre det i vanlige tekstformater. Frittstående sider. Løs kobling, trenger ikke samme struktur overalt. Gjenbrukbare komponenter. Hele greia funker som en statisk side. Statisk html er sjekket inn i git. Lynraske bygg. Effektivt å jobbe med hiccup.

Effektivt å jobbe med ideer. Effektivt å lenke mellom ideer.

Lett å få inn ting jeg har tegnet. Feks på papir, remarkable eller i figma

Twitter… Trenger jeg å tenke på det? Kommentarer. Webmentions? Systemet jeg bruker i dag? Hacker news? Twitter? Jeg ønsker jo å kunne diskutere ting på Twitter Og det gir mening å ha invitasjoner til diskusjon på Twitter, samt invitasjon til å diskutere på Twitter på nettsiden.

Hva med unicad og blogging og artikler for sånt?

Approach: embed unicad I noe annet. Approach: bygg skriving rett inn i unicad.


Hva får jeg egentlig ut av en nettside som jeg ikke får her i #teodor-discuss? Tilgjengelig for folk utenfra Bedre på å redigere store ting Mer kontroll på presentasjon (også mer jobb)

Oddmund: Har du vurdert å bare skrive nettsida di i HTML?

Det er jo cirka det jeg gjør på Bare via hiccup

Kan laste opp rå html også, og det funker fint.

Ting jeg ønsker å skrive om: Ortogonalitet Feedback-loop + API-design + hvordan ting funker Eksempler på bruk av watchexec Noe dataviz

@oddmunds jeg har prøvd å skrive html direkte, men det føles som å gå i gjørme. Med hiccup har jeg i alle fall en skikkelig editor. Men jeg liker bedre å redigere tekst i gode formater for tekst (feks org-mode, eller markdown, til en viss grad)

Enda en side: Konvertering mellom Roam / html / hiccup / org-mode Litt usikker på om jeg får til det rett i browser. Trenger kanskje en tjeneste. En backend. Med pandoc og Clojure bør det ikke være alt for vanskelig. Men hvis jeg får opp noe sånt, kan jeg lett gå mellom formater.

Enda en side: Signaler, starting av prosesser, stopping av prosesser. Sigterm, sigkill, sighup (?) Kan lage en side i stedet for å lage presentasjon eller noe annet.

Principles collected

Effektivt å skrive tekst. Kan gjøre det i vanlige tekstformater.

Frittstående sider. Løs kobling, trenger ikke samme struktur overalt.

Gjenbrukbare komponenter.

Hele greia funker som en statisk side.

Statisk html er sjekket inn i git.

Lynraske bygg.

Effektivt å jobbe med hiccup.

Effektivt å jobbe med ideer.

Effektivt å lenke mellom ideer.

(Kanskje) mulig å bruke sammen med Clerk.


Man, I hate Mac stealing cmd+h. I want it to move stuff left in a hierarchy. But mac steals it to hide windows.

Outline collected


Feedback-loop + API-design + hvordan ting funker

Eksempler på bruk av watchexec

Unix-terminalen gir deg superkrefter

relatert til ortogonalitet relatert til watchexec relatert til signaler, starting av prosesser, stopping av prosesser, sigterm, sigkill, sighub

Noe dataviz

Konvertering mellom Roam / hiccup / html / org-mode

Signaler, starting av prosesser, stopping av prosesser. Sigterm, sigkill, sighup (?)

  1. Kartlegging av interesse 2022-05-13


    Likes: :raisedhands: * 5

    1. Pitch

      Idé til fagopplegg - graceful startup, graceful shutdown. Forklare signaler (SIGTERM, SIGKILL, …), håndtering av signaler, reagere på Ctrl+C. Eventuelt også liveness og readiness i Kubernetes. Hvis det hadde blitt arrangert noe sånt, ville du deltatt? (edited)

    2. Kommentarer

      Eilef - oh yes please! Henrik - kill -9 <pid>

Innovasjon - som forstått gjennom bundling og unbundling

eksempler på bundling eksempler på unbundling

verdi - arbeidsflyter verktøy - prismodeller


I hate pure URLs without context. But ideas are meant to be understood in context! So what’s the context? “Where can we go from here”? I want the relationships to be rich; a way of navigating in itself. An interaction mode, if you will.


Ideally, I want to use cloudflare pages for this. I’d like to use Cloudflare pages.


That requires some major changes, some changes that might break my email setup. So those are a bit dangerous, for now.


  1. Slowly move to Cloudflare for - but don’t do anything too rash to early.
  2. Just move over and see what happens, check whether mail breaks down or not.
  3. Don’t do it. Just keep the existing stuff.

If I just move over, what’s the worst thing that can happen? I can (I think) revert all changes I might be making.

Actionables - today

  1. Actually write a single piece (Org-mode), quickly compile to HTML
  2. Try move that domain over. Quickly roll back if anything breaks.

Let’s try move the domain

I was able to export a zone file from Gandi, and import for Cloudflare. Not everything worked.

Gandi line What? Imported? Reason
@ 86400 IN SOA 1653576353 10800 3600 604800 10800 Authority record Not imported. Should’t be exported.
@ 1800 IN ALIAS Not imported. Cloudflare doesn’t support ALIAS
@ 10800 IN MX 10 Fastmail setup Imported.
@ 10800 IN MX 20 Fastmail setup Imported.
@ 10800 IN TXT “v=spf1 ?all” Fastmail setup Imported.
b 10800 IN A Bakkemoen server Imported.
bakkemoen 1800 IN A Bakkemoen server Imported.
fm1.domainkey 1800 IN CNAME Fastmail setup Imported.
fm2.domainkey 1800 IN CNAME Fastmail setup Imported.
fm3.domainkey 1800 IN CNAME Fastmail setup Imported.
sandbox 1800 IN CNAME Subdomain for static site Imported.
subcons 10800 IN CNAME Subdomain for static site Imported.
workman 1800 IN CNAME Subdomain for static site Imported.
www 1800 IN CNAME Subdomain for static site Imported.


Models and metamodels


  1. I want an effective makefile
  2. That requires a model of how my stuff fits together
  3. That model should be explicit! In data. So that I can work on it.


Idea: playground.edn file in each folder. Contains information on how to build, and what dependencies we have.

More ideas

More ideas: Put declarative files around. playground.edn or something else. Use those to build up a model of how everything fits together. From that model (sqlite databse, plain file, etc), generate a makefile. Then we can just use the makefile.

Consider supporting compiling to a different folder than root. That way, we can separate cleanly between build artefacts that should be served, and all the other stuff. But that’s not for now.


I wanted to make a new page to explore what happens to code blocks. I was … well, I didn’t like it. There was friction. I couldn’t just create a new page and start writing. I had to think, consider, remember.

Perhaps I can create a CLI. ./playground.

./playground create-page explore

Learning from before

Previous structure:




What now?

Try to keep integrating it. Be grateful. Keep it simple. Reflect on taste.

I found my previous slide sources

Descriptive truth, presciptive truth was on

Options to the max:


Feeling the need for opt-in structure

Right now, I have multilpe separate files & folders - each separate, living on its own.

I’m feeling that the need for playground.edn has come.


Specifically - it could deliver a title for the main index. And I could separate drafts and incomplete work from other stuff.

If I was going to publish a Clerk document, how would I do it?


  1. make all of this a clojure project
  2. create a clojure project for clerk notebooks in a subdirectory - then copy the files out on demand
    1. Could perhaps have placeholder playground.edn files that point to the source
    2. Or notebooks/ could mirror “/” - so that notebooks/pendulum.clj is compiled into pendulum/index.html.
    3. 🤔

Case: tags.

Problem: I want to set feedback-interface-implementation to “ready for feedback”

Then I totally. slow. down.

I open feedback-interface-implementation/play.edn and … what do I do? What are valid tags? Hmm. Perhaps … I could try to make an M-x teod/play-add-relation that searches through all the other relations, and can add something similar.

For now, manual.

Flattening out the hierarchy

I moved doc/ into its own wip/ page.

Easier to allow exploring everything.

doc/ is going in here

It’s just retrospectives and meta commentary, really.


Finally fixed the makefile generation, yay!

  1. Don’t generate Makefile from Makefile — avoid potential race conditions.
  2. Make global index.html depend explicitly on each tiny index.html

Now, a single M-x teod-play-create-page gives me a nice, new place to work.



Yet another :)

POC Pandoc filter – DONE Nice Little UI For Finding Notes – DONE Ideas About ID Management – Done?

Ideas About ID Managment

  1. When creating new pages, put the ID both in the org-mode file and in the play.edn file
  2. ??
  3. Build a toplevel links.edn
  4. use that toplevel links.edn to lookup IDs

Meaning – we need a Pandoc filter in between our link generation.

Meaning we need to rewrite the builds for all the articles

If we want to do that incrementally, we need to make build system configurable


{:build-system :fix-links}


{:filters [:fix-links]}


{:pandoc-json-filters [:fix-links]}


Then I can experiment “off to the side” without breaking everything.

Org-mode errors

I’m getting some weird behaviror when I’m saving my org-files.

I suspect some combination of Org-roam and editing under narrowed subtrees.

Warning (org-element-cache): org-element–cache: (nil) Cached element is incorrect in (Cache tic up to date: “yes”) Resetting. If this warning appears regularly, please report the warning text to Org mode mailing list (M-x org-submit-bug-report). The element is: “(paragraph (:begin 783 :end 813 :contents-begin 783 :contents-end 812 :post-blank 1 :post-affiliated 783 :mode planning :granularity element :org-element–cache-sync-key (181517 . 783) :cached t :parent (section (:begin 783 :end 813 :contents-begin 783 :contents-end 812 :robust-begin 783 :robust-end 810 :post-blank 1 :post-affiliated 783 :mode section :granularity element :org-element–cache-sync-key (901 . 1580) :cached t :parent (headline …)))))” The real element is: “(paragraph (:begin 783 :end 814 :contents-begin 783 :contents-end 814 :post-blank 0 :post-affiliated 783 :mode planning :granularity element :parent (section (:begin 783 :end 814 :contents-begin 783 :contents-end 814 :robust-begin 783 :robust-end 812 :post-blank 0 :post-affiliated 783 :mode section :granularity element :parent (headline …)))))” Cache around :begin: (headline (:raw-value “Second step option: fix the links — rewrite from id: to path: and then href: to folder” :begin 690 :end 814 :pre-blank 0 :contents-begin 783 :contents-end 814 :robust-begin 785 :robust-end 812 :level 3 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 690 :title (#(“Second step option: fix the links — rewrite from id: to path: and then href: to folder” 0 88 (:parent (headline #1)))) :parent (headline (:raw-value “Org-roam id:… links are broken” :begin 478 :end 814 :pre-blank 0 :contents-begin 514 :contents-end 814 :robust-begin 516 :robust-end 812 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 478 :title (#(“Org-roam id:… links are broken” 0 32 (:parent (headline #3)))) :parent (headline (:raw-value “Synthesis” :begin 341 :end 8211 :pre-blank 0 :contents-begin 353 :contents-end 8211 :robust-begin 355 :robust-end 8209 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 341 :title (#(“Synthesis” 0 9 (:parent (headline #5)))) :parent (org-data (:begin 1 :contents-begin 1 :contents-end 10819 :end 10819 :robust-begin 67 :robust-end 10817 :post-blank 0 :post-affiliated 1 :path “/home/teodorlu/dev/teodorlu/” :mode org-data :ID “658447a3-00e6-44aa-963e-d2f5938c50d3” :CATEGORY “index” :parent nil :cached t :org-element–cache-sync-key (729 . -1))) :cached t :org-element–cache-sync-key (181517 . 341))) :cached t :org-element–cache-sync-key (181517 . 478))) :cached t :org-element–cache-sync-key (181517 . 690))) (headline (:raw-value “Second step option: fix the links — rewrite from id: to path: and then href: to folder” :begin 690 :end 814 :pre-blank 0 :contents-begin 783 :contents-end 814 :robust-begin 785 :robust-end 812 :level 3 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 690 :title (#(“Second step option: fix the links — rewrite from id: to path: and then href: to folder” 0 88 (:parent (headline #1)))) :parent (headline (:raw-value “Org-roam id:… links are broken” :begin 478 :end 814 :pre-blank 0 :contents-begin 514 :contents-end 814 :robust-begin 516 :robust-end 812 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 478 :title (#(“Org-roam id:… links are broken” 0 32 (:parent (headline #3)))) :parent (headline (:raw-value “Synthesis” :begin 341 :end 8211 :pre-blank 0 :contents-begin 353 :contents-end 8211 :robust-begin 355 :robust-end 8209 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 341 :title (#(“Synthesis” 0 9 (:parent (headline #5)))) :parent (org-data (:begin 1 :contents-begin 1 :contents-end 10819 :end 10819 :robust-begin 67 :robust-end 10817 :post-blank 0 :post-affiliated 1 :path “/home/teodorlu/dev/teodorlu/” :mode org-data :ID “658447a3-00e6-44aa-963e-d2f5938c50d3” :CATEGORY “index” :parent nil :cached t :org-element–cache-sync-key (729 . -1))) :cached t :org-element–cache-sync-key (181517 . 341))) :cached t :org-element–cache-sync-key (181517 . 478))) :cached t :org-element–cache-sync-key (181517 . 690))) (headline (:raw-value “CSS pain points” :begin 814 :end 2953 :pre-blank 0 :contents-begin 833 :contents-end 2953 :robust-begin 835 :robust-end 2951 :level 2 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 814 :title “CSS pain points” :mode nil :granularity element :org-element–cache-sync-key (181517 . 761) :cached t :parent (headline (:raw-value “Synthesis” :begin 341 :end 8211 :pre-blank 0 :contents-begin 353 :contents-end 8211 :robust-begin 355 :robust-end 8209 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 341 :title (#(“Synthesis” 0 9 (:parent (headline #3)))) :parent (org-data (:begin 1 :contents-begin 1 :contents-end 10819 :end 10819 :robust-begin 67 :robust-end 10817 :post-blank 0 :post-affiliated 1 :path “/home/teodorlu/dev/teodorlu/” :mode org-data :ID “658447a3-00e6-44aa-963e-d2f5938c50d3” :CATEGORY “index” :parent nil :cached t :org-element–cache-sync-key (729 . -1))) :cached t :org-element–cache-sync-key (181517 . 341))))) Disable showing Disable logging

Do want - a rofi launcher to quickly go to a page

possible architecture:

  3. (iterate knowledge protocol)
  4. (iterate knowledge protocol)

Providing both JSON and EDN is easy — and then it’s nice to consume from any language too.

Note, why do I even want EDN?

JSON would suffice. But … then I can’t just use clojure.edn/read-string. So yeah, I’m keeping EDN too, at least for now. Plus keywords. Keywords are great.

Getting some kind of “ctrl+k” working too would be neat.


  1. Read sitemap for current site
    1. Perhaps lazily on page load
  2. Provide a nice command thing launcher for navigation
  3. 🎉


elisp text

(message "hello, there")
(setq some-name "Dustyn")
(setq some-age 10)
(1,2, some-name, some-age)


Kvikne, here I come! 🚂

No live for root index

Let’s fix that.

Here’s a normal page:

# Generate target for each page
aphorisms/index.html: aphorisms/
    pandoc -s --shift-heading-level-by=1 --toc --from=org+smart -H live.html -i aphorisms/ -o aphorisms/index.html

Note -H live.html.

Here’s the index:

# Generate target for root index
index.html: index.clj aphorisms/index.html attention-design/index.html bitemporal-worldview/index.html capability-feature-assembly/index.html c-journal/index.html clojure-interactive/index.html curious/index.html discover-difference/index.html documentation/index.html document-transform-pandoc-clojure/index.html emacs/index.html feedback-interface-implementation/index.html fuse/index.html git-commit-messages/index.html grow-knowlege-together/index.html heterarchies/index.html inspiration-howto/index.html intention-relation-action/index.html interaction-value-differential/index.html interface-perception-design/index.html iterate-knowledge-archipelago/index.html journal/index.html knowledge-worker/index.html list-of-problems/index.html literature-notes/index.html lost-in-specificity/index.html maksimal-opsjonalitet/index.html many-small-functions-bad/index.html narrow-statements/index.html narrow-waist/index.html oggpo/index.html orthogonality-enables-optionality/index.html precise-general-novel/index.html product-for-developers/index.html purposeful-software-development/index.html rdf-intro/index.html sannhet-deskriptiv-preskriptiv/index.html shabakka/index.html software-architecture-as-language-construction/index.html software-architecture/index.html strong-relations/index.html thesis-antithesis-synthesis/index.html twitter-howto/index.html unix-signals-intro/index.html watchexec-make-dev/index.html why-dont-we-have-a-strategy/index.html wip/index.html

Gist: just ./index.clj.

Here’s from index.clj:

(spit "index.html" (slurp (:out
                           @(p/process '[pandoc --from org+smart --to html --standalone]
                                       {:in (org-markup {:pages (pages)})}))))

There we go.

Observation – we’re straying a bit from single responsibility principle here.

Let’s try this instead:

(spit "index.html" (slurp (:out
                           @(p/process '[pandoc --from org+smart -H live.html --to html --standalone]
                                       {:in (org-markup {:pages (pages)})}))))

That worked. Nice!

Language, math and programming are enabling skills, and should be treated as such

You can study the Norwegian language intensely and become a literature professor. Digging deeply into math might allow you to understand logic and inference more deeply than with any other field. Spending enough effort and reflection on programming and systems can give you an intuition for composition and modularity that’s hard to build otherwise.


Yet, language, math and programming provide

status — my org-roam links don’t work at all on the web.

Planned steps:

  1. Produce intermediate index.json with pandoc JSON representation of content
  2. This should be reflected in the makefile
  3. Then we can remake everything and be 100 % sure we don’t break anything

How is my battery? 91 %. I should probably connect a charger. That can wait a bit. Man, emacs has both M-x battery (interactive) and M-x battery-display-mode. Wow.


Problem — I keep creating journal-things that don’t quite … cut it

Not sure how I should tag this.

Here’s a WTF page:

{:title "A list of interesting problems", :readiness :wtf-is-this, :author-url "", :created "2022-07-14"}

Here’s a journal page:

{:title " journal",  :author-url "" :readiness :forever-incomplete, :form :rambling}



Why is there no

? I think there should be.


teod-play-form-unset removes :form
teod-play-form-rambling sets :form :rambling
teod-play-readiness-wtf sets :readiness :wtf-is-this
tead-play-readiness-forever-incomplete sets :readiness :forever-incomplete

Tag semantics:

:form UNSET Not sure about form yet
:form :rambling Date-oriented
:readiness :wtf-is-this Personal note
:readiness :forever-incomplete Evergreen



Idea - narrow files for cache.

Can then look up these files later. Aaand just easily generate all of them. Hmm. But – I want that metadata in the play.edn file.

{:uuid "b722664c-d310-4908-9b57-98ffd73833c9"
 :slug ""
 :title " Rolling retrospective & list of problems"}

Something like that perhaps?

But then I need to start writing the Org IDs to play.edn.

Does that happen on new pages now?

No, it does not.


I want to fix the links.


define a dry-run command

or, it doesn’t have to be a dry-run, it can just output. No mutation needed.

    | ./play.clj resolve-links

Should print some modified JSON.

Hmmm — realizing that I really want to work on this in terms of a Clojure pandoc library. Perhaps just try to work on it as a library from the start?

But should it be as its own thing?

pandop – stealing a bit of data oriented programming for the name.

yeah, just start in a repo. It’s easy to import & use that from babashka.


  1. Wrote a little Pandoc toolbox:
  2. Want to consume it
  3. Want that nice subcommand listing, but it … sucks, really.
Usage: ./play.clj <subcommand> <options>


page SLUG :title PAGE_TITLE


makefile [--dry-run]

index-by-uuid [--dry-run]
Usage: neil <subcommand> <options>

Most subcommands support the options:
  --alias      Override alias name.
  --deps-file  Override deps.edn file name.


  dep    Alias for `neil dep add`.
  test   adds cognitect test runner to :test alias.
  build  adds build.clj file and :build alias.
  kaocha adds kaocha test runner to :koacha alias.
  nrepl  adds nrepl server to :nrepl alias.

  add: Adds --lib, a fully qualified symbol, to deps.edn :deps.
    Run neil add dep --help to see all options.

How does neil’s helptext work? It’s handwritten.

What about the add command? Auto-generated!

(defn print-dep-add-help []
  (println "Usage: neil add dep [lib] [options]")
  (println "Options:")
  (println (cli/format-opts
            {:spec spec
             :order [:lib :version :sha :latest-sha :deps/root :as :alias :deps-file]})))

Here it is in use:

Usage: neil add dep [lib] [options]
  --lib                         Fully qualified library name.
  --version                     Optional. When not provided, picks newest version [...]
  --sha                         When provided, assumes lib refers to Github repo.
  --latest-sha                  When provided, assumes lib refers to Github repo [...]
  --deps/root                   Sets deps/root to give value.
  --as                          Use as dependency name in deps.edn
  --alias      <alias>          Add to alias <alias>.
  --deps-file  <file>  deps.edn Add to <file> instead of deps.edn.


I decided to just change the code directly rather than introduce indirection. Small, testable steps. Really liking that I can regenerate files, and just look at the git diff. AMAZING how Git enables incrementalism.


:) is just some code that generates some HTML

Not more. There’s a single indirection boundary. Information as written — indirection — published HTML. And that indirection is encoded in the CLI/Makefile — not in opaque CI.


There are downsides to inventing names for new pages

Giving something a name and an url is nice. Yet … at some point it clutters the attention design of

Actionable: don’t show everything up top

Actionable: clearly differentiate between seeds, foregin references and other stuff


Go to random page

I created a custom element!

It’s <random-page-button>. It works! But it doesn’t look like a link, at all. Click it and go to a random page.

Here’s the implementation:

// Some code to define a <random-page> web component

 async function get_index() {
   const index_url = "/index/big.json";
   return await fetch(index_url).then((response) => response.json());

 function random_item(items) {
   return items[Math.floor(Math.random()*items.length)];

class RandomPageButton extends HTMLButtonElement {
  constructor() {

    // Element functionality written in here
    this.addEventListener("click", e => {

      get_index().then((data) => {
        const item = random_item(data)
        window.location.href = "/" + item.slug + "/"

const buttonOptions = { extends: 'button' }

customElements.define("random-page-button", RandomPageButton, buttonOptions)

Am I happy with it?

  1. Absolutely! It solves a problem for me :)
  2. No! It doesn’t even look like a link. I extend the HTMLButtonElement class. But it doesn’t look like a button!!!

It’s a work in progress :)


I absolutely love fiddling with



skittle buttons

I thought I wanted custom elements. So I made some! But I realize that I do prefer to write Clojure rather than JavaScript. There’s a bit of a difference after all.

So let’s do just that. Scittle buttons, here we go.

file:scittle-buttons/ | file:scittle-buttons/index.html


fin dag.

Var gøy. Og vi er snart på


  1. grave i Interface, Perception, Design
  2. fikse randompage-lenken på rotsiden.
    1. det har jeg jo egentlig løst allerede: file:scittle-buttons/ | file:scittle-buttons/index.html

ønsker jeg å jobbe fritt eller smalt akkurat nå?


Så - se om jeg kan få gjort “gå til tilfeldig side”-knappen globalt tilgjengelig.

23:25 nope

endte opp med å skrive litt om Unicad og Excel.

til senere - vil grave i interface, perception, design og knapper.


on batching

Reading Precise, general, novel, I realize that I want an interaction mode I don’t have right now. I want to scan through multiple pages. Try to set some attributes.


  1. enable batch editing
  2. near the browser
  3. collections

I could define a data export I could “interop” with.

Then apply.

I would essentially need an action.

[:set :precision 0.2]
;; A
{:action :merge-meta
 :page-uuid "abc123"
 :meta {:precision 0.2}}

;; B
{:action :merge-meta
 :page-slug "precise-general-novel"
 :meta {:precision 0.2}}

;; but there are multiple pages.
;; Hmm
;; Not quite sure what to do about that.

trailing whitespace