This repository runs the public course calendar for The Kiwi Dialectic.
It does four jobs:
courses.json..ics calendar feed for Google Calendar, Apple Calendar, and Outlook.https://robertmccallnz.github.io/kiwidialecticcalendar-/github-calendar-connector.html
https://raw.githubusercontent.com/robertmccallnz/kiwidialecticcalendar-/main/the-kiwi-dialectic-courses.ics
github-calendar-connector.html — the public calendar page served by GitHub Pages.courses.json — the source of truth for courses, lessons, access labels, and links.the-kiwi-dialectic-courses.ics — the generated calendar feed for subscriber apps.scripts/generate_ics.py — the script that builds the ICS file from courses.json..github/workflows/refresh-events.yml — GitHub Actions workflow for rebuilding the ICS file.how-to-subscribe-calendar.md — copy for Substack explaining how readers subscribe to the calendar.kiwi-dialectic-course-workflow.md — the operating guide for how courses, Substack access, and the calendar fit together.Substack is the school gate. GitHub calendar is the timetable on the wall.
Substack decides who can read a course. The GitHub calendar shows what exists, when it runs, and where readers should click.
There are three access states used across the repo.
publicUse when anyone can read the lesson.
free_subscriberUse when a reader must subscribe for free before reading.
paidUse when the lesson is for paid subscribers.
courses.json.link fields.{
"title": "Gramsci for Aotearoa",
"slug": "gramsci-for-aotearoa",
"status": "Live",
"access": "free_subscriber",
"calendar_visibility": "public",
"description": "Power, hegemony, institutions, and counter-power from below.",
"lessons": [
{
"title": "Lesson 1: Why read Gramsci now?",
"date": "2026-07-07",
"time": "19:00",
"location": "Substack email",
"access": "free_subscriber",
"calendar_visibility": "public",
"teaser": "Free subscribers can read the lesson in the Courses section.",
"link": "https://your-substack-link"
}
]
}
calendar_visibility: public → appears on the public calendar and in the ICS feed.calendar_visibility: hidden → does not appear publicly.Use hidden for unfinished, internal, or sensitive material.
Before every course launch:
courses.json is updated.Check courses.json for missing commas, broken quotes, wrong field names, or bad links.
Check calendar_visibility in both the course and lesson data.
Check the access value in courses.json.
That is usually correct behavior if the lesson is subscriber-only or paid. The gate is on Substack, not on GitHub.