DevelopmentUnreleased

This topic is not available in this guide. You're viewing its overview.

Development documentation may include features that are not in the latest release. Read the Lawn 0.8.1 guide.

Templates

Directory Structure

The anatomy of a Lawn template.
The built-in catalog is community-driven. Want to contribute an app? Open a PR on GitHub. You can also add custom catalogs from public Git repositories or local folders in Lawn Settings.

Template layout

Every template is a directory. The directory name is the app's unique identifier (e.g., paperless-ngx, jellyfin).

my-app/
├── manifest.yaml
├── icon.svg
├── locales/
│   └── en.json
├── lawn-compose/
│   └── compose.yaml
└── init-files/
    └── nginx.conf
FilePurpose
manifest.yamlApp metadata (name, category, icon, web port)
icon.svgOptional local app icon shown in the catalog
locales/en.jsonLocalized Compose configuration and extension strings
lawn-compose/compose.yamlCurrent container configuration
init-files/Files copied into the container before start (optional)

manifest.yaml — App metadata

The manifest controls how the app appears in the catalog — its name, description, category, and web UI link.

manifest.yaml
id: my-app
name: My App
version: "1.2.0"
tagline: A short one-liner about what this app does.
description: |
  A longer **markdown** description shown on the app detail page.
symbolFallback: server.rack # SF Symbol fallback when no icon image is available
category: Utilities
webPort: 8080

All fields:

FieldTypeRequiredDescription
idstringYesUnique identifier (must match the directory name)
namestringYesDisplay name
versionstringNoApp version shown in Lawn. Keep the value quoted.
updateThroughstringNoSee Required intermediate versions.
taglinestringNoShort one-line description
descriptionstringYesFull markdown description
symbolFallbackstringYesSF Symbol name used when no icon image is available
iconURLstringNoHosted icon URL, preferred over a local icon file
iconIsTemplateboolNoRender the icon as a monochrome template image using the foreground color. Defaults to false
categorystringNoOne of: Documents, Media, Development, Networking, Utilities, Databases, Monitoring
tagsstringNoSearch tags
featuresstringNoFeature bullet points
screenshotsstringNoScreenshot identifiers
linksLinkNoExternal links (github, docs, website)
webPortintNoThe container port for the web UI
webSchemestringNoURL scheme: http (default) or https
webPathstringNoPath appended to the web URL (e.g., /admin/)
compatibility.minLawnVersionstringNoMinimum Lawn version required to use this template (e.g., 0.2.0)

Required intermediate versions

If an app must pass through earlier versions during an update, list those versions in updateThrough, oldest first:

updateThrough:
  - "1.0.0"
  - "2.0.0"

If several templates share a version, Lawn uses the newest. Use a Git commit ID instead to select a specific template.


icon.svg — App icon

A local icon file is optional when you use iconURL or the required symbolFallback. When iconURL is set, Lawn prefers the hosted artwork over the local file.

To bundle an icon shown in the catalog and instance detail views, name the file icon with one of the supported extensions:

FormatExtensionNotes
SVG.svgPreferred. Scales to any size
PNG.pngUse at least 256×256 pixels
HEIF.heifmacOS native format
PDF.pdfVector format
If no icon image is available, Lawn uses the SF Symbol named by symbolFallback.

lawn-compose/ — Container configuration

Define your containers in lawn-compose/compose.yaml.

Publish changes by committing the app directory. Keep the repository history so older versions remain available.

Existing numbered compose filenames still work. To switch, rename the current file to compose.yaml and add its version to manifest.yaml.

See Format for compose file structure and Extensions for x-lawn features.


init-files/ — Startup files (optional)

Files in this directory are copied into the container's volume mounts before each start. This is useful for configuration files that need to exist on disk when the app boots — for example, a custom nginx config or a default settings file.

Each file is referenced by name in the compose file's x-lawn.initFiles array, which maps it to a path inside the container. Files are overwritten on every start, so the template always provides the latest version.


locales/ — User-facing strings

Compose configuration display names and descriptions, option labels, notice titles, and element content live in a JSON localization file. App names, taglines, and descriptions remain metadata in manifest.yaml.

Every template must include a locales/en.json file. See Localization for the full JSON structure and field reference.