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

lectio-ts

v0.1.0

Published

A TypeScript library for integrating with Lectio, the Danish school platform

Readme

lectio-ts

A TypeScript library for integrating with Lectio, the Danish school LMS platform.

Note: Lectio has no official API. This library uses HTML scraping and authenticated HTTP requests to interact with the platform.

Features

  • Token-based authentication using Lectio's autologinkeyV2 cookie
  • Persistent cookie jar with automatic session refresh
  • Schedule fetching with full lesson details (subject, teacher, room, status)
  • Typed responses with Zod schemas
  • Works in Node.js and Bun

Installation

# npm
npm install lectio-ts

# bun
bun add lectio-ts

Quick Start

import { LectioClient } from "lectio-ts";

const client = new LectioClient({
  schoolId: 94,                    // Your school's Lectio ID
  autologinKey: "your-key-here",   // Value of autologinkeyV2 cookie
  debug: false,                    // Optional: enable debug logging
});

// Establish session
const session = await client.connect();
console.log(`Connected as ${session.isTeacher ? "teacher" : "student"}`);

// Fetch this week's schedule
const schedule = await client.getSchedule();

for (const day of schedule.days) {
  console.log(`${day.dayName} ${day.date}`);
  for (const lesson of day.items) {
    console.log(`  ${lesson.startTime}-${lesson.endTime} ${lesson.subject?.name}`);
  }
}

Getting Your Autologin Key

  1. Log in to Lectio in your browser
  2. Open DevTools → Application → Cookies
  3. Find the autologinkeyV2 cookie for www.lectio.dk
  4. Copy its value

The autologin key is a long-lived token that Lectio uses for "remember me" functionality.

API Reference

LectioClient

const client = new LectioClient({
  schoolId: number;         // Required: school ID from Lectio URL
  autologinKey: string;     // Required: autologinkeyV2 cookie value
  debug?: boolean;          // Optional: enable debug logging
  fetch?: FetchFn;          // Optional: custom fetch implementation
});

client.connect(): Promise<SessionInfo>

Establishes the authenticated session. Must be called before other methods.

Returns:

{
  studentId: string;
  isTeacher: boolean;
}

client.getSchedule(options?): Promise<WeekSchedule>

Fetches the weekly schedule.

Options:

{
  week?: string;      // Week in format "WW2025" (e.g., "082025")
  studentId?: string; // Override the student ID
}

Returns a WeekSchedule with days, lessons, and module information.

Types

interface WeekSchedule {
  weekNumber: number;
  year: number;
  days: ScheduleDay[];
  modules: ModuleInfo[];
}

interface ScheduleDay {
  date: string;           // ISO date "2025-02-17"
  dayName: string;        // "Mandag", "Tirsdag", etc.
  items: ScheduleLesson[];
  isWeekend: boolean;
}

interface ScheduleLesson {
  activityId?: string;
  subject?: { name: string; code?: string };
  teacher?: { name: string; initials: string };
  room?: { name: string };
  startTime?: string;     // "08:10"
  endTime?: string;       // "09:40"
  date: string;
  status: "normal" | "changed" | "cancelled";
  title?: string;
  topic?: string;
  homework?: { description: string }[];
  notes?: string;
}

Errors

All errors extend LectioError:

  • AuthenticationError – Invalid or expired autologin key
  • SessionExpiredError – Session expired (auto-refresh failed)
  • NetworkError – HTTP request failed
  • ParseError – Failed to parse Lectio HTML

Demo CLI

A demo script is included to test the library:

LECTIO_SCHOOL_ID=94 LECTIO_AUTOLOGIN_KEY=your-key bun run schedule

Or with debug output:

DEBUG=1 LECTIO_SCHOOL_ID=94 LECTIO_AUTOLOGIN_KEY=your-key bun run schedule

Development

# Install dependencies
bun install

# Run tests
bun test

# Type check
bun run typecheck

# Lint & format
bun run check

# Build
bun run build

Architecture

See ARCHITECTURE.md for details on how the codebase is structured.

License

MIT