Plugin development
Create custom plugins to extend tinct's functionality.
Overview
Tinct's plugin architecture lets you:
- Input plugins: Add new colour sources (APIs, file formats, devices)
- Output plugins: Generate configs for any application or device
Plugins can be written in any language using the JSON-stdio protocol, or in Go using the high-performance go-plugin RPC protocol.
Getting started
-
Choose a protocol
- JSON-stdio - Any language, simple to implement
- Go-plugin RPC - Go only, better performance
-
Create your plugin
-
Add lifecycle hooks (optional)
- PreExecute - Validate environment
- PostExecute - Reload configs
-
Publish your plugin
Plugin types
Input plugins
Input plugins provide colour palettes to tinct. They receive configuration and return a palette:
┌─────────────┐ config ┌──────────────┐ palette ┌─────────┐
│ tinct │ ───────────▶ │ input plugin │ ───────────▶ │ tinct │
└─────────────┘ └──────────────┘ └─────────┘
Examples: image extraction, AI generation, remote API fetching
Output plugins
Output plugins receive a palette and generate configuration files:
┌─────────────┐ palette ┌───────────────┐ files ┌─────────┐
│ tinct │ ───────────▶ │ output plugin │ ───────────▶ │ disk │
└─────────────┘ └───────────────┘ └─────────┘
Examples: terminal configs, desktop themes, LED controllers
Plugin naming
Follow this naming convention:
tinct-{type}-{name}
Examples:
tinct-input-spotify- Input plugin for Spotify album arttinct-output-wled- Output plugin for WLED LED stripstinct-output-openrgb- Output plugin for OpenRGB
Installation paths
Plugins are discovered from:
~/.config/tinct/plugins/- User plugins (highest priority)~/.local/share/tinct/plugins/- Installed from repositories- System paths defined by
$TINCT_PLUGIN_PATH
Quick example
A minimal shell script output plugin:
#!/bin/bash
# tinct-output-example
if [[ "$1" == "--plugin-info" ]]; then
echo '{"name":"example","type":"output","version":"1.0.0","protocol_version":"0.0.1","description":"Example plugin","plugin_protocol":"json-stdio"}'
exit 0
fi
# Read palette, extract background colour, write config
jq -r '"background=\(.colours.background.hex)"' > ~/.config/myapp/theme.conf
Next steps
- Protocol details - Understand communication
- Creating plugins - Full examples
- Lifecycle hooks - Advanced control