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

nebula-cms

v0.1.7

Published

A native CMS for Astro

Readme

Nebula CMS

NPM Version CI

A streamlined, Git-based Content Management System built specifically for Astro. Nebula CMS provides a beautiful, unified editing interface for your Markdown, MDX, JSON, YAML, TOML, and Markdoc files, driven directly by your existing Astro Content Collections.

Screnshot of NebulaCMS using the author's blog as an example

Features

  • Painless Integration: Plugs perfectly into Astro as a standard integration.
  • Git-Backed: Modifications are made directly to the files in your repository. No external databases required.
  • Zero-Config Schemas: Reads directly from your Astro Content Collections schemas via Zod.
  • Modern UI: Svelte-powered dashboard to seamlessly manage entries, relational fields, and deeply nested object structures.

Requirements, Installation, Setup

Nebula CMS requires the following peer dependencies:

  • astro 6.1.0 or higher
  • @astrojs/svelte 8.0.0 or higher
  • svelte 5.0.0 or higher

Install the package via your preferred package manager:

npm install nebula-cms
# or
pnpm add nebula-cms
# or
yarn add nebula-cms

Once installed, make sure you include both Svelte and Nebula in your Astro config:

// astro.config.mjs
import { defineConfig } from 'astro/config';
import svelte from '@astrojs/svelte';
import nebulaCMS from 'nebula-cms';

export default defineConfig({
  integrations: [svelte(), nebulaCMS()],
});

Then import the Nebula component into the path you want to use for the CMS:

---
import NebulaCMS from 'nebula-cms/client';
---

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Nebula CMS</title>
  </head>
  <body>
    <NebulaCMS client:load />
  </body>
</html>

Nebula assumes that your path is /admin. If you want to change it, in your Astro config, pass the basePath option to the integration:

export default defineConfig({
  integrations: [svelte(), nebulaCMS({ basePath: '/cms' })],
});

Defining Content Models

Unlike an external CMS where you have to duplicate your schema configuration, Nebula reads the exact same schemas you're already building in your Astro Content Collections.

For even more control, new in Astro 6, you can make use of Zod's meta() method to configure how collections and fields are displayed inside Nebula.

Field Meta

Adding .meta() to individual fields lets you provide UI-specific hints:

  • title (string): A human-readable display name for the field
  • description (string): A short description explaining what the field is for.

Content Collection Meta

Adding .meta() to your base object schema lets you provide UI-specific hints to the CMS:

  • title (string): A human-readable display name for the collection (e.g., 'Blog Posts').
  • description (string): A short description explaining what the collection is for.
  • files (array of strings): The file extensions supported by this collection (e.g., ['md'], ['json'], ['md', 'mdx']). This ensures Nebula CMS reads and writes the correct formats. Including md, mdx, or markdoc in this array will enable the rich text editor for those collections.

Example Schema

// src/content.config.ts
import { defineCollection, reference } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';

const posts = defineCollection({
  loader: glob({ base: './src/content/posts', pattern: '**/*.md' }),
  schema: z
    .object({
      title: z.string(),
      date: z.date().meta({
        description: 'Published date for the post',
      }),
      draft: z.boolean().optional(),
      author: reference('authors'),
    })
    .meta({
      title: 'Posts',
      description: 'Blog posts',
      files: ['md'],
    }),
});

export const collections = { posts };

Accessing the CMS

Once your integration is configured and your collections are defined, start your Astro development server and navigate to the page you integrated Nebula to. You'll be presented with two options: either using the File System Access API to work with your files locally, or connecting to a GitHub repository with a Personal Access Token to manage your content remotely.

While working locally, Nebula will automatically manage soft (SPA) navigations and includes middleware to ensure that all relevant pages are captured and redirected to the main URL. The path you configured will work for static or dynamic configurations, but you may need to configure your hosting provider to provide the same functionality if you export as a static site.

Drafts

Nebula will let you create drafts of new pieces of content or changes to existing content. It stores these in IndexedDB in your browser and not included in your source files.