Skip to main content

Contributing to the Registry

██████╗ ███████╗ ██████╗ ██╗███████╗████████╗██████╗ ██╗   ██╗
██╔══██╗██╔════╝██╔════╝ ██║██╔════╝╚══██╔══╝██╔══██╗╚██╗ ██╔╝
██████╔╝█████╗  ██║  ███╗██║███████╗   ██║   ██████╔╝ ╚████╔╝
██╔══██╗██╔══╝  ██║   ██║██║╚════██║   ██║   ██╔══██╗  ╚██╔╝
██║  ██║███████╗╚██████╔╝██║███████║   ██║   ██║  ██║   ██║
╚═╝  ╚═╝╚══════╝ ╚═════╝ ╚═╝╚══════╝   ╚═╝   ╚═╝  ╚═╝   ╚═╝

Thank you for contributing to the DankMaterialShell registry! This guide covers how to submit plugins and themes to the dms-plugin-registry repository.

Contributing a Plugin

How to Add Your Plugin

  1. Fork the repository

  2. Create a new JSON file in the plugins/ directory:

    plugins/{github-username}-{plugin-name}.json
    • Use lowercase letters
    • Separate words with hyphens
    • Examples: daniel-42-z-powerusage.json, rochacbruno-worldclock.json
  3. Fill in your plugin information using this schema:

{
"id": "pluginId",
"name": "PluginName",
"capabilities": ["dankbar-widget"],
"category": "monitoring",
"repo": "https://github.com/yourusername/your-plugin-repo",
"path": "optional/path/in/monorepo",
"author": "Your Name",
"description": "Brief description of what your plugin does",
"dependencies": ["dependency1", "dependency2"],
"compositors": ["niri", "hyprland"],
"distro": ["any"],
"screenshot": "https://url/to/screenshot.png"
}

Plugin Field Descriptions

FieldRequiredDescription
idYesUnique identifier in camelCase (e.g., worldClock). Must match your plugin.json
nameYesDisplay name. Must match your plugin.json
capabilitiesYesArray like ["dankbar-widget"]
categoryYesOne of: monitoring, utilities, appearance, system, etc.
repoYesFull GitHub URL to your plugin repository
pathNoSubdirectory path if plugin is in a monorepo
authorYesYour name or GitHub username
descriptionYesClear, concise description of the plugin's purpose
dependenciesYesArray of dependencies, use [] if none
compositorsYesSupported compositors: ["niri", "hyprland"], ["any"]
distroYesSupported distributions: ["any"], ["fedora"], ["arch"], etc.
screenshotNoDirect URL to a screenshot image
Important

The id and name fields must exactly match the corresponding fields in your plugin repository's plugin.json file.

  1. Validate your plugin locally:
python3 .github/generate.py --validate
python3 .github/validate_links.py
  1. Submit a Pull Request

Contributing a Theme

How to Add Your Theme

  1. Fork the repository

  2. Create a new folder in the themes/ directory:

    themes/{theme-id}/theme.json
    • Use lowercase letters and hyphens for the folder name
    • Examples: tokyonight/, gruvbox-dark/, catppuccin-mocha/
  3. Create your theme.json with this schema:

{
"id": "themeId",
"name": "Theme Name",
"version": "1.0.0",
"author": "Your Name",
"description": "Brief description of your theme",
"dark": {
"primary": "#7aa2f7",
"primaryText": "#16161e",
"primaryContainer": "#7dcfff",
"secondary": "#bb9af7",
"surface": "#1a1b26",
"surfaceText": "#73daca",
"surfaceVariant": "#2f3549",
"surfaceVariantText": "#cbccd1",
"surfaceTint": "#7aa2f7",
"background": "#16161e",
"backgroundText": "#d5d6db",
"outline": "#787c99",
"surfaceContainer": "#2f3549",
"surfaceContainerHigh": "#444b6a",
"error": "#f7768e",
"warning": "#ff9e64",
"info": "#7dcfff"
},
"light": {
"primary": "#2e7de9",
"primaryText": "#d0d5e3",
"primaryContainer": "#007197",
"secondary": "#9854f1",
"surface": "#e1e2e7",
"surfaceText": "#387068",
"surfaceVariant": "#c4c8da",
"surfaceVariantText": "#1a1b26",
"surfaceTint": "#2e7de9",
"background": "#cbccd1",
"backgroundText": "#1a1b26",
"outline": "#4c505e",
"surfaceContainer": "#dfe0e5",
"surfaceContainerHigh": "#9699a3",
"error": "#f52a65",
"warning": "#b15c00",
"info": "#007197"
}
}

Theme Metadata Fields

FieldRequiredDescription
idYesUnique identifier in camelCase (e.g., tokyoNight, gruvboxDark)
nameYesDisplay name of your theme
versionYesSemver version (e.g., 1.0.0)
authorYesYour name or username
descriptionYesBrief description of the theme

Theme Color Fields

Both dark and light objects require these color properties:

FieldDescription
primaryPrimary accent color
primaryTextText color on primary backgrounds
primaryContainerContainer using primary color
secondarySecondary accent color
surfaceMain surface/card background
surfaceTextText on surfaces
surfaceVariantAlternative surface color
surfaceVariantTextText on variant surfaces
surfaceTintTint overlay color
backgroundApp background color
backgroundTextText on background
outlineBorder/divider color
surfaceContainerContainer background
surfaceContainerHighElevated container background
errorError state color
warningWarning state color
infoInfo state color

For more details on how these colors are used, see Custom Themes.

  1. Validate your theme locally:
python3 .github/validate_themes.py
python3 .github/generate.py --validate
  1. Submit a Pull Request
    • Commit only your theme.json file (previews are auto-generated)
    • A preview will be generated and posted as a comment on your PR
    • After merge, the preview SVG will be committed automatically

Guidelines

For Plugins

  • Keep descriptions concise and informative
  • Ensure your repository has proper documentation
  • Test that your plugin works with the specified compositors and distros
  • Include a screenshot when possible

For Themes

  • All color values must be 6-digit hex codes (e.g., #7aa2f7)
  • Both dark and light variants are required
  • The id must be camelCase (starts lowercase, alphanumeric only)
  • Version must follow semver format (X.Y.Z)
  • Test your colors for readability and contrast

Questions?

If you have questions about the contribution process, please open an issue in the registry repository.