lunax.json
8 min
lunax.json sits in your repository and describes how to build and run your project. lunax init writes a first version by detecting your stack; you commit it and edit it as the project grows.
Common fields
{
"platform": "django",
"port": 8000,
"build": { "command": "python manage.py collectstatic --noinput" },
"start": "gunicorn app.wsgi",
"region": "ir-thr-1"
}platform — declare it. Detection is good but it cannot know that your Django project needs collectstatic and a gunicorn entrypoint. An explicit platform is the difference between a project that builds and one that starts and immediately exits.
port — the port your app actually listens on. If you hardcode 8000 and do not say so, we route to the wrong one and your site looks dead while the logs look fine.
region and requiresEgress — where the code may run, and whether it needs unrestricted outbound internet. See the regions article; this is the field that decides whether a Telegram bot works.
Environments
An env block overrides only what it names; everything else inherits from the top level. Usually a staging environment is one or two lines, not a duplicated file.
There is no secrets field
Deliberately. Other platforms let you put environment values in this file, and that file gets committed. Use lunax env set — values are encrypted server-side, injected at runtime, and never written to disk in your repository.