npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@takerofnotes/plugin-sdk

v0.4.0

Published

SDK to create a storage plugin for Taker of Notes

Downloads

479

Readme

@takerofnotes/plugin-sdk

Official plugin SDK for Taker of Notes.

This package provides the public contract for building storage adapters and third-party plugins for Taker of Notes.

It includes:

  • BaseNotesAdapter (abstract adapter class)
  • definePlugin() helper
  • Runtime plugin validation
  • Strong TypeScript types
  • Semver-based API version enforcement

Installation

npm install @takerofnotes/plugin-sdk

Quick Start

All plugins must:

  1. Extend BaseNotesAdapter
  2. Export a plugin definition using definePlugin()
  3. Declare a compatible apiVersion

Minimal Example

import { BaseNotesAdapter, definePlugin } from '@nicwands/notes-plugin-sdk'

class MyAdapter extends BaseNotesAdapter {
    async init() {}

    async getAll() {
        return []
    }

    async create(note) {}

    async update(note) {}

    async delete(id) {}
}

export default definePlugin({
    id: 'my-adapter',
    name: 'My Adapter',
    description: 'Example storage adapter',
    version: '1.0.0',
    apiVersion: '0.3.1',
    configSchema: [],
    createAdapter(config) {
        return new MyAdapter(config)
    },
})

Plugin Structure

A plugin exports a single default object created via definePlugin().

definePlugin({
  id: string
  name: string
  description: string
  version: string
  apiVersion: string
  configSchema: ConfigField[]
  createAdapter(config): BaseNotesAdapter
})

BaseNotesAdapter

All storage adapters must extend:

abstract class BaseNotesAdapter {
    constructor(config?: any)

    init(): Promise<void>
    getAll(): Promise<any[]>
    create(note: any): Promise<void>
    update(note: any): Promise<void>
    delete(id: string): Promise<void>
}

The adapter is responsible only for persistence.

It should:

  • Store notes
  • Retrieve notes
  • Update notes
  • Delete notes

It should NOT:

  • Perform indexing
  • Cache data
  • Apply business logic

That is handled by Taker of Notes core.

Config Schema

configSchema defines UI configuration fields shown in the app.

type ConfigField = {
    key: string
    label: string
    type: 'text' | 'password' | 'directory' | 'number' | 'boolean'
    default: 'text' | 'password' | 'directory' | 'number' | 'boolean'
    required?: boolean
}

Example:

configSchema: [
    { key: 'endpoint', label: 'S3 Endpoint', type: 'text', required: true },
    { key: 'accessKey', label: 'Access Key', type: 'password', required: true },
    { key: 'secretKey', label: 'Secret Key', type: 'password', required: true },
]

Taker of Notes will automatically generate the configuration UI based on this schema.

Publishing a Plugin

Recommended naming convention:

notes-plugin-<adapter-name>

Example:

notes-plugin-s3
notes-plugin-sqlite
notes-plugin-dropbox

In your plugin's package.json:

{
    "name": "takerofnotes-plugin-s3",
    "version": "1.0.0",
    "type": "module",
    "peerDependencies": {
        "@nicwands/notes-plugin-sdk": "^0.3.0"
    }
}

Use peerDependencies to ensure compatibility with the host app.

API Versioning

The SDK uses semver range matching for API versions. Your plugin's apiVersion should fall within the supported range exported as SUPPORTED_API_RANGE from the SDK. Minor and patch version changes in the SDK remain compatible with your plugin.

Security Considerations

Plugins execute in the Notes main process.

You should:

  • Avoid executing untrusted code
  • Protect credentials securely
  • Avoid leaking sensitive configuration

If building a remote storage adapter (S3, Supabase, etc.), never log secrets.

License MIT