Download
Build a plugin

From an empty folder
to the catalog

Everything you need, in order. You write plain JavaScript in one file, with no build step and no dependencies.

What you needNode.js 18 or laterGit and a GitHub accountAn idea that fits one section

Step by step

  1. 1

    Pick the section

    A plugin belongs to exactly one section, and the section decides where it appears and what it may ask for. If you connect a service, choose by what you bring in: tasks, pull requests, tables, quotas, documents, messages. If you build a tool with its own screen, choose pages. The sections are described one by one below.

  2. 2

    Get the templates and open the playground

    The repository holds one working plugin per section and a playground that draws it the way PromptOps does. It binds to your machine only and needs nothing installed.

    git clone https://github.com/shellonback/promptops-plugin-templates
    cd promptops-plugin-templates
    node playground/server.mjs
  3. 3

    Copy the template of your section

    This creates your own folder, outside the templates repository, with a manifest, the source file, sample data and a README. Then point the playground at it. The first argument is the section, the third is your id: your-handle.plugin-slug, lowercase, permanent.

    node tools/new-plugin.mjs tasks ../my-plugin your-handle.my-plugin "My Plugin"
    node playground/server.mjs --plugin ../my-plugin
  4. 4

    Declare what you need in the manifest

    promptops-plugin.json names your plugin and lists its permissions. Ask only for what you use: people read this list before installing, and a new permission in an update needs their approval again. Hosts are named one by one, net:api.example.com. Optionally list the AI providers you tried it with under providers: the catalog shows the first three as small icons.

    {
      "schemaVersion": 1,
      "id": "your-handle.my-plugin",
      "name": "My Plugin",
      "version": "0.1.0",
      "category": "tasks",
      "entry": "src/plugin.js",
      "permissions": ["net:api.example.com", "secrets", "tasks:read"],
      "providers": ["claude-code-cli"]
    }
  5. 5

    Write src/plugin.js

    You register the contract of your section and return data. PromptOps draws it: no HTML, CSS or script ever comes from a plugin. The only way out is the sdk object. For a token you write a placeholder, {{secret:token}}, and PromptOps fills it in when the request leaves, only towards a host you declared.

    promptops.tasks.registerSource({
      async validate(sdk) {
        const res = await sdk.http.fetch('https://api.example.com/me', {
          headers: { Authorization: 'Bearer {{secret:token}}' },
        });
        return { ok: res.ok };
      },
      async listTasks({ containerId }, sdk) { /* return tasks as data */ },
    });
  6. 6

    Test it, offline first

    The playground starts in Fixtures mode: answers come from fixtures.json, so it works on a train. Switch to Live to call the real service. Every call your plugin makes shows in the activity log, and a denied one is red with the reason. Press Reload plugin after each change.

  7. 7

    Validate

    The validator applies the same rules as the app and the registry: manifest, permissions, readable code. It also prints the three values you need to submit.

    node tools/validate.mjs ../my-plugin
  8. 8

    Publish your repository

    Push your folder to a public GitHub repository under your account. Keep the code in src/ and unminified: what people read must be what runs. If you use a bundler, commit your sources next to its output.

  9. 9

    Submit it for review

    In PromptOps open Plugins › Create plugin, choose whether you publish as yourself or as your team, and paste the version, the commit SHA, the SHA-256 of your file and the manifest. PromptOps downloads that exact commit, scans it and a person reviews it. Once approved it appears in the catalog and here. To update, submit a higher version: people are never updated silently.

Sections

The eight sections, one by one

What you write in each one, the template to start from, and a few ideas worth building.

Pages & tools

pagesWorks in the app

A tool with its own page: a form, a result, your logic.

Where it appears: Its own entry in the sidebar menu

You implementWhen it runs
open(pageId, context, sdk)The person opens the menu entry. You return the page.
event(pageId, event, sdk)A click or a changed field. You return the page after your work.

Ideas

  • Release notes from commits
  • A standup summary from yesterday’s sessions
  • A cost report from your usage

Start from: Release Notes

Open the template

Tasks & projects

tasksScreen being connected

The tasks of your tracker as cards on the board, with their status in sync.

Where it appears: Teams › Board

You implementWhen it runs
validate()Checks the credentials.
listContainers(parentId)Walks your tree: workspace, project, list.
listStatuses(containerId)Builds the board columns.
listTasks({ containerId, … })One page of tasks, in the PromptOps shape.
setStatus(id, statusId)Optional. The card was moved.

Ideas

  • Your company tracker
  • A shared spreadsheet of requests
  • Support tickets tagged “bug”

Start from: GitHub Issues

Open the template

Code & repos

codeScreen being connected

Pull requests and CI checks of your code host, next to the repository you are working on.

Where it appears: Sessions › Git Explorer

You implementWhen it runs
listPullRequests({ repo, state })Pull requests of the repository, with author and reviewers.
listChecks({ repo, ref })CI checks of a branch or commit, and their outcome.

Ideas

  • Your self-hosted Git
  • Deploy status of each branch
  • Code review queue of the team

Start from: GitHub Pull Requests

Open the template

Data & infra

dataScreen being connected

Tables from an API or a database service, to look at while an agent works.

Where it appears: Sessions › side panel

You implementWhen it runs
listResources()The tables or views you expose.
query({ resourceId, limit, filter })Rows and columns of one resource.

Ideas

  • Latest errors from your monitoring
  • Feature flags and who changed them
  • Orders stuck in a state

Start from: REST Explorer

Open the template

AI providers

providersScreen being connected

Credit and quota of an AI provider, in the same place as the others.

Where it appears: Usage

You implementWhen it runs
getUsage()Plan, meters with used and limit, reset dates.

Ideas

  • Your internal LLM gateway
  • A team budget split by project
  • Spend alerts

Start from: OpenRouter Usage

Open the template

Context

contextWorks in the app

Search your documents and hand one to an agent as context. You read it first.

Where it appears: Prompts › Project Brief

You implementWhen it runs
search(query)Titles and snippets.
get(id)The document as plain text, 50 000 characters at most.

Ideas

  • Your architecture decisions
  • API reference of an internal service
  • Customer interview notes

Start from: Wikipedia Context

Open the template

Notifications

notifyScreen being connected

A message where your team already talks, when an agent finishes or needs you.

Where it appears: Notifications, session events

You implementWhen it runs
events.on('turn.completed', handler)An agent finishes a turn.
events.on('approval.requested', handler)An agent waits for the person.

Ideas

  • A pager for failed runs only
  • A daily digest
  • A light on your desk

Start from: Discord Notifier

Open the template

Agent extensions

agentPlayground only for now

Skills and quick prompts for your agents. No code at all, only text in the manifest.

Where it appears: Spawn composer

You implementWhen it runs
contributes.skillsMarkdown files listed in the manifest.
contributes.quickActionsComplete prompts, one click each.

Ideas

  • Security review checklist
  • Release routine
  • How we write tests here

Start from: Code Review Pack

Open the template

The rules every plugin lives by

They are enforced by the app, not by trust. Knowing them saves you a rejected review.

A plugin can

  • Call HTTPS hosts it declared, on port 443.
  • Use credentials through placeholders, without reading them.
  • Keep a small private storage.
  • Show a notification or propose a prompt for the person to review.
  • With the pages section: read git data of a repository the person picked, write text files in its docs/ folder, run a prompt on Claude with no tools, measure model speed. Writing a file, running a prompt and measuring all ask the person first.

A plugin can never

  • Run native code, a shell command or an install script.
  • Read prompts, agent answers, files or the terminal.
  • Reach a private address, localhost or an IP.
  • Write to an agent on its own.
  • Draw its own interface inside the app.
  • Talk to the PromptOps servers or see your account.

What the review looks at

  1. 1The manifest in your repository is the one you submitted, at that commit.
  2. 2The file that runs has the hash you declared.
  3. 3Permissions are the ones the section allows, and every host in the code is declared.
  4. 4The code is readable: not minified, not obfuscated, no dynamic code.
  5. 5Reading a repository together with a network permission is allowed, and looked at closely.

Ready to try?

Clone the templates, open the playground and change one line. Questions and ideas are welcome on GitHub.

Shellonback

Preferenze cookie

Scegli quali categorie di cookie accettare. I cookie tecnici e funzionali sono sempre attivi.

Per maggiori informazioni, consulta la nostra Cookie Policy e la Privacy Policy.

Cookie di profilazione

Utilizzati per creare profili relativi all'utente e inviare messaggi promozionali in linea con le preferenze espresse.

Cookie analitici

Ci permettono di capire come gli utenti navigano il sito per migliorare l'esperienza e i contenuti.

Cookie tecnici

Sempre attivo

Necessari per il funzionamento del sito. Non possono essere disattivati.

Cookie funzionali

Sempre attivo

Consentono funzionalità avanzate come la memorizzazione delle preferenze di navigazione.