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

no-mess

v0.1.3

Published

CLI for the no-mess headless CMS

Readme

no-mess

CLI for the no-mess headless CMS. Manage template and fragment schemas from your codebase.

Install

npm install -g no-mess
# or run directly
bunx no-mess
npx no-mess

Quick Start

# Scaffold a schema.ts and .env file
no-mess init

# Edit .env or .env.local with your secret API key
# NO_MESS_API_KEY=nm_your_secret_key

# Push your schema to the dashboard
no-mess push

# Watch for changes and sync on save
no-mess dev

Commands

no-mess init

Create a starter schema.ts and .env file in the current directory.

no-mess init
no-mess init --schema content/schema.ts
  • Creates schema.ts with an example template + fragment schema if the file doesn't exist
  • Creates .env with a NO_MESS_API_KEY placeholder if the file doesn't exist
  • The CLI also reads .env.local if you prefer not to store local secrets in .env

no-mess push

Parse your local schema and push it to the no-mess dashboard.

no-mess push
no-mess push --schema content/schema.ts

Returns a list of synced schemas with their action (created or updated).

no-mess pull

Pull schemas from the dashboard and generate a local schema.ts.

no-mess pull
no-mess pull --schema content/schema.ts
no-mess pull --stdout  # print to stdout instead of writing a file

no-mess dev

Watch schema.ts and automatically push on every save.

no-mess dev
no-mess dev --schema content/schema.ts

Uses a 300ms stability threshold before syncing. Gracefully shuts down on SIGINT/SIGTERM.

Options

| Flag | Default | Description | |------|---------|-------------| | --schema <path> | schema.ts | Path to the schema file | | --stdout | — | Print to stdout instead of writing a file (pull only) | | --help, -h | — | Show help | | --version, -v | — | Show version |

Configuration

The CLI reads environment variables from env files in the current directory with this precedence:

  1. Shell-provided environment variables
  2. .env.local
  3. .env

| Variable | Required | Description | |----------|----------|-------------| | NO_MESS_API_KEY | Yes | Secret API key (must start with nm_) | | NO_MESS_API_URL | No | Custom API URL (defaults to https://api.nomess.xyz) |

API Key Types

  • Secret keys (nm_...) — Required for the CLI. Used for schema management and server-side operations.
  • Publishable keys (nm_pub_...) — Not accepted by the CLI. These are for client-side content fetching only.

Get your API key from the no-mess dashboard under workspace settings.

Local Development Against Another Repo

For local CLI development, build the CLI in this repo and invoke the built entrypoint from the consumer project. This is the fastest way to test changes without publishing.

Example: testing against /Users/jacob/Developer/mershy

# Terminal 1: rebuild the SDK when it changes
cd /Users/jacob/Developer/no-mess
bunx tsc -w -p packages/no-mess-client
# Terminal 2: rebuild the CLI when it changes
cd /Users/jacob/Developer/no-mess
bunx tsc -w -p packages/no-mess-cli
# Terminal 3: run the local CLI from the consumer project
cd /Users/jacob/Developer/mershy
bun ../no-mess/packages/no-mess-cli/dist/cli.js init --schema lib/cms/schema.ts
bun ../no-mess/packages/no-mess-cli/dist/cli.js push --schema lib/cms/schema.ts
bun ../no-mess/packages/no-mess-cli/dist/cli.js dev --schema lib/cms/schema.ts

Notes:

  • mershy keeps its CMS code under lib/cms, so the schema path is lib/cms/schema.ts
  • the CLI resolves .env, .env.local, and relative schema paths from the current working directory, so run it from the consumer project
  • dev watches schema file changes, but if you change CLI or SDK source you still need to restart the running CLI process after the rebuild finishes

Schema File

The CLI works with schema files that use @no-mess/client/schema:

import {
  defineFragment,
  defineSchema,
  defineTemplate,
  field,
} from "@no-mess/client/schema";

export default defineSchema({
  contentTypes: [
    defineFragment("image-with-alt", {
      name: "Image With Alt",
      fields: {
        image: field.image({ required: true }),
        alt: field.text(),
      },
    }),
    defineTemplate("blog-posts", {
      name: "Blog Posts",
      mode: "collection",
      fields: {
        title: field.text({ required: true }),
        body: field.textarea({ required: true }),
        coverImage: field.fragment("image-with-alt"),
        featuredProducts: field.array({
          of: field.object({
            fields: {
              name: field.text({ required: true }),
              href: field.url(),
            },
          }),
        }),
      },
    }),
  ],
});

defineContentType() still works as a compatibility alias for templates, but new code should prefer defineTemplate() and defineFragment().

See the @no-mess/client schema docs for the full field builder API.

Development

# Build
bun run build

# Watch mode
bun run dev

License

MIT