Charm Tools

The Charm Tools package is a collection of commands that assist with charm management. In particular, it allows charm authors to create charms.


Charm Tools can be installed on various platforms with the use of Snaps. The name of the snap is called charm.


To install the Charm Tools on Ubuntu:

sudo snap install charm

On Ubuntu 14.04 LTS (Trusty) snapd is not installed by default. You can install it in this way:

sudo apt install snapd

Other Linuxes

To install on other Linux distributions see the upstream Snaps documentation.

Non-Linux platforms

There are no recent builds of Charm Tools for other operating systems. Check the Charm Tools project for further information.


All the functionality provided by the Charm Tools is accessed via the charm command and a sub-command argument. Omitting the argument will give a listing of all sub-commands. To view an individual help page for each sub-command run charm help <sub-command>.

Click the triangle to reveal a summary of a sub-command.

charm add [-h] [--description] [-b] [--debug] {tests,readme,icon}

Extends a charm depending on the options chosen:


tests will create a tests directory for a charm and generate an example test using the Amulet framework. This command will ingest relation data from the charm metadata.yaml and create test file, 00-autogen, based on matching charms to the interfaces listed. This is merely an example to start with and will need to be modified.


readme will create a README.ex in the CHARM_DIRECTORY from the template charm.


icon will create an icon.svg in the CHARM_DIRECTORY. This icon is a template and should be customised by the charm author (see Charm Icons documentation).

charm attach [options] <charm id> <resource=<file>

Uploads a file as a new resource for a charm.

charm attach ~user/trusty/wordpress-0 website-data=./

A revision number is only required when using the stable channel, which is the default channel.

charm attach ~user/mycharm mydata=./blah -c unpublished
charm build [-h] [-l LOG_LEVEL] [-f] [-o OUTPUT_DIR] [-s SERIES]
  [--hide-metrics] [--interface-service INTERFACE_SERVICE]
      [--no-local-layers] [-n NAME] [-r] [--description]

Builds a charm from layers and interfaces.

charm create [-h] [-t TEMPLATE] [-a] [-v] [--description] charmname [charmhome]

Creates a new charm.

The will produce a new boilerplate charm. Replace <charmname> with the name of your new charm. A directory called <charmname>, and any necessary sub-directories and files, will be created in the [charmhome] directory, or your current directory if no [charmhome] directory is provided.

By default, your new charm is created using the Python template. Use the -t TEMPLATE option to create a charm using a different template, e.g.:

charm create -t bash my-charm

To see the list of installed templates use charm create -h.

Depending on the template being used, charm create may prompt for user input. To suppress prompts and accept all defaults instead, use the -a or --accept-defaults option.

charm grant [options] <charm or bundle id> [--channel <channel>] [--acl (read|write)] [--set] [,,...]

Extends permissions for the given charm or bundle to the given users.

charm grant ~johndoe/wordpress fred

The command accepts many users (comma-separated list) or everyone.

The --acl parameter accepts "read" and "write" values. By default "read" permissions are granted:

charm grant ~johndoe/wordpress --acl write fred

The --set parameter is used to overwrite any existing ACLs:

charm grant ~johndoe/wordpress --acl write --set fred,bob

To select a channel, use the --channel option:

charm grant ~johndoe/wordpress --channel stable --acl write --set fred,bob
charm help [command]

Shows help on a command.

Running just charm (with no arguments) will display the list of available commands.

charm layers [-h] [-r] [-l LOG_LEVEL] [--description] [charm]

Inspects the layers of a built charm.

charm list [options]

Lists the charms under a given user name, by default yours.

charm list -u lars

When no arguments are given it returns a list of charms that the currently logged in user has pushed.

charm list
charm list-resources [options] <charm>

Displays the resources for a charm in the Charm Store.

The charm can be expressed as a charm URL, or an unambiguously condensed form of it. So the following forms will be accepted:

For cs:trusty/mysql :

For cs:~user/trusty/mysql :

When the series is not supplied, the series from your local host is used. Thus the above examples imply that the local series is trusty.

charm login

Logs the user in to the Charm Store using Ubuntu SSO.

charm logout

Logs the user out of the Charm Store.

charm proof [-h] [--description] [-b] [--debug] [charm_name]

Performs static analysis on a charm or bundle.

charm pull [options] <charm or bundle id> [--channel <channel>] [<directory>]

Downloads a copy of a charm or bundle from the Charm Store into a local directory. If the directory is unspecified, the directory will be named after the charm or bundle.

To download the wordpress charm into directory 'wordpress' in the current directory:

charm pull trusty/wordpress

To select a channel, use the --channel option:

charm pull wordpress --channel edge
charm pull-source [-h] [-v] [--description] item [dir]

Downloads the source code for a charm, layer, or interface.

The item to download can be specified using any of the following forms:

  • [cs:]charm
  • [cs:]series/charm
  • [cs:]~user/charm
  • [cs:]~user/series/charm
  • layer:layer-name
  • interface:interface-name

If the item is a layered charm, and the top layer of the charm has a repo key in layer.yaml, the top layer repo will be cloned. Otherwise, the charm archive will be downloaded and extracted from the Charm Store.

If a download directory is not specified, the following environment variables will be used to determine the download location:

  • For charms, $JUJU_REPOSITORY
  • For layers, $LAYER_PATH
  • For interfaces, $INTERFACE_PATH

If a download location can not be determined from environment variables, the current working directory will be used.

The download is aborted if the destination directory already exists.

charm push [options] <directory> [<charm or bundle id>]

Uploads a charm or bundle from the local directory to the Charm Store.

The charm or bundle id must not specify a revision: the revision will be chosen by the Charm Store to be one more than any existing revision. If the id is not specified, the current logged-in Charm Store user name is used, and the charm or bundle name is taken from the provided directory name.

The pushed charm or bundle is unreleased and therefore usually only available to a restricted set of users. See the release command for info on how to make charms and bundles available to others.

charm push .
charm push /path/to/wordpress wordpress
charm push . cs:~lars/trusty/wordpress

Resources may be uploaded at the same time by specifying the --resource flag. Following the resource flag should be a name=filepath pair. This flag may be repeated more than once to upload more than one resource.

charm push . --resource website=~/some/file.tgz --resource config=./docs/cfg.xml
charm push-term [options] <filename> <term id>

Creates a new Terms and Conditions document (revision).

For example, to create a new terms document called 'enterprise-plan', whose contents is from file text.txt, and return the revision of the new document:

charm push-term text.txt user/enterprise-plan
charm release [options] <charm or bundle id> [--channel <channel>]

Publishes a charm or bundle to the Charm Store. Releasing is the action of assigning one channel to a specific charm or bundle revision (revision needs to be specified), so that it can be shared with other users and also referenced without specifying the revision. Four channels are supported, in order of stability: "stable", "candidate", "beta", and "edge"; the "stable" channel is the default.

charm release ~bob/trusty/wordpress

To select another channel, use the --channel option:

charm release ~bob/trusty/wordpress --channel beta
charm release wily/django-42 -c edge --resource website-3 --resource data-2

If your charm uses resources, you must specify what revision of each resource will be published along with the charm, using the --resource flag (one per resource). Note that resource info is embedded in bundles, so you cannot use this flag with bundles.

charm release wily/django-42 --resource website-3 --resource data-2
charm release-term [options] <term id>

Releases the given terms document. For instance:

charm release-term me/my-terms
charm revoke [options] <charm or bundle id> [--channel <channel>] [--acl (read|write)] [,,...]

Restricts permissions for the given charm or bundle to the given users.

charm revoke ~kirk/wordpress james

The command accepts many users (comma-separated list) or everyone.

The --acl parameter accepts "read" and "write" values. By default all permissions are revoked.

charm revoke ~kirk/wordpress --acl write james

To select a channel, use the --channel option, for instance:

charm revoke ~kirk/wordpress --channel beta --acl write james,robert
charm set [options] <charm or bundle id> [--channel <channel>] name=value [name=value]

Updates the extra-info, home page or bugs URL for the given charm or bundle.

charm set wordpress bugs-url=https://bugspageforwordpress.none
charm set wordpress homepage=https://homepageforwordpress.none

The separator used when passing key/value pairs determines the type: "=" for string fields, ":=" for non-string JSON data fields. Some fields are forced to string and cannot be arbitrary JSON.

To select a channel, use the --channel option, for instance:

charm set wordpress someinfo=somevalue --channel edge
charm show [options] <charm or bundle id> [--channel <channel>] [--list] [field1 ...]

Prints information about a charm or bundle. By default, only a summary is printed. You can specify --all to get all known metadata.

charm show trusty/wordpress

To select a channel, use the --channel option, for instance:

charm show wordpress --channel edge

To specify metadata for one or more specific channels:

charm show wordpress charm-metadata charm-config --channel stable

To get a list of available metadata types:

charm show --list
charm show-term [options] <term id>

Shows the given terms document. For instance:

To show revision 1 of the enterprise-plan terms:

show-term enterprise-plan/1

To show the latest revision of the enterprise plan terms:

show-term enterprise-plan
charm terms [options]

Lists the terms owned by the user and the charms that require these terms to be agreed to.

Charms can require users to accept terms before deployment. This is useful for software that needs a EULA.

charm version [-h] [--description] [-b] [--debug]

Displays tooling version information.

charm whoami [options]

Displays JAAS user id and group membership.