Skip to content

sigil.yaml Manifest Reference

Source: schemas/sigil-schema.json (JSON Schema, draft-07).

Top-level

Property Type Required Default Description
spec string yes - Manifest schema version. Pinned to v1.0 for the MVP.
app object yes - (undocumented)
build object yes - (undocumented)
package object - - (undocumented)
sign object - - (undocumented)
publish object - - (undocumented)
updates object - - (undocumented)
installer object - - Branded Windows installer wizard config. Tokens are emitted at pack time by BrandTokenEmitter; WCAG-AA contrast is enforced against white text.
parameters object - - Install-time / pack-time parameter declarations consumed by the wrapper installer (Sprint 5c).
install_steps array - - Main install-time step list executed by the wrapper installer (Sprint 5c). Per-step parameter shapes are validated by the typed deserializer. Path and argument fields may use brace tokens — {install_dir}, {var.}, {param.}, {temp_dir}, payload://… — and {staging_dir}. {staging_dir} (register row R5) resolves at INSTALL time to a freshly created, randomly named private directory for this run, administrator-only when the installer is elevated, and is deleted when the run ends. Use it as the dest of an http_download whose file a later run_program launches: the engine then re-verifies that file's sha256 from a handle denying write and delete, holds that handle across the launch, and — for an artifact that declared signing — Authenticode-checks it immediately before starting it. A fixed, predictable download destination gets none of that, and can be both pre-planted and swapped after the checksum. Note that {staging_dir} in a post_install hook is a SEPARATE directory from the install body's, reclaimed when the hook phase ends; a binary the install body downloaded cannot be launched from a hook.
pre_install array - - Steps executed before the main install_steps block.
post_install array - - Steps executed after the main install_steps block.
uninstall array - - Steps executed at the start of setup.exe /Uninstall, BEFORE the rollback journal replays. Lets the manifest tear down services / scheduled tasks / external scripts that the install journal doesn't cover.

app

Property Type Required Default Description
id string yes - Reverse-DNS application id, e.g. com.example.MyApp.
name string yes - (undocumented)
version string yes - Semantic version (Semver 2.0.0).
publisher string yes - Display name or X.500 distinguished name (CN=...).
description string - - (undocumented)
homepage string - - (undocumented)

build

Property Type Required Default Description
source string yes - Path (relative to manifest) to the directory whose contents will be packaged.
include array - - Glob patterns (relative to source) to include. Defaults to ['*/'].
exclude array - - Glob patterns (relative to source) to exclude.
deterministic boolean - True Reproducible build: sort entries, fixed mtimes, no host metadata.

package

Property Type Required Default Description
formats array - zip (undocumented)
architectures array - x64 (undocumented)
msix object - - (undocumented)

package.msix

Property Type Required Default Description
publisher string - - X.500 distinguished name; must match the signing cert subject.
logo string - - Path to a master logo (PNG, square). Sigil will resize for tiles.
capabilities array - - (undocumented)
runWack boolean - False If true, run the Windows App Certification Kit (appcert.exe) against the packed MSIX. Emits SIG0111 (warning) when WACK isn't installed and SIG0112 (error) when WACK reports failures. WBS 2.9.

sign

Property Type Required Default Description
provider enum: none, local, azure-trusted-signing - none (undocumented)
local object - - (undocumented)
azureTrustedSigning object - - (undocumented)

sign.local

Property Type Required Default Description
pfx string yes - Path to a .pfx file.
passwordEnv string - - Name of the environment variable holding the PFX password.
timestampUrl string - http://timestamp.digicert.com (undocumented)

sign.azureTrustedSigning

Property Type Required Default Description
endpoint string yes - (undocumented)
accountName string yes - (undocumented)
certificateProfile string yes - (undocumented)
tenantIdEnv string - AZURE_TENANT_ID (undocumented)
clientIdEnv string - AZURE_CLIENT_ID (undocumented)
clientSecretEnv string - AZURE_CLIENT_SECRET (undocumented)

publish

Property Type Required Default Description
github object - - (undocumented)

publish.github

Property Type Required Default Description
repo string yes - (undocumented)
tagPrefix string - v (undocumented)
draft boolean - False (undocumented)

updates

Property Type Required Default Description
channel string - stable Free-form label naming which channel manifest this app points at (e.g. 'stable', 'beta'). Purely descriptive: Sigil does not resolve or host channels itself.
manifestUrl string - - HTTPS URL of the signed channel manifest that /Update fetches to check for a newer version; its detached signature is expected at the same URL with '.sig' appended. Must be https:// (SIG0324) -- the signature URL is this string + '.sig', so a cleartext value drags the signature fetch onto cleartext with it. Re-checked before the fetch at update runtime. Omit to ship an installer with no update capability.
deltaTargets integer - 3 How many previous versions a future delta-patch generator would target. Parsed and schema-validated today, but not yet consumed by the update runtime -- full-package updates ship first (see the delta-update deferral ADR).
signingKey string - - Base64-encoded X.509 SubjectPublicKeyInfo (SPKI) DER of the ECDSA P-256 PUBLIC key that verifies the detached signature (manifestUrl + '.sig') on the fetched channel manifest. Embedded at pack time as the update runtime's trust anchor -- never a private key, and never a file path. Validated at pack time (SIG0325): the value must base64-decode AND import as a P-256 public key, so a file path or a wrong-curve key is refused here rather than failing at SIG0321 on every installed machine.

installer

Property Type Required Default Description
icon string - - Path (relative to the manifest) to a .ico file that becomes the produced setup.exe's Explorer icon. When omitted, the bundled default icon is used.
brand object - - (undocumented)
scope string - auto Install scope: per-user, per-machine, or auto-resolve (T12).
install_dir string - - Optional install-dir override; may reference {app.*} / {scope_root} tokens (T13).
license LocalizedText - - Either a plain string (treated as English) or a { "en": ..., "uk": ... } map. An en entry is required (SIG0290).
language string - - Optional fixed installer language tag (P9, gap G10) — the first link in the language-preference chain (installer.language -> /lang -> OS list -> en). An invalid tag is diagnosed (SIG0291).
require_signed_downloads string - sign_declared Whether a binary this installer pulls off the network -- an update package or a web-stub payload -- must be Authenticode-valid before it is launched (register row R45). sign_declared (default, and the historical behaviour) arms the check only when this manifest declares a sign block; that infers 'should downloads be verified' from 'did the publisher configure signing for their own output', which are different questions. always arms it regardless. always_verified_revocation additionally REFUSES a binary whose revocation status could not be established (register row R46) -- by default that is a warning, because refusing it would break installs behind a captive portal, on an air-gapped network, or inside a locked-down enterprise egress; turn it on when you know your audience is reliably online. Prerequisites are not governed by this setting: they are always checked, and carry their own per-prerequisite allow_unsigned opt-out. An unrecognized value is SIG0326.
options object - - Built-in configurable installer components (T8) plus app-defined custom components (P10, gap G11).
screens array - - Declared custom wizard screens over parameters (T9).
vars object - - Declarative variables (P1, gap G1): each entry is name: <expression> evaluated once at install-session start, in dependency order, and exposed as var. in when expressions / screen-field defaults and as a {var.} brace token in step paths and args. Expressions use the closed when grammar plus the read-only data-retrieval functions registry_read/env/file_version/installed_version; a var referencing a secret parameter inherits secretness. A reference cycle is a pack error (SIG0270).
hooks object - - Lifecycle hooks (P2, gap G2). Each phase is an ordered list of ordinary step records (typically run_program) that run OUTSIDE the rollback journal. WARNING: hooks have NO rollback obligations — their side effects are never recorded and never undone. A hook is governed only by its own on_failure: fail aborts the operation (the default for pre_install/pre_uninstall — the run stops before the journal opens / before the uninstall replays); continue logs and proceeds (the default for post_install/post_uninstall — the install is already committed and cannot be rolled back). Hook args may use {var.*} / {install_dir} tokens.
run_after_install object - - The program the Done screen's checked-by-default 'Launch ' checkbox starts, and the program a headless /silent /launch run starts (P2, gap G4). Always launched UNELEVATED — de-elevated to the user's medium-integrity token when the installer itself ran as admin.
prerequisites array - - First-class prerequisite units (P5, gap G6) — the declarative equivalent of Burn's ExePackage + DetectCondition. Each runs BEFORE the transactional install body and the pre_install hooks (and before the rollback journal opens): its detect expression is evaluated (skip when already satisfied), otherwise the source installer is acquired and run, and detect is re-evaluated to confirm it took effect. WARNING: prerequisites are NEVER journaled and are NOT rolled back — a shared machine dependency (VC++ redist, .NET runtime) must not be undone. An exit code of 3010 flags reboot-required (Done-screen notice + silent exit code 3010).
app_mutex array - - Named mutexes the application creates while it is running (P6, gap G7) — the Inno AppMutex equivalent. Before touching the install directory, setup opens each name; a mutex that opens means the app is running and the install/uninstall is blocked. This complements the Restart Manager sweep, which also finds processes holding files open in the install directory even when no mutex is declared. Blocked runs: the wizard shows a 'Close applications' screen; /silent exits with a dedicated code unless /closeapps is supplied. Use the exact name the app passes to CreateMutex, including any Global\ prefix.

installer.brand

Property Type Required Default Description
logo string - - (undocumented)
hero string - - (undocumented)
primaryColor string - - Wizard primary colour as #RRGGBB — primary buttons and accent fill. Feeds BrandTokenEmitter, which derives a full light+dark palette from this and accentColor at pack time. Omitted, it falls back to Sigil's default #1F2937. NOTE the camelCase spelling: primary_color was accepted by this schema until R80 and read by nothing, so a snake_case manifest packed a silently unbranded installer; it is now refused by additionalProperties.
accentColor string - - Wizard secondary accent as #RRGGBB — progress indication and links. Omitted, it falls back to Sigil's default #3B82F6. camelCase, for the reason given on primaryColor.

installer.options

Property Type Required Default Description
desktop_shortcut InstallerOption - - Built-in configurable installer component: shorthand boolean or an object.
start_menu InstallerOption - - Built-in configurable installer component: shorthand boolean or an object.
add_to_path InstallerOption - - Built-in configurable installer component: shorthand boolean or an object.
file_associations FileAssociationOption - - file_associations component: shorthand boolean or an object with extensions.
components array - - App-defined custom components (P10, gap G11) — the Inno [Tasks] equivalent. Each generates NO install step of its own; it exists only as option. in the expression engine, gating arbitrary steps / step groups via their when. Rendered as checkboxes on the Options screen after the built-ins, in declared order.

installer.hooks

Property Type Required Default Description
pre_install HookPhase - - An ordered list of lifecycle-hook steps (P2). Accepts the SAME closed catalog of 18 step types as install_steps — the four config/network types were missing here until R81, which was drift from the lane that added them, never a policy. What differs is the journal, not the catalog: hooks run OUTSIDE the rollback journal, so their side effects are never recorded and never undone, and each step is governed only by its own on_failure (fail or continue; rollback is refused — there is nothing to unwind). See installer.hooks.
post_install HookPhase - - An ordered list of lifecycle-hook steps (P2). Accepts the SAME closed catalog of 18 step types as install_steps — the four config/network types were missing here until R81, which was drift from the lane that added them, never a policy. What differs is the journal, not the catalog: hooks run OUTSIDE the rollback journal, so their side effects are never recorded and never undone, and each step is governed only by its own on_failure (fail or continue; rollback is refused — there is nothing to unwind). See installer.hooks.
pre_uninstall HookPhase - - An ordered list of lifecycle-hook steps (P2). Accepts the SAME closed catalog of 18 step types as install_steps — the four config/network types were missing here until R81, which was drift from the lane that added them, never a policy. What differs is the journal, not the catalog: hooks run OUTSIDE the rollback journal, so their side effects are never recorded and never undone, and each step is governed only by its own on_failure (fail or continue; rollback is refused — there is nothing to unwind). See installer.hooks.
post_uninstall HookPhase - - An ordered list of lifecycle-hook steps (P2). Accepts the SAME closed catalog of 18 step types as install_steps — the four config/network types were missing here until R81, which was drift from the lane that added them, never a policy. What differs is the journal, not the catalog: hooks run OUTSIDE the rollback journal, so their side effects are never recorded and never undone, and each step is governed only by its own on_failure (fail or continue; rollback is refused — there is nothing to unwind). See installer.hooks.

installer.run_after_install

Property Type Required Default Description
path string yes - Program to launch. May use {install_dir} / {var.*} / payload:// tokens.
args array - - Optional arguments; each may use the same tokens.

parameters.<name>

Property Type Required Default Description
type string yes - (undocumented)
default - - - (undocumented)
values array - - (undocumented)
install_time boolean - False (undocumented)
description LocalizedText - - Either a plain string (treated as English) or a { "en": ..., "uk": ... } map. An en entry is required (SIG0290).
pattern string - - (undocumented)
min integer - - (undocumented)
max integer - - (undocumented)
screen string - - Optional wizard page label. Parameters that share a screen value are grouped onto the same Install Options screen in the wrapper installer. Parameters without a screen value land on a default 'Install Options' page after all named screens.
source object - - Dynamic options source. The wizard fetches url at install time, parses JSON, and populates a ComboBox with the items at items_path keyed by value_property / labelled by label_property.

parameters.<name>.source

Property Type Required Default Description
url string yes - HTTPS URL fetched at install time. Must be https:// (SIG0323): the values it returns become parameter values, and parameter values are substituted into install-step fields -- paths, registry coordinates, arguments -- that execute elevated. Re-checked at install time against the substituted URL.
items_path string yes - (undocumented)
value_property string yes - (undocumented)
label_property string yes - (undocumented)

Definition: LocalizedText

Either a plain string (treated as English) or a { "en": ..., "uk": ... } map. An en entry is required (SIG0290).

Definition: Parameters

Install-time / pack-time parameter declarations consumed by the wrapper installer (Sprint 5c).

Definition: InstallStep

Property Type Required Default Description
id string yes - (undocumented)
type string yes - (undocumented)
when string - - (undocumented)
on_failure string - - What to do when this step fails. rollback (the default) aborts and replays the rollback journal in reverse across every phase that ran; continue logs and proceeds. There is no abort-without-rollback mode for a journalled phase: fail was accepted until it was removed in R78, where it had always behaved identically to rollback, and is now refused with SIG0233.
allow_outside_install_dir boolean - - Opt this step out of the install_dir destination-containment rule (register row R16). Accepted only by the step types whose destination is contained: file_copy, directory_create, file_delete, directory_delete, http_download, ini_write, json_edit, xml_edit. On any other step type it is an unrecognized field (SIG0231) and has no effect. Use it for deliberate out-of-tree writes, such as a machine-wide config under ProgramData. It does NOT relax the privileged-target rule on service_install / scheduled_task_create / com_register / firewall_rule, and it does not suppress the unresolved-token failure, which applies to every path field and has no opt-out. Note there is no %VAR% expansion in a step path.

Definition: InstallerOption

Built-in configurable installer component: shorthand boolean or an object.

Definition: FileAssociationOption

file_associations component: shorthand boolean or an object with extensions.

Definition: CustomComponent

Property Type Required Default Description
name string yes - The component key — a bare identifier, unique among components and not colliding with a built-in component or a declared parameter (SIG0300). Referenced as option. in step when clauses.
label LocalizedText yes - The checkbox caption (localizable — a plain string or an { en: ..., de: ... } map).
description LocalizedText - - Optional secondary caption shown under the checkbox (localizable).
default boolean - False The checkbox's initial (checked) state.
locked boolean - False When true the row renders disabled and is always applied at its default; a CLI override is ignored (logged).
when string - - Optional applicability gate (a when-grammar expression). When it evaluates false the row is hidden and option. resolves to false. May reference param. / scope / system. but not var.* (v1).

Definition: Prerequisite

Property Type Required Default Description
name string yes - Human label shown on the wizard progress row and in the log ('Installing …').
detect string yes - A when-grammar expression that is true when the prerequisite is ALREADY satisfied (typically a registry_read / file_version / registry_exists check). Evaluated before install (skip if true) and again after (fail if still false).
source string yes - The installer to run when detect is false: a payload://… path (bundled in the package) or an https://… URL (downloaded at install time). Args may use {var.*} / {install_dir} tokens.
sha256 string - - SHA-256 integrity checksum (hex). REQUIRED for an https:// source (a download without it is refused, SIG0280); ignored for a payload:// source.
args array - - Arguments passed to the source installer (typically /quiet /norestart).
exit_codes_ok array - - Exit codes treated as success; defaults to [0]. An accepted code of 3010 additionally flags reboot-required.
scope_required string - - Requires the install to run in this scope; a mismatch with the resolved scope is a diagnostic at session start. Omit to accept any scope.
timeout_seconds integer - - Optional per-prerequisite run timeout, in seconds.
allow_unsigned boolean - False Launch this prerequisite even when its Authenticode signature does not establish trust. A DOWNLOADED prerequisite installer is signature-checked immediately before it is run and refused if it is unsigned or its signature is invalid; unsigned redistributables are common and legitimate, so this opts out of that check. It NEVER waives a revoked or explicitly distrusted certificate, and the sha256 is enforced either way. Ignored for a payload:// source, which is not checked at all — its integrity comes from the package's own signature.

Definition: HookPhase

An ordered list of lifecycle-hook steps (P2). Accepts the SAME closed catalog of 18 step types as install_steps — the four config/network types were missing here until R81, which was drift from the lane that added them, never a policy. What differs is the journal, not the catalog: hooks run OUTSIDE the rollback journal, so their side effects are never recorded and never undone, and each step is governed only by its own on_failure (fail or continue; rollback is refused — there is nothing to unwind). See installer.hooks.

Definition: InstallerScreen

Property Type Required Default Description
id string yes - (undocumented)
title LocalizedText yes - Either a plain string (treated as English) or a { "en": ..., "uk": ... } map. An en entry is required (SIG0290).
subtitle LocalizedText - - Either a plain string (treated as English) or a { "en": ..., "uk": ... } map. An en entry is required (SIG0290).
when string - - (undocumented)
fields array yes - (undocumented)

Definition: ScreenField

A screen field: a bare parameter-name string or a { param, widget } object.