Plugins & Integrations
Synaplan uses a non-invasive plugin architecture. Plugins live under plugins/ in the main repo, store data in generic shared tables, and expose their own API endpoints — no modifications to core Synaplan code are required.
Available Plugins
SortX — AI Document Classification
Repository: github.com/metadist/synaplan-sortx
SortX is a document sorting and classification plugin. It combines fast local regex matching with AI-powered classification to automatically organize documents into categories like contracts, invoices, letters, and research material.
How it works — 3-step pipeline:
- Regex Match — Fast local pattern matching against filenames and extracted text. If a rule hits, the document is categorized immediately with no API calls.
- AI Text Classification — If regex doesn't match, the extracted text is sent to
POST /classifyfor LLM-based classification using the user's configured chat model. - AI Vision Fallback — If extraction failed or confidence is low, the entire file is uploaded to
POST /analyze-filefor vision-model analysis (OCR, image-based documents).
Architecture:
SortX ships as both a standalone Docker container (for local batch processing) and a Synaplan platform plugin (for remote AI classification).
| Component | Technology | Role |
|---|---|---|
| Local tool | Go + SQLite + Apache Tika | File scanning, text extraction, regex matching |
| Plugin backend | PHP (Symfony controller) | AI classification endpoints, prompt generation |
| Web UI | PHP + Bootstrap | Configuration, progress monitoring, results |
Plugin API endpoints (base: /api/v1/user/{userId}/plugins/sortx):
| Method | Endpoint | Description |
|---|---|---|
GET |
/schema |
Returns categories, fields, prompt preview, config |
POST |
/classify |
Classify document from extracted text |
POST |
/analyze-file |
Classify document from uploaded file (vision fallback) |
Installation:
# Copy plugin into Synaplan
cp -r sortx-plugin/ /path/to/synaplan/plugins/sortx/
# Install for a user
docker compose exec backend php bin/console app:plugin:install <userId> sortx
TTS — Text-to-Speech
Repository: github.com/metadist/synaplan-tts
Adds voice output to AI responses. Runs as a separate Docker service alongside Synaplan.
git clone https://github.com/metadist/synaplan-tts.git
cd synaplan-tts
docker compose up -d
Then set SYNAPLAN_TTS_URL in your Synaplan .env to point to the TTS service. The platform also supports ElevenLabs as a cloud-based TTS provider via ELEVENLABS_API_KEY.
Cloud Storage Integrations
Nextcloud
Connect your Nextcloud instance to use its files as knowledge sources for RAG conversations.
Capabilities:
- Index documents from specific Nextcloud folders
- Automatic re-indexing when files are added or changed
- Full text extraction pipeline (PDF, Word, Excel, images with OCR)
- Per-user connection settings with app passwords
Setup:
- In your Nextcloud instance, create an App Password under Settings → Security
- In Synaplan's admin panel, add the Nextcloud connection with the server URL and app password
- Select which folders to index
- Documents are processed and become available as knowledge sources in AI chats
OpenCloud (ownCloud Infinite Scale)
Full integration with OpenCloud / oCIS for organizations using the ownCloud ecosystem.
Capabilities:
- WebDAV and Graph API support for file access
- Spaces-aware document indexing
- Automatic sync and re-indexing
- Same text extraction and RAG pipeline as Nextcloud
Setup:
- Generate an API token or app password in your OpenCloud instance
- Configure the connection in Synaplan's admin panel
- Select spaces and folders to index
Building Your Own Plugin
Plugins follow a minimal structure:
my-plugin/
├── manifest.json # Metadata, capabilities, version
├── backend/
│ ├── Controller/ # API endpoints (Symfony controllers)
│ └── Service/ # Business logic
├── frontend/ # Optional Vue components
└── migrations/
└── 001_setup.sql # Per-user config setup (BCONFIG entries)
Key rules:
- No custom database tables — use
BCONFIGfor simple key-value config (withBGROUP = "P_{pluginName}") and the genericplugin_datatable for structured data viaPluginDataService. - No core code changes — plugins are self-contained under
plugins/{name}/. - API namespacing — all endpoints live under
/api/v1/user/{userId}/plugins/{name}/.... - Reuse core services — use Synaplan's
AiFacade,ModelConfigService,PluginDataService, etc. through dependency injection.
manifest.json Example
{
"name": "my-plugin",
"version": "1.0.0",
"description": "Short description of what the plugin does",
"author": "Your Name",
"capabilities": ["classify", "analyze"],
"config_group": "P_myplugin"
}
Installing a Plugin
# Copy plugin directory into Synaplan
cp -r my-plugin/ /path/to/synaplan/plugins/my-plugin/
# Install for a specific user
docker compose exec backend php bin/console app:plugin:install <userId> my-plugin
Related Repositories
| Repository | Description | Link |
|---|---|---|
| synaplan | Main platform (backend + frontend) | github.com/metadist/synaplan |
| synaplan-sortx | SortX document classification plugin | github.com/metadist/synaplan-sortx |
| synaplan-tts | Text-to-Speech service | github.com/metadist/synaplan-tts |
| synaplan-charts | Helm charts for Kubernetes deployment | github.com/metadist/synaplan-charts |
| synaplan-platform | Production deployment configs | github.com/metadist/synaplan-platform |