Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Command-Line Reference

Audience: operators and integrators driving Aperture from a shell.

aperture — Fine-grained access control engine. This page is generated from the urfave/cli command tree in internal/cli (cli.NewApp); every command, subcommand, and flag below is read from the live definitions.

Global flags

aperture declares no persistent global flags. The commonly shared options — --seed, --store, --account, and --principal (the acting principal on mutations, sourced from APERTURE_PRINCIPAL) — are defined per command and appear in each command's flag table below.

Commands

CommandSummary
attributesInspect the attribute directories a seed wires, read one, or drop cached bags
bestowBestow (delegate) a grant you hold to another principal
bulkProvision or deprovision many grants in one transactional call
checkDecide whether a principal may take an action on an object
deleteDelete an entity (object-type|permission|principal|role|group|account|grant|membership)
enumerateList the objects a principal may act on
explainExplain why a decision resolved the way it did
exportExport the whole model to a single JSON/YAML state file (system-admin tier)
getRead one entity by id (object-type|permission|principal|role|group|account|grant)
identifiersList all valid instance ids of an object type from its provider
impersonateStart a time-boxed impersonation session (prints the session)
importApply a JSON/YAML state file as an idempotent transactional upsert (system-admin tier)
listList entities of a kind (object-types|permissions|principals|roles|groups|accounts|grants)
mcpServe the read-only Aperture MCP surface over stdio
putCreate or update an entity (object-type|permission|principal|role|group|account|membership|grant)
revokeRevoke a grant you previously bestowed
serveRun the Aperture HTTP server
templateManage and apply provisioning templates

aperture attributes

Inspect the attribute directories a seed wires, read one, or drop cached bags

An attribute slot is a HOST DIRECTORY — the user table, the service-account registry, the tenant catalogue — that a rule reads principal.* and account.* out of. There are exactly three slots (user, machine, account) and each caches the bags it has fetched, per slot, with its own ttl: and max_size:.

THE CACHE WINDOW IS A SECURITY PROPERTY, not only a tuning knob. Object metadata that goes stale for a TTL is usually tolerable. An attribute bag is the ASKER'S STANDING — the clearance, the department, the plan — so until a cached bag expires, every decision about that subject keeps evaluating against access the host has ALREADY TAKEN AWAY. Principals are the classic revoke case, and a revocation that takes effect ttl: later is a revocation that has not happened yet. What a slot's ttl: buys in fetch traffic it pays for in that delay.

So: pick a slot's ttl: for how fast its revocations must land, read back what a deployment is actually running with aperture attributes slots, and close the window on a specific subject with aperture attributes invalidate.

Reading a directory in bulk (query) and dropping cached bags (invalidate) are SYSTEM-TIER operations: both require --principal holding system-admin authority in --account, and a refusal returns nothing at all — no partial page, no count, and nothing that tells an unauthorized caller which slots exist.

aperture attributes <command>

aperture attributes invalidate

Drop cached attribute bags so the next decision re-reads them (system-admin tier)

Drops cached bags, so the next decision about the affected subjects pulls fresh ones from the host directory. Three forms:

  aperture attributes invalidate user --id alice   one subject, one slot
  aperture attributes invalidate user             every bag in one slot
  aperture attributes invalidate --all            every bag in every slot

INVALIDATION IS A SECURITY CONTROL, NOT A PERFORMANCE KNOB. A cached attribute bag is the asker's standing, so a REVOKED CLEARANCE KEEPS AUTHORIZING until that bag expires: for the length of the slot's ttl:, every decision about that subject is made against access the host has already removed. Waiting the window out is not a remedy, it is the exposure. An operator who has just removed someone's access invalidates that subject here, and then the removal is true.

Scope: this drops the caches of THE PROCESS THAT RUNS IT. That makes it exact for a host embedding Aperture (it is the operator's spelling of provider.AttributeRegistry.Invalidate, which such a host calls the moment its directory changes) and it makes a ONE-SHOT invocation self-contained: this process starts with a cold cache and exits with it, so there is nothing here for a stale bag to survive in. For a long-running aperture serve, the controls that reach ITS cache are the slot's ttl: — set it to how fast that directory's revocations must land — and a restart.

Requires --principal holding system-admin authority in --account: the result reports whether a bag was cached, which is a fact about who has recently been decided about, and clearing a large slot costs the next wave of decisions a provider round-trip each.

aperture attributes invalidate [options] <slot>
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--allboolclear EVERY slot's cache; takes no <slot> argument and no --id
--idstringdrop only this subject's cached bag (a bare principal or account id); omit to clear the whole slot
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture attributes query

Read a page of one attribute slot's directory (system-admin tier)

Returns up to --limit records of <slot> — user, machine, or account — as a JSON array of {id, attributes}, narrowed by attribute predicates.

THIS IS A SYSTEM-TIER READ. Unfiltered, it returns the head of the host's user table, keys and bags together, so it requires --principal holding system-admin authority in --account. A refusal returns NOTHING — no partial page, no count, and no way to tell an empty slot from a full one or from an unwired one. Ask aperture explain about your own authority if a refusal is unexpected.

--field and --fields-json narrow the result by ATTRIBUTE, on exactly the predicate aperture enumerate applies to object metadata: predicates are ANDed, a field the bag does not carry never matches, a list-valued field matches by membership, and everything else matches by TYPED equality, so the string "5" never matches the number 5. --field always sends a string; use --fields-json when a number, bool, or list is genuinely meant:

  aperture attributes query user --principal alice --account acme \
    --field department=eng --fields-json '{"clearance":3}'

Both may be given together: --fields-json is merged FIRST and --field entries then override it by key.

A slot whose sql: entry declares no get_all: is FETCH-ONLY by design — it can answer the decision path without exposing the whole table to an enumeration — and this command reports that provider's coded refusal rather than an empty page.

aperture attributes query [options] <slot>
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--fieldstringobject-metadata predicate as key=value, repeatable; the value is ALWAYS a string, so --field seats=5 matches the string "5" and never the number 5 (use --fields-json for that). Overrides --fields-json on a key collision
--fields-jsonstringobject-metadata predicates as a JSON object, for values that are genuinely a number, bool, or list (e.g. '{"seats":5,"active":true,"tags":["a"]}'). Merged first; --field entries then override by key
--limitint0cap the number of returned records (<=0 means the default; the registry clamps it regardless)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture attributes slots

List the three attribute slots, the source each is wired to, and its cache settings

Prints one row per slot — user, machine, account — with the source the seed declares for it (csv, sql, or inline), the cache freshness window, the cached-bag cap, and how many bags this process currently holds.

THE TTL COLUMN IS THE REVOCATION WINDOW. A slot's cached bag keeps authorizing until it expires, so ttl is the longest a removed clearance can keep working. never means a bag, once fetched, is only dropped by eviction or by an explicit aperture attributes invalidate — correct for a fixed inline block, dangerous for a live directory.

The cached column counts THIS process's cache. A one-shot invocation starts cold, so it reads 0; it is the number that matters in a long-running aperture serve.

No actor is required: this reports the wiring in the seed file you passed and the configuration this process built from it. It contacts no provider and prints no subject key and no attribute value.

aperture attributes slots [options]
NameAliasesTypeDefaultUsage
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture bestow

Bestow (delegate) a grant you hold to another principal

aperture bestow [options]
NameAliasesTypeDefaultUsage
--delegatorstringprincipal bestowing the grant (env: APERTURE_PRINCIPAL) (required)
--filestringpath to a JSON grant body
--jsonstringgrant body as inline JSON
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture bulk

Provision or deprovision many grants in one transactional call

aperture bulk <command>

aperture bulk grant

Apply many grants atomically (account-admin tier)

aperture bulk grant [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--filestringpath to a JSON array of grant bodies
--jsonstringa JSON array of grant bodies
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture bulk revoke

Delete many grants atomically (account-admin tier)

aperture bulk revoke [options] [<grant-id>...]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--grantstringgrant id to revoke (repeatable)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture check

Decide whether a principal may take an action on an object

aperture check [options] <principal> <action> <object>
NameAliasesTypeDefaultUsage
--accountstring"acme"active account the decision is scoped to
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture delete

Delete an entity (object-type|permission|principal|role|group|account|grant|membership)

aperture delete [options] <kind> [<id>]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--account-idstringmembership account id (kind=membership)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--principal-idstringmembership principal id (kind=membership)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture enumerate

List the objects a principal may act on

Lists every object id under <pattern> that <principal> may take <action> on.

--field and --fields-json narrow that list by OBJECT METADATA. The predicate is typed: a field matches only when its value equals the wanted value AND is of the same kind, so the string "5" never matches the number 5. --field always sends a STRING; use --fields-json when a number, bool, or list is genuinely meant:

  --field tier=premium --field current_brands=brand:Y
  --fields-json '{"seats":5,"active":true,"tags":["public"]}'

Both may be given together: --fields-json is merged FIRST and --field entries then OVERRIDE it by key. Predicates are ANDed; a field the object does not carry never matches; a list-valued field matches by membership. Filtering happens before --limit.

--via restricts the list to what a DECLARED REFERENCE names — the other direction: --field asks "which datasets contain brand Y?", --via asks "which brands does dataset X list?". It is spelled <holder-identity>.<field>, where the field is everything after the LAST '.', and it is repeatable (edges are ANDed):

  --via account:acme/dataset:x.current_brands

A holder you may not read yields an EMPTY list and no error, which is deliberate: "you may not see dataset X" and "dataset X lists nothing you may see" must not be tellable apart. Restriction, like filtering, happens before --limit.

aperture enumerate [options] <principal> <action> <pattern>
NameAliasesTypeDefaultUsage
--accountstring"acme"active account the enumeration is scoped to
--fieldstringobject-metadata predicate as key=value, repeatable; the value is ALWAYS a string, so --field seats=5 matches the string "5" and never the number 5 (use --fields-json for that). Overrides --fields-json on a key collision
--fields-jsonstringobject-metadata predicates as a JSON object, for values that are genuinely a number, bool, or list (e.g. '{"seats":5,"active":true,"tags":["a"]}'). Merged first; --field entries then override by key
--limitint0cap the number of returned object ids (<=0 means the default)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path
--viastringrestrict the result to the objects a holder's declared reference field names, as <holder-identity>.<field> (e.g. --via account:acme/dataset:x.current_brands); repeatable, and several edges are ANDed. The FIELD is everything after the LAST '.'

aperture explain

Explain why a decision resolved the way it did

aperture explain [options] <principal> <action> <object>
NameAliasesTypeDefaultUsage
--accountstring"acme"active account the decision is scoped to
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture export

Export the whole model to a single JSON/YAML state file (system-admin tier)

aperture export [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--formatstringoutput format: json (default) or yaml
--outstringwrite the state file to this path (default: stdout)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture get

Read one entity by id (object-type|permission|principal|role|group|account|grant)

aperture get [options] <kind> <id>
NameAliasesTypeDefaultUsage
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture identifiers

List all valid instance ids of an object type from its provider

aperture identifiers [options] <object_type>
NameAliasesTypeDefaultUsage
--excludestringid to omit from the result (repeatable); expands an exclusive allowance
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture impersonate

Start a time-boxed impersonation session (prints the session)

aperture impersonate [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required)
--modestring"augment"augment|become
--operatorstringoperator principal (env: APERTURE_PRINCIPAL) (required)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path
--targetstringtarget principal to impersonate (required)

aperture import

Apply a JSON/YAML state file as an idempotent transactional upsert (system-admin tier)

aperture import [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--filestringpath to the JSON/YAML state file (default: stdin, treated as JSON)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture list

List entities of a kind (object-types|permissions|principals|roles|groups|accounts|grants)

aperture list [options] <kind>
NameAliasesTypeDefaultUsage
--accountstringaccount to list grants for (required for kind=grant)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture mcp

Serve the read-only Aperture MCP surface over stdio

Exposes Aperture's decision API (check/enumerate/explain, single + bulk), a read-only what-if simulator, and model inspection as MCP tools over stdio. No tool mutates. Intended to be spawned over stdio by an MCP client.

aperture mcp [options]
NameAliasesTypeDefaultUsage
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture put

Create or update an entity (object-type|permission|principal|role|group|account|membership|grant)

aperture put [options] <kind>
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--filestringpath to a JSON entity body
--jsonstringentity body as inline JSON
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture revoke

Revoke a grant you previously bestowed

aperture revoke [options]
NameAliasesTypeDefaultUsage
--delegatorstringprincipal revoking the grant (env: APERTURE_PRINCIPAL) (required)
--grantstringid of the grant to revoke (required)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture serve

Run the Aperture HTTP server

aperture serve [options]
NameAliasesTypeDefaultUsage
--addrstring":8080"TCP address to listen on
--authstringauthenticator adapter: dev|oidc|parsec (overrides APERTURE_AUTH_MODE; defaults to dev — bearer is the principal id, no external IdP) (env: APERTURE_AUTH_MODE)
--enforce-membershipbooldeny any decision whose principal is not a member of the active account, before grants are consulted (defence-in-depth; lets shared roles be reused across accounts safely) (env: APERTURE_ENFORCE_MEMBERSHIP)
--manage-accountsboolmanage the lifecycle of account records — allow account create/update/delete through the API (default true; overrides APERTURE_MANAGE_ACCOUNTS). Pass --manage-accounts=false when accounts are mastered by an upstream system: Aperture then refuses every account write regardless of the caller's authority, while account reads and every decision stay unaffected. Read once at startup; a restart is required to change it
--manage-membershipsboolmanage the lifecycle of principal-to-account memberships — allow membership create/update/delete through the API (default true; overrides APERTURE_MANAGE_MEMBERSHIPS). Independent of the other two, so a deployment can master accounts and principals upstream and still decide who belongs to what, or the reverse. Read once at startup; a restart is required to change it
--manage-principalsboolmanage the lifecycle of principal records — allow principal create/update/delete through the API (default true; overrides APERTURE_MANAGE_PRINCIPALS). Pass --manage-principals=false when principals are mastered by an upstream directory or IdP: Aperture then refuses every principal write regardless of the caller's authority, while principal reads and every decision stay unaffected. Read once at startup; a restart is required to change it
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture template

Manage and apply provisioning templates

aperture template <command>

aperture template apply

Apply a template transactionally into --account (account-admin tier)

aperture template apply [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--id-prefixstringprefix for generated grant ids
--namestringtemplate name to apply (required)
--paramstringparameter as name=value (repeatable)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path
--versionint0template version (0 = latest)

aperture template delete

Delete a template version, or all versions (system-admin tier)

aperture template delete [options] <name>
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path
--versionint0template version to delete (0 = all versions of the name)

aperture template get

Read a template by name (latest version unless --version)

aperture template get [options] <name>
NameAliasesTypeDefaultUsage
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path
--versionint0template version (0 = latest)

aperture template list

List every template version

aperture template list [options]
NameAliasesTypeDefaultUsage
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path

aperture template put

Create or update a template (system-admin tier)

aperture template put [options]
NameAliasesTypeDefaultUsage
--accountstringactive account (required for system-tier authority resolution)
--filestringpath to a JSON template body
--jsonstringtemplate body as inline JSON
--principalstringauthenticated principal performing the mutation (env: APERTURE_PRINCIPAL)
--seedstringpath to a JSON/YAML seed model (defaults to the embedded example)
--storestringDSN for the backing store: a postgres:// or postgresql:// URL for PostgreSQL, any other value as a SQLite path (defaults to in-memory). Set APERTURE_POSTGRES_SCHEMA to place Aperture's tables in a named PostgreSQL schema; unset uses the connection's search_path