NotEnoughMinecraft
Have you ever wanted to play Minecraft inside Minecraft itself without needing to install any mods on the client? NO??? Anyway, now it's possible!

Setup
To get started, you need to install fabric-api and polymer. The mod requires a server resource pack, which is easiest to set up using polymer's auto-hosting feature.
Get a computer with the command /give @s not-enough-minecraft:computer, place it in the world, and right-click to start playing.
Controls
The control system fully matches standard Minecraft settings:
- Movement, jumping, and sprinting use familiar keys
- Block breaking, placement, item dropping work as usual
- Mouse wheel or number keys switch hotbar slots
- Right-click activates item use, another click completes the action
- Sneak - exit game mode and close the computer
- Inventory key toggles FPS counter
Since this is a server-only mod, control capabilities are limited to the data the client sends to the server!
How It Works
When starting the game, a virtual player is created and added to the server. Each tick, an image is generated using a server-side raycasting renderer from tomalbrc. The resulting image is displayed to the client through a special screen item where each pixel is colored using custom model data colors.
Configuration
The configuration file is located at config/not-enough-minecraft.json.
{
// Render distance in blocks
"renderDistance": 64,
// Experimental entity rendering
"renderEntities": false,
// Number of entities to render when enabled
"renderEntitiesAmount": 20,
// Ignore light levels, rendering everything at maximum brightness
"fullbright": false,
// Field of view, works similarly to vanilla client settings, minimum 30, maximum 110 (Quake Pro)
"fov": 70,
// Biome blending
"biomeBlend": 1,
// Number of threads for rendering all instances. Affects server CPU load and directly impacts FPS
"renderThreadCount": 4,
// List of commands executed when creating a virtual player
// Can be used to give items or move to specific locations
"spawnCommands": [
"item replace entity @s hotbar.0 with minecraft:grass_block",
"item replace entity @s hotbar.1 with minecraft:dirt",
"item replace entity @s hotbar.2 with minecraft:stone",
"item replace entity @s hotbar.3 with minecraft:cobblestone",
"item replace entity @s hotbar.4 with minecraft:oak_planks",
"item replace entity @s hotbar.5 with minecraft:oak_log",
"item replace entity @s hotbar.6 with minecraft:glass",
"item replace entity @s hotbar.7 with minecraft:oak_door",
"item replace entity @s hotbar.8 with minecraft:oak_stairs"
],
// Allow virtual player to place blocks
"allowPlacing": true,
// Allow virtual player to break blocks
"allowBreaking": true,
// Allow virtual player to use items
"allowItemUsage": true,
// Allow virtual player to drop items
"allowDropping": false,
// Allow virtual player to pick up items from blocks
"allowPicking": true
}
Limitations
This is quite an unconventional experimental project.
Server-side rendering requires significant CPU resources and may cause issues on weaker systems.
There is no ability to compress or optimize screen data for network transmission, so each frame is sent as raw pixels. This increases network load when viewing computer screens. Expect a traffic increase of 300-400 KB/s per screen with standard Minecraft network compression.
Virtual players behave like regular players in almost all aspects: world interaction, commands, player list, player data, and other functions. Each player gets their own virtual companion with the same UUID but with the lowest bit increased by one.