What it is
A single-file, fully offline simulator of the DPRK national intranet with the desktop cut away: one browser, a 136-site catalogue, 30 hand-built services, intranet mail, a shop with Central Bank e-payment, and a device log that refuses to be erased. English build; the Korean full-desktop original sits beside it.
Version history
Straight from the project’s own card data — what each version added.
English build — localised by 13 build-time fix batches; the sim’s own self-test scored 72/72.
Rescoped to the network: boot, login, desktop, dock, settings, document store and terminal removed; the suite is 41 checks and now asserts the machine is absent.
Files on the site
Full analysis
Kwangmyong — the network, not the machine
The simulator, in full
A working model of the Democratic People's Republic of Korea's national intranet, shipped as one HTML file that runs with the network cable pulled out. It opens straight onto the portal at www.sciteco.aca.kp: no boot sequence, no login, no desktop — a browser, filling the window, with a strip across the top that switches between the eight services the network actually offers.
Those eight are the whole product: the browser, a national search engine, intranet mail, the online shop with a working basket and Central Bank e-payment, Manbang streaming, the site catalogue, the device log, and the About panel that separates documented fact from invention.
Behind the browser are 136 catalogue entries. Thirty have real addresses and hand-built pages — news wires, an encyclopaedia, a university, bookshops, a cooking site, a weather service, an online shop, a graded tele-education exam. The other 106 are generated from their own catalogue rows, so the directory is never a dead end.
What makes it a simulation rather than a mock-up is the log. Every page opened is recorded with a timestamp, including attempts to reach an outside address, and the log is built so it refuses to be erased. That is the point: on this network the interesting fact is not what you can reach, but that reaching it is written down.
Why the cut
The machine and the network were one product, and that was the mistake. A desktop simulator and an intranet simulator share a browser and nothing else: one is about files, windows, accounts and settings, the other is about what a closed network will and will not resolve.
So the boundary is now explicit. This build owns the network. The desktop half belongs to the Red Star OS 3.0 simulator on the same site, which is a separate artefact with its own shell, apps and 49-address sample of the address book. Nothing is shared at runtime between them — no common file, no common script, no iframe.
What that removed from this build: the boot splash, the login gate and its three accounts, the Windows-style desktop, the dock, the start menus, wallpapers and desktop icons, the settings panel, the document store, and the command terminal. Three applications were deleted from the registry outright, and the suite now asserts they are absent, because a feature you have "removed" by hiding a button is not removed.
The read-only visitor account went with the login gate. Its refusal behaviour — no payment, no mail — is still enforced, but the account is now a fixture rather than a choice: you are already on the network when the page loads, and the visitor role is what the log and the shop pages talk about.
How the cut was made
The Korean original stays untouched. The English build is assembled by build-en.sh from the same parts, and the rescope is one extra module appended last: parts/net_shell.js. It
- hides the shell surfaces at CSS level and stacks the window layer under a 42-pixel strip, so every app window fills the frame instead of floating on a desktop;
- disables
K.bootand starts the session directly with a user already on the network; - deletes
set,filesandtermfrom the app registry; - replaces the desktop single-window model: opening a service closes the previous one, so there is exactly one page on screen;
- installs its own self-test, because the original suite was mostly assertions about the desktop.
Keeping the cut in one appended module means the Korean build still compiles from the same source, and the decision is reversible by removing one line from the build script.
What broke
The test suite was the product. Of the original 72 checks, most walked the desktop: login, dock, terminal commands, document storage, settings. Removing the machine removed the tests with it. The new suite is 41 checks, and the ones that matter most are assertions of absence — no boot screen, no login screen, no icons, no dock, no start menu, and three apps that must not exist in the registry. An absence is cheap to test and easy to regress.
The help panel still taught the desktop. Two bullets in "How to use" told the reader to double-click desktop icons and to type find and netstat in the terminal, and a third bullet described signing in. The self-test passed the whole time. It was a text sweep of every Help tab, run after the fact, that found them: tests check behaviour, not whether the prose still describes the product.
The strip overflowed by 330 pixels at 390 wide. Eight labelled buttons plus a wordmark do not fit a phone. Labels collapse to icons under 960 pixels and the wordmark under 560, and the media queries are now part of the build rather than a later fix.
The language toggle had to go. The English build translates at render time, so switching the UI back to Korean made the layer translate its own labels — 한 came back as the word "one". A switch that fights the translation layer is not a feature. This build is English; the Korean original is the button beside it.
One mail page promised a feature that no longer existed — "uploaded files also appear in the document store." The store was gone; the sentence was not. Fixed in the same sweep.
The self-test left visitors in the shop cart. The suite drives the browser hard to prove the shop arithmetic, and it used to end wherever it finished. It now restores the portal before it prints its result.
What I'd change
- Draw the boundary before the first line of chrome. Deciding late that a product is two products cost a rewrite of the test suite and every screen that mentioned a desktop.
- Write absence assertions as soon as something is removed. They are one line each and they are the only thing that stops a removed feature leaking back.
- Sweep the prose, not just the DOM. Behaviour tests cannot see a help page describing a terminal that no longer exists.
- Do not ship two builds of the same idea without naming the boundary on the card. A visitor should be able to tell, before clicking, which one is the machine and which one is the network.
- Check the strip at 390 pixels on the first day. It is the one piece of chrome every page inherits.
What I learned
A simulation is defined by what it refuses to include. The interesting part of Kwangmyong was never the desktop — it was the resolver, the catalogue, the blocked page and the log. Cutting the machine made that visible, and it made the artefact smaller in scope and larger in argument at the same time.
Second: a self-test that ships inside the artefact is only as good as the product it describes. When the product changes shape, the suite has to be rewritten with it, not merely made to pass — and the fastest way to rewrite it honestly is to turn the removals into assertions.
Third: translation and scope interact. A render-time translation layer is a scope decision, not a formatting one, because it will translate whatever chrome you add and it cannot tell a retired feature from a live one.
By the numbers
- 1 HTML file, 430 KB, 6,168 lines, 0 network requests after load
- 136 catalogue sites: 30 hand-built with real addresses, 106 generated from their own rows
- 8 services on the strip; 3 OS applications removed (settings, document store, terminal)
- 41 in-artefact checks, all green, 0 Hangul on screen
- 421 build-time translation rows across 13 batches, 42 unmatched
- 2 published builds: this one, and the Korean full-desktop original
Build spec
The project’s own build notes, rendered. Open the raw .md ↗
Show the spec
Kwangmyong Network 3.0 — the DPRK intranet, network only
Prompt:
Build a single-file, offline, educational simulator of the DPRK national intranet
(Kwangmyong) — and build only the network: the browser, the catalogue, the shops,
the mail, the search, the blocked pages and the surveillance log. No desktop, no
login, no terminal, no settings: the machine is someone else's project. It has to run
from one HTML file with no server and no network calls, and every screen has to be in
English with no residual Korean anywhere a player can reach.
What it is:
www.sciteco.aca.kp — no boot sequence, no login gate |.kp hosts, internal IPs (10.76.1.11), Korean names and shortcuts |google.com, …) returns a "connection forbidden" page explaining the air gap, and writes an entry into the log |What was cut, and what is asserted absent:
boot splash · login gate and its three accounts · Windows-style desktop · wallpaper · desktop icons · dock · start menus · settings panel · document store · command terminal.
The cut lives in one appended module, parts/net_shell.js, and three applications are deleted from the registry rather than hidden. The self-test asserts the absence: no boot screen, no login screen, no icons, no dock, no start menu, and three apps that must not exist.
Skills used:
kwangmyong-sim-en-build— the build-time translation layer, the render-then-scan loop, and the network-only shell.
How the English build works:
The simulator is written as 20+ source modules under parts/ and assembled into one self-contained HTML file. The English build keeps that structure and adds a translation layer: 13 key→value batches (fix3.tsv–fix15.tsv, 421 rows) applied at build time, longest key first, plus a render-time dictionary for anything generated after the build. Anything both miss is caught by a render-then-scan loop — headless Chrome opens the built file, walks all 136 sites and the Help tabs, and dumps their visible text; the Hangul residue is then found in Python, not by eyeballing screenshots.
Verified outcome:
- The simulator ships its own self-test: 41 checks, all green, including the
- Render sweeps report 0 Hangul on the portal, the Help tabs, the catalogue and the
- Nothing in the sim calls the network: it is one HTML file, offline, no server.
- Every article, price and page in it is invented for the simulation — the pages say
assertions that the desktop is gone.
news pages.
so themselves, and the Help screen separates the documented parts (the catalogue, from Wikipedia) from the invented ones.