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

n8n-nodes-uni-schedule

v0.2.0

Published

n8n node that reads a live university timetable (sked campus HTML) and turns it into a Markdown table for AI agents

Readme

n8n-nodes-uni-schedule

An n8n community node that reads a live university timetable (a sked campus HTML "Veranstaltungsplan" page) and turns it into a Markdown table, so that AI agents (or humans) can easily look over the current schedule.

It was built for the THWS FIW lecture plan, e.g. https://fiw.thws.de/fileadmin/share/vlplan/BaInf1_2026ws.html, but the calendar URL is a flexible node parameter, so any sked campus page in the same format works.

Features

  • Fetches the timetable live on each execution (always up to date).
  • Configurable Calendar URL — change it whenever your study group / semester URL changes.
  • Window-bounded output by default (Next 7 Days): keeps the tool result small (~a few KB) so AI agents don't burn their context on the whole semester. Go bigger only when needed.
  • Outputs a clean Markdown table (week / day / single-table grouping).
  • Detects the red framing used by sked:
    • a red-framed event is flagged as changed (e.g. "Raumänderung", "Asynchrone Lehre", "Prüfung") or cancelled ("Entfällt");
    • a red day header (e.g. "Campus Day", public holiday) is reported as a special day and attached to that day's rows.
  • Structured JSON output is available as well.
  • Usable as a tool by n8n AI agents (usableAsTool).

Node options

| Parameter | Description | | --- | --- | | Calendar URL | Public URL of the sked campus timetable page (default: THWS BIN1 winter semester 2026). | | Period | Next 7 Days (default), Next 14 Days, This Week, This Month, or Whole Semester (All). Controls how much output is generated — keep it small for AI agents. | | Fixed Date Range | Optional From / To date to override the period with an exact window. | | Output Format | Markdown Table (default), Events (JSON), or Markdown + Events. | | Max Events | Safety cap on the number of returned events (0 = no limit). Useful to bound context. | | Group By | Week (default), Day, or None. | | Include Cancelled Events | Keep or drop cancelled entries (default: keep). | | Only Changed or Cancelled | Return only the "what changed" digest (default: off). |

Output fields

  • markdown – the Markdown document (when the format includes Markdown) with the covered date range shown in its header.
  • events – array of structured events (when the format includes events).
  • planTitle, sourceUrl, scrapedAt.
  • stats – { range, weeks, events, changed, cancelled }.

Each event contains: date, weekday, start, end, title, group, lecturer, room, status (scheduled | changed | cancelled), changed, cancelled, notes, note, dayNote, weekLabel.

Example output

# Veranstaltungsplan BIN1

_13 events across 1 weeks from 2026-10-19 to 2026-10-21 (changed: 1, cancelled: 0). Status legend: scheduled, changed (red frame in source), cancelled._

## 4. Studienwoche, 43. KW: 19. - 25.10.2026
_Special days: 2026-10-21 - Campus Day_

| Date | Time | Title | Group | Lecturer | Room | Status | Note |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 2026-10-19 (Mo) | 10:00-13:15 | SU Algebra [BIN] | Gruppe 1 | Keller | H.1.3 | changed | Asynchrone Lehre |
| 2026-10-20 (Di) | 08:15-09:45 | Ü Programmieren I [BIN] | Gruppe 1 | Zilker | I.2.18 | scheduled | - |

Installation

npm install
npm run build

Then load the package in n8n:

  • Local development: point the N8N_CUSTOM_EXTENSIONS / n8n-nodes volume at this folder, or run npm link inside it and link it into your n8n installation.
  • Community node: publish the package and install it via Settings → Community nodes.

Development

npm run build      # tsc + copy icons
npm run dev        # tsc --watch
npm run lint       # eslint
npm run format     # prettier

How the parsing works

The helpers in nodes/UniversitySchedule/helpers are dependency-free:

  • htmlTable.ts parses the HTML <table> into a grid of cells, resolving rowspan/ colspan so each cell knows its column position.
  • parseSchedule.ts splits the page into week blocks, maps event cells to their day column, extracts time / title / group / lecturer / room / notes, and interprets the sked red-framing as changed/cancelled.
  • markdown.ts renders the parsed schedule as grouped Markdown tables.

License

MIT