# Horizon's roadmap: the one source of truth for ROADMAP.md, playhorizon.dev/roadmap and Kira's answers. # Edit this file, then run `python3 tools/roadmap.py build`. How to keep it current: roadmap/README.md. # # No dates, ever: an item is Now, Next or Later. Each item says the same thing twice: `plain` for players # (one or two sentences, at most 240 characters, so it fits a post when it ships) and `dev` for contributors # (crates, approach, what is left). Links are "#123" (an issue or a pull request), a path in the repository, # or an https URL. Only what is decided goes here; ideas wait in GitHub issues and the suggestion queue. # `focus = true` puts a Now item in the overview (3 to 5 of them). `ongoing = true` marks a workstream that goes on # after its linked pull requests merge: `sync` never ships it, so link its new pull requests as they open. [overview] today_plain = """Horizon is Minecraft: Java Edition 26.3 rewritten from scratch in Rust, so it runs faster on the \ same computer. Single player, LAN, servers, resource packs and Horizon's own mods work today, on your own copy of \ the game.""" today_dev = """A native Rust and wgpu reimplementation of Java 26.3: the same saves, rules and terrain, checked \ against the real game by more than 300 differential harnesses (a Java oracle and a Rust probe on the same inputs). \ Single player runs on its own server thread, like vanilla's integrated server.""" help_plain = """Play it and tell us what differs from vanilla (Discord or GitHub), run the benchmark on your \ computer, vote for what you want next, or pick one of the Help wanted items.""" help_dev = """Read CONTRIBUTING.md, pick a Help wanted item or a To do card, check vanilla's code for the \ behaviour, and paste the block `python3 tools/pr_ready.py` prints in your pull request.""" # Areas, in the project's order of priority: performance first, then modpacks and servers. [[area]] id = "performance" name = "Performance" [[area]] id = "modpacks" name = "Modpacks" [[area]] id = "servers" name = "Servers and multiplayer" [[area]] id = "mods" name = "Mods and API" [[area]] id = "gameplay" name = "Gameplay parity" [[area]] id = "rendering" name = "Rendering" [[area]] id = "launcher" name = "Launcher" [[area]] id = "platforms" name = "Platforms" [[area]] id = "extras" name = "Horizon extras" [[area]] id = "ai" name = "AI and agents" [[area]] id = "community" name = "Community" [[area]] id = "project" name = "Code and tools" # ---------------------------------------------------------------------------------------------------- Now [[item]] id = "smooth-frames" title = "Steady frames at long render distances" status = "now" area = "performance" focus = true plain = """Making Horizon faster than vanilla on every computer, with smooth camera movement even at 32 chunks, \ by spreading the work better over the processor's cores.""" dev = """Frame pacing at render distance 32 (#678): long frames come from work competing with the render thread. \ In review: world generation workers build free structure starts instead of queueing them (#1760), the worker pool \ leaves one core as vanilla does (#1778), and the terrain vertex arena is read as storage where flat draws run \ (#1742). Still open: far terrain at 48 to 64 chunks (#718) and CPU-bound fields of block entities (#717). Every \ change shows before and after numbers from `tools/perf_bench.py` against vanilla 26.3 (docs/benchmark.md).""" links = ["#678", "#1760", "#1778", "#1742", "#718", "#717", "docs/benchmark.md"] [[item]] id = "block-storage" title = "Faster block lookups" status = "now" area = "performance" plain = """Speeding up the code that reads and writes the blocks of the world, which almost everything in the game \ goes through: generation, lighting, meshing and ticking.""" dev = """`PalettedContainer` and `PackedStorage` find an entry's word by multiply and shift instead of an integer \ division (#1790, #1794); meshing looks up baked models by index, not by name (#1747). Each change keeps the paletted \ storage harnesses identical and shows its microbenchmark (docs/performance/paletted-container-access-results.md).""" links = ["#1790", "#1794", "#1747", "docs/performance/paletted-container-access-results.md"] [[item]] id = "modpack-worldgen" title = "Modpacks' world generation, natively" status = "now" area = "modpacks" announce = true focus = true plain = """Making the world-generation mods of popular modpacks (new structures, YUNG's dungeons and mineshafts, \ packs built on Lithostitched) generate their worlds in Horizon, natively and fast.""" dev = """`horizon-port-pack` carries a pack's data-driven content over; structure mods that need code get a native \ port: YUNG's worldgen as written (#1746), Lithostitched's limited and guaranteed elements with pool and processor \ modifiers (#1777), its processors as the game's own types (#1765). Proved by the structure blocks and layout \ harnesses (#1753, #1757). Mods whose Java code does more than world generation don't run (docs/modpacks.md).""" links = ["#1746", "#1777", "#1765", "#1753", "#1757", "docs/modpacks.md"] [[item]] id = "server-clients" title = "Playing on servers: everything shows as it should" status = "now" ongoing = true area = "servers" focus = true plain = """When you play on a server, other players, mobs, items and menus look and behave as in vanilla: skins, \ poses, item names, inventories and server networks.""" dev = """Client-of-a-server fixes in `game/remote*.rs` and `horizon-protocol`: mobs' aggressive and item-use flags \ (#1802, #1798), ghost items after a remote menu (#1795), skins (#1652), cookies and transfer packets for proxy \ networks (#1650), firework boosts (#1671), living-entity attributes and simulation distance (#1731), styled item \ names (#1702), primed TNT between updates (#1710).""" links = ["#1802", "#1798", "#1795", "#1652", "#1650", "#1671", "#1731", "#1702", "#1710"] [[item]] id = "server-thread" title = "Single player as a server: the last differences" status = "now" ongoing = true area = "gameplay" focus = true plain = """Single player now runs a small server in the background, as vanilla does. We are fixing what still \ behaves differently there; every fix also works for LAN and server players.""" dev = """Since #1514 single player runs on the server thread (`game/integrated.rs`) and the window joins it as a \ client; `--in-frame` keeps the old path. The open `[server-thread]` issues list the gaps. In review: a tool that \ changes a block ends the click (#1797), potions keep their potion over the connection (#1796), mobs' aggression \ and arm swings (#1802). docs/server-levels.md.""" links = ["#1514", "#1797", "#1796", "#1802", "docs/server-levels.md"] [[item]] id = "mod-registry" title = "Horizon's mod registry" status = "now" area = "mods" announce = true focus = true plain = """One place for mods, modpacks and resource packs made for Horizon: browse them on the website and \ install them from the launcher in one click.""" dev = """Merged: the registry index (schema 1, `.hpack`, checks before install, #1634), `cargo horizon-mod check` \ (#1642) and the submission service (`crates/horizon-mod-registry`, #1659). In review: the website's /mods (#1596) \ and /mods/submit (#1635), and in the launcher the registry as a source (#1636), install, enable and takedowns \ (#1637), the Mods page (#1638) and modpacks as their own profiles (#1640).""" links = ["#1634", "#1642", "#1659", "#1596", "#1635", "#1636", "#1637", "#1638", "#1640", "docs/mods.md"] [[item]] id = "server-dialogs" title = "Server dialogs and login screens" status = "now" area = "servers" plain = """Servers that show dialogs, such as the register and login screens of AuthMe, will work in Horizon.""" dev = """26.3's dialog packets and model (#1720), the dialog screen with its buttons and actions (#1734), then text \ and boolean inputs (#1735).""" links = ["#1720", "#1734", "#1735"] [[item]] id = "languages" title = "Play in your language" status = "now" area = "gameplay" plain = """Item names, container titles and server messages follow the language you pick, as in vanilla. Today \ parts of the game stay in English.""" dev = """Translatable components resolved through the selected language for items, containers and server text \ (#1806), on top of the bundled languages the prepared resources carry (#1594). Left: the client's own screens \ (#1672) and the main menu with zh_cn (#1774).""" links = ["#1806", "#1594", "#1672", "#1774"] [[item]] id = "shader-packs" title = "Shader packs, written again from scratch" status = "now" ongoing = true area = "rendering" plain = """Shader packs were removed and are being rebuilt from scratch. They come back, off by default, once the \ best-known packs draw properly.""" dev = """A clean-room rewrite in `horizon-shaderpack`, from the packs' public format documentation only: reading \ packs, the preprocessor and `.properties` files are merged (#1584, #1585, #1586); translating programs to WGSL \ through naga, buffers, uniforms and the terrain, entity, sky, weather and hand stages are in review (#1698 to \ #1801).""" links = ["#1561", "#1584", "#1586", "#1698", "#1771", "#1786", "#1801"] [[item]] id = "discord-presence" title = "Discord Rich Presence" status = "now" area = "extras" announce = true plain = """Your Discord profile can show that you are playing Horizon, with a switch to turn it off.""" dev = """A Discord IPC client on its own thread (#1787) and the presence with its setting (#1788). Merged: it ships \ with the next release.""" links = ["#1787", "#1788"] [[item]] id = "lean-code" title = "A leaner codebase that builds faster" status = "now" ongoing = true area = "project" plain = """Cleaning up Horizon's code: removing what nothing uses and making it quicker to build, so fixes and new \ features land faster.""" dev = """A review of the whole tree: dead code and stubs removed (#1432, #1658), one probe binary per crate (#1453, \ #1454), shared harness helpers (#1448), clippy clean on the whole tree (#1707). docs/architecture.md maps each \ feature to its files and harnesses.""" links = ["#1432", "#1658", "#1453", "#1454", "#1448", "#1707", "docs/architecture.md"] [[item]] id = "native-shaders" title = "Horizon's own shader format and kit" status = "now" area = "rendering" plain = """Horizon's own way to make shader packs, with tools to write and test them. Every pack is checked before it \ runs, and the registry will list them.""" dev = """`horizon-shader-api` (API 0.1, experimental): WGSL stages with typed inputs inside the renderer's passes, \ options as WGSL override constants, and the `horizon-shader new|check|pack` tool with templates and the \ example pack Golden Hour. Merged: the check every pack passes (#1820) and the tool, templates and guide \ (#1822). In review: the post stage running in the game with hot reload (#1861), the sky stage (#1863) and \ registry checks that use the game's own check (#1855). Left: the material, lighting and shadow stages, a \ last-good fallback on reload, a GPU-time overlay per stage and budgets (docs/shaders.md, \ docs/api/shaders.md). The Iris/OptiFine loader is a separate item, 'Shader packs, written again from \ scratch'.""" links = ["#1820", "#1822", "#1861", "#1863", "#1855", "docs/shaders.md", "docs/api/shaders.md"] [[item]] id = "server-mods" title = "Mods that run on the server" status = "now" area = "mods" plain = """Mods that run on the server side of a world, so a dedicated server or a LAN world can have mods that react \ to players joining, chat and blocks being broken or placed, and that add commands.""" dev = """API 0.3, experimental first (#1833, in review): the same sandboxed component runs on the server thread and \ the dedicated server, with world events (block broken or placed, entity spawned or killed, player joined or \ left), game rules and server commands with typed arguments. The world, item and entity interfaces come after \ (see 'Mods that read and change the world'). docs/api/mods.md, docs/mods.md.""" links = ["#1833", "docs/api/mods.md", "docs/mods.md"] [[item]] id = "mod-screens" title = "Screens, input and drawing for mods" status = "now" area = "mods" plain = """Mods will be able to open their own screens and settings pages and react to keys and item use, so bigger \ mods, such as the Orbital Laser, can run on the normal game.""" dev = """Capability `ui` is in review (#1864): mod-owned screens and a settings page under Options > Mods, built from \ vanilla's widgets. Still to design: `input` (an item's use, key binds, the crosshair target), `render` (a \ budgeted draw list on the native shader API) and `world` (changing blocks). Orbital Laser is the acceptance \ test: it needs all four today through its author's fork (see 'Orbital Laser on the normal game').""" links = ["#1864", "docs/mods.md"] [[item]] id = "modder-tools" title = "Tools for people who make mods" status = "now" area = "mods" plain = """Better tools for mod makers: a test runner that needs no game window, templates for each kind of mod, and \ clear promises about what keeps working from one version to the next.""" dev = """`cargo horizon-mod test` runs a mod's test scripts against a fake game snapshot (#1816) and, for server \ mods, scripted server events (#1837); the content template and the guides are merged (#1859, #1810, \ docs/api/stability.md). Left: templates for hud, server and machine mods, typed wrappers in the SDK, a \ frozen 0.1 compatibility mod that every runtime must load, a CI check that fails when a stable reference \ entry is removed without a new major version, and the SDK on crates.io once the API is stable.""" links = ["#1816", "#1837", "docs/api/stability.md", "https://playhorizon.dev/docs/test-a-mod"] [[item]] id = "pregen" title = "Pre-generate an area with /pregen" status = "now" area = "servers" plain = """A /pregen command that builds an area of the world ahead of time, so players don't wait for new terrain when \ they explore.""" dev = """Generates, lights and saves an area before anyone walks there (#1805, a contributor's pull request, in \ review). Useful on servers, and it moves the generation cost away from the first visit; the generation \ speed-ups are under 'Steady frames at long render distances'.""" links = ["#1805"] # ---------------------------------------------------------------------------------------------------- Next [[item]] id = "microsoft-sign-in" title = "Microsoft sign-in (coming soon)" status = "next" area = "launcher" announce = true plain = """Coming soon: sign in with your Microsoft account to play on online-mode servers. The code is ready; it \ waits for Microsoft's approval.""" dev = """Device-code sign-in in the launcher and online-mode login in the client (docs/microsoft-account.md). It is \ turned on by setting the app's client id once Minecraft API access is approved; until then the launcher shows \ "Coming soon".""" links = ["docs/microsoft-account.md", "#1270"] [[item]] id = "curseforge" title = "CurseForge in the mod browser (coming soon)" status = "next" area = "modpacks" announce = true plain = """Coming soon: search and download CurseForge mods and modpacks from the launcher, as you can with \ Modrinth today.""" dev = """The mod browser lists CurseForge as coming soon (docs/mod-browser.md): it needs CurseForge API access. \ Meanwhile packs import from a CurseForge zip or instance folder, and jars only CurseForge hosts come from the \ player's own instance (docs/modpacks.md).""" links = ["docs/mod-browser.md", "docs/modpacks.md"] [[item]] id = "benchmarks" title = "Fresh benchmarks against vanilla" status = "next" area = "performance" plain = """New public numbers comparing Horizon with vanilla on many kinds of computers, measured the same way every \ time, with a history that shows what each release changed.""" dev = """Redo the comparison after the current performance work (#1073); reliability, coverage and presentation \ (#1346); a scene must count as loaded only once its first chunk arrives (#1749). Next: a performance history \ across releases (an automatic comparison of each release with the last, on a timeline), more report fields \ (server TPS and MSPT, power, battery drain, temperature, throttling) and more hardware (a MacBook on \ battery, low-end laptops, community reports). Players' reports come in through `--benchmark` and \ `horizon-launcher data benchmark` (docs/benchmark.md).""" links = ["#1073", "#1346", "#1749", "docs/benchmark.md"] [[item]] id = "pistons-push" title = "Pistons push players and mobs" status = "next" area = "gameplay" plain = """Pistons and slime blocks will push players, mobs and items as in vanilla. Today moving blocks pass \ through them.""" dev = """Port `PistonMovingBlockEntity.moveCollidedEntities` and `moveStuckEntities` (honey), the slime bounce and \ `Entity.limitPistonMovement` for `MoverType.PISTON`, in single player and for a server's players. Issues #1496, \ #1609, #1608, #1704, #1758.""" links = ["#1496", "#1609", "#1608", "#1704", "#1758"] [[item]] id = "intel-mac" title = "Horizon on Intel Macs" status = "next" area = "platforms" plain = "Builds of the game and the launcher for Macs with an Intel processor." dev = """x86_64 game and launcher builds, picked per processor (#1171). Before it ships it needs a run on a real \ Intel Mac: Rosetta on Apple Silicon only proves the CPU code. Requests: #1161, #1792.""" links = ["#1171", "#1161", "#1792"] [[item]] id = "world-entry" title = "Faster world creation and entry on small CPUs" status = "next" area = "performance" plain = """Creating a world and joining it should be quick even on a four-thread laptop, where a fresh world at 32 \ chunks can make you wait minutes for the first terrain.""" dev = """Cut the per-column generation cost (noise sampling, surface rules, aquifers) and the lock convoy on \ structure starts, and leave one core free for the rest of the game as vanilla does (#1760 and #1778, in \ review, are listed under 'Steady frames at long render distances'). Still to profile on small CPUs: the \ first seconds of a fresh world deliver no chunk, and fluids remesh for about a minute after loading. \ Measured with `tools/perf_bench.py` (docs/benchmark.md, docs/profiling.md).""" links = ["docs/benchmark.md", "docs/profiling.md"] [[item]] id = "server-tick" title = "Servers that hold 20 TPS with 50 to 100 players" status = "next" area = "performance" plain = """Servers that keep 20 ticks per second with 50 to 100 players. Today Horizon holds it up to 50 bots and drops \ to about 10 at 100.""" dev = """Measured against vanilla on equal work (docs/server.md, Scale): Horizon is ahead with few players and when \ exploring, but vanilla's tick is shorter with 25 to 50 players near spawn. Ideas on the list: send entity \ changes instead of rebuilding every entity each tick (about 15 percent), fewer memory reads in random ticks \ and collision scans, cheaper item collision checks, mob AI and natural spawning. The bot benchmark \ (`horizon-bots`) is the proof.""" links = ["docs/server.md"] [[item]] id = "low-end-mode" title = "Low-end computers: Steam Deck, old Macs, 8 GB" status = "next" area = "performance" plain = """Horizon should run well on small machines: integrated graphics, the Steam Deck, older Macs and 8 GB of \ memory, with a battery mode that saves power on laptops.""" dev = """Partly done: an opt-in 60 FPS cap with fewer workers on battery, Far Detail Reduced for integrated GPUs and \ animated textures on the GPU (both shipped). Left: measured targets and fixes per class of machine (memory \ use, worker counts, startup) on a Steam Deck, old Intel and Apple Silicon Macs and 8 GB computers, reported \ on the Benchmarks page.""" links = ["docs/benchmark.md", "https://playhorizon.dev/docs/performance"] [[item]] id = "upscaling" title = "Native upscaling" status = "next" area = "performance" plain = """Draw the game at a lower resolution and sharpen it to your screen's size, in the way of FSR or DLSS, to gain \ frames on weaker graphics cards. An optional graphics setting.""" dev = """A render-scale setting below the window size with an upscaler of our own that runs on every wgpu backend. \ Proof: frame time against native resolution on integrated GPUs, and screenshots for image quality. Issue \ #1403.""" links = ["#1403"] [[item]] id = "targeted-optimisations" title = "A batch of targeted optimisations" status = "next" area = "performance" plain = """Several smaller speed-ups, each measured: idle block entities that sleep, cheaper particles, faster \ structure placement, high-rate mice and very large texture packs.""" dev = """Block entities and hoppers that skip work when idle (the hopper item scan is already skipped when no item is \ near); a particle frustum test first (also a parity gap), then particle quads built on the GPU; jigsaw \ shortcuts that skip blocked connectors and pool elements known not to fit, with layouts unchanged (trial \ chambers and ancient cities first); batched raw mouse input on Windows for 8000 Hz mice; a better atlas \ packer for huge resource packs (a 64x pack builds a 704 MiB atlas for 452 MiB of textures); sign-heavy \ scenes (#1461). Profile first, keep what pays, show before and after numbers.""" links = ["#1461", "docs/profiling.md"] [[item]] id = "convert-to-rust" title = "A Convert to Rust button for what isn't rewritten yet" status = "next" area = "modpacks" plain = """When a mod, shader pack or modpack hasn't been rewritten for Horizon, one button converts what can be \ converted, so you don't have to wait for the rewrite.""" dev = """Generalise the mod browser's Port step (`horizon-port-pack`: the data, assets, worldgen and block and item \ definitions of Java mods, .mrpack and CurseForge zips) to every kind of content: code mods where the API \ allows it (see 'Mods with code') and shader packs, converting an Iris/OptiFine pack into Horizon's format. \ The browser says what works before the install. Java code itself does not run (docs/modpacks.md, \ docs/mod-browser.md).""" links = ["docs/modpacks.md", "docs/mod-browser.md"] [[item]] id = "code-mods" title = "Mods with code: machines, magic, mobs" status = "next" area = "modpacks" plain = """Making mods that add machines, magic and mobs work in Horizon, in steps, starting with machines. They are \ most of what a big modpack is made of.""" dev = """333 of the 496 mods in a big pack (ATM10) contain code. Issue #1854 ranks the API gaps (ticking block \ entities, networking, rendering, menus, inventories) that unlock them in tiers, with machines first as the \ recommended path and a furnace ported tick for tick as proof. The first API step is a draft (#1189, see \ 'Machines and blocks with inventories'). The path isn't started yet (docs/modpacks.md).""" links = ["#1854", "docs/modpacks.md"] [[item]] id = "datapack-browser" title = "Data packs in the mod browser" status = "next" area = "modpacks" plain = """Search and install data packs from the launcher's mod browser, for the world you choose, as you do mods and \ resource packs.""" dev = """A Datapacks tab beside Mods and Resource packs: install into a chosen world's datapacks folder, with the \ same checks and 'works in Horizon' notes as the other kinds (docs/mod-browser.md).""" links = ["docs/mod-browser.md"] [[item]] id = "prepare-without-java" title = "Prepare a version without Java" status = "next" area = "servers" plain = """Set up Horizon, a server first, without Java on your computer: published tables are combined with your own \ copy of the game.""" dev = """Today `horizon-prepare` runs Mojang's exporters with Java. Issue #1750 proposes publishing the computed \ version tables once from CI and assembling the rest locally from the player's own jar and assets, provided \ the tables hold no Mojang content; a contributor offered a pull request, and it would help phones too. A \ server-only prepare from `server.jar` alone is the first step (docs/server.md).""" links = ["#1750", "docs/server.md"] [[item]] id = "server-admin" title = "Server console, bans and a full admin API" status = "next" area = "servers" plain = """Manage a server from a console, ban and pardon players, and drive it from other tools through a full admin \ API and an MCP server for AI agents.""" dev = """`horizon-server console` (a text interface), `ban`, `pardon`, `ban-ip` and `mcp` over stdio. Admin API \ additions: the player list, kick, ban, op and whitelist, an SSE stream of logs and events, a text metrics \ endpoint, config GET and PATCH, backup delete and download. The panel's later features (bans, worlds, \ server.properties import, logs and crash reports, modpacks) and vanilla's management protocol (the JSON-RPC \ over WebSocket that the `management-server-*` keys configure), so vanilla's tools can manage a Horizon \ server. docs/server.md, docs/api/server.md.""" links = ["docs/server.md", "docs/api/server.md"] [[item]] id = "hosting-polish" title = "Hosting polish: Windows service, safe updates" status = "next" area = "servers" plain = """Smoother hosting: a real Windows service, a backup before every update, backups that keep the world and each \ player's state, and a changed view distance or message without a restart.""" dev = """A Windows service wrapper instead of the logon scheduled task; `backups.before_update`; hot reload of config \ for view distance and the message of the day (needs engine support); backups that keep world and player \ state (#1808, a contributor's draft, in review). docs/hosting.md, docs/server.md.""" links = ["#1808", "docs/hosting.md"] [[item]] id = "tailscale-hosting" title = "Guided hosting with Tailscale and an invite button" status = "next" area = "servers" plain = """In the launcher, a guide and a button to host a server and invite friends over Tailscale, so nobody has to \ open ports on a router.""" dev = """On the Servers page (create, start, back up, update and invite are shipped) add a Tailscale setup that \ explains and checks each step, and an invite button that hands friends what they need to join over the \ tailnet. Buttons first, no docs needed, with the details in an Advanced section. Remote access over \ Tailscale is already described in docs/server.md.""" links = ["docs/hosting.md", "docs/server.md"] [[item]] id = "docker-image" title = "An official Docker image for servers" status = "next" area = "servers" plain = """An official image to run a Horizon dedicated server in Docker with one command, your own copy of the game \ files mounted in.""" dev = """The repository has the Dockerfile (`packaging/server/Dockerfile`: a multi-stage build on Debian \ bookworm-slim, user `horizon`, volume `/data`, port 25565, game files mounted read-only, `HORIZON_EULA` and \ friends answering the first-start questions), and anyone can build it (docs/hosting.md, section 9). Left: \ publish the image to a public registry from the release workflow, tagged per release, so it follows the same \ checks, and update the docs and the launcher. The image never holds Mojang's files.""" links = ["docs/hosting.md", "docs/server.md"] [[item]] id = "one-single-player-path" title = "One single-player path: remove the in-frame world" status = "next" area = "gameplay" plain = """Single player will have one way to run, the server thread, so every fix works everywhere and there are fewer \ bugs. The older in-frame mode goes once everything passes without it.""" dev = """`--in-frame` (also `--no-server-thread` and `HORIZON_SERVER_THREAD=0`) still ticks the world inside the \ window's `Game`, and most harnesses test that path. Delete it once `lan_e2e --server-thread` and the parity \ harnesses pass on the server thread, which also halves the bug surface. See also 'Single player as a server' \ and docs/server-levels.md.""" links = ["docs/server-levels.md"] [[item]] id = "villages-combat-parity" title = "Villages and combat, exactly as in vanilla" status = "next" area = "gameplay" plain = """Villages and fights behaving as in vanilla: iron golems defending villages, villagers remembering their \ homes, mace smashes and knockback.""" dev = """Villages: iron golem village goals, villager memories across saves, villager age, job-site claiming on \ dedicated servers, flower offers (#1639 is one report). Combat: the mobs' `attack_knockback` attribute, mace \ smash logic, the hit knockback source on the host, the fire burnout biome tag. Each is checked against \ vanilla by a harness (docs/rust-parity.md).""" links = ["#1639", "docs/rust-parity.md"] [[item]] id = "audio-device" title = "Choose the audio output device" status = "next" area = "gameplay" plain = "Pick the speakers or headphones Horizon plays through, in Music & Sounds." dev = """An output device list in Music & Sounds, falling back to the system default. #1035 started it: a player on \ an older Windows computer had no sound at all, and a device choice is how such cases are found and fixed.""" links = ["#1035"] [[item]] id = "mod-world-items" title = "Mods that read and change the world" status = "next" area = "mods" plain = """Mods that can see and change blocks, read inventories and items, and find and affect entities, all through \ the server so every player sees the same thing.""" dev = """After server mods: read blocks, states and biomes in loaded chunks and change them through the server's \ block log, so clients and the parity harnesses see vanilla's updates; the player's inventory, held item, \ open container and item stacks with components; entity queries near a position, a safe subset of entity data \ and data-driven mod entity types. Snapshots and batched calls per tick, never per-block host calls in hot \ paths. docs/api/mods.md ('Not there yet').""" links = ["docs/api/mods.md", "docs/modpacks.md"] [[item]] id = "machines-api" title = "Machines and blocks with inventories (API 0.4)" status = "next" area = "mods" plain = """Mods that add machines: blocks that tick, hold items and have their own menus. This unlocks the technology \ mods of big modpacks.""" dev = """Block entities and menus: ticking machines with slots, server menu logic and the menu protocol to clients, \ energy, item and fluid transfer, data attachments, accessory slots and custom recipe types, with a typed \ client and server channel and typed config beside them. A draft (#1189) proves a furnace ported tick for \ tick and holds the ATM10 code-mods plan; the design is redone through the API policy before it merges \ (docs/modpacks.md, docs/api/stability.md).""" links = ["#1189", "docs/modpacks.md"] [[item]] id = "mod-languages" title = "Lua and other languages for mods" status = "next" area = "mods" plain = """Write mods as Lua scripts, in the style of KubeJS, with no compiler, and later in other languages that pass \ the tests. Every language runs in the same sandbox.""" dev = """Lua first: Horizon ships a Lua interpreter that is itself a WebAssembly mod, and a script mod's manifest \ names it and the capabilities it uses, so a script can do exactly what a compiled mod with the same manifest \ can, with hot reload of `main.lua`. Then C, C++, Zig, Go (TinyGo), AssemblyScript and JavaScript or \ TypeScript are measured against Rust on the same tick-heavy example, and each is supported only with a \ template, an example and a CI test. docs/api/mods.md ('Ways in').""" links = ["docs/api/mods.md"] [[item]] id = "shader-pack-examples" title = "Well-known shader looks, rewritten for Horizon" status = "next" area = "rendering" plain = """Popular shader packs rewritten in Horizon's format, so good packs exist from the start. Only packs whose \ licence is open source and compatible with ours are rewritten, never anything else.""" dev = """The first candidates are Photon, Chocapic13 and MakeUp Ultra Fast, each only after its licence is read and \ recorded: a pack is rewritten only if it is open source and compatible with Horizon's licence, and the \ rewrite is written from the shader format's documentation and the look on screen, not from anyone's code. \ Today only the Golden Hour example exists (`crates/horizon-shader-api/packs/golden_hour`).""" links = ["docs/shaders.md", "crates/horizon-shader-api/packs/golden_hour"] [[item]] id = "beta-label" title = "A visible beta label" status = "next" area = "launcher" plain = """A clear 'beta' label in the launcher and the game, so nobody is surprised that Horizon is still being built.""" dev = """Show Beta in the launcher's header and about page, on the game's title screen and on the website, beside the \ version number (docs/versioning.md).""" links = ["docs/versioning.md"] [[item]] id = "wayland-polish" title = "Wayland and Hyprland polish" status = "next" area = "platforms" plain = """Fixes for Linux desktops that use Wayland and Hyprland: fullscreen, the clipboard, the GUI scale after a \ restart and the like.""" dev = """Open: the GUI Scale is clamped to 2 after a restart under Hyprland, while XWayland keeps it (#1866). Earlier \ reports covered fullscreen dropping on menu clicks, the clipboard and a white overlay (#1007, closed). \ Checked on a real Wayland session.""" links = ["#1866"] [[item]] id = "agent-control-protocol" title = "A versioned agent-control protocol" status = "next" area = "ai" plain = """A stable, documented way for AI agents and scripts to drive the game and the launcher, with versions and an \ event stream so tools keep working as Horizon changes.""" dev = """`hello` answers with the API version, the release and the features; `horizon-ctl --api`; MCP serverInfo; \ reply schemas generated into the reference; a `test.` namespace for hooks; transcript compatibility tests; \ `subscribe` as a stream of events on one connection; Horizon option files by key and saved-server commands. \ Agent control itself (`horizon-ctl`, both MCP servers, the No AI switch) is done: docs/agent-control.md, \ docs/api/agent-control.md.""" links = ["docs/agent-control.md", "docs/api/agent-control.md", "docs/api/stability.md"] [[item]] id = "own-agents-porting" title = "Port mods with your own AI agent" status = "next" area = "ai" plain = """You can port a mod to Horizon with your own AI agent on your own computer. Horizon documents how and gives \ you the tools, but provides no hosted agents.""" dev = """A player runs their own agent locally with `horizon-ctl` and the MCP servers (docs/agent-control.md), `cargo \ horizon-mod`, `horizon-port-pack` and the parity harnesses as the check. Horizon writes the guide \ (playhorizon.dev/docs/agents, docs/modpacks.md) and runs no agents, accounts or keys for players. The No AI \ switch turns all of it off.""" links = ["https://playhorizon.dev/docs/agents", "docs/modpacks.md", "docs/agent-control.md"] [[item]] id = "x-account" title = "Horizon on X (coming soon)" status = "next" area = "community" plain = "Coming soon: an official Horizon account on X, used to announce releases and the weekly summary." dev = """Kira already posts the roadmap items marked `announce = true` when they ship, and the weekly summary, as \ soon as the account's credentials exist (roadmap/README.md, 'The journal'). Waiting for the account itself.""" links = ["roadmap/README.md"] [[item]] id = "agents-app" title = "Pipeline protection and a GitHub App for agents" status = "next" area = "project" plain = """Safer releases: changes to the release machinery need the owner's review, and AI agents use a smaller \ identity of their own instead of a personal account.""" dev = """`.github/CODEOWNERS` lists the workflows, the release and signing tools, the update-checking code and the \ installers (#1015); the branch protection that makes it count waits for the `horizon-agent` GitHub App, \ which reads and writes code, pull requests and issues but can't change settings, workflows, secrets or \ members, and whose tokens last an hour. It needs the owner to create the App and switch the protection on \ (docs/security.md).""" links = ["docs/security.md"] [[item]] id = "signed-installers" title = "Signed updates everywhere, installers included" status = "next" area = "project" plain = """Every download Horizon makes is checked against the project's signature, including the first install with \ install.sh and install.ps1.""" dev = """Releases carry signed checksums, and the launcher and `horizon-server update` refuse anything unsigned \ (#1011, #1014). Left: the first install through `install.sh` and `install.ps1` still trusts only the \ checksum GitHub publishes, because verifying Ed25519 signatures needs OpenSSL 3, which macOS doesn't ship \ (docs/security.md).""" links = ["docs/security.md"] # ---------------------------------------------------------------------------------------------------- Later [[item]] id = "ai-companion" title = "An optional AI teammate" status = "later" area = "ai" plain = """An optional AI teammate you can talk to by voice. It plays beside you, helps or finishes the game with you, \ runs on your computer first, and exists only if you turn it on. The No AI switch hides it.""" dev = """Draft pull requests: the companion (#1068), its safety modes and their evaluation (#1069) and a route that \ finishes the game (#1070). In the drafts: a companion that follows, fights, mines, crafts, sleeps and \ respawns; chat and push-to-talk voice, with speech recognition and a choice of voices; presets (very strong, \ helper, beat the game); a guard model with Clean, Kid and Salty modes; perception levels from Fair to \ All-knowing; hardware detection with a simple mode and an Advanced tab; local models first, cloud keys \ optional. The No AI switch is already in the game. Left: the speedrun route doesn't finish the game reliably \ yet, voices for more languages, and the safety evaluation, which must pass before it ships.""" links = ["#1068", "#1069", "#1070"] [[item]] id = "new-versions" title = "Every Minecraft version, prepared automatically" status = "later" area = "gameplay" plain = """Every past and future Minecraft version prepared for Horizon automatically. When Mojang releases one, \ Horizon follows it, and every system is checked against it again.""" dev = """The port pipeline (docs/version-ports.md, `tools/version_port.py`) detects a release, prepares it, diffs its \ classes against the pinned 26.3, regenerates the data-driven tables, runs every parity harness on it and \ writes a port report that becomes issues. The goal is as little human work as possible for any version, past \ or future. Detection and the first slices are merged; the scheduled agent that runs it every day isn't \ installed yet. Two versions in one build are out of scope.""" links = ["docs/version-ports.md"] [[item]] id = "exact-far-terrain" title = "Exact far terrain from real chunks" status = "later" area = "performance" plain = """Far terrain drawn from the world you really built and explored, caves and builds included, not only a \ preview from the seed.""" dev = """Keep a 3D mip store on disk built from real chunks, drawn by the GPU beside the seed preview for areas \ nobody has visited. Written from scratch and measured before it is kept. Builds on Far Detail and the \ far-terrain levels of detail already shipped; the open work on them is #718.""" links = ["#718"] [[item]] id = "older-jars" title = "Older Fabric and Forge mods" status = "later" area = "modpacks" plain = """Recognise mods built for versions before 26.1 in the mod browser, so they can be checked and carried over \ like newer ones.""" dev = """A mapping table from intermediary and SRG names so pre-26.1 jars can be classified, and a rename for mod ids \ with dashes (`fabric-api`); the port step then treats them like newer jars (docs/mod-browser.md).""" links = ["docs/mod-browser.md"] [[item]] id = "modpack-own-packs" title = "A modpack's own resource and shader packs" status = "later" area = "modpacks" plain = """Importing a modpack also brings the resource packs and shader packs it ships with, where Horizon can use \ them.""" dev = """Porting a pack carries data, assets and worldgen today; the resource packs and shader packs bundled with it \ are left out. Resource packs can be carried as they are; shader packs go through the converter \ (docs/modpacks.md).""" links = ["docs/modpacks.md"] [[item]] id = "whole-modpacks" title = "Whole modpacks, such as ATM10, rewritten" status = "later" area = "modpacks" plain = """Rewriting a complete big modpack for Horizon so it runs far better than the original. Not a priority now: \ the work above comes first.""" dev = """The project's first goal for modpacks: support them ten times better than vanilla and port any of them. It \ was set aside in favour of compatibility through the browser. What exists: ATM10's world generates and 42 of \ its 496 mods are carried at least in part (docs/modpacks.md). It depends on 'Mods with code' and the native \ mod API.""" links = ["docs/modpacks.md"] [[item]] id = "java-mod-bridge" title = "Running Java mods that aren't rewritten" status = "later" area = "modpacks" plain = """Run Java mods that nobody has rewritten for Horizon yet, through a bridge or a converter. Hard and not \ started: the Convert button and native rewrites come first.""" dev = """Earlier research (#527, closed) found that Java mods can't simply run, because they call Minecraft's own \ classes. Options to look at again: a jar-to-WebAssembly backend, or a bridge for simple Fabric mods. \ Whatever is chosen has to run inside the same sandbox and capability checks as native mods.""" links = ["#527"] [[item]] id = "alt-accounts" title = "Ely.by and other sign-in providers" status = "later" area = "servers" plain = """Sign in with other account providers, such as Ely.by or any Yggdrasil-compatible one, beside Microsoft.""" dev = """Issue #1270 asks for Ely.by and Yggdrasil-compatible servers with an account selector in the launcher. It \ builds on the Microsoft sign-in (docs/microsoft-account.md).""" links = ["#1270", "docs/microsoft-account.md"] [[item]] id = "friends-online-mode" title = "Online-mode checks for Play with Friends" status = "later" area = "servers" plain = """Friends who join through an invite code could prove who they are with their Microsoft account, as on \ online-mode servers.""" dev = """Play with Friends joins over an encrypted tunnel with an invite code (docs/play-with-friends.md, \ 'Identity'). Online-mode checks against Mojang's session servers can be added on top of the same tunnel; \ they need Microsoft sign-in first, which is coming soon. Play with Friends stays self-hosted between \ players, with no relay run by the project.""" links = ["docs/play-with-friends.md"] [[item]] id = "orbital-laser" title = "Orbital Laser on the normal game" status = "later" area = "mods" plain = """The community mod Orbital Laser, made for a fork of Horizon, running on the normal game and listed in the \ registry as the showcase of the mod API.""" dev = """A pull request on https://github.com/Stink-O/orbital-laser (MIT) once the input, ui, render and world \ capabilities exist (see 'Screens, input and drawing for mods'): today the mod needs them through its \ author's fork. Tested in the game, and listed in the registry.""" links = ["https://github.com/Stink-O/orbital-laser"] [[item]] id = "client-mod-natives" title = "Native versions of popular client mods" status = "later" area = "mods" plain = """Built-in versions of the client mods players ask for: block info on hover, a recipe viewer like JEI, a world \ map and schematic overlays.""" dev = """Done as extras: a mod list and menu, a minimap and a zoom (docs/extras.md). Left: block info tooltips, a \ recipe viewer (a contributor offered to port JEI if it becomes a native feature), a world map and a \ schematic overlay. They need the read-only interfaces `inventory-read`, `recipes`, `world-read` and `render` \ in the mod API, or they go into the game directly.""" links = ["docs/extras.md", "docs/mods.md"] [[item]] id = "create-physics" title = "Create-style physics as a native mod" status = "later" area = "mods" plain = """Contraptions and physics like the Create and Aeronautics mods, as a mod for Horizon rather than part of the \ base game.""" dev = """Issue #805 (porting QOL mods) closed with this answer: it would come as a native Horizon mod on the mod API. \ It needs server mods, entities and rendering first.""" links = ["#805"] [[item]] id = "proximity-voice" title = "Proximity voice chat as a native mod" status = "later" area = "mods" plain = """Hear nearby players talk, as with the voice chat mods of other Minecraft versions, as a Horizon mod.""" dev = """Needs server mods, mod networking and an audio interface in the mod API before anything can be built \ (docs/api/mods.md).""" links = ["docs/api/mods.md"] [[item]] id = "light-default-pack" title = "A light default shader pack" status = "later" area = "rendering" plain = """A small built-in look (tone mapping, colour grade, a cheap vignette) that costs almost nothing, for players \ who want a nicer picture without a heavy pack.""" dev = """An opt-in, composite-only pack on the native shader API, under about 0.3 ms at 1080p, shown on the Shader \ Packs page. Pack option sliders and profiles, and a Failed row with the full error, belong with it.""" links = ["docs/shaders.md"] [[item]] id = "ray-tracing" title = "Optional ray tracing" status = "later" area = "rendering" plain = """An optional ray-tracing mode for graphics cards that support it (RTX and recent AMD): shadows, water \ reflections and global lighting on top of the vanilla look.""" dev = """A spike with ray-traced sun shadows, off by default, is a draft (#1180). Reflections, global illumination, \ Apple M3 and newer if it is cheap, and a performance report per card come after.""" links = ["#1180"] [[item]] id = "hdr" title = "HDR monitors" status = "later" area = "rendering" plain = "Output for HDR monitors: brighter highlights and richer colour where your screen supports it." dev = """Issue #1441. Needs a surface format and a tone-mapping path per backend, and tests on real HDR screens on \ Windows, macOS and Linux.""" links = ["#1441"] [[item]] id = "msaa-fullscreen" title = "MSAA, anisotropic filtering, exclusive fullscreen" status = "later" area = "rendering" plain = """More graphics options: multisample anti-aliasing, anisotropic filtering and an exclusive fullscreen mode. \ Today Horizon has FXAA and borderless fullscreen.""" dev = """Not implemented (docs/graphics.md). Anisotropic filtering needs linear magnification in wgpu, which blurs \ close blocks, so close-up sharpness has to be kept first; MSAA would sit beside FXAA; exclusive fullscreen \ where the backend supports it.""" links = ["docs/graphics.md"] [[item]] id = "video-studio" title = "A complete video studio inside the game" status = "later" area = "extras" plain = """Record, replay and edit videos without leaving the game: record in a keypress, replay a session, cut and \ finish the video. One of Horizon's original goals.""" dev = """Three stages. Recording: capture gameplay in a keypress with an encoder thread and little frame-time cost. \ Replay: a replay mode for recorded sessions. Editing: cuts, camera paths, titles and export. None of it \ exists yet; the agent-control socket (docs/agent-control.md) already lets tools drive the game for scripted \ shots.""" links = ["docs/agent-control.md"] [[item]] id = "controllers" title = "Controllers: tested on real pads, and in the launcher" status = "later" area = "gameplay" plain = """Make controller support solid: tested with real PlayStation and Xbox pads and a Steam Deck, and usable in \ the launcher too.""" dev = """The game side is merged (docs/controllers.md): pads read with gilrs, menus, rumble, glyphs, remapping and \ DualSense adaptive triggers, lightbar and haptics, but not yet confirmed on real pads or a Steam Deck \ (DualSense haptics stay behind a switch until then). Left: a test pass on real hardware, and the same focus \ navigation in the GPUI launcher.""" links = ["docs/controllers.md"] [[item]] id = "debug-screen" title = "The full debug screen" status = "later" area = "gameplay" plain = """Vanilla's complete F3 screen: debug options, a profiler chart, ten-second captures and an atlas dump.""" dev = """Today F3 shows position, chunk, light, biome and FPS (docs/native-client.md). Vanilla also has F3+F6 debug \ options with profiles, F3+1 the profiler pie, F3+L a ten-second capture and F3+S the atlas dump (#562 asked \ for the F3 editor).""" links = ["#562", "docs/native-client.md"] [[item]] id = "lean-installs" title = "Lean installs that use less disk" status = "later" area = "launcher" plain = """Smaller installs: Horizon keeps one shared copy of the prepared game files and removes what only the \ preparation needed.""" dev = """A shared resource store keyed by the preparer's digest, no prepare intermediates left behind, the current \ and the previous version kept, and an automatic clean-up. Not started.""" [[item]] id = "linux-arm64" title = "Horizon on Linux ARM64" status = "later" area = "platforms" plain = "Game and launcher builds for 64-bit ARM Linux computers." dev = """Issue #1709: aarch64 builds of the game and the launcher in the release workflow, tested on a real ARM \ machine with its Vulkan driver. The server build already drops audio and controllers \ (`--no-default-features`).""" links = ["#1709"] [[item]] id = "opengl-fallback" title = "OpenGL for old computers" status = "shipped" shipped_in = "v0.2.63" area = "platforms" plain = """Horizon now starts on old PCs whose graphics card has no Vulkan or DirectX 12 driver: it switches to OpenGL \ by itself, and Options > Graphics can pick OpenGL by hand.""" dev = """wgpu's GL backend (WGL on Windows, EGL on Linux) as the last fallback after Vulkan and DirectX 12 (#1917), \ sprite arrays and CPU sprite animation for drivers without compute (#1920), no indirect draws below GL 4.3 \ (#1936). Minimum OpenGL 3.3 core. Shader packs don't run on it yet.""" links = ["#1917", "#1920", "#1936"] [[item]] id = "phones-and-browser" title = "Android, iOS and the browser" status = "later" area = "platforms" plain = """Versions of Horizon for Android, iOS and web browsers. Nothing official yet; contributors have started the \ first pieces.""" dev = """No official build. Android was first closed as not planned, with touch controls, a mobile interface, \ packaging and loading the player's own assets all missing; the roadmap now includes it, iOS and a \ WebAssembly build for the browser as long-term goals. First pieces from contributors: `horizon-dualsense` \ compiling on iOS (#1813) and helper-thread limits on Android (#1751). Preparing without Java (#1750) matters \ here too. Horizon ships none of Mojang's files on any platform.""" links = ["#1813", "#1751"] [[item]] id = "video-series" title = "A video series about Horizon" status = "later" area = "community" plain = """A series of videos about how Horizon is made and what is new, with each upload announced on Discord.""" dev = """Kira already shows new uploads in a read-only Discord channel (done). The series follows each stage of the \ project: a script, edits, titles and a thumbnail per video.""" # ---------------------------------------------------------------------------------------------------- Help wanted [[item]] id = "benchmark-your-pc" title = "Benchmark your computer" status = "help-wanted" area = "performance" plain = """Run Horizon's built-in benchmark and share the report: every new computer makes the performance work \ more accurate. No coding needed.""" dev = """`horizon-launcher play --arg=--benchmark --arg=standard` writes a JSON report; `horizon-launcher data \ benchmark ` shows what would be sent and uploads it (playhorizon.dev/docs/performance). Results from three \ installs with the same hardware appear on the Benchmarks page. Example: #1711.""" links = ["https://playhorizon.dev/docs/performance", "#1711"] [[item]] id = "end-city-banners" title = "End city banners keep their pattern" status = "help-wanted" area = "gameplay" plain = """Banners in End cities show as plain magenta instead of with their pattern.""" dev = """Compare the banner block entities the End city templates place with vanilla's (`EndCityPieces`, the \ templates' block entity NBT, `BannerBlockEntity`'s patterns), in `crates/horizon-world/src/worldgen/structure/`. \ Issue #1438; possibly related: #526.""" links = ["#1438", "#526"] [[item]] id = "end-city-loot" title = "Enchanted loot in End cities" status = "help-wanted" area = "gameplay" plain = """Armour and tools in End city chests should come enchanted, as in vanilla.""" dev = """`loot.rs` implements `enchant_with_levels`: find why the End city chest table's rolls come out bare, and \ compare them with vanilla's for a few seeds. Issues #1437, #1660.""" links = ["#1437", "#1660"] [[item]] id = "item-cooldowns" title = "Cooldowns drawn on items" status = "now" area = "gameplay" plain = """After you throw an ender pearl, its slot should show the cooldown sweeping away, as in vanilla.""" dev = """Vanilla draws `ItemCooldowns`' percent as a white overlay over the slot \ (`GuiGraphicsExtractor.itemDecorations` and `itemCooldown`) in the hotbar and in inventories. Issue #1763.""" links = ["#1763", "#1933"] [[item]] id = "chat-settings" title = "Chat settings and team prefixes" status = "now" area = "gameplay" plain = """The Hidden and Commands Only chat settings should hide chat, and team prefixes should appear before \ names in chat.""" dev = """Vanilla checks `ChatVisiblity` before it delivers chat and system messages (#1376), and chat uses the \ team-formatted display name (#1378). Both issues have exact steps to reproduce.""" links = ["#1376", "#1378", "#1932", "#1841"] [[item]] id = "pointer-hand" title = "A pointing hand over buttons" status = "now" area = "gameplay" plain = """The mouse pointer should turn into a pointing hand over menu buttons, as in vanilla 26.3.""" dev = """26.3's `AbstractWidget` asks for a cursor from `CursorTypes` when it is hovered; winit's \ `CursorIcon::Pointer` gives the same shape. Issue #1347.""" links = ["#1347", "#1897"] [[item]] id = "text-field-keys" title = "Ctrl+Backspace and scroll bars in menus" status = "now" area = "gameplay" plain = """Ctrl+Backspace should delete a whole word in the creative search, and every list's scroll bar should be \ draggable.""" dev = """`EditBox` deletes by word with Ctrl (#1764); the Game Rules and Statistics lists' scroll bars can't be \ dragged (#1782, after #978).""" links = ["#1764", "#1782", "#1884", "#1931"] [[item]] id = "chicken-flap" title = "Chickens flap while they fall" status = "now" area = "gameplay" plain = """Chickens should flap their wings while they fall, not stand still in the air.""" dev = """Vanilla's `Chicken.aiStep` updates `flap` and `flapSpeed` when the chicken isn't on the ground, and the \ model's wings follow them. Issue #1706.""" links = ["#1706", "#1892"] # ---------------------------------------------------------------------------------------------------- Shipped # Newest first: `tools/roadmap.py sync` adds each newly shipped item on top. [[item]] id = "server-resource-packs" title = "Server resource packs" status = "shipped" shipped_in = "v0.2.48" area = "servers" plain = """Servers can send you their resource pack: Horizon asks, downloads it and applies it, like vanilla.""" dev = """The dedicated server offers server.properties' pack (#1562); the client's pack manager, downloads, prompt \ and Server Resource Packs setting (#1569, #1570).""" links = ["#1562", "#1569", "#1570"] [[item]] id = "server-thread-default" title = "Single player on its own server thread" status = "shipped" shipped_in = "v0.2.39" area = "gameplay" plain = """Single player runs on a server thread, as vanilla does, so the world keeps ticking smoothly while the \ window draws.""" dev = """`game/integrated.rs` runs a second `Game` with one level per dimension; the window joins it through \ memory like a LAN guest (#1514).""" links = ["#1514", "docs/server-levels.md"] [[item]] id = "metal-occlusion" title = "GPU occlusion culling on Macs" status = "shipped" shipped_in = "v0.2.17" area = "performance" plain = """On Macs the GPU now skips terrain hidden behind hills and caves: 8 to 48% more frames per second at 32 \ chunks on an M4 Pro.""" dev = """GPU occlusion culling on Metal (#1434).""" links = ["#1434"] [[item]] id = "gpu-animated-textures" title = "Animated textures on the GPU" status = "shipped" shipped_in = "v0.2.5" area = "performance" plain = """Water, lava and other animated blocks are now animated by the graphics card: 1.7 to 2.4 times better 1% \ lows on Intel graphics.""" dev = """Frames uploaded once, no per-tick CPU blend or copy (#1239).""" links = ["#1239"] [[item]] id = "far-detail" title = "Far Detail for integrated graphics" status = "shipped" shipped_in = "v0.2.5" area = "performance" plain = """An optional Reduced setting for far terrain, suggested on integrated graphics, that saves 2 to 4 ms of GPU \ time per frame.""" dev = """Opt-in reduced far terrain (#1199), on far-terrain chunk summaries built on the workers (#1029).""" links = ["#1199", "#1029"] [[item]] id = "mod-browser" title = "The launcher's mod browser" status = "shipped" shipped_in = "launcher@0.2.0" area = "modpacks" plain = """Search Modrinth for mods, modpacks and resource packs from the launcher; it says before installing what \ works in Horizon.""" dev = """The Mods page (#1154), Java mods checked before install (#1242), project pages, filters and galleries \ (#1243), modpacks ported in the same step (#1246). docs/mod-browser.md.""" links = ["#1154", "#1242", "#1243", "#1246", "docs/mod-browser.md"] [[item]] id = "launcher-look" title = "A blocky, Minecraft-like launcher" status = "shipped" shipped_in = "launcher@0.2.0" area = "launcher" plain = """The launcher got a new blocky look in Horizon's purple, in dark and light.""" dev = """The Blocks look (#1269), from `horizon-theme` (docs/design-system.md).""" links = ["#1269", "docs/design-system.md"] [[item]] id = "dynamic-lights" title = "Dynamic lights" status = "shipped" shipped_in = "v2026.10.22" area = "extras" plain = """An optional extra: torches you hold, drop or set on fire light up what is around them.""" dev = """Held, dropped and burning light sources (#1162), in Horizon Extras, off by default.""" links = ["#1162"] [[item]] id = "servers-page" title = "Host a server from the launcher" status = "shipped" shipped_in = "launcher-v0.15.0" area = "servers" plain = """The launcher's Servers page creates, starts, backs up and updates a Horizon server with buttons, and \ invites friends.""" dev = """The launcher's Servers page (#1026) over `horizon-server` (docs/hosting.md).""" links = ["#1026", "docs/hosting.md"] [[item]] id = "cli-server-install" title = "A server you install with one command" status = "next" area = "servers" plain = """Install and run a Horizon dedicated server from a terminal with a single command, no launcher needed, for \ VPSes and headless machines.""" dev = """A player's idea (#horizon-ideas). `horizon-server` already runs headless; left: an install script \ (Linux/macOS shell, Windows PowerShell) that fetches the signed release, checks it, asks for or points at the \ player's own game files and starts the server, documented in docs/hosting.md.""" links = ["docs/hosting.md"] [[item]] id = "launcher-look-menus" title = "Game menus in the launcher's style" status = "later" area = "extras" plain = """An optional look for the game's own menus and options that matches the Horizon launcher. Off by default: \ the vanilla menus stay as they are.""" dev = """A player's idea (#horizon-ideas). A built-in resource pack or a Horizon setting that restyles the title, \ pause and options screens with the launcher's design tokens (crates/horizon-theme), following \ docs/design-system.md; off by default because it changes the vanilla look.""" links = ["docs/design-system.md"] [[item]] id = "linux-packages" title = "AppImage and a Nix flake" status = "later" area = "platforms" plain = """Install Horizon on any Linux distribution as an AppImage, and on NixOS through a Nix flake.""" dev = """A player's idea (#horizon-ideas). An AppImage of the launcher and game from the release workflow, and a \ flake.nix packaging the release binaries with their runtime libraries (Vulkan loader, X11/Wayland, ALSA), \ the way horizon-parity's NixOS setup runs them today.""" links = []