Status: Implemented as a mapping to the API that exists; rows marked planned name CLight features that aren’t in the game yet.
Celestial does not run, convert or translate Forge or NeoForge mods, and there is no conversion tool. This guide maps Forge and NeoForge concepts to CLight so you can rewrite your own mod. Read Porting existing mods to CLight: overview first.
Forge and NeoForge mods are often large, event-driven and content-heavy. CLight’s structure will feel familiar: a registration phase, event subscriptions with priorities, configs, and client and server code apart. Many content systems of big Forge mods (block entities, entities, capabilities, custom renderers) are still planned in CLight, so check the tables before you start.
BlockEntityType, EntityType, MenuType, ParticleType, MobEffect, data components
planned
SoundEvent
sounds.json in assets/ (code registration planned)
Creative tabs
creative_tab on the item (vanilla tabs). Custom tabs planned
Capabilities and data attachments
Forge / NeoForge
CLight
Capabilities, data attachments, saved data
typed attachments with defaults and copy_on_death like NeoForge’s AttachmentType (cl_attachment_register), entity / chunk data and saved data (Persistence and data attachments)
Forge mods assume one logical server thread and use enqueueWork to get onto it. In CLight, server callbacks run on the tick, and one mod’s callbacks never run on two threads at once, so you need no locks. To run something later on the tick, use cl_sched_run_server (C++ clight::after). Don’t keep long work in one callback: it has a time limit (Threading model).
Big mods: split them
Large Forge mods often bundle a library, content, worldgen and client features. On CLight, consider a content mod (C++ or Lua) plus a separate client_only mod for client features, linked with depends. Smaller mods with clear side and sync are easier to keep compatible.