Project recipe · Beta
Abotlogixfile.json
A small, declarative project recipe that lets VPServ prepare a supported project workflow from its root folder.
What it is
Abotlogixfile.json is a VPServ project recipe placed in the project root. It describes the optional preparation commands and services VPServ should use when someone taps Run Environment.
A developer can prepare a project and its recipe. Another user can add that project to VPServ and run the prepared workflow without manually entering every setup and startup command.
See all currently available tools and versions →
Complete example
{
"project_name": "My Full Stack Project",
"app_url": "http://127.0.0.1:8000",
"setup_commands": [
[
"python3.13",
"-m",
"pip",
"install",
"-r",
"requirements.txt"
],
[
"npm",
"install"
]
],
"services": [
{
"name": "backend",
"tool_id": "python3.13",
"command": [
"python3.13",
"app.py"
],
"delay_after_start_ms": 2000,
"init_scripts": []
},
{
"name": "frontend",
"tool_id": "npm",
"command": [
"npm",
"run",
"start"
],
"delay_after_start_ms": 0,
"init_scripts": []
}
],
"tunnel": {
"enabled": false,
"domain": "",
"token": ""
}
}Field reference
| Field | Required | Default | Purpose |
|---|---|---|---|
| project_name | No | Project or folder name | Readable project name |
| app_url | No | http://127.0.0.1:8000 | Local project URL |
| setup_commands | No | Empty list | Preparation commands |
| services | No | Empty list | Processes VPServ should run |
| tunnel | No | Disabled or absent | Optional public access |
{
"project_name": "My Project"
}{}An empty recipe does not prepare or start anything. VPServ will use its default project name and local URL.
project_name
project_name is the readable name VPServ displays for the project. It is optional. When it is omitted, VPServ uses the available project or folder name.
{
"project_name": "My Website"
}app_url
app_url is the local address of the project website, frontend, backend, API, or dashboard. It is optional, and its default is http://127.0.0.1:8000. The port should match the port used by the application service.
{
"app_url": "http://127.0.0.1:8000"
}{
"app_url": "http://127.0.0.1:3000"
}{
"app_url": "http://127.0.0.1:8080"
}setup_commands
setup_commands contains preparation commands that VPServ should finish before starting the configured services. Common uses include installing Python requirements, installing npm dependencies, building a frontend, generating project files, and other one-time project preparation commands.
The entire field is optional. A project that needs no preparation may omit it, or use an empty list.
{
"project_name": "No Setup Required",
"services": [
{
"name": "website",
"command": [
"php",
"-S",
"127.0.0.1:8000"
]
}
]
}{
"setup_commands": []
}Setup command format
Every setup command must be an array. The executable is the first item, and every argument must be a separate array item.
{
"setup_commands": [
[
"python3.13",
"-m",
"pip",
"install",
"-r",
"requirements.txt"
]
]
}{
"setup_commands": [
["npm", "install"],
["npm", "run", "build"]
]
}| Correct | Incorrect |
|---|---|
| [["npm", "install"]] | ["npm install"] |
| ["npm", "install"] | ["npm install"] |
{
"setup_commands": ["npm install"]
}{
"setup_commands": [["npm install"]]
}- 01
Setup commands run in the order they are listed.
- 02
VPServ waits for the current setup command to finish.
- 03
The next setup command starts only after the previous one finishes.
- 04
Project services start after the setup-command list finishes.
- 05
Empty command arrays are ignored.
- 06
VPServ handles supported required tools when needed.
{
"project_name": "Build Only Project",
"setup_commands": [
["npm", "install"],
["npm", "run", "build"]
]
}This project runs its preparation commands but does not start a long-running service because services is not present.
services
services contains the long-running processes VPServ should start for the project. These can include backend servers, frontend development servers, PHP development servers, databases, API servers, and other supported project processes.
The complete services field is optional. A project may omit it when it only needs setup commands or tunnel access to an already running service. It may also be empty.
{
"services": []
}Services are processed in the same order they appear in the JSON.
{
"services": [
{
"name": "database",
"tool_id": "mariadb",
"command": ["mariadbd"],
"delay_after_start_ms": 3000
},
{
"name": "backend",
"tool_id": "python3.13",
"command": ["python3.13", "app.py"]
}
]
}Service name
name is a readable label for the service. It does not need to match the executable or tool name. Give every service a meaningful name so users can understand what it does.
{
"name": "backend"
}- backend
- frontend
- api
- website
- database
- worker
Service command
command tells VPServ which executable to start and which arguments to pass to it. It must be one flat JSON array.
{
"command": ["npm", "run", "start"]
}{
"command": ["php", "-S", "127.0.0.1:8000"]
}| Correct | Incorrect |
|---|---|
| ["npm", "run", "start"] | "npm run start" |
| ["npm", "run", "start"] | [["npm", "run", "start"]] |
{
"command": "npm run start"
}{
"command": [["npm", "run", "start"]]
}- The first array item is the executable.
- Every remaining item is an argument.
- Do not combine the entire command into one string.
- A service should not use an empty command.
- Test the command before sharing the project.
tool_id
tool_id is simply the name of the VPServ tool required by the service. It is optional.
- It is not a generated identifier.
- It is not a database identifier.
- It is not a service identifier.
- It is not a version.
- It is not a display label.
Tool names include python3.13, php, npm, mariadb, cloudflared, bash, and clang.
{
"services": [
{
"name": "website",
"command": [
"php",
"-S",
"127.0.0.1:8000"
]
}
]
}In this example, VPServ uses php from the command.
{
"services": [
{
"name": "frontend",
"command": [
"npm",
"run",
"start"
]
}
]
}VPServ uses npm from the command. Add tool_id only when you want to specify the tool name explicitly.
{
"services": [
{
"name": "backend",
"tool_id": "python3.13",
"command": [
"python3.13",
"app.py"
]
}
]
}delay_after_start_ms
delay_after_start_ms adds a fixed pause after a service starts and before VPServ continues to the next service. The value is measured in milliseconds. It is optional and defaults to 0.
{
"delay_after_start_ms": 2000
}| Value | Time |
|---|---|
| 1000 | 1 second |
| 2000 | 2 seconds |
| 5000 | 5 seconds |
{
"services": [
{
"name": "database",
"tool_id": "mariadb",
"command": ["mariadbd"],
"delay_after_start_ms": 3000
}
]
}init_scripts
init_scripts contains supported initialization files that should run after the related service starts. It is optional. VPServ currently supports this field for MariaDB SQL initialization.
{
"init_scripts": ["schema.sql", "initial_data.sql"]
}The files are referenced relative to the project root.
{
"project_name": "MariaDB Project",
"services": [
{
"name": "database",
"tool_id": "mariadb",
"command": ["mariadbd"],
"delay_after_start_ms": 3000,
"init_scripts": ["schema.sql", "initial_data.sql"]
}
]
}When no initialization files are required, omit the field or use an empty list.
{
"init_scripts": []
}Supported placeholders
VPServ supports placeholders in project command arrays.
| Placeholder | Meaning |
|---|---|
| {usr} | VPServ user environment directory |
| {bin} | VPServ executable directory |
| {home} | Current project directory |
| . | When used as an exact argument, the current project directory |
{
"setup_commands": [
["{bin}/npm", "install", "."]
]
}{
"services": [
{
"name": "backend",
"tool_id": "python3.13",
"command": ["{usr}/bin/python3.13", "{home}/app.py"]
}
]
}tunnel
The tunnel section controls optional public access to the local project. The entire section is optional, so a local-only project can omit it.
{
"project_name": "Local Website",
"app_url": "http://127.0.0.1:8000",
"services": [
{
"name": "website",
"command": ["php", "-S", "127.0.0.1:8000"]
}
]
}{
"tunnel": {
"enabled": false,
"domain": "",
"token": ""
}
}Tunnel fields
| Field | Required | Purpose |
|---|---|---|
| enabled | No | Enables or disables public access |
| domain | Depends on mode | Custom public domain |
| token | Depends on mode | Cloudflare-generated tunnel token |
Default values are enabled = false, domain = "", and token = "".
Custom-domain tunnel
In the current Beta release, a custom-domain tunnel needs enabled set to true, a configured domain, and a valid Cloudflare-generated tunnel token.
{
"tunnel": {
"enabled": true,
"domain": "app.example.com",
"token": "YOUR_CLOUDFLARE_TUNNEL_TOKEN"
}
}- The token must belong to the configured Cloudflare tunnel.
- Without a valid token, the custom-domain tunnel cannot start.
- The local project may still run through app_url.
- Never put a real token in a public recipe or repository.
Upcoming: temporary public URL without a token
{
"tunnel": {
"enabled": true,
"domain": "",
"token": ""
}
}VPServ will provide a temporary URL similar to https://random-name.trycloudflare.com. It can expose backend endpoints, frontend applications, websites, development servers, dashboards, and supported WebSocket endpoints.
Complete project examples
{
"project_name": "Python API",
"app_url": "http://127.0.0.1:8000",
"setup_commands": [["python3.13", "-m", "pip", "install", "-r", "requirements.txt"]],
"services": [
{ "name": "api", "tool_id": "python3.13", "command": ["python3.13", "app.py"] }
]
}{
"project_name": "PHP Website",
"app_url": "http://127.0.0.1:8000",
"services": [
{ "name": "website", "command": ["php", "-S", "127.0.0.1:8000"] }
]
}{
"project_name": "Frontend Project",
"app_url": "http://127.0.0.1:3000",
"setup_commands": [["npm", "install"]],
"services": [
{ "name": "frontend", "command": ["npm", "run", "start"] }
]
}{
"project_name": "Existing PHP Project",
"app_url": "http://127.0.0.1:8000",
"services": [
{ "name": "website", "command": ["php", "-S", "127.0.0.1:8000"] }
]
}{
"project_name": "Local Dashboard",
"app_url": "http://127.0.0.1:8080",
"services": [
{ "name": "dashboard", "command": ["php", "-S", "127.0.0.1:8080"] }
]
}Execution order
- 01
VPServ reads Abotlogixfile.json.
- 02
VPServ prepares supported tools required by the recipe.
- 03
VPServ runs setup_commands in their listed order.
- 04
VPServ starts services in their listed order.
- 05
VPServ applies configured service delays.
- 06
VPServ runs supported initialization scripts.
- 07
VPServ starts the configured tunnel when enabled.
- 08
VPServ makes the configured local or public project URL available.
When a section is omitted, VPServ skips that part of the workflow.
Run a prepared project without using the terminal
- 01
Receive a prepared project from a trusted developer or project author.
- 02
Confirm that Abotlogixfile.json is in the project root with the exact filename and capitalization.
- 03
Add or open the project in VPServ.
- 04
Review the project configuration when it is available in the application.
- 05
Tap Run Environment.
- 06
VPServ makes the supported tools identified by the configured service commands available when needed.
- 07
VPServ runs optional setup_commands in their listed order.
- 08
VPServ processes the configured services in their listed order.
- 09
View the available output.
- 10
Open the configured project URL when VPServ presents one.
Preparing a project
- 01
Test the project manually inside VPServ.
- 02
Identify the executable each long-running service needs.
- 03
Put one-time preparation work in optional setup_commands.
- 04
Put long-running processes in services.
- 05
Store the executable and every argument as separate JSON array items.
- 06
Add delay_after_start_ms only where a fixed pause is genuinely needed.
- 07
Use init_scripts only for supported MariaDB SQL initialization files.
- 08
Configure a tunnel only when the project actually needs public access.
- 09
Remove tokens and other secrets before sharing a project.
- 10
Test again from a clean VPServ installation, then explain what the recipe installs and executes.
Trust and security
- Never put a real Cloudflare token, API key, password, private domain, or production credential in a public recipe.
- Use placeholders in examples and templates.
- Never commit secrets to GitHub or another shared repository.
- Rotate a tunnel token immediately if it is exposed.