← All Skills

snappy-skool

v1.0.0
17 files, 168.9 KB ~2,499 words · 10 min read Updated 2026-09-09

snappy-skool skill

47 of 54 checks pass
What it can do
healthread
meread
groupread
adminsread
levelsread
coursesread
course course_idread
labelsread
linksread
posts page?read
post-detail slugread
comments slugread
+12 more
What does not pass yet
Architecture 3 endpoints
GETPOST
api2.skool.com3 endpoints
GET/groups/{slug}
POST/posts
POST/channels/{channelId}/messages
$ npx snappy-skills install snappy-skool
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── api.ts ├── entities.json ├── face.test.ts ├── faces/ │ ├── components/ │ │ ├── skool-comment-composer.css │ │ ├── skool-comment-composer.tsx │ │ ├── skool-faces.css │ │ ├── skool-faces.tsx │ │ └── skool-post-preview.tsx │ ├── family.tsx │ └── fixtures/ │ ├── skool-classroom.json │ ├── skool-comment.json │ ├── skool-comments.json │ ├── skool-feed.json │ └── skool-post.json └── refusals.test.ts
Documents
AGENTS.md

snappy-skool Agent Loader#

Use api.ts as the only operational road. Do not recreate Skool calls with curl, guessed endpoints, or browser clicks.

Contract#

bashnpx tsx ~/.claude/skills/snappy-skool/api.ts contract

Reads run now. post, comment, and dm stage through snappy-settings/stage.ts. Never add --now; only the approval executor may do that.

Need Command
Cookie health npx tsx ~/.claude/skills/snappy-skool/api.ts health
Cookie owner npx tsx ~/.claude/skills/snappy-skool/api.ts me --json
Group census npx tsx ~/.claude/skills/snappy-skool/api.ts group
Admins, levels, labels, links admins, levels, labels, links
Classroom courses, course <id>, modules
Feed posts [page], post-detail <slug>, comments <slug>, questions [page]
Members members [page]
Other group reads leaderboards, calendar, brief
Chats chats [limit], then messages <channel-id>
Stage content post <title> <body> [category], comment <slug> <body>
Stage DM dm <channel-id> <body>

Use --group <slug> for any Skool group. Default: snappy. Chats are account-scoped.

--json on a read is the FACE's object#

posts --json prints skool-feed, post-detail --json prints skool-post, and

comments --json (spelled thread when you want the shape word) prints

skool-comments. Each carries kind, and its other keys ARE that face's props

-- the community's own name and member count, the author's name and avatar, the

category's WORDS, the excerpt, the like and comment counts. Draw one with

npx tsx ~/.claude/skills/snappy-faces/api.ts draw <kind> --data-file <file>.

WITHOUT --json a read answers the hand's own object, which is where id,

slug and permalink live -- use that when you need a handle to go on with,

then post-detail <slug>. Every other read (group, members, chats,

leaderboards, …) prints its own answer under --json as it always did,

because no Skool face draws those shapes yet.

Auth#

Cookie jar: ~/.openclaw/workspace/skool-auth.json.

  • auth_token currently expires 2027-07-19 unless revoked.
  • The headed refresh renews aws-waf-token for four days and AWSALB* for seven days.
  • If health says api2=true, site=false, refresh the headed browser state. Do not ask for a password first.
  • Never print cookie values.

Exact refresh commands and the sign-in fallback are in SKILL.md section 3.

Endpoint discipline#

The private API was measured from the live site's network log and current frontend bundle on 2026-09-08. Do not guess a path. If a captured path changes, stop and recapture before changing code.

The program uses:

  • api2.skool.com for group, admin, levels, course, category, link, and chat JSON.
  • Authenticated www.skool.com HTML __NEXT_DATA__ for account, feed, post, member, classroom, leaderboard, and calendar reads.
  • A fresh page securityNonce sent as x-sk-sec only after approval.

Write governance#

  • post has effect post.
  • comment has effect post.
  • dm has effect send.
  • A raw shell call stages too.
  • If the stage door is unavailable, nothing was sent. Do not fall back to direct fetch or browser automation.
  • Classroom and member write endpoints are documented research only. They are not contract verbs.

StateChange#

StateChange is pro.statechange.ai, not Skool. It uses a separate browser state and is not served by --group. No snappy-statechange alias exists.

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-skool Index]|root: ~/.claude/skills/snappy-skool|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-course
  • snappy-image

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
health read npx tsx ~/.claude/skills/snappy-skool/api.ts health
me read npx tsx ~/.claude/skills/snappy-skool/api.ts me
group read npx tsx ~/.claude/skills/snappy-skool/api.ts group
admins read npx tsx ~/.claude/skills/snappy-skool/api.ts admins
levels read npx tsx ~/.claude/skills/snappy-skool/api.ts levels
courses read npx tsx ~/.claude/skills/snappy-skool/api.ts courses
course course_id read npx tsx ~/.claude/skills/snappy-skool/api.ts course <course_id>
labels read npx tsx ~/.claude/skills/snappy-skool/api.ts labels
links read npx tsx ~/.claude/skills/snappy-skool/api.ts links
posts page? read npx tsx ~/.claude/skills/snappy-skool/api.ts posts
post-detail slug read npx tsx ~/.claude/skills/snappy-skool/api.ts post-detail <slug>
comments slug read npx tsx ~/.claude/skills/snappy-skool/api.ts comments <slug>
thread slug read npx tsx ~/.claude/skills/snappy-skool/api.ts thread <slug>
members page? read npx tsx ~/.claude/skills/snappy-skool/api.ts members
modules read npx tsx ~/.claude/skills/snappy-skool/api.ts modules
leaderboards read npx tsx ~/.claude/skills/snappy-skool/api.ts leaderboards
calendar read npx tsx ~/.claude/skills/snappy-skool/api.ts calendar
chats limit? read npx tsx ~/.claude/skills/snappy-skool/api.ts chats
messages channel_id read npx tsx ~/.claude/skills/snappy-skool/api.ts messages <channel_id>
questions page? read npx tsx ~/.claude/skills/snappy-skool/api.ts questions
brief read npx tsx ~/.claude/skills/snappy-skool/api.ts brief
post title, body, category? post npx tsx ~/.claude/skills/snappy-skool/api.ts post "<title>" "<body>"
comment post, body post npx tsx ~/.claude/skills/snappy-skool/api.ts comment <post> "<body>"
dm channel_id, body send npx tsx ~/.claude/skills/snappy-skool/api.ts dm <channel_id> "<body>"

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-skool
role: Skool reader and governed community writer
loaded-by: preload-skill-context hook
Triggers on: snappy-skool, Skool, community, community post, member, classroom, leaderboard, DM
---

# snappy-skool Agent Loader

Use `api.ts` as the only operational road. Do not recreate Skool calls with curl, guessed endpoints, or browser clicks.

## Contract

```bash
npx tsx ~/.claude/skills/snappy-skool/api.ts contract
```

Reads run now. `post`, `comment`, and `dm` stage through `snappy-settings/stage.ts`. Never add `--now`; only the approval executor may do that.

| Need | Command |
|---|---|
| Cookie health | `npx tsx ~/.claude/skills/snappy-skool/api.ts health` |
| Cookie owner | `npx tsx ~/.claude/skills/snappy-skool/api.ts me --json` |
| Group census | `npx tsx ~/.claude/skills/snappy-skool/api.ts group` |
| Admins, levels, labels, links | `admins`, `levels`, `labels`, `links` |
| Classroom | `courses`, `course <id>`, `modules` |
| Feed | `posts [page]`, `post-detail <slug>`, `comments <slug>`, `questions [page]` |
| Members | `members [page]` |
| Other group reads | `leaderboards`, `calendar`, `brief` |
| Chats | `chats [limit]`, then `messages <channel-id>` |
| Stage content | `post <title> <body> [category]`, `comment <slug> <body>` |
| Stage DM | `dm <channel-id> <body>` |

Use `--group <slug>` for any Skool group. Default: `snappy`. Chats are account-scoped.

## `--json` on a read is the FACE's object

`posts --json` prints `skool-feed`, `post-detail --json` prints `skool-post`, and
`comments --json` (spelled `thread` when you want the shape word) prints
`skool-comments`. Each carries `kind`, and its other keys ARE that face's props
-- the community's own name and member count, the author's name and avatar, the
category's WORDS, the excerpt, the like and comment counts. Draw one with
`npx tsx ~/.claude/skills/snappy-faces/api.ts draw <kind> --data-file <file>`.

WITHOUT `--json` a read answers the hand's own object, which is where `id`,
`slug` and `permalink` live -- use that when you need a handle to go on with,
then `post-detail <slug>`. Every other read (`group`, `members`, `chats`,
`leaderboards`, …) prints its own answer under `--json` as it always did,
because no Skool face draws those shapes yet.

## Auth

Cookie jar: `~/.openclaw/workspace/skool-auth.json`.

- `auth_token` currently expires 2027-07-19 unless revoked.
- The headed refresh renews `aws-waf-token` for four days and `AWSALB*` for seven days.
- If `health` says `api2=true, site=false`, refresh the headed browser state. Do not ask for a password first.
- Never print cookie values.

Exact refresh commands and the sign-in fallback are in `SKILL.md` section 3.

## Endpoint discipline

The private API was measured from the live site's network log and current frontend bundle on 2026-09-08. Do not guess a path. If a captured path changes, stop and recapture before changing code.

The program uses:

- `api2.skool.com` for group, admin, levels, course, category, link, and chat JSON.
- Authenticated `www.skool.com` HTML `__NEXT_DATA__` for account, feed, post, member, classroom, leaderboard, and calendar reads.
- A fresh page `securityNonce` sent as `x-sk-sec` only after approval.

## Write governance

- `post` has effect `post`.
- `comment` has effect `post`.
- `dm` has effect `send`.
- A raw shell call stages too.
- If the stage door is unavailable, nothing was sent. Do not fall back to direct fetch or browser automation.
- Classroom and member write endpoints are documented research only. They are not contract verbs.

## StateChange

StateChange is `pro.statechange.ai`, not Skool. It uses a separate browser state and is not served by `--group`. No `snappy-statechange` alias exists.


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-skool Index]|root: ~/.claude/skills/snappy-skool|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-course`
- `snappy-image`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `health` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts health` |
| `me` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts me` |
| `group` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts group` |
| `admins` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts admins` |
| `levels` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts levels` |
| `courses` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts courses` |
| `course` | `course_id` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts course <course_id>` |
| `labels` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts labels` |
| `links` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts links` |
| `posts` | `page?` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts posts` |
| `post-detail` | `slug` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts post-detail <slug>` |
| `comments` | `slug` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts comments <slug>` |
| `thread` | `slug` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts thread <slug>` |
| `members` | `page?` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts members` |
| `modules` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts modules` |
| `leaderboards` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts leaderboards` |
| `calendar` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts calendar` |
| `chats` | `limit?` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts chats` |
| `messages` | `channel_id` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts messages <channel_id>` |
| `questions` | `page?` | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts questions` |
| `brief` | — | `read` | `npx tsx ~/.claude/skills/snappy-skool/api.ts brief` |
| `post` | `title`, `body`, `category?` | `post` | `npx tsx ~/.claude/skills/snappy-skool/api.ts post "<title>" "<body>"` |
| `comment` | `post`, `body` | `post` | `npx tsx ~/.claude/skills/snappy-skool/api.ts comment <post> "<body>"` |
| `dm` | `channel_id`, `body` | `send` | `npx tsx ~/.claude/skills/snappy-skool/api.ts dm <channel_id> "<body>"` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?