| name | blackboard-school |
| category | education |
| description | Cetys Blackboard automation — scrape tasks, generate LaTeX reports and essays, track assignments. Uses CuaDriver for browser control. |
| trigger | ["blackboard","cetys","tareas","cursos","assignments","ensayo","latex"] |
blackboard-school
Automates CETYS Blackboard (cetys.blackboard.com). Scrapes pending assignments, generates LaTeX reports and essays, tracks task status.
Blackboard Credentials
Workflow
1. Login to Blackboard
https://cetys.blackboard.com
- Click "Iniciar sesión" / "Login"
- Enter matrícula M041852 + password (from current chat)
- Dismiss "Save Password?" Safari sheet → click "Not Now"
2. Scrape Tasks (EFFICIENT — use Activity Stream)
PRIMARY path: Activity/Stream (/ultra/stream) — aggregates ALL assignments with due dates, status, course tags. 10x faster than entering each course.
- After login → sidebar → "Actividad" or navigate to
https://cetys.blackboard.com/ultra/stream
- Use
get_window_state without query filter → read tree_markdown for text (AX tree works without JS; page tool fails unless "Allow JS from Apple Events" is enabled)
- Sections: "Importante" (past due), "Próximo" (upcoming), "Hoy" (due today)
- Each entry has: course code, title, due date, due time, status (Vencido/Vence hoy/Fecha de vencimiento)
- Click "Mostrar más próximas actividades" to reveal hidden entries
- Log to
tasks.json (see references/activity-stream-scrape.md)
FALLBACK: course-by-course via sidebar "Cursos" → click course → "Contenido" → expand folders
3. LaTeX Compilation
- Use
tectonic at /opt/homebrew/bin/tectonic
- CETYS logo (amarillo/dorado): official at
https://www.cetys.mx/userfiles/plecas/66_LogotipoInstitucional.jpg → saved as assets/cetys-logo-yellow.png
- Pitfall: tectonic rejects relative asset paths. Copy logos to
/tmp/ before compile, or use absolute paths
- Output PDF to skill
assets/ directory
4. Essay Writing (Ser Humano y Ética / humanidades)
User style: "Menos es más" — simple palabras, redacción like Alejandro.
Rules:
- Words a high schooler would use. No academic jargon. No fancy connectors.
- Sentences short. One idea per sentence. Periods, not semicolons.
- Paragraphs: 3-4 sentences max.
- Tone: direct, conversational, like talking to a classmate.
- Structure: intro (what we compare + why), development (interview vs theory + comparison), conclusion (learnings, gaps).
- Cover: CETYS yellow logo, course code, group members (no "Alumno:" or "Matrícula:" heading — just the 4 names under "Integrantes:"), professor, date.
- Interviewees: never use real names or phone numbers. "Entrevistado 1: Profesionista, área X" and "Entrevistado 2: Profesionista, área Y". Generic.
- Length: exactly what the assignment asks. Body only (not cover/annexes). No filler.
- SafeAssign: essays are originality-checked. Keep content plausible. No robotic fabricated data — use generic-but-realistic responses.
- Never echo raw LaTeX in output — just compile and deliver PDF.
- Template:
templates/ensayo-template.tex — copy to /tmp/, replace PLACEHOLDER_CAPS with real content, compile with tectonic.
- Logo: use
assets/cetys-logo-clean.png (cropped version, no "Logotipo Institucional" label). Source PNG at assets/cetys-logo-yellow.png if re-crop needed.
5. Task Tracking (tasks.json format)
{
"tasks": [{
"id": "1",
"course": "Nombre del Curso",
"code": "MXL2601-XXX-XX",
"title": "Título",
"due_date": "2026-05-20",
"due_time": "23:59",
"status": "pendiente|atrasado|entregado|evento",
"urgency": "hoy|mañana|próximo|vencido"
}]
}
Tools & Paths
| Tool | Path |
|---|
| LaTeX (tectonic) | /opt/homebrew/bin/tectonic |
| Computer Use | CuaDriver MCP (mcp_cua_driver_*) |
| Skills dir | /Volumes/SandiskSSD/Documents/Local/hermes-agent/home/skills/blackboard-school/ |
| CETYS logo (amarillo) | assets/cetys-logo-yellow.png (119KB, official source) |
State File
- Location:
/Volumes/SandiskSSD/Documents/Local/hermes-agent/home/state/HANDOFF.md
- ALWAYS update after each session with: last login, task counts, active courses, in-progress items
- This file is the Telegram context recovery mechanism — if session drops, reload from here
Pitfalls
- 2FA: stop and ask Alejandro if Blackboard asks for code
- Session expiry: re-login if pages return to login screen
- Context loss: Telegram loses history; always load HANDOFF.md on session start
- JS from Apple Events:
page(action='get_text') fails unless enabled in Safari Developer settings. Fallback: use get_window_state AX tree text
- Password save popup: after login, click "Not Now" to dismiss — never save credentials
- Wrong URL:
/ultra/activity → 404. Use /ultra/stream
- Logo path in tectonic: absolute paths may fail. Copy logo to
/tmp/ and use local path
¿ glyph in tectonic: ¿ renders as £ in PDF output. \textquestiondown also fails (same glyph). Use plain ? — only stable option with Latin Modern font. Verify with pdftotext file.pdf - | grep '£' after compile.
ª glyph in tectonic: feminine ordinal ª renders as ł. Use \textordfeminine instead of raw char. Same T1/Latin Modern limitation as ¿.
- Logo crop: CETYS official download includes a left-side "Logotipo Institucional" label. Open with PIL:
img.crop((int(w*0.46), 0, w, h)) removes it. Save as cetys-logo-clean.png.
- PDF verification: after compile, run
pdftotext file.pdf - | grep '£' to confirm zero visible pounds. Also check ł for ordinal issues.
- NEVER SUBMIT: do not click Enviar/Submit on Blackboard. Only prepare drafts and PDFs. Submission is Alejandro-only.
Verification
- After login: confirm "ALEJANDRO APODACA CORDOVA" in user menu
- After scrape: tasks.json has entries with due dates in YYYY-MM-DD format
- After compile: PDF at target path, verify file size > 0