Start here Doc/DEVELOPER-SETUP.md - clean-machine toolchain, exact WebKit tag + patch, x64 build, ARM compile-only audit.
Documentation map: Doc/INDEX.md
Live work and acceptance: Doc/ROADMAP.md | Doc/Archive/MVP.md
Detailed dated investigations are retained locally in Doc/Archive/; they are history, not the current spec.
- x64: build, install and bench runs are allowed and were verified. M1 (file-backed cookie jar) is
DONE on x64:
LocalState\cookie.jar.dbstarts empty, receives theapo=m1cookie, and still contains it after a full app restart. M2 (durable localStorage) is DONE on x64 as post-.73source work:LocalState\localstorage.dbretains a key across a force-stop and a full app restart. The prepared.73release ZIPs predate M2 and are frozen. - ARM32: package compile and PE/export audit are complete (30 ARM binaries, 48/48 driver exports); execution is deliberately forbidden in this project, so no ARM runtime claim is made.
- WebKit: not vendored. The complete port is
WebKitPatches/apotheosis-webkit-2.52.4.patch, 110 paths againstwebkitgtk-2.52.4/7acdf5e1.WebKit/and all build/native outputs are git-ignored.
Porting modern WebKit/WebCore to Windows 10 Mobile (ARM32, UWP) for a deliberately small Lumia 950
browser: address bar, Back, painted pages, scrolling, and useful navigation. The shipping host is the
C# UWP app in Src/Apotheosis; the C++/CX harness in Src/harness is the native diagnostic tool.
The older claims below are preserved, not revalidated for .93. In particular, the old JSC/JIT diagnosis and GPU checkmarks do not establish the cause or rendering status of this run.
| Feature | Status |
|---|---|
| Deploy + launch over Device Portal (WiFi, ~20 min for a 45 MB appx) | ✅ |
| Startup through all 11 constructor checkpoints | ✅ |
ICU 78 init, ubrk_open verified |
✅ |
HTTPS via curl + OpenSSL with the packaged cacert.pem |
✅ |
| First page in a session renders | ✅ example.com → nonwhite=177840/177840, rs=C |
| JavaScript on a real site | ✅ ya.ru: React bundles report l1e0f1 — loaded, no error, executed |
| Touch reaching the engine | ✅ ManipDelta: session=1 dx=1.2 dy=4.6 |
| Second and later loads in one session | ❌ blank frame (nonwhite=0) with rs=C, pending=0 and correct layout — or, before the reload fix, a silent process death with no UEF line and no dump |
Scrolling on about:home |
⚪ disabled by design — no engine session for the internal page |
The earlier device milestones — JIT, GPU compositing, live sessions, pinch-zoom, the browser shell — were verified on previous builds and are listed further down; this table is the current run.
| Component | Status |
|---|---|
| WebKit CMake configure (x64-uwp, GPU + JIT + FTL_JIT) | ✅ |
| WTF + bmalloc + PAL + JavaScriptCore + WebCore | ✅ |
Port driver (WebCoreDriver-gpu.lib) |
✅ |
Harness appx (manifest 0.1.8.51) |
✅ builds, registers, launches on Win11 AppContainer; loads real pages — example.com → rc=0, title=Example Domain (see log) |
| XAML activation | ✅ fixed via XBF bypass, code-only UI fallback |
Engine DLL load + JSC init + Page::create + first style pass |
✅ |
| Text rendering on x64 | ✅ about:home paints antialiased glyphs (Tier-3 font crash fixed Aug 10, complex-text-path routing fixed Aug 11) |
| CJK text | ✅ hang root-caused & fixed (Aug 16) — FontDataCacheKeyTraits::emptyValue hash-sentinel infinite loop; simhei system fallback via forced bundled face; 8/8 trace suite passes |
| Real sites | ✅ example.com loads (rc=0); ladder file:// → http(s):// → big sites ongoing |
| GPU compositing (ANGLE D3D11 FL9.3) | ✅ renders undistorted — whole-content stretch FIXED Aug 16 via WebCoreGpuResize (surface recreated at ContentArea size on the engine thread; verified contents=1024x694, repeated resizes rc=0, no crash). Real-device (ARM32) validation pending |
| ARM32 toolchain | ✅ installed and proven — Microsoft.VisualStudio.Component.VC.14.44.17.14.ARM (the versioned component; the tree is pinned to toolset 14.44.35207). VS 2022 17.14 ships no vcvarsamd64_arm.bat, and Lib\10.0.26100.0\um\arm has to be a junction to the 19041 one — both shims are recreated by Src\tools\arm-bootstrap.ps1. Details in Doc/BUILD-ARM32.md §11 |
Toolchain recovery (Aug 14, 2026): after the OS reinstall, the whole x64-uwp line was rebuilt from scratch (LLVM 22.1.8 / CMake 4.0.1 / Ninja / Python 3.12 / vcpkg 13 ports / ICU75 import libs / harfbuzz / Ruby 3.4.10 + MSYS2 / perl / ccache). Engine DLLs are being rebuilt by
ninja -C build-x64-gpu WebCore -j1(scheduled taskApotheosisNinja). Details inDoc/Summary.md.
- BCryptGenRandom NTSTATUS fix — logic inversion was crashing JSC init on success. Fixed in
RandomDevice.cpp. - XAML activation bypass — skip
Frame::Navigate/LoadComponent(null type-provider in AppContainer); direct page creation. - WebCoreRenderHtml SW pipeline (Jul) — HTML→layout→Cairo→bitmap→screen verified on x64.
- Toolchain recovery (Aug) — after a Windows reinstall, restored the x64-uwp line (
reinstall-env.ps1, ICU75 import libs, harfbuzz import lib, fontconfig dropped — 0 refs). Full build green. - Appx v0.1.8.25 launches — engine init clears XAML/JSC/
Page::create; crash is localized to font resolution. - CJK hang root-caused & fixed (Aug 16) — the "strange font height / CJK tofu" report was an infinite loop in
FontDataCacheKeyTraits::emptyValue(): the WK_WINUWPFontPlatformDatactor gave the size-0 hash-table empty-sentinel a livem_scaledFont, so a memset-0 slot never compared equal to it and the linear probe spun forever. Fixed by keepingm_scaledFontnull for size 0 (if (size)guard,FontPlatformData.cpp:182). CJK now resolves through a forced simhei bundled face (stubs-font-uwp.cpp+apotheosisSetForcedBundledFontName). Full 8-test trace suite passes (single/mixed/wan-meta/kana-n/br-kana/mixed-e/br-euro/cjk-b — all ALIVE,gdc-> c=U+4E00 g=1078 ok=1). - GPU whole-content distortion (FIXED Aug 16) —
WebCoreGpuInitcreated the ANGLE swapchain once at 720×1080 and GPU mode never resized it; theSwapChainPanelstretched it to ContentArea, so any aspect mismatch made all content look too wide. Fixed withWebCoreGpuResize(WebCoreDriver.cpp): the harness posts a resize job (freshPropertySet+EGLRenderSurfaceSizeProperty) that recreates the GLContext/surface + TextureMapper on the engine thread, thenfinishInteractionPaint. Verified on x64:contents=1024x694post-resize, rc=0 across many live resize cycles, 200×200 test squares stay square. Fonts themselves were always correct. - ARM32 launch crash root-caused (Aug 19) —
SecurityOrigin::protocol()and::host()returnedconst String&to temporaries. x64 tolerated the dangling reference for months; ARM32 faulted on the firstDocument::initSecurityContext. Both now returnStringby value, which also removed a local patch inContentSecurityPolicy.cppthat had been treating the symptom. Two documented false trails came with it, including a probe that crashed inside its own diagnostics. SeeDoc/ARM32-DANGLING-SECURITYORIGIN.md. - The browser was reloading every page by itself (Aug 20) — after
WebCoreGpuInitsucceeded, the harness re-navigated to the current URL to "re-render through the compositor". The engine was still loading, so the reload was parked andNavRetryreplayed it once the first load finished — and the second load of the same page killed the process with no exception and no dump. The first load had already loggedcompositing=1, so the reload could not even have helped. Removed; a composited frame is now requested explicitly instead of refetching the page. - White screen fixed by separating two facts (Aug 20) — "GPU initialised" and "this document can be presented through the GPU" are not the same. The old code hid the software surface the moment
WebCoreGpuInitreturned 0; on a page with no compositing layers the GPU path then had nothing to draw. Measured:example.comreportedEnableCompositing=0 Composite=-12(kErrNoSession) while the engine had paintednonwhite=177840/177840. The switch toGpuPanelis now conditional on a frame actually coming out of it. - HarfBuzz/ICU divergence between the lines (Aug 20) — x64 had
USE_HARFBUZZoff and ICU 75.1; ARM32 has it on with ICU 78.3. Six causal links, from an inverted architecture gate inOptionsWinUWP.cmakedown to the x64 ICU having no pkg-config files. It surfaced as a duplicate-symbol link error and means every rendering comparison made on x64 was using a different text-shaping engine than the device. SeeDoc/HARFBUZZ-ICU-DIVERGENCE.md. - Open, and now sharply bounded — the first load in a session renders, later ones do not: the same
example.comgivesnonwhite=177840/177840first and0/177840third, withrs=C,pending=0and correct layout each time. One root cause with two faces — it used to crash, now it paints nothing. The load path is healthy; the paint target is not.
Harness (UWP C++/CX App)
· SwapChainPanel ← GPU | WriteableBitmap ← SW fallback
│ C ABI (WebCoreDriver.h)
WebCoreDriver (port layer)
· Page/frame management, event dispatch
· Cairo software | TextureMapper GPU rendering
│
WebKit / WebCore / JSC / WTF
· WK_WINUWP patches for ARM32 UWP App Container
Apotheosis.sln ← open this in Visual Studio: it holds the harness, and only the harness
Src/
├── port/ ← the WebCore driver, the Port-layer clients, the stubs, the build scripts
│ NOT built by msbuild — clang-cl + lld-link via link-driver-gpu-{x64,arm32}.ps1
├── harness/ ← the UWP host app (C++/CX, XAML). THIS is the browser
├── tools/ ← deploy over Device Portal, log collection, the x64 test cycle
├── angle/include/ ← ANGLE headers (the binaries are gitignored, they can be re-downloaded)
├── Apotheosis/ ← ⚠ abandoned C# UI experiment. Read Src/Apotheosis/README.md before touching it
├── setenv.ps1 ← run `. .\Src\setenv.ps1` first, every session
Doc/ ← architecture, plans, and the post-mortems that explain why things are like this
Two platforms, both UWP: x64 and ARM32. The x64 line is the fast diagnostic mirror; ARM32 on the
Lumia 950 is the real target. There is no Linux or GTK target — the source tarball is called
webkitgtk-2.52.4 because that is the release the whole WebKit tree was cut for, and this fork compiles
zero GTK or GLib files (measured: 0, against 23 curl and 14 wtf/win). Doc/WIKI_EN.md §11 explains
the layering, the App Container's compile-time API removal, and where the landmines are.
Src/Apotheosis/ deserves the warning. It is a deliberately minimal C# port of the UI — address bar and
content view only — stopped in July 2026 and kept because the idea was sound and the stated reason for
dropping it (marshalling cost) does not survive the arithmetic. It is not part of any solution and
building it will not produce a browser. Its README has the numbers and what would have to be answered
first.
For a clean machine, follow Doc/DEVELOPER-SETUP.md. For an already-built tree, the short loop is:
. .\Src\setenv.ps1
# native driver (minutes) after port changes
pwsh -File Src\port\build-driver-dll-arm32.ps1 -Arch x64
pwsh -File Src\tools\Stage-NativeDeps.ps1 -Arch x64
# C# app layout (minutes)
& 'C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\MSBuild.exe' `
Src\Apotheosis\Apotheosis.csproj /restore `
/p:Configuration=Release /p:Platform=x64 /p:AppxPackageSigningEnabled=false /v:minimal
Add-AppxPackage -Register Src\Apotheosis\bin\x64\Release\AppxManifest.xmlIf engine DLLs need rebuild (WebKit source change):
. .\Src\setenv.ps1
. .\Src\port\x64-uwp-env.ps1
ninja -C build-x64-gpu WebCore JavaScriptCore -j1
pwsh -File Src\port\archive-webcorefull.ps1 -Arch x64
pwsh -File Src\port\archive-pal.ps1 -Arch x64
# then relink the driver and rebuild the app as above# Install the local x64 layout (Developer Mode must be on)
Add-AppxPackage -Register Src\Apotheosis\bin\x64\Release\AppxManifest.xml
# Launch the C# app
Start-Process 'explorer.exe' 'shell:AppsFolder\ME.Apotheosis_cj4nrm0qt9s1y!App'
# Check the launch/log directory
explorer "$env:LOCALAPPDATA\Packages\ME.Apotheosis_cj4nrm0qt9s1y\LocalState"The C++/CX harness in Src/harness is a separate diagnostic tool; its old appx path is historical.
For the native smoke test and the M1 cookie check, see
Doc/DEVELOPER-SETUP.md section 8.
NOTE: on a 4 GB machine, reboot before large builds and use
ninja -j1only. Port fileWebCoreDriver.cppmay hitfatal error C1060if memory is low.
Apotheosis — это возрождение экосистемы Windows 10 Mobile. Если у вас есть опыт в C++/CX, WebKit, DirectX, ARM32 кросс-компиляции или просто энтузиазм — вы нам нужны!
- Нам нужны: C++ разработчики, тестировщики (особенно с живыми Lumia 950/950 XL), UI/UX дизайнеры, специалисты по WebKit
- Что делать: чинить баги, тестировать сборки, документировать, портировать
- Как помочь: форкните репозиторий, шлите PR, открывайте issues, пишите на Reddit (r/windowsphone)
Apotheosis正在让Windows 10 Mobile重获新生。 如果你有C++/CX、WebKit、DirectX、ARM32交叉编译的经验,或者只是充满热情——我们需要你!
- 我们需要: C++开发者、测试人员(特别是手上有Lumia 950/950 XL的)、UI/UX设计师、WebKit专家
- 如何贡献: fork仓库、提交PR、开issues、在Reddit (r/windowsphone)上讨论
Project Apotheosis — портирование современного WebKit (webkitgtk-2.52.4) на Windows 10 Mobile (ARM32, UWP). Движок позволяет Lumia 950 открывать современные веб-страницы с JIT и GPU.
Июль–Август 2026 — x64-uwp: полная сборка appx 0.1.8.51 установлена и запускается на Win11!
- ✅ JSC + WebCore DLL грузятся в AppContainer без краша
- ✅ XAML-активация: обход XBF-загрузки (code-only UI)
- ✅ Движковый поток: CreateThread + очередь задач + CoreDispatcher
- ✅ WebCoreRenderHtml (июль): HTML → layout → Cairo paint → bitmap → экран
- ✅ Восстановление тулчейна после переустановки ОС (ICU75, harfbuzz, без fontconfig)
- ✅ Текст рендерится на x64: about:home рисует настоящие глифы (краш Cairo font face — починен 10.08; обход complex-text-path — 11.08)
- ✅ CJK: зависание шрифта устранено (16.08, hash-пустой сентинел), 8/8 тестов
- ✅ GPU-растяжение всего контента устранено (16.08):
WebCoreGpuResizeпересоздаёт surface под размер ContentArea (contents=1024x694, квадраты 200×200 остаются квадратами) - 🔄 Следующий шаг: синхронизация ARM32↔x64 (имена каталогов/скриптов, общая версия appx) + пересборка ARM32 движка для Lumia 950
Project Apotheosis — 将现代 WebKit 引擎移植到 Windows 10 Mobile (ARM32, UWP),让 Lumia 950 渲染现代网页。
2026年7-8月——里程碑:x64-uwp 全量 appx 0.1.8.51 在 Win11 上安装并启动!
- ✅ JSC + WebCore DLL 在 AppContainer 中加载无崩溃
- ✅ XAML 激活:绕过 XBF 加载(纯代码 UI)
- ✅ 引擎线程:CreateThread + 任务队列 + CoreDispatcher
- ✅ WebCoreRenderHtml(7月):HTML → 布局 → Cairo 渲染 → 位图 → 屏幕
- ✅ 断桥恢复:Windows 重装后重建 x64-uwp 工具链(ICU75、harfbuzz、去除 fontconfig)
- ✅ x64 文本渲染:about:home 绘制真实字形(Cairo 字体崩溃 8.10 修复;复杂文本路径 8.11 修复)
- ✅ CJK:字体卡死已修复(8.16,hash 空哨兵),8/8 测试通过
- ✅ GPU 整页拉伸已修复(8.16):
WebCoreGpuResize按 ContentArea 重建 surface(contents=1024x694,200×200 方块保持正方形) - 🔄 下一步:ARM32↔x64 同步(目录/脚本命名、共享 appx 版本)+ 重建 ARM32 引擎验证 Lumia 950
Policy (Aug 2026): all GitHub-related tasks (CI, GitHub Actions, auto-releases, PR pipelines, GitHub-hosted runners) are OPTIONAL / non-blocking. All ARM32 dev/build tasks are fully local on the dev machine (no cloud runners). Order: local x64 verification → local ARM32 build artifacts → manual real-device validation → then (optional) any CI/GitHub automation.
- ARM32↔x64 sync (DONE Aug 16): ARM32 dirs renamed
build-clang-*→build-arm32-*(matchesbuild-x64-gpu=build-<arch>-<variant>); obj suffixes unified (GPU.arm32.obj/ JIT.arm32-jit.obj/ soft.arm32-soft.obj, x64.x64.obj);recompile-stubs-arm32.ps1→recompile-stubs-x64.ps1. Both arches build from the SAMEPackage.appxmanifest→ identical appx version for x64 and ARM32. - Local x64 (current): GPU distortion FIXED (
WebCoreGpuResize). Keep climbing the site ladder (Bing/GitHub/Apple), Enter/SPA/docs interaction; trim harness diagnostics. - Local ARM32: full rebuild (reconfigure
build-arm32-gpu+ multi-hourninja -j1— the old ARM32 tree was wiped by the OS reinstall) → driver link → ARM32 appx (same version). Lumia screen-width differences are a non-issue: the surface always matches ContentArea, so any aspect renders undistorted. - Real device (manual): deploy the ARM32 appx to the Lumia 950 via
Deploy-Robust.ps1+ WDP; validate the same site ladder + GPU. - (Optional) GitHub CI —
windows-latest(7 GB RAM) builds x64 faster than the 4 GB dev box (ninja -j8≈ 40 min per engine build); automated releases; fork→PR→auto-build. Only after the local lines are green.
- Jimmyxiao2009/Project-Apotheosis — original project
- Reddit: Porting WebKitGTK 2.52.4 to Windows 10 Mobile
- WebKitGTK team — upstream engine
MIT (port layer); LGPL-2.1/BSD (upstream WebKit + dependencies).
As is. No support. RnD only. DIY.
[M][E] 2026


