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

skool-cli

v2.2.1

Published

CLI and programmatic API for Skool.com automation — create lessons, posts, and manage communities via browser automation

Readme

skool-cli

CLI, MCP Server, and programmatic API for Skool.com automation. 37 commands covering courses, lessons, events, posts, members, analytics, group settings, user profile, notifications, chat, new member monitoring, and pending membership request alerts via Telegram.

Skool has no public API. This tool uses browser automation (Playwright) for auth and Skool's internal API for all content operations.

Quick Start

npm install -g skool-cli
npx playwright install chromium
skool login --email [email protected] --password yourpass

Commands (37)

Authentication

skool login --email [email protected] --password yourpass
skool whoami --group my-community

Courses

# Create (with optional cover image and privacy)
skool create-course -g my-community -t "Course Name" -d "Description" --cover cover.jpg --privacy level

# Edit
skool edit-course --id COURSE_ID --title "New Name" --description "New desc" --cover new.jpg -g my-community

# List, move, duplicate, delete
skool list-courses -g my-community --json
skool move-course --id COURSE_ID --direction right
skool duplicate-course --id COURSE_ID
skool delete-course --id COURSE_ID

Lessons

# Create (with video, resources, images, folder placement)
skool create-lesson -g my-community -m "Module" --course "Course" -t "Title" \
  -f lesson.md --video "https://youtu.be/xxx" \
  --resource "Docs::https://docs.example.com" --folder "Module 1"

# Edit, move, delete, list
skool edit-lesson --id PAGE_ID --title "New" --file updated.md --video "url" --resource "title::url"
skool move-lesson --id PAGE_ID --target-folder "Module 2" -g my-community --course "Course"
skool delete-lesson --id PAGE_ID
skool list-lessons -g my-community --course "Course" --json

# Create folders
skool create-folder -g my-community --course "Course" -t "Module Name"

Calendar Events

# Create (one-time or recurring with cover)
skool create-event -g my-community -t "Weekly Q&A" \
  --start "2026-04-07T20:00:00-04:00" --end "2026-04-07T21:00:00-04:00" \
  --repeat "weekly:mon" --cover event.jpg -d "Description"

# Edit (preserves recurrence unless --repeat specified)
skool edit-event --id EVENT_ID -g my-community --title "New" --repeat "weekly:tue"

# List, delete
skool list-events -g my-community --json
skool delete-event --id EVENT_ID

Community Posts

# Create, edit, delete (via API, resolves category by name)
skool create-post -g my-community -t "Title" -b "Body" -c "General"
skool edit-post --id POST_ID --title "Updated" --body "New body"
skool delete-post --id POST_ID

# List posts and categories
skool get-posts -g my-community --json
skool get-categories -g my-community

Members & Leaderboard

skool get-members -g my-community --search "name" --json
skool get-leaderboard -g my-community --period 30d --json

Analytics

skool get-analytics -g my-community --json
# Returns: members, visitors, signups, conversion rate, MRR

Group Settings

# Settings > General description
skool edit-about -g my-community -d "Group description"

# About page landing description
skool edit-about -g my-community --about "Landing page text (max 1000 chars)"

# Display name
skool edit-about -g my-community -n "New Group Name"

User Profile

# Get your profile (name, bio, social links, etc.)
skool get-profile
skool get-profile --json

# Edit profile fields
skool edit-profile --bio "New bio" --location "Fort Myers, FL"
skool edit-profile --website "https://example.com" --twitter "https://x.com/user"
skool edit-profile --photo ./my-photo.jpg

# List your communities
skool list-communities
skool list-communities --json

Notifications

skool get-notifications --json
skool mark-notifications-read

Chat

# List conversations
skool get-chats --json

# Read messages
skool get-chat-messages --channel CHANNEL_ID --json

# Send a message
skool send-chat-message --channel CHANNEL_ID -m "Hey!"

Watch Members (Telegram Alerts)

# One-time setup: configure Telegram bot
skool watch-members --setup-telegram

# Monitor for new members (polls every 5 minutes)
skool watch-members -g my-community --interval 5m

# With JSON output for piping
skool watch-members -g my-community --interval 5m --json

# With optional welcome DM (#NAME# replaced with member's first name)
skool watch-members -g my-community --welcome "Hey #NAME#, welcome!"

# Also monitor pending membership requests (requires admin/moderator auth)
skool watch-members -g my-community --include-pending

Watch Pending Requests (Telegram Alerts)

# Monitor for new pending membership requests (requires admin/moderator auth)
skool watch-pending -g my-community --interval 5m

# With JSON output
skool watch-pending -g my-community --json

Pending request notifications include the applicant's name, request time, and their answers to membership questions (if configured).

Content Format

Lessons support full markdown with auto-upload of local images:

## Heading
**Bold**, *italic*, ***both***, ~~strike~~, `code`
- Bullet lists
1. Numbered lists
[Links](url) and ![images](./local.jpg)
> Blockquotes
```code blocks```
---

Programmatic API

import { SkoolClient } from 'skool-cli';

const client = new SkoolClient();
await client.login('[email protected]', 'yourpass');

// Courses
await client.createCourse({ group: 'my-community', title: 'Course', coverImage: './cover.jpg' });
const { courses } = await client.listCourses('my-community');
await client.editCourse({ id: courses[0].id, title: 'Updated' });
await client.moveCourse(courses[0].id, 'right');
await client.duplicateCourse(courses[0].id);

// Lessons with video, resources, and local images
await client.createLesson({
  group: 'my-community', module: 'Mod', title: 'Lesson',
  markdownContent: '## Hello\n\n![photo](./img.jpg)',
  videoUrl: 'https://youtu.be/xxx',
  resources: [{ title: 'Docs', link: 'https://docs.example.com' }],
});
await client.editLesson({ id: 'id', title: 'Updated', markdownContent: '## New' });
await client.moveLesson({ id: 'id', targetFolder: 'Mod 2', group: 'my-community', course: 'Course' });

// Events with recurrence
await client.createEvent({
  group: 'my-community', title: 'Q&A',
  startTime: '2026-04-07T20:00:00-04:00', endTime: '2026-04-07T21:00:00-04:00',
  recurrence: { frequency: 'weekly', interval: 1, days: [1] },
});
await client.editEvent({ id: 'id', group: 'my-community', title: 'Updated', repeat: 'weekly:tue' });

// Posts (API-based, resolves categories by name)
await client.createPost({ group: 'my-community', title: 'Hello!', body: 'Post body', category: 'General' });
await client.editPost({ id: 'id', title: 'Updated', body: 'New body' });

// Analytics & Leaderboard
const { data } = await client.getAnalytics('my-community');
const { users, levels } = await client.getLeaderboard('my-community', '30d');

// Group settings
await client.editAbout({ group: 'my-community', aboutDescription: 'Landing page text' });

// User profile
const { profile } = await client.getProfile();
const { communities } = await client.listCommunities();
await client.editProfile({ bio: 'New bio', location: 'City' });

// Notifications & Chat
const { notifications } = await client.getNotifications();
await client.markNotificationsRead();
const { channels } = await client.getChats();
const { messages } = await client.getChatMessages(channels[0].id);
await client.sendChatMessage(channels[0].id, 'Hello!');

// Pending membership requests (requires admin/moderator auth)
const { pending } = await client.getPendingMembers('my-community');
// Returns: { id, name, firstName, lastName, bio, photoUrl, requestedAt, questions[] }

await client.close();

Environment Variables

| Variable | Description | |----------|-------------| | SKOOL_EMAIL | Default email for login | | SKOOL_PASSWORD | Default password | | SKOOL_GROUP | Default group slug | | SKOOL_CLI_HEADLESS | false for visible browser | | SKOOL_CLI_DATA_DIR | Data directory (default: ~/.skool-cli/) | | SKOOL_CLI_TIMEOUT | Timeout in ms (default: 30000) | | SKOOL_TELEGRAM_BOT_TOKEN | Telegram bot token (alternative to --setup-telegram) | | SKOOL_TELEGRAM_CHAT_ID | Telegram chat ID (alternative to --setup-telegram) |

Use as Claude Code Skill

mkdir -p .claude/skills/skool-cli
curl -o .claude/skills/skool-cli/SKILL.md https://raw.githubusercontent.com/unikprompt/skool-cli/main/skill/SKILL.md

Use as MCP Server

{
  "mcpServers": {
    "skool": {
      "command": "npx",
      "args": ["-y", "skool-cli", "skool-mcp-server"]
    }
  }
}

Learn More

License

MIT