Core Configuration File — config.ini
config.ini is the core metadata file, defining the application's identity, display information, runtime attributes, and dependency relationships. It is the key basis for platform validation and App Center display.
Important: The file extension is
.ini, but the content must be in strict JSON format. Do not add comments, use single quotes, trailing commas, or any syntax errors.
Format Note: The
.inifile extension is a company historical convention (maintaining filename consistency with the legacy configuration system), but the parser processes it as JSON format. Developers must write using JSON syntax, otherwise automatic validation will fail.
Standard Template
Below is the config.ini standard template, divided into three independent examples by application subtype. Developers should choose the corresponding template based on their application type. Choose one of the three; do not mix.
Must Read: Field Mutual Exclusion Relationships
| Application Type | Required Fields | Forbidden Fields |
|---|---|---|
| WebUI Internal Open (iframe) | type: "iframe" + path: "/<id>/" | open_path |
| WebUI External Open (New Tab) | open_path: true + path: "http://${ip}:<port>" | type |
| No UI Service | — | type, open_path, path |
Template 1: WebUI Internal Open (iframe Embedding)
{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "Developer Name",
"exec": true,
"type": "iframe",
"path": "/dev-myapp/",
"resize": true,
"maxmin": true,
"width": 1180,
"height": 680,
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}
Template 2: WebUI External Open (New Tab)
{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "Developer Name",
"exec": true,
"open_path": true,
"path": "http://${ip}:8686",
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}
Template 3: No UI Service
{
"id": "dev-myapp",
"icon": "/images/icons/dev-myapp.svg",
"publisher": "Developer Name",
"exec": true,
"help": "https://example.com/docs",
"version": "1.0.0",
"recommend": false,
"beta": false,
"low_version": "TOS7.0",
"category": ["Utilities"],
"depend": [],
"relation": [],
"platform": "x86_64",
"official": "https://example.com",
"application_type": "deb",
"system_id": "dev-myapp",
"package": "dev-myapp",
"user": "dev-myapp",
"all_user_display": true,
"allow_open_in_mobile": false
}
Field Reference
| Field | Type | Required | Description | Detailed Description |
|---|---|---|---|---|
id | string | ✅ Yes | Application unique identifier | Globally unique on the platform; must not duplicate any listed application. Character set: lowercase letters (a-z), digits (0-9), and hyphens (-). Must start with a letter. Maximum length: 50 characters. Recommended format: developer-account-identifier-app-business-name or reversed-domain-app-name. Examples: dev-admin-monitor, com-douyin-service. Prohibited pure generic system keywords: docker, bin, var, api, usr, root, admin, system, service, etc. Cannot be modified after creation. |
icon | string | ✅ Yes | Icon path | Relative path within the repository. Must follow the /images/icons/<id>.svg format. The icon file must exist at this path. |
publisher | string | ✅ Yes | Publisher name | The developer or organization name displayed in the App Center. Example: "Kevin", "LinuxServer.io". |
path | string | Conditionally Required | Application access address | The path field is mutually exclusive by scenario: iframe uses /<app_id>/; external open uses http://${ip}:<port>; no UI is left empty. Must use the ${ip} placeholder (e.g., http://${ip}:8686). The system automatically replaces ${ip} with the TOS LAN IP. Hardcoding a fixed IP or domain is prohibited. Non-80/443 ports: http://${ip}:<port>. WebUI Internal Open (iframe): /<app_id>/. No UI application: set to "" or omit this field. Required when exec=true. |
exec | bool | ✅ Yes | Whether there is an executable service | Whether the application supports start/stop operations. true: App Center displays start/stop buttons; false: display only, no lifecycle control. |
open_path | bool | Conditionally Required | Whether to open in a new tab | Controls how the application is opened: true = new browser tab; false or omitted = TOS desktop embedded iframe. External open applications must set this to true. Mutually exclusive with type; must not be set simultaneously. |
type | string | Conditionally Required | Application open type | Set to "iframe" for WebUI Internal Open (iframe embedding). ⚠️ Mutually exclusive with open_path; must not be set simultaneously. External open or no UI applications do not set this field. |
resize | bool | No | Whether the window is resizable | Only effective when open_path=false. Controls whether the application popup can be resized. Default false. |
maxmin | bool | No | Whether the window can be maximized/minimized | Only effective when open_path=false. Controls whether the application popup supports maximize/minimize. Default false. |
width | int | No | Default window width | Only effective when open_path=false. The width of the application page when opened, default 1180. |
height | int | No | Default window height | Only effective when open_path=false. The height of the application page when opened, default 680. |
help | string | No | Help documentation URL | Link to help documentation, wiki, or community tutorials. Leave empty if none. |
version | string | ✅ Yes | Application version number | Follows semantic versioning. Each submission must be unique and incremented. Example: "1.0.0", "2.3.1". |
recommend | bool | ✅ Yes | Whether the application is recommended | recommend — Recommendation flag, uniformly set by platform operations after review based on application quality. Developers must always set this to false when submitting. This field is managed by the platform; developers must not modify it to true on their own. |
beta | bool | ✅ Yes | Whether it is a beta version | true = beta version, only shown to test users; false = stable version, shown to all users. |
low_version | string | ✅ Yes | Minimum supported TOS version | The minimum TOS version on which the application can run normally. Must be TOS7.0 or higher. Format: "TOS7.0", "TOS7.1". |
category | []string | ✅ Yes | Application categories | Up to 3 categories, selected from the official category list (see Appendix A). The first category is the primary category — it determines the default display section of the application. Arrange from most specific to most general. Exceeding the category limit results in rejection. |
depend | []string | ✅ Yes | Dependency application list | Application IDs that must be installed before this application. Must be existing App Center application IDs. Dependencies are installed in list order. Example: ["DockerEngine"]. No dependencies: []. Circular dependencies will be rejected. |
relation | []string | No | Related application list | Application IDs displayed in the "Related Applications" module on the application details page. No mandatory dependency, display association only. No relations: []. |
platform | string | ✅ Yes | Target architecture | "x86_64" or "aarch64". Multi-architecture requires separate submissions. |
official | string | No | Official website | Link to the application's official website. Leave empty if none. |
application_type | string | ✅ Yes | Application package type | Deb single-package mode applications: "deb"; dual-package/archive mode applications: "deb-TarGz"; Docker applications: "docker". |
system_id | string | Conditionally Required | Systemd service name | Required for Deb applications. Must match the systemd service filename. Leave empty for Docker applications. |
package | string | Conditionally Required | Deb package name | Required for Deb applications. Must match the Package field in DEBIAN/control. Leave empty for Docker applications. |
compose_project | string | Conditionally Required | Docker Compose project name | Required for Docker applications. Specifies the name used when creating the docker-compose project; must conform to Docker Compose project naming conventions (only lowercase letters, digits, hyphens, and underscores). Leave empty for Deb applications. Example: "myapp-docker".Note: Although Docker Compose allows underscores, it is recommended that compose_project use the same character set as id to reduce confusion. id only supports lowercase letters, digits, and hyphens (no underscores). If both use the same string, do not use underscores in compose_project either. |
user | string | ✅ Yes | Runtime user | The system user under which the application runs. After specification, a dedicated user is automatically created (e.g., "jellyfin"). Deb applications must match the systemd service User field. Using the root user is strictly prohibited. |
all_user_display | bool | ✅ Yes | Whether visible to all users | true = visible to all TOS users; false = visible to administrators only. When false, the application only appears in the administrator's App Center view. Non-admin users cannot see or interact with the application. The application is still installed system-wide and runs for all users; this setting only controls visibility. |
allow_open_in_mobile | bool | No | Whether mobile access is supported | true = the application supports mobile access; false = the application does not support mobile access. Default false. |
share_folders | []string | No | Shared folders created on installation | Configures shared folders to be created for the application during installation, with folder permissions managed via ACL. Using this field requires the user field to be non-empty. Example: ["data", "config"]. |
Key Rules
JSON Format Validation:
Validate config.ini before submission:
# Using python3
python3 -c "import json; json.load(open('config.ini'))" && echo "JSON format valid"
# Using jq
jq empty config.ini
Common JSON Errors Leading to Rejection:
{
"id": "myapp", // ❌ Trailing comma after the last field of an object
"version": '1.0.0', // ❌ Single quotes (must use double quotes)
// ❌ JSON does not allow comments
"beta": false,
}
Correct:
{
"id": "myapp",
"version": "1.0.0",
"beta": false
}
❌ Full-width quotes: "version": "1.0.0" → ✅ Half-width quotes: "version": "1.0.0"
- IP Placeholder: The
pathfield must use${ip}(e.g.,http://${ip}:8686). Hardcoding a fixed IP or domain is prohibited. - JSON Syntax: Must be valid JSON. Comments (
//or/* */), single quotes, or trailing commas are prohibited. - ID Uniqueness:
idmust be globally unique. Duplicate IDs will be rejected. - Version Incrementation: Each new submission's version number must be greater than the previous version. Duplicates or downgrades are prohibited.
- Category Limit: Each application may have at most 3 categories.
- TOS Version:
low_versionmust be TOS 7.0 or higher. - Field Consistency:
versionmust be consistent across config.ini, DEBIAN/control, and app.lang.system_idmust match the systemd service filename.packagemust match thePackagefield in DEBIAN/control.
path Field Value Quick Reference Table:
| Application Type | Opening Method | path Value | Example |
|---|---|---|---|
| Deb WebUI Internal Open | iframe embedding | /<app_id>/ | "/tmrtimer/" |
| Deb WebUI External Open | New tab | /<app_id>/ | "/weather/" |
| Docker Application | New tab | http://${ip}:<port> | "http://${ip}:8080" |
| No UI Service | No frontend | Omit or "" | — |
The path format for iframe mode (internal open) and external open is the same (both /<app_id>/). The difference lies in the open_path field: internal open open_path=false (default), external open open_path=true. Docker applications use the http://${ip}:<port> format for path.
Reserved Fields: The following field names are reserved for future platform use. Do not use them in custom config.ini:
host_network,container_runtime,sandbox,auto_update,upstream_url,license,min_memory,min_cpu,min_disk. Using reserved fields may lead to future compatibility issues and rejection.