Automated knowledge garden for students of the Cyber Defense degree program at UNDEF (Argentina).
kdef is an independent student project that:
- downloads course materials from Moodle,
- generates structured summaries with LLMs,
- extracts important academic dates from those materials,
- publishes those summaries as a static website,
- and allows students to add collaborative notes.
The project is designed to stay simple, low-cost, and easy to replicate for other academic programs.
This repository is:
- a student-maintained learning resource,
- a searchable and linkable knowledge garden,
- and an automated content pipeline.
This repository is not:
- official UNDEF content,
- an institutional publication,
- or a replacement for the official Moodle platform.
The content layer is intentionally split into three areas:
content/notas-automaticas/: bot-generated summaries from Moodle materials (pipeline-owned)content/notas-colaborativas/: human-written collaborative notescontent/porque-kdef/: project documentation (architecture, contribution guide, replication guide)
.github/
workflows/
ci.yml
dependabot-automerge.yml
update-garden.yml
config/
campus.yml
content/
notas-automaticas/
notas-colaborativas/
porque-kdef/
scripts/
auth.py
catalog.py
pipeline.py
scraper.py
summarizer.py
manifest.py
academic_calendar.py
quartz/
quartz.config.ts
quartz.layout.ts
The weekly GitHub Actions workflow (.github/workflows/update-garden.yml) runs the pipeline:
- Scrape/download source materials from Moodle.
- Generate summaries with LLMs (primary + fallback model strategy).
- Detect and normalize important dates (finals, exams, deliveries, etc.) from each document.
- Publish a generated calendar page plus an
.icsfeed incontent/notas-automaticas/calendario/. - Track processed files with SHA-256 (
scripts/manifest.py) to avoid reprocessing unchanged inputs. - Commit new/updated generated markdown in
content/notas-automaticas/. - Build and deploy the static site.
npm install
npm run serveThe site is served at http://localhost:8080.
Generated non-markdown assets under content/ are copied by Quartz as-is, so the
calendar feed ends up published alongside the generated pages.
cp .env.example .env
# fill your environment values
pip install -r scripts/requirements.txt
DRY_RUN=true python scripts/pipeline.pyCore variables used by the pipeline and deployment:
TRACKED_SUBJECTSMOODLE_URLMOODLE_USERMOODLE_PASSMODELS_API_KEYGEMINI_API_KEYCF_API_TOKENCF_ACCOUNT_IDDRY_RUNFORCE_REPROCESS
See .env.example for details.
The campus course catalogue lives in config/campus.yml. TRACKED_SUBJECTS
selects which slug values from that file should be processed.
- Add student notes in
content/notas-colaborativas/. - Follow the contribution guide in porque-kdef/18-como-contribuir.
- Do not edit
content/notas-automaticas/manually.
To reuse this setup for other degree programs, see:
MIT. See LICENSE.txt.