Anatomy
Project file
Section titled “Project file”A luxe project is a folder with a project.luxe file inside it. This is the project file.
Inside your project.luxe file, you can set the project name, but it usually is set when created.
Project config
Section titled “Project config”There’s also a project config folder, luxe.project/, which is typically where project configuration goes.
This holds files like the modules used, asset manifest, version info and more.
There’s also typically a game.wren file, this is your entry point for the game code.
Outline
Section titled “Outline”Your project will often be created from a template, called a project outline. Your project probably contains an outline/ folder, this is the template part. The project template gives you an easy starting point ready to go.
Running a project
Section titled “Running a project”Running via the luxe editor or code editor
You can learn how to run the project via code and via the luxe editor from this page in the tutorial.
Running from a command line
You can also run your project from a terminal using luxe run from inside the project folder.
A shortcut is installed to the last installed version of luxe at <home>/.luxe/bin/luxe.
- macOS + Layoutinux:
~/.luxe/bin/luxe run - Windows:
c:\Users\<USER>\.luxe\bin\luxe run
project.luxe
Section titled “project.luxe”Your project.luxe file is a Wren script file with useful hooks.
As part of your class, you are handed a target object, which includes details like whether the project is being used in the editor, and what commands were used to run it.
target.target //list of targets e.g luxe deploy --target mac --target windowstarget.action //build, run, deploy etctarget.host //host os e.g IO.os()target.runtime //the runtime version e.g 2025.11.1So if for example you wanted to do specific tasks for the web build, you can use target to be specific.
You can see one example postdeploy in this tutorial.
Here’s a list of the current hooks.
prebuild() {}postbuild() {}postdeploy() {}prelaunch() {}postlaunch() {}Accessing the command line flags is also possible, so for example if we do luxe deploy --copy we can do extra steps to copy the build somewhere.
postdeploy() { import "luxe: io" for IO var flags: Flags = IO.flags() var do_copy = flags.has("copy") if(do_copy) { //... }}entry()
Section titled “entry()”If you make an empty function in your project.luxe class, and name it entry you can use luxe entry to run a headless script engine.
What this means is that no assets will run, no loop will be started, no window is created, making it extremely quick.
This is often used to sketch out Wren code that doesn’t rely on those features, like unit tests, project tools and more. We’ve used it for automation to convert content from older forms to newer forms, to process custom data, to write small libraries quickly and so much more. It’s also useful as a place to test Wren concepts quickly.
You can run this mode in vscode as well, setting it as the default build task, allowing very rapid iteration on Wren code.