Sisu+ is a browser extension for Sisu, the study information system used by Finnish universities. It runs inside your university's own Sisu page and turns the student side of Sisu into a faster planning workspace.
The app brings together the parts students keep checking anyway: degree progress, active courses, enrolments, Moodle deadlines, study-right details, plan structure, and timeline editing. Native Sisu is still one click away when you need it.
- Replaces the
/studentSisu view with a React app inside a shadow DOM. - Opens on a configurable dashboard with degree progress, active courses, registrations, Moodle deadlines, credits, grades, workload, and notification prompts.
- Provides a timeline planner where courses can be moved between study periods, searched, added, and checked for timing or prerequisite problems before saving the plan back to Sisu.
- Includes a structure view for reading the degree plan, checking attainments, opening course details, and updating course versions in bulk.
- Shows registered and available implementations in an enrolments view, then sends the selected registration back to Sisu.
- Can remind you about Moodle deadlines, registration windows, and stale Sisu syncs, either inside the app or through desktop notifications.
- Keeps a floating control center on Sisu for pausing the extension, changing notification settings, connecting Moodle, and returning to native Sisu.
- Includes separate onboarding and landing page builds.
Sisu+ supports every Finnish university that uses Sisu. During onboarding you enter your university's Sisu URL, for
example https://sisu.example.fi, and the extension builds its local config from that domain.
Some universities have a known Moodle domain in the app already. For everything else, Sisu+ derives the Moodle domain
from the Sisu domain by replacing sisu. with moodle.. That covers the common setup, but you may still need to adjust
the config if your university uses a different Moodle hostname.
The quick-pick list in onboarding is only there to make setup faster for common universities. It is not a supported universities list.
Sisu+ does not run a separate student-data backend. It reads the Sisu and Moodle pages/APIs that your browser can already access, then renders a different interface locally.
Extension settings, including the active/paused toggle and Moodle calendar export URL, are stored with Chrome extension storage.
Behind the scenes, Sisu+ asks Chrome for optional host permission only for the Sisu and Moodle origins you choose during onboarding. After that, the background worker registers the content script for that Sisu origin and watches Sisu/Moodle request headers on the selected origins so it can reuse the session your browser already has.
The extension manifest allows https://*.fi/* as optional host permission so the same build can work across Finnish
Sisu universities. The extension does not activate on every .fi site. The stored university config decides where the
content script is registered, and the content script exits unless the current host matches that configured Sisu domain.
This repo uses Bun.
bun install
bun run generate:apisgenerate:apis is required after a fresh clone. The generated Sisu API clients are large, so they are ignored by git
and rebuilt locally from Sisu's internal Swagger docs.
Run the extension build in watch mode:
bun run devBuild the extension once:
bun run buildThen load the generated dist/ folder in Chrome:
- Open
chrome://extensions. - Enable developer mode.
- Choose "Load unpacked".
- Select this repo's
dist/folder. - Open your university's Sisu.
Chrome does not always pick up extension changes cleanly. If something looks stale, reload the extension from
chrome://extensions and refresh the Sisu tab.
Run the landing page locally:
bun run dev:landingBuild it:
bun run build:landingThe Astro landing build writes to dist-landing/.
bun run typecheck
bun run build
bun run build:landing
bun run generate:apisgenerate:apis regenerates Sisu API clients from Sisu's internal Swagger docs:
- Kori
- Arto
- Ilmo
- Ori
- Osuva
Run it after cloning and whenever the generated types need a refresh. The command depends on the upstream Sisu API docs being reachable.
sisu-plus/
├── scripts/
│ ├── export-translations.ts generate an TSV file for translations
│ └── generate-apis.ts regenerate Sisu API clients from Swagger docs
├── docs/
│ └── agents/ agent/project workflow notes
├── src/
│ ├── content/ content-script entrypoint and shadow-root mount
│ ├── background/ service worker
│ │ ├── runtime/ content-script registration and host-scoped request watching
│ │ ├── session/ per-origin Sisu/Moodle session cache
│ │ └── notifications/ notification prefs, cache, scheduling, and delivery
│ ├── onboarding/ first-run university and permission setup
│ ├── shared/ helpers shared across extension and onboarding
│ ├── landing/ Astro landing page and privacy policy
│ └── app/ the Sisu replacement app
│ ├── api/
│ │ ├── generated/ generated Sisu API clients (rebuilt locally, not in git)
│ │ ├── endpoints/ thin wrappers around generated clients
│ │ ├── dataPoints/ composed data and mutations used by views and widgets
│ │ └── resolvers/ helpers for resolving Sisu entities
│ ├── views/
│ │ ├── dashboard/ dashboard, hero panel, widget system
│ │ ├── timeline/ study timeline, course search, validation, plan mutations
│ │ ├── structure/ degree structure, attainments, course details, version updates
│ │ └── registration/ enrolment cards, dialogs, and registration actions
│ ├── components/
│ │ └── changelog/ in-app release notes
│ ├── controlCenter/ floating pause/settings/notification panel
│ ├── locales/ English and Finnish app copy
│ ├── hooks/ shared React hooks, including Chrome storage
│ ├── types/ shared app and preference types
│ └── global.css injected into shadow root
└── dist/ extension build output (load this in chrome://extensions)
- The extension app mounts into a shadow root and injects
src/app/global.cssthere. - The content script replaces the native student page body only when Sisu+ is active.
- Login pages are handed back to native Sisu so authentication still works normally.
- Dashboard layout is stored locally and can be edited in the app.
- Notification data is cached locally. Sisu data refreshes when you visit Sisu; there is no separate background polling backend.
- Timeline and structure saves update the Sisu plan, so changes should be reviewed before confirming.
Sisu+ is under active development. The focus right now is on rounding out course details, re-creating calendar view, and making setup seamless across every Finnish university running Sisu.
Sisu+ is an independent project. It is not affiliated with any university, Sisu, Moodle, or the organizations behind those services.