Skip to the content

Projects07 / 07 · publishing · education · 2022–present

RubyCoin 07

Free Rails lessons in Ukrainian, on a CMS I wrote — and the training ground where ten contributors learned to ship reviewed code. You are on it right now.

Tech lead · architect · devops · rubyco.in
Skip to the engineering
In plain words

No new article since February 2024 — and the traffic is still growing

You are reading this on it. Good programming material in Ukrainian barely existed — beginners had to learn in someone else’s language. RubyCoin is a free bilingual platform of Rails lessons with its own publishing system, search and analytics, and this portfolio is a section of it.

The number I am proudest of is not the traffic, it is the shape of it: no new article has been published since February 2024, and visits are still growing — 31,000 from January to mid-August 2026 against 24,800 in the whole of 2025, almost entirely organic from Google. That is content quality and technical work compounding, not promotion.

The project as a school. Ten contributors — mostly interns — passed through this codebase. I set the tasks, reviewed the pull requests and owned what reached production. The skill on display is not “wrote code”, it is “built a process in which other people write the code and it doesn’t fall apart”.

For engineers

AI translation that keeps the markup, and analytics with no counter to drift

360+ commits, a lint gate of three linters before the suite runs, and AI review with inline comments on the pull request.

AI translation that keeps the markup

Long articles don’t fit a model context, and naive slicing destroys HTML. So the document is split along heading boundaries into chunks under the token limit, each translated in its own thread, then reassembled by index — headings, lists and code blocks intact. An hour of manual work became one button.

Bilingual on three levels at once

Locale in the URL scope, thread-safe locale switching per request, DB-level content translations — and slug history, so renaming a post never kills an indexed URL. That last one is why the organic traffic curve never has a cliff in it.

Own analytics, ranking straight from events

Server-side tracking with 24-hour view dedup; “best posts” joins the event table on a JSONB key behind a GIN index — no denormalized counter to drift out of sync. Titles are searched on the translations table and bodies through per-locale columns mirrored off Action Text — so a Ukrainian query finds a Ukrainian article, and never matches an HTML tag name.

Search and statistics as objects

Statistics isolated as six independently tested query objects, and two-level authorization with a separate management policy namespace for admin versus moderator. When interns are writing the features, the seams have to be obvious.

Two image versions per upload, down from five

1200×675 for the hero and 520×293 for the card, JPEG at quality 80 with the metadata stripped, so no view downloads a file it will only shrink. Three more versions used to be generated and nothing ever read them. This is most of the reason the home page renders in 76 ms at 53 MB resident.

Upgrade discipline

Carried live through Rails 7.0 → 8.1, Ruby 3.1 → 3.4, Sprockets → Propshaft + esbuild, and the removal of the admin framework in favour of a custom panel. Turbo Drive is deliberately off — frames and streams applied where they earn it, not by default.
360+
commits
10
contributors reviewed
53 MB
resident memory
4
failed responses in 13,000 requests
Context, honestly: this is a content site, not a high-load system — the engineering claim here is craft and process, not scale. And despite the name: not a cryptocurrency, not a token.

Who worked on it · 4 contributors

Danyil Shkoropad

tech lead · architect · reviewer · 2022–2026
  • Set the tasks and reviewed the pull requests of ten contributors, mostly interns.
  • Carried the upgrades live: Rails 7.0→8.1, Sprockets→Propshaft + esbuild.

Oleksandr Shemberko

fullstack · 2023–2024
  • Slug history on FriendlyId — a renamed post keeps answering at its old URL.
  • The home-page tag filter on Tom Select, and the after_party task that regenerated every photo format.

Mykhail Yun

co-founder · product · 2022–2026
  • Recruited the contributors and ran the intake — the school side of the project is his.
  • Editorial plan and distribution, back when articles were still being published.

Claude

pull request review · 2026
  • Inline comments on request — an intern types review on the pull request and gets one before a human spends time.
  • On this page too: the section you are reading was reviewed the same way.

Read to the end and want to talk it over?

rubyco.in