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

papertown

v1.4.0

Published

Papertown syncs you personal markdown blog with blog platforms like dev.to.

Readme

Papertown

Papertown syncs you personal markdown blog with blog platforms like dev.to.

Best way to get an overview is to read this blog post: https://christiankohler.net/introducing-papertown

How does it work

Papertown sync only articles with a masterid in the frontmatter. The masterid helps papertown identify articles.

For every article it compares the content and then:

- if article doesn't exist -> create
- if article hasn't changed -> do nothing
- if article has changed -> update

Supported blog platforms

  • DevTo

Quick Start

1. Make sure you have the correct folder structure

If the rootfolder is different change it in the config.

- blog-articles
  - article one
    - index.md
  - article two
    - index.md

2. Add a masterid to the articles you want to sync

Important: Posts without a masterid are ignored.

---
title: "Sample Blog Post"
masterid: 123
---

3. Add a canonical_url to link back to your personal blog

---
title: "Sample Blog Post"
masterid: 123
canonical_url: "url to this blog article"
---

4. Add a published field to create a draft

---
title: "Sample Blog Post"
masterid: 123
canonical_url: "url to this blog article"
published: false
---

5. Run Papertown with a valid api key

papertown sync --devtoApiKey apikey

Configuration

| Config | Env | Args | | --------------------- | --------------------- | ------------------ | | Root Folder | ROOT_FOLDER | rootFolder | | API Key DevTo | DEVTO_API_KEY | devtoApiKey | | Github URL for images | IMAGE_ROOT_URL_GITHUB | imageRootUrlGithub | | Dry Run | DRY_RUN | dryRun |

1: Use args

papertown sync --devtoApiKey apikey

2: Use a .env file

DEVTO_API_KEY="yourdevtoapikey"

3: Set env variables before running papertown

DEVTO_API_KEY="yourdevtoapikey" papertown sync

Dry Run

Use dryRun to not create or update the post and only log what would happen.

Relative Images

Papertown can replace relative images with absolute github urls.

Requirements are:

  • Github repo is public
  • imageRootUrlGithub is set

Example

Run:

papertown sync
  --rootFolder content/posts
  --imageRootUrlGithub https://raw.githubusercontent.com/ChristianKohler/Homepage/master

and the url in the file (content/posts/first-post/index.html)

./images/hero.png

will be replace with:

https://raw.githubusercontent.com/ChristianKohler/Homepage/master/content/posts/first-post/images/hero.png

Dev.to

Add coverimage

Can be a relative image, papertown will resolve it.

cover_image: direct_url_to_image.jpg

Papertown API (BETA)

Papertown can be used within your node script.

Example

const { sync } = require("papertown");

const config = {
  rootFolder: "my-root-folder",
  devtoApiKey: "my-key",
  imageRootUrlGithub: "",
  dryRun: false,
};

await sync(config);