OpenClaw already powers Discord bots and customer-support agents, but it also happens to be a ridiculously useful personal assistant for anyone juggling lectures, labs, and deadlines. This tutorial walks through a complete OpenClaw personal assistant setup for students and academics: installing the agent (locally or on ClawCloud), wiring it to your calendar and LMS, auto-filing lecture notes, planning study blocks, and even generating citations in whatever style your TA picked this semester. All examples were tested on OpenClaw v0.26.4 with Node 22.2.

Why run OpenClaw as your campus sidekick?

Campus life is basically an interrupt storm: a professor drops a reading at 11 pm, the lab schedule changes overnight, and the library site times out while you scramble for an APA citation. Most students cobble together Google Calendar, Notion, half a dozen Chrome tabs, and a lot of guilt. I wanted a single interface—Slack on my laptop, WhatsApp on my phone—that I could ask:

  • “When is the next CS241 homework due?”
  • “Block 2 hours on Friday after 3 pm for linear algebra revision.”
  • “Summarize Dr. Bao’s lecture PDF and file it under ‘Econ 201/Week 5’.“
  • “Generate an IEEE citation for this arXiv PDF.”

OpenClaw already ships browser control, a shell, persistent vector memory, and over 800 integrations via Composio. The missing piece is a thin layer of skills tuned for campus life. Below I’ll show how to wire those up in about an hour.

Prerequisites and no-excuses install

Hardware options

  • Your laptop: anything that runs Node 22+ and has at least 4 GB RAM. macOS and Linux are smooth; Windows works via WSL.
  • ClawCloud free tier: gives you a hosted daemon for 50 runs/day—plenty for personal use. Zero port forwarding on dorm Wi-Fi.

Local install

# macOS/Linux brew install node@22 # or use fnm/nvm if you already juggle versions npm create openclaw@latest my-campus-claw cd my-campus-claw npm run dev

The first run launches the gateway on http://localhost:8090 and drops you into a setup wizard. Give your agent a name—mine is Talos-TA—and pick a voice. That’s it.

ClawCloud one-click

  1. Sign in with GitHub at console.clawcloud.ai.
  2. Click “New Agent → OpenClaw”.
  3. Name it, hit “Launch”. 60 seconds later you get a public URL and a Slack/Telegram invite link.

Anything you can do locally you can script on ClawCloud; the only difference is remote storage for memory and logs.

Connecting OpenClaw to your campus calendar and LMS

Google Workspace / Outlook 365 integration

The calendar side is solved out of the box by Composio. In the gateway UI:

  1. Settings → Integrations → “Google Calendar” → “Connect”. OAuth pops up.
  2. Click the gear icon → scopes → make sure calendar.readonly and calendar.events are ticked.

Repeat for Outlook if your university forces you into the Microsoft ecosystem. OpenClaw merges accounts behind a single tool schema, so the same skill works for both.

Moodle, Canvas, Blackboard (pick your poison)

Most Learning Management Systems (LMS) expose REST or GraphQL but hide it behind OAuth2 flows you can’t complete outside their domain. The easiest path is a classic browser control skill:

// skills/moodle-scrape.mjs import { registerSkill, browser } from 'openclaw'; registerSkill({ name: 'fetch-course-due-dates', description: 'Return a JSON array of upcoming assignments for the student', run: async ({ username, password }) => { const page = await browser.newPage(); await page.goto('https://moodle.youruniversity.edu'); await page.type('#username', username); await page.type('#password', password); await page.click('button[type="submit"]'); await page.waitForNavigation(); await page.goto('https://moodle.youruniversity.edu/my'); const assignments = await page.$$eval('.assignment .name', els => els.map(el => el.textContent.trim()) ); return assignments; } });

Yes, screen scraping is brittle, but it works without begging IT for an API token. Save the file, restart the daemon, and your agent now accepts prompts like “List my Moodle deadlines for next week.”

Course schedule and assignment tracking

Natural-language calendar entries

Once calendar integration is done, add a quick skills/schedule.mjs:

import { registerSkill, calendar } from 'openclaw'; registerSkill({ name: 'add-course-event', description: 'Add lecture/lab/exam to calendar', run: async ({ text }) => { // naive parse – replace with chrono-node if you need locale support const [title, date, time] = text.split('|'); const start = new Date(`${date} ${time}`); const end = new Date(start.getTime() + 90*60*1000); await calendar.events.insert({ summary: title.trim(), start: { dateTime: start.toISOString() }, end: { dateTime: end.toISOString() } }); return `Added ${title} on ${start.toLocaleString()}`; } });

Now try in Slack:

Me → Talos-TA: add-course-event “CS241 lecture | 2024-09-05 | 14:00”

The agent replies: “Added CS241 lecture on 9/5/2024, 2:00 PM”. In practice I rarely type the raw command. I just ask, “Put next week’s CS241 lecture at 2 PM Thursday”. OpenClaw routes the intent to the skill via its LLM router.

Recurring fetch of LMS assignments

Schedule the scrape skill every morning at 06:00 so the agent remembers deadlines before you wake up:

// gateway UI → Scheduled Tasks cron: 0 6 * * * call: fetch-course-due-dates args: username: "$SECRETS.moodle_user" password: "$SECRETS.moodle_pass"

The results go into persistent memory, which lets you ask days later, “What is due tomorrow?” without hitting Moodle again.

Organizing lecture notes and research references

Auto-file PDFs by course and week

I store slides and readings in a flat Dropbox folder. The agent watches it via the Dropbox webhook and renames files:

// skills/file-notes.mjs import { registerSkill, fs } from 'openclaw'; import path from 'node:path'; registerSkill({ name: 'file-lecture-note', description: 'Move PDF into //Week_ based on filename prefix', run: async ({ filePath }) => { const [, course, week] = /([A-Z]{2,4}\d{3})_W(\d+)/.exec(path.basename(filePath)) || []; if (!course || !week) return 'Filename pattern not recognized'; const destDir = path.join('/dropbox/Notes', course, `Week_${week}`); await fs.mkdir(destDir, { recursive: true }); await fs.rename(filePath, path.join(destDir, path.basename(filePath))); return `Moved to ${destDir}`; } });

Add a simple Composio Dropbox trigger, map the event file.added to file-lecture-note, and forget about manual renames.

Zotero + citation skill

For papers I lean on Zotero’s local database. There’s a community wrapper called zotero-cli you can invoke from a skill:

// skills/cite.mjs import { registerSkill, shell } from 'openclaw'; registerSkill({ name: 'generate-citation', description: 'Return formatted citation for a PDF in a given style', run: async ({ filePath, style = 'apa' }) => { const { stdout } = await shell.exec(`zotero-cli cite --style ${style} "${filePath}"`); return stdout.trim(); } });

Usage:

Me: cite “/dropbox/Notes/CS241/Week_3/paper.pdf” in ieee

Agent: “R. Smith and P. Jones, “Efficient Hash Tables,” IEEE Trans. Comp., vol. 67, no. 4, pp. 123-135, 2024.”

Planning focused study sessions with prompts and timers

I wanted Pomodoro timers without yet another app. A 30-line skill leveraging Node’s setTimeout and Slack’s block kit reminds me to stretch.

// skills/pomodoro.mjs import { registerSkill, slack, memory } from 'openclaw'; registerSkill({ name: 'start-pomodoro', description: 'Start a 25/5 Pomodoro cycle for a topic', run: async ({ topic = 'study' }) => { const mark = Date.now(); await memory.set(`pomodoro:${mark}`, { topic }); await slack.postMessage(`Focus on *${topic}* for 25 min.`); setTimeout(async () => { await slack.postMessage(`Break time! Walk or stretch for 5 min.`); }, 25*60*1000); return 'Timer started'; } });

The agent keeps timers server-side, so closing Slack on your phone doesn’t kill them.

Community spotlight: Sara’s Moodle skill in 120 lines

Sara (3rd-year EE, University of Helsinki) posted a gist last week titled “I got tired of missing lab slots.” Her LMS (Moodle 3.11) doesn’t fire iCal feeds for lab sign-ups. She wrote a browser skill that:

  1. Logs in with saved credentials.
  2. Navigates to the “Electronics Lab” course.
  3. Scrapes the group-selection table.
  4. Calls the calendar tool to block the selected slot.

It’s 121 lines including comments, and she pushed it to GitHub. We merged the pattern into openclaw-skills-community under lms/lab-slot-moodle.mjs. If your university runs Moodle, clone the repo and drop your course slug and CSS selectors. Done.

Fun side note: Sara discovered Moodle’s token cookie lives for two hours. She uses OpenClaw’s encrypted KV store to cache it; fresh logins happen once per night, not on every call. A nice reminder that browser skills aren’t toys—you can still optimise.

Security, quotas, and cost control on a ramen budget

Running an LLM agent sounds pricey. Here’s how I keep the monthly bill under €10.

  • Model choice: OpenClaw defaults to gpt-4o on ClawCloud. Switch to gpt-3.5-turbo-0125 for everyday prompts. In gateway/config.json:
{ "llm": { "provider": "openai", "model": "gpt-3.5-turbo-0125" } }
  • Token limits: Set max_prompt_tokens to 4 096; most queries stay under 800.
  • Skill fallbacks: Put heavy scraping or PDF summarisation behind skills so you can ask once and store the result, instead of re-feeding the whole document to the LLM each time.
  • Local model: If you have a GPU laptop, OpenClaw supports Ollama. A 7-B Llama 3 quantised model handles most scheduling tasks offline.
  • Secrets: Use gateway → Secrets, not .env files floating in git. The uni’s single-sign-on token is worth more than your laptop.

Next steps: share your campus skills and swap notes

That’s the workbench. You now have an agent that tracks deadlines, files lecture notes, plans study blocks, and spits out citations—all reachable from your phone at 2 am. The next move is to trade skills: drop a PR on openclaw-skills-community or hop into the #uni channel on the Discord. The more variants we collect (Canvas, Brightspace, weird home-grown LMSes), the less code we all maintain during finals.