{"id":50530697,"url":"https://github.com/monashcoding/monmap","last_synced_at":"2026-06-03T13:02:07.608Z","repository":{"id":352761142,"uuid":"1216426733","full_name":"monashcoding/monmap","owner":"monashcoding","description":"Course mapper for Monash students, meant to replace MonPlan (sunset June 2026)","archived":false,"fork":false,"pushed_at":"2026-05-31T05:05:20.000Z","size":1160,"stargazers_count":4,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T07:07:22.003Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://monmap.monashcoding.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monashcoding.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-20T22:30:31.000Z","updated_at":"2026-05-31T05:05:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/monashcoding/monmap","commit_stats":null,"previous_names":["monashcoding/monmap"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/monashcoding/monmap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monashcoding%2Fmonmap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monashcoding%2Fmonmap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monashcoding%2Fmonmap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monashcoding%2Fmonmap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monashcoding","download_url":"https://codeload.github.com/monashcoding/monmap/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monashcoding%2Fmonmap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33865655,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-03T13:02:06.771Z","updated_at":"2026-06-03T13:02:07.599Z","avatar_url":"https://github.com/monashcoding.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# MonMap\n\n**A course planner for Monash students, built by the [Monash Association of Coding](https://monashcoding.com).**\n\nMeant to replace [MonPlan](https://monplan.apps.monash.edu), which is being sunset on 2 June 2026.\n\n[**Live site**](https://monmap.monashcoding.com) · [Report a bug](https://github.com/monashcoding/monmap/issues) · [Feedback form](https://docs.google.com/forms/d/e/1FAIpQLSfEMCU4OCItlK6DGgIXTovH7_sPSW6mZtMaPGf1OCUQW_43kg/viewform)\n\n![MonMap planner screenshot](docs/screenshot.webp)\n\n\u003c/div\u003e\n\n## Overview\n\nMonMap lets you drag units onto a year-by-year grid and see, in real\ntime, whether your plan actually works. It checks prereqs and slot\nofferings against the actual Monash handbook, flags what doesn't fit,\nsurfaces what's missing from your course requirements, and keeps a\nrunning WAM as you tweak. Sign in to save plans across devices, or use\nit anonymously and export to JSON.\n\n## Features\n\n- **Quick unit search.** Two-pane layout with slot-fit hints and a\n  recent-units rail so common picks are one click away.\n- **Plans you own.** Export, re-import, print, or share. Your data\n  travels with you.\n- **Faithful handbook coverage.** Cross-year prereqs, honours track\n  variations, and the trickier offering rules are all modelled\n  explicitly.\n- **Open source.** If something looks off for your course, read the\n  code, file an issue, or send a PR.\n\n## Getting started\n\nJust visit [**monmap.monashcoding.com**](https://monmap.monashcoding.com).\nNo account required to start planning; sign in with your Monash Google\naccount to sync across devices.\n\n## Contributing\n\nPRs welcome. If you're a Monash student and something feels off about\nhow a unit, prereq, or course is rendered, that's almost always a bug\nworth filing. Open an [issue](https://github.com/monashcoding/monmap/issues)\nwith the unit code and what you expected. For non-code feedback there's\na **Feedback** form linked in the app.\n\n## Development\n\nSingle Next.js app backed by a local Postgres copy of the Monash\nhandbook. The handbook data is published as a tarball on\n[GitHub Releases](https://github.com/monashcoding/monmap/releases), so\nyou don't need scraper credentials to spin up a working instance.\n\n### Prerequisites\n\n- Node ≥ 22 (tested on 25.8)\n- pnpm ≥ 10\n- Postgres ≥ 14 running locally\n\n### First-time setup\n\n```bash\n# 1. Install workspace deps\npnpm install\n\n# 2. Configure env at the repo root (one .env, see CLAUDE.md §1)\ncp .env.example .env\n# Edit DATABASE_URL if your Postgres isn't on localhost:5432/monmap\n\n# 3. Create the database and apply migrations\ncreatedb monmap\npnpm db:migrate\n\n# 4. Download the latest handbook corpus from GitHub releases\n#    (~120 MB; covers 2020–2026). Requires the gh CLI; alternatively\n#    grab it from https://github.com/monashcoding/monmap/releases/latest\ngh release download --repo monashcoding/monmap --pattern 'monmap-handbook-*.tar.gz'\n\n# 5. Unpack into the scraper data directory\nmkdir -p packages/scraper/data\ntar -xzf monmap-handbook-*.tar.gz -C packages/scraper/data\n\n# 6. Load every year into Postgres (~37k units, ~3k courses, ~70k\n#    offerings across 7 academic years)\npnpm ingest:all\n```\n\n### Running the app\n\n```bash\npnpm --filter webapp dev         # http://localhost:3000\n```\n\n### Day-to-day commands\n\n```bash\npnpm db:generate                 # after editing schema.ts, write a new migration\npnpm db:migrate                  # apply pending migrations\npnpm db:studio                   # open drizzle-kit's db browser\n\npnpm --filter webapp test        # pure-function unit tests (node --test)\npnpm --filter webapp typecheck\n\npnpm ingest                      # load a single year (default 2026) from ./packages/scraper/data\npnpm ingest:all                  # load every year present in the data dir\n```\n\n\u003e `drizzle-kit push` is deliberately not wired up. Schema changes go\n\u003e through `db:generate` + `db:migrate` so the history stays auditable\n\u003e (CLAUDE.md §2).\n\n### Cutting a new handbook release (maintainers)\n\nThe corpus on [GitHub Releases](https://github.com/monashcoding/monmap/releases)\nis the canonical source for everyone's local Postgres. To refresh it,\nre-scrape from CourseLoop and pack the result:\n\n```bash\npnpm scrape:all                  # fetch every published year (slow, hours)\npnpm package                     # roll monmap-handbook-YYYYMMDD.tar.gz\ngh release create handbook-YYYYMMDD monmap-handbook-YYYYMMDD.tar.gz \\\n  --title \"Handbook snapshot: YYYY-YYYY (Month YYYY)\"\n```\n\n### Project conventions and gotchas\n\n- Repo-wide conventions: [`CLAUDE.md`](CLAUDE.md).\n- Handbook data quirks (fields that silently lie, JSONB tree shapes,\n  cross-year references): [`docs/handbook-internals.md`](docs/handbook-internals.md).\n  Worth skimming before writing a query.\n\n## Credits\n\nBuilt and maintained by the [**MAC Projects team**](https://monashcoding.com/team)\nat the [Monash Association of Coding](https://monashcoding.com).\n\nThanks to the MAC committee for backing the project, every Monash\nstudent who's filed a bug or sent a screenshot, and the maintainers of\nthe open-source libraries we lean on.\n\n## License\n\n[AGPL-3.0-only](LICENSE). If you run a modified version of MonMap as a\nnetwork service, you must make your source available to its users.\nInternal forks and private experimentation are fine; redistributing or\nhosting a modified copy means publishing your changes under the same\nlicense.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonashcoding%2Fmonmap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonashcoding%2Fmonmap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonashcoding%2Fmonmap/lists"}