Skip to main content
Knosys

Documentation

Plugin System

Knosys has a powerful plugin system that lets you extend the app with new features. Plugins can add routes, sidebar items, widgets, and settings panels — and they look and feel just like built-in features.

A clean canvas, by design

Knosys ships with no default plugins. The base app is everything you need — notes, calendar, reminders, spotlight, sync, dashboard. Anything beyond that is a deliberate choice you make. Browse community plugins from inside the app (Settings → Plugins), or build your own with the Plugin API below.

How Plugins Work

Plugins are JavaScript bundles that run inside Knosys. Each plugin has:

  • A manifest.json describing the plugin
  • A main.js entry point
  • Optional styles.css for custom styling

When Knosys loads a plugin, it provides two objects:

  • api — Access to storage, UI registration, core data, and API keys
  • shared — Access to React, shadcn components, and utility libraries

Plugin API

UI Registration

Plugins can register:

  • Routes — Add new pages to the app (api.ui.registerRoute)
  • Sidebar items — Add navigation entries (api.ui.registerSidebarItem)
  • Settings panels — Add configuration UI (api.ui.registerSettingsPanel)

Storage

Each plugin gets its own scoped key-value storage:

// Store data
await api.storage.set('myKey', { some: 'value' });

// Retrieve data
const data = await api.storage.get('myKey');

Core Access

Plugins can access core Knosys data:

  • Locationsapi.core.getLocations()
  • Vault pathapi.core.getVaultPath()
  • API keysapi.core.getApiKey('key-name')

Creating a Plugin

To create your own plugin:

  1. Create a new directory for your plugin
  2. Add a manifest.json with name, version, and description
  3. Write your main.js with an activate function
  4. Place the plugin in the Knosys plugins directory

manifest.json

{
  "name": "my-plugin",
  "version": "1.0.0",
  "description": "My custom Knosys plugin",
  "main": "main.js"
}

main.js

exports.activate = (api, shared) => {
  const { React } = shared;

  const MyPage = () => {
    return React.createElement("div", null, "Hello from my plugin!");
  };

  api.ui.registerRoute({
    path: "/my-plugin",
    component: MyPage,
  });

  api.ui.registerSidebarItem({
    id: "my-plugin",
    title: "My Plugin",
    icon: "Puzzle",
    route: "/my-plugin",
    order: 100,
  });
};