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

@drewswiredin/backstage-plugin-assistants

v0.10.0

Published

Frontend plugin — AI Assistants for Backstage.

Downloads

1,439

Readme

@drewswiredin/backstage-plugin-assistants

AI Assistants for Backstage — a polished, configurable chat experience for your developer portal. Create one or more assistants in the in-app admin editor (each with its own prompt, tools, models, access policy, and color; stored in the plugin database); users chat with them in a collapsible, multi-conversation UI with streaming responses, tool calls, Markdown/Mermaid rendering, per-conversation model selection, and background (concurrent) conversations with unread indicators.

This is the frontend plugin (new frontend system). It pairs with:

Requirements

  • Backstage running the new frontend system (@backstage/frontend-defaults / createApp) and the new backend system (@backstage/backend-defaults).
  • A model provider and API key (e.g. an OpenRouter key, or any OpenAI-compatible / OpenAI / Anthropic / Azure endpoint).

Install

From your Backstage repo root:

# in the app package
yarn --cwd packages/app add @drewswiredin/backstage-plugin-assistants

# in the backend package
yarn --cwd packages/backend add @drewswiredin/backstage-plugin-assistants-backend

(The -common package is pulled in transitively; you don't add it directly.)

Wire up the frontend

Add the plugin to your app's features. Its "Assistants" nav item is registered automatically — no extra nav code needed.

// packages/app/src/App.tsx
import { createApp } from '@backstage/frontend-defaults';
import assistantsPlugin from '@drewswiredin/backstage-plugin-assistants/alpha';

export default createApp({
  features: [
    assistantsPlugin,
    // ...your other features
  ],
});

The page mounts at /assistants.

Using a custom NavContentBlueprint to lay out your sidebar? The plugin's nav entry has the id page:assistantstake() it to place it yourself.

Hide it from users without access. The auto-registered nav entry is not permission-gated by default — a user without assistant.use would still see it and hit a "You are not permitted to use assistants" page on click. To hide the plugin entirely for them, render the nav entry yourself behind a usePermission(assistantUsePermission) check (assistantUsePermission comes from @drewswiredin/backstage-plugin-assistants-common): a custom NavContentBlueprint that take('page:assistants')s the auto entry and adds your own gated SidebarItem. This repo's dev app does exactly this in packages/app/src/modules/nav/Sidebar.tsx. See the backend README for granting assistant.use / assistant.manage via a permission policy.

Interactive forms & scaffolder pickers (optional). Assistants can render inline RJSF forms (the render_form tool) for human-in-the-loop input. Those forms reuse Backstage scaffolder field extensions (owner / entity / repo pickers, plus any custom field), resolved at runtime from the app. If @backstage/plugin-scaffolder is registered (it is under feature discovery / app.packages: all), those pickers populate from the catalog; without it, forms still render with plain inputs. No extra wiring is required.

Wire up the backend

// packages/backend/src/index.ts
backend.add(import('@drewswiredin/backstage-plugin-assistants-backend'));

Configure

Add an assistants block to app-config.yaml — this is the platform/safety surface only (providers, the safety floor). Minimal working example (OpenRouter + the built-in catalog/TechDocs read tools):

assistants:
  defaultModel: openrouter:google/gemini-2.5-flash
  builtinActions: true # registers the built-in catalog/TechDocs read tools
  providers:
    openrouter:
      type: openai-compatible
      apiKey: ${OPENROUTER_API_KEY}
      baseUrl: https://openrouter.ai/api/v1
      models:
        - name: google/gemini-2.5-flash
          contextWindow: 1048576

Assistants themselves are not configured here — sign in as an admin and use the gear in the chat sidebar to create one (it seeds open to all signed-in users with the built-in read tools).

Set the key in your environment (never commit it):

export OPENROUTER_API_KEY=sk-or-...

Also add assistants to the backend actions service so the tools are exposed (otherwise an assistant's tools resolve to empty):

backend:
  actions:
    pluginSources:
      - assistants # plus catalog / scaffolder etc. for their actions

See the backend README for the full configuration reference — the platform settings (model providers, MCP servers, the approval floor, and global UI defaults). Per-assistant settings (prompt, access, tools, models) are not config; they're managed in the in-app editor. Tool/action availability depends on which action-providing plugins are installed in your backend; the built-in read tools are provided by builtinActions.

Manage assistants

Users with the assistant.manage permission see a gear in the chat sidebar that opens the editor — create, edit, and delete assistants there. Grant assistant.manage (and assistant.use for plugin access) to the right users in your permission policy.

License

Apache-2.0