Every second post in my feed is about AI. Cursor, Copilot, ClaudeCode, some new model that writes better functions, classes, tests, etc. All useful. But there's a different way to use it that I rarely see written about - embedding a language model as an actual runtime component of your app. Something that runs on real user data, in production, every time a certain thing happens.
That's what I ended up doing in Gameverse - a platform for Ukrainian gamers I've been building since 2022.
The actual problem
Gameverse has a game library. Each game page has a description, screenshots, genre tags, developer/publisher info, completion times, and so on. A lot of fields. For a long time, adding a new game meant opening the admin panel and filling all of them manually, which is as fun as it sounds.
At some point I found IGDB - a gaming database by Twitch. It's genuinely solid. Good coverage, structured data, covers, screenshots, genre IDs, company info. In theory, one API call should be enough to populate a whole game page automatically.
The catch: everything in IGDB is in English. Gameverse is in Ukrainian.
First attempt - just translate it
My first thought was obvious - translation APIs. I tried Google Translate, then DeepL. Both returned results that were technically correct and completely unusable.
Here's the thing about Ukrainian: it's a heavily inflected language. Word endings change depending on grammatical case, number, gender, verb aspect. When you translate "An open-world action RPG set in a post-apocalyptic world" literally, word by word, you get something that a Ukrainian speaker reads and immediately thinks "this was not written by a human." The grammar works out on paper but the text has this weird, unnatural rhythm. Nouns in the wrong case. Verbs that feel off. Sentences that would never come out of someone who actually speaks the language.
For a gaming editorial site that's pretty much a dealbreaker. It kills the vibe of the whole page.
What I needed wasn't a translator. I needed something that understands the meaning and rewrites it - the way an actual editor would, not a dictionary lookup.
Switching to ChatGPT
I added an OpenAI integration to the sync pipeline. The service is simple:
export default class ChatGPTService {
private openai: OpenAI;
constructor(apiKey: string, modelName: string) {
this.openai = new OpenAI({ apiKey });
}
async request(prompt: string, behavior?: string) {
const messages: OpenAI.ChatCompletionMessageParam[] = [];
if (behavior) {
messages.push({ role: 'system', content: behavior });
}
messages.push({ role: 'user', content: prompt });
const chatCompletion = await this.openai.chat.completions.create({
model: this.OPEN_AI_MODEL,
messages
});
return chatCompletion.choices[0].message.content;
}
}
Nothing fancy. The interesting work is in the prompts.
Three prompts, three different jobs
Game description
gameSummary:
"Ти редактор на відеоігровому сайті. Тобі потрібно прекласти опис гри з англійської на українську. Точний переклад не критичний, потрібно щоб текст був зрозумілий та читався нативно. При цьому не можна змінювати загальний зміст опису. Оригінальний текст: "
(Translation: "You are an editor on a gaming website. You need to translate a game description from English to Ukrainian. Exact translation is not critical - the text should be understandable and read natively. The general meaning cannot be changed. Original text:")
"Exact translation is not critical" - that's the part that changed the output quality completely. It gives the model room to restructure sentences and use natural Ukrainian patterns instead of forcing a word-for-word mapping. The system role ("editor on a gaming website") adds context so the output reads like editorial copy rather than a translation exercise.
Alternative names for search
gameOtherNames:
"Ти редактор на відеоігровому сайті. Тобі потрібно знайти альтернативні назви для гри. Перевір, чи є у гри інші назви, які можуть бути використані для пошуку. Якщо такі назви є, вкажи їх. Додай всі можливі назви українською, якщо назв немає, вкажи хоча б адекватну транслітерацію. У відповіді надай лише назви розділені комами. Прямий переклад назви гри робити не потрібно, перевага за транслітерацією. Назва гри: "
IGDB has The Witcher 3: Wild Hunt. Ukrainian users searching for it might type "Відьмак 3", "Вітчер", "Ведьмак" (the Russian name which still circulates), or just "Witcher". None of those are in IGDB.
ChatGPT knows what games are called in different communities and which titles get transliterated vs translated. Returns a comma-separated list, I split it and index it for search.
Meta description
gameMetaDescription:
"Ти редактор на відеоігровому сайті. Тобі потрібно створити мета-опис для гри. Мета-опис повинен бути коротким та змістовним, описувати основні особливості гри та привертати увагу користувачів. Ось назва гри та короткий опис: "
This one doesn't translate - it generates from scratch. Give it the game name and the IGDB summary, it writes a Ukrainian meta description. Every game page gets one automatically, which means I'm not sitting there writing <meta description> tags for a hundred games.
What the full sync looks like
When an editor wants to add a game, they search by name, see results with covers pulled from IGDB, pick the right one, and click sync. Then addGame(igdbGameId) runs:
- Pulls full game data from IGDB - summary, cover, screenshots, genres, platforms, companies, language support flag (yes, IGDB tracks which games have Ukrainian localization), YouTube trailer ID
- Downloads cover and up to 10 screenshots, stores them locally
- Fires three ChatGPT requests - description, alternative names, meta description
- Hits HowLongToBeat for completion time data (main story / main + extras / completionist) - that one is web scraping, not an API, but that's a separate story
- Creates tags for genres, developers, publishers, platforms - or links to existing ones if they're already in the DB
- Saves everything to MongoDB
Before this, the workflow was: open big form, find a cover image somewhere, write a description, set tags one by one, write a meta description, find a trailer link. Easy to skip steps, inconsistent across different editors.
Now it's: search, pick, verify, publish.
A few practical notes
I'm using gpt-4o-mini - it's cheap enough that running three requests per game import doesn't hurt. The quality is good for this use case.
The prompts took a few iterations to get right. The first version of the description prompt was more literal, and the results were noticeably worse. Getting to "exact translation is not critical" was the key change.
Output isn't always perfect - occasionally a description is a bit flat, or the alternative names list misses something obvious. But that's fine because a human reviews everything before publishing. The AI does the heavy work, the editor does the final check. It's much easier to verify something than to write it from scratch.
The latency from three ChatGPT calls adds a few seconds to the sync. Since this is an admin operation, nobody cares.
For me, this is a more interesting use of AI than "it helped me write this function." It's solving an actual product problem - building a Ukrainian-language game library without a translation team - in a way that nothing else really could. Google Translate got the language technically right and the feel completely wrong. ChatGPT gets both close enough that the human review is just a sanity check.
If you're building something similar or ran into the same translation quality problem, happy to talk about it.

