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

@quietmind/mdx-docs

v0.1.20

Published

<a href="https://www.producthunt.com/posts/mdx-docs"> <img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1095911&theme=dark" height="32" /> </a>

Readme

@quietmind/mdx-docs

⚡ A lightweight React framework for building MDX documentation sites.

MDX Docs turns MDX files into routed documentation pages with a built-in layout, sidebar, and navigation.

MDX Docs is a React + Vite framework for building MDX-powered documentation sites. Write pages in Markdown with embedded React components, and get a fully-featured site with syntax highlighting, dark/light mode, and responsive navigation out of the box.

Demo: https://mdxdocs.com/

mdx-docs documentation site

Features

  • MDX pages — write Markdown with embedded React components
  • Syntax highlighting with copy-to-clipboard on code blocks
  • Dark/light mode with system preference detection
  • Responsive sidebar navigation
  • Built on React 19, Material-UI 7, and Vite 6

Quick Start

Create a new documentation site:

npx create-mdx-docs@latest my-docs

Create an MDX file in pages/:

import { Button } from "@mui/material";

# Button

<Button variant="contained" color="primary">
  Primary Action
</Button>

```jsx
<Button variant="contained" color="primary">
  Primary Action
</Button>
```

Register your page in config/pages.js:

const GettingStartedMDX = lazy(() => import("@pages/getting-started.mdx"));

export const pages = [
  // ...existing pages
  {
    name: "Getting Started",
    route: "/getting-started",
    component: GettingStartedMDX,
  },
];

Pages with isDefault: true do not appear in the sidebar navigation.

Configure your site name and description in config/site.js.

export const site = {
  name: "My Site",
  description: "My site description",
};

Writing MDX

MDX files are JSX, not HTML. A few things to keep in mind:

  • Inline styles must be objects, not strings — style={{ marginRight: '0.5rem' }} not style="margin-right: 0.5rem". A CSS string will cause a runtime error due to Emotion's JSX transform.
  • Use className instead of class.
  • Self-close void elements: <img />, <br />, <hr />.

Favicon

Place your favicon in the public/ directory and add a <link> tag to index.html:

<head>
  <!-- ... -->
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</head>

Vite serves files in public/ at the root path, so public/favicon.svg is accessible as /favicon.svg. Use .ico, .png, or .svg depending on your file.

Project Structure

my-docs/
├── pages/
│   └── home.mdx
├── config/
│   ├── pages.js
│   └── site.js
├── public/
│   └── favicon.svg
├── index.html
├── main.jsx
├── vite.config.js
└── package.json

Vite serves files in public/ at the root path, so public/favicon.svg is accessible as /favicon.svg. Use .ico, .png, or .svg depending on your file.

Manual Installation

1. Install Package

npm install mdx-docs

2. Install Peer Dependencies

npm install react react-dom react-router-dom \
  @emotion/react @emotion/styled \
  @mui/material @mui/icons-material \
  @mdx-js/react @mdx-js/rollup \
  prism-react-renderer prismjs \
  vite @vitejs/plugin-react

3. main.jsx

import "@quietmind/mdx-docs/index.css";
import { createApp } from "@quietmind/mdx-docs";
import { pages } from "./config/pages.js";
import { site } from "./config/site.js";

createApp({ pages, site });

4. config/site.js

export const site = {
  name: "My Site",
  description: "My site description",
};

5. config/pages.js

import { lazy } from "react";

const HomeMDX = lazy(() => import("@pages/home.mdx"));

export const pages = [
  {
    name: "Home",
    route: "/",
    component: HomeMDX,
    isDefault: true,
  },
];

6. vite.config.js

import { defineConfig } from "vite";
import { createMdxDocsConfig } from "@quietmind/mdx-docs/vite";
import { site } from "./config/site.js";

export default defineConfig(
  createMdxDocsConfig({ rootDir: import.meta.dirname, site })
);

7. index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="description" content="%SITE_DESCRIPTION%" />
    <title>%SITE_NAME%</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/main.jsx"></script>
  </body>
</html>

Theming

Pass a theme option to createApp to customize your site's colors and typography. All existing createApp({ pages, site }) calls continue to work unchanged.

Simple

Set a brand color and/or font family:

createApp({
  pages,
  site,
  theme: {
    primaryColor: "#6200ea",
    fontFamily: '"Inter", sans-serif',
  },
});

Presets

Import a built-in color preset for a quick start:

import { createApp, themes } from "@quietmind/mdx-docs";

createApp({ pages, site, theme: themes.ocean });

Available presets: themes.ocean, themes.forest, themes.rose.

Presets can be extended:

createApp({ pages, site, theme: { ...themes.ocean, fontFamily: '"Inter", sans-serif' } });

Advanced

Use light and dark keys for full per-mode MUI theme overrides. These are deep-merged into the built-in palette, so you only need to specify what you want to change:

createApp({
  pages,
  site,
  theme: {
    primaryColor: "#6200ea",
    light: {
      palette: { background: { default: "#f0f4f8" } },
    },
    dark: {
      palette: { primary: { main: "#bb86fc" } },
      typography: { fontFamily: '"Inter", sans-serif' },
    },
  },
});

Mode-specific overrides take precedence over primaryColor and fontFamily shorthands.

Tech Stack

  • React 19, Material-UI 7, Emotion
  • Vite 6, MDX 3
  • React Router DOM 7
  • Prism React Renderer

Contributing

Contributions are welcome!

  1. Fork the repo
  2. Create a branch
  3. Submit a pull request

Related Projects

License

MIT