Development History#
Code Battle grew by shipping an MVP first, fixing the slow and painful parts, and expanding along the way as it was used to support real events. In the early days, progress was often made in small pockets of time between work and study, and keeping a written history helped maintain context and momentum.
May 21, 2017 — Launch the site with a Rock Scissors Paper MVP#
The first MVP of Code Battle was Rock Scissors Paper. It started with a single web page and a single API, and users could inject “their strategy” by implementing callback functions like onGameStart() and onRoundStart() in the code area.
- Tech stack: Built on Node.js + Express with routing and views separated. Monaco Editor was used for the code editor, and Bootstrap provided a minimal responsive layout for both mobile and desktop.
- Game design point: With standard Rock Scissors Paper rules, it’s hard to create strategies that can beat randomness consistently. To introduce room for strategy, the rules were changed so the score depends on what you win with (Scissors: 1, Rock: 2, Paper: 3).
- Concurrent execution issue: If the server can’t distinguish between clients, multiple users running games at the same time can interfere with each other. A simple
trans_idwas introduced to separate transactions and keep sessions isolated. - Production launch: Deployed on an AWS instance (Seoul region) behind Nginx, and the
codebattle.onlinedomain was wired up for the first public launch.
Aug 3, 2017 — Switch from AJAX to Socket.io#
Because the game progresses turn-by-turn and round-by-round, the request volume can be high. Even a small increase in concurrent runs felt like a heavy load on the server. To address this, the game’s in-progress request/response flow was migrated from AJAX to Socket.io.
- Perceived impact: The switch didn’t magically make everything “fast,” but it made the flow clearer and laid a better foundation for real-time features.
- Meaning: This became the groundwork for adding real-time 1:1 battles between users later.
Aug 14, 2017 — Release 1:1 online battles with remote users#
Originally, battles were only possible against opponent logic implemented on the server (RANDOM / LEVEL, etc.). This release added true remote 1:1 online matches between users, including a lobby (nickname), match requests, and basic matchmaking flows.
- Implementation difficulty: Working with sockets for the first time came with a lot of trial and error, and some parts needed cleanup after functionality was working.
- Reality check: “Online battles are available” doesn’t automatically mean there are opponents online. Still, building the feature was valuable for later event operations (tournaments, brackets, etc.).
Sep 6, 2017 — Search engine optimization (SEO)#
Basic SEO work was done for Google and Naver: site verification, sitemap submission, and metadata improvements. After that, it was largely a waiting game—hoping search engines would reflect the changes well.
Nov 1, 2017 — Add Five in a Row (Omok)#
The second game was Omok, and this is when “how to support multiple games cleanly” started to matter.
- Structural changes: The system was refactored so each game could have its own Socket port, controller, and game files.
- Operational friction: Adding a game often required opening ports in AWS security groups, which made “easy game expansion” still somewhat cumbersome.
- Opponent algorithms: Started from RANDOM / LEVEL1 and gradually improved through LEVEL2 and LEVEL3 (e.g., minimax). LEVEL3 in particular required significant debugging to ensure it didn’t lose to lower levels.
Aug 10, 2018 — Add Bulls and Cows (Number Baseball)#
After a long pause, Bulls and Cows was added. The core of the game is narrowing down the answer candidates using feedback such as “balls” and “strikes.” The tricky part is that once the candidate set is narrowed, choosing the “next best guess” often becomes ambiguous—and can drift toward randomness—making it hard to create clear skill gaps between LEVELs.
- Rule tweak for differentiation: A tie-break rule was added: if both sides guess correctly in the same turn, the player with the larger number wins. This helped make LEVEL1 / 2 / 3 meaningfully different.
Aug 20, 2019 — Add Sutda#
Sutda took longer than expected because defining a clean and simple game protocol was difficult.
- Why it was complex: Compared to earlier games, the meaning of “turn” was more complicated, and the starting player could change by round, increasing implementation complexity.
- Scope control: To keep the game manageable, the rules focused on core outcomes like “kkeun,” “ddaeng,” and “gwang-ddaeng (38, 18, 13).”
Sep 24, 2021 — Add an SK Planet event game (1:1 martial-arts tournament concept)#
At NEOWIZ, Code Battle used to be the final session of an internal developer event—and the moment when the room hit peak energy. That memory wasn’t unique to the author. A contact planning an internal developer event at SK Planet discovered the author’s posts via search and reached out, which led to supporting SK Planet’s Code Battle session using this site.
- What “support” included: Beyond building a web page, it included proposing what kind of game would fit the event, how qualifiers and finals could run, and what operational tasks would be needed to run the session smoothly.
- What it proved: Code Battle has value as a service, but its strength as a “tool to energize developer events” became especially clear during this period.
Nov 24, 2022 — Add an SK Planet event game (real baseball)#
There was a fun moment where a contact initially assumed it would be “number baseball” and looked slightly disappointed—until it hookup was clarified that it was “real baseball,” which quickly improved the reaction. From this point on, event-fit rules that are both intuitive and fun to watch became a bigger focus.
Dec 2, 2023 — Add an SK Planet event game (Number Card Battle)#
While considering options like Hold’em, Omok, and Sutda, “gambling themes” felt risky for an internal event. So a new game, Number Card Battle, was designed—borrowing structure from Sutda while changing the theme.
- Feedback: Some participants said the concept was harder than previous years, but the event still wrapped up successfully, which was a relief.
Jan 30, 2026 — Release a traffic-focused improvement and design renewal#
Nearly nine years after the initial launch, Code Battle still had almost no marketing and largely retained its original look. The main reason for holding back was structural: the games exchanged a lot of data with the server during execution, and the system felt fragile under higher concurrent traffic.
- Turning point: While adding SK Planet event games, an approach was developed to run games without server communication during gameplay, which made it possible to define a clear improvement direction.
- Shipping the work: Even after the idea was clear, it was postponed for years—until the Ted Factory planning created a sense of responsibility to finally do it. That led to shipping traffic-related improvements and a design renewal.
July 2026 — Deploy automation, in-browser execution, Google sign-in#
The six months after the renewal were not about adding features but about rebuilding the service’s foundations for operation and growth. From this point on, coding agents such as Claude Code became the main tool, and plans and decisions were kept as documents inside the repository.
- Jul 18, deploy automation: GitHub Actions now deploys only verified commits on master to Lightsail. Every deploy passes through a gate of syntax checks, verification of the numbers the screens claim, a sitemap check, build-output comparison, tests, a runtime smoke test and a dependency vulnerability audit. Production dependency vulnerabilities were brought to zero.
- Jul 20, user code runs in the browser: user code runs in each player’s own browser Worker (a separate thread) with a 2-second limit per callback and no network access. The “no server round-trips” execution validated for some games in January 2026 became the default for every game.
- Jul 26, Google sign-in and membership: SQLite-backed members and sessions, anonymized personal data and revoked sessions on account deletion, a privacy policy and terms of service, a business-information footer and a support email address, all shipped at once.
- Jul 30 to Aug 1, message and measurement: the home message moved from “learn coding” to “code strategy battles,” and the game funnel (battle start, finish and abort, waiting-room enter and exit, code save) is measured as GA4 (Google Analytics 4) events. 56 native
alertprompts were replaced with overlay dialogs.
Aug 2, 2026 — Code saved to accounts and public handles#
Strategy code can be saved to an account: one representative code per game plus ten named versions, with conflicts resolved by revision comparison. The server never runs the code; it only exchanges JSON. Public identity is a single handle (auto-issued at sign-up, changeable once every 30 days, released handles never reused), and the member database is backed up automatically before every deploy.
Aug 6, 2026 — Online battles for members only#
Display names in 1:1 online battles are now set by the server from the account, and one account can be in only one waiting room per game. Real-time matchmaking, however, was judged unable to work in any form until the user base crosses a threshold, so it was deliberately not pushed further. Replacing the “person” with “code” as the opponent, that is, the Arena, became the next step.
Aug 9, 2026 — Code Arena launch (extended to Omok on Aug 11)#
The Code Arena opened: enter your code, other members challenge it, and the results accumulate as a public record. Three technical pieces make it work.
- Determinism: the same two codes with the same seed produce the same replay.
Math.randomandDate.now()are replaced with deterministic versions. - Two-Worker battles: both codes run in the challenger’s browser, each in its own Worker. The server never executes user code.
- Server re-computation: the server receives only the recorded moves and re-computes them with the rules engine to verify the result. Tampered results are rejected.
It started with Rock Scissors Paper and was extended to Omok on Aug 11. Bulls and Cows and Sutda were put on hold: in Bulls and Cows the spectator view would expose both secret numbers, and in Sutda cards drawn with random numbers cannot be re-computed by the server. Each problem has to be solved first.
Aug 13 to 21, 2026 — Korean as the canonical search language, and strategy guides#
- The canonical search language switched from English to Korean. The canonical page is the one search engines index as the representative among language versions. While the default language was English, every page search engines indexed was the English version, and search traffic from Korea, the most engaged audience, was practically nonexistent for 90 days. English browsers still get English via the
Accept-Languageheader, so in practice only crawlers are affected. Six weeks after the switch, searches for “omok code” (in Korean) started bringing visitors. - Strategy guides on all four game screens. Every result the guides state was measured with the real rules engine, and the repository’s tests re-verify those numbers on every deploy. Measuring turned up a few findings: in Omok, adding one distinction between open and blocked lines turned a total loss against LEVEL 1 into a total win, and in Sutda the more sophisticated version did worse (fold too often and the opponent exploits it).
- The home “How it works” section was rewritten from prose into actual running Rock Scissors Paper code with verified results.
- Marketing groundwork: static asset compression (a first visit to a game screen dropped from about 3.2MB to 912KB), per-game share cards, and a branded 404 page.
Aug 23, 2026 — Developer event inquiry path#
An information page for using Code Battle at events (/events) and a pre-filled inquiry email were added. The old event archive pages’ indexing, sharing and mobile defects (wrong canonical, empty share card, missing viewport) were fixed at the same time.
Aug 30, 2026 — Specs for coding agents#
Each game’s spec is served as markdown at a fixed URL such as /specs/omok, and /llms.txt lists all four. The specs render from the same source as the human-facing screens (locale keys and sample code files), so they cannot drift. There was one acceptance criterion: an agent fed only the spec must produce non-disqualified code on the first try. It held for all four games. The home and events pages also changed their message from “assumes you code by hand” to “agents welcome.”
Sep 6, 2026 — Marketing plan and groundwork#
For the first time in nine years, a marketing plan was drawn up. The goal is not revenue but exposure, validating the appeal, and hands-on practice at marketing. What happened that day was preparation only: a metrics baseline was recorded, a weekly operating loop and a record structure were set up, and the first campaign was defined: feed a coding agent nothing but the omok spec, take its code, and pit it against the best strategy a human learns on the screen. The experiment’s code and measurements were finished by the next day, but actual marketing, publishing anything outside, has not started yet.