← Back to Skills Marketplace
axel5o5

EdStem

by axel browne · GitHub ↗ · v1.1.0
cross-platform ⚠ suspicious
759
Downloads
0
Stars
0
Active Installs
3
Versions
Install in OpenClaw
/install edstem
Description
Fetch, sync, and organize EdStem discussion threads for any course or institution. Use when checking for new EdStem posts, syncing course discussion forums,...
README (SKILL.md)

EdStem

Fetch and organize EdStem discussion threads from any course or institution with automatic staff/student differentiation.

Quick Start

Fetch recent threads for any course:

cd /home/axel/.openclaw/workspace/skills/edstem/scripts
python3 fetch-edstem.py \x3Ccourse_id> [output_dir] [--course-name "Course Name"]

Examples:

# Fetch to default directory (./edstem-\x3Ccourse_id>)
python3 fetch-edstem.py 92041

# Fetch to specific directory
python3 fetch-edstem.py 92041 ./machine-learning

# Specify course name for clearer output
python3 fetch-edstem.py 92041 --course-name "Machine Learning"

# Combine directory and course name
python3 fetch-edstem.py 92041 ./ml-course --course-name "Machine Learning"

# Fetch more threads (default is 10)
python3 fetch-edstem.py 92041 --limit 25

Finding Your Course ID

To find your EdStem course ID:

  1. Log into EdStem and navigate to your course
  2. Look at the URL: https://edstem.org/us/courses/\x3Ccourse_id>/
  3. The number in the URL is your course ID

Alternatively, use the API to list your courses:

curl -H "Authorization: Bearer YOUR_TOKEN" https://us.edstem.org/api/user | jq '.courses[] | {id: .course.id, name: .course.name}'

What Gets Fetched

For each course:

  • threads.json - Full thread list with metadata
  • thread-XXX.md - Individual threads formatted as markdown
    • Thread title, category, timestamps
    • Original post content
    • All answers and comments
    • [STAFF] or [STUDENT] tags on every post

Features

  • Institution-agnostic: Works with any school using EdStem
  • Staff differentiation: Clearly marks instructor/TA posts vs student posts
  • Structured output: Markdown format for easy reading and searching
  • API-based: Uses EdStem's official API (no scraping)
  • Flexible output: Choose your own output directory and organization scheme

Authentication

The skill uses a bearer token stored in the Python script. To use with your own account:

  1. Log into EdStem in your browser
  2. Open Developer Tools → Network tab
  3. Reload any EdStem page
  4. Find an API request and copy the Authorization: Bearer ... token
  5. Update ED_TOKEN in scripts/fetch-edstem.py

Current token location: Line 20 in scripts/fetch-edstem.py

If API calls fail (401 Unauthorized), your token likely expired and needs refresh.

Scripts

fetch-edstem.py (recommended)

Full-featured Python script with markdown formatting and staff/student differentiation.

Usage:

python3 scripts/fetch-edstem.py \x3Ccourse_id> [output_dir] [options]

Options:

  • output_dir - Where to save threads (default: ./edstem-\x3Ccourse_id>)
  • --course-name NAME - Display name for the course
  • --limit N - Number of threads to fetch (default: 10)

Features:

  • Fetches thread metadata and full details
  • Full markdown formatting with answers and comments
  • Automatic staff role detection
  • JSON cache of thread list
  • Auto-creates output directory

fetch-edstem.sh (lightweight alternative)

Bash/curl version for raw JSON fetching without dependencies.

Usage:

bash scripts/fetch-edstem.sh \x3Ccourse_id> [output_dir]

Outputs:

  • Raw JSON files for each thread
  • Requires manual formatting or post-processing

Common Workflows

Check for new posts

python3 scripts/fetch-edstem.py 92041 ~/courses/ml-spring-2025

Sync multiple courses

# Create a simple sync script
for course in "92041:machine-learning" "94832:advanced-rl"; do
    IFS=':' read -r id name \x3C\x3C\x3C "$course"
    python3 scripts/fetch-edstem.py $id ~/courses/$name --course-name "$name"
done

Review recent activity

After fetching, check the markdown files:

ls -lt ./edstem-92041/*.md | head
cat ./edstem-92041/thread-001.md

Search across threads

grep -r "gradient descent" ./edstem-92041/*.md

Output Structure

\x3Coutput_dir>/
├── threads.json              # Thread metadata
├── thread-001.md             # Individual threads
├── thread-002.md
└── ...

Each markdown file contains:

  • Thread metadata (number, title, category, timestamps)
  • Original post with author role
  • All answers (sorted, with role tags)
  • All comments (with role tags)

Integration Examples

With LLM agents

# Fetch threads and analyze with your agent
python3 fetch-edstem.py 92041 ./course-data
# Then: "Summarize the most common questions in ./course-data/"

Automated monitoring

# Add to cron for daily sync
0 9 * * * cd /path/to/skills/edstem/scripts && python3 fetch-edstem.py 92041 ~/courses/ml

Custom organization

# Organize by semester and institution
python3 fetch-edstem.py 92041 ~/school/stanford/2025-spring/cs229
python3 fetch-edstem.py 94832 ~/school/mit/2025-spring/6.7920

Troubleshooting

401 Unauthorized: Token expired. Re-authenticate and update ED_TOKEN in the script.

Course not found: Verify the course ID and that your account has access.

Empty threads: Check that the course has discussion posts and you're enrolled.

Rate limiting: EdStem may rate-limit API requests. Add delays between fetches if needed.

Contributing

This skill is open-source and institution-agnostic by design. Improvements welcome:

  • Better content parsing (EdStem uses XML-based document format)
  • Support for filtering by category or date range
  • Incremental sync (only fetch new threads)
  • Export to other formats (JSON, HTML, etc.)

Version History

  • 1.1.0 - Made institution-agnostic with flexible parameters
  • 1.0.0 - Initial release
Usage Guidance
Don't run this as-is. Both scripts include a hardcoded EdStem bearer token — that is a secret and its presence is a red flag. Before installing or running: 1) Treat the included token as compromised; do not use it. 2) Replace the ED_TOKEN usage with a secure pattern (read token from an environment variable or a permissioned config file) and remove any hardcoded token from the code. 3) If you are the owner of the included token, rotate/revoke it immediately. 4) If you don't know who published this skill, prefer to fork or copy the scripts locally, remove the hardcoded token, and audit the code (and any leftover developer-specific paths like /home/axel) before running. 5) Consider running fetches with a least-privilege token and avoid storing tokens in repo files; add any local token file to .gitignore. These steps will reduce the risk of unauthorized access or accidental data exposure.
Capability Analysis
Type: OpenClaw Skill Name: edstem Version: 1.1.0 The skill bundle is classified as suspicious due to the presence of a hardcoded EdStem API bearer token (`ED_TOKEN = "dptT0u.adkdSAKHoFQpttiLLmuxaJRqxekDmNMIxaYZgLUn"`) in both `scripts/fetch-edstem.sh` and `scripts/fetch-edstem.py`. While the documentation (SKILL.md, README.md, PUBLISHING.md) instructs users to replace this token with their own and acknowledges it as a security concern, its inclusion in a published skill bundle constitutes a critical vulnerability, potentially exposing the skill owner's EdStem account if the token is active. All network calls are directed to the legitimate EdStem API, and there is no evidence of malicious intent such as data exfiltration to unauthorized endpoints, persistence mechanisms, or prompt injection attempts designed to subvert the agent's core function beyond its stated purpose.
Capability Assessment
Purpose & Capability
The name/description match the code and SKILL.md: both Python and bash scripts call EdStem's API to list and fetch threads, format output, and differentiate staff vs student. No unrelated services or binaries are requested.
Instruction Scope
Runtime instructions stay within the stated purpose (fetching EdStem threads). The SKILL.md instructs users how to obtain a Bearer token via browser DevTools and to insert it into the Python script (ED_TOKEN), which is functional but insecure. Quick-start examples include a developer-specific path (/home/axel/...), indicating leftover local configuration.
Install Mechanism
No install spec (instruction-only) and included scripts are run locally. There are no downloads or external installers. This minimizes installer risk, but the included code will execute on the user's system when run.
Credentials
The skill declares no required credentials, yet both scripts contain a hardcoded ED_TOKEN value (same token in fetch-edstem.py and fetch-edstem.sh). Embedding an active bearer token in distributed code is a major mismatch and a sensitive secret leak: it exposes whoever owns that token and may let anyone running the scripts access that account's EdStem data. The SKILL.md/README instructs editing the script to paste your token instead of using environment variables, which is poor practice and inconsistent with typical credential handling.
Persistence & Privilege
The skill does not request persistent/always-on privilege and does not modify other skills or global agent configuration. It suggests user-managed automation (cron), which is a user action and not an automatic permission escalation by the skill itself.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install edstem
  3. After installation, invoke the skill by name or use /edstem
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.1.0
Institution-agnostic: works with any school using EdStem, flexible output directories, auto course name detection
v1.0.1
Fixed publishing metadata
v1.0.0
Initial release: Fetch and organize EdStem discussion threads with staff/student differentiation for Columbia courses
Metadata
Slug edstem
Version 1.1.0
License
All-time Installs 0
Active Installs 0
Total Versions 3
Frequently Asked Questions

What is EdStem?

Fetch, sync, and organize EdStem discussion threads for any course or institution. Use when checking for new EdStem posts, syncing course discussion forums,... It is an AI Agent Skill for Claude Code / OpenClaw, with 759 downloads so far.

How do I install EdStem?

Run "/install edstem" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is EdStem free?

Yes, EdStem is completely free (open-source). You can download, install and use it at no cost.

Which platforms does EdStem support?

EdStem is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created EdStem?

It is built and maintained by axel browne (@axel5o5); the current version is v1.1.0.

💬 Comments