SunBlock is a solar-powered Minecraft server at the Milieux Institute, Concordia University, Montreal, Canada.
The goal of our project is to blend the actual material conditions of gameplay (the computer hardware, networking, and energy infrastructure) with the production of the gameworld itself. Rather than just playing a game with thematics or a message around energy transition, we are endeavoring to provide a direct, tangible, and playable experience of the energy infrastructures which make that experience possible. For more on the project checkout main project website
For information on how to build a sunblock, checkout this guide here.
SunBlock has quite a few moving parts, and for the sake of sanity, I find it useful to view the system in three layers.
These are:
- Physical Layer (PL)
- Logical Layer (LL)
- Game Layer (GL)
The three layers are related in this manner:
Every layer has a core that is called SunBlockCore (creative, I know).
For the game layer, this is the java Minecraft Forge Mod, SunBlockCore-GL .
For the logical layer, this is the python script SunBlockCore-LL that manages things like power profiles, data logging, etc.
For the physical layer, the server computer itself is the SunBlockCore-PL.
SunBlock runs Forge Minecraft 1.20.1
.
While you can run a plain Java instance of Minecraft and have it start on boot, we run Minecraft through a CubeCoders AMP instance. Everything that happens inside Minecraft happens on the game layer. This includes the SunBlockCore Mod and the Gaia's Riddle ModPack which includes all the mods for the survival multiplayer we ran from May 1st to July 15th 2025.
Everything inside the Server computer is part of the logical layer. This comprises of:
A python script (SunBlockCore-LL) interfaces directly with the solar controller over an RS45 using the EpeverModBus Python library. This scirpt collects data in real time every second, and writes it to a JSON file called solar_data.json
. It also stores all this data in an SQLite database, which is then later used for data analysis using a jupyter notebook.
That JSON file I mentioned is very important. Once SunBlockCore-LL writes data to it, it is then read by SunBlockCore-GL to display in-game, and by SunBlockExpress which is an express.js server that broadcasts this instantaneous data over a REST API and Socket.io endpoints. Find this API here. I do think I should merge this into SunBlockCore-LL just for simplicity and better DIY. But perhaps I will leave that for people to refine in the OSS community.
The SunBlock Status Page is a static react page that connects to SunBlockExpress over socket.io and displays live solar data, refreshed every second. This page could be hosted on the server itself but I decided against it because this page was supposed to show if the server is on or not and what the various health stats are. If it was hosted on the server itself, considering it is a solar-powered server, if the server was out of battery the status page just wouldn't load; that's unacceptably bad UX.
In any case, the website can be hosted on one of the cloud platforms and then you set the socket.io endpoint to connect to wherever you hosted SunBlockExpress.
The Cubecoders AMP instance caries the game layer. Setup is as described on their website.
The physical layer comprises of:
- The Solar Panel
- The Solar Controller
- The Battery
- The Server computer (i.e. SunBlockCore-PL)
The Solar controller is connected to the Solar Panel, the Battery, and SunBlockCore-PL. Readings from the solar controller are measured directly through an RS45 cable that connects the controller to the server computer.
- ECOWORTHY ECOM-100
- Details here
- EPEVER MPPT Solar Charge Controller
- 30A
- Manual here
For the solar controller, sometimes you need to tweak the controller parameters. We connect the controller via RS45 cable to a windows and used EPEVER provided software. Find this here
Throughout the project we have only used 12V LiFePO4 Sealed batteries. We first started with an 18Ah (216Wh) battery but because it got damaged we were not getting full charge capacities. We next went to a 20Ah (240Wh) battery which lasted us less than 24 hours. Next we went to a 50Ah (600Wh) battery which gave us much better performance but we still havent gotten the desired balance so next we will be going to 100Ah (1200Wh).
- Intel Core(TM) i7-1065G7 (4C\8T)
- 32GB RAM
- 1TB Crucial NVMe SSD
- Running Ubuntu 22.04 (Desktop) LTS Jammy Jellyfish
This is an ODroid H4 Plus system with Ubuntu 24.04 (Server).
- 48GB DDR5 RAM
- 1TB NVMe SSD
- Intel N97.
- Ubuntu 24.04 (Server)
- Bart Simon
- Darren Wershler
- Rosie MacDonald
- Quinn Saggio
- Shahrom Ali
- Stuart Thiel
- Andrew
- Angelica Calcagnile
- Ella Noyes
- Mario Gaudio
- Don Undeen