Talome
Reference

App Manifest

Complete reference for Talome app manifest format with annotated examples.

Every app in Talome's store is defined by a manifest that describes its metadata, Docker Compose configuration, environment variables, volumes, ports, and lifecycle hooks. This page documents every field and provides full working examples.

Full Annotated Example

{
  "id": "jellyfin",
  "name": "Jellyfin",
  "description": "Free and open-source media server for streaming your personal media collection.",
  "tagline": "Your media, your server",
  "version": "10.10.6",
  "icon": "https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/icon-transparent.svg",
  "category": "media",
  "author": "Jellyfin Contributors",
  "source": "https://github.com/jellyfin/jellyfin",
  "website": "https://jellyfin.org",
  "port": 8096,
  "architectures": ["amd64", "arm64"],
  "dependencies": ["qbittorrent"],
  "defaultUsername": null,
  "defaultPassword": null,
  "compose": {
    "services": {
      "app": {
        "image": "jellyfin/jellyfin:10.10.6",
        "ports": ["8096:8096"],
        "volumes": [
          "./config:/config",
          "./cache:/cache"
        ],
        "environment": {
          "PUID": "1000",
          "PGID": "1000",
          "TZ": "America/New_York"
        },
        "restart": "unless-stopped",
        "healthcheck": {
          "test": ["CMD", "curl", "-f", "http://localhost:8096/health"],
          "interval": "30s",
          "timeout": "10s",
          "retries": 3
        }
      }
    }
  },
  "env": [
    {
      "key": "PUID",
      "label": "User ID",
      "description": "Linux user ID for file ownership",
      "default": "1000",
      "required": false
    },
    {
      "key": "PGID",
      "label": "Group ID",
      "description": "Linux group ID for file ownership",
      "default": "1000",
      "required": false
    },
    {
      "key": "TZ",
      "label": "Timezone",
      "description": "Container timezone",
      "default": "America/New_York",
      "required": false
    }
  ],
  "ports": [
    {
      "host": 8096,
      "container": 8096,
      "protocol": "tcp",
      "description": "Web UI"
    }
  ],
  "volumes": [
    {
      "hostPath": "./config",
      "containerPath": "/config",
      "description": "Configuration and database",
      "mediaVolume": false
    },
    {
      "hostPath": "./cache",
      "containerPath": "/cache",
      "description": "Transcoding cache",
      "mediaVolume": false
    }
  ],
  "hooks": {
    "postInstall": "echo 'Jellyfin installed successfully'",
    "preUninstall": "echo 'Backing up configuration...'"
  }
}

Field Reference

Required Fields

FieldTypeDescription
idstringUnique identifier. Lowercase, hyphen-separated. Must be unique across all store sources. Example: jellyfin, home-assistant, pi-hole.
namestringHuman-readable display name shown in the app store and dashboard. Example: Jellyfin, Home Assistant.
descriptionstringOne or two sentences describing what the app does. Shown on the app detail page.
taglinestringShort phrase (under 60 characters) shown on store cards. Example: Your media, your server.
versionstringSemantic version of the app manifest. This should match the Docker image tag where possible.
iconstringEmoji or URL to an icon image. URLs should point to SVG or PNG files. Emojis are used as fallback.
categorystringOne of: media, productivity, developer, networking, storage, security, ai, other. Determines where the app appears in store filtering.
authorstringAuthor or maintainer name.
composeobjectDocker Compose configuration. Must contain a services key with at least one service. See Docker Compose section below.

Optional Fields

FieldTypeDescription
sourcestringURL to the app's source code repository.
websitestringURL to the app's homepage or documentation.
portnumberPrimary web UI port. Used for quick-access links on the dashboard.
architecturesstring[]Supported CPU architectures. Common values: amd64, arm64, armv7. If omitted, assumes all architectures.
dependenciesstring[]App IDs that should be installed first. Talome checks these before installation and warns if missing.
defaultUsernamestringDefault login username, shown post-install. Example: admin.
defaultPasswordstringDefault login password, shown post-install. Example: admin.
envobject[]Structured environment variable definitions with labels and descriptions. See Environment Variables section.
portsobject[]Structured port mapping definitions. See Ports section.
volumesobject[]Structured volume definitions with descriptions and media volume flags. See Volumes section.
hooksobjectLifecycle hooks. See Hooks section.
installNotesstringMarkdown-formatted text shown to the user after installation.
releaseNotesstringMarkdown-formatted release notes for the current version.
screenshotsstring[]URLs to screenshot images for the app detail page.

Docker Compose Configuration

The compose field contains a standard Docker Compose configuration. Talome writes this to a docker-compose.yml file in the app's installation directory and uses Docker Compose to manage the app's lifecycle.

Service Conventions

  • Image tags: always use a specific version tag (jellyfin/jellyfin:10.10.6), never latest. Pinned tags enable reliable updates and rollbacks.
  • Volume paths: always use relative paths (./data, ./config). Talome resolves these relative to the app's install directory (~/.talome/apps/<appId>/). Never use absolute host paths.
  • Restart policy: always include restart: unless-stopped. This ensures containers recover from crashes and host reboots.
  • Environment defaults: include PUID=1000, PGID=1000, and TZ=America/New_York for Linux-based images that support them.
  • Healthchecks: include when the image supports health checking. Talome uses these for dashboard status indicators.
  • Resource limits: optional but recommended for resource-intensive apps.

Multi-Service Apps

Apps can define multiple services. Each service becomes a separate container managed as a group.

{
  "compose": {
    "services": {
      "app": {
        "image": "paperlessngx/paperless-ngx:2.14",
        "ports": ["8000:8000"],
        "volumes": ["./data:/usr/src/paperless/data", "./media:/usr/src/paperless/media"],
        "environment": {
          "PAPERLESS_REDIS": "redis://redis:6379",
          "PAPERLESS_DBHOST": "postgres"
        },
        "depends_on": ["redis", "postgres"],
        "restart": "unless-stopped"
      },
      "redis": {
        "image": "redis:7.4-alpine",
        "restart": "unless-stopped"
      },
      "postgres": {
        "image": "postgres:16-alpine",
        "volumes": ["./postgres:/var/lib/postgresql/data"],
        "environment": {
          "POSTGRES_DB": "paperless",
          "POSTGRES_USER": "paperless",
          "POSTGRES_PASSWORD": "paperless"
        },
        "restart": "unless-stopped"
      }
    }
  }
}

Environment Variables

The env array provides structured metadata for environment variables. This powers the app configuration UI, allowing users to customize variables before installation.

{
  "env": [
    {
      "key": "PAPERLESS_SECRET_KEY",
      "label": "Secret Key",
      "description": "Random secret key for session signing",
      "default": "",
      "required": true,
      "secret": true
    },
    {
      "key": "PAPERLESS_OCR_LANGUAGE",
      "label": "OCR Language",
      "description": "Three-letter ISO 639-2 language code for OCR",
      "default": "eng",
      "required": false
    }
  ]
}
FieldTypeRequiredDescription
keystringYesEnvironment variable name
labelstringYesHuman-readable label for the UI
descriptionstringNoTooltip or helper text
defaultstringNoDefault value pre-filled in the UI
requiredbooleanNoWhether the variable must have a value
secretbooleanNoIf true, the value is masked in the UI and not logged

Ports

The ports array provides structured metadata for port mappings.

{
  "ports": [
    {
      "host": 8096,
      "container": 8096,
      "protocol": "tcp",
      "description": "Web UI"
    },
    {
      "host": 1900,
      "container": 1900,
      "protocol": "udp",
      "description": "DLNA discovery"
    }
  ]
}
FieldTypeRequiredDescription
hostnumberYesPort on the host machine
containernumberYesPort inside the container
protocolstringNotcp (default) or udp
descriptionstringNoWhat the port is used for

Volumes

The volumes array provides structured metadata for volume mounts. The mediaVolume flag is important for media apps -- it tells Talome which volumes should be mapped to the user's media directories.

{
  "volumes": [
    {
      "hostPath": "./config",
      "containerPath": "/config",
      "description": "Application configuration and database",
      "mediaVolume": false
    },
    {
      "hostPath": "",
      "containerPath": "/media",
      "description": "Media files",
      "mediaVolume": true
    }
  ]
}
FieldTypeRequiredDescription
hostPathstringYesPath on the host (relative to app directory). Empty string for media volumes that the user configures.
containerPathstringYesMount point inside the container
descriptionstringNoWhat the volume stores
mediaVolumebooleanNoIf true, Talome prompts the user to map their media directory during install

Hooks

Lifecycle hooks run at specific points in the app's lifecycle. They execute as shell commands on the host.

{
  "hooks": {
    "postInstall": "echo 'Setup complete'",
    "preUninstall": "docker exec $CONTAINER_NAME backup-script.sh"
  }
}
HookWhen It Runs
postInstallAfter all containers are created and started successfully
preUninstallBefore containers are stopped and removed

Categories

CategoryDescriptionExamples
mediaMedia servers, downloaders, managersJellyfin, Plex, Sonarr, Radarr
productivityDocument management, notes, collaborationPaperless-ngx, Nextcloud, Bookstack
developerDevelopment tools, CI/CD, code hostingGitea, Drone CI, code-server
networkingDNS, VPN, proxy, network managementPi-hole, WireGuard, Nginx Proxy Manager
storageFile sync, backup, object storageSyncthing, MinIO, Duplicati
securityPassword managers, authentication, monitoringVaultwarden, Authelia, CrowdSec
aiAI/ML tools, LLM serversOllama, Open WebUI, ComfyUI
otherEverything elseHome Assistant, Uptime Kuma

Store Sources

App manifests come from multiple sources. Each source has its own format that Talome normalizes into the manifest schema above.

SourceFormatDescription
Talome NativeJSON manifestFirst-party apps curated by the Talome team
CasaOSdocker-compose.yml + metadataCompatible CasaOS app stores (official and community)
UmbrelYAML manifestCompatible Umbrel app stores (official and community)
User CreatedJSON manifestApps created through the AI app creation system
CommunityJSON manifestApps submitted by users and reviewed by the community

Validation

All manifests are validated with Zod schemas at multiple points:

  1. Store sync: when a store source is synced, each manifest is validated and invalid entries are skipped with a warning
  2. Installation: the full manifest is re-validated before Docker Compose runs
  3. User creation: the app creation system validates the generated manifest before saving
  4. Community submission: manifests undergo automated checks before entering the review queue

Required fields that fail validation will prevent the app from appearing in the store.

On this page