All projects

sirom.app

I built and launched an app for learning languages through culture. Content is curated around a region and its culture: people, places, traditions, and events. Texts are adapted to the reader’s level, with click-to-translate, vocabulary, and flashcards in one interface. Reading is the starting point, with more formats to follow.

Role
Product, backend, frontend, design, infrastructure
Languages
Serbian, Russian, English
Status
Live and evolving
Open sirom.app

How I approach the project

More expensive does not mean better

I compared more than 20 AI models on the actual task. The best quality came from a model that was far from the most expensive. Finished results are saved and reused, while limits protect against unexpected bills.

The essentials first

I left secondary features out of the first release and focused on the core flow: reading, translation, vocabulary, and review. That flow shaped development priorities and the product roadmap.

Economics before launch

I calculated generation, translation, and narration costs and assessed the conditions for breaking even. Those calculations shaped the architecture and development priorities.

What was built

Content that helps readers feel at home

I defined selection criteria for texts about people, places, traditions, and events, with a regional focus. Readers learn the language through topics familiar to native speakers while exploring the cultural context.

Adaptation tailored to each language

I defined text complexity and length requirements for each CEFR level. Serbian, Russian, and English each have a separate language package, so adaptation accounts for the specifics of each language. Automated checks of structure, length, and mixed scripts reject invalid results before they reach the user.

Model selection on the actual task

I compared 20+ models and modes on a set of Serbian texts. An AI judging panel evaluated the results, after being tested on texts with deliberately introduced errors. I selected models for adaptation and translation based on quality, speed, and cost.

On-demand translation and a shared cache

I prepared separate translation instructions for each language pair, accounting for the specifics of the source and target languages. Translation works sentence by sentence in the context of the article. Words and expressions are stored in a shared cache, so repeat translations appear faster and require no new AI calls.

From reading to review

I connected reading, a personal vocabulary list, and flashcards with spaced repetition. Words are saved with their translation and source sentence, and readers choose what to review.

Cost and load control

I added tracking for AI costs and response times. Limits on new translations protect the service budget; cached translations do not consume the allowance. Email sign-in has separate rate limits.

An interface for reading on a phone

I designed the mobile interface with translations beside the selected word, gesture-based flashcards, and quick language and level selection. I created the visual identity, from layouts to the logo.

From development to launch

I built the frontend, API, and database, and set up migrations and server deployment. Services run through Docker Compose, with persistent data storage across application updates.

Stack

Frontend

  • Next.js
  • TypeScript

Backend

  • Python
  • FastAPI
  • PostgreSQL
  • Alembic
  • Redis

LLM

  • Anthropic
  • OpenAI
  • DeepSeek

Infrastructure

  • Docker Compose
  • Caddy
  • Rate limiting

What's next

  • A reading assistant that answers questions about the text at the reader’s level
  • Audio for words and articles
  • Language learning from YouTube videos with word and phrase translations
  • Article pages in multiple languages to improve search visibility
backAll projectsOpen sirom.app