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:

  1. Regex Match — Fast local pattern matching against filenames and extracted text. If a rule hits, the document is categorized immediately with no API calls.
  2. AI Text Classification — If regex doesn't match, the extracted text is sent to POST /classify for LLM-based classification using the user's configured chat model.
  3. AI Vision Fallback — If extraction failed or confidence is low, the entire file is uploaded to POST /analyze-file for 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:

  1. In your Nextcloud instance, create an App Password under Settings → Security
  2. In Synaplan's admin panel, add the Nextcloud connection with the server URL and app password
  3. Select which folders to index
  4. 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:

  1. Generate an API token or app password in your OpenCloud instance
  2. Configure the connection in Synaplan's admin panel
  3. 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 BCONFIG for simple key-value config (with BGROUP = "P_{pluginName}") and the generic plugin_data table for structured data via PluginDataService.
  • 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