← Isaac's builds Simulation · 2026 Educational, not a copy

붉은별 3.0 — rebuilding the Red Star OS desktop

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.

Artifact
304,777 B single file
Catalogue
49 sample addresses, not the net
Apps
22 + 41 terminal spellings
Page builders
24 6 site categories
Self-test
45 assertions
Network calls
0 offline by design
The instruction

“can you make a red star os sim with all these and search online to keep improving it”

▶ Run the simulator Byte-identical mirror Build spec Companion: the network

Two projects, not one

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)
Ownsthe intranet and its contentthe operating system and its rules
Catalogue136 entries, 106 generated pages, 30 hand-built services49-entry sample: 45 addresses + 4 services
ShellWindows-like taskbar, start menu, traymacOS-like menu bar, dock, traffic-light controls
BuildsKorean + English, 72/72 self-testKorean + English, 45/45 self-test
Signature apps은정 cloud, 류경오락장 games, 철벽 filter editor, 무병 checker, graded examSogwang Office, Bokem, SamTaeSong IDE, activity monitor, media mark
Copy protectionwatch log; logout refusalwatermark rewrites the copied file; guest account enforced read-only
OpenEnglish build · Koreanthis build · mirror

Same research lineage, different artifact. Nothing is shared at runtime: no common file, no common script, no iframe between them.

Try it without leaving this page

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.

Where the content came from

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.

CategoryEntriesWhat it isExample
infra12Portals, mail, search, the browser's own home10.76.1.11 내나라
dept11Ministry and institutional servers10.41.1.2 기관 사무
lib9Libraries, dictionaries, journals10.30.80.101 남산
remote9원격교육 bases at universities10.42.1.250 룡남산
core4Kim Il-Sung University, science hall10.10.10.10 과학기술전당
svc4Shop, mail, games, dictionary10.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.

How an address resolves

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.

Four things that had to actually work

1 · The watermark is not a label

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.

2 · 방문자 is genuinely read-only

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.

3 · The shop does arithmetic

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.

4 · One <script>, one gate

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.

Version ladder — and what got cut

1

V1 — the shell

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).

2

V2 — the address book

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.

3

V3 — the honesty pass

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.

Failure modes — the bugs this build actually had

SymptomCauseFix
Shop, mail and media windows rendered as plain stacked textMarkup and CSS were written in separate passes; class names in the JS had no ruleAudited every class="…" token against the CSS, then wrote the missing interiors
Phone layout ignored its own breakpointA base rule appended after the media query won the cascadeMoved responsive overrides into a final block at the end of the stylesheet
Self-test screenshots showed a stray “insufficient funds” dialogThe checkout assertion left its modal openQuiet flag during the run + explicit modal close
Activity monitor existed in code but not in the DockIts maker was never added to the app registryAdded an assertion that every maker is registered — the test now catches it
“45 hosts” failed against 49 entriesCopy written before the last four services were addedCounts now come from the data at runtime, not from prose
English build leaked Korean window titles and user namesRS.T() ran at parse time, before ?lang= was readNames and roles re-localised after language load

Verification

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.

What a green run does not mean: the probe measures geometry and presence, not taste. The visual pass — screenshots at each width, looked at — still found a start menu taller than the screen, an unstyled key/value block and four icons that read as blobs. Automated checks are the floor, not the finish line.

Honest limits

This is a simulation, not a copy of anything. No Red Star OS code, no Kwangmyong content, no real page text appears here — every article, product, price, mail, log line and quiz question was written for this build. Bokem “encrypts” by scrambling characters: it is theatre, not cryptography, and the About panel says so. The file makes zero network requests and the 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.

Evidence

ItemValue
Artifact304,777 bytes, one <script>, zero external URLs
sha256b8cc407f24d32b1f940bef75214a7f1316761925d6ab65378b2890a98117a6a3
Source4,768 lines across 15 parts (10 JS, 5 CSS) + build script
Data49 entries · 24 page builders · 22 apps · 10 goods · 6 mail · 14 dictionary entries · 6 quiz questions
Terminal29 commands / 41 spellings, with ↑↓ history
Mirrordemos/redstar-sim-mirror/index.html — byte-identical to the desktop artifact
Served copyCloudflare 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.
Tests45 in-page assertions + 3-width layout probe + 14 browser flows, all passing

What's next

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.