Skip to main content

Configuration Reference

Oidis Builder uses a layered configuration system. Configuration is defined in JSONP files — JSON extended with C-style comments and Builder preprocessing directives.


JSONP Format​

JSONP is Oidis Builder's configuration format. It extends JSON with:

  • C-style comments — both // line comments and /* block comments */ are allowed anywhere
  • Builder preprocessing expressions — <? @var name ?> substitutes variables at build time
  • Arithmetic in expressions — <? @var build.year ?> inserts the current year during build
{
// This is a valid comment
"name": "my-project",
"version": "2026.0.1",
"license": "Copyright 2025-<? @var build.year ?> Acme Corp.",

/* Block comment:
Can span multiple lines */
"target": {
"name": "MyApp"
}
}

JSONP files have the .jsonp extension. The builder also accepts plain .json files (comments not supported).


Configuration File Hierarchy​

The builder loads configuration in the following order (later layers override earlier ones):

1. Builder global config   (~/.oidis/config or builder's own commons.jsonp)
2. package.conf.jsonp (project root — committed to git)
3. imported configs (via "imports" directive)
4. solution config (active solution from "solutions" map)
5. private.conf.jsonp (project root — NOT committed to git)
warning

Never commit private.conf.jsonp to git. It contains machine-specific paths, credentials, and developer overrides. Add it to .gitignore under the "Project individual ignore patterns" section at the bottom.


package.conf.jsonp — Project Configuration​

Located at the project root. Defines the project identity, dependencies, build targets, and deployment settings. Validated against a JSON schema by the builder.

The file must be wrapped in the JSONP loader call:

Io.Oidis.Builder.DAO.Resources.Data({
$interface: "IProjectSolution",
// ... your configuration ...
});

Top-level Fields​

FieldTypeDescription
namestringProject identifier (used as package name)
versionstringProject version in calendar format (YYYY.M.patch)
descriptionstringHuman-readable description
homepagestringProject website URL
repositorystring or objectGit repository URL
authorobjectAuthor info: { name, email, organization }
licensestringLicense text or SPDX identifier
loaderClassstringFully qualified class name of the application Loader
guiLoaderClassstringFully qualified class name of the GUI Loader (optional)
schemastringPath to a custom JSON schema for validation
noServerbooleanDisable the built-in development server
noCompressbooleanDisable JS/CSS minification even in prod builds
lintErrorsAsWarningsbooleanTreat lint errors as warnings (don't fail the build)

dependencies​

Defines project dependencies — other repositories or packages to install under <project>/dependencies/.

Connection string form:

"dependencies": {
"io-oidis-commons": "git+https://gitlab.com/oidis/io-oidis-commons.git#develop",
"io-oidis-gui": "git+https://gitlab.com/oidis/io-oidis-gui.git#2026.0.1",
"my-local-dep": "dir+D:/workspace/my-local-dep"
}

Connection string format: [type]+[url/path]{#[branch/tag]}

TypeDescription
gitClone from a Git repository (supports http://, https://, ssh://, git://)
dirUse a locally cloned directory (path must be absolute)

Detailed dependency form:

"dependencies": {
"my-cpp-lib": {
"version": "1.2.0",
"location": {
"type": "git",
"path": "https://example.com/my-cpp-lib.git",
"branch": "main"
},
"install-script": {
"name": "build.js",
"path": "resource/scripts/",
"attributes": ["--release"],
"ignore-parent-attributes": false
},
"configure-script": {
"name": "configure.cmake",
"attributes": ["-DCMAKE_BUILD_TYPE=Release"]
},
"platforms": ["win", "linux"]
}
}

Platform-specific dependency paths (in private.conf.jsonp):

"dependencies": {
"my-native-lib": {
"location": {
"type": "dir",
"path": {
"win": "D:/libs/my-native-lib-win",
"linux": "/home/user/libs/my-native-lib-linux",
"mac": "/Users/user/libs/my-native-lib-mac"
}
}
}
}

Architecture-specific paths:

"path": {
"win": {
"x32": "D:/libs/my-lib-win32",
"x64": "D:/libs/my-lib-win64"
}
}

imports​

Include other JSONP config files. The builder merges them into the project config:

"imports": {
"commons": "bin/project/configs/commons.jsonp",
"licensesRegister":"bin/project/configs/licensesRegister.jsonp",
"deploy": "bin/project/configs/deploy.jsonp"
}

Import keys are arbitrary labels — they only serve to differentiate the entries. Import paths are relative to the project root.

tip

Use imports to split large configurations into logical files. Keep credentials in private.conf.jsonp and share tool settings via imported files in bin/project/configs/.

solutions​

Named build configurations. The active solution is selected via --solution=<name> or the solutionsLocation field.

"solutions": {
"default": "static",
"app": "bin/project/solutions/app.jsonp",
"static": "bin/project/solutions/static.jsonp",
"arm": "bin/project/solutions/arm.jsonp",
"winInstaller":"bin/project/solutions/winInstaller.jsonp"
}

When the value is another key within the solutions map, it is followed as an alias (e.g., "default": "static" means the default solution is static).

When a solution is selected, its JSONP file is loaded and merged into the project configuration after package.conf.jsonp.

target​

Target application configuration. Controls what the build produces.

"target": {
"name": "MyApp",
"copyright": "Copyright 2025-<? @var build.year ?> Acme Corp.",
"toolchain": "nodejs",
"toolchainSettings": {
"version": "module"
},
"platforms": ["win", "linux", "mac"],
"icon": "resource/graphics/icon.ico",
"width": 1280,
"height": 800,
"maximized": false,
"elevate": false,
"singletonApp": true,
"startPage": "index.html",
"appDataPath": "%APPDATA%/MyApp",
"resources": {
"myFiles": {
"input": "resource/data/**/*",
"output": "data/**/*",
"skipReplace": true
}
}
}

toolchain values:

ValueDescription
nodejsNode.js / JavaScript application
gccC/C++ with GCC
clangC/C++ with Clang/LLVM
msvcC/C++ with MSVC (Windows)
armCross-compile for ARM
aarch32Cross-compile for AArch32
aarch64Cross-compile for AArch64
javaJava/Maven project
pythonPython project

toolchainSettings (for C++ toolchains):

FieldDescription
versionModule system (module for ES modules)
cmakeToolchainPath to CMake toolchain file
cmakeOptionsAdditional CMake options array
cmakeGeneratorCMake generator name
initScriptInit script path
CC, CXX, LD, etc.Compiler/linker overrides
CFLAGS, CXXFLAGS, LDFLAGSCompiler flag overrides
SYSROOTCross-compilation sysroot path
typesTypeScript type declarations to include
serverlessDisable server (for embedded targets)
withDependenciesScanEnable dependency scanning

resources entries (each is a named resource set):

FieldTypeDescription
inputstringGlob pattern for source files
outputstringDestination path/pattern
filesarrayArray of { src, dest } explicit file mappings
embedbooleanEmbed into the binary
copybooleanCopy without processing
skipReplacebooleanSkip variable replacement during copy
resxbooleanTreat as Windows resource file
keepLinksbooleanPreserve symbolic links
platformsstring[]Restrict to specific platforms
protectstring | booleanObfuscation settings
postBuildCopybooleanCopy after build completes
toolchainstring | string[]Restrict to specific toolchains

deploy​

Deployment server configuration.

"deploy": {
"server": {
"prod": {
"location": "https://hub.oidis.io",
"user": "",
"pass": ""
},
"dev": {
"location": "https://hub.dev.oidis.io",
"user": "",
"pass": ""
},
"eap": {
"location": "https://hub.eap.oidis.io",
"user": "",
"pass": ""
}
},
"agentsHub": "https://services.oidis.io",
"chunkSize": 0,
"user": "",
"pass": ""
}
tip

Keep user and pass empty in package.conf.jsonp. Override them in private.conf.jsonp with your actual credentials — that file is never committed.

docs​

Documentation generation settings.

"docs": {
"systemName": "MyProject Docs",
"copyright": "Copyright 2026 Acme Corp.",
"htmlOutput": "build/target/docs"
}

modules​

Custom script modules that integrate with the builder task system. See Module System for full details.

"modules": {
"my-hook": {
"script": "resource/scripts/my-hook.js",
"args": [],
"interpreter": "node",
"overrideTask": false,
"events": {
"before": "compile",
"after": ["typescript", "sass-compress"]
}
}
}

runConfigs​

Named configurations for oidis run. Selected via --run-config=<name>.

"runConfigs": {
"default": {
"release": "dev",
"platform": "app-win-nodejs",
"port": 3000,
"args": []
},
"demo": {
"release": {
"name": "myRelease",
"platform": "app-linux-nodejs"
}
}
}

private.conf.jsonp — Machine-Specific Overrides​

Located at the project root alongside package.conf.jsonp. Never committed to git.

Contains machine-specific overrides: local dependency paths, credentials, and developer-specific settings. Every field from package.conf.jsonp can be overridden here.

Common use cases:

Io.Oidis.Builder.DAO.Resources.Data({
$interface: "IProjectSolution",

// Override dependency to a local clone
"dependencies": {
"io-oidis-commons": "dir+D:/workspace/io-oidis-commons"
},

// Credentials for deploy servers
"deploy": {
"server": {
"dev": {
"user": "myuser",
"pass": "mytoken"
}
}
},

// Where to find the default solution
"solutionsLocation": "D:/deployed-apps/myproject"
});
FieldDescription
solutionsLocationPath where the default solution is deployed (used by oidis run)
solutionsOverride solution paths with local paths
dependenciesOverride dependency sources with local clones

Builder Global Configuration (commons.jsonp)​

The builder ships a global commons.jsonp that provides default values shared across all Oidis projects. Projects typically inherit it via imports.

Key global settings (configured in builder's commons.jsonp, overridable in your private.conf.jsonp):

FieldTypeDescription
deployServerobjectDefault deploy server URLs for prod, dev, eap
deployCredentialsobjectCredentials for each deploy server profile
deployAgentsHubstringURL of the agents hub
servicePortnumberPort for Builder service mode (default: 3666)
hubobjectOidis Hub connection: { url, user, pass }
cloudobjectCloud sync: { url, syncBase }
dockerRegistryobjectDocker registry: { url, user, pass, email }
workspacesobjectNamed path aliases (e.g., { "MY_WORKSPACE": "D:/projects" })
symbolsobjectCustom variable substitutions for JSONP preprocessing
vcvarsPathstringPath to MSVC vcvarsall.bat (Windows, required for C++ builds)
noReportbooleanDisable telemetry reports
noSelfupdatebooleanDisable automatic builder self-update checks
noAutoinstallbooleanDisable automatic dependency install on startup
noExternalTypesbooleanDisable external TypeScript type downloads
dependenciesDownloadConfigobject{ maxRetry: 3, timeout: 5 } — retry and timeout for downloads
ntfyConfigobjectPush notification settings for the ntfy-notify task (see below)

ntfyConfig​

Configuration for the ntfy-notify task. ntfy is a simple open-source push notification service — self-hostable or available as a free public service at https://ntfy.sh.

Default values are provided in the builder's commons.jsonp. Override them per project in package.conf.jsonp, or per developer in private.conf.jsonp to use a personal topic.

// package.conf.jsonp — project-level overrides
"ntfyConfig": {
"server": "https://ntfy.sh",
"topic": "my-project-builds",
"title": "My Project Builder",
"priority": "default"
}
// private.conf.jsonp — personal override (never committed)
"ntfyConfig": {
"topic": "my-personal-phone-topic"
}
FieldTypeDescription
serverstringntfy server URL (default: https://ntfy.sh)
topicstringChannel/topic name subscribers listen to
titlestringNotification title shown on the device
prioritystringMessage priority: min, low, default, high, urgent
Self-hosted ntfy

For private use, deploy your own ntfy instance (Docker image available) and point server to it. This gives full control over retention, authentication, and access policies.

Workspace Aliases​

Define workspace aliases to avoid absolute paths in shared config:

// In private.conf.jsonp or builder config:
"workspaces": {
"MAIN": "D:/projects",
"SHARED": "D:/shared-libs"
}

Then reference them in dependency paths:

"dependencies": {
"io-oidis-commons": "dir+[WORKSPACE_MAIN]/io-oidis-commons"
}

Symbols​

Custom key-value substitutions available in JSONP preprocessing:

"symbols": {
"MY_ENV": "production",
"SERVER_URL": "https://myserver.io"
}

Reference in JSONP: <? @var symbols.MY_ENV ?>


Solution Files​

Solutions define the final build target characteristics (platforms, runtimes, packaging). They extend package.conf.jsonp and are stored in bin/project/solutions/.

Standard solutions provided by builder:

SolutionFileDescription
staticbin/project/solutions/static.jsonpStatic Node.js binary (pkg-packaged)
appbin/project/solutions/app.jsonpFull desktop application with Chromium
sharedbin/project/solutions/shared.jsonpShared library (not packaged)
armbin/project/solutions/arm.jsonpARM cross-compiled binary
winInstallerbin/project/solutions/winInstaller.jsonpWindows self-installer package

To select a solution at build time:

oidis build prod --solution=arm
oidis build prod --solution=app
oidis rebuild --solution=winInstaller

Variable Substitution in JSONP​

The builder performs variable substitution in JSONP string values using <? @var path.to.value ?> expressions. Available variables at build time:

VariableValue
build.yearCurrent 4-digit year
build.timeBuild timestamp (ISO format)
build.typeBuild type (dev, eap, prod)
build.releaseNameActive release name
build.platformTarget platform identifier
target.versionProject version from package.conf.jsonp
target.nameProject name
symbols.*Custom symbols from config

Extending the Config Schema​

Every top-level config field added to IProject or IAppConfiguration must also be registered in the JSON Schema so the validator can accept it. The builder validates all loaded configuration before task execution using the z-schema library (JSON Schema Draft 4).

How the schema is assembled​

EnvironmentArgs.loadSchema() builds the final schema in three steps:

  1. Loads <builder>/resource/configs/default.conf.schema.json — the shared base schema (plain JSON)
  2. Loads <project>/bin/project/configs/package.conf.schema.jsonp — project-specific additions (JSONP)
  3. Merges both with Resources.Extend(defaultSchema, projectSchema) — project fields override/extend the defaults at every level

The project schema file supports an extendsConfig chain: each package can extend a dependency's schema, building up an inherited hierarchy. The builder's own project schema extends io-oidis-connector, which extends io-oidis-localhost, and so on.

Where to register a new field​

A new top-level block (e.g. fooConfig) must appear in both files:

FileRole
resource/configs/default.conf.schema.jsonShared base — defines the type for all projects
bin/project/configs/package.conf.schema.jsonpProject additions — must also declare the field for the merge to include it

Registering only in the .json base is not enough: if the project schema's properties section is merged in via Resources.Extend, any key absent from the project schema's properties is silently dropped from the merged result, causing a validation error.

The definition + $ref pattern​

Use JSON Schema Draft 4 conventions. Complex config blocks belong in definitions and are referenced by name with $ref:

// bin/project/configs/package.conf.schema.jsonp

Io.Oidis.Builder.DAO.Resources.Data({
// ...
definitions: {
// Define the shape of the new block:
IFooConfig: {
type: "object",
properties: {
url: { type: "string" },
timeout: { type: "integer", minimum: 0 },
enabled: { type: "boolean" }
}
}
},
properties: {
// ...existing properties...

// Reference the definition:
fooConfig: {
$ref: "#/definitions/IFooConfig"
}
}
});

The same definition must also appear in resource/configs/default.conf.schema.json:

{
"definitions": {
"IFooConfig": {
"type": "object",
"properties": {
"url": { "type": "string" },
"timeout": { "type": "integer", "minimum": 0 },
"enabled": { "type": "boolean" }
}
}
},
"properties": {
"fooConfig": { "$ref": "#/definitions/IFooConfig" }
}
}
tip

nexusConfig / INexusConfig (lines 47–70 and 312–314 of package.conf.schema.jsonp) is the canonical reference example for this pattern in the builder.

Validator behaviour​

The builder uses z-schema with assumeAdditional: true, which means objects without an explicit additionalProperties field in the schema are treated as open (any extra keys are allowed). However, properties declared in a properties block are still type-checked against their schema. A field that is present in the data but absent from the merged schema's properties triggers an "Additional properties not allowed" error even with assumeAdditional: true, because the merge can produce a schema that explicitly enumerates only a subset of properties.


See also: JSONP System | CLI Reference | Build Process