TransLoop
A language-learning app built around the double-translation loop - translate the source into the foreign language, then days later back-translate your own version to your mother tongue and compare what's lost.
- FastAPI
- React
- OpenAI
- Language Learning
Projects list - per-topic progress (EN→KO ratio) and state (active / draft / completed) on one screen
Create project - name, description, source and target language; that's a learning unit
Inside a project - each text card surfaces its difficulty and last score; one Practise click enters the loop
Phase 2 - back-translate your own version to the source language and see the semantic drift firsthand
Result - showing both the translation (82) and back-translation (85) makes the semantic gap visible
AI feedback - Strengths, Improvements, Hints, and what survived the back-translation, broken down per category
Setup
- Context
Packages the well-known double-translation method (source → foreign language → back-translation to mother tongue, used as self-checked semantic loss) into a tool. Started in 2025, paused, now restarting on a full-stack structure.
Build
- What I did
- Backend - FastAPI + SQLAlchemy 2.0 async + Pydantic v2 + OpenAI, alembic migrations
- Frontend - Vite + React 19 + Tailwind v4 + shadcn + TanStack Query, access/refresh token auth
- Deploy - backend on Render + Neon Postgres, frontend on Cloudflare Pages
- Product decisions
- Use "the gap between your translation and the source" as the learning signal instead of "compare to the right answer" - seeing the semantic loss yourself goes deeper than scoring correctness
- Tokens in localStorage with a one-shot auto-refresh on 401 before falling back to /login - to minimize interruptions mid-session
- QA considerations
- The access/refresh flow - on a 401 the one-shot auto-refresh runs exactly once without looping, and falls back to /login safely on failure
- In the days-later back-translation loop, source, first translation, and back-translation states stay consistent across the time gap
- When the OpenAI scoring response is malformed or fails, the session degrades rather than blocking progress
- The semantic-loss comparison is the entire learning signal, so what the AI flags as "where the meaning dropped" must not diverge from the actual loss (signal accuracy)
- The two scores (translation 82, back-translation 85) are reproducible for the same input and don't swing arbitrarily, so the learner can trust score changes
- Across the pause in 2025 and the full-stack restart in 2026, existing learning data (projects, texts, history) carries over without loss
- Tech stack
- FastAPI
- Python
- SQLAlchemy 2.0 (async)
- Pydantic v2
- OpenAI
- React 19
- TypeScript
- Vite
- Tailwind v4
- TanStack Query