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

@restora/cli

v0.4.4

Published

Local, privacy-first scheduled Notion backups to your own storage — Google Drive, S3 (AWS/Backblaze B2/Cloudflare R2/Wasabi/DO Spaces), or a local folder. Runs on your machine — nothing is stored on any server.

Downloads

2,948

Readme

Restora CLI — scheduled Notion backups to your own storage

Local, privacy-first automatic backups. The CLI runs on your machine, holds your credentials locally (~/.restora/config.json, owner-only), and streams your Notion workspace straight into a destination you own — Google Drive, any S3-compatible bucket (AWS, Backblaze B2, Cloudflare R2, Wasabi, DigitalOcean Spaces), or a plain local folder. No Restora server is ever involved — there is nothing on our servers to leak.

Why this design:

  • Notion internal-integration token (not OAuth) → it never expires, so scheduled backups never hit the 30-day OAuth reconnect wall, and the token never leaves your machine.
  • You own the destination → Google Drive uses the drive.file scope (the tool only sees files it created); S3 uses your own bucket + keys; local is just a folder on disk. Nothing is stored by us.

For users — one command

npx @restora/cli setup

The wizard walks you through it: connect Notion → share your databases → connect Google Drive (one click) → pick a daily time → first backup. Re-run anytime to change things. Prefer it installed? npm i -g @restora/cli, then restora setup.

Other commands:

restora status                          # what's connected, schedule, last backup
restora backup                          # back up now → Google Drive
restora backup --databases id1,id2      # back up a subset (remembered for scheduled runs)
restora backup --to local --dir ./bk    # back up to a local folder instead
restora connect s3                      # connect your own S3-compatible bucket (see below)
restora backup --to s3                  # back up to your bucket
restora backup --keep 30                # keep only the newest 30 backups
restora backup --keep-weeks 8           # also delete backups older than 8 weeks (newest is always kept)
restora schedule --daily 02:00 | --remove
restora guard                           # snapshot BEFORE letting an AI agent loose (see below)
restora guard --report                  # exactly what that agent changed

Inspect your backups (offline, read-only)

Point these at your backup files — the newest in your local folder by default, or any file with --file <path>. All run entirely on your machine, make no network calls, and never change anything. They return proper exit codes, so they drop straight into CI or a pre-commit hook.

restora doctor                          # one-shot health check: connections, latest backup, integrity, freshness
restora validate                        # is this a well-formed backup file?  (exit 1 if not)
restora verify                          # integrity: files present, decode cleanly, relations intact  (exit 1 if not)
restora stats                           # counts: databases, rows, views, relations, files
restora inspect                         # duplicate rows/databases, broken rollups, detached pages
restora tree                            # the workspace hierarchy at a glance
restora search "launch email"           # full-text search across titles, properties, and page content
restora diff old-backup.json new-backup.json   # what changed between two snapshots (databases, rows, schema)

Same pure engines as the web app and the MCP server — just printed to your terminal.

Before you let an AI agent loose: restora guard

AI agents — Notion AI, MCP-connected assistants, bulk-edit scripts — can now edit and delete across your whole workspace in seconds. guard is the seatbelt:

restora guard --label "before-cleanup-agent"    # full snapshot, kept out of your normal backup history
# ... let the agent run ...
restora guard --report                          # rows added/removed/EDITED, schema changes, pages — offline

The report names exactly what changed (row and page titles, property changes), and both snapshots are full backups — if the agent broke something, restore the "before" file at app.restora.cc. For pipelines: --json prints the diff as JSON, and --fail-on-changes exits 1 when anything changed (CI gate for "this automation must not touch Notion").

Migrate in, export out (free, local)

restora import-obsidian ./MyVault --parent <notion-page-url>   # Obsidian vault → Notion, images included
restora export-md <notion-page-url> --out page.md              # any Notion page → clean Markdown
restora export-md <url> --images download                      # ...with images saved alongside

Both run entirely on your machine with your own token — migration is never paywalled.

Bring your own bucket (S3-compatible)

restora connect s3 connects AWS S3, Backblaze B2, Cloudflare R2, Wasabi, or DigitalOcean Spaces — no Restora setup required, you just supply your own bucket + keys (stored locally only, never sent to us). It asks for the provider, region/endpoint, bucket, and an access key/secret (use a key scoped to just that bucket: PutObject, ListBucket, DeleteObject). Then restora backup --to s3. Note: on S3, retention (--keep / --keep-weeks) permanently deletes old backups — enable bucket versioning if you want recoverability.

Use your backups from any AI agent (MCP)

restora mcp runs a local, read-only MCP server that lets any MCP-capable AI agent — Claude Desktop, Cursor, Cline, Continue, Zed, ChatGPT desktop, and more — read the backups already on your machine. Ask "what was in my Projects database last week?", "map my whole workspace", or "what changed since this backup?" and the agent answers by calling the server's tools.

Privacy by design: Restora makes no LLM calls, holds no API key, and — in its default mode — makes zero network calls. Your own agent does the reasoning over local JSON. Every tool is read-only, so even if a backup contains malicious text it can't trigger any action. (The store-nothing posture, but stronger.)

Get the config snippet to paste into your agent:

restora mcp --print-config

Then add it to your agent (same shape everywhere):

{ "mcpServers": { "restora": { "command": "npx", "args": ["-y", "@restora/cli", "mcp"], "env": {} } } }

By default it reads your local-backup folder (~/Restora Backups, or whatever you set). Point it elsewhere with --dir <folder> or --file <backup.json>.

Tools exposed: list_backups, describe_backup (workspace map: databases, properties, relations, views), query_database (rows with readable values; relations resolved to the linked page titles), get_page (a page as Markdown), search, and read_id_map (old→new ids after a restore, to repoint integrations/webhooks).

Live drift audit (opt-in): add --allow-live to also expose run_drift_audit, which compares a backup against your current Notion (deleted/emptied databases, removed properties, type changes) — the input for a restore plan. This is the only tool that uses the network, and only to your own Notion (it needs restora connect notion); it never calls an LLM or a Restora server.

Very large workspaces (memory)

Backups stream to disk as they're fetched — each database and file is written out and released, so even multi-GB workspaces don't need a big heap (upload destinations briefly use ~the backup's size in temp disk while shipping). The CLI also raises Node's heap automatically for backup as belt-and-suspenders. If a truly enormous single database still runs out of memory:

restora databases                      # list your databases + their ids
restora backup --databases id1,id2     # back up a batch; repeat for the next

Note: a relation from a database in one chunk to a database in another chunk won't resolve across separate files — group related databases into the same run where you can.

Limitations (stated honestly)

  • Scheduled backups run only when this machine is on and awake at the scheduled time.
  • Scheduling writes a small runner to ~/.restora and registers it with the OS scheduler (Windows Task Scheduler / cron). Logs go to ~/.restora/backup.log.
  • Files larger than 20MB inside Notion are not bundled — that's Notion's File Upload API limit (single-part uploads cap at 20MB), so a bigger file couldn't be restored anyway. The link is kept.