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

@mosetta/ide-plugin-settings

v0.0.14

Published

A settings window over the same JSON file you edit by hand.

Downloads

654

Readme

Settings

@mosetta/ide-plugin-settings · A settings window over the same JSON file you edit by hand.

What it does

Every setting of every plugin, in one window, generated from what the plugins declare: each section with its fields, their current values, and which layer a value comes from — the factory, your settings.json, or the project's .mosetta/settings.json.

  • One source of truth. The window writes the same file you edit by hand, one key at a time, keeping your comments and formatting. Edit the file, and the window follows.
  • Per machine or per project. A value can be written for you or for the project; resetting removes it from both files, so "factory" means factory.
  • Validated. A value of the wrong type is refused with the reason, before it reaches the file.
  • Searchable. Filter by a key or a path, and every setting is also a hit in search everywhere — editor font gets you there.

Keys

| Command | macOS | Windows and Linux | |---|---|---| | settings.show | Cmd+, | Ctrl+, |

Screenshots and demos

The settings window, sections by plugin

Try it in the browser

Using it from another plugin

A plugin does not register with the window; it declares a settings section, and the window finds it:

import { configSection, plugin, type Ide } from '@mosetta/ide-api/client';

export interface NotesSettings { folder: string; sort: 'name' | 'date' }
export const NOTES_DEFAULTS: NotesSettings = { folder: 'notes', sort: 'date' };

@configSection({
  section: 'notes',
  defaults: NOTES_DEFAULTS,
  fields: { sort: { options: ['name', 'date'] } },
})
@plugin({ title: 'plugin.notes' })
export default class Notes {
  constructor(private readonly ide: Ide) {}

  private get settings(): NotesSettings {
    return this.ide.settingsOf('notes', NOTES_DEFAULTS).value; // factory, then the user's file, then the project's
  }
}

A section can carry its own editor instead of generated rows — the keymap does — and a schema (JSON Schema) that every write is checked against.

To send the user to a particular setting, take whoever is registered in settings.reveal; it is optional on purpose, so your plugin keeps working with the settings window switched off:

const opener = this.ide.registry<{ reveal(query: string): void }>('settings.reveal').all.value[0];
opener?.reveal('lsp.memoryBudgetMb');

Writing a setting from code goes through the core, with the same checks as the window: await this.ide.setSetting('notes', 'sort', 'name', 'project').