Bumps the npm_and_yarn group with 1 update in the /packages/plugin-dev/ai-productivity-prompts directory: [glob](https://github.com/isaacs/node-glob). Bumps the npm_and_yarn group with 1 update in the /packages/plugin-dev/boilerplate-solid-js directory: [glob](https://github.com/isaacs/node-glob). Bumps the npm_and_yarn group with 1 update in the /packages/plugin-dev/procrastination-buster directory: [glob](https://github.com/isaacs/node-glob). Bumps the npm_and_yarn group with 1 update in the /packages/plugin-dev/sync-md directory: [glob](https://github.com/isaacs/node-glob). Updates `glob` from 10.4.5 to 10.5.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) Updates `glob` from 10.4.5 to 10.5.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) Updates `glob` from 10.4.5 to 10.5.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) Updates `glob` from 10.4.5 to 10.5.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.5...v10.5.0) --- updated-dependencies: - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] <support@github.com> |
||
|---|---|---|
| .. | ||
| ai-productivity-prompts | ||
| api-test-plugin | ||
| boilerplate-solid-js | ||
| procrastination-buster | ||
| scripts | ||
| sync-md | ||
| yesterday-tasks-plugin | ||
| .gitignore | ||
| package-lock.json | ||
| package.json | ||
| QUICK_START.md | ||
| README.md | ||
Super Productivity Plugin Development
This directory contains tools and examples for developing plugins for Super Productivity.
Quick Commands
# Build all plugins
npm run build
# Install dependencies for all plugins
npm run install:all
# Clean build artifacts
npm run clean:dist
# List available plugins
npm run list
Getting Started
Prerequisites
- Node.js 18 or higher
- npm or yarn
- TypeScript knowledge (recommended)
Quick Start
-
Copy the example plugin:
cp -r example-plugin my-plugin cd my-plugin -
Install dependencies:
npm install -
Update plugin metadata:
- Edit
manifest.jsonwith your plugin details - Update
package.jsonwith your plugin name and description
- Edit
-
Start development:
npm run dev -
Build for production:
npm run build
Project Structure
my-plugin/
├── package.json # NPM package configuration
├── tsconfig.json # TypeScript configuration
├── webpack.config.js # Build configuration
├── manifest.json # Plugin manifest (metadata)
├── src/
│ └── index.ts # Main plugin code
├── assets/
│ ├── index.html # Optional UI (for iframe plugins)
│ └── icon.svg # Plugin icon
├── scripts/
│ └── package.js # Script to create plugin.zip
└── dist/ # Build output
├── plugin.js # Compiled plugin code
├── manifest.json # Copied manifest
└── plugin.zip # Packaged plugin
Development Workflow
1. Local Development
For rapid development within the Super Productivity repo:
# Build and install to local Super Productivity
npm run install-local
# This copies your built plugin to:
# ../../../src/assets/my-plugin/
Then run Super Productivity in development mode to test your plugin.
2. Watch Mode
Keep the plugin building automatically as you make changes:
npm run dev
3. Type Checking
Ensure your code is type-safe:
npm run typecheck
4. Linting
Check code quality:
npm run lint
Plugin API
The plugin receives a global PluginAPI object with these capabilities:
Configuration
cfg- Current app configuration (theme, platform, version)
UI Integration
registerMenuEntry()- Add menu itemsregisterHeaderButton()- Add header buttonsregisterSidePanelButton()- Add side panel buttonsregisterShortcut()- Register keyboard shortcutsshowIndexHtmlAsView()- Display plugin UI
Data Access
getTasks()- Get all tasksgetArchivedTasks()- Get archived tasksgetCurrentContextTasks()- Get current project/tag tasksupdateTask()- Update a taskaddTask()- Create new taskgetAllProjects()- Get all projectsgetAllTags()- Get all tags
User Interaction
showSnack()- Display snack bar notificationsnotify()- Show system notificationsopenDialog()- Open custom dialogs
Data Persistence
persistDataSynced()- Save plugin dataloadSyncedData()- Load saved data
Hooks
Register handlers for lifecycle events:
taskComplete- Task marked as donetaskUpdate- Task modifiedtaskDelete- Task removedcurrentTaskChange- Active task changedfinishDay- End of day
Example Usage
// Register a task complete handler
PluginAPI.registerHook('taskComplete', async (task) => {
console.log('Task completed:', task);
PluginAPI.showSnack({
msg: `Great job completing: ${task.title}`,
type: 'SUCCESS',
});
});
// Add a keyboard shortcut
PluginAPI.registerShortcut({
id: 'my-action',
label: 'My Plugin Action',
onExec: async () => {
const tasks = await PluginAPI.getTasks();
console.log(`You have ${tasks.length} tasks`);
},
});
Building for Distribution
1. Create Plugin Package
npm run build
npm run package
This creates dist/plugin.zip ready for distribution.
2. File Size Limits
- Plugin ZIP: 50MB maximum
- Plugin code (plugin.js): 10MB maximum
- Manifest: 100KB maximum
- index.html: 100KB maximum
3. Required Files
Your plugin ZIP must contain:
manifest.json- Plugin metadataplugin.js- Main plugin code
Optional files:
index.html- UI for iframe pluginsicon.svg- Plugin icon
Publishing Your Plugin
GitHub Release (Recommended)
- Create a GitHub repository for your plugin
- Use GitHub Actions to build releases:
name: Build Plugin
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: npm ci
- run: npm run build
- run: npm run package
- uses: softprops/action-gh-release@v1
with:
files: dist/plugin.zip
- Users can download the
.zipfile from your releases
NPM Package
You can also publish your plugin source to npm:
- Update
package.jsonwith your npm scope - Build your plugin:
npm run build - Publish:
npm publish
Users would need to build it themselves or you can include the built files.
Testing Your Plugin
1. In Development Mode
# Build your plugin
npm run build
# Copy to Super Productivity assets
npm run install-local
# Run Super Productivity in dev mode
cd ../../.. && npm start
2. In Production Build
- Build your plugin:
npm run package - Open Super Productivity
- Go to Settings → Plugins
- Click "Upload Plugin"
- Select your
plugin.zipfile
3. Debugging
- Open browser DevTools to see console logs
- Check the Console for plugin errors
- Use
console.log()in your plugin code - The plugin runs in the main window context
TypeScript Development
Benefits
- Type Safety: Full IntelliSense and compile-time checking
- API Discovery: Auto-complete for all PluginAPI methods
- Refactoring: Safe code refactoring with TypeScript
- Documentation: Inline documentation in your IDE
Example with Types
import type { TaskData, ProjectData } from '@super-productivity/plugin-api';
// Type-safe task handling
async function processTask(task: TaskData): Promise<void> {
if (task.projectId) {
const projects = await PluginAPI.getAllProjects();
const project = projects.find((p) => p.id === task.projectId);
if (project) {
console.log(`Task "${task.title}" belongs to project "${project.title}"`);
}
}
}
// Type-safe hook registration
PluginAPI.registerHook('taskUpdate', (data: unknown) => {
const task = data as TaskData;
processTask(task);
});
Best Practices
- Error Handling: Always wrap async operations in try-catch
- Performance: Don't block the main thread with heavy computations
- State Management: Use
persistDataSynced()for plugin state - User Experience: Provide clear feedback with snack messages
- Permissions: Only request permissions you actually need
- Version Compatibility: Set appropriate
minSupVersion
Troubleshooting
Plugin not loading
- Check browser console for errors
- Verify manifest.json is valid JSON
- Ensure all required fields are present
- Check file size limits
TypeScript errors
- Run
npm run typecheckto see all errors - Ensure
@super-productivity/plugin-apiis installed - Check tsconfig.json settings
Build issues
- Delete
dist/and rebuild - Check webpack.config.js for errors
- Ensure all dependencies are installed
Examples
Available Examples
- minimal-plugin - The simplest possible plugin (10 lines)
- simple-typescript-plugin - TypeScript with minimal tooling
- example-plugin - Full featured example with webpack
- procrastination-buster - SolidJS plugin with modern UI
Example Features
example-plugin demonstrates:
- TypeScript setup with webpack
- All API methods
- iframe UI integration
- State persistence
- Hook handling
- Build configuration
procrastination-buster demonstrates:
- SolidJS for reactive UI
- Vite for fast builds
- Modern component architecture
- Plugin-to-iframe communication
- Real-world use case
Support
- GitHub Issues: Super Productivity Issues
- Plugin API Docs: See
packages/plugin-api/README.md