Version History

This timeline is curated from the git history. It tracks product evolution and the deliberate shift toward using this app as an LLM culture harness: versioned prompts, observable behavior, and testable interactions.

Current runtime v1.14.0

The Collection Speaks : Epistemic narration powered by two free LLM providers. Apple Intelligence (apfel) handles fast per-entity scopes in under a second. Gemma 4 26B (Ollama) generates literary collection-level narratives. Nightly job produces 11 awareness states. Freshness dedup and model provenance tracked on every state.

Updating The Version

Version is managed through the root VERSION file and this timeline file: config/version_history.yml .

bin/with-ruby bin/rails app:version:show
bin/with-ruby bin/rails "app:version:bump[patch]"
bin/with-ruby bin/rails "app:version:set[1.6.0]"
v1.14.0 The Collection Speaks 2026-04-07

Epistemic narration powered by two free LLM providers. Apple Intelligence (apfel) handles fast per-entity scopes in under a second. Gemma 4 26B (Ollama) generates literary collection-level narratives. Nightly job produces 11 awareness states. Freshness dedup and model provenance tracked on every state.

  • The collection speaks -- epistemic narration via Apple Intelligence and Gemma 4
  • Two zero-cost LLM providers via OpenAI-compat -- apfel (sub-second) and Ollama gemma4:26b
  • Nightly job generates 11 awareness narratives -- collection, 5 streams, 5 departments
  • Freshness dedup and model provenance tracked on every epistemic state
fdcea64 Wire Knowable enrichment: apfel (local) + Ollama gemma4 (network) 3ba1674 Enrich epistemic narration: richer prompts, dedup, model provenance 3b3fe64 Add LLM provider seed: apfel + ollama for epistemic narration
v1.13.0 The Namespace 2026-04-06

Phase 1 of the Knowable engine extraction. Six awareness layer models, five services, one controller, and three rake files move from flat names into the Knowable:: namespace. Zero database changes -- table names, foreign keys, and polymorphic types all preserved. Backward-compat aliases ensure nothing breaks.

  • Knowable namespace complete -- 6 models, 5 services, 1 controller, 3 rake files
  • Rake tasks renamed from knowledge: to knowable: with backward-compat aliases
  • All 725K artifacts and 16 streams accessible via Knowable:: qualified names
  • Zero database changes -- table names, foreign keys, polymorphic types all preserved
2082f25 Step 0: Split Knowable into namespace module + concern mixin 1be3da9 Step 1: Namespace 6 awareness layer models under Knowable:: 18a4730 Step 2: Namespace 5 services under Knowable:: db67f4f Step 3: Namespace controller as Knowable::DashboardController
v1.12.1 Labeled Toolbar 2026-03-23

The Aperture topbar gains labels, full-height dividers, and centered layout. Five button groups are no longer a mystery -- each has a small uppercase label identifying what it controls.

  • Aperture topbar refined -- full-height dividers, zero vertical padding, centered layout
  • Labels added to every button group -- Collection, Browse, Layout, Split, Panels
  • Button text vertically centered with Helvetica Neue ascender compensation
v1.12.0 Three Ways to Follow 2026-03-22

Right-click any artwork, anywhere in the app -- including inside the lightbox -- and choose how to follow it. Drift by meaning (semantic), by image (CLIP), or by color. The context menu is the default right-click; Shift restores the browser's. An action registry makes future actions one line of code.

The collection crossed a desire threshold. The infrastructure was good enough that the next question wasn't 'what's missing?' but 'what can I do with what's here?' The context menu is the door. Three drift modes are the first three paths through it.

  • Universal artwork context menu with action registry -- right-click is ours, Shift for browser's
  • Three drift sources -- by meaning (semantic), by image (CLIP ViT-L/14), by color (euclidean palette)
  • Lightbox integration -- PhotoSwipe stamps artwork identity on .pswp root via afterInit/change events
  • Explore controller conflict resolved -- shiftKey guard + stopPropagation for peaceful coexistence
76a960a Drift gains eyes: source param selects which embedding space to follow eda3e3b Wire drift source through the screen: meaning, image, or color in the corner 035be0a The door opens: universal artwork context menu with action registry b9f4986 Connect the menu to the world, teach explore to share 965a7bd Flip the default: our menu is the right-click, shift for the browser's 4d64260 Context menu works inside the lightbox: the friction of matter, resolved
v1.11.0 Compute Once, Distribute Everywhere 2026-03-21

Knowledge transport for the Knowable system. Export computed embeddings to portable gzipped CSV with a YAML manifest carrying full provenance -- version, stream, dimensions, checksums, source environment. Import via temp table + id-range batched UPDATE JOIN. The manifest is a seed, not a fossil: it encodes reasoning, not just conclusion.

A fossil preserves the conclusion. A seed preserves the reasoning. The manifest carries enough provenance that a future reader can determine whether to trust, refresh, or replace the knowledge without re-examining the source database. The architecture holds space for a git-backed knowledge repo where different apps contribute knowledge back.

  • knowledge:export -- PG COPY TO gzipped CSV, streaming without Ruby memory pressure
  • knowledge:import -- temp table + id-range batched UPDATE, version stamps, SQL injection prevention
  • Manifest with full provenance -- version, stream, dimensions, checksums, input method, prerequisites
  • transportable_knowledge class method added to Knowable concern for cross-project reuse
6bad430 Knowledge transport: compute once, distribute everywhere
v1.10.0 The Self-Knowing Collection 2026-03-21

The Knowable system gets a face. A new /knowable page makes the collection's epistemic state visible -- 16 streams of inquiry, per-attribute coverage dashboards, dependency graphs, cadence assessment, and the collection speaking about what it knows and where its understanding remains shallow. Dashboard and education in one surface.

A knowable thing is anything language can refer to. This page is the collection looking in the mirror -- not a summary written by a person, but the system describing its own streams, gaps, and depth of inquiry. The architecture holds space for knowledge it does not yet have. Nine future streams name what the collection cannot yet examine.

  • /knowable page -- dashboard of collection knowledge state with scrollspy TOC and educational prose
  • Live coverage data across 4 models and 10 knowledge attributes, derived from per-column counts (not expensive JSONB scopes)
  • Stream dependency visualization showing the mycorrhizal network between 16 streams of inquiry
  • Cadence assessment and epistemic narration rendered from existing Knowable infrastructure
b92d57c Add /knowable page: dashboard + education for the Knowable system
v1.9.0 The Living Record 2026-03-18

The /changes page now populates itself. A weekly Solid Queue job clones MoMA's public GitHub repo, walks the commit history of Artworks.csv, diffs consecutive snapshots, and generates AI narratives for each period. The entire pipeline runs unattended -- first run backfills a decade of collection evolution, subsequent runs detect new changes in seconds.

A collection that tracks its own changes is a collection that remembers. The differ watches for acquisitions, deaccessions, reclassifications, digitizations -- the slow breath of institutional attention. The narrator gives that breath a voice.

  • Automated collection changes sync via Solid Queue recurring job (weekly Monday 4am)
  • CollectionNarrator rewritten from Claude CLI subprocess to OpenAI Responses API with structured output
  • CollectionChangesSync service extracted from rake task -- handles both initial backfill and incremental sync
  • Git added to Docker runtime image for production repo access
7a68b93 Automate /changes: sync job, OpenAI narrator, extracted service
v1.8.1 Escape Velocity 2026-03-18

Fixed drift screensaver getting trapped in artist gravity wells. Prolific artists like Rauschenberg (600+ prints) would monopolize the entire drift session because all 24 nearest semantic neighbors were by the same artist. Now drift prefers neighbors by different artists while staying semantically close.

  • Artist-aware neighbor selection: drift now partitions candidates into different-artist vs same-artist pools, preferring the former
  • Wider semantic pool (48 neighbors instead of 24) ensures different-artist works appear even in dense single-artist regions
  • First user feedback fix -- reported by Eric Hinote, who was tired of looking at Rauschenberg prints
b61a357 Fix drift artist gravity wells: prefer different-artist neighbors
v1.8.0 Computable Meaning 2026-02-26

Added faceted embeddings, hybrid search, and a semantic operations workbench. The collection is no longer one vector per artwork. Five independent embedding dimensions let you ask different questions of the same space, and Explore gives you the verbs to do it.

The embeddings were always the substrate. Faceting them makes meaning computable along chosen axes. Bridge, Axis, Contrast, Temporal, and Topology are not search features. They are instruments for operating on the space itself.

  • Faceted embeddings: visual, conceptual, catalog (3072d each via text-embedding-3-large) and CLIP image embeddings (768d) alongside the original 1536d semantic vectors.
  • Hybrid search: full-text (tsvector) and multi-vector similarity merged via Reciprocal Rank Fusion, with facet pills to shift emphasis (By Sight, By Meaning, By Metadata).
  • Explore workbench: five semantic operations (Bridge, Axis, Contrast, Temporal, Topology) with two-slot inputs and facet selection.
  • Updated about page with dynamic embedding coverage stats, Explore documentation, and hybrid search description.
8ea7b11 Computable Meaning Units 1+2: multi-embedding columns, tsvector, client upgrade 4e69d24 Computable Meaning Units 6+7: hybrid search with RRF, facet toggle UI f5b1711 Explore: 5 semantic operations on multi-vector embeddings 66e4fe9 Explore polish: temporal bar chart, workspace layout, loading scope, remove redundant headers
v1.7.2 Housekeeping 2026-02-23

Rotated leaked database credentials, purged secrets from git history, fixed CSRF 422 errors on history recording, and added jer-deploy hook guard for zero-downtime deploys.

  • Purged .kamal/secrets from git history via filter-repo, rotated database password.
  • Fixed history/record 422s: skip CSRF on cookie-authenticated analytics beacon.
  • Added JER_DEPLOY guard to post-deploy hook for jer-deploy wrapper compatibility.
v1.7.1 Aperture Modules 2026-02-23

Extracted pure functions from the 4100-line Aperture controller into three ES modules: config, utils, and cards. Controller drops to 3642 lines with all rendering logic importable and testable independently.

The instrument stays the same; the workshop got organized. Every card renderer is now a pure function you can hold up to the light.

  • Extracted aperture/config.js (82 lines): all constants and derived layout functions.
  • Extracted aperture/utils.js (47 lines): esc, truncate, parameterize, fmtCount, formatHistoryDate, inspectorField.
  • Extracted aperture/cards.js (378 lines): 16 card renderers as pure functions with ctx parameter for state.
  • Controller reduced from 4120 to 3642 lines with zero behavior changes.
v1.7.0 The Clearing 2026-02-21

Replaced the conventional landing page with The Clearing: a single centered artwork with multi-axis semantic neighborhoods. Added Decades as a top-level catalog scope in the browser.

The Clearing drops you into meaning-space the moment you arrive. One work, centered. Its neighbors by meaning, palette, and terms visible at a glance. Click any neighbor and it becomes the new center. The page is the instrument.

  • Replaced the landing page with The Clearing: one centered artwork, three neighborhood axes (semantic, color, terms), click-to-recenter navigation.
  • Added semantic search on the landing page: describe what you want to see, the collection responds.
  • Added Decades as a top-level catalog scope in the browser alongside Departments, Exhibitions, Artists, and Terms.
  • Artist names link to their browser profile, dates link to their decade's collection.
v1.6.0 Persistent Gaze 2026-02-21

Added a personal history mode that remembers what you've looked at, a service worker that permanently caches every artwork image, and deployed the app to production on jer-serve.

History mode treats attention as data: the collection learns which works held your gaze, building a personal library from browsing behavior alone.

  • Added History mode: a personal library of viewed artworks with time-grouped browsing and per-artwork view logs.
  • Added a service worker with permanent image caching - every artwork image loads once and never re-fetches.
  • Deployed to production via Kamal 2 with zero-downtime CaddyControl integration.
  • Refined the about page, stabilized viewer across browse mode switches, and added arrow key navigation.
e39cedb Add History mode: personal library of viewed artworks 72ab258 Configure Kamal production deployment to jer-serve 2038058 Stabilize viewer across browse mode switches
v1.5.0 Culture Harness 2026-02-12

Shifted the project from fast feature expansion to a repeatable loop where behavior, tests, and model-guided interactions can evolve together.

MoMA Browser now doubles as an LLM culture harness: prompts, endpoint behavior, and UX policy are all treated as versioned artifacts with regression expectations.

  • Extracted browser query objects and a focused payload builder so endpoint behavior is inspectable and easier to review.
  • Added endpoint observability and stronger focus-response contract coverage.
  • Hardened AI conversation flow in /words around turn handling and resilience.
a60a699 Extract browser query objects, add observability, replace lightbox with PhotoSwipe f584875 Add initial test suite: 24 files covering models and integration d320381 Add inline thinking dots and fix turn number + CollectionVoice resilience
v1.4.0 Dialogic Studio 2026-02-11

Introduced the /words mode: two models in continuous conversation over the collection, with UI and state fixes that make long-running sessions stable.

This release made conversational behavior a first-class product surface, not an experiment hidden in scripts.

  • Launched /words with persistent turn-by-turn dialogue.
  • Added an in-app about overlay to frame intent and constraints.
  • Fixed turn race conditions and transition awareness.
b34de74 Add /words: two LLMs in endless conversation about the collection 6b841bf Add about overlay to /words describing what the feature is 4a25f2e Fix artwork transition awareness and turn number race condition
v1.3.0 Spatial Systems 2026-02-10

Expanded /time and /space into richer exploratory systems with persistent state, compression, and stronger rendering behavior.

  • Added insight features and semantic power tools to /time and /space.
  • Improved rendering stability and animation quality in Phase Space.
  • Added theme controls across the app.
bbee3ea Add semantic power features to Phase Space: trails, color modes, neighbor lines 5091290 Add rich inspector, state persistence, and gzip to /time and /space 3400f2f Add system-wide light/dark/auto theme with warm dark palette
v1.2.0 Graph + Guide 2026-02-09

Added named-reasoning layers through a knowledge graph and launched guided narrative experiences on top of the semantic collection.

  • Added knowledge graph extraction and traversal.
  • Introduced AI Guide portals and tour playback.
  • Shipped graph explorer and major query-performance fixes.
70114f9 Add knowledge graph, HnswSearchable concern, and semantic model enhancements ed5f9d4 Add AI Guide system with immersive portal experiences 60427f8 Fix graph traversal explosion (159s→161ms) + graph explorer enhancements
v1.1.0 Aperture Consolidation 2026-02-08

Unified browsing into the Aperture-style SPA and added tooling foundations for model-facing exploration.

  • Shipped semantic + catalog browsing in /browser.
  • Added Rails-native MCP tooling for collection exploration.
  • Introduced versioned prompt management.
62b1e3e Add Aperture Browser SPA with semantic and catalog browsing modes cff339a feat: Add Rails-native MCP server with 13 tools for collection exploration 87f0857 feat: Add versioned prompt management with PaperTrail
v1.0.0 Initial Public Baseline 2026-02-07

First complete release of semantic browsing over the MoMA collection.

  • Established embeddings, color vectors, and similarity browsing.
  • Shipped core collection pages and data import pipeline.
  • Set the baseline architecture for all later experimentation.
41a961e MoMA Exhibition Browser v1.0.0
Back to About