Bareiron is a minimalist Minecraft server targeting memory-constrained hardware like ESP32, prioritizing low RAM and performance over full vanilla compliance. It includes PC builds via Cosmopolitan polyglot binaries that run on Windows/Linux.
Configuration lives in globals; registries are extracted from notchian jars. Options toggle chests, fluids, broadcast frequency, and disk sync for embedded non-volatile storage, enabling hobby servers on microcontrollers or old PCs.
Use Cases:
Minimalist Minecraft server for memory-restrictive embedded systems.
The goal of this project is to enable hosting Minecraft servers on very weak devices, such as the ESP32. The project's priorities are, in order: memory usage, performance, and features. Because of this, compliance with vanilla Minecraft is not guaranteed, nor is it a goal of the project.
1.21.8772[!WARNING] Currently, only the vanilla client is officially supported. Issues have been reported when using Fabric or similar.
For PC x86_64 platforms, grab the latest build binary (https://github.com/p2r3/bareiron/releases/download/latest/bareiron.exe) and run it. The file is a Cosmopolitan polyglot (https://github.com/jart/cosmopolitan), which means it'll run on Windows, Linux, and possibly Mac, despite the file extension. Note that the server's default settings cannot be reconfigured without compiling from source.
For microcontrollers, see the section on compilation below.
Before compiling, you'll need to dump registry data from a vanilla Minecraft server. On Linux, this can be done automatically using the extract_registries.sh script. Otherwise, the manual process is as follows: create a folder called notchian here, and put a Minecraft server JAR in it. Then, follow this guide (https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Data_Generators) to dump all of the registries (use the second command with the --all flag). Finally, run build_registries.js with either bun (https://bun.sh/), node (https://nodejs.org/en/download), or deno (https://docs.deno.com/runtime/getting_started/installation/).
gcc and run ./build.sh.pacman -Sy mingw-w64-x86_64-gcc, navigate to this project's directory, and run ./build.sh.pacman -Sy mingw-w64-cross-gcc and ./build.sh --9x.gcc (run pacman -Sy gcc), navigate to this project's directory and run ./build.sh. gcc and run ./build.sh in this project's directory.Configuring the server requires compiling it from its source code as described in the section above.
Most user-friendly configuration options are available in include/globals.h, including WiFi credentials for embedded setups. Some other details, like the MOTD or starting time of day, can be found in src/globals.c. For everything else, you'll have to dig through the code.
Here's a summary of some of the more important yet less trivial options for those who plan to use this on a real microcontroller with real players:
BROADCAST_ALL_MOVEMENT and SCALE_MOVEMENT_UPDATES_TO_PLAYER_COUNT. This will tie movement to the tickrate. If this change makes movement too choppy, you can decrease TIME_BETWEEN_TICKS at the cost of more compute.ALLOW_CHESTS and DO_FLUID_FLOW, respectively.VISITED_HISTORY might help. There isn't that much of a memory footprint for this - increasing it to 64 for example would only take up 240 extra bytes per allocated player.This section applies to those who target ESP variants and wish to persist world data after a shutdown. This is not necessary on PC platforms, as world and player data is written to world.bin by default.
The simplest way to accomplish this is to set up LittleFS in PlatformIO and comment out the #ifndef surrounding SYNC_WORLD_TO_DISK in globals.h. Since flash writes are typically slow and blocking, you'll likely want to uncomment DISK_SYNC_BLOCKS_ON_INTERVAL. Depending on the flash size of your board, you may also have to decrease MAX_BLOCK_CHANGES, so that the world data fits in your LittleFS partition.
If using an SD card module or other virtual file system, you'll have to implement the filesystem setup routine on your own. The built-in serializer should still work though, as it uses POSIX filesystem calls.
Alternatively, if you can't set up a file system, you can dump and upload world data over TCP. This can be enabled by uncommenting DEV_ENABLE_BEEF_DUMPS in globals.h. Note: this system implements no security or authentication. With this option enabled, anyone with access to the server can upload arbitrary world data.
Proactive context-aware desktop assistant that captures your screen, stores data locally, and uses OpenAI/Doubao-compatible models to deliver summaries, insights, and todos.
AI video note assistant that transcribes Bilibili/YouTube/Douyin videos and generates structured Markdown notes with screenshots, jump links, and customizable styles.
Markdown-native project board for Git repos with CLI, web UI, MCP/AI integration, and offline-friendly Kanban/search built entirely on plain Markdown files.
Peer-to-peer, end-to-end encrypted file and folder transfer over QUIC with resumable downloads, no accounts, and cross-platform desktop builds.
Context-aware Windows overlay assistant that reads your screen and delivers translations, summaries, and answers via multi-LLM backends with a sleek keyboard-driven UI.
WebRTC P2P tool for files, text, and desktop sharing with end-to-end encryption, ACK reliability, Docker/single-binary deploys, and a responsive Next.js UI.