Every grammar reference for Russian speakers learning Polish has the same shape: a wall of tables, a list of endings, and no way to find out whether any of it stuck. Mine started as exactly that wall. It is now 22 pages, around 26,000 words and 394 exercises that tell you not just that you were wrong but why, and it lives at polski.hamanovich.com (opens in a new tab).

It is not a NEXT product. There is nothing to sign into, nothing to sell, and no suffix on the name. It is a reference I keep for myself and publish because publishing it costs nothing.
Russian is the language, Belarusian is the leverage
Most Polish references written in Russian are a Polish textbook with the explanations translated. The interesting shortcut sits somewhere else. A reader who has both Russian and Belarusian in their head already owns a large part of Polish and does not know it: the sound correspondences are regular, and where Russian gives you a false friend, Belarusian often gives you the real cognate. So the site carries the subtitle "русско-белорусская опора" and has a whole page for it - phonetic correspondences, the Belarusian bridge, and the false friends that a Russian ear walks straight into.

The rest is 21 topic pages in seven groups: basics, declension, the verb, vocabulary and speech, the sentence, function words, living speech. Each one is opinionated rather than exhaustive, and the summary line on the index page is the argument in miniature: negations stack rather than cancel each other; one preposition takes two cases and the difference is usually "where" against "where to"; the polite "you" is third person; without particles, Polish sounds like a textbook.
Tables tell you what, exercises tell you why
The wall of tables was the part that did not work, so the reference grew a second half: 19 practice blocks and 5 tests without hints, 394 tasks in total.
A task is a gap, sometimes with options and sometimes with nothing but the dictionary form in brackets. You type an answer, press "проверить" for that single task, and get one of two things: a correct mark, or the answer with an explanation of the rule you missed. There are 399 of those explanations across the reference, and they are the actual product. "Dzieci is a non-masculine-personal plural, so it takes moje" is a sentence you can carry into the next gap. A red cross is not.

Some tasks are not single gaps at all but short connected passages - a family introduction, a phone call, nineteen of them in total - where three or four forms have to agree with each other inside one text, which is the first thing a table cannot teach you. And the five tests are deliberately colder: no hints, no per-task feedback, one score at the end. Answers are normalized before comparison, so a stray capital or a trailing space never counts against you, and your progress lives in sessionStorage - clicking through to another page and back does not wipe what you already did.
No framework, no server, no JavaScript required
The whole site is prebuilt HTML. data.js and app.js never reach the browser: they run once, under Node, when I build.
node scripts/build.mjs # 22 pages + search index + sitemap + fulltext.txt
That one script generates every topic page, the global search index, sitemap.xml, the canonical links and a fulltext.txt of the whole reference. The generated HTML is committed next to the sources, so publishing needs no server and no Node at all - GitHub Pages serves the directories as clean URLs and that is the entire deployment. The only dependency in the project is linkedom, and it is a build-time one.
client.js is progressive enhancement and nothing else: the section filters, the theme switch, deep links to any subheading, and the global search on / or ⌘K that jumps to the page and highlights the hit. Turn JavaScript off and every page is still complete and readable, because the content was never rendered by the client to begin with. Clone the repo and it opens over file:// - a grammar reference that works on a plane is not a technical achievement, but it is the correct answer for a document that is 95% text.
This is the opposite of how I build the NEXT products, and on purpose. NextRun exists because a SaaS needs auth, payments, a database and a bot on day one. A reference needs none of that, and reaching for the same stack anyway would have bought me a build step, a deploy pipeline and a hosting bill in exchange for nothing a reader would ever notice.
A section is just an array, which is why it keeps growing
Adding a topic is an array in data.js, a render*() function in app.js, an entry in TABS, an empty <section> in the template and a route with metadata in the build script. After that the page, the search index, the canonical URL and the sitemap entry appear on their own.
Cheap additions are the reason the thing keeps filling up rather than freezing the day it was "done". The same goes for keeping it honest: the prepositions page carries a note that since 2022 the Council for the Polish Language recommends w Ukrainie and do Ukrainy, that the older na Ukrainie is still correct and still more common in speech, and that the press has visibly moved. A textbook prints one of those and waits for a new edition. A generated page just gets edited.
The reference is at polski.hamanovich.com (opens in a new tab), free and without an account, and it grows whenever I hit something in Polish that I had to look up twice. If you want to argue about a rule in it, LinkedIn (opens in a new tab) is the fastest route.