A desktop app for learning to program and then grinding coding-interview problems — built for a Codility screen, useful for any of them.
Switch the programming language inside the app. Python, JavaScript, Java, C#, Go, Rust and C++ all work: you get the same problem, starter code generated for that language's type system, and your solution is compiled and graded by the real toolchain.
English, German, French and Spanish. The flag button switches the whole interface, plus every multi-language problem statement, hint and note. The Python-only curriculum and drills are English and German; anything without a translation falls back to English rather than breaking.
Written in Python with zero third-party dependencies — standard library and tkinter
only. Nothing to pip install.
Die ganze App gibt es auf Deutsch, und die Programmiersprache lässt sich direkt in der App umschalten. · Toute l'application existe aussi en français. · La aplicación completa también está en español.
Where it goes next is written up in ROADMAP.md, along with the things worth knowing before changing anything.
Get the latest build from the
Releases page — Windows x64,
Linux x64 and macOS (Apple Silicon). Unpack and run CodeForge. No Python needed; the
app carries its own interpreter.
On an Intel Mac, build it yourself (one command, see below) — GitHub is retiring its Intel macOS runners, so there is no prebuilt x86_64 archive.
Python is built in. The others run your code with the real toolchain, so it has to be on your machine — the language dropdown shows a ✓ next to the ones it found:
| Language | Needs |
|---|---|
| Python | nothing, it is bundled |
| JavaScript | Node.js |
| Java | a JDK (javac + java) |
| C# | the .NET SDK |
| Go | the Go toolchain |
| Rust | rustc (via rustup) |
| C++ | g++, clang++, or Visual Studio |
Nothing is downloaded at runtime and no network is used.
- Python: 17 lessons. Theory written for someone who has not programmed before, but
with the interview-relevant detail included (why
x in setbeatsx in list, whylist.pop(0)is O(n), why mutable default arguments bite). - Every other language: 4 lessons covering the syntax you need to read anything, the
collection you will reach for constantly, the language's own defining idea — Java's
classes, C#'s LINQ, Go's multiple returns and errors, Rust's ownership and borrowing,
C++'s references and
<algorithm>, JavaScript's closures — and the string handling interview questions actually demand.
Every lesson has an editable, runnable example program and a graded exercise with staged hints. Both the examples and the exercises are executed by that language's real toolchain.
Every drill is a generator: pick a topic, press the button, and you get a fresh statement with different numbers, different words and freshly computed tests. Grind one concept twenty times without ever replaying a memorised answer.
Python has 31 generators; the other six languages share a portable set of 6. The randomised parameter is baked into the reference solution for each language, so the drill is genuinely re-generated rather than translated.
- 28 multi-language problems — one statement, generated starter code, and a reference solution in all seven languages. Two Sum, Kadane, binary search, sliding window, two pointers, hash maps, prefix sums, bit tricks, the sieve of Eratosthenes, matrices — plus Codility's BinaryGap, PassingCars, CyclicRotation, Dominator, OddOccurrencesInArray and TapeEquilibrium.
- 64 more when Python is selected — the complete Codility lesson set (BinaryGap, MaxCounters, TapeEquilibrium, GenomicRangeQuery, Fish, StoneWall, Dominator …) plus the LeetCode patterns that keep coming up.
Hidden tests run on submit, including deliberately large inputs so an O(n²) answer fails instead of quietly passing.
Free editor with an stdin box, so you can practise the read-from-stdin style of judge exactly as Codility runs it. Each language starts you with the same small program — read stdin, print something formatted, loop — so switching language shows you the same thing written idiomatically elsewhere.
XP, levels, day streak, per-topic breakdown, 14-day chart — in progress.json, local.
There is no JSON parser in the harness, because Java, Rust and C++ do not ship one. Instead each task declares a type signature, and the backend renders the test cases as native literals of the target language, generates a harness that compares the results itself, and prints one line per case in a tiny text protocol:
@@CF|0|PASS
@@CF|1|FAIL|[1, 3]|[0, 1]
@@CFEND
The same signature generates the starter code, so sum_range is
nums: &[i64] -> i64 in Rust, long[] -> long in Java and []int -> int in Go without
anything being written twice.
Syntax highlighting, line numbers, auto-indent, bracket completion, Tab/Shift+Tab
block indent, Ctrl+/ comment toggle, Ctrl+D duplicate line, undo/redo.
Your code runs in a separate process with a timeout, so an infinite loop kills the
sandbox and not the app.
| Key | Does |
|---|---|
Ctrl+Enter |
run tests |
Ctrl+1..5 |
switch tab |
Tab / Shift+Tab |
indent / dedent |
Ctrl+/ |
toggle comment |
Ctrl+D |
duplicate line |
python app.pyPython 3.9+ with tkinter (Debian/Ubuntu: sudo apt install python3-tk).
pip install pyinstaller && pyinstaller --noconfirm CodeForge.specThen check the packaged build can still execute user code — a frozen app has no
python.exe beside it, so CodeForge relaunches its own executable as the interpreter:
python tools/verify_frozen.pyContent is verified, not assumed.
python selftest.py 3 en # Python lessons, drills and problems
python selftest.py 3 de # ... and German, plus translation coverage
python selftest_multi.py # every reference solution in every installed language
python tools/gui_smoke.py # builds the UI, walks every tab and every languageselftest_multi.py skips languages whose toolchain is missing instead of failing, so it
is useful on any machine.
| File | Purpose |
|---|---|
app.py |
window, sidebar, the five tabs |
theme.py |
palette, fonts, flat widgets, the hand-drawn flags |
editor.py |
code editor and output console |
taskview.py |
the shared "solve a task" panel |
languages/ |
one execution backend per programming language |
problems_multi.py |
problems that work in every language |
lessons_multi.py |
the short course for each non-Python language |
drills_multi.py |
randomised drill generators that work in every language |
curriculum.py |
one interface over both kinds of course |
languages/playground.py |
the starter program and build/run recipe per language |
problems.py · problems_de.py |
the Python-only interview bank |
lessons.py · lessons_de.py |
the Python curriculum |
drills.py |
randomised generators (German inline — they interpolate values) |
runner.py |
the Python-only subprocess runner |
i18n.py |
interface language (EN/DE/FR/ES), topic and difficulty names |
problems_multi_i18n.py |
French and Spanish text for the multi-language bank |
progress.py |
XP, streaks and preferences |
Implement languages/base.Backend: probe() to detect the toolchain, type_name()
and literal() to render values, starter() and harness() to generate code, and
run() to build and execute. Register it in languages/__init__.py, add solutions to
the problems in problems_multi.py, and run python selftest_multi.py <your-language>.