A 2013-era North Korean operating system, rebuilt as one 304 KB HTML file that never touches the network: menu bar, dock, traffic lights, Sogwang Office, the Naenara browser, the media mark that rewrites a copied file, and a guest account that genuinely cannot buy, send or save. It browses a 49-entry sample of the Kwangmyong address book — the network itself is a separate project.
“can you make a red star os sim with all these and search online to keep improving it”
This is the second DPRK simulator on this site, and the two are deliberately separate — different shells, different data, different jobs. Kwangmyong Network 3.0 owns the intranet: 136 catalogue entries, 30 hand-built services, a Windows-like taskbar. This one owns the machine that browses it: a macOS-like desk, 22 apps, the media mark, the read-only guest. The 49 addresses here are a sample chosen to prove the browser, the watch log and the watermark interlock — not a replacement for the full network.
| Kwangmyong Network 3.0 | 붉은별 3.0 (this page) | |
|---|---|---|
| Owns | the intranet and its content | the operating system and its rules |
| Catalogue | 136 entries, 106 generated pages, 30 hand-built services | 49-entry sample: 45 addresses + 4 services |
| Shell | Windows-like taskbar, start menu, tray | macOS-like menu bar, dock, traffic-light controls |
| Builds | Korean + English, 72/72 self-test | Korean + English, 45/45 self-test |
| Signature apps | 은정 cloud, 류경오락장 games, 철벽 filter editor, 무병 checker, graded exam | Sogwang Office, Bokem, SamTaeSong IDE, activity monitor, media mark |
| Copy protection | watch log; logout refusal | watermark rewrites the copied file; guest account enforced read-only |
| Open | English build · Korean | this build · mirror |
Same research lineage, different artifact. Nothing is shared at runtime: no common file, no common script, no iframe between them.
Password field accepts anything — the refusal path is ?lang=en, ?selftest=1 and
?probe=1 at the end of the URL. Log in as 방문자 / Visitor to see the read-only account.
Two constraints shaped everything. First: use the saved hosts, not invented ones. A 2016 table of Kwangmyong addresses (33 rows) plus 12 addresses read off press photographs of a 2015 Rason tourist chart plus four services that only appear in reporting — 49 catalogue entries in six categories, each with the address the source gives. This build uses a 49-entry sample of that table; the full 136-entry catalogue belongs to the Kwangmyong Network 3.0 project.
Second: search online to keep improving, which meant the visual and behavioural claims had to be sourced rather than guessed. Red Star OS 3.0 is a KDE-based Linux distribution by the Korea Computer Center; its shell imitates macOS (top menu bar, Dock, traffic-light controls on the left); Naenara is a Firefox fork restricted to the Kwangmyong intranet; Sogwang Office is an OpenOffice fork. Component names — Ryugyong Janggi, Bokem, SamTaeSong, UnBangUI, Crosswin, Companero, RSLogBrowser — are real, which is why two of them became actual apps here instead of being mentioned in a paragraph.
| Category | Entries | What it is | Example |
|---|---|---|---|
| infra | 12 | Portals, mail, search, the browser's own home | 10.76.1.11 내나라 |
| dept | 11 | Ministry and institutional servers | 10.41.1.2 기관 사무 |
| lib | 9 | Libraries, dictionaries, journals | 10.30.80.101 남산 |
| remote | 9 | 원격교육 bases at universities | 10.42.1.250 룡남산 |
| core | 4 | Kim Il-Sung University, science hall | 10.10.10.10 과학기술전당 |
| svc | 4 | Shop, mail, games, dictionary | 10.30.40.50 만물상 |
Real: the addresses, the categories, the component names, the shell grammar, the watermarking behaviour. Invented: every page body, article, product, price, mail, log line, quiz question and all artwork.
One function owns the whole "web". Type an IP, a .kp name, a Korean site name or an English one
and it lands in the same place; anything else has to fail the way the real network fails, not with a JavaScript
error.
입력 (address bar) │ ├─ 10.30.80.101 ────────────→ exact IP match ──→ 남산 library page ├─ www.gpsh.edu.kp ─────────→ host field ────→ 남산 library page ├─ 남산 / Namsan ────────────→ name alias ────→ 남산 library page ├─ google.com ──────────────→ not in table ────→ 《접속금지》 + 감시기록 row ├─ 8.8.8.8 ─────────────────→ outside 10/8 ───→ “no route”, route table shown └─ bogus.kp ────────────────→ .kp miss ────────→ name-not-found + suggestions
That last trio is the point. A simulator that opens every link teaches nothing about a network whose defining feature is that it doesn't reach the open internet — so the blocked page, the unrouted page and the nxdomain page are first-class, each with its own status bar, error code and log entry.
Copying a document to 외부매체 rewrites the copy's body with
© KCC · RS3-0147-KCC · 10.41.7.24 · date time and tags the original. Turning the mark off is
refused and written to the watch log — the behaviour the real system is documented to have, reduced to
something you can try in two clicks.
A second account, not a second theme: windows carry a READ-ONLY badge and checkout, send, save and media copy each refuse and log. Every refusal is asserted, so a future edit that quietly grants write access fails the self-test instead of shipping.
Basket quantities, stock ceilings, 전자결제 against a 48,000원 balance, a receipt with an order number, and an insufficient-funds modal when the basket exceeds it. Nothing is pre-rendered: the totals, the change and the balance all come from the same state object.
Authored as 15 parts and concatenated into a single script tag, so build.sh can run
node --check on the assembled file and refuse to write output if it doesn't parse. One
broken part cannot ship a dead page — which matters when the whole app is one file.
Boot sequence, login, desktop, Dock, window manager, Naenara with three pages. Cut: a 4.0-style dock (visually nicer, historically wrong for 3.0 — 4.0 is the macOS-like release, 3.0's shell is the KDE-derived one, so the whole thing was rebuilt around 3.0).
All 49 entries, six categories, 24 page builders, the shop, mail, files, office, media, terminal.
Cut: generated pages for hosts whose real purpose is unknown — a fake "online shop" for a server that
the table only lists as 10.x would be invention dressed as research. Those get an honest
placeholder page with the address and what the table says.
Two real component names became apps (Bokem encryption, SamTaeSong IDE); the layout probe, the 45-assertion self-test and a visual pass at 390/768/1440 px. Cut: image assets. Icons are inline SVG and the OS wallpapers are CSS gradients, so the file stays dependency-free and offline.
| Symptom | Cause | Fix |
|---|---|---|
| Shop, mail and media windows rendered as plain stacked text | Markup and CSS were written in separate passes; class names in the JS had no rule | Audited every class="…" token against the CSS, then wrote the missing interiors |
| Phone layout ignored its own breakpoint | A base rule appended after the media query won the cascade | Moved responsive overrides into a final block at the end of the stylesheet |
| Self-test screenshots showed a stray “insufficient funds” dialog | The checkout assertion left its modal open | Quiet flag during the run + explicit modal close |
| Activity monitor existed in code but not in the Dock | Its maker was never added to the app registry | Added an assertion that every maker is registered — the test now catches it |
| “45 hosts” failed against 49 entries | Copy written before the last four services were added | Counts now come from the data at runtime, not from prose |
| English build leaked Korean window titles and user names | RS.T() ran at parse time, before ?lang= was read | Names and roles re-localised after language load |
Not a screenshot — a real Chromium at three widths, driving the flows and then opening every app to measure it.
1440x900 selftest 45/45 probe_ok=True console=0 pageerrors=0
768x1024 selftest 45/45 probe_ok=True console=0 pageerrors=0
390x844 selftest 45/45 probe_ok=True console=0 pageerrors=0
flows: boot → empty-password refusal → login → home page → blocked host → IP resolve
→ nxdomain → basket maths → checkout deduction → mail rows → terminal
→ watermark modal → guest read-only (4 refusals) → English build
The probe fails the build on any window outside the viewport, any window overlapping the Dock, any horizontal scroll inside an app body, an empty app, a missing menu bar or Dock, or a start menu that runs off the screen. Two of those caught real defects the DOM assertions were blind to.
10.x addresses are unroutable by design — this page
never tries to reach them. No political claim is made; the subject is a piece of software and the network it
was built to browse.
| Item | Value |
|---|---|
| Artifact | 304,777 bytes, one <script>, zero external URLs |
| sha256 | b8cc407f24d32b1f940bef75214a7f1316761925d6ab65378b2890a98117a6a3 |
| Source | 4,768 lines across 15 parts (10 JS, 5 CSS) + build script |
| Data | 49 entries · 24 page builders · 22 apps · 10 goods · 6 mail · 14 dictionary entries · 6 quiz questions |
| Terminal | 29 commands / 41 spellings, with ↑↓ history |
| Mirror | demos/redstar-sim-mirror/index.html — byte-identical to the desktop artifact |
| Served copy | Cloudflare Pages adds two tags at </head> on the way out — its analytics beacon and this site's skin engine (+390 B). Strip those and the served file equals the repo file byte for byte; the artifact itself is unchanged. |
| Tests | 45 in-page assertions + 3-width layout probe + 14 browser flows, all passing |
The obvious gap is real page content: the Wayback Machine has captures of the foreign-facing mirrors (naenara, KCNA, Rodong Sinmun) from late 2026, and baking those into local files would let the intranet pages carry real HTML instead of my written copy. The second is depth in 원격교육 — exam papers and lecture pages — because that category is the least documented and the most interesting.