Skip to content
Draft
Show file tree
Hide file tree
Changes from 84 commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
91d436f
add new, simpler patching system
yoper12 Feb 3, 2026
f413a32
add linting
yoper12 Feb 3, 2026
e9fb7cc
resolve some issues
yoper12 Feb 3, 2026
9052e76
add dom observers and dummy cleanup function
yoper12 Feb 4, 2026
c1413f8
add some complicated logic to automatically infer types of patch sett…
yoper12 Feb 5, 2026
13120fe
update deps
yoper12 Feb 6, 2026
cb1c88a
add device type per patch defining; add new ElementBuilder class
yoper12 Feb 7, 2026
e0c9725
simplify icons names
yoper12 Feb 18, 2026
6786afd
add cleanup logic
yoper12 Feb 25, 2026
62aa531
fix nested ifs in elementbuilder
yoper12 Feb 25, 2026
2943a11
fix potencial race condition in loadPatches
yoper12 Feb 25, 2026
139717f
add settings caching
yoper12 Feb 25, 2026
deeaf74
add support for css patches
yoper12 Feb 27, 2026
99051e9
add vscode config
yoper12 Feb 27, 2026
8d8f3e9
add logger class
yoper12 Feb 27, 2026
83597ca
fix patches not applying if deviceTypes not specified
yoper12 Feb 27, 2026
c33081d
add support for multiple css files
yoper12 Feb 27, 2026
b5828a4
deduplicate url change detection mechanism
yoper12 Feb 27, 2026
64e3b99
fix cleanup method not running on each url change when patch set to o…
yoper12 Feb 28, 2026
0af4a88
append css to document.documentElement if document.head is not yet av…
yoper12 Feb 28, 2026
25108e3
extract dev checking to a variable
yoper12 Feb 28, 2026
3049040
use vite alias instead of relative paths
yoper12 Feb 28, 2026
a44daa1
change crxjs to wxt for better firefox support
yoper12 Feb 28, 2026
5764d78
add svelte linting
yoper12 Feb 28, 2026
fe48efe
update deps
yoper12 Feb 28, 2026
c6ec45a
update import paths and add new code snippet for patches with css
yoper12 Mar 4, 2026
b4c8f98
fix logging levels to more accurate ones
yoper12 Mar 4, 2026
159b51b
simplify logging message on patch load and update Logger import path
yoper12 Mar 4, 2026
3da1a72
add jsdoc and svelte prettier plugins
yoper12 Mar 4, 2026
3b76eed
mv dirs to new paths and replace chrome with wxt's browser api
yoper12 Mar 8, 2026
d94ab52
mv docs imgs out of public/
yoper12 Mar 8, 2026
20deecb
add service worker for settings updates debouncing
yoper12 Mar 8, 2026
e77cd2c
new popup
yoper12 Mar 22, 2026
d761952
refined boolean setting ui
yoper12 Mar 23, 2026
c6a8885
change line length to systemd's style
yoper12 Mar 23, 2026
a712ce3
add ElementBuilder unit tests
yoper12 Mar 28, 2026
c32c1ee
add definePatch tests
yoper12 Mar 28, 2026
b2ce3e1
add SettingsManager unit tests
yoper12 Mar 29, 2026
77fd4e1
add automatic abort controller handling and remove classes containing…
yoper12 Mar 31, 2026
b5d8be7
add dynamic patching support
yoper12 Mar 31, 2026
7a7ba01
fix linter errors
yoper12 Apr 1, 2026
742223a
fix codeql errors
yoper12 Apr 1, 2026
fcb1297
remove unnecessary ts-expect-error comments
yoper12 Apr 1, 2026
15a2dac
simplify ElementBuilder method names
yoper12 Apr 1, 2026
6621503
Revert "remove unnecessary ts-expect-error comments"
yoper12 Apr 1, 2026
e268eec
some detect error here and some not, so ts-ignore is mandatory
yoper12 Apr 1, 2026
ed79e31
remove linter from lint-staged
yoper12 Apr 1, 2026
062518b
use URLPattern instead regexp
yoper12 Apr 1, 2026
8fd7e4f
Dark theme (#7)
yoper12 Feb 2, 2026
ee45d0b
Remove patches.json and move darkTheme to src
yoper12 Apr 7, 2026
e321a70
Add GitHub workflows
yoper12 Apr 7, 2026
2363072
Add workflow that automatically builds the extension on push
yoper12 Apr 7, 2026
9df57b5
Merge branch 'main' into new-patching-system
yoper12 Apr 7, 2026
37e41f2
fix workflows
yoper12 Apr 7, 2026
29477ad
format
yoper12 Apr 7, 2026
baf203e
new tests
yoper12 Apr 7, 2026
c9f6ce8
fix jsdoc
yoper12 Apr 7, 2026
c610c75
change forEach to more readable for..of
yoper12 Apr 7, 2026
8ffbe5a
fix github action not finding files
yoper12 Apr 8, 2026
e2c16b1
add DomObservers tests
yoper12 Apr 8, 2026
2b23ac3
inject css via new CSSStyleSheet api, update tests
yoper12 Apr 9, 2026
28e0f0f
use newer functions in ElementBuilder causing better readability
yoper12 Apr 9, 2026
bbbc554
determine device type using media query, which is more reliable
yoper12 Apr 9, 2026
8fde797
bring back default line length
yoper12 Apr 9, 2026
de0b23e
fix eslint errors
yoper12 Apr 9, 2026
d8f8cff
rewrite redirectToLogin to new patching api
yoper12 Apr 9, 2026
2c839e7
adapt highlightToday to the new patching api
yoper12 Apr 10, 2026
b8c3242
add main to isolated bridge
yoper12 Apr 12, 2026
2e9197c
fix eslint issues
yoper12 Apr 12, 2026
1f2039d
fix bridge
yoper12 Apr 12, 2026
f90b244
port hideWeekends to the new api
yoper12 Apr 13, 2026
f41a4ed
port hideWCAG to the new api
yoper12 Apr 13, 2026
b3364d7
port hideTutorsFromBoard to the new api
yoper12 Apr 13, 2026
0c644a2
port hideHelpOnDashboard to the new api
yoper12 Apr 13, 2026
fb1f36c
port hideFooter to the new api
yoper12 Apr 13, 2026
24da2e2
port hideEmptyExamResults to the new api
yoper12 Apr 13, 2026
1e95462
port alignedDetailedGradesButton to the new api
yoper12 Apr 13, 2026
11407e8
port cleanUpEduVulcanHome to the new api
yoper12 Apr 13, 2026
fc60b6e
port arrows to the new api
yoper12 Apr 13, 2026
8e5e00c
remove unnecessary media query
yoper12 Apr 13, 2026
6fe347e
add runStrategy and runAt where appropriate
yoper12 Apr 13, 2026
6ee4a55
fix border issue after hiding wcag
yoper12 Apr 13, 2026
693e27a
move to variable outfit
yoper12 Apr 19, 2026
dfef07e
adapt darkTheme to the new patching api
yoper12 Apr 19, 2026
b0f6f7b
port cleanupGrades to the new api
yoper12 May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ root = true
[*]
indent_style = space
indent_size = 4
end_of_line = crlf
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false
trim_trailing_whitespace = true
insert_final_newline = true

[*.yml]
indent_style = space
indent_size = 2
34 changes: 34 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Build

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
build:
name: Build extension
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

- name: Install dependencies
run: |
bun install
bunx wxt prepare

- name: Build Chrome ZIP
run: bun run zip

- name: Build Firefox ZIP
run: bun run zip:firefox

- name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
path: .output/*.zip
include-hidden-files: true
if-no-files-found: error
compression-level: 9
4 changes: 3 additions & 1 deletion .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ jobs:
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

- name: Install dependencies
run: bun install
run: |
bun install
bunx wxt prepare

- name: Add TypeScript annotations matcher
run: |
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ jobs:
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

- name: Install dependencies
run: bun install
run: |
bun install
bunx wxt prepare

- name: Run Prettier
run: bunx prettier --check .
4 changes: 3 additions & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ jobs:
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

- name: Install dependencies
run: bun install
run: |
bun install
bunx wxt prepare

- name: Run ESLint
env:
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ jobs:
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

- name: Install dependencies
run: bun install
run: |
bun install
bunx wxt prepare

- name: Run Vitest
run: bun run vitest run --reporter=github-actions
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
.output
stats.html
stats-*.json
.wxt

# Editor directories and files
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
7 changes: 7 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"objectWrap": "collapse",
"experimentalTernaries": true,
"experimentalOperatorPosition": "start",
"plugins": ["prettier-plugin-svelte", "prettier-plugin-jsdoc"],
"tsdoc": true
}
74 changes: 74 additions & 0 deletions .vscode/definePatch.code-snippets
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
{
"definePatch": {
"scope": "typescript",
"prefix": "definePatch",
"body": [
"import { definePatch } from \"@/utils/definePatch\";",
"import { route } from \"@/utils/route\";",
"",
"export default definePatch({",
" meta: {",
" id: \"$1\",",
" name: \"$2\",",
" description: \"$3\",",
" matches: [route(\"*\")],",
" },",
" init() {",
" $0",
" },",
" cleanup() {}",
"});",
],
},
"definePatch with settings": {
"scope": "typescript",
"prefix": "definePatchSettings",
"body": [
"import { definePatch } from \"@/utils/definePatch\";",
"import { route } from \"@/utils/route\";",
"",
"export default definePatch({",
" meta: {",
" id: \"$1\",",
" name: \"$2\",",
" description: \"$3\",",
" matches: [route(\"*\")],",
" settings: [{",
" id: \"$5\",",
" name: \"$6\",",
" description: \"$7\",",
" type: \"$8\",",
" defaultValue: $9,",
" }],",
" },",
" init(settings) {",
" $0",
" },",
" cleanup() {}",
"});",
],
},
"definePatch with CSS": {
"scope": "typescript",
"prefix": "definePatchCSS",
"body": [
"import { definePatch } from \"@/utils/definePatch\";",
"import { route } from \"@/utils/route\";",
"import css from \"./style.css?inline\"",
"",
"export default definePatch({",
" meta: {",
" id: \"$1\",",
" name: \"$2\",",
" description: \"$3\",",
" matches: [route(\"*\")],",
" },",
" css,",
" init() {",
" $0",
" },",
" cleanup() {}",
"});",
],
},
}
10 changes: 10 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"recommendations": [
"oven.bun-vscode",
"vitest.explorer",
"editorconfig.editorconfig",
"dbaeumer.vscode-eslint",
"svelte.svelte-vscode",
"esbenp.prettier-vscode"
]
}
11 changes: 11 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"bun.test.enable": false,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"eslint.codeActionsOnSave.mode": "all",
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"package.json": "bun.lock, tsconfig.json, eslint.config.js, .prettierrc, vitest.config.ts, wxt.config.ts, web-ext.config.ts"
},
"files.exclude": { "**/.wxt": true, "**/node_modules": true }
}
3 changes: 2 additions & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
MIT License

Copyright (c) 2024 BanOcean
Copyright (c) 2024-2025 BanOcean
Copyright (c) 2024-2026 IFV & Hephaestus Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
88 changes: 52 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,91 +1,107 @@
# Improvements for VULCAN
# Hephaestus

Browser extension with improvements for eduVULCAN and Dziennik VULCAN.
Browser extension with improvements for █████████ and ████████ ██████.

## Installation
<a href="https://ifv.banocean.com/downloads/firefox"><img src="./assets/add to firefox.svg"></a><img width=10px><a href="https://ifv.banocean.com/downloads/chrome"><img src="./assets/add to chrome.svg"></a>

<a href="https://ifv.banocean.com/downloads/firefox"><img src="./docs/add to firefox.svg"></a><img width=10px><a href="https://ifv.banocean.com/downloads/chrome"><img src="./docs/add to chrome.svg"></a>

[Installation guide [PL]](https://ifv.banocean.com)<br>
[Adding extension to browsers for development](#development-workflow)
[Adding the extension to browsers for development](#development-workflow)

## Features

<details>
<summary>Mobile navigation</summary>

| Before: | After: |
| --------------------------------------------------------------- | -------------------------------------------------------------- |
| <img src="./screenshots/mobileNavBefore.png" width="300px" /> | <img src="./screenshots/mobileNavAfter.png" width="300px" /> |
| Before: | After: |
| ------------------------------------------------------------------ | ----------------------------------------------------------------- |
| <img src="./docs/screenshots/mobileNavBefore.png" width="300px" /> | <img src="./docs/screenshots/mobileNavAfter.png" width="300px" /> |

</details>
<details>
<summary>PWA support</summary>
<img src="./screenshots/pwa.png" width="300px" />
<img src="./docs/screenshots/pwa.png" width="300px" />
</details>

<details>
<summary>Attendance statistics in separate tab</summary>
<summary>Attendance statistics in a separate tab</summary>

| Before: | After: |
| ------------------------------------------------------------------- | ------------------------------------------------------------------ |
| <img src="./docs/screenshots/attendanceBefore.png" width="300px" /> | <img src="./docs/screenshots/attendanceAfter.png" width="300px" /> |

| Before: | After: |
| ------------------------------------------------------------ | ----------------------------------------------------------- |
| <img src="./screenshots/attendanceBefore.png" width="300px" /> | <img src="./screenshots/attendanceAfter.png" width="300px" /> |
</details>
<details>
<summary>Hiding weekends in monthy calendars</summary>

| Before: | After: |
| ------------------------------------------------------------ | ----------------------------------------------------------- |
| <img src="./screenshots/hideWeekendsBefore.png" width="300px" /> | <img src="./screenshots/hideWeekendsAfter.png" width="300px" /> |
<summary>Hide weekends in monthly calendars</summary>

| Before: | After: |
| --------------------------------------------------------------------- | -------------------------------------------------------------------- |
| <img src="./docs/screenshots/hideWeekendsBefore.png" width="300px" /> | <img src="./docs/screenshots/hideWeekendsAfter.png" width="300px" /> |

</details>
<details>
<summary>Displaying full name</summary>
<summary>Display full name</summary>

| Before: | After: |
| -------------------------------------------------------------- | ------------------------------------------------------------- |
| <img src="./docs/screenshots/fnameBefore.png" width="300px" /> | <img src="./docs/screenshots/fnameAfter.png" width="300px" /> |

| Before: | After: |
| --------------------------------------------------------------- | -------------------------------------------------------------- |
| <img src="./screenshots/fnameBefore.png" width="300px" /> | <img src="./screenshots/fnameAfter.png" width="300px" /> |
</details>
<details>
<summary>Clean student dashboard</summary>
<summary>A cleaner student dashboard</summary>

Before:

<img src="./screenshots/whiteboardBefore.png" width="800px" />
<img src="./docs/screenshots/whiteboardBefore.png" width="800px" />

After:

<img src="./screenshots/whiteboardAfter.png" width="800px" />
<img src="./docs/screenshots/whiteboardAfter.png" width="800px" />
</details>

<details>
<summary>Clean eduVULCAN home</summary>
<summary>A cleaner █████████ home</summary>

| Before: | After: |
| ------------------------------------------------------------ | ----------------------------------------------------------- |
| <img src="./screenshots/evHomeBefore.png" width="300px" /> | <img src="./screenshots/evHomeAfter.png" width="300px" /> |
| Before: | After: |
| --------------------------------------------------------------- | -------------------------------------------------------------- |
| <img src="./docs/screenshots/evHomeBefore.png" width="300px" /> | <img src="./docs/screenshots/evHomeAfter.png" width="300px" /> |

</details>

<details>
<summary>Other minor improvements</summary>
<summary>Other minor enhancements</summary>

- Hiding WCAG controls
- Aligning detailed grades button
- Redirecting to board
- Auto redirecting to eduVULCAN login page
- Auto-redirecting to █████████ login page

</details>

## Development Workflow

### Build the extension

1. Make sure you have [Bun](https://bun.sh/) installed.
2. Install required dependencies and setup project using `bun install`.
3. Execute `bunx wxt prepare` to prepare types for futher development.
4. Use `bun dev`/`bun dev:firefox` to start development server or `bun build`/`bun build:firefox` to build a package.

### Firefox
To load addon from files in Firefox, you need to go to `about:debugging#/runtime/this-firefox` and click `Load Temporary Add-on...`. After that you need to select manifest.json file in file picker.<br>
<img src="./screenshots/firefoxDebug.png">

To load add-on from files in Firefox, you need to go to `about:debugging#/runtime/this-firefox` and click `Load Temporary Add-on...`. After that you need to select the `manifest.json` file from `.output/` folder in the file picker.<br>
<img src="./docs/screenshots/firefoxDebug.png">

### Chrome
To load extension from files in Chrome, you need to go to `chrome://extensions/` and click `Load unpacked` (with developer mode enabled)<br>
<img src="./screenshots/chromeDebug.png">

To load extension from files in Chrome, you need to go to `chrome://extensions/` and click `Load unpacked` (with Developer mode enabled)<br>
<img src="./docs/screenshots/chromeDebug.png">

## License

This project is licensed under the [MIT License](./LICENSE).

## Contributions

Contributions to this project are welcome. Feel free to [open issues](https://github.com/banocean/ifv/issues) and [submit pull requests](https://github.com/banocean/ifv/pulls).
Contributions to this project are welcome. Feel free to [open issues](https://github.com/yoper12/ifv/issues) and [submit pull requests](https://github.com/yoper12/ifv/pulls).
Loading
Loading