Skip to content

Conversation

@jimallen
Copy link

Summary

This PR adds the ability for plugins to provide custom tabs in DankDash, enabling plugin authors to create rich, integrated experiences within the shell's dashboard.

Features

  • New dashtab plugin type - Standalone tab plugins that only provide a DankDash tab
  • tabComponent manifest field - Widget plugins can now also provide a DankDash tab alongside their DankBar widget
  • Dynamic tab loading - Plugin tabs are automatically added/removed when plugins are enabled/disabled
  • Tab positioning - Plugins can specify tabPosition: "start" or "end" to control placement
  • Customizable appearance - tabName and tabIcon fields for tab bar display

Plugin Manifest Examples

Standalone tab plugin:

{
    "id": "myTab",
    "name": "My Tab",
    "type": "dashtab",
    "tabIcon": "dashboard",
    "component": "./MyTab.qml"
}

Widget plugin with optional tab:

{
    "id": "myWidget",
    "name": "My Widget", 
    "type": "widget",
    "component": "./MyWidget.qml",
    "tabComponent": "./MyTab.qml",
    "tabName": "My Tab",
    "tabIcon": "star"
}

Changes

QML (quickshell/):

  • Services/PluginService.qml - Added pluginDashTabComponents, tab component loading/unloading, getDashTabPlugins() function
  • Modules/DankDash/DankDashPopout.qml - Dynamic plugin tab rendering with proper index management

Go (core/):

  • internal/plugins/manager.go - Extended pluginManifest struct with tab fields and helper methods
  • internal/plugins/manager_test.go - Added comprehensive tests for tab manifest parsing

Documentation:

  • docs/PLUGINS.md - New plugin system documentation including tab plugin examples

Test Plan

  • make fmt - Code formatted
  • make test - All tests pass (including new tab manifest tests)
  • go mod tidy - Dependencies clean
  • Manual testing with a plugin that provides a tab component

🤖 Generated with Claude Code

Jim Allen and others added 2 commits December 23, 2025 12:03
Allow plugins to provide custom tabs in DankDash via:
- New `dashtab` plugin type for tab-only plugins
- `tabComponent` manifest field for widget plugins to also provide tabs
- Plugin tabs appear after builtin tabs, before Settings

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Initialize pluginTabs as an empty array and populate it on component completion.
- Adjust pluginTabStartIndex to account for weather settings.
- Refactor stack index calculations for plugin tabs to enhance readability and maintainability.

Also, update .gitignore to include bmad files and core/dms directory.
@bbedward
Copy link
Collaborator

This is flawed for a few reasons

  1. No reason to change the plugin manager at all, it doesn't care about the contents besides for managing the plugins, the shell/qml side is the parser
  2. Tab metadata like the name and icon don't belong in the manifest they belong in a Plugin component (like DesktopPluginComponent)
  3. The dash itself is not customizable at all, that would probably be a pre requisite to plugins at all

I also wonder what kind of dash plugins are wanted at all, that wouldn't fit into the bar or control center. The dash is a special case where those 3 bar widgets have special behaviors when clicked unlike normal stuff - so there's a lot more to consider if there were plugins in general for it

@jimallen
Copy link
Author

@bbedward - Thanks for the feedback. I really appreciate it.

I am trying to build a meeting joining widget, that shows a list of meetings to join. I am guessing you're recommend a separate dropdown instead of the dash?

Love the work, thanks for sharing it!

@jimallen jimallen closed this Dec 29, 2025
@jimallen jimallen deleted the feature/plugin-tabs branch December 29, 2025 17:33
@jimallen
Copy link
Author

Thanks for the feedback @bbedward! You're right on all points.

I've refactored the MeetingWidget to use the existing popoutContent pattern instead of trying to add a DankDash tab. The widget now:

  • Shows next meeting in the bar with countdown
  • Opens a popout dropdown on click with the full meeting list
  • Follows the PluginComponent architecture (like EmojiWidget)

This approach works great for my use case and doesn't require any changes to DMS core.

Appreciate the guidance!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants