Anja Gutierrez
Open source · Python

Chrono

Semantic search across every coding session you've ever had — organized as a timeline you can navigate.

PythonChromaDBOllamaLocal embeddingsCLI
57+Sessions indexed
4Time eras
0Cloud calls
MITLicense

What it is

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.

Why eras

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.

The code

Pulled straight from the production codebase — unedited except for trimming.

chrono_utils.py python
Data-driven classification with a safe default. The eras are declarative records carrying their own display metadata, so adding one is a list entry rather than a new branch. Classification walks them in order and returns on the first match, with 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

Screens

From the running application.

Chrono CLI semantic search results
Semantic search results, grouped by era.
Chrono era-based filtering view
Era filtering — Present, Middle Ages, Antiquity, Prehistory.
View the source on GitHub ↗

Want to see more of this one?

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