Page browser
An important aspect of a note taking app is browsing notes you have already written. For daily notes, I have a daily, weekly and monthly overview. I collect individual blocks into pages by tagging them. However, browsing the pages is actually fairly difficult! One reason I liked non-linear notebooks is you can kinda hide away the chaos of tags and just claim "you search it on demand". I can just summon a page when I need it.
This masks the fact that I completely lose track of my pages within a week. I will first share the current state of page browsing, follow up with issues I had with scaling this approach, and end with a solution I was happy with.
What we have (is slop)
I don't like folders, and I tried a tree-like structure but you can see the pagination kick in making the page browser a fairly bad overview. The styling also doesn't match the new aesthetics, but that is secondary. I thought pinned blocks are important, journal pages are important and deserve their own tab. I also tried different modes including graph view. One of my first thoughts about lifelab was not god damn graph gimmick, but I chickened out and vibed it in anyway. Yeah. it is pretty bad.
Pinned blocks:extracted_text:
Image
:EXTRACTED_TEXT:(16 lines)
16 lines·261 charactersCopy
[todav]
xP ?ump xoP run
Pages
O Pages 551 # Journal 2852  Pinned 8
Filter 8 pages.
t navlgate collapse/exand Entepn rname Tab st Tabunnest  add subpage  pin/unpin z00m i
OD
 List E Outliner  Granh  Group Name
bloa
code
paper
oroiects
lifelab
shopping
show
tasks
:END:
500 pages:extracted_text:
Image
:EXTRACTED_TEXT:(38 lines)
38 lines·402 charactersCopy
Pages
Filter 551 pages
NAME
anilist
anime
Anime Tracker
apartment
api-doc
archerv
blOC
bOoK
capture-template
code
anilist/
callback
anime
Clevatess: Majuu no Ou to Akago to Kabane no Yuusha
Frieren: Beyond Journey's End Season 2
JUTCELIACENCSO.TheCrI!
1-100 of 551
? Pages 551  Journal 2852 ? Pinned
B List  Outliner  GrahGroup  Name
UPDATED
2ma
5mo
1mo
1mo
2mo
5mo
5mo
1mo
1mo
5mo
2mo
5mo
1mo
1mse
456
:END:
Graph view:extracted_text:
Image
:EXTRACTED_TEXT:(42 lines)
42 lines·633 charactersCopy
(today]
Jump xop rur
Pages
? Pages 551  Journal 2852 ? Pinned
Q Filter 551 pages.
101 pages 3 links_group:blog (0 backlinks)
Pietrach a too
C
B List E Outliner  Graph Group Name
Group by amespacFit
taa
roup:bloc
.0 ?
Finaty he the lah
Ne fovet HTML
picM conoept exn
e
12t
MLengineur Csf appendd trst
tadama Buterty Wike up ge oranun
5 0
el Te
.OC
Im Con
Jnshk softo rece 7 1t
tat i
inelve lnanonThn ccurnai
bottom b
ot ofommodh ahe etab TiodAntOrC
 Tio
elet
Webs
a voe of Al  What goee amn Paranormal Actvtr w et
hit doue
t
Hetne ta b wrot
Pra 123 Prague 1113 Praoue 17 18 Prsous4s
aet buufe
?
bage brouser Iab 
a eventind o
atis iat
:END:
How to visualize something with no structure
I had claude mock up a ton of html demos to salvage this but I kept hitting the same issue. Claude assumes the concepts have some semantic value, but I don't. From my perspective, we can be taking notes about people, or anime, or mosquito DNA sequencing experiments, or Apple Intelligence feature localization. We can collect any kind of tags with any kind of nesting. The only opinionated thing I introduce is mandatory daily view and a sense of timeline. I don't want to force anyone to have person as a concept nor is there any reference in the code for it.
Maybe... I should not be doing this
I rephrased the problem of "how can this thing serve anyone" to "how do I make anyone help themselves" and the answer was fairly obvious: just code it yourself! Right now pages endpoint is a dedicated, 5k JS line long react component that queries the database and renders these horrendous views in the 3 screenshots above. Instead, it should.. just be a page. With code blocks that query the database! Users can modify it to their liking and I don't have to deal with it. One addition I made was a 2D grid view (where all the blocks are rendered on a grid instead of sequentially. Any page can turn this view on)
I added 2 default code blocks, which users can modify, and they are free to use the nb.graph API to make something nicer than the grotesque solution I came with. The drawback is each block does a separate database query, and if you are not careful it can be very wasteful, but I decided to pay this cost to have less custom UI.
Do it yourself and leave me alone:extracted_text:
Image
:EXTRACTED_TEXT:(53 lines)
53 lines·789 charactersCopy
Pages
(all]: May 14:
Overview
Recent 15 pages
TITLE
Pages
coTumns
table
table
iournal/2926-04-29
journal/2026-04-36
journal/2926-04-28
journal/2026-04-27
journal/2026-05-01
journal/2026-05-17
journal/2026-05-16
iournal/2026-05-12
: journal/2026-05-14 > Run All pages
-ilterNamespaces 8 age Filter...
TITLE
goedel
ello
journal
ifelah Tutorial
neople
bersor
rompt
svstem
: journal/2026-05-14: > Ruh
Filter...
Al1 pages 15943 nages
TTTLE
Pages
columns
page table
tab1
table
journal/2026-04-29
journal/2926-04-30
journal/2026-04-28
journal/2026-04-27
journal/2926-05-01
iournal/2026-05-17
journa1/2026-05-16
iourna1/2926-05-12
pre
page.
tah
1-25 of 15943
next
:journal/2926-05-14: > Run
Tip: nb.get pages() lists every page; ui. render dispatches to any installed renderer.
Customize this page
:END: