A free, open-source Minecraft world editor and converter for Java and Bedrock worlds.
Download verified Windows build 0.10.0-dev.414 · All releases · Project site source · Feature documentation · Report an issue
Contents: one-click builds · the interface · capabilities · screenshots · Windows install and updates · development · verification
Amulet opens Minecraft worlds outside the game so that you can inspect terrain, select precise regions, move builds between worlds, run block and biome operations, import or export structures, delete or regenerate chunks, and convert world data. The package metadata supports Java Edition 1.12 and newer and Bedrock Edition 1.7 and newer.
Caution
Back up every world before editing it. Close the world in Minecraft and any other editor first. Conversion can overwrite chunks in the destination world.
This repository builds and ships two working applications against the same Python core, and it is important to be clear about which one is which:
- The Electron desktop application (
electron/,docs/site/) is what CI now publishes as the GitHub release (build-electron-windows.yml). It hosts a Material 3 renderer — the Amulet Studio design — in a frameless window, driving the real Python core through a sidecar process: a versioned, newline-delimited JSON protocol over stdio with roughly ninety registered methods. The write path (fill, replace, undo, redo, save, copy/cut/paste, structure import/export, chunk create/delete/prune, terrain operations, entity placement,level.dat/game-rule edits) is real and gated behind a destructive-action confirm. The 3D viewport is WebGL2, meshed by the unmodified Python mesher, with camera input, chunk streaming, a selection box with draggable handles, and click-to-pick ray casting. 39 of its 151 ribbon commands call a real method; the other 112 are disabled with a stated reason rather than silently inert — see the Electron migration article for exactly which is which and why. - The wxPython desktop application (
amulet_map_editor/api/wx/,amulet_map_editor/api/studio/) is the original, long-running implementation of most of the same feature set — including the 3D viewport, which stays on PyOpenGL and is out of scope for this migration while its own open performance defect is unresolved.build-windows.ymlstill builds and reports its own test results on every push, but it no longer creates or uploads a release.
Both applications are described in this README and in docs/features/; a
section or article that does not say which one it is about is describing the
wxPython app, since that codebase and its documentation predate the Electron
work by a large margin. Sections and articles under an electron-* name are
always about the Electron application specifically.
From a fresh Windows checkout, build.bat /s checks for the Python launcher and, when it is absent, installs user-scoped Python 3.11 through canonical winget when available or the official python.org installer when winget is missing. It then bootstraps the declared dependencies and installs the editable package without prompts. build-installer.bat /s runs that bootstrap, builds installer/Amulet.spec, and invokes the same unsigned Squirrel.Windows packaging path used by CI. Omit /s for phase output and the final launch choice. Neither script signs, publishes, tags, or creates a release; both report an exact failure if the canonical bootstrap route itself is unavailable.
The one-click paths were exercised locally on Windows from this checkout: build.bat /s exited 0 after resolving the declared runtime dependencies, and build-installer.bat /s produced Setup.exe, RELEASES, and Amulet-0.10.0-dev-local-full.nupkg under installer/dist/squirrel/Amulet-0.10.0-dev-local-Windows-x64. The installer output is unsigned by design; the script prints SHA-256 digests for all three artifacts. This is local packaging evidence, not a replacement for the immutable CI release record.
This section describes the wxPython application's interface, built under
amulet_map_editor/api/studio/. The Electron application also implements an
Amulet Studio design (docs/site/studio.html, docs/site/studio-*.js) — a
separate, independently maintained JavaScript implementation of a similar
shell against the same sidecar. See
the Electron migration article
for that one.
The interface is a project workspace built from exactly two views, which are swapped rather than stacked.
Backstage is what the application opens on: a template gallery for starting a project, a searchable and filterable table of recent projects and worlds, an Open page listing detected Minecraft worlds beside a browse path, project info, conversion, and an All surfaces index of every window, panel, and tool the application can open.
Workspace is where a project is edited: a seventeen-tab ribbon (Home, Tools, Selection, Operations, Structures, Chunks, Terrain, Build, Entities, Data, Analyze, Redstone, Worldgen, View, Panels, Extend, Automate), a breadcrumb context bar carrying the head revision, a navigator for dimensions and selection boxes, the viewport with its overlays, a tabbed properties pane, and a status bar.
This replaced the earlier single start card plus tool strip. The world notebook that shell used still exists — it owns world loading and per-page unsaved-work protection — and is handed to the workspace viewport once a world is open, so the real renderer draws inside the new shell rather than beside it. A build whose Studio package cannot be constructed falls back to that notebook rather than opening an empty window.
How the surfaces are built, and how to add one
Most windows are data. A surface is described by a spec — an eyebrow, a
title, a width, an introduction, an ordered list of sections, and footer actions
— and one renderer turns that into real controls. There are sixteen section
kinds: search, fields, selects, list, keys, tree, chips, checks,
ranges, swatches, progress, keygate, code, note, commits,
texture.
Adding a window is one spec entry plus one line in the surface index. It then appears in the backstage's All surfaces page, in the command palette, and as a valid target for a ribbon tile or a context-menu row, with no new markup.
Two surfaces are hand-built because the renderer cannot express them: the NBT editor (three panes, with a control matched to each of the twelve tag types) and the Memory Console (a thirteen-view rail, a card grid, and a two-pane documentation reader).
Read docs/features/spec-renderer/README.md
for the full contract.
Cross-cutting behaviour every surface shares
- Every search field is the same field: plain text by default, a regex
opt-in, a
.*builder anchored beside it, and an honest feedback line. An invalid pattern is reported and matches nothing rather than being silently ignored. - Every dropdown is searchable, and every right-click menu is searchable and shows each item's real keyboard shortcut.
Ctrl+Shift+Fopens the command palette over every surface, command, and setting, reading the same registries the rest of the shell reads.- Every project owns an isolated Git repository beside its world data, which is what makes undo depth unlimited. Restoring writes a new revision rather than rewinding, so the state you restored from stays undoable.
- Anything irreversible passes a two-key gate with a full-range slider and an always-available emergency exit.
- Texture previews are generated placeholder swatches and say so. A real texture comes from a loaded Minecraft installation, a resource pack, or a PNG dropped on the slot.
- Nothing reaches the network at runtime. Fonts fall back through a local candidate list; there is no sign-in, telemetry, or cloud storage.
- Nobody ever pays. No purchase, licence, subscription, trial, or unlock, and no prompt asking for one.
Material Design 3 and global-interface foundations
The 0.10 source line is being modernized without pretending that the migration
is already complete. The foundations currently checked into this repository
include:
- the Amulet Studio token layer — fourteen colour roles in a light and a dark palette, three density heights (32, 36, 44), the spacing and radius scales, and a local-only font fallback chain;
- the shared wxPython Material 3 role layer still serving the dialogs that predate the Studio, reading the same persisted appearance profile;
- persisted English, playful Hong Kong Cantonese, and bilingual language modes;
- independent English and Cantonese voice-level controls from 1 to 5, plus a dialog-emoji preference;
- persisted light, dark, and system themes; compact, comfortable, and spacious density; accent color; UI font; and 80–200% UI scaling;
- a wx-independent, versioned named appearance-preset foundation with strict JSON export/import plus native Appearance-tab load, save, import, export, and staged per-property or appearance-only global reset controls;
- a tabbed native Preferences dialog with searchable settings, a bounded Python
rebuilder, and aCtrl+Shift+Fcommand palette; - a shared School-mode presentation lock with a renamed label, salted unlock verifier, and native controls that remove inapplicable language settings;
- a persisted notification history with search, bulk dismissal, and Markdown export;
- a native scheduled-settings editor and versioned local rule engine for language, theme, density, and accent overrides, including priorities, weekdays, date ranges, time windows, and deterministic precedence;
- a non-blocking Windows update-status bridge restricted to the project's exact immutable HTTPS release route, with explicit unsigned-package warnings;
- a safe external-editor bridge that discovers Visual Studio Code installations, persists a validated executable, and opens exported folders as workspace roots;
- a bounded startup dim-sum surprise foundation that reads authoritative dish names from the public catalog without copying or vendoring photos; and
- a dependency-free Material 3 site shell with tabs, feature and settings search, an attached bounded regex builder with flags, sample text, and capture feedback, persisted appearance controls, responsive layouts, focus states, and reduced-motion support.
These are source and automated-test claims. No runtime capture of the Amulet Studio interface exists yet, so nothing here is pixel evidence for it.
Relevant source and contracts:
- Install: download the current published Windows installer from
all releases
— check the release notes for its exact commit and asset list before
installing. Every release since
build-electron-windows.ymltook over publishing is the Electron app's unsigned Squirrel.WindowsSetup.exe,RELEASES, and full.nupkg; older releases tagged before that change are the wxPython/PyInstaller build. - Learn the wxPython interface: start with project shell, then backstage and ribbon.
- Learn the Electron interface: start with the Electron migration status, then world access, world editing, and viewport overlays.
- Learn the workflows: follow the open-world guide, 3D editor guide, and conversion guide.
- Explore the site: open the dependency-free Material 3 site source, or visit the official Amulet website.
- Track the modernization: see the factual roadmap and handoff.
- Track the Electron migration: see docs/features/electron-migration/README.md for the honest status — which ribbon commands are wired to a real sidecar method today, which are permanently disabled with a stated reason, and what the wxPython app still does that the Electron one does not yet.
- Contribute: read Development and contribution, then use Issues or Discussions.
| Area | Capabilities in this source tree |
|---|---|
| World access | Discover Java and Bedrock worlds, open a world from another folder, keep several projects in the recent table, and switch between dimensions from the navigator. |
| 2D and 3D editing | Navigate rendered terrain, inspect blocks, change projection, and create one or more selection boxes with direct coordinate controls. |
| Selection workflow | Copy, cut, delete, paste, translate, rotate, scale, mirror, and move selected structures. Copied data can move between simultaneously open worlds. |
| Stock operations | Clone, fill, replace, set biome, and waterlog selected regions; the operation framework also supports project-specific Python extensions. |
| Terrain and build | Sculpt, smooth, flatten, erode, noise-fill, repaint, and regenerate terrain; place patterns, stacks and arrays, structures, waypoints, matched nether portals, and a fully specified rail tunnel with its own lighting designer. |
| World data | Browse and edit entities, players, signs, command blocks, game rules, scoreboards, map items and level.dat, with a dedicated NBT editor carrying a control matched to each of the twelve tag types. |
| Analysis | Block histograms, chunk inspection, biome maps, relighting, world comparison, validation and repair, measurement, layer slicing, redstone and rail tracing, spawn and light analysis, and worldgen tools. |
| Structure files | Import supported structures and export .construction, .mcstructure, legacy .schematic, and Sponge .schem data through format-specific handlers. |
| Chunk tools | Select chunks, delete selected chunks, or delete everything outside the selected area so Minecraft can regenerate it. |
| World conversion | Merge source-world chunks into a chosen destination world through Amulet's format translation layer. Destination chunks at matching coordinates are overwritten. |
| Editing history | Per-project Git-backed history with unlimited undo depth; restoring writes a new revision rather than rewinding. |
| Delivery | Build PyInstaller bundles and produce unsigned Squirrel.Windows Setup.exe, RELEASES, and full .nupkg assets. |
The table above describes the wxPython application, which implements the largest surface. The Electron application, which is what CI now publishes, covers a real but smaller slice today:
| Area | What the Electron app does today |
|---|---|
| World access | Open a real world by path, read its identity and per-dimension bounds, browse the recent-projects store, and close it. |
| Viewport | Render real chunks in WebGL2 from the unmodified Python mesher, with camera movement, frustum-culled batched streaming, a selection box with draggable handles, click-to-pick ray casting against a real occupancy bitset, and a reference grid. |
| Editing | Fill, replace, undo, redo, save, copy, cut, paste, delete a selection, import/export a structure, create/delete/prune chunks, flatten/sea-level/repaint terrain, place/remove entities, and write level.dat fields and game rules — every one gated behind the destructive-action confirm gate. |
| Analysis | Block histograms, chunk inventory, entity counts, and a block-namespace audit, all read-only. |
| Settings and security | Preferences, language, appearance presets, per-surface toy locks, and the built-in authenticator, through the same OS credential vault the wx app uses. |
| Not yet wired | Roughly two-thirds of the ribbon's commands — brushes, most structure-file operations, NBT search, redstone tracing, and most of the rest of the design's twelve editing surfaces — because this build has no terrain generator, shape library, portable biome table, or light-recalculation API to back them. Each renders permanently disabled with its exact reason rather than doing nothing silently. |
Every image below is a real capture of the built interface as it stood at commit 1d4215e1 — that is the checkout the run photographed — taken by scripts/capture_studio_surfaces.py as it stands in the commit that ships this matrix. None is a mockup, a design file, or a retouched image.
Those two can be different commits, and saying so is the point. A capture has to exist before the commit that contains it, so the stamp names the tree that was photographed rather than the tree the pictures landed in; and when a run is what proves a change to the harness, the harness that took the pictures is newer than the stamp on them. An earlier matrix stamped every row with a commit whose copy of the harness could not produce 129 of the images in it, which is the same sentence read as a promise it never made.
This run went out over a clean checkout of that commit.
271 surfaces captured. 3 could not be captured — listed at the end, with why.
The capture asks each widget to draw itself rather than reading the screen, so the run needs no visible desktop and cannot photograph a window someone happened to drag over it. A surface whose controls could not draw is reported as a failure and its file deleted, because a blank capture is worse than none: it looks like evidence.
Menus, dropdowns and popovers are photographed open, with their rows drawn. They are opened through the application's own openers and shown where no display covers them, because a popup grabs the mouse and the keyboard and a capture run must not take those from the machine it runs on.
Backstage — 6 surfaces
backstage.account — 1584x921, light theme, comfortable density
backstage.convert — 1584x921, light theme, comfortable density
backstage.features — 1584x921, light theme, comfortable density
backstage.home — 1584x921, light theme, comfortable density
backstage.info — 1584x921, light theme, comfortable density
backstage.open — 1584x921, light theme, comfortable density
Workspace — 5 surfaces
workspace.navigator — 176x687, light theme, comfortable density
workspace.properties — 240x687, light theme, comfortable density
workspace.ribbon — 1584x200, light theme, comfortable density
workspace.status — 1156x34, light theme, comfortable density
workspace.viewport — 1156x653, light theme, comfortable density
Ribbon tabs — 17 surfaces
ribbon.analyze — 1584x200, light theme, comfortable density
ribbon.automate — 1584x215, light theme, comfortable density
ribbon.build — 1584x200, light theme, comfortable density
ribbon.chunks — 1584x215, light theme, comfortable density
ribbon.data — 1584x200, light theme, comfortable density
ribbon.entities — 1584x200, light theme, comfortable density
ribbon.extend — 1584x200, light theme, comfortable density
ribbon.home — 1584x200, light theme, comfortable density
Pixel-identical to workspace.ribbon: the same popover, opened from a different host. One file, shown again rather than counted again.
ribbon.operations — 1584x200, light theme, comfortable density
ribbon.panels — 1584x200, light theme, comfortable density
ribbon.redstone — 1584x200, light theme, comfortable density
ribbon.selection — 1584x325, light theme, comfortable density
ribbon.structures — 1584x200, light theme, comfortable density
ribbon.terrain — 1584x200, light theme, comfortable density
ribbon.tools — 1584x200, light theme, comfortable density
ribbon.view — 1584x200, light theme, comfortable density
ribbon.worldgen — 1584x200, light theme, comfortable density
Context menus — 9 surfaces
menu.boxes — 300x390, light theme, comfortable density
menu.navigator — 300x390, light theme, comfortable density
menu.pane — 300x348, light theme, comfortable density
menu.recent — 300x348, light theme, comfortable density
menu.ribbon — 300x390, light theme, comfortable density
menu.statusbar — 300x382, light theme, comfortable density
menu.tab — 300x348, light theme, comfortable density
menu.tabGroup — 300x348, light theme, comfortable density
menu.viewport — 300x390, light theme, comfortable density
Overlays — 8 surfaces
palette.card — 660x620, light theme, comfortable density
palette.full — 1536x936, light theme, comfortable density
picker.moveIntoGroup — 300x228, light theme, comfortable density
popup.tabOverflow — 283x603, light theme, comfortable density
regexBuilder.dropdown — 380x341, light theme, comfortable density
regexBuilder.menu — 380x341, light theme, comfortable density
Pixel-identical to regexBuilder.dropdown: the same popover, opened from a different host. One file, shown again rather than counted again.
regexBuilder.palette — 380x341, light theme, comfortable density
Pixel-identical to regexBuilder.dropdown: the same popover, opened from a different host. One file, shown again rather than counted again.
regexBuilder.panel — 380x341, light theme, comfortable density
Pixel-identical to regexBuilder.dropdown: the same popover, opened from a different host. One file, shown again rather than counted again.
Dropdowns — 113 surfaces
dropdown.batchQueue.Policy — 357x187, light theme, comfortable density
dropdown.batchQueue.Report — 357x187, light theme, comfortable density
dropdown.blockSelect.Namespace — 329x155, light theme, comfortable density
dropdown.blockSelect.Platform and version — 328x155, light theme, comfortable density
dropdown.brushSettings.Brush mode — 318x340, light theme, comfortable density
dropdown.brushSettings.Fill block — 319x251, light theme, comfortable density
dropdown.brushSettings.Replace block — 318x219, light theme, comfortable density
dropdown.cloneTool.Mirror — 309x219, light theme, comfortable density
dropdown.cloneTool.Rotation — 308x251, light theme, comfortable density
dropdown.cloneTool.Scale — 308x219, light theme, comfortable density
dropdown.controls.Key group — 667x219, light theme, comfortable density
dropdown.cutawayView.Axis — 287x187, light theme, comfortable density
dropdown.cutawayView.Side kept — 287x155, light theme, comfortable density
dropdown.elementAppearance.Font family — 289x187, light theme, comfortable density
dropdown.elementAppearance.Font weight — 288x187, light theme, comfortable density
dropdown.erosion.Deposit — 277x187, light theme, comfortable density
dropdown.erosion.Type — 277x187, light theme, comfortable density
dropdown.exportStructure.Handler — 277x219, light theme, comfortable density
dropdown.exportStructure.Platform — 277x155, light theme, comfortable density
dropdown.findReplaceBlocks.Search in — 348x187, light theme, comfortable density
dropdown.findReplaceBlocks.State matching — 349x187, light theme, comfortable density
dropdown.findReplaceCommands.Coordinates — 358x187, light theme, comfortable density
dropdown.findReplaceCommands.Offset — 359x155, light theme, comfortable density
dropdown.findReplaceNbt.Match — 359x219, light theme, comfortable density
dropdown.findReplaceNbt.Tag type — 358x315, light theme, comfortable density
dropdown.flatten.Direction — 260x187, light theme, comfortable density
dropdown.flatten.Edge — 260x187, light theme, comfortable density
dropdown.floodFill.Direction — 279x187, light theme, comfortable density
dropdown.floodFill.Neighbours — 278x187, light theme, comfortable density
dropdown.floodFill.Replace with — 279x219, light theme, comfortable density
dropdown.floodFill.Search block — 278x219, light theme, comfortable density
dropdown.fourUpView.Bottom left — 307x219, light theme, comfortable density
dropdown.fourUpView.Bottom right — 307x219, light theme, comfortable density
dropdown.fourUpView.Top left — 307x251, light theme, comfortable density
dropdown.fourUpView.Top right — 307x219, light theme, comfortable density
dropdown.generateTool.Generator — 328x315, light theme, comfortable density
dropdown.generateTool.Leaf block — 329x187, light theme, comfortable density
dropdown.generateTool.Output — 329x155, light theme, comfortable density
dropdown.generateTool.Trunk block — 328x187, light theme, comfortable density
dropdown.importMap.Dithering — 326x187, light theme, comfortable density
dropdown.importMap.Import as — 328x187, light theme, comfortable density
dropdown.importMap.Palette — 328x219, light theme, comfortable density
dropdown.inspector.Follow — 339x155, light theme, comfortable density
dropdown.inspector.Inspecting — 338x251, light theme, comfortable density
dropdown.inventoryEditor.Inventory — 348x251, light theme, comfortable density
dropdown.inventoryEditor.Item type — 349x251, light theme, comfortable density
dropdown.lightOverlay.Channel — 307x219, light theme, comfortable density
dropdown.lightOverlay.Display — 307x187, light theme, comfortable density
dropdown.logView.Minimum level — 367x219, light theme, comfortable density
dropdown.logView.Source — 367x251, light theme, comfortable density
dropdown.macroRecorder.Anchor — 327x187, light theme, comfortable density
dropdown.macroRecorder.Repeat — 327x187, light theme, comfortable density
dropdown.minecraftInstalls.Resource pack — 347x219, light theme, comfortable density
dropdown.minecraftInstalls.Version — 347x219, light theme, comfortable density
dropdown.narrator.Backend — 277x155, light theme, comfortable density
dropdown.narrator.Narrator language — 277x187, light theme, comfortable density
dropdown.noiseGen.Noise — 287x219, light theme, comfortable density
dropdown.noiseGen.Output — 287x187, light theme, comfortable density
dropdown.patternMask.Applies to — 299x187, light theme, comfortable density
dropdown.patternMask.Match — 298x251, light theme, comfortable density
dropdown.portalBuilder.Corners — 378x155, light theme, comfortable density
dropdown.portalBuilder.Frame block — 379x187, light theme, comfortable density
dropdown.portalBuilder.Orientation — 379x155, light theme, comfortable density
dropdown.portalBuilder.Size — 378x219, light theme, comfortable density
dropdown.presets.Property — 337x251, light theme, comfortable density
dropdown.presets.Scope — 337x187, light theme, comfortable density
dropdown.railTunnel.Accent columns — 386x219, light theme, comfortable density
dropdown.railTunnel.Alcoves — 386x187, light theme, comfortable density
dropdown.railTunnel.Backing — 389x219, light theme, comfortable density
dropdown.railTunnel.Body pattern — 391x251, light theme, comfortable density
dropdown.railTunnel.Column block — 391x219, light theme, comfortable density
dropdown.railTunnel.Cross-section — 388x219, light theme, comfortable density
dropdown.railTunnel.Dimension — 388x155, light theme, comfortable density
dropdown.railTunnel.Fixture block — 388x315, light theme, comfortable density
dropdown.railTunnel.Floor block — 388x187, light theme, comfortable density
dropdown.railTunnel.Placement — 388x251, light theme, comfortable density
dropdown.railTunnel.Rib block — 389x187, light theme, comfortable density
dropdown.railTunnel.Ribs — 388x187, light theme, comfortable density
dropdown.railTunnel.Roof block — 389x187, light theme, comfortable density
dropdown.railTunnel.Roof block — 389x219, light theme, comfortable density
dropdown.railTunnel.Routing — 388x219, light theme, comfortable density
dropdown.railTunnel.Shape — 388x283, light theme, comfortable density
dropdown.railTunnel.Side — 389x219, light theme, comfortable density
dropdown.railTunnel.Slope handling — 389x187, light theme, comfortable density
dropdown.railTunnel.Wall block — 389x219, light theme, comfortable density
dropdown.redstoneTrace.Action — 348x219, light theme, comfortable density
dropdown.redstoneTrace.Wiring — 349x155, light theme, comfortable density
dropdown.relight.Area — 277x187, light theme, comfortable density
dropdown.relight.Light type — 277x187, light theme, comfortable density
dropdown.removeEntities.Category — 277x283, light theme, comfortable density
dropdown.removeEntities.Named entities — 277x187, light theme, comfortable density
dropdown.ribbon-structures.Format — 260x219, light theme, comfortable density
dropdown.ribbon-view.Density — 260x187, light theme, comfortable density
dropdown.seaLevel.Action — 260x187, light theme, comfortable density
dropdown.seaLevel.Enclosure — 260x155, light theme, comfortable density
dropdown.spawnAnalysis.Show — 348x219, light theme, comfortable density
dropdown.spawnAnalysis.Time — 349x187, light theme, comfortable density
dropdown.stackArray.Axis — 287x219, light theme, comfortable density
dropdown.stackArray.Layout — 287x187, light theme, comfortable density
dropdown.surfacePaint.Blend — 287x187, light theme, comfortable density
dropdown.surfacePaint.Driven by — 287x219, light theme, comfortable density
dropdown.tabManager.Group state — 379x155, light theme, comfortable density
dropdown.tabManager.Tab strip edge — 378x219, light theme, comfortable density
dropdown.terrainBrush.Brush shape — 288x219, light theme, comfortable density
dropdown.terrainBrush.Falloff — 289x219, light theme, comfortable density
dropdown.toolSettings.On activation — 317x155, light theme, comfortable density
dropdown.toolSettings.Tool — 317x340, light theme, comfortable density
dropdown.versionSelect.Data version — 260x219, light theme, comfortable density
dropdown.versionSelect.Platform — 260x187, light theme, comfortable density
dropdown.viewControls.Control scheme — 319x187, light theme, comfortable density
dropdown.viewControls.View type — 318x283, light theme, comfortable density
dropdown.workPlane.Axis — 277x187, light theme, comfortable density
dropdown.workPlane.Snap — 277x187, light theme, comfortable density
Surfaces — 113 surfaces
about — 640x633, light theme, comfortable density
analyzeTool — 740x736, light theme, comfortable density
batchQueue — 760x780, light theme, comfortable density
biomeMap — 720x342, light theme, comfortable density
biomeSelect — 620x533, light theme, comfortable density
blockAudit — 740x432, light theme, comfortable density
blockHistogram — 720x342, light theme, comfortable density
blockSelect — 720x780, light theme, comfortable density
brushSettings — 700x780, light theme, comfortable density
brushTool — 640x780, light theme, comfortable density
caveMap — 700x730, light theme, comfortable density
chunkInspector — 780x342, light theme, comfortable density
cloneTool — 680x780, light theme, comfortable density
commandFinder — 760x342, light theme, comfortable density
configureBlocks — 740x780, light theme, comfortable density
confirm — 520x601, light theme, comfortable density
controls — 720x780, light theme, comfortable density
convertProgress — 600x578, light theme, comfortable density
cutawayView — 620x584, light theme, comfortable density
dimsum — 520x660, light theme, comfortable density
docs — 820x780, light theme, comfortable density
editChunkTool — 700x780, light theme, comfortable density
elementAppearance — 640x780, light theme, comfortable density
entityBrowser — 800x432, light theme, comfortable density
entityEdit — 660x780, light theme, comfortable density
erosion — 600x706, light theme, comfortable density
errorReport — 680x705, light theme, comfortable density
exportStructure — 600x547, light theme, comfortable density
externalEditor — 620x725, light theme, comfortable density
findReplaceBlocks — 760x780, light theme, comfortable density
findReplaceCommands — 780x780, light theme, comfortable density
findReplaceNbt — 780x780, light theme, comfortable density
flatten — 560x377, light theme, comfortable density
floodFill — 620x780, light theme, comfortable density
forceLoaded — 700x342, light theme, comfortable density
fourUpView — 660x659, light theme, comfortable density
gamerules — 700x294, light theme, comfortable density
generateTool — 720x780, light theme, comfortable density
goto — 460x430, light theme, comfortable density
heightLimits — 700x490, light theme, comfortable density
history — 760x780, light theme, comfortable density
importChunks — 600x528, light theme, comfortable density
importMap — 700x780, light theme, comfortable density
inspector — 740x780, light theme, comfortable density
inventoryEditor — 760x780, light theme, comfortable density
itemTypeList — 720x780, light theme, comfortable density
languageSelect — 520x780, light theme, comfortable density
layerSlice — 560x663, light theme, comfortable density
levelDat — 700x432, light theme, comfortable density
libraryPanel — 760x780, light theme, comfortable density
licenses — 700x617, light theme, comfortable density
lightOverlay — 660x709, light theme, comfortable density
loading — 560x688, light theme, comfortable density
logView — 780x460, light theme, comfortable density
lootAudit — 720x342, light theme, comfortable density
macroRecorder — 700x698, light theme, comfortable density
mapItems — 700x342, light theme, comfortable density
measure — 560x294, light theme, comfortable density
minecraftInstalls — 740x780, light theme, comfortable density
moveTool — 640x705, light theme, comfortable density
narrator — 600x706, light theme, comfortable density
nbtLegacy — 720x780, light theme, comfortable density
nbtSearch — 760x780, light theme, comfortable density
noiseGen — 620x664, light theme, comfortable density
operationOptions — 640x780, light theme, comfortable density
oreAudit — 740x294, light theme, comfortable density
patternMask — 660x780, light theme, comfortable density
pendingImports — 740x780, light theme, comfortable density
playerData — 720x342, light theme, comfortable density
playerPanel — 720x780, light theme, comfortable density
pluginsDialog — 740x780, light theme, comfortable density
portalBuilder — 820x780, light theme, comfortable density
portalLinker — 740x780, light theme, comfortable density
presets — 720x780, light theme, comfortable density
profiler — 740x780, light theme, comfortable density
pythonConsole — 760x626, light theme, comfortable density
railNetwork — 740x780, light theme, comfortable density
railTunnel — 840x780, light theme, comfortable density
redstoneTrace — 760x780, light theme, comfortable density
regenerate — 600x727, light theme, comfortable density
relight — 600x445, light theme, comfortable density
removeEntities — 600x681, light theme, comfortable density
renderLayers — 640x780, light theme, comfortable density
schematicLibrary — 760x780, light theme, comfortable density
schoolUnlock — 520x642, light theme, comfortable density
scoreboard — 740x342, light theme, comfortable density
scriptConsole — 760x762, light theme, comfortable density
seaLevel — 560x470, light theme, comfortable density
seedTools — 700x459, light theme, comfortable density
selectBlockTool — 680x780, light theme, comfortable density
selectEntityTool — 660x560, light theme, comfortable density
signSearch — 700x342, light theme, comfortable density
slimeChunks — 660x294, light theme, comfortable density
smooth — 560x628, light theme, comfortable density
spawnAnalysis — 760x780, light theme, comfortable density
spawnPoints — 700x659, light theme, comfortable density
stackArray — 620x615, light theme, comfortable density
structureLocator — 780x459, light theme, comfortable density
surfacePaint — 620x608, light theme, comfortable density
tabManager — 820x780, light theme, comfortable density
terrainBrush — 640x780, light theme, comfortable density
tickLoad — 740x780, light theme, comfortable density
toolSettings — 680x769, light theme, comfortable density
undoHistory — 700x780, light theme, comfortable density
update — 620x663, light theme, comfortable density
validateRepair — 760x780, light theme, comfortable density
versionSelect — 560x461, light theme, comfortable density
viewControls — 700x780, light theme, comfortable density
waypoints — 620x694, light theme, comfortable density
workPlane — 600x641, light theme, comfortable density
worldBorder — 660x342, light theme, comfortable density
worldDiff — 780x759, light theme, comfortable density
worldInfo — 700x342, light theme, comfortable density
Not captured — 3
These are recorded rather than omitted. A gap nobody mentions reads as coverage.
| Surface | Why not |
|---|---|
menu-appearance |
7 descendant(s) reported drawing but the picture holds only 3 distinct colours and is 78% one colour: the rows did not draw, so the file was deleted rather than shipped as evidence. |
menu-application-file |
7 descendant(s) reported drawing but the picture holds only 3 distinct colours and is 78% one colour: the rows did not draw, so the file was deleted rather than shipped as evidence. |
menu-application-view |
7 descendant(s) reported drawing but the picture holds only 3 distinct colours and is 78% one colour: the rows did not draw, so the file was deleted rather than shipped as evidence. |
Menus and overlays not opened — 89
A menu that a run could not raise is written down here rather than left out. A gap nobody mentions reads as coverage.
| Surface | Why not |
|---|---|
dropdown-about-none |
the About surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-analyzetool-none |
the Analyze surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-biomemap-none |
the Biome map surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-biomeselect-none |
the Select biome surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-blockaudit-none |
the Block state audit surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-blockhistogram-none |
the Block histogram surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-brushtool-none |
the Shape brush surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-cavemap-none |
the Cave coverage surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-chunkinspector-none |
the Chunk inspector surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-commandfinder-none |
the Command blocks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-configureblocks-none |
the Configure blocks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-confirm-none |
the Delete unselected chunks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-convertprogress-none |
the Converting world surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-dimsum-none |
the Har gow · 蝦餃 surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-docs-none |
the Documentation surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-editchunktool-none |
the Edit chunk surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-entitybrowser-none |
the Entity browser surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-entityedit-none |
the Edit entity surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-errorreport-none |
the Unexpected error surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-externaleditor-none |
the External editor surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-forceloaded-none |
the Force-loaded chunks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-gamerules-none |
the Game rules surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-goto-none |
the Teleport surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-heightlimits-none |
the Height limits surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-history-none |
the Project history surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-importchunks-none |
the Import chunks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-itemtypelist-none |
the Item types surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-languageselect-none |
the Language Select surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-layerslice-none |
the Layer slice surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-leveldat-none |
the level.dat surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-librarypanel-none |
the Library surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-licenses-none |
the Third Party Licenses surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-loading-none |
the Please wait while the renderer loads surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-lootaudit-none |
the Loot audit surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-mapitems-none |
the Map items surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-measure-none |
the Measure surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-movetool-none |
the Move surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-nbtlegacy-none |
the NBT editor surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-nbtsearch-none |
the NBT search and replace surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-operationoptions-none |
the Replace surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-oreaudit-none |
the Ore distribution surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-pendingimports-none |
the Pending imports surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-playerdata-none |
the Player data surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-playerpanel-none |
the Players surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-pluginsdialog-none |
the Plugins surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-portallinker-none |
the Portal linkage surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-profiler-none |
the Profiler surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-pythonconsole-none |
the Python console surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-railnetwork-none |
the Rail network surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-regenerate-none |
the Regenerate chunks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-renderlayers-none |
the Render layers surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-analyze-none |
the analyze ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-automate-none |
the automate ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-build-none |
the build ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-chunks-none |
the chunks ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-data-none |
the data ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-entities-none |
the entities ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-extend-none |
the extend ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-home-1-dimension |
the opener ran but showed no popup |
dropdown-ribbon-home-disabled |
1 dropdown(s) on this surface are disabled in a capture run and refuse to open: Dimension |
dropdown-ribbon-operations-none |
the operations ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-panels-none |
the panels ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-redstone-none |
the redstone ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-selection-none |
the selection ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-terrain-none |
the terrain ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-tools-none |
the tools ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-ribbon-worldgen-none |
the worldgen ribbon tab carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-schematiclibrary-none |
the Structure library surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-schoolunlock-none |
the School mode surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-scoreboard-none |
the Scoreboard surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-scriptconsole-none |
the Operation console surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-seedtools-none |
the Seed tools surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-selectblocktool-none |
the Select block surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-selectentitytool-none |
the Select entity surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-shell-none |
the Studio shell carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-signsearch-none |
the Sign text surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-slimechunks-none |
the Slime chunks surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-smooth-none |
the Smooth terrain surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-spawnpoints-none |
the Spawn points and beds surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-structurelocator-none |
the Locate structures surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-tickload-none |
the Tick load surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-undohistory-none |
the Undo history surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-update-none |
the Update status surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-validaterepair-none |
the Validate and repair surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-waypoints-none |
the Waypoints surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-worldborder-none |
the World border surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-worlddiff-none |
the Compare worlds surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
dropdown-worldinfo-none |
the World info surface carries no dropdown at all, so this walk had nothing to open; recorded so an empty result cannot be mistaken for a walk that never ran |
regexbuilder-every-other-search-field |
The builder is one class, opened by every search bar in the product; it is photographed from 4 kinds of host (regexBuilder.dropdown, regexBuilder.menu, regexBuilder.palette, regexBuilder.panel). The Studio shell alone carries 3 search bars and every spec surface carries at least one more, so photographing each field's builder would repeat the same popover under a different anchor name. |
Note
The images further down this section show earlier builds — the pre-Material workflow screenshots and the owner-drawn Material shell that the Studio replaced. They are kept because they are genuine records of what they show, and they are labelled as such. They are not evidence for the current interface; the matrix above is.
Every image in this section is a tracked screenshot of the real wxPython app. They intentionally retain the version visible in the captured window. No mockup or generated image is presented as runtime evidence.
Captured from exact commit b3cbec1c4b1035dd0c2ebdc9a545266f49c257ef
on an isolated hidden Windows desktop with wxPython 4.2.5. The 2250×1395
capture shows the source frame after startup: no acknowledgement or
purchase prompt, no duplicate one-page tab rail, one logo, and M3 action
hierarchy. This is the shell Amulet Studio replaced, not the current one.
Open six historical pre-Material workflow screenshots
Open the four earlier wxPython dialog baselines (2026-08-09)
These captures are from the real source dialogs at commit d62ae152, rendered
on a hidden desktop with wxPython 4.2.5. They preserve an earlier migration
boundary. Several of these dialogs are still the real implementation behind
their Studio surface keys, so they remain useful references — but the chrome
around them has changed.
Open the full 0.10.47 editing montage
This historical pre-Material capture contains four genuine frames showing a 3D terrain selection, paste placement and
transform controls, a block operation over selected boxes, and a top-down chunk
selection. The montage was added to the repository in 2026; the application
title inside the capture identifies the runtime as 0.10.47.
Screenshot provenance and limitations
| Asset | Pixels | Repository provenance | Evidence boundary |
|---|---|---|---|
cover.jpg |
5120×2760 | Added in 2026 by the upstream README update | Real 0.10.47 montage; not a capture of the current branch. |
edit.jpg |
1920×1030 | Added in 2020 and updated in 2021 | Real 0.8.9 3D editing workflow. |
main_menu.jpg |
541×389 | Added with the 2020 documentation images | Real 0.6.1 main menu. |
world_select.jpg |
1920×1006 | Added with the 2020 documentation images | Real legacy collapsed world browser. |
world_select_expand.jpg |
1920×1026 | Added with the 2020 documentation images | Real legacy expanded world browser. |
about.jpg |
550×435 | Added with the 2020 application guide | Real 0.6.1 open-world workspace. |
convert.jpg |
814×490 | Added with the 2020 program guide | Real 0.6.1 conversion surface. |
preferences-runtime-baseline-20260809.png |
930×720 | Captured 2026-08-09 from commit d62ae152 on a hidden desktop |
Real Preferences Language tab; native wx chrome remains a pre-M3 baseline. |
preferences-appearance-runtime-baseline-20260809.png |
930×720 | Captured 2026-08-09 from commit d62ae152 on a hidden desktop |
Real Appearance tab; lower preset controls require scrolling. |
notification-history-runtime-baseline-20260809.png |
1140×780 | Captured 2026-08-09 from commit d62ae152 on a hidden desktop |
Real notification history with populated rows; column sizing was corrected later. |
main-frame-runtime-baseline-20260809.png |
1500×930 | Captured 2026-08-09 from commit d7bd3875 on a hidden desktop |
Real AmuletUI with the first custom borderless title bar; superseded. |
main-frame-material-shell-b3cbec1c-20260809.png |
2250×1395 | Captured 2026-08-09 from exact commit b3cbec1c4b1035dd0c2ebdc9a545266f49c257ef on an isolated hidden desktop |
Real owner-drawn Material shell with quiet startup; superseded by Amulet Studio. |
The repository does not currently contain an automated desktop screenshot harness. These captures are therefore documentation artifacts, not a pixel-regression suite, and none of them shows the current interface. UI behavior added after the pictured versions must be verified from builds and tests rather than inferred from these images.
- Download the verified
0.10.0-dev.414 Setup.exe, or choose a newer version from all releases after checking its exact assets. - Read the matching
0.10.0-dev.414release notes and asset list. - Close Minecraft, back up the world you intend to edit, and run the installer.
- Open the copied world in Amulet and make a small, reviewable change first.
Warning
Windows artifacts from this repository are intentionally unsigned. Windows
may show an Unknown Publisher or SmartScreen warning. The project does not
claim Authenticode verification; release integrity relies on GitHub's HTTPS
transport, published asset digests, and the Squirrel RELEASES index.
Squirrel.Windows release set, and other platforms
The Windows workflow packages the PyInstaller application into:
Setup.exe— verified 0.10.0-dev.414 interactive bootstrap installer;RELEASES— verified 0.10.0-dev.414 Squirrel release index; andAmulet-0.10.0-dev414-full.nupkg— verified application payload used by install and update flows.
The release inspected while this README was written was
0.10.0-dev.414,
published on 2026-08-09 from f95695f7cbadecd3272370a1fa694e9b601ab124
with all three required assets. Later versions should
be evaluated from their own immutable release page rather than assumed to have
the same asset set.
The active delivery path is Windows-only and publishes unsigned Squirrel.Windows assets. Source code may still be useful on other platforms, but this repository does not currently present non-Windows installers as supported release deliverables.
For a development install, use Python 3.11 or newer and follow the steps below. wxPython, OpenGL, native build dependencies, and the Amulet format stack must be available for the desktop runtime. A successful source import or unit-test run does not by itself prove that a graphical session can create and render the wx window on that machine.
- Back up the world. Work from a copy until you have verified the result in Minecraft.
- Close other writers. Do not leave the same world open in Minecraft or another editor.
- Open the project. From the backstage, pick a detected world, a recent project, or browse to a folder.
- Get your bearings. The navigator shows the dimension and any selection boxes; the status bar shows the head revision and whether there is unsaved work.
- Select narrowly. Start with the smallest useful region and confirm its coordinates and active dimension.
- Apply one action. Use the ribbon tab that owns it, or press
Ctrl+Shift+Fand search for it by name. - Review before saving. The properties pane's History tab lists what has been applied; restoring writes a new revision, so trying a restore never costs you the state you restored from.
- Close Amulet before Minecraft. Reopen the edited copy in the game and inspect the affected area.
This repository follows the 0.10 development line. It is derived from the
upstream Amulet Map Editor
and carries additional Material 3, preferences, site, update, and delivery work.
git clone https://github.com/Ding-Ding-Projects/material-minecraft-map-editor.git
Set-Location material-minecraft-map-editor
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"On macOS or Linux, activate with source .venv/bin/activate. Resolve native
dependencies from the project metadata and your platform's canonical package
source; do not commit a virtual environment or generated build tree.
py -3 -m pytest tests -q
python -m black --check --diff .
python scripts/count_lines.pyThe interface's data layer — the surface index, the command registry, all the surface descriptions, the shared search state, the NBT model, and the Memory Console's content — imports without wxPython, so most of the suite runs on a machine with no display. The handful of checks that genuinely need wx skip with a stated reason rather than passing silently.
The line counter, and what its rows mean
The committed line counter is the release source of truth. It counts tracked,
line-oriented text and separates source, tests, styles/markup, generated text,
and deliberately excluded text. project-total is the three hand-written
project rows; repository-grand-total adds the generated and excluded rows.
Each row reports total/nonblank lines plus surviving git blame attribution as
agent, person, or unattributed, and the script fails if that arithmetic drifts.
Binary assets are not line-counted. Dependency/build directories and lockfiles
are excluded explicitly instead of disappearing into an unexplained total.
Always run the committed script rather than re-deriving a count by hand: an ad-hoc sweep silently drops whatever matches none of its patterns, which is the one misrepresentation the separated rows exist to prevent.
Regenerating the documentation bundle and the changelog catalog
Two resources in the package are generated from the repository and must be rebuilt when their sources change:
python scripts/build_docs_bundle.py
python scripts/generate_changelog.pyThe first rebuilds the offline documentation bundle from every
docs/features/*/README.md; a stale bundle fails tests/test_docs_browser.py
by design, so an article added without regenerating cannot ship missing from the
in-app browser. The second rebuilds the changelog catalog from the reachable
tags, and the test session regenerates it automatically when the checkout has
moved on.
python -m http.server 8000 --directory docs/siteOpen http://localhost:8000. The site is plain HTML, CSS, and JavaScript with
no CDN, analytics, or third-party runtime assets. See
docs/site/README.md for the owner-controlled hosting
contract.
Build the Windows package by hand
python -m pip install build "pyinstaller~=6.18"
python -m build
python -m pip install dist/amulet_map_editor-*.whl --upgrade
python -m PyInstaller -y --distpath ./installer/dist installer/Amulet.spec
./installer/build-squirrel.ps1 -Version 0.10.0 -Architecture x64The packaging script downloads pinned NuGet and Squirrel.Windows inputs, checks
the NuGet SHA-256, produces Setup.exe, RELEASES, and a full .nupkg, and
fails if an executable or DLL is signed. CI supplies a prior RELEASES and
full package only as a validated pair from the nearest semantically older
release in the same explicit channel. When supplied, the script requires and
uploads a verified current delta, while the client-facing feed advertises only
the current full package until a three-version installed-client update proof
passes. GitHub SHA-256 asset digests are checked when available. Read
installer/PACKAGING.md before changing this path.
Prefer build.bat and build-installer.bat for an ordinary build: they are the
paths a fresh machine takes, and using them is also what keeps them working.
- Keep changes focused and preserve unrelated work.
- Add or update tests for behavior changes; run the narrow tests and the full
py -3 -m pytest tests -qrun where feasible. - When you add a Studio surface, add its spec, its index entry, and its line in
the hand-written test census in
tests/test_studio_surface_index.py. When you add a search field, add it totests/test_studio_regex_builder_coverage.py. Those lists exist so a disappearance fails rather than passing quietly; deleting an entry to make the suite green defeats the point. - Update the relevant feature article under
docs/features/, the roadmap, and the handoff when behavior or verification state changes, and regenerate the documentation bundle. - Keep screenshot captions factual: identify the captured version and never use a design mockup as runtime proof.
- Distinguish source inspection, automated tests, package creation, graphical runtime verification, and published release evidence in pull requests.
- Use Issues for actionable defects or features and Discussions for design or workflow conversations.
| Evidence | Current status at this README revision |
|---|---|
| Amulet Studio interface | Source and automated-test claims only. The surface index, the spec registry, the ribbon definition, the search behaviour, the token values, the NBT model, the Memory Console content, and the accessibility contract are covered by tests; no runtime capture of the interface exists. |
| Tracked desktop captures | Twelve genuine images inspected: seven historical workflow captures, four earlier wxPython runtime baselines, and one exact-commit Material shell capture. All predate Amulet Studio. |
| Preference and regex behavior | Covered by repository unit tests, including bounded persistence, plain/regex matching, invalid patterns, and capture groups. |
| Scheduled-settings behavior | Covered by model and UI-contract tests for persistence, validation, precedence, weekday/date/time boundaries, reordering, and bilingual UI strings. |
| Squirrel update bridge | Covered by wx-independent tests for canonical build/manual/release tag publication, explicit-channel discovery across five bounded inventory pages, one shared check deadline, exact route/status/content validation on every page, official progress/JSON command parsing with bounded stdout and stderr, strict CRLF/LF/CR records, exact post-stage version proof within one 900-second apply-and-check deadline, immediate-layout updater discovery, and the guarded process-start-and-wait restart transaction. |
| Windows release | The inspected 0.10.0-dev.414 release is non-draft and contains Setup.exe, RELEASES, and Amulet-0.10.0-dev414-full.nupkg. |
| Live project-site deployment | The site source is published from docs/site/; a verified owner-hosted URL of its own is not claimed here. |
- Material modernization repository
- Latest release
- Build workflows
- Material 3 site source
- Feature documentation
- Desktop documentation
- Roadmap
- Handoff
- Upstream Amulet Map Editor
- Official Amulet website
Repository-local working agreement
This repository carries a sanitized mirror of its shared working agreement in
AGENTS.md. In short: preserve user work, keep changes reversible,
apply accessible Material Design 3 patterns consistently, keep documentation
and CI claims truthful, distinguish static checks from actual runtime and
release evidence, and never expose credentials. The canonical shared agreement,
repository-local rules, and higher-priority safety requirements take precedence
over this summary.






















































































































































































































































































