Extension basics

Signed extension

A signed extension assures a third party that the extension package and its code has not been altered. Signing your extension is optional. For a walkthrough of the signing process, see Creating and Installing Helix Core Signed Extensions in the Perforce Knowledgebase.


When you run p4 extension --install, the server extension is transferred from your client machine to the Helix Core Server, where built-in validation occurs. For example, the server notifies you if the manifest is missing or is invalid.

The server stores the server extension in a depot:

The server extensions depot is a new depot type because the files associated with a server extension are separate from the files in other types of Helix Core depots.

Viewing the history of extensions

A super user can run p4 changes on the extension depot to see the history of installs, upgrades, and deletes.

Listing extensions

See p4 extension in Helix Core Command-Line (P4) Reference, which explains the --list option.

Disabling and re-enabling an extension

To disable or re-enable a server extension, in the global configuration or in the instance configuration, change the value of ExtEnabled. See Fields that can be modified.

Deleting an extension


To actually perform the install or delete of an extension, the --yes option is required. Without --yes, the p4 extension command merely reports what it would do without actually performing the install or delete.

To delete a server extension, use p4 extension --delete extName --yes

This deletes the depot file and removes the server extension’s resource directory.


When a server extension is committed to the extensions depot, the server creates a subdirectory for the server extension. This directory is specified by the server.extensions.dir configurable. By default, the name of this directory matches the configurable's name, server.extensions.dir, and is located under the P4ROOT directory. Each server extension gets two subdirectories under the directory specified at server.extensions.dir:




Resources for the extension.

The extension-key value is from the extension's manifest's key field (UUID)


A persistent scratch space that is not replicated.

Also the location of the log. See Diagnostics / debugging.

See also:


Knowledge of Lua.


Any plain-Lua library is compatible, provided that it matches version of the server extension runtime. However, external Lua libraries that require native machine code for a specific processor are not compatible.

Replication supported, but not DVCS

Server extensions are stored as normal depot files and use the existing file replication mechanism for transfer to replicas. Replicas install extensions as soon they received them from the commit server.

However, if your server extension has files that are stored in the server.extension.dir directory, those files will not be replicated.

DVCS instances do not receive server extensions.

Backup of server extensions

A backup of server extension archives is included if you make a backup of everything under P4ROOT that includes hidden files and directories. By default, the extension archives are in a hidden depot named .p4-extension under P4ROOT. The path to the extensions directory is available to a user with the super access level. See p4 depots in Helix Core Command-Line (P4) Reference.

The server.extensions.dir configurable points to the uncompressed extension archives and any content that they might have created. Depending on the extension, the content that the extension creates might be worth backing up.

If the uncompressed extension archives under the server.extensions.dir are not present, the server recreates them from the source archives in the Extension depot.

Server extension specs are included in checkpoints.


The server extensions API and manifest allow extensions to return messages localized by locale to the user. Message strings are encoded as UTF-8 and can be converted to other character sets. See the For details, see the Internationalization Notes.

Diagnostics / debugging

To log line-delimited JSON from within a server extension, use the Helix.Core.Server.log() function. See Class Helix.Core.Server.

Documentation from the command-line

See p4 help serverextensionintro