What it is
A 2013 North Korean desktop rebuilt as one 304 KB offline HTML file: macOS-like menu bar and dock, 22 apps, a watermark that rewrites the copied file, and a guest account that genuinely cannot buy, send or save. Browses a 49-entry sample of the Kwangmyong address book — the full intranet is a separate project.
Version history
Straight from the project’s own card data — what each version added.
49 entries, 24 page builders, 22 apps, 45/45 at three widths, zero console errors.
Separated from Kwangmyong Network 3.0 in title, scope and cross-links; companion project named in-app.
Files on the site
Full analysis
What it is
A Red Star OS 3.0 desktop — KDE-derived, KCC-built, macOS-aping — rebuilt as one 304,777-byte HTML file that never touches the network: 22 apps, 24 page builders, a 45-assertion self-test, and no assets at all, since the icons are inline SVG and the wallpapers are CSS gradients. It browses a 49-entry slice of the Kwangmyong address book; the intranet itself is a separate project.
Two projects, not one
This is the second DPRK simulator on the site, and the two are kept apart on purpose. Kwangmyong Network 3.0 owns the intranet: 136 catalogue entries, 106 generated pages, 30 hand-built services, a Windows-like taskbar, a graded tele-education exam, Korean and English builds, 72/72 on its own self-test. 붉은별 3.0 owns the machine that browses it: macOS-like menu bar and dock, Sogwang Office, Bokem, SamTaeSong, the media mark, the read-only guest, 45/45 on its self-test.
The split is enforced, not just described. Different trees (kwangmyong-sim/, redstar-sim/), different build scripts, different artifacts, different data sizes — 136 catalogue entries against a 49-entry sample — and no shared file, script or iframe at runtime. Each project's About panel names the other so a reader who lands in either one knows which is which.
Where the content came from
The instruction was "make a red star os sim with all these and search online to keep improving it". All these was a saved address table, which fixed the rule for the whole build: the site list could not be invented. 33 rows came from the "As of May 2016" Kwangmyong table, 12 addresses were read off press photographs of a 2015 Rason tourist chart, and 4 services appear only in reporting. Six categories — infra, dept, lib, remote, core, svc — each entry carrying the address its source gives.
The research half was about not guessing at the shell. Red Star OS is a KDE-based distribution by the Korea Computer Center; 3.0 imitates macOS with a top menu bar, a Dock and traffic-light controls on the left; Naenara is a Firefox fork restricted to Kwangmyong; Sogwang Office is an OpenOffice fork. Component names are real — Ryugyong Janggi, Bokem, SamTaeSong, UnBangUI, Crosswin, Companero, RSLogBrowser — which is why two of them became apps instead of a footnote. A Trend Micro write-up added the detail that Naenara hardcodes 10.76.1.11, the same address the 2016 table lists for 내나라; that is recorded in the About panel rather than quietly smoothed over.
What actually works
An address bar that takes an IP, a .kp host, a Korean name or an English name and lands on the same site — and that fails the way the real network fails. google.com gets a 접속금지 page and a row in the watch log. 8.8.8.8 gets "no route" with a route table. bogus.kp gets name-not-found with suggestions. A simulator that reaches everything would be a lie about the network it models.
The copy-protection theatre is behaviour, not decoration. Copying a document to external media rewrites the copy's body with the KCC mark, the drive serial, the terminal IP and a timestamp; turning the mark off is refused and logged. The second account, 방문자, is genuinely read-only: checkout, send, save and media copy each refuse and log. The shop does real arithmetic against a 48,000원 balance, with stock ceilings, a receipt and an insufficient-funds state.
The bugs
Shop, mail and media panes rendered as stacked plain text, because the markup and the CSS were written in separate passes and nothing checked that every class used in JavaScript had a rule. The phone layout ignored its own breakpoint, because a base rule appended after the media query won the cascade. Self-test screenshots showed a stray "insufficient funds" dialog, because the checkout assertion left its modal open. The activity monitor existed in code but not in the Dock, because its maker was never registered as an app. "45 hosts" failed against 49 entries, because the copy was written before the last four services landed. The English build leaked Korean window titles and user names, because RS.T() ran at parse time before ?lang= was read.
Every one of those is now a check: makers must be registered, counts come from the data, the self-test runs quiet, and the probe fails the build on overflow, on a window under the Dock, or on a start menu taller than the screen.
Honest limits
A simulation, not a copy. No Red Star OS code and no Kwangmyong content: every page body, article, product, price, mail, log line and quiz question was written for this build. Bokem "encrypts" by scrambling characters — theatre, not cryptography, and the About panel says so. The 10.x addresses are unroutable by design and the file never tries to reach them. The subject is a piece of software and the network it was built to browse; no political claim is made.
Build spec
The project’s own build notes, rendered. Open the raw .md ↗
Show the spec
Build spec — 붉은별 3.0 (Red Star OS desktop simulator)
This is the operating-system project. The intranet it browses is a 49-entry sample of the
Kwangmyong address book; the full 136-entry network is a separate project, Kwangmyong Network 3.0
(prompts/kwangmyong-sim-prompt.md). Do not fold them together.
Goal. One offline HTML file that behaves like a 2013 North Korean desktop (Red Star OS 3.0, KCC) browsing the Kwangmyong intranet, where the site list is a real published address table rather than invented filler, and where the restricted-network behaviour (blocked pages, read-only guests, watermarking, watch logging) is functional rather than decorative.
Hard requirements
- Single file, zero network requests: no CDN, no webfonts, no raster assets. Icons are inline SVG,
- 49 catalogue entries = 45 hosts with addresses (33 rows from the “As of May 2016” table, 12 from the
- Address resolution accepts IP ·
.kphost · Korean name · English name and lands on the same site. - 22 apps, each a real maker in a registry: Naenara browser, catalogue, mail, shop, files, office, media,
- Copy protection is behaviour, not copy: copying a document to external media rewrites the copy's body with
- A read-only account (방문자 / Visitor) whose refusals (checkout, send, save, media copy) are each asserted.
localStoragepersistence for basket, balance, files, read mail, log, prefs — one key, versioned.- Korean is the default interface;
?lang=enre-renders every string, including user names and window titles. - Self-test of ≥40 assertions reachable in-page and via
?selftest=1; layout probe via?probe=1.
wallpapers are CSS gradients. Must open from file:// and from a USB stick.
2015 Rason chart) + 4 services only reported in press. Six categories: core / dept / lib / remote / infra / svc. No invented hosts, no invented addresses.
Four failure paths must exist as first-class pages: blocked host (접속금지), unroutable address (no route), unknown .kp (name not found + suggestions), and 404 inside a site.
dictionary, janggi, monitor, Bokem, SamTaeSong, calculator, preferences, terminal, watch log, network monitor, vaccine, terminal registration, remote lectures, about, trash.
© KCC · <drive serial> · <terminal IP> · <timestamp>; disabling the mark is refused and logged.
Data shape
RS.SITES = [ { ko:'남산', en:'Namsan', ip:'10.30.80.101', host:'www.gpsh.edu.kp',
cat:'lib', page:'namsan', note:'…' }, … ]; // 45 of these carry an ip
RS.APPS = [ { id:'browser', ic:'globe', ko:'내나라', en:'Naenara', w:900, h:620,
dock:true, start:true, single:true, make:RS.MK.browser }, … ];
RS.PAGES = { namsan: (site) => `…`, … }; // 24 builders
One entry per host; a page builder per type of site, so 45 hosts do not need 45 bespoke pages. Anything a source does not say gets an honest placeholder page with the address and the table's own label.
Editorial rules
- Sources in the product, not just in the README. The 정보 (About) panel lists the address table, the
- Invented content is labelled. Every page body, article, product, price, mail and log line is written for
- Bokem is theatre. Character scrambling, not cryptography — stated on the box.
- Dead ends teach. A simulated intranet that reaches everything is a lie about the network it models.
- Counts come from data. Every number printed in the UI is computed from its array at render time.
Rason chart, Wikipedia, messaroundery's internals notes and Trend Micro's proxy finding.
the simulation; the About panel says so plainly.
Verification (all of it ran)
cd ~/Desktop/redstar-sim && ./build.sh # node --check on the assembled single <script>
python3.14 dev/verify.py # Playwright, 3 widths + flows
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
The probe opens every app at each width and fails on: window outside viewport, window under the dock, horizontal scroll inside an app body, empty app body, missing menubar/dock/start menu/modal. 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, English build.
File map
html/head.html html/body.html parts/css1..css5.css tokens/boot/login · desktop/shell · pages · responsive · app interiors parts/js1_core.js namespace, T(ko,en), state, storage, icons, toast, modal, log parts/js2_wm.js boot, login, desktop, menubar, dock, start menu, window manager parts/js3_data.js the 49 entries + goods, mail, dictionary, quiz, files parts/js4a_pages.js page frame + 내나라/광명/남산/과학기술전당/로동신문/만방 parts/js4b_shop_mail.js 만물상 + 전자결제, 실리 우편, 사전 parts/js4c_inst.js 북극성, 락원, 기관 사무, 감시/망/백신/등록 parts/js4d_misc.js 원격교육 + 시험, provincial pages, 일반 page, 류경장기 parts/js4e_extra.js 보켐 (encryption), 삼태성 (IDE) parts/js5_apps.js browser engine, catalogue, files+watermark, office, media, monitor, preferences, calculator, trash parts/js6_about.js terminal, about/sources, app registry, boot entry, self-test, layout probe build.sh dev/verify.py dev/shots.py
Rebuild: ./build.sh && python3.14 dev/verify.py.