Every essay I have published — 103 of them, in English and मराठी, from 2020 to 2026 — read the way a machine reads them: as a chart, a night sky, a fingerprint, a habit of the hand, a letter across years and a poem. This deck is its whole story: the first version, the redesign, how the data is made, what broke, and the narrated tour.
Arrow keys, Space or the rail below move between slides; R replays a slide's drawing; #12 on the address opens slide 12. Jump to a part:
One dataset — 103 essays, 1,10,574 words, 8,007 sentences, Substack and WordPress — and six chapters that each ask it a different question. Every mark is an essay, and every one opens.
Where does each essay sit among the others? A chart placed by meaning.
IIWhat shape does an opening line make? One star per word.
IIIWhat is left when the words are gone? Punctuation on a spiral.
IVWhat do I say without noticing? Habits, and a guess-the-year game.
VHas a later essay answered an earlier one? Pairs found by meaning.
VIWhat do five essays say together? Lock a line, shuffle the rest.
The page launched as a new room in the site's Scriptorium. Everything the redesign kept was already there: the data, the six ideas and an Ask chat pinned to any essay.


The Logbook stands on the chatbot's index, so a bug there was a bug here. Eight minutes after launch came a patch.
Every night the index lost 509 Substack body chunks that a local run had embedded.
Substack answers GitHub's runners with a 403 — API, bodies and RSS alike — so the nightly text cache held only the 29 WordPress essays, and indexing deleted the rest.
The cache lists what it lacks in missing; the essay source sits the run out with keep: true; npm run logbook keeps the last good file.
The redesign treats the page as a field journal you read front to back: a cover, a short prologue, a contents page, six chapters, an index and a colophon. Any essay opens as a page of its own, slid over the chapter you found it in.
The cover is the chart itself. A vermilion route runs through all 103 essays in the order they were written, inked in when the page opens; the latest entry is marked. Six territories, grown as islands from their own essays' positions, carry hand-lettered names.
Four ways in: Begin reading, ▶ Watch the tour, Contents and A random entry. The numbers use Indian grouping, as the rest of the site does.
A scrollytelling prologue with a sticky figure. The same 103 marks rearrange at each step, so the reader watches one dataset become a chart instead of being handed one.





Contents names each chapter with its Roman numeral and a miniature of what it shows. Once you are inside, a small dock floats at the bottom of the screen — ‹ I Atlas › — and follows whichever chapter is in view.
?lens= tab names, so every link to the first version still lands on the right chapter.“Essays sit beside the ones that say similar things — placed by the same multilingual embeddings the Ask page searches, laid flat — so an English essay and a Marathi one about the same hills share a coast.”
The territories are not drawn by hand and not convex hulls. Each region's essays are painted as soft discs, and an SVG filter turns that cloud into land with a coastline — the same filter on the cover, the Atlas, the prologue and every entry page.
<!-- the "gooey" island, one per region --> <feGaussianBlur stdDeviation={blur} /> 1 · blur the discs <feColorMatrix values="… 0 0 0 26 -11" /> 2 · threshold: land <feMorphology operator="erode" radius="1.3"/> 3 · land minus it: coast <feMorphology operator="dilate" /> 4 · a ring offshore: shoal
Where two regions overlap they share a coast, which is the point: the map's borders are where one subject turns into another.
“Every essay's first sentence, drawn after Nicholas Rougeux's Literary Constellations: one star per word, larger for longer words, turning hardest where the words carry meaning.”
constellationOf, so they draw the same shape.
“Take the words away and an essay still has a shape.”
Each essay's punctuation is laid along a spiral in reading order — full stops in ink, commas in pencil, exclamation marks in vermilion, questions in teal — after Stefanie Posavec and Between the Words.
“The phrases I reach for without noticing. A phrase only counts once it turns up in several different essays, so these are habits, not subjects.”
The first version picked a line at random — and 280 of the 412 lines are from 2026, so always answering 2026 usually won. The game now draws a year first, then a line from it; it keeps a streak and says how many years off you were.
“A sentence from years ago, and the recent sentence closest to it in meaning. Nobody chose these pairs: the embeddings matched them, at least eighteen months apart.”
“Five sentences from five essays, shuffled until they read as one poem. Keep the lines you like and shuffle the rest.”
?poem= and ?lock=).
Click any mark in any chapter, or a row in the index, and the essay slides over as a page of the journal — a bottom sheet on a phone. ?post= holds it, so the page is a link.
Every figure measures its own box and draws at that many pixels — no scaled-down viewBox — so the chart's labels are as legible at 390 px as at 1,440. Layouts switch on the container's width, not the screen's, because the site's sidebar makes viewport breakpoints lie.




Every colour on the page is a token, so the SVGs need no dark variants: the paper turns to deep indigo, the ink to bone, the islands deepen and the vermilion lifts to coral. The site's own dark switch drives it, in either shell.
The page reads one committed file, public/data/logbook.json. npm run logbook builds it from text and vectors the site already has for its chatbot, so the Logbook adds no new model calls at all.
1 · Text
Substack and WordPress, cached in the gitignored knowledge_base/ by the word-count job.
2 · Vectors
The /ask index already holds bge-m3 vectors per chunk; each essay gets their mean.
3 · Layout
umap-js, seeded: 40 neighbours and a loose minDist of 0.8, so ~100 essays don't scatter into far islands.
4 · Regions
k = 6 on the flat layout, each named after its essays' two commonest topical tags.
5 · Ship
177 KB, under a 200 KB budget a test enforces.
It runs as the logbook step of npm run refresh, after ask:index. An essay with no chunks yet is left off the chart, never placed at the origin.
bge-m3 is multilingual, so a Marathi essay about a Sahyadri fort and an English one about the same climb land next to each other. Language is a property of the mark, never of the map.
lang="mr" for screen readers.The essays live on Substack and WordPress; the Logbook only points at them. So the committed JSON may carry single sentences — each linking back to its essay — and nothing longer.
// src/lib/logbook.js — the rule export const MAX_EXCERPT_WORDS = 30; // src/lib/logbook.test.js — the guard it("stays under 200 KB", () => expect(raw.length).toBeLessThan(200 * 1024));
The test holds the committed file to both: no excerpt over 30 words, no file over 200 KB. The full text stays in the gitignored knowledge_base/. A line must also start like a sentence — a capital, a quote or a Devanagari letter — never on a digit.
All the analysis lives in one tested module, src/lib/logbook.js: cleaning, language, sentences, phrases, letter pairs and constellations. Each chapter is a view over its output.
| Chapter | Computed at build time | In the file |
|---|---|---|
| I · Atlas | Mean chunk vector → UMAP → k-means; three nearest neighbours per essay | xy, cluster, near |
| II · Sky | First sentence → words → constellationOf (one star per word, turning on meaningful words) | opening |
| III · Fingerprint | Punctuation in reading order; words per sentence | punct, rhythm, exclaims |
| IV · Phrases | 2- to 5-word phrases found in at least three essays; words of each year; up to four lines per essay for the game | 24 + 24 phrases, 412 lines |
| V · Letters | Chunk pairs at least 548 days apart and ≥ 0.6 alike in meaning, each essay used once | 22 letters |
| VI · Found poems | The same pool of single sentences, drawn five at a time | lines |
Real pixel width
A useWidth hook (a ResizeObserver) gives every figure its real width; SVG type is set in pixels, so it stays readable on a phone.
Container queries
Layouts switch on .lb-cq container width, because the classic shell's sidebar makes viewport breakpoints lie.
Tokens
Every colour is a --lb-* variable in logbook.css; dark mode redefines them, so no SVG needs a dark variant.
URL state
?post= an essay, ?lens= a chapter, ?poem= + ?lock= a poem, ?tour the film — always merged, so ?view= survives.
Keyboard
Marks use a roving tabindex: arrows move in writing order, Home/End jump, Enter opens. Dialogs trap focus and give it back.
Weight
Instrument Serif and Tiro Devanagari Marathi load through Helmet on /logbook alone; the chapter bundle is about 28 KB gzipped.
Completely revamp “Wanderers Logbook”, you have full freedom and autonomy. Make sure it is interactive, elegant and beautiful. Redesign the whole experience.
The brief · Claude Code sessionMake sure you explore all the experiences: Atlas, Sky, Fingerprint, Phrases, Letters, Found poems.
Added mid-turn, with a screenshot of the old mobile headerBuilt in a single Claude Code session, with every step checked in a real browser: Playwright screenshots at desktop and phone widths, in light and dark, in both of the site's shells.
The redesign was built in layers, so the hard part — where every mark, label and island goes — could be tested without a browser.
1 · Model
model.js: spirals, phyllotaxis, arcs, the prologue's five layouts, year ticks, search. 16 unit tests.
2 · Ground
ChartBase.js: graticule, islands, region labels and a compass, drawn once and shared by four views.
3 · Chapters
One file per chapter, plus the cover, prologue, contents, dock, index and entry sheet.
4 · Proof
Every chapter screenshotted at 1,440 and 390 px, light and dark; every interaction scripted and checked.
The first screenshot of the new Atlas showed only circles: all seventeen saffron diamonds had gone. Caught before it shipped.
Every Marathi mark was off the chart. The English circles were fine.
The diamonds were rects with an SVG rotate() attribute. The new hover scale needed CSS transform-origin: center, which re-anchored that rotation and flung them away.
Draw a diamond as a polygon — diamond(cx, cy, r) in shared.js — now a rule in the repo's CLAUDE.md.
export const diamond = (cx, cy, r) => `${cx},${cy - r} ${cx + r},${cy} ${cx},${cy + r} ${cx - r},${cy}`;
A game line began “५० वाजता…” — half a time of day.
The sentence splitter broke at the decimal point in “६.५० वाजता”, leaving a fragment that starts on a digit — one line in 412.
startsLikeSentence() in the analysis, plus a filter for the committed data; a test now says no line starts on a digit, in either script.
Region names disappeared under the dots.
Labels were drawn in the ground layer, beneath the marks.
A separate RegionLabels layer, drawn after the marks, with a paper halo.
The cover's stat read “EXCLAMATIO N”, and the “Latest” label was clipped at the edge.
Wide letter-spacing plus overflow-wrap broke the word; the label had no room on the right.
Tighter kicker spacing and normal wrapping; the label flips to the left near the edge.
The exported PNG was solid black behind the poem, and shifted by its margin.
html-to-image draws the paper-grain data URI as black, and bakes the node's margins into the canvas.
A lb-poem--flat class while it captures (plain paper, no grain), and the margin moved onto a wrapper.
Verified by actually downloading the file in a headless browser, not by trusting the code path.
| Where | What went wrong | The fix |
|---|---|---|
| Year axes | Labels for 2020–2026 collided on the prologue and letters | yearTicks() drops a tick that would sit within 34 px of the last |
| Phrases | Long phrases were cut off beside their dots | A container query moves the year dots under the phrase |
| Chapter dock | The dock sat on top of the site's floating Ask button | On phones the dock moves to the top of the screen |
| Found poems | A line's year wrapped alone onto the next line | The last word and the year share a no-wrap span |
| Letters | The postmark covered the letter's text | The postmark floats, so the text wraps around it |
Create a detailed video for this new page. Include all the exciting features that this new page has. Ask questions to clarify requirement.
The brief| Question | Chosen | Not chosen |
|---|---|---|
| Format | Vertical, 60–90 s | Landscape 2–3 min · both cuts · square |
| Style | The real page, scripted | An animated explainer · a mix |
| Audio | Voice-over + music | Music + captions · silent |
| Deliver | Embed it on /logbook, and share it | A re-renderable npm script |
79.8 seconds, recorded on the real page at phone size, one chapter after another. Captions are burned in, so it plays with the sound off. Press a chapter to jump.
Narration: Piper TTS, en_GB-cori-high (trained on public-domain LibriVox recordings) · music: the Scriptorium loop · download the MP4 (4.3 MB).
Each scene lasts as long as its narration plus 1.3 seconds. The voice says one thing and the caption shows a tighter version of it — “sanket tambare dot in, slash logbook” is spoken; sankettambare.in/logbook is shown.
| Scene | Starts | Narration |
|---|---|---|
| Cover | 0:00 | This is the Wanderer's Logbook. Every essay I have published since 2020, in English and Marathi, read as data. |
| Prologue | 0:09 | A short prologue tells the story in dots: one hundred and three essays, the surge of 2026, two languages, and a map of meaning. |
| I · Atlas | 0:19 | The Atlas places essays by what they say, so an English essay and a Marathi one about the same hills share a coast. Walk the route, in the order they were written. |
| II · Sky | 0:30 | In the Sky, every first sentence becomes a constellation: one star for every word. |
| III · Fingerprint | 0:37 | Take the words away, and each essay still has a fingerprint: its punctuation, spiralling out. |
| IV · Phrases | 0:44 | Phrases shows the habits of my hand. Then, a game: guess the year a line was written. |
| V · Letters | 0:52 | Letters pairs an old sentence with the new one closest to it in meaning, years apart. |
| VI · Found poems | 0:58 | Found poems cuts five essays into one poem. Lock the lines you love, and shuffle the rest. |
| § Entry | 1:06 | And every essay opens as its own page, with its nearest neighbours, and a chat that knows it. |
| End card | 1:13 | The Wanderer's Logbook. At sanket tambare dot in, slash logbook. |
1 · Voice
en_GB-cori-high, a little faster than default; 62 s of voice, 182 words.
2 · Camera
Playwright at 414 × 690, 2× pixels; a CDP screencast saved 2,919 timed frames as it hovered, clicked and scrolled.
3 · Clock
Frames arrive unevenly (~36 a second); each 30 fps tick takes the newest frame before it.
4 · Frame
The recording in a rounded window on paper, a title and caption per scene, an end card.
5 · Encode
A 22.4 MB master to share; a 720 × 1280 web encode of 4.3 MB for the page.
The Ask button and theme toggles were hidden while recording, and a vermilion ring shows each tap. A 19-cue WebVTT and an .srt carry the narration as text.
Nobody listened to the first mix — the work happened in a container with no speakers — so it was measured instead.
Between narration lines the track measured about −62 dB: effectively silence.
The loop is a quiet file (−40.9 dB mean), mixed at 0.55 and ducked hard under the voice.
+16 dB on the bed, gentler ducking, loudness normalised to −16 LUFS.
volume=16dB, sidechaincompress=threshold=0.02:ratio=6:attack=40:release=600, loudnorm=I=-16:TP=-1.5:LRA=11
Gaps now sit at −43 to −34 dB under a voice at −18.5 dB; peak −2.6 dBFS.
A new button on the cover — or a ?tour link — opens the film in a dialog with its chapter list, captions and a download link.
preload="none": opening /logbook costs nothing; the poster loads with the dialog and the film only when it plays.the-logbook.mp4, .jpg, .vtt and .json (the chapter starts).tour.test.js fails the build if a file is missing, the chapters stop following the page's order, or the video passes 6 MB.useModal, used by the entry page too.
All of it shipped on 16 October 2026 — the first page in the morning, the redesign by lunch, the film by mid-afternoon.
The first /logbook: a scrolly intro, six lenses in tabs, a drawer, the data build with its 30-word and 200 KB rules, and a share card.
The nightly job stops deleting the Substack essays' chunks; the Logbook keeps its last good file.
Cover, prologue, contents, six rebuilt chapters, dock, index and entry page. 23 files, +3,457 / −1,167.
A narrated 80-second film of the page, embedded behind ▶ Watch the tour, with a guard test.
Times are IST. The redesign merged as #61 and the tour as #62.
Every mark is an essay, and every one opens. Start at the cover, or take the tour first.
Set in Instrument Serif, Tiro Devanagari Marathi, Inter and Plus Jakarta Sans. Illustrations hand-drawn as SVG after the illo method — its deadpan ink-drop, Blot, does the work in each one. Screenshots from the live code on 16 October 2026.