ComputerCraft Wake Nodes is a Forge mod for Minecraft 1.20.1 that adds a small chunk-loading network for CC: Tweaked (ComputerCraft) computers, particularly useful for automation setups.
It introduces three ComputerCraft peripherals:
wake_node: attached to a ComputerCraft computer and registered under a string ID, effectively serving as the chunk loader.wake_node_advanced: an upgraded version of wake_node that lets the user choose the loaded area (1×1, 3×3, or 5×5 chunks).wake_controller: used by another computer to list, load, unload, and inspect registered nodes.The main use case is waking distant computer setups long enough for their chunk to load and tick, allowing their startup logic to run.
It also adds the Wake Chip, a crafting component used by the other blocks.
If Create is installed, custom Create recipes are provided for the Wake Chip, Wake Node, Advanced Wake Node, and Wake Controller.
Crafting component used by the other blocks.
Recipe:

Creative tab: Ingredients
A thin peripheral block that must be placed directly against a CC: Tweaked computer block.
What it does:
wake_node peripheral typeImportant placement rule:
Recipe:

Creative tab: Functional Blocks
An upgraded Wake Node that lets the user choose the loaded area around the attached computer:
It inherits all features of the basic Wake Node and adds setRange(), getRange(), and listAvailableRanges() methods.
Recipe (same shape as Wake Node, but with netherite instead of iron):

Creative tab: Functional Blocks
A peripheral block used by a controller computer to manage registered wake nodes.
What it does:
wake_controller peripheral typeRecipe:

Creative tab: Functional Blocks
setId("some_name") on the wake_node peripheral to register the node.grantController(computerId).loadNode("some_name") or loadFor("some_name", seconds).The loaded chunk is the computer's chunk, not the Wake Node block's chunk.
Each node has an owner computer and an access control list (ACL) of authorized controller computer IDs.
Controller methods only operate on nodes the calling computer is authorized to manage.
Node registrations are saved, but active forced chunks are not. After a server restart, nodes still exist in the registry, but none of them remain loaded until requested again.
wake_nodewake_node_advancedwake_controllerFind the peripheral with standard ComputerCraft calls such as:
local wake = peripheral.find("wake_node")
Check the API.md file on GitHub for a more compact version of the API documentation.
setId(id)Registers this Wake Node under the given string ID.
id must be a non-empty stringExample:
local wake = peripheral.find("wake_node")
assert(wake, "wake_node not found")
wake.setId("remote_factory")
grantController(computerId)Authorizes a controller computer ID to manage this node.
computerId must be a positive integerrevokeController(computerId)Removes a controller computer ID from this node's allowed list.
listControllers()Returns a sorted list of authorized controller computer IDs.
getPermissions()Returns ownership and controller ACL for this node:
{
owner = 17,
controllers = { 42, 73 }
}
getId()Returns the current node ID, or nil if none has been assigned.
Example:
print(wake.getId())
getChunk()Returns a table describing the attached computer's chunk:
{
dimension = "minecraft:overworld",
chunk_x = 12,
chunk_z = -4
}
getInfo()Returns a table with the node ID and chunk information:
{
id = "remote_factory",
dimension = "minecraft:overworld",
chunk_x = 12,
chunk_z = -4
}
If no ID has been assigned yet, id is returned as an empty string.
The Advanced Wake Node exposes the wake_node_advanced peripheral type. It inherits all methods from the basic Wake Node and adds the following:
local wake = peripheral.find("wake_node_advanced")
setRange(size)Sets the loaded area around the computer.
size must be 1, 3, or 5Example:
wake.setRange(5) -- load a 5×5 area (25 chunks)
getRange()Returns the current range size (1, 3, or 5).
print(wake.getRange()) -- 3
listAvailableRanges()Returns an array of allowed range values based on server configuration.
local ranges = wake.listAvailableRanges()
-- { 1, 3, 5 }
getInfo() (overridden)Returns the same table as the basic getInfo() plus two extra fields:
{
id = "remote_factory",
dimension = "minecraft:overworld",
chunk_x = 12,
chunk_z = -4,
range = 3,
loaded_chunks = 9
}
Find the peripheral with standard ComputerCraft calls such as:
local ctl = peripheral.find("wake_controller")
listNodes()Returns a list of registered node IDs accessible by the calling controller computer.
Example:
for _, id in ipairs(ctl.listNodes()) do
print(id)
end
getNodeInfo(id)Returns node information for an accessible node.
Raises an error if the node does not exist or if the calling controller is not authorized.
Returned table:
{
id = "remote_factory",
dimension = "minecraft:overworld",
chunk_x = 12,
chunk_z = -4,
loaded = false,
expires_at = 90
}
Notes:
loaded is a booleanexpires_at is only present for temporary loadsexpires_at is reported as remaining seconds, not an absolute timestamploadNode(id)Force-loads the node's chunk indefinitely, until one of these happens:
unloadNode(id) is calledunloadAll() is calledRaises an error if the node does not exist.
Also raises an error if the calling controller is not authorized for this node.
loadFor(id, seconds)Force-loads the node's chunk for a limited number of seconds.
seconds must be positiveseconds must not exceed the configured max_load_duration_secondsRaises an error if the node does not exist or the duration is invalid.
Also raises an error if the calling controller is not authorized for this node.
unloadNode(id)Unloads the given node if it is currently loaded.
unloadAll()Unloads every currently loaded node accessible by the calling controller.
isNodeLoaded(id)Returns true if the node is currently loaded, otherwise false.
Raises an error if the calling controller is not authorized for this node.
getLoadedNodes()Returns a list of currently loaded node IDs accessible by the calling controller.
Attach a Wake Node to a computer and register it:
local wake = peripheral.find("wake_node")
assert(wake, "wake_node not found")
wake.setId("remote_factory")
wake.grantController(42) -- controller computer ID
print(textutils.serialize(wake.getInfo()))
Load the remote chunk for two minutes:
local ctl = peripheral.find("wake_controller")
assert(ctl, "wake_controller not found")
print("Known nodes:")
for _, id in ipairs(ctl.listNodes()) do
print(" - " .. id)
end
ctl.loadFor("remote_factory", 120)
print(textutils.serialize(ctl.getNodeInfo("remote_factory")))
Server config keys:
chunk_loading.max_loaded_nodes: maximum number of nodes that may be loaded at the same time. Default: 16chunk_loading.max_load_duration_seconds: maximum duration accepted by loadFor. Default: 300chunk_loading.default_load_radius: chunk radius around the target computer. 0 means only the computer's own chunk. Default: 0chunk_loading.chunk_ops_per_tick: maximum number of queued load/unload operations processed each server tick. Lower values smooth spikes but wake nodes more slowly. Default: 3Common config keys:
logging.enable_node_logs: enables server log messages for register, load, unload, and expiration events. Default: trueThe repository includes example Lua scripts in sampleScripts/recallCreateTrains/ demonstrating how Wake Nodes can wake remote Create station computers and coordinate train recall flows over Rednet.
Code is licensed under the MIT License.
Some bundled assets (textures) are licensed under the ComputerCraft Public License v1.0.0 (CCPL).
See the LICENSE and [LICENSE-CCPL](https://github.com/cogilabs/CC-