Documentation menu

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

A complete Abotlogixfile.json
{
  "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

FieldRequiredDefaultPurpose
project_nameNoProject or folder nameReadable project name
app_urlNohttp://127.0.0.1:8000Local project URL
setup_commandsNoEmpty listPreparation commands
servicesNoEmpty listProcesses VPServ should run
tunnelNoDisabled or absentOptional public access
A minimal recipe
{
  "project_name": "My Project"
}
An empty recipe
{}

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.

A project 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.

A local project URL
{
  "app_url": "http://127.0.0.1:8000"
}
A project on port 3000
{
  "app_url": "http://127.0.0.1:3000"
}
A project on port 8080
{
  "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.

A project with no setup commands
{
  "project_name": "No Setup Required",
  "services": [
    {
      "name": "website",
      "command": [
        "php",
        "-S",
        "127.0.0.1:8000"
      ]
    }
  ]
}
An empty setup-command list
{
  "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.

Python requirements — correct
{
  "setup_commands": [
    [
      "python3.13",
      "-m",
      "pip",
      "install",
      "-r",
      "requirements.txt"
    ]
  ]
}
npm preparation — correct
{
  "setup_commands": [
    ["npm", "install"],
    ["npm", "run", "build"]
  ]
}
CorrectIncorrect
[["npm", "install"]]["npm install"]
["npm", "install"]["npm install"]
A setup command as one string — incorrect
{
  "setup_commands": ["npm install"]
}
A combined command item — incorrect
{
  "setup_commands": [["npm install"]]
}
  1. 01

    Setup commands run in the order they are listed.

  2. 02

    VPServ waits for the current setup command to finish.

  3. 03

    The next setup command starts only after the previous one finishes.

  4. 04

    Project services start after the setup-command list finishes.

  5. 05

    Empty command arrays are ignored.

  6. 06

    VPServ handles supported required tools when needed.

A setup-only project
{
  "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.

An empty services list
{
  "services": []
}

Services are processed in the same order they appear in the JSON.

Database before backend
{
  "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.

A service name
{
  "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.

npm command — correct
{
  "command": ["npm", "run", "start"]
}
PHP command — correct
{
  "command": ["php", "-S", "127.0.0.1:8000"]
}
CorrectIncorrect
["npm", "run", "start"]"npm run start"
["npm", "run", "start"][["npm", "run", "start"]]
A command string — incorrect
{
  "command": "npm run start"
}
A nested command array — incorrect
{
  "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.

PHP service without tool_id
{
  "services": [
    {
      "name": "website",
      "command": [
        "php",
        "-S",
        "127.0.0.1:8000"
      ]
    }
  ]
}

In this example, VPServ uses php from the command.

npm service without tool_id
{
  "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.

An explicit tool name
{
  "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.

A two-second delay
{
  "delay_after_start_ms": 2000
}
ValueTime
10001 second
20002 seconds
50005 seconds
A database service with a delay
{
  "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.

MariaDB initialization files
{
  "init_scripts": ["schema.sql", "initial_data.sql"]
}

The files are referenced relative to the project root.

A complete MariaDB project
{
  "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.

An empty initialization list
{
  "init_scripts": []
}

Supported placeholders

VPServ supports placeholders in project command arrays.

PlaceholderMeaning
{usr}VPServ user environment directory
{bin}VPServ executable directory
{home}Current project directory
.When used as an exact argument, the current project directory
A setup command with placeholders
{
  "setup_commands": [
    ["{bin}/npm", "install", "."]
  ]
}
A service command with placeholders
{
  "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.

A local-only project
{
  "project_name": "Local Website",
  "app_url": "http://127.0.0.1:8000",
  "services": [
    {
      "name": "website",
      "command": ["php", "-S", "127.0.0.1:8000"]
    }
  ]
}
An explicitly disabled tunnel
{
  "tunnel": {
    "enabled": false,
    "domain": "",
    "token": ""
  }
}

Tunnel fields

FieldRequiredPurpose
enabledNoEnables or disables public access
domainDepends on modeCustom public domain
tokenDepends on modeCloudflare-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.

A custom-domain tunnel
{
  "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

Planned temporary URL configuration
{
  "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

Python project
{
  "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"] }
  ]
}
PHP project
{
  "project_name": "PHP Website",
  "app_url": "http://127.0.0.1:8000",
  "services": [
    { "name": "website", "command": ["php", "-S", "127.0.0.1:8000"] }
  ]
}
npm project
{
  "project_name": "Frontend Project",
  "app_url": "http://127.0.0.1:3000",
  "setup_commands": [["npm", "install"]],
  "services": [
    { "name": "frontend", "command": ["npm", "run", "start"] }
  ]
}
Service-only project
{
  "project_name": "Existing PHP Project",
  "app_url": "http://127.0.0.1:8000",
  "services": [
    { "name": "website", "command": ["php", "-S", "127.0.0.1:8000"] }
  ]
}
Local project without a tunnel
{
  "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

  1. 01

    VPServ reads Abotlogixfile.json.

  2. 02

    VPServ prepares supported tools required by the recipe.

  3. 03

    VPServ runs setup_commands in their listed order.

  4. 04

    VPServ starts services in their listed order.

  5. 05

    VPServ applies configured service delays.

  6. 06

    VPServ runs supported initialization scripts.

  7. 07

    VPServ starts the configured tunnel when enabled.

  8. 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

  1. 01

    Receive a prepared project from a trusted developer or project author.

  2. 02

    Confirm that Abotlogixfile.json is in the project root with the exact filename and capitalization.

  3. 03

    Add or open the project in VPServ.

  4. 04

    Review the project configuration when it is available in the application.

  5. 05

    Tap Run Environment.

  6. 06

    VPServ makes the supported tools identified by the configured service commands available when needed.

  7. 07

    VPServ runs optional setup_commands in their listed order.

  8. 08

    VPServ processes the configured services in their listed order.

  9. 09

    View the available output.

  10. 10

    Open the configured project URL when VPServ presents one.

Preparing a project

  1. 01

    Test the project manually inside VPServ.

  2. 02

    Identify the executable each long-running service needs.

  3. 03

    Put one-time preparation work in optional setup_commands.

  4. 04

    Put long-running processes in services.

  5. 05

    Store the executable and every argument as separate JSON array items.

  6. 06

    Add delay_after_start_ms only where a fixed pause is genuinely needed.

  7. 07

    Use init_scripts only for supported MariaDB SQL initialization files.

  8. 08

    Configure a tunnel only when the project actually needs public access.

  9. 09

    Remove tokens and other secrets before sharing a project.

  10. 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.