Windows Phone in the browser
See the code▶ Try it: wphone.dev — best on a phone (tap the Add to Home tile to install it full screen).
Built by Claude. This project was designed and written end to end by Claude (Anthropic's Claude Opus 5.5, in Claude Code). One Claude session planned the architecture, wrote the OS core, the shell, the backend and the app SDK, then ran seven Claude sub-agents in parallel to build the 64 apps against that SDK, and finally integrated, tested and fixed everything in a real browser. No code in this repository was written by hand.
A Windows Phone 8.1 simulator for the web, made for mobile browsers (on desktop it runs inside a Lumia-style frame). It is an entertainment project: live tiles, the lock screen with the Bing image of the day, Action Center, the task switcher, Cortana, Xbox games, and a private on-device file system — nothing a visitor creates ever leaves their browser.

![]() Lock screen | ![]() Start with live tiles | ![]() Action Center |
![]() Weather | ![]() Cortana | ![]() Messaging |
![]() People | ![]() Solitaire | ![]() Settings |
On a phone it runs full screen (shots at 390×844); on desktop it sits inside a Lumia-style frame. Contacts, messages and headlines in these shots are fictional.
Everything a visitor creates — files, photos, notes, contacts, messages, settings — lives only in their own browser's IndexedDB. Nothing is uploaded and there are no accounts.
.vcf file if they want to.Content-Security-Policy: sandbox (opaque origin) and IE frames them without
allow-same-origin, so web pages can never read the simulator's storage. The proxy refuses private/internal addresses (SSRF guard).npm install
npm run server # backend API on :8787
npm run dev # Vite dev server on :5173 (proxies /api to :8787)
Open http://localhost:5173. Camera and microphone require HTTPS or localhost.
Desktop keyboard: Esc/Backspace = Back, Home = Start, F2 = task switcher, F3 = Cortana, F4 = lock.
Long-press Back = task switcher, long-press Search = talk to Cortana, pull down the status bar = Action Center,
long-press a tile = edit Start. On a phone, the Add to Home tile on Start installs it to your home screen so it runs
full screen (Chrome/Edge/Samsung Internet show the install dialog; on iPhone it explains Share → Add to Home Screen).
The same code deploys two ways: a Node server on a VPS, or a Cloudflare Worker.
npm ci
npm run build # outputs dist/
PORT=8787 node server/index.js # serves dist/ + /api
Put it behind a reverse proxy with HTTPS (needed for camera, microphone and the offline service worker), e.g. Caddy:
wphone.example.com {
reverse_proxy localhost:8787
}
Keep it running with pm2: pm2 start server/index.js --name wphone (set PORT as needed).
npm run buildnpx wrangler deploymain rebuilds and redeploys automatically.wrangler.jsonc serves the built dist/ with Workers Static Assets (with single-page-app fallback) and runs the Worker
only for /api/*. HTTPS comes for free on *.workers.dev or your own domain. The Worker gets the visitor's approximate
city from Cloudflare itself, so no third-party IP lookup is made.
To try the Worker locally: npm run cf:dev (http://localhost:8787). To deploy from your machine instead of Git: npm run cf:deploy.
Vite + vanilla JavaScript (no framework) on the front end, Hono for the backend (runs on Node or Cloudflare Workers).
server/app.js shared Hono API (Web APIs only): Bing image of the day, weather (Open-Meteo), geocoding, IP location, news/RSS, FX rates,
stock quotes, translation, search/suggest, internet radio, podcasts, readable articles, sandboxed proxy
server/index.js Node entry (VPS): API + static dist/ server/worker.js Cloudflare Workers entry (wrangler.jsonc)
src/os/ the "OS": kernel (app lifecycle, back stack), fs (IndexedDB file system), settings, theme, tiles (live tiles),
notifications, media (background audio), device (Web API wrappers), net, pickers, sounds, ui (Metro controls)
src/shell/ status bar, nav bar, lock screen, Start + app list, Action Center, task switcher, volume flyout, first run
src/apps/<id>/ apps, auto-discovered (manifest.js, index.js, optional tile.js live tile and background.js service)
docs/APP_SDK.md how to write an app for the simulator
Public data sources used by the backend: Bing, Open-Meteo, BigDataCloud, ipwho.is, BBC RSS, open.er-api.com, Yahoo Finance, MyMemory, DuckDuckGo, radio-browser.info and the iTunes podcast directory. Maps uses OpenStreetMap, Esri imagery, Nominatim and OSRM.
Windows Phone, Lumia, Xbox, Cortana and other names are trademarks of their respective owners. This is a fan-made tribute, not affiliated with Microsoft or Nokia.
JavaScript
82.2%
CSS
17.7%
Windows Phone in the browser
See the code▶ Try it: wphone.dev — best on a phone (tap the Add to Home tile to install it full screen).
Built by Claude. This project was designed and written end to end by Claude (Anthropic's Claude Opus 5.5, in Claude Code). One Claude session planned the architecture, wrote the OS core, the shell, the backend and the app SDK, then ran seven Claude sub-agents in parallel to build the 64 apps against that SDK, and finally integrated, tested and fixed everything in a real browser. No code in this repository was written by hand.
A Windows Phone 8.1 simulator for the web, made for mobile browsers (on desktop it runs inside a Lumia-style frame). It is an entertainment project: live tiles, the lock screen with the Bing image of the day, Action Center, the task switcher, Cortana, Xbox games, and a private on-device file system — nothing a visitor creates ever leaves their browser.

![]() Lock screen | ![]() Start with live tiles | ![]() Action Center |
![]() Weather | ![]() Cortana | ![]() Messaging |
![]() People | ![]() Solitaire | ![]() Settings |
On a phone it runs full screen (shots at 390×844); on desktop it sits inside a Lumia-style frame. Contacts, messages and headlines in these shots are fictional.
Everything a visitor creates — files, photos, notes, contacts, messages, settings — lives only in their own browser's IndexedDB. Nothing is uploaded and there are no accounts.
.vcf file if they want to.Content-Security-Policy: sandbox (opaque origin) and IE frames them without
allow-same-origin, so web pages can never read the simulator's storage. The proxy refuses private/internal addresses (SSRF guard).npm install
npm run server # backend API on :8787
npm run dev # Vite dev server on :5173 (proxies /api to :8787)
Open http://localhost:5173. Camera and microphone require HTTPS or localhost.
Desktop keyboard: Esc/Backspace = Back, Home = Start, F2 = task switcher, F3 = Cortana, F4 = lock.
Long-press Back = task switcher, long-press Search = talk to Cortana, pull down the status bar = Action Center,
long-press a tile = edit Start. On a phone, the Add to Home tile on Start installs it to your home screen so it runs
full screen (Chrome/Edge/Samsung Internet show the install dialog; on iPhone it explains Share → Add to Home Screen).
The same code deploys two ways: a Node server on a VPS, or a Cloudflare Worker.
npm ci
npm run build # outputs dist/
PORT=8787 node server/index.js # serves dist/ + /api
Put it behind a reverse proxy with HTTPS (needed for camera, microphone and the offline service worker), e.g. Caddy:
wphone.example.com {
reverse_proxy localhost:8787
}
Keep it running with pm2: pm2 start server/index.js --name wphone (set PORT as needed).
npm run buildnpx wrangler deploymain rebuilds and redeploys automatically.wrangler.jsonc serves the built dist/ with Workers Static Assets (with single-page-app fallback) and runs the Worker
only for /api/*. HTTPS comes for free on *.workers.dev or your own domain. The Worker gets the visitor's approximate
city from Cloudflare itself, so no third-party IP lookup is made.
To try the Worker locally: npm run cf:dev (http://localhost:8787). To deploy from your machine instead of Git: npm run cf:deploy.
Vite + vanilla JavaScript (no framework) on the front end, Hono for the backend (runs on Node or Cloudflare Workers).
server/app.js shared Hono API (Web APIs only): Bing image of the day, weather (Open-Meteo), geocoding, IP location, news/RSS, FX rates,
stock quotes, translation, search/suggest, internet radio, podcasts, readable articles, sandboxed proxy
server/index.js Node entry (VPS): API + static dist/ server/worker.js Cloudflare Workers entry (wrangler.jsonc)
src/os/ the "OS": kernel (app lifecycle, back stack), fs (IndexedDB file system), settings, theme, tiles (live tiles),
notifications, media (background audio), device (Web API wrappers), net, pickers, sounds, ui (Metro controls)
src/shell/ status bar, nav bar, lock screen, Start + app list, Action Center, task switcher, volume flyout, first run
src/apps/<id>/ apps, auto-discovered (manifest.js, index.js, optional tile.js live tile and background.js service)
docs/APP_SDK.md how to write an app for the simulator
Public data sources used by the backend: Bing, Open-Meteo, BigDataCloud, ipwho.is, BBC RSS, open.er-api.com, Yahoo Finance, MyMemory, DuckDuckGo, radio-browser.info and the iTunes podcast directory. Maps uses OpenStreetMap, Esri imagery, Nominatim and OSRM.
Windows Phone, Lumia, Xbox, Cortana and other names are trademarks of their respective owners. This is a fan-made tribute, not affiliated with Microsoft or Nokia.
JavaScript
82.2%
CSS
17.7%