A plugin for camera.ui that allows you to extend the functionality of your camera system.
- Make sure you have Node.js 20.x or later installed
- Install dependencies as described below
Install Node dependencies:
npm install
For Python plugins, also install Python dependencies:
pip install -r requirements.txt
pip install -r requirements.dev.txt
Note: Create a virtual environment for Python plugins to avoid conflicts with system packages.
Open the package.json
and customize the following attributes:
-
name
- Must be prefixed withcamera-ui-
or@username/camera-ui-
(e.g.,camera-ui-motion
or@john/camera-ui-motion
) -
displayName
- The user-friendly name shown in the camera.ui interface -
description
- A short description of your plugin's functionality -
author
- Your name and email address -
homepage
- Link to your plugin's README.md -
repository.url
- Link to your GitHub repository -
bugs.url
- Link to your GitHub issues page
Set private
to false
when you're ready to publish.
The plugin configuration is defined in config.schema.json
. This schema defines the configuration options available to users.
Example schema:
{
"schema": {
"items": {
"type": "object",
"title": "Remove Models",
"opened": true,
"properties": {
"model": {
"type": "string",
"title": "Model",
"description": "Model to use for object detection",
"required": true,
"store": false,
"defaultValue": "yolov9m_320 - FP16",
"enum": [
"yolo3-tinyu - INT8",
"yolo3-tinyu_320 - INT8",
"yolo3-tinyu - FP16",
"yolo3-tinyu_320 - FP16",
"yolov5nu - INT8",
"yolov5nu_320 - INT8",
"yolov5mu - INT8",
"yolov5mu_320 - INT8"
]
}
},
"buttons": [
{
"label": "Remove",
"onSubmit": "onRemove"
}
]
}
}
}
To create a production bundle of your plugin:
npm run bundle
This will:
- Run code quality checks (if enabled)
- Build the source code
- Copy required files
- Create a distributable bundle.zip
The bundled plugin will be available in the bundle
directory.
// TODO
The main entry point is src/index.ts
(or src/index.js
). Here you can define your plugin's functionality:
import type { BasePlugin, LoggerService, PluginAPI } from '@camera.ui/types';
export default class SamplePlugin implements BasePlugin {
constructor(logger: LoggerService, api: PluginAPI) {
...
}
}
The main entry point is src/main.py
. Example:
from camera_ui_python_types import (
BasePlugin,
LoggerService,
PluginAPI,
)
class SamplePlugin(BasePlugin):
def __init__(self, logger: LoggerService, api: PluginAPI):
...
def __main__():
return SamplePlugin
When your plugin is ready for release:
- Make sure all tests pass and the bundle builds successfully
- Choose the appropriate publishing command:
# For alpha releases npm run publish:alpha # For beta releases npm run publish:beta # For stable releases npm run publish:latest
The CLI will guide you through version selection and publishing.
-
Version Management
- Use semantic versioning (MAJOR.MINOR.PATCH)
- Start with alpha/beta releases for testing
- Document breaking changes
-
Code Quality
- Enable and use the provided linting tools
- Write clear documentation
- Include usage examples
-
Configuration
- Provide sensible defaults
- Validate user input
- Document all options
-
Testing
- Test with different camera.ui versions
- Verify all configuration options
- Test error handling
-
Performance
- Minimize dependencies
- Optimize resource usage
- Handle cleanup properly