Semantic search across every coding session you've ever had — organized as a timeline you can navigate.
A time machine for coding sessions. Chrono indexes session transcripts into ChromaDB with locally-generated embeddings, then lets you search them semantically — “when did I fix that webhook signature thing?” — bookmark moments, and filter by era.
Everything runs locally through Ollama. No transcript leaves the machine. It's the one project here that's fully open source.
Search results across months of work are hard to read as a flat list, because recency carries real meaning: something from this week is live context, something from four months ago is archaeology. A raw timestamp column makes you do that arithmetic yourself, every row.
So results are bucketed into four named eras with their own colors and emoji, themed after Chrono Trigger. It's a joke that turned out to be load-bearing — the visual grouping is genuinely faster to scan than dates, and the era headers give a long result list structure.
Pulled straight from the production codebase — unedited except for trimming.
max_days_ago=None marking the open-ended tail. Both failure paths — missing timestamp and unparseable timestamp — resolve to Prehistory rather than raising, because a malformed date in one indexed session should never take down a search across all of them.ERAS = [
Era(
name="Present",
code="present",
emoji="🏠",
game_year="1000 AD",
time_period="This Week",
description="Current active work - where you 'live' in the timeline",
color="\033[92m", # Green
min_days_ago=0,
max_days_ago=7
),
Era(
name="Middle Ages",
code="middle_ages",
emoji="⚔️",
game_year="600 AD",
time_period="1-4 Weeks Ago",
description="Recent sessions from the past few weeks",
color="\033[94m", # Blue (visible on light backgrounds)
min_days_ago=7,
max_days_ago=30
),
# … Antiquity (1-3 months) and Prehistory (3+ months) follow the same shape.
]
def classify_era(timestamp: Optional[str]) -> Era:
"""
Classify a session into an era based on its timestamp.
"""
if not timestamp:
return ERAS[-1] # Prehistory for unknown dates
session_date = parse_timestamp(timestamp)
if not session_date:
return ERAS[-1] # Prehistory for unparseable dates
now = datetime.now()
days_ago = (now - session_date).days
for era in ERAS:
if days_ago >= era.min_days_ago:
if era.max_days_ago is None or days_ago < era.max_days_ago:
return era
return ERAS[-1] # Prehistory as fallback
From the running application.


The repository is private, but I'm glad to walk through the codebase live — architecture, tradeoffs, the parts that went wrong first.