Roadmap
Milestones are ordered so that every one produces a usable tool. Each has an exit criterion; a milestone is done when it is met. This page is read from spec/roadmap.md on main.
- M0
Foundation
done · 2026-10-11exit: an existing Lua addon can be built and installed from awowlua.jsonwith generated TOCs for several flavors.scope and status notes
- Cargo workspace, CI (fmt, clippy, tests on macOS, Windows, Linux), release pipeline publishing binaries to GitHub Releases on tags (Homebrew, winget and Scoop follow later).
wowlua-span,wowlua-diagnostics,wowlua-flavors(flavor table),wowlua-manifest(JSON schema generation, profile merging,package.wowluacheck),wowlua-toc(layouts, suffix algorithm, line-length rules),wowlua-xml(reference checks).- CLI skeleton:
new,init(from TOC),buildfor plain Lua projects (passthrough, TOC generation, assets,LICENSES.txt, output validation),install,uninstall,dev(copy and link modes, safe installs),clean,toc,explain. .wowluafiles are accepted when they are pure Lua 5.1 and passed through as.lua; files using wowlua syntax report that they need the M1 compiler. Bundling and minification are not available yet (release builds are unbundled, with a note).- Output validation of Lua syntax uses the embedded Lua 5.1 VM (
mlua, compiling without running) until the compiler's own parser exists in M1. - Lockfile with the pinned flavor table.
Status: done (2026-10-11).
- M1
Parser and emitter
done · 2026-10-11exit: the corpus parses with zero errors, and round-trip bytecode is identical for every corpus file.scope and status notes
- Lexer and parser for full Lua 5.1 plus all wowlua syntax, with error recovery.
- Lua IR and emitter with line modes, hygiene and source maps.
- Superset conformance suite: Lua 5.1 tests, addon corpus, bytecode round-trip.
wowlua check(syntax only),wowlua fmt(initial: comment-preserving printer for Lua 5.1 constructs).
Status: done (2026-10-11).
Notes on the delivered state:
.wowluafiles are compiled with type-only syntax erased (decision T64); other wowlua syntax reports the milestone that implements it.- The corpus (28 pinned addon releases and the Lua 5.1 test suite, 7,179
files, 4.8 million lines) parses with the same accept/reject result as Lua
5.1, and every file round-trips to identical bytecode in all line modes; in
preservemode even the line info is identical. The formatter formats every corpus file idempotently without changing its meaning. - Fuzzing is done with deterministic randomized tests on stable Rust
(decision T67).
wowlua check --watchfollows with incremental checking (M4).
- M2
Lowering of syntax sugar and modules
done · 2026-10-11exit: multi-module example addons build for all flavors and run in the embedded Lua VM with identical behavior to hand-written Lua. A migrated plain-Lua addon keeps its working load order.scope and status notes
+=,continue,?.,??, interpolation, bitwise,//, literals,const, defaults, destructuring, preceding-statement linearization.- Modules:
import/export, resolution, declaration hoisting, runtimecoreslice. - Load-order analysis: usage analysis of globals and addon-table fields, load-time/run-time edges, lazy bindings for run-time cycles, per-flavor module graphs and the union order for single TOCs.
wowlua:meta(includingasset()), static conditions,@if, flavor split builds, XML reference rewriting.
Status: done (2026-10-11).
Notes on the delivered state:
- Lowering is checked by differential tests that run compiled
.wowluaand hand-written Lua in the embedded VM; multi-module and split-flavor packages are built and run per flavor in the CLI tests. cargo xtask corpus addonsadopts every corpus addon withwowlua initand builds it: all 108 keep their TOC order. The usage analysis over-approximates without types; where it contradicts the listed order the listed order wins with W1035 (decision T70).- Classes, enums and decorators other than
@ifreport M3.
- M3
Classes, enums, decorators and stdlib infrastructure
done · 2026-10-11exit: a UI-heavy sample addon written with widget classes works in game.scope and status notes
- Classes (including abstract and generic), widget classes, interfaces (parsed; checked in M4), enums.
- Core decorators (
@global,@deprecated,@if,@inline) and user decorators. - Runtime slices
class,widget,decorate. - Standard-library infrastructure: compiling
wowlua:*modules fromwowlua-stdlibinto addons, tree-shaking them, and the@intrinsicdecorator table, so later milestones can ship modules.
Status: done (2026-10-11).
Notes on the delivered state:
- The sample addon is
examples/widget-demo(decision T80); CI builds it and runs it against a mock frame API. It was checked in game on the WoW: Forever beta client (1.60.1). - Class, enum and decorator checks that need only declarations are reported now (decision T75); type-based ones come with M4.
- Native widget types are declared by the compiler until M4 (decision T77).
- No public standard-library modules yet: the infrastructure is checked with
test modules through
WOWLUA_STDLIB_DIR(decision T79).
- M4
Type checker
done · 2026-10-12exit: the corpus checks in basic mode with zero errors. Sample addons check in strict mode with zero errors.scope and status notes
- Basic mode: inference, narrowing, assignability, arity, globals, classes, interfaces, generics, overloads.
- Declaration files.
wow-api-<flavor>packages generated per flavor from Blizzard's API documentation and merged with Ketho's annotations;wowlua types sync,wowlua types convert. - Strict mode,
Secret<T>. sharedflavor mode with flavor guards (E2030).wowlua lint,wowlua fix.
Status: done (2026-10-12).
Notes on the delivered state:
- The corpus (108 addons, plain Lua checked with
check.lua) checks with zero errors; applying all lint fixes to it keeps every addon building.examples/widget-demoandexamples/typed-democheck in strict mode without diagnostics, and CI runs both. - The
wow-apideclarations are embedded in the compiler (cratewowlua-api) and regenerated withcargo xtask types fetchandcargo xtask types gen(decisions T83–T85). Thewow-api-<flavor>types packages andwowlua types syncarrive with the package manager. - Leniency rules that keep valid Lua free of errors are decision T87; feature detection (existence tests) works in every build mode (T89).
- M5
Debugging
done · 2026-10-12exit: a profiling report appears in game, and runtime checks catch bad values from the WoW API in a dev build.scope and status notes
wowlua:debug,wowlua:reflect,wowlua:log(on the M3 stdlib infrastructure).- Profiling, tracing, runtime checks, dev console.
wowlua trace.
Status: done (2026-10-12).
Notes on the delivered state:
- Checked in game on the WoW: Forever client with
examples/typed-demoandexamples/widget-demo: the dev window's profiler, monitor (events, scripts, timers), log and errors tabs, and/tdemo check, whose runtime check catches anilfromUnitName. - Dev builds have every tool built in without code changes (decision T96):
every function is profiled, plain
.luafiles included (T97), handlers are monitored, errors are captured, and/wlopens the dev window, drawn in the SuuUI design with its fonts shipped (T101–T103). The corpus builds this way with zero failures. wowlua tracemaps locations of line-preserved builds; decoding bundled builds through source maps arrives with bundling (M7).
- M6
Package manager
done · 2026-10-12exit: an Ace3-based addon migrates withwowlua init --from-pkgmetaand builds identically.scope and status notes
- Path, git and archive sources, lua-library embedding (reachable files and licenses only), lockfile, PubGrub resolution over the union, cache, workspaces with generated declaration files.
add,remove,update,fetch,tree,outdated,cache clean,fix --manifest.- Dependency safety (archive extraction rules, submodule policy).
.pkgmetaimport and compatibility mode, packager keywords.
Status: done (2026-10-12).
Notes on the delivered state:
- Sources: git (bare clones, exported per commit), SVN (system
svn, pinned to a revision), path and archive (https,file://); the registry waits for its server (T104), and the wow-api types stay embedded. - The exit check (
packager-compatworkflow, T119): thirty-six addons built with the BigWigs packager, at pinned commits, packaged by the packager the way their CI does (multi-version,-S, or game by game with-g/-m) and built by wowlua afterinit --from-pkgmeta, load identical code in every flavor and client locale and ship the same files (the same bytes outsidesrc/, with the packager's line endings and TOC versions): Bartender4, BigWigs (12 AddOns), LittleWigs (12), WeakAuras (5), DBM (8, with its voice pack as an external addon), Details (8), ElvUI (3), Inventorian (2), Plater, Masque, Mapster, Quartz, BugSack, SimulationCraft, AdvancedInterfaceOptions, GatherMate2 (4), ShadowedUnitFrames (2), AtlasLootClassic (8), RCLootCouncil2, omnibar, Capping (2), BigWigs_Voice, BigWigs_Classic, SexyMap, MythicDungeonTools (2), TellMeWhen (2), AllTheThings, Dominos (6), OmniCC (2), Cell, TotalRP3 (2), BlizzMove (2), QuickQuest, BigWigs_WrathOfTheLichKing, Tukui and KuiNameplates (4). Rarity and hekili are left out: the packager itself cannot fetch their LibCompress SVN external. The corpus still adopts and builds all its addons. - wowlua
librarypackages compile into the addon (tree-shaken modules, their own check settings and meta, T110–T112); workspaces share one lock anddist/, with generated declaration files of@globalAPIs (T113, T114).
- M7
Optimization and publishing
done · 2026-10-13exit: a release is published to all four sites from CI with one command.scope and status notes
- Bundling (with module isolation and XML-aware segments), minification passes and levels, global caching, inlining, dead-code removal, Lua-limit budgets.
package,publishfor CurseForge, Wago, WoWInterface and GitHub (release.json, archived source maps,split-flavors,nolib,bundle-addons),loginwith OS credential stores, changelog handling.wowlua new --ci githubtemplate.
-
Done 2026-10-13 with SuuUI, a WoW Forever addon adopted with
wowlua init: one tag push (v0.2.0-beta.2) made CI publish to CurseForge and Wago (the readable build, as betas) and to GitHub Releases (the fully optimized build, with source maps andrelease.json). WoWInterface takes no WoW Forever addons yet; its upload is covered by the publish tests against a mock site. -
Optimization was checked in game on the WoW: Forever client (2026-10-13): Bartender4 adopted with
wowlua initand built bundled (strip, release optimizations) loads from 2 bundles and its template XML, with no Lua errors; so does the build atmaxwithminify-libraries(Ace3 and the other libraries renamed, compacted and optimized too: 774 KiB of Lua instead of 1.29 MB, compiled in a third of the time). The corpus checks every minification pass on 7179 files and builds its 108 addons bundled at every level.
- M8
Standard library
done · 2026-10-15released as 0.9.0exit: a sample addon uses no third-party libraries for its events, saved variables, settings, minimap button, keybindings and comms.scope and status notes
- Core set first:
events,lifecycle,slash,saved,timer,combat,hooks,log, error policy. - Then
locale(with the compiler's locale pipeline: JSON compilation, theLtype, client-locale TOC directives),pool,settings,launcher,comm,serialize, keybindings (withBindings.xmlgeneration), tooltip hooks, movable frames. - Then unit/aura/spell helpers, colors, SharedMedia interop, item/spell data cache, callback registry, background jobs, dialogs, menus and lists.
- Widget themes for dialogs, the fallback menu and the built-in minimap button (decisions S17, S18).
Status: done (2026-10-15). The stages follow the bullets above: S1 the core set, S2
localeto movable frames, S3 the helpers, registries, jobs, dialogs, menus and lists, then the widget themes, and S4 the patterns found across the corpus. Every module ran in game on WoW: Forever (StdTest: 109 tests, automatic and guided, all passing). Released as 0.9.0.- S1 done 2026-10-14:
errors,events,lifecycle,timer,combat,hooks,slash,savedandcallbacks(withlog,debugandreflectfrom M5), written in wowlua and type-checked, so their exports are typed for importers. Their compile-time checks are E8001–E8003, E8010, E8020, E8021, E8030, E8100–E8104, E8112, E8117, W8011, W8040, W8101 and W8102. Tests run every addon in dev, release and fully minified builds against a mock client; the in-game suite (tests/ingame,/stdtest) passed on the WoW: Forever client, including combat lockdown and a/reloadwith real SavedVariables, and runs against the mock in CI.examples/core-demouses every core module. - Completed 2026-10-14: handlers are typed by their event or message
(
on,once,onUnit,send,@event,@unitEvent), hook targets are checked (W8040, and W8102 for globals of Blizzard's load-on-demand addons, marked@onDemandin thewow-apideclarations), events missing from a shared-mode flavor warn (W8101; the declarations now list each flavor's own events, from client dumps), andSecret<…>insaved.binddefaults is E8104. - S2 done 2026-10-14:
localedone 2026-10-14 (JSON locales checked against the base locale and compiled into guarded Lua files that load first, with[AllowLoadTextLocale]tags;Ltyped by the base locale);pooldone 2026-10-14 (frame and table pools;FramePool.newtyped by the pooled class's constructor; protected frames released after combat);settingsdone 2026-10-14 (Settings API pages bound tosavedstores, every control kind, keys and types checked E8113/E8070/E8107/E8114, profile refresh, combat-deferred open;saved.bindnow returns its defaults' type). launcherdone 2026-10-14 (Addon Compartment entry, minimap button through LibDBIcon or a built-in shape-aware draggable one, LDB launcher, position in LibDBIcon's shape, E8080). Itsthemewaits for the widget themes.serializedone 2026-10-14 (binary encoding with limits, DEFLATE in plain Lua checked against zlib both ways, printable and addon-channel encodings, checksummed export strings);commdone 2026-10-14 (chunked messages in wire format 1 or AceComm's, ChatThrottleLib or a built-in throttle, server-throttle backoff, messaging lockdown, objects, E8050).- Dogfooding 2026-10-14: the test scripts and the mock client are compiled
as wowlua (type errors fail the tests), and the runtime is written in
wowlua and compiled into the embedded Lua by
cargo xtask runtime. New:wowlua compile(files to Lua without an AddOn folder, with imports and bundling). Found on the way:C_Timer.NewTimer/NewTickerreturned their callback type (nowTimerHandle/TickerHandle), error handlers took no extra arguments, and the dev window created an unused frame. - Typing everything (2026-10-14): the standard library, the runtime and the
in-game suite are checked in strict mode, with
anyleft only for values that are dynamic by nature.callbacks.Registry<E>is typed as specified (E8420; it returnedany). The checker gained what this needed: field narrowing (locals and globals), discriminated unions onx.kind ==,assertresults, narrowing in closures for locals never reassigned, interface methods written as function fields orfunction t.m(_, …), method calls on narrowed optional fields, contextual typing of generic call arguments,#on possibly-nil values (E2005), and asetfenvthat only disables global checks when it targets the file's own code. Stdlib option types usex?: Tfor omittable fields. Then: Blizzard's Settings API, the chat frames,WorldFrameand LibStub's LibDataBroker/LibDBIcon are declared; the stdlib's stateful objects are classes (the minimap button a widget class); intrinsic-only declarations no longer hide the modules' types from callers (events.onreturnedany), and the API generator no longer aliases the compiler's types toany(TimerHandlewasany). - Idiomatic wowlua (2026-10-14): the stdlib, the runtime, the mock client and
the in-game suite use enums (
comm.Distribution,log.Level, members or their strings accepted), classes and static fields where state lives,const,?.,??, compound assignment andcontinue. The checker gained short-circuiting optional chains and??as an existence probe; inlined constant strings escape bytes outside UTF-8. The conformance corpus runs in parallel within a memory budget (nightly 40 → 24 minutes). bindingsdone 2026-10-14:@bindingandheadercollected at compile time (constants, E8350–E8352), one generatedBindings.xmlfor every flavor calling the addon's dispatch table,BINDING_*labels at load time,settings.keybindingchecked (E8353, also against a hand-writtenBindings.xml), E4334, anddefaultkeys behind thebinding-defaultsclient feature (W8354; decisions S19–S21). The mock client loads the generated file; on the WoW: Forever client the generated bindings are listed with their labels and shown in the settings page's keybinding row; a guided step presses a key bound to one (RunBindingis Blizzard-only there); all 66 in-game tests passed.tooltipdone 2026-10-14:@onTooltipandhookwith aTooltipHookclass (enable/disable),TooltipDataProcessorpost-calls where the client has the tooltip data system,OnTooltipSet*script hooks on the standard tooltips (andattached ones) elsewhere, normalizedTooltipData, kinds checked per flavor from the API declarations (E8330, E8300; decision S22). The mock client shows tooltips both ways (Mock.showTooltip); the in-game suite fillsGameTooltipand waits for a real mouseover. The checker now treats optional links as existence tests for load order. All 69 in-game tests passed.framesdone 2026-10-14:frames.movablewith drag (button, modifier), a resize grip or your own, Ctrl + wheel scale, clamping, lock, reset, restore and save; positions anchored at the frame's screen third (decisions S23–S25); restored once the store loads and on profile changes; protected frames wait for the end of combat; the store field checked (E8340). The mock client has frame geometry (Mock.drag,Mock.sizeBy,Mock.wheel). Found on the way: an imported type alias used in an interface or alias of another module resolved toanywhen that module's declarations came later; aliases now resolve where they are first used. S2 is complete.- S3 in progress:
colordone 2026-10-14 (hex colors folded at compile time, E8390; class colors honoringCUSTOM_CLASS_COLORS; escapes; a secret string stays a string throughwrap);secretdone 2026-10-14 (decision S26, from SuuUI's probes of the WoW: Forever client); the generated API declarations now let documented secret-accepting arguments (SecretArguments) takeSecret<T>, widget setters included.unitdone 2026-10-14 (records with secrets passed through, WoW: Forever's first-and-surname names, the client's health percentage, group tokens; the mock client models units);auradone 2026-10-14 (guarded reads withreadable, the engine's aura containers with filter groups, spell and dispel-type lists and the client's buff look, filter words per flavor E8310, containers E8300; decisions S27, S28; the mock client has auras and containers);spelldone 2026-10-14 (cooldowns with secret times but a readableonCooldown, duration objects, the legacy cooldown API as fallback);itemdone 2026-10-14 (shared requests, timeouts, cancelling, an LRU cache, spell data;awaitcomes withjobs; the record isItemData, as the API'sItemInfonames the item reference). The checker now narrows an optional chain's base where the chain has a value (if x?.f ~= nil then x.f … end).mediadone 2026-10-14 (own registry, LibSharedMedia when any addon loads it, waiting registrations handed over, E8400; LibSharedMedia is declared forLibStub). The checker types table literals assigned tot[i]by the element type.jobsdone 2026-10-14 (coroutines within a per-frame budget, weighted priorities, sleep, waiting for events, progress, combat pauses, W8430), withitem.await; the mock client drives frames (Mock.advanceFrames,Mock.spend).dialogdone 2026-10-15 (confirm, prompt, export, import on the addon's own frames in the client's popup look, Escape, one at a time; decision S29), withWidgetThemeand the theme-aware builders inwowlua:frames. Decision S30:menuandlistwrapMenuUtiland ScrollBox, which every flavor has.menudone 2026-10-15 (a chainableMenuBuilderover MenuUtil: titles, buttons, checkboxes, radios, submenus, dividers, disabled entries).listdone 2026-10-15 (ScrollBox holders showing pooled rows of a widget class, selection, refresh, scrolling; the mock client has a ScrollBox). Widget themes done 2026-10-15 for dialogs and the launcher's built-in minimap button (decision S31). S3 is complete; its in-game run is pending (the WoW: Forever beta was down), StdTest has suites for every module. - Exit criterion 2026-10-15:
examples/core-demouses events, saved variables, a settings page, a minimap button, keybindings and addon messages from the standard library alone; a test runs it in the mock client (login, settings page, minimap button and compartment entry, a key press, a ping answered over addon messages). - S4 complete 2026-10-15 (patterns found across the corpus):
tableandformat(decision S32),version(S33),alert,links,unit.roster,events.bucketandlauncher.dataSource(S34),secure(S35), and Edit Mode onframes.movable(S36). Not yet run in game (the WoW: Forever beta was down); StdTest has suites and guided steps for all of them.
- Core set first:
- M9
Test runner, language server, formatter
in progressThe test framework runs on wowlua's own emulation of the WoW client (WoW client emulation, decisions T183 to T189).
stages- ✓ S1 VM core · done 2026-10-15
- ✓ S2 WoW semantics · done 2026-10-16
- ~ S3 Engine · built 2026-10-16
- ~ S4 Test framework · built 2026-10-17
- ~ S5 Coverage and reports · built 2026-10-17
- · S6 wowlua fmt complete for all wowlua constructs, with an idempotence suite. Built 2026-10-17
- · S8 wowlua lsp and the VS Code extension, with a test explorer, coverage in the editor and "run test" code lenses; code examples in doc comments run as tests (T222). **Exit
exit: the full edit, test, debug loop works without leaving the editor, and the in-game bugs found so far fail as tests the same way they failed in game (os.dateinwowlua:format,0 / 0inwowlua:serialize, SuuUI's reparented status-bar containers breaking Edit Mode, taint in combat). StdTest stays the in-game check until then (decision T189). - M10
Registry
planned- Registry server (separate repository),
publish --target registry,package --registry, registry sources in the resolver, owners and yanking.
exit: libraries can be published and consumed by version requirement. - Registry server (separate repository),
- M11
Performance optimization
plannedWoW loads Lua source only, and its Lua 5.1 compiler barely optimizes, so the compiler shapes the source the client compiles. Each optimization applies only where the type checker proves its preconditions (plain tables without metatables, numbers, no writes in between), so plain Lua and
anyvalues stay as they are, and secure-code paths keep their call structure (taint).wowlua bench: benchmarks run on the embedded Lua 5.1 (WoW runs plain Lua 5.1, not LuaJIT), comparing the optimized and the unoptimized build; every optimization is measured before it is kept. Benchmarks are@benchfunctions in test files (T221).- Loop-invariant field reads hoisted out of loops (
self.frame.textureread once). - Repeated field reads in one stretch of code read once into a local.
ipairsloops over plain arrays become numeric loops.table.insert(t, v)on plain tables becomest[#t + 1] = v.- Upvalues read often in hot functions copied into locals when not written meanwhile.
- Closures that capture nothing from a loop created once, outside it.
- Inlining of statement bodies and private methods (decision T166 left them out of M7).
- Constant propagation of locals assigned once with a constant.
In-game performance tools, to measure what the optimizations change (Debugging §7.7, decision T181):
- The dev window in the wowlua design system with its fonts (T170, T171).
- Recordings: live, per combat, per boss pull and manual; comparison per minute (T172, T173).
- Frame time, slow calls, call paths, event attribution and garbage per
function, with the profile settings
profile-call-paths,profile-garbage,frame-budgetandslow-call(T174). - The performance views (functions, tree, flame, by event, timeline, slow,
garbage, bench) and
/wl record,/wl bench,/wl hints,/wl hud. - Performance hints with
Pcodes and theirwowlua explaintexts; the code generator learns thePprefix (T176). - The compact HUD (T177) and the error toast (T180).
- Export through SavedVariables and
wowlua prof report(T175, T179).
exit: the benchmark suite shows a measured speed-up of the optimized release build over the unoptimized one, the corpus and differential tests show unchanged behavior, and an optimized addon is checked in game; a recording of a boss pull, taken in game with the dev window, is exported and opened withwowlua prof report. - M12
Debugger
plannedA debugger attaches to the emulated client (decision T209): the VM pauses and steps where the real client cannot be observed.
wowlua debugserves the Debug Adapter Protocol: breakpoints (also on events, scripts and API calls), stepping through Lua and into event dispatch,OnUpdateand timers, call stacks with the source-mapped wowlua code, watches and a console, the taint and secrecy of every value.- Profiling from the VM's hooks: time and calls per function, event, frame
and
OnUpdate, garbage per function (the views of M11's in-game tools, T174). - A live UI channel (WebSocket): the frame tree, layout, draw layers, text and textures of the current frame stream to a viewer, which sends mouse and keyboard input back; the UI stays usable while paused or stepping.
- The VS Code extension (M9 S8) attaches to it.
exit: a test or an addon session is stopped at a breakpoint inside an event handler, stepped through, inspected with watches, and clicked through in the viewer. - M13
Game data and rendering
plannedReal game data and assets from the user's own client, never distributed (decisions T203, T210).
- A CASC reader for the local installation: the DB2 tables (spells, talents, items, currencies, maps, …) behind the engine's game-data interface, next to the tests' data and the world profiles' (T203, T213).
- UI assets: BLP textures, texture atlases, fonts; text measured with the
client's fonts, so
GetStringWidth, wrapping and truncation match the client in tests too (T211). - A renderer on
wgpudrawing the UI as the client does: strata, levels, layers, blend modes, masks, texture coordinates, text (T211); 3D models (ModelScene, M2 files) last.
exit: the debugger's viewer shows the default UI and an addon's frames from a world profile as the client draws them, with the client's spell and item data. - M14
Browser
plannedThe compiler, the VM and the engine run in the browser as WebAssembly (decision T212).
wasm32-unknown-unknownbuilds of the compiler pipeline, the VM, the engine and the renderer (wgpuon WebGPU or WebGL); file access through the engine's file system interface; checked by CI from M9 S4 on.- A web playground: write wowlua, compile it, run the addon against the emulated UI with a world profile, with the debugger's views in the page.
- Shareable reproductions: code and profile in a link.
- Game data from the user's own installation through the File System Access API, read in the browser and never uploaded (T210).
exit: an addon from the corpus compiles, runs and is debugged in the browser against the default UI, from a link.