← Home
Passport
An illustrated tour of sankettambare.in

The Digital Hub

Not a portfolio — a world you can walk into. Six regions above ground, one Postgres underneath, and eight years of one person's curiosity filed inside it.

Sanket Tambare · sankettambare.in

What does one person's curiosity look like, eight years in?

The newest door · /ask

You can just ask it

Ask the Archive turns 2,702 indexed chunks into an answer in about four seconds — sources first, prose after, every name a link back to its row.

What are his running PBs?

Across 25 races and 577 km, the half-marathon best is 1:59:57 at NMDC Hyderabad Marathon 2025, and the marathon best is 05:05:53 at Tata Mumbai Marathon 2026.

1 · Race 2 · Race 3 · Essay
▲ Good▼ PoorSuggest
13 Kinds of content
~4s Question to answer
$0 Per month
Try it sankettambare.in/ask

But what is it answering from?

The world map · click a region

Six regions, six chapters

One SVG scene with pan, wheel-zoom and pinch. Day and night follow the visitor's own clock.

The Coast The Ridge Book Forest The Workshop Scriptorium Hometown Square
Five glints hide real stories — find them

· plays itself

The whole story, in one walk

Chapter One · /about

Hometown Square

Before the database, the habits. Someone who reads in two languages, runs before dawn, and files all of it.

So who keeps all these records?

Who keeps the records

A full-stack developer with a wide catchment area

Technology, society, psychology, blogging, design, video editing, digital well-being. Years of exploring taught me what I am good at, what I am not, and what I actually want from a career.

Critically engage with what's new, better myself daily, understand the things happening around me — and enjoy the journey.

And what is he doing right now?

Currently · /now

Three commitments, held at the same time

Day job

Software Development Engineer

Full-stack, data engineering, CI/CD and DevOps.

Research

NAST Research Fellow

Technology geopolitics, at Takshashila.

Training

Marathons, five days a week

10K through the Tata Ultra 50K.

Eight years of that — how much does it add up to?

Life in numbers · click to count

Eight years, counted live

Nothing here was collected for a chatbot. It accumulated — then it got a database.

Start with the running — where did 577 kilometres come from?

Chapter Two · /sports

The Coast

Twenty-five races and 577 kilometres, from a first 10K to a fifty.

How far does that actually go?

The race ledger

One coastline, five distances

Personal bests, average paces, most-active city and year — plus a timing certificate on every race.

And when the running stops, where does he go?

Chapter Three · /treks

The Ridge

Twenty Sahyadri forts — six easy, eleven medium, three hard.

Which of them took twenty-two hours?

The fort log

Twenty forts, graded by difficulty

Including the night march from Panhala to Pawankhind — 22 hours, and the trek the archive is most often asked about.

6
Easy
11
Medium
3
Hard

What does he do on the days he isn't moving?

Chapter Four · /books

Book Forest

Fifty-one books — thirty in English, twenty-one in Marathi. A bilingual shelf is why the search index refuses to stem.

And what comes out of all that reading?

Chapter Five · /100-days

The Scriptorium

1,661 micro posts since 2018, 104 essays on Substack and WordPress, and 100,199 words counted nightly.

How do you search eight years of short posts?

Case study · writing at scale

Rows that never load wholesale

Micro posts peaked at 535 in 2020; essays exploded in 2026 with 61 of the 104. Every bar is a row a question can now reach.

Server-side search

A generated tsvector column, GIN-indexed, never shipped to a browser.

The simple config

Stemming Devanagari is worse than not stemming it at all.

Idempotent import

A unique key on source and source-id lets the Tumblr rescue re-run safely.

Who built the machinery that holds all this?

Chapter Six · /projects

The Workshop

Thirteen projects — and the largest of them is the site itself: two shells, one database, a custom CMS and a chatbot on top.

So how does one site show six worlds?

The two-shell system

One content source, two complete front doors

Default for everyone

The Wanderer's Atlas

An illustrated 2.5D world. Every page is a place inside one of six regions, wrapped in a themed biome band with map breadcrumbs.

One click away

The Classic Shell

Editorial portfolio layout — translucent nav, sticky bio sidebar, 3D globe homepage. The reduced-motion and accessibility escape hatch.

Resolution order: ?view= → stored preference → prefers-reduced-motion → preview flag → feature flag. And how do you arrive in the Atlas?

Arrival

Orbit, dive, map — a three-stage entrance

Orbit

A rotating WebGL globe, four counting-up teasers, one "Enter the World" call. Counts hardcoded on purpose — zero network calls before first paint.

Dive

A 3.5-second GSAP timeline: camera plunge, three cloud sheets, a white bloom. The globe is swapped for the map at the bloom frame.

Map

The world hub. Returning visitors land here directly; the intro replays on demand, and reduced motion skips the dive entirely.

And what happens if you just stand still?

Idle life & parallax

The map keeps moving when you don't

Sky and far layers lag the camera, near props lead it, and a fine pointer adds eight pixels of drift.

All of it stops under prefers-reduced-motion — the whole animation layer is opt-out in one media query.

Is there a reason to keep exploring?

Drifting clouds & mist
Fluttering flags
Spinning workshop gears
Chimney smoke
Bobbing boats & buoys
Lapping waves
A writing quill
A stamping press
Night fireflies
Low-flying birds
Gamification

A passport, seven quests, five secrets

Your deck passport:
Cartographervisit all six regions
Bibliophileopen five books
Roadrunneropen five races
Summiteeropen five treks
Wordsmithopen five blog posts
Tinkereropen three projects
Curious Wandererfind all five secrets

What are the five secrets hiding?

Five secrets ·

Every hidden glint is a true story

All of that sits on something. What's under the floor?

Architecture as a landscape

Four layers, no server to run

On 13 June 2026 the whole site moved into Supabase — and every later feature, the chatbot included, stands on that move.

What stops any of that from lying?

Rules held by the database

The database, not React, keeps the promises

v15 · migration 0005

Drafts stay drafts

The projects read policy is visible or is_owner() — a hidden project never reaches a page, a tag list, a share card, or the search index.

v14 · migration 0003

Tags are central

213 tags in one table, linked polymorphically, with a function that replaces a row's whole tag set atomically.

v15 – v16

Dates are real

Project dates became a Postgres date; book finish dates carry a precision flag. Sorting stopped lying.

v17 · migration 0012

The log is owner-only

Visitors write the conversation log through a definer function and can never read it back.

With all that in place — what happens when you ask a question?

Ask the Archive · the pipeline

Six stations, about four seconds

4.20s
01
Question
Turnstile token, quota cap
02
Embed
bge-m3, 1024 dims
03
Retrieve
Keyword + meaning
04
Ground
The facts card
05
Generate
Four-rung ladder
06
Clean + stream
SSE, sources first

But how does it find the right rows at all?

Retrieval

Two searches, one ranking — and a card of facts

Vectors cannot count

So every prompt carries the facts card

“How many books?” would return eight books that feel like the question. The card ships the real aggregates instead — the same numbers /stats shows, from one hourly snapshot.

One modulesiteStats.js
Edge-cached3,600s
Disagreementimpossible

What stops it inventing a link?

Guardrails & the ladder

It cannot link to anything it did not retrieve

What the model wrote

PB 1:59:57 at [NMDC Hyderabad Marathon 2025](/sports/15). Read more at [this link](https://evil.example/x). ![Finish](https://evil.example/pixel.png)

What the reader sees

PB 1:59:57 at NMDC Hyderabad Marathon 2025. Read more at this link.

The words stay; the invented URL and the tracking pixel are gone.

Caps fail closed

If the quota check is down, the request is refused.

Data, never instructions

Retrieved rows sit in delimiters the prompt declares inert.

Four rungs · tried top to bottom
1
Gemini Flash-Lite
Best quality · falls over on 429, 5xx or a 6s timeout
2
Workers AI · gpt-oss-20b
No key, runs beside the worker
3
Workers AI · llama-3.2-3b
Same neuron pool, about five times cheaper
4
Search-only
The matching pages and one honest line — never an error page

Order, model ids, timeouts and switches are rows in a settings table — when a model was retired mid-build, the fix was editing a field. Every answer logged so far came from rung one.

And when it does get something wrong?

Feedback as evals

Every verdict becomes a test case

Thirty exchanges logged, two rated — one up, one down. Small numbers, honest signal.

▲ Good answer ▼ Poor answer
What could be better?
Wrong facts Missing data Bad links Formatting Too long
It missed the 50 km ultra.

Only the reader who owns the conversation can rate it, and comments cap at 1,000 characters.

“Missing data”

→ ingest a new source.

“Wrong facts”

→ tighten the prompt.

The foundation is data, not the model. The next moves are chosen by what readers mark as wrong.

Who turns those dials?

/admin

Every dial is a form field

One workspace
Overview
Content · 8 tables
Now · months & meta
Ask · settings & conversations
Résumé · experience, skills
Tags · rename, merge, recolour

The dashboard drops the site's rust accent for indigo — it is a workspace, not a page of the site.

Switches & caps

Second brain on/off, Turnstile required, questions per day globally and per visitor, max question length, turns of history sent.

Retrieval weights

Items retrieved, keyword weight, meaning weight — the ranking is tunable without a deploy.

The model ladder

Label, provider, model, timeout and on/off per rung — reorderable, with a 14-day usage chart by tier.

Conversations

Fourteen filters, a 30-minute gap that splits chats, three exports, and p50/p95 latency by stage.

How long did all of this take?

The trail · 83 releases

A template became an archive

Data first, then the brain. Each step made the next one possible.

Jun · Move

Vite, Supabase, storage, the Tumblr import.

Jul · Show

The Atlas, the Stats Almanac, the admin workspace.

Aug · Tidy

Image compression, canonical domain.

Sep · Ask

Central tags, projects, books — then the archive learned to answer.

The last door · /ask

Don't read the archive. Ask it.

Eight years of books, races, forts, essays and short posts — in one database, answerable in a sentence, in English or Marathi, with every claim linking back to its row.

Ask me anything — or ask the archive, which remembers more than I do.

Everything else
linktr.ee/daredavil