Inspiration

"The limits of my language mean the limits of my world." - Ludwig Wittgenstein

English is a big language. It isn't a complete one. Portuguese has saudade — a bittersweet longing for something absent. Japanese has komorebi — sunlight filtering through leaves. Finnish has kaukokaipuu — homesickness for a place you've never been. People everywhere have felt these things. Only some languages ever bothered to give them a name.

That's the gap Project Babel lives in: you can feel something without a word for it, you just feel it in the dark. Every entry in the atlas is a flashlight pointed at something that was already there in human experience, just unnamed, and therefore harder to hold onto, harder to talk about, harder to know you share with anyone else.

The central question: Babel is built around one question it doesn't fully answer, on purpose: "Does having a word for a feeling change how often you have it?"

This is the old Sapir–Whorf debate, does language cage thought, or does it illuminate it? Babel takes the gentler, evidence-backed side: the weak form of linguistic relativity. A word for a feeling won't manufacture the feeling out of nothing. But it can make you notice one you already have, more often. Knowing the word komorebi doesn't give you the experience of light through leaves, it might just make you stop in it more often.

What it's standing on

Babel isn't asserting this in a vacuum, it's a design built on a real, if contested, body of thought:

  1. Linguistic relativity — Sapir Whorf and later Lera Boroditsky's empirical work, including the well-known finding that Russian speakers (who have separate base words for light blue and dark blue) distinguish shades of blue measurably faster than English speakers do.
  2. Cognitive semantics — Lakoff and Johnson's work on how metaphor structures thought itself.
  3. Cultural linguistics — Sharifian's work on how language encodes shared cultural cognition.
  4. Philosophy of language — Wittgenstein's Philosophical Investigations, Heidegger's claim that "language is the house of being," and Derrida's framing of untranslatability as a fertile zone rather than a failure.
  5. Affect science — Lisa Feldman Barrett's research on emotional granularity: the idea that a richer emotional vocabulary is linked to better emotional regulation.
  6. Positive computing — Tim Lomas's "Positive Lexicography" project, cataloguing untranslatable positive-emotion words across languages.
  7. Field linguistics — Daniel Everett's work with the Pirahã and their unusual relationship to number words, as a case study in how differently language and cognition can be wired together.

None of this is claimed as settled science, the point is that Babel picked a side in a genuine, ongoing argument, and built a product around defending it honestly rather than hiding behind vague "language is powerful" marketing copy.

Why an atlas, and why this shape The idea wasn't to build a dictionary of "fun foreign words", that's a listicle, and it already exists a hundred times over. It was to build something with an actual intellectual spine: every word gets a six-dimension portrait (cognitive science, cultural origin, linguistic structure, nearest English equivalent, philosophy, and art), because a single-line definition flattens exactly the thing that makes these words worth having, the fullness of what they're pointing at.

And it needed to be a two-way door: not just "browse words," but "bring me your unnamed feeling, and I'll hand you back the word for it." That's Name My Feeling and Composer, the parts of the app that turn the atlas from a reference into a mirror.

What it does

At the center is a search box: describe a feeling, and the engine returns the closest untranslatable word, with a three-line explanation (what you're feeling / why this word / how it fits) and cross-language alternatives. The same engine reads whole paragraphs of prose (Composer) and annotates the untranslatable moments hiding inside them.

Under the hood this is, by default, not an LLM, it's a from-scratch, deterministic TF-IDF cosine-similarity model. It's benchmarked at 90% category-match accuracy across 50 independently written test inputs, at ~53ms, fully offline. If an ANTHROPIC_API_KEY is present, the same JSON contract transparently upgrades to Claude and the UI discloses honestly which engine answered.

Every word also carries a cognitive-distance score (0–100%): how far the concept sits from anything sayable in a single English word, shown as both a curatorial editorial judgment and an algorithmic composite (semantic distance, cultural specificity, structural untranslatability, gap-to-nearest-English), deliberately side by side so you can see the seam.

Main Features

  1. Name My Feeling / Composer — describe a feeling or paste a paragraph; semantic search (not keyword search) finds the word.
  2. Six-dimension word portraits — every word explained through cognitive science, cultural origin, linguistic structure, nearest English, philosophy, and art.
  3. Shareable image cards — any word or search result renders as a 1080×1080 PNG on an HTML canvas, shareable via the native Web Share API or a WhatsApp / X / Instagram / copy-image fallback menu.
  4. Language Map — the full 500-word atlas as a force-directed SVG network, plus a family-tree view and a distance scatter plot, colored by emotional cluster.
  5. Per-user accounts — bookmark words, save cards, keep search history (JWT + bcrypt auth).
  6. Community submissions — anyone can submit a word; it's auto-screened for duplicates/gibberish/incoherence, then hand-reviewed before it becomes a real, browsable entry.
  7. Radically honest UX — discloses which matching engine answered, publishes measured (not claimed) accuracy, states plainly that word portraits are curatorial synthesis, not a peer-reviewed lexicon.
  8. Offline-first resilience — the frontend ships the full dataset and an in-browser copy of the matching engine; if the backend is unreachable, it falls back to localStorage and keeps working.
  9. Fully responsive & accessible — verified 375px mobile through desktop, keyboard-navigable, prefers-reduced-motion aware.

Technology Stack

  1. Frontend: React 18, Vite, React Router, HTML Canvas (image cards), SVG (force-directed map + charts), Web Speech API (pronunciation), Web Share API.
  2. Backend: Node.js + Express (running as a Vercel serverless function), Prisma ORM, JWT + bcrypt authentication.
  3. Database: PostgreSQL via Neon (production), SQLite for zero-setup local dev.
  4. AI: a from-scratch offline TF-IDF cosine-similarity matcher; optional upgrade to Claude (claude-opus-4-8) via the Anthropic API.
  5. Hosting/CI: Vercel — static CDN + serverless function, one origin, auto-deploy from GitHub main.

Intended Audience

People who journal, reflect, or are in therapy/coaching and want a richer emotional vocabulary. Writers and poets hunting for le mot juste , especially via Composer's per-sentence annotation. Language learners and linguistics students curious about untranslatability and linguistic relativity. Anyone who has ever felt something they couldn't name, and wanted proof someone else had named it first.

How we built it

Everything is served from one Vercel origin, the React/Vite SPA at / and the Express+Prisma API at /api/*, so there's no CORS to fight and the client just calls /api relatively. The same Express app runs two ways from one codebase: as a normal long-lived server locally (npm start) and as a single Vercel serverless function in production, gated by a require.main === module check. On boot, the frontend reconciles its bundled 500-word dataset with the live database, merging in admin-added words and removing deleted ones, with a no-op fallback when offline. The whole frontend was later migrated from a zero-build vanilla-JS SPA to React + Vite with pixel-for-pixel visual parity (the original lives on in site/ for reference).

Challenges we ran into

The matching engine's biggest challenge was a subtle failure mode, not a crash: an early keyword-overlap version confidently returned the wrong word (Genius loci for a query about longing for an unvisited place) because it couldn't tell a structurally common word ("place") from a semantically important one ("yearning"). Rebuilding it around TF-IDF, then actually benchmarking it against 50 hand-written test inputs rather than trusting gut feel, was the fix. Separately, getting one Express codebase to behave identically as both a persistent local server and a stateless serverless function and getting an O(n²) physics-based force layout to run smoothly inside React via an imperative requestAnimationFrame loop on an SVG ref, both took real iteration.

Accomplishments that we're proud of

A from-scratch semantic search engine with no black box, it's deterministic, explainable, and benchmarked (90% category-match) instead of just asserted. A dataset of 500 words across 121 languages, each with a full six-dimension portrait. An app that's honest by design: it discloses which engine answered a query, and its own Sources page admits its content is editorial synthesis, not peer-reviewed linguistics. And an offline-first architecture where the app never fully breaks, even if the backend goes down.

What we learned

That "honest product design" is itself a feature worth shipping, measured accuracy and disclosed limitations build more trust than a polished claim. That a simple, well-understood technique (TF-IDF) can outperform a naive one and is often the right first move before reaching for an LLM. And that migrating a working vanilla-JS app to a framework with pixel-for-pixel parity is its own discipline, separate from building new features.

What's next for Project Babel

  1. Full six-dimension portraits for community-accepted words (they currently start sparse).
  2. Public per-word share pages with richer OpenGraph previews.
  3. More languages and words, plus native-speaker review passes.
  4. An optional move to a persistent-Node host if long-running background work is ever needed.

Built With

Share this project:

Updates

Submission history