Community-driven registry for Time Tracker application plugins. This repository maintains a list of available plugins that can be discovered and installed through the Time Tracker Marketplace.
- Total Plugins: See registry.json for current counts
- Registry: registry.json is automatically built from
plugins/by CI after PRs are merged
The registry uses a folder-based structure where each plugin has its own directory in plugins/. The registry.json file is automatically generated from these individual plugin files. The Time Tracker application uses this registry to:
- Discover available plugins
- Display plugin information in the Marketplace UI
- Verify plugin compatibility
- Track plugin popularity
Plugins use a hierarchical structure partitioned by the first letter of the author name, then author, plugin id, and version:
plugins/
βββ d/ # First letter of normalized author
β βββ developer-name/
β βββ example-plugin/
β βββ 1.0.0/
β β βββ plugin.json # Plugin metadata for this version
β β βββ README.md # Optional
β βββ 1.1.0/
β βββ plugin.json
βββ j/
β βββ john-doe/
β βββ jira-integration/
β βββ 1.0.0/
β βββ plugin.json
βββ ...
Path rule: plugins/{first-letter}/{normalized-author}/{plugin-id}/{version}/plugin.json
Important:
- First letter is the first character of the normalized author name (e.g.
developer-nameβd). - Normalized author: lowercase, spaces β hyphens, special characters removed.
- Plugin directory name must match the
idfield inplugin.json. - Version directory must be semver (e.g.
1.0.0). Multiple versions per plugin are supported. - The
authorfield inplugin.jsonis required and must normalize to the author directory name.
The registry.json file is automatically built from these plugin files by CI (latest version per plugin is used).
Each plugin's plugin.json follows the schema defined in schemas/manifest.schema.json. Each plugin entry includes:
- id: Unique identifier (lowercase, alphanumeric with hyphens)
- name: Display name
- author: Plugin author
- repository: GitHub repository URL
- latest_version: Latest available version (semver)
- description: Plugin description
- category: Plugin category (integration, productivity, reporting, etc.)
- verified: Whether verified by registry maintainers
- downloads: Total download count
- tags: Searchable tags
- icon: URL to plugin icon
- homepage: Plugin homepage URL
- license: Plugin license (SPDX identifier)
- min_core_version: Minimum required Time Tracker version
- max_core_version: Maximum compatible Time Tracker version
- api_version: Plugin API version
Step 1: Fork and Clone
# 1. Fork this repository on GitHub (click "Fork" button)
# 2. Clone your fork:
git clone https://github.com/your-username/plugins-registry.git
cd plugins-registryStep 2: Create Plugin Entry
Option A: Interactive Script (Easiest)
npm install
npm run create-pluginThe script will guide you through everything and create the correct structure automatically.
Option B: Manual Creation
- Create directory:
plugins/{first-letter}/{author}/{plugin-id}/{version}/- Example:
plugins/j/john-doe/jira-integration/1.0.0/
- Example:
- Create
plugin.jsonfile in that directory (see example below)
Step 3: Submit Pull Request
git add plugins/j/john-doe/jira-integration/1.0.0/plugin.json
git commit -s -m "Add plugin: jira-integration"
git push origin main
# Then create a Pull Request on GitHubThat's it! CI will automatically validate your plugin and build the registry after your PR is merged.
Author: John Doe
Plugin ID: jira-integration
Version: 1.0.0
1. Create the directory:
mkdir -p plugins/j/john-doe/jira-integration/1.0.02. Create plugins/j/john-doe/jira-integration/1.0.0/plugin.json:
{
"$schema": "https://github.com/tmtrckr/plugins-registry/schemas/manifest.schema.json",
"id": "jira-integration",
"name": "Jira Integration",
"author": "John Doe",
"repository": "https://github.com/johndoe/jira-integration",
"latest_version": "1.0.0",
"description": "Sync time entries with Jira tickets",
"category": "integration",
"verified": false,
"downloads": 0,
"tags": ["jira", "sync", "integration"],
"license": "MIT",
"min_core_version": "0.3.0",
"max_core_version": "1.0.0",
"api_version": "1.0"
}3. Commit and create PR:
git add plugins/j/john-doe/jira-integration/1.0.0/plugin.json
git commit -s -m "Add plugin: jira-integration"
git pushThe path follows this pattern: plugins/{first-letter}/{author}/{plugin-id}/{version}/
Visual Example:
plugins/
βββ j/ β First letter of "john-doe"
βββ john-doe/ β Normalized author name
βββ jira-integration/ β Plugin ID
βββ 1.0.0/ β Version
βββ plugin.json β Your plugin file
How to determine each part:
| Part | How to Get It | Example |
|---|---|---|
| First letter | First character of normalized author | "John Doe" β "john-doe" β j |
| Author | Normalize: lowercase, spacesβhyphens | "John Doe" β john-doe |
| Plugin ID | Your plugin identifier (lowercase, hyphens) | jira-integration |
| Version | Semantic version number | 1.0.0 |
idinplugin.jsonmust match the plugin directory nameauthorinplugin.jsonmust normalize to the author directory namelatest_versionmust match the version directory name
π‘ Need help? See CONTRIBUTING.md for detailed instructions and FAQ.
- Plugin must be hosted on GitHub
- Repository must have a
plugin.tomlmanifest file - Plugin must follow the Plugin Template structure
- Plugin must have at least one GitHub Release with compiled binaries
For a plugin with author "Developer Name" and ID "example-plugin":
Directory structure:
plugins/
d/ # First letter of normalized author
developer-name/
example-plugin/ # Plugin ID
1.0.0/ # Version (semver)
plugin.json
plugin.json:
{
"$schema": "https://github.com/tmtrckr/plugins-registry/schemas/manifest.schema.json",
"id": "example-plugin",
"name": "Example Plugin",
"author": "Developer Name",
"repository": "https://github.com/user/plugin-example",
"latest_version": "1.0.0",
"description": "This is an example plugin for the Time Tracker plugins registry",
"category": "integration",
"verified": false,
"downloads": 0,
"tags": ["example", "plugin", "time-tracker"],
"license": "MIT",
"min_core_version": "0.3.0",
"max_core_version": "1.0.0",
"api_version": "1.0"
}Note: The author field "Developer Name" normalizes to "developer-name"; the first letter is d, so the path is plugins/d/developer-name/example-plugin/1.0.0/.
The registry is validated against schemas/registry.schema.json (which references schemas/manifest.schema.json for plugin entries) and the hierarchical layout:
- All required fields are present (including
author) - Field formats are correct (URLs, versions, etc.)
- No duplicate
{author}/{plugin-id}combinations - Path is
plugins/{letter}/{author}/{plugin-id}/{version}/with semver version - Author and plugin directory names match normalized author and
idfromplugin.json - Repository URLs are valid GitHub repositories
Plugins can be marked as verified: true by registry maintainers after:
- Code review of the plugin repository
- Verification of plugin.toml manifest
- Testing plugin installation and functionality
- Confirming license compatibility
The Time Tracker application discovers plugins through:
- Registry: Plugins listed in this registry (default)
- Direct URL: Users can install plugins directly by providing a GitHub repository URL
- Search: Search functionality filters plugins by name, description, tags, and category
- Registry version follows semantic versioning
- Plugin versions follow semantic versioning
- Registry updates are tracked via
last_updatedtimestamp
Note: This section covers commands for repository maintainers. Plugin contributors don't need to run any commands locally - CI handles validation and registry building automatically.
npm installUse the interactive script to create a new plugin entry:
npm run create-pluginThis will guide you through all required fields and create the correct directory structure.
Note: Plugin contributors don't need to build the registry - CI does this automatically. The commands below are for repository maintainers.
Build registry.json from individual plugin files:
npm run buildNote: The build script generates/updates registry.json. Use npm run validate to check an existing registry.json without modifying it.
For plugin contributors: CI automatically validates your plugin.json when you submit a PR. No local validation is required.
For repository maintainers: Full validation commands:
npm run validate-schemasValidate individual plugin files:
npm run validate-pluginsValidate the aggregated registry (requires registry.json to exist - run npm run build first):
npm run validateValidate existing files (schemas, plugins, and registry.json if present):
npm run validate-filesThis runs: validate-schemas β validate-plugins β validate (skips registry validation if registry.json doesn't exist). Note: This does not build the registry - run npm run build first if you need to generate registry.json.
Check for duplicate plugin IDs:
npm run check-duplicatesFormat the registry (sorts plugins and updates timestamp):
npm run formatInstall pre-commit hooks to automatically validate plugins before committing:
npm run install-hooksThis will validate plugin files before each commit. CI handles registry building automatically, so this is optional.
See plugins/d/developer-name/example-plugin/1.0.0/plugin.json for a complete example.
- CONTRIBUTING.md β How to add a plugin and contribute
- SECURITY.md β Security policy and reporting
- CODE_OF_CONDUCT.md β Community standards
- GOVERNANCE.md β Roles and decision making
- docs/COMMUNITY.md β GitHub Discussions and community channels
Contributions are welcome! Please:
- Follow the JSON schema
- Ensure all URLs are valid
- Provide clear descriptions
- Use appropriate categories and tags
- Sign off commits (DCO):
git commit -s -m "message"(requires valid email - see CONTRIBUTING.md)
- Add a Plugin: Use
npm run create-plugin(afternpm install) or follow the manual process - Request a Plugin: Create an issue using the plugin submission template
- Report Issues: Open an issue for bugs or features
- Improve Documentation: Submit PRs to improve docs
See CONTRIBUTING.md for detailed contribution guidelines.
This registry is maintained by the Time Tracker community. Plugin entries are provided by plugin authors and are subject to their respective licenses.
- Use GitHub Discussions for questions and ideas (enable in repo Settings β Features if not yet available).
- See docs/COMMUNITY.md for maintainer setup and channels.
- Time Tracker App - Main application
- Plugin Template - Template for creating plugins