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

markupress

v0.18.7

Published

Versioned Markdown documentation built on MarkupKit and native declarative components.

Readme

Markupress

Build a versioned Markdown documentation site with native HTML Next components, MarkupKit routing and a Looma theme. Markupress provides dev, build, preview and snapshot commands, and build writes a portable static site.

Documentation: threadlabs.studio/markupress

  • Markdown: Expressmark standard syntax with footnotes, bracketed callouts, details, adjacent tabs and named list tables.
  • Code blocks: Shiki highlighting at build time in both themes, titles, line highlights and numbers, copy and wrap.
  • Components: native HTML Next components in any page, with TypeScript controllers.
  • Navigation: sections and sidebars from folders, a top navigation, breadcrumbs, an "On this page" outline, a mobile drawer, edit links and last-updated dates.
  • Search: typo-tolerant local search or contextual Algolia search, with language/version isolation, content exclusions and keyboard selection. Open it with / or Ctrl+K.
  • Languages: locale routes, identity-based language switching, translated reader controls, RTL layouts, language metadata and optional source-content fallback.
  • Versions: markupress snapshot v1 records the docs, and readers switch versions on the same document.
  • Theme: a coordinated light/dark Markupress palette, Looma controls, a home layout, a footer, and site layouts that replace the shell.

Get started

Use Node 22.22.2 or later in Node 22, or Node 24.15 or later in Node 24. npm create markupress starts a site:

npm create markupress@latest docs

Or add Markupress to a project:

npm install markupress
npx markupress dev       # serve docs/ with live reload
npx markupress build     # write the static site to site/
npx markupress preview   # serve the built site

docs/index.md is a complete site. The guide covers project structure, writing, navigation, versions, theming and SEO, and the reference covers configuration, the command line and the API.

Home pages

Set layout: home in Markdown front matter. The h1 and introductory paragraphs form the hero, a paragraph containing only links supplies its actions, and each h2 starts a feature card. The first action uses the theme accent.

An image can sit beside the story. To show live components there instead, import their definitions and mark one top-level wrapper data-hero-media:

<link rel="component" href="@/app/components/product-preview.html">

<div data-hero-media>
<product-preview></product-preview>
</div>

The media stacks below the story on narrow screens. Its components retain their own styling and behavior.

Build from source

Build and try the source with pnpm through Corepack. The documentation site is in website/, built by Markupress itself, and the example site in examples/site/ serves at /manual/:

corepack pnpm install --frozen-lockfile
corepack pnpm build
node dist/cli.js dev --root website
node dist/cli.js dev --root examples/site
corepack pnpm build:sites
corepack pnpm verify:inner
corepack pnpm verify:pr
corepack pnpm exec playwright install chromium
MARKUPRESS_BROWSER_TEST=1 corepack pnpm exec vitest run tests/package.test.ts --maxWorkers=1

The package contract packs and installs the actual package, runs its CLI, checks frozen imports and checks controller types. The browser proof exercises production and development controllers under MarkupKit's generated Content Security Policy, failing on any violation, keyboard version selection, reloads, mobile navigation, the home page and an axe accessibility audit. CI runs that browser proof separately, and builds both sites. A push to main deploys the documentation site to GitHub Pages.

Foundation pins TypeScript, Vitest, Oxlint and pnpm. AGENTS.md is the contributor contract; threadlabs.config.json records ownership. The implementation plan defines product boundaries. Merges to main automatically publish a verified patch release through GitHub Actions and the npm environment. A larger version declared in a PR is preserved. Release snapshots keep Markupress and its starter aligned; rerunning the same source resumes the frozen version after a partial publication. The release workflow and runner are locally owned in the Foundation manifest.

License

MIT, copyright Threadlabs Studio contributors.

Theme the whole documentation site

Markupress ships a paired ink-and-paper palette with a cobalt accent, exported from Looma's customizer. The editable recipe is in theme/looma.theme.json; its generated CSS is the default theme, loaded in the base cascade layer so a site's overrides take precedence.

Its shell, navigation rows, current selection, focus, prose and controls consume Looma's public semantic properties, so a site can apply a different identity throughout. Use Looma's --ui-font-sans, --ui-font-display and --ui-font-mono for typography. Put site-wide overrides in app/site.css, listed in MarkupKit's css option.

Keep styling for a new identity at that theme boundary rather than selecting the internals of nested Looma controls. Set --markupress-background to add a page-wide texture or gradient; it defaults to var(--ui-surface) and can use the same semantic colors.

Without a saved mode, the site follows the operating system and responds when that preference changes. The header uses one Looma CycleButton: activate it to move through Automatic, Light and Dark. Its monitor, sun or moon icon shows the current choice. Explicit Light/Dark choices are remembered; Automatic clears the override and follows the operating system. Header actions reserve separate cells for the adjustable invisible hit-area preference, so their visible buttons stay compact without overlapping targets. The theme uses Looma’s shared controls and contextual navigation colors. In an application that supplies its own mode switch, set data-theme="light" or data-theme="dark"; nested boundaries apply only to their descendants. Remove the root attribute when using the CSS directly to follow system preference.

The shared shell supports --markupress-sidebar-width, --markupress-content-width, --markupress-page-width and --markupress-outline-width. Navigation is rendered by Looma's Disclosure and Nav Item components and uses its --ui-nav-*, --ui-selection-*, typography, spacing and focus families. Set sidebarNavigation: 'sections' for category links with pages listed only beneath the current category. A category opens its overview, or its first page when it has no overview; this mode uses ordinary links without disclosure toggles and works without JavaScript. The default tree mode retains nested disclosures. On narrow screens navigation becomes a native popover drawer.

Set headerNotice to show a removable status chip before search. Dismissal emits markupress-header-notice-dismiss on window; the application owns the reset action. --markupress-header-notice-display can conditionally hide the chip. Header brand and navigation text share a baseline; gaps follow Looma’s spacing scale.