Skip to main content

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 .ini file 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 TypeRequired FieldsForbidden 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 Servicetype, 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

FieldTypeRequiredDescriptionDetailed Description
idstring✅ YesApplication unique identifierGlobally 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.
iconstring✅ YesIcon pathRelative path within the repository. Must follow the /images/icons/<id>.svg format. The icon file must exist at this path.
publisherstring✅ YesPublisher nameThe developer or organization name displayed in the App Center. Example: "Kevin", "LinuxServer.io".
pathstringConditionally RequiredApplication access addressThe 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.
execbool✅ YesWhether there is an executable serviceWhether the application supports start/stop operations. true: App Center displays start/stop buttons; false: display only, no lifecycle control.
open_pathboolConditionally RequiredWhether to open in a new tabControls 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.
typestringConditionally RequiredApplication open typeSet 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.
resizeboolNoWhether the window is resizableOnly effective when open_path=false. Controls whether the application popup can be resized. Default false.
maxminboolNoWhether the window can be maximized/minimizedOnly effective when open_path=false. Controls whether the application popup supports maximize/minimize. Default false.
widthintNoDefault window widthOnly effective when open_path=false. The width of the application page when opened, default 1180.
heightintNoDefault window heightOnly effective when open_path=false. The height of the application page when opened, default 680.
helpstringNoHelp documentation URLLink to help documentation, wiki, or community tutorials. Leave empty if none.
versionstring✅ YesApplication version numberFollows semantic versioning. Each submission must be unique and incremented. Example: "1.0.0", "2.3.1".
recommendbool✅ YesWhether the application is recommendedrecommend — 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.
betabool✅ YesWhether it is a beta versiontrue = beta version, only shown to test users; false = stable version, shown to all users.
low_versionstring✅ YesMinimum supported TOS versionThe minimum TOS version on which the application can run normally. Must be TOS7.0 or higher. Format: "TOS7.0", "TOS7.1".
category[]string✅ YesApplication categoriesUp 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✅ YesDependency application listApplication 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[]stringNoRelated application listApplication IDs displayed in the "Related Applications" module on the application details page. No mandatory dependency, display association only. No relations: [].
platformstring✅ YesTarget architecture"x86_64" or "aarch64". Multi-architecture requires separate submissions.
officialstringNoOfficial websiteLink to the application's official website. Leave empty if none.
application_typestring✅ YesApplication package typeDeb single-package mode applications: "deb"; dual-package/archive mode applications: "deb-TarGz"; Docker applications: "docker".
system_idstringConditionally RequiredSystemd service nameRequired for Deb applications. Must match the systemd service filename. Leave empty for Docker applications.
packagestringConditionally RequiredDeb package nameRequired for Deb applications. Must match the Package field in DEBIAN/control. Leave empty for Docker applications.
compose_projectstringConditionally RequiredDocker Compose project nameRequired 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.
userstring✅ YesRuntime userThe 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_displaybool✅ YesWhether visible to all userstrue = 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_mobileboolNoWhether mobile access is supportedtrue = the application supports mobile access; false = the application does not support mobile access. Default false.
share_folders[]stringNoShared folders created on installationConfigures 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"

  1. IP Placeholder: The path field must use ${ip} (e.g., http://${ip}:8686). Hardcoding a fixed IP or domain is prohibited.
  2. JSON Syntax: Must be valid JSON. Comments (// or /* */), single quotes, or trailing commas are prohibited.
  3. ID Uniqueness: id must be globally unique. Duplicate IDs will be rejected.
  4. Version Incrementation: Each new submission's version number must be greater than the previous version. Duplicates or downgrades are prohibited.
  5. Category Limit: Each application may have at most 3 categories.
  6. TOS Version: low_version must be TOS 7.0 or higher.
  7. Field Consistency: version must be consistent across config.ini, DEBIAN/control, and app.lang. system_id must match the systemd service filename. package must match the Package field in DEBIAN/control.

path Field Value Quick Reference Table:

Application TypeOpening Methodpath ValueExample
Deb WebUI Internal Openiframe embedding/<app_id>/"/tmrtimer/"
Deb WebUI External OpenNew tab/<app_id>/"/weather/"
Docker ApplicationNew tabhttp://${ip}:<port>"http://${ip}:8080"
No UI ServiceNo frontendOmit or ""
Note:

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.