Leantime supports plugins to extend core functionality without modifying the codebase. Plugins are available through the Leantime Marketplace and can also be installed manually for custom development.
Before installing plugins, ensure your Leantime installation is properly configured for plugin support.
Critical: You must mount the Plugins folder as a volume. Without this, plugins will disappear after container restarts.
In your docker-compose.yml, ensure you have:
volumes:
- plugins:/var/www/html/app/PluginsOr if using docker run:
docker run -d \
-v /path/to/plugins:/var/www/html/app/Plugins \
# ... other options
leantime/leantime:latestThe www-data user must have write access to the Plugins folder:
docker exec -it <container_name> chown -R www-data:www-data /var/www/html/app/Plugins
docker exec -it <container_name> chmod -R 755 /var/www/html/app/PluginsEnsure the app/Plugins/ directory exists and is writable by your web server user:
sudo mkdir -p /var/www/html/leantime/app/Plugins
sudo chown -R www-data:www-data /var/www/html/leantime/app/Plugins
sudo chmod -R 755 /var/www/html/leantime/app/PluginsUsing File Manager:
- Navigate to your Leantime installation directory
- Verify the
app/Plugins/folder exists - If missing, create it
- Set permissions to 755 via File Manager or terminal
The easiest way to install plugins is through the built-in marketplace interface.
- Log in to your Leantime instance as an administrator
- Click the Company from the top menu
- Select Leantime Apps in the sidebar
- Select Explore Apps
- Click Learn More to see more about the plugin
- Browse or search for the plugin you need
- Click on the plugin to view details
- Click Get a License, complete the purchase on marketplace.leantime.io.
If you purchased a plugin or bundle:
You will get a license key for each plugin individually and will need to install them separately.
- Return to the Leantime Apps under the Company menu point
- Click "Learn More" from the Plugin you purchased
- Copy and paste the license key from the marketplace (the individual license key) and click Install
- Your purchased plugins will appear and be available for installation
- You can then go to My Apps to complete the installation and enabling of the plugin.
- Find the plugin in your available plugins list
- Click Activate
- Once installed, toggle the Enable switch to activate the plugin
- Some plugins may require additional configuration (see Plugin Configuration below)
For custom plugins, development builds, or plugins not in the marketplace:
Download or create your plugin package. Plugin packages are typically ZIP files containing a folder with the plugin name.
Via SFTP/FTP:
- Connect to your server
- Navigate to
app/Plugins/ - Upload the plugin folder (not the ZIP file—extract first)
Via Command Line:
cd /var/www/html/leantime/app/Plugins
unzip /path/to/PluginName.zip
chown -R www-data:www-data PluginName
chmod -R 755 PluginNameDocker:
# Copy plugin to container
docker cp /path/to/PluginName <container_name>:/var/www/html/app/Plugins/
# Fix permissions
docker exec -it <container_name> chown -R www-data:www-data /var/www/html/app/Plugins/PluginNamecPanel File Manager:
- Upload the ZIP file to
app/Plugins/ - Right-click the ZIP file and select Extract
- Delete the ZIP file after extraction
- Verify the plugin folder structure is correct
A properly structured plugin folder should look like:
app/Plugins/
└── PluginName/
├── composer.json # Required: Plugin metadata
├── register.php # Required: Event/feature registration
├── bootstrap.php # Plugin initialization
├── Controllers/ # Plugin controllers
├── Views/ # Blade templates
├── Language/ # Translation files
└── Services/ # Business logic
The composer.json must include:
{
"name": "vendor/pluginname",
"description": "Plugin description",
"version": "1.0.0",
"type": "leantime-plugin",
"autoload": {
"psr-4": {
"Leantime\\Plugins\\PluginName\\": "/"
}
}
}- Go to Settings → Plugins
- Your manually installed plugin should appear in the list
- Toggle Enable to activate it
Leantime offers plugin bundles for different use cases:
| Bundle | Description |
|---|---|
| Starter | Essential plugins for micro-teams and side projects |
| Team | Productivity toolkit for small teams |
| Business | Comprehensive solution for larger teams |
Bundles include a single license key that unlocks all included plugins. Enter the bundle license key in Settings → Plugins → Enter License Key.
- Go to Settings → Plugins
- Plugins with available updates show an Update button
- Click Update to install the latest version
- Re-enable if the plugin was disabled during update
- Disable the plugin in Settings → Plugins
- Back up the existing plugin folder
- Replace with the new version files
- Clear the cache:
php ./bin/leantime cache:clear - Re-enable the plugin
- Go to Settings → Plugins
- Toggle the plugin to Disabled
- This preserves plugin data in the database
To fully remove a plugin:
- Disable the plugin
- Delete the plugin folder from
app/Plugins/ - (Optional) Remove plugin tables from the database if you don't need the data
Note: Some plugins create database tables. Removing the folder doesn't delete this data, which allows reinstallation without data loss.
Some plugins require additional configuration after installation, typically through environment variables in your config/.env file.
Most plugins follow the pattern:
PLUGINNAME_SETTING=valueCheck the plugin's documentation or marketplace page for specific configuration options.
The Advanced Auth plugin enables Single Sign-On (SSO) through various OAuth/SAML providers. After installing the plugin, add provider credentials to your environment file.
All providers require at least:
{PROVIDER}_CLIENT_ID=your-client-id
{PROVIDER}_CLIENT_SECRET=your-client-secretAdditionally, ensure LEAN_APP_URL is set correctly for OAuth callbacks:
LEAN_APP_URL=https://yourdomain.comThe callback URL for all providers is: yourdomain.com/advancedAuth/callback?driver={provider}
Once provider configuration is added to the environment file, the UI will show a toggle to enable/disable the provider.
AUTHENTIK_BASE_URL=https://your-authentik-instance.com
AUTHENTIK_CLIENT_ID=your-client-id
AUTHENTIK_CLIENT_SECRET=your-client-secretAUTH0_BASE_URL=https://your-tenant.auth0.com
AUTH0_CLIENT_ID=your-client-id
AUTH0_CLIENT_SECRET=your-client-secretGITEA_INSTANCE_URI=https://your-gitea-instance.com
GITEA_CLIENT_ID=your-client-id
GITEA_CLIENT_SECRET=your-client-secretGITHUB_CLIENT_ID=your-client-id
GITHUB_CLIENT_SECRET=your-client-secretGITLAB_CLIENT_ID=your-client-id
GITLAB_CLIENT_SECRET=your-client-secretGOOGLE_CLIENT_ID=your-client-id
GOOGLE_CLIENT_SECRET=your-client-secretKEYCLOAK_CLIENT_ID=your-client-id
KEYCLOAK_CLIENT_SECRET=your-client-secret
KEYCLOAK_BASE_URL=https://your-keycloak-instance.com
KEYCLOAK_REALM=your-realmLARAVELPASSPORT_CLIENT_ID=your-client-id
LARAVELPASSPORT_CLIENT_SECRET=your-client-secret
LARAVELPASSPORT_HOST=https://your-passport-server.comMICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_CLIENT_SECRET=your-client-secret
MICROSOFT_TENANT_ID=common
# Optional settings
MICROSOFT_PROXY=
MICROSOFT_TENANT_FIELDS=[]
MICROSOFT_INCLUDE_AVATAR=trueAZURE_CLIENT_ID=your-client-id
AZURE_CLIENT_SECRET=your-client-secret
AZURE_TENANT_ID=your-tenant-id
# Optional
AZURE_PROXY=OKTA_BASE_URL=https://your-org.okta.com
OKTA_CLIENT_ID=your-client-id
OKTA_CLIENT_SECRET=your-client-secretPROPELAUTH_CLIENT_ID=your-client-id
PROPELAUTH_CLIENT_SECRET=your-client-secret
PROPELAUTH_AUTH_URL=https://your-propelauth-url.comEDUID_CLIENT_ID=your-client-id
EDUID_CLIENT_SECRET=your-client-secret
EDUID_USE_TEST_IDP=falseAPP.NET_KEY=your-key
APP.NET_SECRET=your-secretAll file paths are relative to the Leantime root directory.
# Required
SAML2_METADATA=/path/to/metadata.xml
SAML2_ENTITY_ID=your-entity-id
SAML2_ACS=https://yourdomain.com/advancedAuth/callback?driver=saml2
SAML2_CERTIFICATE=/path/to/certificate.pem
SAML2_ATTRIBUTE_MAP={"email": "email", "name": "displayName"}
# Optional validation settings
SAML2_VALIDATION_CLOCK_SKEW=120
SAML2_VALIDATION_REPEATED_ID_TTL=31536000
# Service Provider settings (optional)
SAML2_SP_CERTIFICATE=/path/to/sp-certificate.pem
SAML2_SP_PRIVATE_KEY=/path/to/sp-private-key.pem
SAML2_SP_PRIVATE_KEY_PASSPHRASE=
SAML2_SP_SIGN_ASSERTIONS=false
SAML2_SP_ENTITY_ID=your-sp-entity-id
# SP contact information (optional)
SAML2_SP_TECH_CONTACT_SURNAME=Admin
SAML2_SP_TECH_CONTACT_GIVENNAME=IT
SAML2_SP_TECH_CONTACT_EMAIL=admin@yourdomain.com
SAML2_SP_ORG_LANG=en
SAML2_SP_ORG_NAME=Your Organization
SAML2_SP_ORG_DISPLAY_NAME=Your Organization
SAML2_SP_ORG_URL=https://yourdomain.comCheck folder structure:
ls -la app/Plugins/PluginName/Ensure composer.json exists at the root of the plugin folder.
Check permissions:
# The web server user must own the files
sudo chown -R www-data:www-data app/Plugins/
sudo chmod -R 755 app/Plugins/Clear cache:
php ./bin/leantime cache:clearVolume not mounted:
Check your docker-compose.yml includes the Plugins volume:
volumes:
- plugins:/var/www/html/app/PluginsRestart with:
docker-compose down
docker-compose up -dPermission issues:
docker exec -it <container_name> chown -R www-data:www-data /var/www/html/app/PluginsThis indicates the Plugins folder is not properly mounted as a volume. Without a volume mount, container data is ephemeral.
- Stop the container
- Update
docker-compose.ymlto mount the Plugins volume - Reinstall plugins after restarting
- Ensure you're entering the key exactly as received (no extra spaces)
- Check your Leantime version is compatible with the plugin
- Verify your instance can reach
marketplace.leantime.io(check firewall/proxy settings) - Contact support if the issue persists
- Disable the plugin immediately via Settings → Plugins
- If you can't access Settings, disable via database:
UPDATE zp_plugins SET enabled = 0 WHERE foldername = 'PluginName';- Clear cache:
php ./bin/leantime cache:clear - Check
storage/logs/leantime-*.logfor error details - Verify PHP version compatibility (most plugins require PHP 8.0+)
If you upgraded from Leantime 2.x to 3.x and have plugin issues:
- The
zp_pluginstable may have additional columns in 3.x - Run database migrations: navigate to
yourdomain.com/update - Or manually add missing columns:
ALTER TABLE zp_plugins ADD COLUMN license TEXT;
ALTER TABLE zp_plugins ADD COLUMN format VARCHAR(45);- Verify
LEAN_APP_URLmatches your actual domain exactly (including https://) - Check the callback URL in your identity provider settings:
- Format:
https://yourdomain.com/advancedAuth/callback?driver={provider}
- Format:
- Ensure
LEAN_SESSION_SECURE=trueonly if using HTTPS - For SAML: verify certificate paths are correct and files are readable by the web server
- Verify environment variables are set correctly (check for typos)
- Restart your web server or PHP-FPM after changing
.env - Clear cache:
php ./bin/leantime cache:clear - Check that both
CLIENT_IDandCLIENT_SECRETare set for the provider
- Community Forum: community.leantime.io
- Discord: Leantime Discord
- Plugin Support: Paid plugins include support via marketplace.leantime.io
- Bug Reports: GitHub Issues