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

offcourse

v1.5.1

Published

Download online courses for offline access – of course!

Readme

Offcourse

Powered by Sebastian Software npm version npm downloads license node codecov CI

Download online courses for offline access – of course! 📚

→ View Documentation & Homepage

Quick Start

# Install
npm install -g offcourse

# Download a course
offcourse sync <course-url>

# Or run without installing
npx offcourse sync <course-url>

Requires Node.js 22+ and ffmpeg for HLS videos.

Supported Platforms

| Platform | URL Pattern | | ------------------------------------------------------ | ---------------------------------- | | Skool | skool.com/community/classroom | | HighLevel | member.*.com/courses/... | | Josh Comeau Courses | courses.joshwcomeau.com/<course> | | LearningSuite | *.learningsuite.io/student/... | | Piccalilli | piccalil.li/<course>/lessons |

Key Commands

# Sync a course (auto-detects platform)
offcourse sync <url>

# Sync with options
offcourse sync <url> --skip-videos      # Text only
offcourse sync <url> --dry-run          # Preview
offcourse sync <url> --limit 5          # Test with 5 lessons

# Skool login with community access verification
offcourse login https://www.skool.com/<community>/classroom

# Piccalilli OTP login (sync also prompts automatically)
offcourse login https://piccalil.li/<course>/lessons

# Josh Comeau Magic Link login (sync also prompts automatically)
offcourse login https://courses.joshwcomeau.com/<course>

# LearningSuite login (session is saved per tenant)
offcourse login https://<tenant>.learningsuite.io/student/course/<course>/<id>

# Unlock sequential content (LearningSuite)
offcourse complete <url>

# Configuration (optional)
offcourse config set outputDir ~/Courses  # Default: current directory
offcourse config set videoQuality 720p    # Default: highest
offcourse config set concurrency 3        # Parallel downloads (1-5, default: 2)
offcourse config set extractionConcurrency 6  # Browser tabs (1-8, default: 4)

Performance

Course scanning and content extraction use extractionConcurrency browser tabs (default: 4). All tabs share the same authenticated session. Video downloads use a separate concurrency queue (default: 2), so browser work and network/download load can be tuned independently.

Troubleshooting

ffmpeg is missing

Video downloads that use HLS require ffmpeg. Confirm it is available with ffmpeg -version; if the command is missing, install ffmpeg with your operating system's package manager and retry the sync.

Playwright cannot find Chromium

Install the browser binary used by the scraper, then retry:

npx playwright install chromium

When working from a repository checkout, use pnpm exec playwright install chromium instead.

A saved session expired

Clear the saved session and force a fresh login for the affected platform URL:

offcourse logout <url>
offcourse login <url> --force

A lesson failed

Offcourse stores per-lesson failure details for every supported platform and supports a targeted retry:

offcourse status <url> --errors
offcourse sync <url> --retry-failed

Development

See CONTRIBUTING.md for commit conventions, Git hooks, and pull-request expectations.

git clone https://github.com/sebastian-software/offcourse.git
cd offcourse
corepack enable
pnpm install
pnpm build
pnpm link --global  # optional: link globally

Commands

pnpm dev               # Watch mode
pnpm check             # Format, lint, types, unit tests, and build
pnpm test              # Unit tests in watch mode
pnpm test:integration  # Network/ffmpeg integration tests

Releases

Releases are automated with Release Please. Merging its release PR updates the package version and changelog, creates the GitHub release, and publishes the package to npm. The recommended setup is npm Trusted Publishing for the publish.yml workflow; an NPM_TOKEN repository secret remains supported as a fallback. A RELEASE_PLEASE_TOKEN secret is recommended so release PRs run the regular pull-request CI. To recover a release after configuring npm authentication, run the Release workflow manually with publish set to true.

Adding a New Platform

  1. Create src/scraper/newplatform/ with:
    • auth.ts – Session detection
    • navigator.ts – Course structure
    • extractor.ts – Content extraction
    • schemas.ts – Zod schemas
  2. Add a platform sync handler in src/cli/commands/
  3. Register URL detection in src/cli/syncPlatform.ts and delegation in src/cli/index.ts

Acknowledgments

Thanks to Sindre Sorhus for the excellent packages powering this project: slugify, conf, delay, execa, ky, p-retry.

License

MIT