Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
474 commits
Select commit Hold shift + click to select a range
554bb0e
[feat] Add rule `no-undef` in config file validation (#3786)
KristjanESPERANTO May 14, 2025
2f9f4b6
[feature] implement short syntax for clock week (#3775)
bughaver May 16, 2025
d179051
fix `roboto.css` to avoid error message (#3787)
khassel May 20, 2025
d07912d
update dependencies incl. electron to v36 (#3788)
khassel May 23, 2025
4e3821c
[workflow] Replace Node.js version v23 with v24 (#3770)
KristjanESPERANTO May 23, 2025
85b4ece
[refactor] Replace deprecated constants (#3789)
KristjanESPERANTO May 23, 2025
e26aed9
[refactor] Replace `ansis` with built-in function `util.styleText` (#…
KristjanESPERANTO May 27, 2025
c8625ff
simplify install and maintaining dependencies (#3795)
khassel Jun 1, 2025
975ee9c
update dependencies (#3804)
khassel Jun 1, 2025
302b24c
[l10n] Complete translations (#3794)
KristjanESPERANTO Jun 5, 2025
052ec1c
remove existing folders fonts and vendor from local installations (#3…
khassel Jun 7, 2025
faf15ad
Refactored calendarfetcherutils to fix many of the timezone and DST r…
plebcity Jun 7, 2025
2194ffd
[tests] Fix and refactor e2e test "Same keys" in "translations_spec.j…
KristjanESPERANTO Jun 9, 2025
6501aab
[linter] Enable ESLint rule `no-console` (#3810)
KristjanESPERANTO Jun 9, 2025
ee87483
update deps and fix animateCSS_spec test (#3811)
khassel Jun 19, 2025
9a3f4f0
Update package type to `commonjs` (#3814)
bugsounet Jun 20, 2025
c7c0e67
review logger factory code part: use switch/case (#3812)
bugsounet Jun 20, 2025
2809ed1
[tests] Review and refactor translation tests (#3792)
KristjanESPERANTO Jun 20, 2025
d2d4d7b
update jest to v30 (#3815)
khassel Jun 21, 2025
1e11d28
fixes e2e tests (#3817)
khassel Jun 25, 2025
5e506ea
last dependency update before release (#3823)
khassel Jun 29, 2025
2680972
Prepare Release 2.32.0 (#3825)
khassel Jun 30, 2025
b506bbb
Merge remote-tracking branch 'origin/master' into develop
khassel Jun 30, 2025
106b505
Prepare 2.33.0-develop
khassel Jun 30, 2025
855b1d7
update dependencies incl. electron to v37, remove one failing unit te…
khassel Jul 1, 2025
3a2a52c
Add CSS to clock module to prevent line breaking of sunrise/sunset in…
dathbe Jul 2, 2025
d9e2e02
Fix calendar unit test so it uses 1 day more than a full year for yea…
plebcity Jul 2, 2025
e4ec8c3
Fix missing icons in clock module (#3834)
rejas Jul 5, 2025
e115475
feat: enhance system information logging format and include additiona…
KristjanESPERANTO Jul 10, 2025
a05eb23
refactor default modules: move scheduleTimer to one place (#3837)
khassel Jul 10, 2025
931fe55
refactor: optimize system information logging (#3843)
KristjanESPERANTO Jul 12, 2025
7f8935a
refactor: simplify jest config (#3844)
KristjanESPERANTO Jul 13, 2025
02e76da
refactor: extract constants for weather electron tests (#3845)
KristjanESPERANTO Jul 14, 2025
54752f1
replace `console` with `Log` in calendar `debug.js` (#3846)
khassel Jul 15, 2025
e7b669a
e2e: decrease stop app waitTime (#3847)
khassel Jul 16, 2025
3fa2b96
cleanup and try to stabilize weather e2e tests (#3848)
khassel Jul 20, 2025
e34ef0c
update dependencies (#3849)
khassel Jul 22, 2025
839d074
Update dependencies (#3857)
rejas Aug 11, 2025
0ca7d23
update github actions (#3858)
rejas Aug 12, 2025
1b31cf1
Thoroughly check for precipitationAmount values in weathergov provide…
rejas Aug 16, 2025
83d15aa
tests: add `setupDOMEnvironment` helper function to eliminate repetit…
KristjanESPERANTO Aug 19, 2025
76da0aa
Make `User-Agent` configurable (#3255)
m-idler Aug 27, 2025
787fbda
tests: update jest snapshot url (#3861)
khassel Aug 27, 2025
483d3cd
Fix limitdays regression (#3863)
sdetweil Aug 28, 2025
3387bf8
fix regression #3841 (#3865)
sdetweil Aug 28, 2025
eb71942
fix for #3380, socket.io timeout closure (#3862)
sdetweil Aug 28, 2025
4c0a468
[tests] refactor translation tests (#3866)
KristjanESPERANTO Aug 28, 2025
fad8bba
test: add alert module tests for different `welcome_message` configur…
KristjanESPERANTO Aug 28, 2025
f8679b6
[weather] use 'apparent_temperature' in openmeteos data for feelsLike…
rejas Aug 30, 2025
25efe42
Update feels_like temperature formula (#3869)
rejas Sep 1, 2025
6f4eab9
[core] bump dependencies into september (#3872)
rejas Sep 1, 2025
93d5df8
update electron to v38 (#3876)
khassel Sep 3, 2025
be957af
bump minimal node version to v22.18.0 (#3877)
khassel Sep 4, 2025
d277a27
Bump github actions and dependencies (#3882)
rejas Sep 8, 2025
31bafc3
update default icon for calendars (#3879)
rejas Sep 8, 2025
b1865d8
refactor: use global.root_path instead relative paths (#3883)
khassel Sep 9, 2025
2481bc6
revert changes breaking `node --run config:check` (#3885)
khassel Sep 10, 2025
3260b9d
add test for config:check (#3886)
khassel Sep 11, 2025
08d29c3
Add Prettier plugin for Nunjuck templates (#3887)
rejas Sep 11, 2025
d81386f
chore: use `prettier --write --ignore-unknown` in `lint-staged` to av…
KristjanESPERANTO Sep 11, 2025
aac85bb
improve config check tests (#3889)
khassel Sep 11, 2025
fb2aa43
feat: add clear log for occupied port at startup (#3890)
KristjanESPERANTO Sep 13, 2025
777b49c
chore: update dependencies (#3891)
KristjanESPERANTO Sep 15, 2025
a49fbed
[weather] better null value handling for weather type (#3892)
rejas Sep 16, 2025
e886821
Fix for envcanada Provider to use new Environment Canada weather data…
Crazylegstoo Sep 17, 2025
fbca0a0
[layout] update styles for weather and calendar (#3894)
rejas Sep 17, 2025
1f2d1b9
update jsdoc and other deps (#3896)
khassel Sep 23, 2025
593a4b9
Prepare Release 2.33.0 (#3902)
KristjanESPERANTO Sep 30, 2025
b1a189b
Prepare 2.34.0-develop
KristjanESPERANTO Sep 30, 2025
787cc6b
refactor: replace `module-alias` dependency with internal alias resol…
KristjanESPERANTO Sep 30, 2025
b09a27a
chore: bump dependencies into october (#3909)
rejas Oct 1, 2025
5f1f5bd
feat: add ESlint rule `no-sparse-arrays` for config check (#3911)
KristjanESPERANTO Oct 13, 2025
d39e686
remove eslint warnings, add npm publish process to Collaboration.md (…
khassel Oct 14, 2025
9ff716f
update deps, exclude node v23 (#3916)
khassel Oct 16, 2025
37d1a3a
refactor: replace `express-ipfilter` with lightweight custom middlewa…
KristjanESPERANTO Oct 18, 2025
96d3e87
[weather] feat: add configurable forecast date format option (#3918)
KristjanESPERANTO Oct 18, 2025
2a4a056
Fix for envcanada Provider to use updated Env Canada URL (#3919)
Crazylegstoo Oct 19, 2025
64f78ea
chore: update dependencies (#3921)
KristjanESPERANTO Oct 19, 2025
f1c0c38
[core] Update deps and pin jsdom to v27.0.0 (#3925)
rejas Oct 20, 2025
a1c1e95
[logger] Add prefixes to most Log messages (#3923)
rejas Oct 21, 2025
bc0d365
logger: add calling filename as prefix on server side (#3926)
khassel Oct 22, 2025
c9eecdd
[calendar] test: remove "Recurring event per timezone" test (#3929)
KristjanESPERANTO Oct 23, 2025
9ad5618
[check_config] refactor: improve error handling (#3927)
KristjanESPERANTO Oct 23, 2025
2e795f6
[calendar] chore: remove `requiresVersion: "2.1.0"` (#3932)
KristjanESPERANTO Oct 27, 2025
961b3c9
feat(core): add `server:watch` script with automatic restart on file …
jboucly Oct 28, 2025
1e5d127
fixes problems with daylight-saving-time in weather provider `openmet…
khassel Nov 1, 2025
b542f33
Update deps, unpin parse5 (#3934)
rejas Nov 1, 2025
462abf7
[tests] migrate from `jest` to `vitest` (#3940)
KristjanESPERANTO Nov 3, 2025
d7348ed
[tests] suppress debug logs in CI environment + improve calendar symb…
KristjanESPERANTO Nov 3, 2025
67fead7
[ci] Add concurrency to automated tests workflow to cancel outdated r…
KristjanESPERANTO Nov 4, 2025
9d713ff
[test] replace `node-libgpiod` with `serialport` in electron-rebuild …
KristjanESPERANTO Nov 4, 2025
034f3c4
[newsfeed] fix header layout issue (#3946)
rejas Nov 5, 2025
ab5f79a
remove deprecated ukmetoffice datapoint provider, cleanup .gitignore …
khassel Nov 7, 2025
3b79791
[calendar] Show `repeatingCountTitle` only if `yearDiff` > 0 (#3949)
jarnoml Nov 8, 2025
c1aaea5
[weather] add error handling to weather fetch functions, including co…
sdetweil Nov 8, 2025
8e9ee89
[gitignore] restoring the old Git behavior for the CSS directory (#3954)
KristjanESPERANTO Nov 8, 2025
2b08288
[core] configure cspell to check default modules only and fix typos (…
KristjanESPERANTO Nov 8, 2025
f29f424
[core] refactor: replace `XMLHttpRequest` with `fetch` and migrate e2…
KristjanESPERANTO Nov 8, 2025
38a4d23
[weather] fix wind-icon not showing in pirateweather (#3957)
rejas Nov 10, 2025
53df20f
[weatherprovider] update subclass language use override (#3914)
JHWelch Nov 13, 2025
3c4d69e
[calendar] refactor: migrate CalendarFetcher to ES6 class and improve…
KristjanESPERANTO Nov 14, 2025
1796400
Add new pt and pt-BR translations for Alert module and update global …
Blackspirits Nov 16, 2025
a52baa5
[compliments] fix: duplicate query param "?" in compliments module re…
xsorifc28 Nov 19, 2025
854c954
[gitignore] restore the old Git behavior for the default modules (#3968)
KristjanESPERANTO Nov 19, 2025
74b682f
fix: set compliments remote file minimum delay to 15 minutes (#3970)
xsorifc28 Nov 21, 2025
7934e7a
[compliments] refactor: optimize `loadComplimentFile` method and add …
KristjanESPERANTO Nov 23, 2025
a0f1a2c
Bump actions/checkout from 5 to 6 (#3972)
dependabot[bot] Nov 24, 2025
ca6e8b2
[core] chore: simplify Wayland start script (#3974)
KristjanESPERANTO Nov 29, 2025
fdac92d
[core] bump dependencies into december (#3982)
rejas Dec 1, 2025
c2ec6fc
[calendar] fix: prevent excessive fetching on client reload and refac…
KristjanESPERANTO Dec 8, 2025
4186cbf
[core] auto create release notes with every push on develop (#3985)
khassel Dec 10, 2025
e7ad361
[chore] update dependencies and min. node version (#3986)
khassel Dec 10, 2025
1998b62
testing: update "Enforce Pull-Request Rules" workflow (#3987)
khassel Dec 10, 2025
c64d3ef
[core] fix: restore `--ozone-platform=wayland` flag for reliable Wayl…
KristjanESPERANTO Dec 14, 2025
9c25b15
add checksum to test whether calendar event list changed (#3988)
sdetweil Dec 18, 2025
9d3b07d
[core] fix: allow browser globals in config files (#3992)
KristjanESPERANTO Dec 21, 2025
4962078
demo with gif (#3995)
khassel Dec 28, 2025
0fb6fcb
dependency update + adjust Playwright setup + fix linter issue (#3994)
khassel Dec 28, 2025
d5d1441
Prepare Release 2.34.0 (#3998)
sdetweil Jan 1, 2026
a4f29f7
Merge branch 'master' into develop
khassel Jan 1, 2026
950f551
set next release dev number (#4000)
sdetweil Jan 1, 2026
241921b
[core] run systeminformation in subprocess so the info is always disp…
khassel Jan 3, 2026
40301f2
fix(calendar): correct day-of-week for full-day recurring events acro…
KristjanESPERANTO Jan 4, 2026
9731ea2
refactor: unify favicon for index.html and Electron (#4006)
KristjanESPERANTO Jan 5, 2026
56fe067
chore: migrate CI workflows to ubuntu-slim for faster startup times (…
KristjanESPERANTO Jan 7, 2026
b847dd7
update Collaboration.md and dependencies (#4001)
khassel Jan 8, 2026
8e6701f
Update deps as requested by dependabot (#4008)
rejas Jan 8, 2026
471dbd8
Change default start scripts from X11 to Wayland (#4011)
KristjanESPERANTO Jan 10, 2026
3b793bf
Update node-ical and support it's rrule-temporal changes (#4010)
KristjanESPERANTO Jan 11, 2026
82e39a2
fix systeminformation not displaying electron version (#4012)
khassel Jan 11, 2026
2d3a557
fix(calendar): update to node-ical 0.23.1 and fix full-day recurrence…
KristjanESPERANTO Jan 12, 2026
37a8b11
chore(eslint): migrate from eslint-plugin-vitest to @vitest/eslint-pl…
KristjanESPERANTO Jan 12, 2026
23f0290
Switch to undici Agent for HTTPS requests (#4015)
in-voker Jan 17, 2026
34913bf
[core] refactor: extract and centralize HTTP fetcher (#4016)
KristjanESPERANTO Jan 22, 2026
5e0cd28
update electron to v40, update node versions in workflows (#4018)
khassel Jan 24, 2026
d44db6e
move default modules from /modules/default to /defaultmodules (#4019)
khassel Jan 27, 2026
43503e8
chore: update dependencies (#4021)
KristjanESPERANTO Jan 27, 2026
6324ec2
move custom.css from css to config (#4020)
khassel Jan 28, 2026
2b55b8e
refactor(clientonly): modernize code structure and add comprehensive …
KristjanESPERANTO Jan 28, 2026
5c1cc47
[newsfeed] refactor: migrate to centralized HTTPFetcher (#4023)
KristjanESPERANTO Jan 29, 2026
751c83b
Update node-ical and other deps (#4025)
rejas Jan 31, 2026
4311034
Add dark theme logo (#4026)
JHWelch Feb 1, 2026
f6d559e
remove kioskmode (#4027)
khassel Feb 5, 2026
f9f3461
calendar.js: remove useless hasCalendarURL function (#4028)
khassel Feb 5, 2026
9dd964e
change loading config.js, allow variables in config.js and try to pro…
khassel Feb 5, 2026
b9481d2
fix: correct secret redaction and optimize loadConfig (#4031)
khassel Feb 7, 2026
172ca18
fix cors proxy getting binary data (e.g. png, webp) (#4030)
khassel Feb 8, 2026
1dc3032
allow environment variables in cors urls (#4033)
khassel Feb 8, 2026
6cb3e24
replace template_spec test with config_variables test (#4034)
khassel Feb 9, 2026
80c4879
[weather] feat: add Weather API Provider (#4036)
angeldeejay Feb 21, 2026
8ce0cda
[weather] refactor: migrate to server-side providers with centralized…
KristjanESPERANTO Feb 23, 2026
729f7f0
[core] refactor: enable ESLint rule require-await and handle detected…
KristjanESPERANTO Feb 25, 2026
df8a882
fix(newsfeed): fix full article view and add framing check (#4039)
KristjanESPERANTO Feb 28, 2026
083953f
chore: update dependencies + add exports, files, and sideEffects fiel…
KristjanESPERANTO Mar 1, 2026
587bc25
chore: remove obsolete Jest config and unit test global setup (#4044)
KristjanESPERANTO Mar 1, 2026
06b1361
Use getDateString in openmeteo (#4046)
rejas Mar 1, 2026
ab3108f
[calendar] refactor: delegate event expansion to node-ical's expandRe…
KristjanESPERANTO Mar 2, 2026
3eb3745
Fix Node.js v25 logging prefix and modernize logger (#4049)
KristjanESPERANTO Mar 6, 2026
e7503a4
refactor: further logger clean-up (#4050)
KristjanESPERANTO Mar 6, 2026
cb61aeb
chore: update ESLint and plugins, simplify config, apply new rules (#…
KristjanESPERANTO Mar 7, 2026
35cd4d8
weather: add possibility to override njk's and css (#4051)
khassel Mar 8, 2026
0ca91f7
weather: fixes for templates (#4054)
khassel Mar 9, 2026
9fe7d1e
test(calendar): fix hardcoded date in event shape test (#4055)
KristjanESPERANTO Mar 11, 2026
21d1e74
refactor: simplify internal `require()` calls (#4056)
KristjanESPERANTO Mar 12, 2026
3ea3f0a
chore: upgrade ESLint to v10 and fix newly surfaced issues (#4057)
KristjanESPERANTO Mar 12, 2026
d072345
update dependencies incl. electron to v41 (#4058)
khassel Mar 12, 2026
e1c44a8
fix(calendar): make showEnd behavior more consistent across time form…
KristjanESPERANTO Mar 17, 2026
ee26193
fix(weather): fix weathergov forecast day labels off by one (#4065)
KristjanESPERANTO Mar 22, 2026
de78190
fix(weather): fix openmeteo forecast stuck in the past (#4064)
KristjanESPERANTO Mar 23, 2026
51f6927
update dependencies (#4068)
khassel Mar 31, 2026
946d322
docs: add security policy and vulnerability reporting guidelines (#4069)
KristjanESPERANTO Mar 31, 2026
9eaef41
Prepare Release 2.35.0 (#4071)
khassel Apr 1, 2026
b6f2876
Merge branch 'master' into develop
khassel Apr 1, 2026
751b97f
update version for develop
khassel Apr 1, 2026
d7c4ad1
fix(tests): correct import path for git_helper module in updatenotifi…
KristjanESPERANTO Apr 1, 2026
32aa5c8
chore: add permissions section to enforce pull-request rules workflow…
KristjanESPERANTO Apr 1, 2026
8e1630e
refactor: enable ESLint rule "no-unused-vars" and handle related issu…
KristjanESPERANTO Apr 2, 2026
d2304af
SMHI: migrate to SNOW1gv1 API (replace deprecated PMP3gv2) (#4082)
cgillinger Apr 3, 2026
19c6489
fix(newsfeed): prevent duplicate parse error callback when using pipe…
KristjanESPERANTO Apr 3, 2026
dce2df6
refactor: replace implicit global config with explicit global.config …
KristjanESPERANTO Apr 3, 2026
03f2689
fix: prevent SSRF via /cors endpoint by blocking private/reserved IPs…
KristjanESPERANTO Apr 3, 2026
abf6989
add option to disable or restrict cors endpoint (#4087)
khassel Apr 4, 2026
512e746
chore: update dependencies (#4088)
KristjanESPERANTO Apr 4, 2026
f079324
ci(codeql): also scan develop branch on push and PR (#4086)
KristjanESPERANTO Apr 4, 2026
96c18ec
fix(cors): prevent SSRF via DNS rebinding (#4090)
KristjanESPERANTO Apr 4, 2026
0da343b
fix(weather): use stable instanceId to prevent duplicate fetchers (#4…
KristjanESPERANTO Apr 5, 2026
9b97add
fix cors function for alpine linux (#4091)
khassel Apr 5, 2026
d8c29d5
fix: prevent crash when config is undefined in socket handler (#4096)
KristjanESPERANTO Apr 7, 2026
2e97e29
fix(http_fetcher): use undici.fetch when dispatcher is present (#4097)
KristjanESPERANTO Apr 8, 2026
22a58d4
fix(weather): restore OpenWeatherMap v2.5 support (#4101)
KristjanESPERANTO Apr 10, 2026
39578d6
restrict replaceSecretPlaceholder to cors with allowWhitelist (#4102)
khassel Apr 10, 2026
61870ae
fix replaceSecretPlaceholder (#4104)
khassel Apr 11, 2026
d3a3ad9
config endpoint must handle functions in module configs (#4106)
khassel Apr 12, 2026
de3f57f
weather: fix UV index display and add WeatherFlow precipitation (#4108)
KristjanESPERANTO Apr 19, 2026
3f2a030
ci(actions): set explicit token permissions (#4114)
KristjanESPERANTO Apr 19, 2026
7e12862
fix(http-fetcher): fall back to reloadInterval after retries exhauste…
KristjanESPERANTO Apr 27, 2026
9dc4b7a
fix(updatenotification): harden git command execution + simplify chec…
KristjanESPERANTO Apr 27, 2026
b8548f2
Allow HTTPFetcher to pass through 304 responses (#4120)
sonnyb9 Apr 27, 2026
4c2a373
fix(weather): avoid loading state after reconnect (#4121)
KristjanESPERANTO Apr 27, 2026
8af3d02
fix(weather): use nearest openmeteo hourly data (#4123)
KristjanESPERANTO Apr 28, 2026
5a82c9d
update dependencies (#4124)
khassel Apr 29, 2026
8dbee62
Prepare Release 2.36.0 (#4126)
khassel Apr 30, 2026
99a37ad
Merge remote-tracking branch 'origin/master' into develop
khassel Apr 30, 2026
01ae1b4
update version in package.json
khassel Apr 30, 2026
0905d66
polish HTTP 304 docs/test/handling (#4129)
KristjanESPERANTO Apr 30, 2026
f2759ad
refactor(updatenotification): replace pm2 usage with node logic (#4134)
KristjanESPERANTO May 3, 2026
3335781
Remove unnecessary conditionals and fix falsy property check in imper…
KristjanESPERANTO May 3, 2026
d20306c
fix(electron): resolve CodeQL alerts #22 and #25 in electron.js (#4136)
KristjanESPERANTO May 3, 2026
623e1e2
fix(updatenotification): fix ref diff parsing for fetch --dry-run (#4…
KristjanESPERANTO May 3, 2026
b474198
fix: skip postinstall git clean when not in a git repository (#4139)
angeldeejay May 5, 2026
461dbc0
update dependencies and workflows to node v26 (#4140)
khassel May 6, 2026
c97d094
fix(systeminformation): output right 'used node' version (from parent…
KristjanESPERANTO May 6, 2026
6791154
refactor(utils): drop ajv dependency (#4142)
KristjanESPERANTO May 6, 2026
842beef
update eletron to v42 (#4144)
khassel May 6, 2026
7da9e5a
perf(calendar): use async ICS parsing to avoid blocking event loop (#…
KristjanESPERANTO May 6, 2026
9386c44
fix: resolve CodeQL alerts #24 and #26 (#4145)
KristjanESPERANTO May 6, 2026
67db41c
refactor: rewrite NodeHelper as an ES6 class (#4147)
KristjanESPERANTO May 8, 2026
2850e14
Unify linting: replace Stylelint and markdownlint with ESLint (#4148)
KristjanESPERANTO May 9, 2026
170c4a9
remove warning in unit tests (for nodejs >= v25) (#4149)
khassel May 9, 2026
b38c7b7
Bump actions/dependency-review-action from 4 to 5 (#4152)
dependabot[bot] May 12, 2026
79ea263
refactor: rewrite Module as an ES6 class (#4151)
KristjanESPERANTO May 12, 2026
13d51cf
CodeQL cleanup for alerts #18, #19, #20 (#4153)
KristjanESPERANTO May 12, 2026
41eb17c
refactor(core): remove old Object.assign polyfill (#4157)
KristjanESPERANTO May 17, 2026
4425f52
fix(updatenotification): preserve start mode on restart (#4156)
KristjanESPERANTO May 17, 2026
d4a5ebe
refactor: use ES module imports in browser core (#4158)
KristjanESPERANTO May 18, 2026
3c514df
fix systeminformation thread not ending (#4155)
khassel May 18, 2026
7abbe62
systeminformation thread not ending: move error handling from utils t…
khassel May 19, 2026
1b540ae
fix(updatenotification): use process.argv[0] as restart binary (#4163)
KristjanESPERANTO May 20, 2026
9a3538d
chore: update dependencies (#4162)
KristjanESPERANTO May 20, 2026
fd687bf
feat(weather): add Buienradar provider (#4164)
KristjanESPERANTO May 20, 2026
e55b11b
feat(electron): support object-based electronSwitches (#4161)
KristjanESPERANTO May 20, 2026
03e4eef
fix(updatenotification): don't spawn a child process when running und…
KristjanESPERANTO May 21, 2026
d203fef
feat(systeminfo): include Git hash and branch in system information l…
KristjanESPERANTO May 27, 2026
58c2a5e
fix(server): enforce ipWhitelist for Socket.IO too (#4169)
KristjanESPERANTO Jun 1, 2026
4492a83
update dependencies, add electron fix in package.json (#4175)
khassel Jun 3, 2026
3fd1591
chore: add missing core defaults (#4181)
KristjanESPERANTO Jun 6, 2026
5d11b5d
fix: modules losing data after HTTP 304 responses (#4180)
KristjanESPERANTO Jun 6, 2026
e747db1
refactor(main): simplify updateDomWithContent async flow (#4182)
KristjanESPERANTO Jun 7, 2026
4377071
update dependencies incl. electron and revert yauzl-electron-install-…
khassel Jun 9, 2026
6ab8104
[newsfeed] add allowBasicHtmlTags option for basic emphasis (#4176)
egeekial Jun 10, 2026
ca7b752
fix(security): prevent unauthorized secret expansion in socket payloa…
KristjanESPERANTO Jun 10, 2026
b9be026
refactor(main): simplify _updateDom with async/await (#4185)
KristjanESPERANTO Jun 12, 2026
ef2c7db
perf(calendar): pre-filter ICS data before parsing (#4168)
KristjanESPERANTO Jun 15, 2026
9d315e1
refactor(main): modernize DOM update flow with async/await (#4186)
KristjanESPERANTO Jun 16, 2026
7c96623
fix(electron): map IPv6 :: wildcard to localhost (#4188)
MikeBishop Jun 20, 2026
dbc7a57
chore: update dependencies and adjust import path for SunCalc (#4189)
KristjanESPERANTO Jun 21, 2026
caccd41
Bump actions/checkout from 6 to 7 (#4190)
dependabot[bot] Jun 23, 2026
ad0d2ee
update dependencies (#4191)
khassel Jun 30, 2026
f94ba64
Prepare Release 2.37.0 (#4193)
rejas Jul 1, 2026
eed59d7
Merge branch 'mm_master' into mm_develop
Jul 1, 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
24 changes: 5 additions & 19 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,10 @@ We hold our code to standard, and these standards are documented below.

We use [prettier](https://prettier.io/) for automatic formatting a lot all our files. The configuration is in our `prettier.config.mjs` file.

To run prettier, use `node --run lint:prettier`.
And we use [ESLint](https://eslint.org) to lint our JavaScript, Markdown, and CSS files. The configuration is in our `eslint.config.mjs` file.

### JavaScript: Run ESLint

We use [ESLint](https://eslint.org) to lint our JavaScript files. The configuration is in our `eslint.config.mjs` file.

To run ESLint, use `node --run lint:js`.

### CSS: Run StyleLint

We use [StyleLint](https://stylelint.io) to lint our CSS. The configuration is in our `stylelint.config.mjs` file.

To run StyleLint, use `node --run lint:css`.

### Markdown: Run markdownlint

We use [markdownlint-cli2](https://github.com/DavidAnson/markdownlint-cli2) to lint our markdown files. The configuration is in our `.markdownlint.json` file.

To run markdownlint, use `node --run lint:markdown`.
To check for formatting and linting errors, use `node --run test:lint`
To fix formatting and linting errors, use `node --run lint:fix`.

## Testing

Expand All @@ -43,6 +28,7 @@ The `package.json` scripts expose finer-grained test commands:
- `test:watch` – keep Vitest in watch mode for fast local feedback
- `test:ui` – open the Vitest UI dashboard (needs OS file-watch support enabled)
- `test:calendar` – run the legacy calendar debug helper
- `test:css`, `test:markdown`, `test:prettier`, `test:spelling`, `test:js` – lint-only scripts that enforce formatting, spelling, markdown style, and ESLint.
- `test:lint` – run linter and formatter checks
- `test:spelling` – run the spell checker

You can invoke any script with `node --run <script>` (or `npm run <script>`). Individual files can still be targeted directly, e.g. `npx vitest run tests/e2e/env_spec.js`.
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Hello and thank you for wanting to contribute to the MagicMirror² project!
> - What does the pull request accomplish? Use a list if needed.
> - If it includes major visual changes please add screenshots.
>
> 3. Please run `node --run lint:prettier` before submitting so that
> 3. Please run `node --run lint:fix` before submitting so that
> style issues are fixed.
**Note**: Sometimes the development moves very fast. It is highly
Expand Down
16 changes: 6 additions & 10 deletions .github/workflows/automated-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
timeout-minutes: 15
steps:
- name: "Checkout code"
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: "Use Node.js"
uses: actions/setup-node@v6
with:
Expand All @@ -33,23 +33,20 @@ jobs:
node --run install-mm:dev
- name: "Run linter tests"
run: |
node --run test:prettier
node --run test:js
node --run test:css
node --run test:markdown
node --run test:lint
test:
runs-on: ubuntu-24.04
timeout-minutes: 30
strategy:
matrix:
node-version: [22.x, 24.x, 25.x]
node-version: [22.x, 24.x, 26.x]
steps:
- name: Install electron dependencies and labwc
run: |
sudo apt-get update
sudo apt-get install -y libnss3 libasound2t64 labwc
- name: "Checkout code"
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: "Use Node.js ${{ matrix.node-version }}"
uses: actions/setup-node@v6
with:
Expand All @@ -64,9 +61,8 @@ jobs:
npx playwright install --with-deps chromium
- name: "Prepare environment for tests"
run: |
# Fix chrome-sandbox permissions:
sudo chown root:root ./node_modules/electron/dist/chrome-sandbox
sudo chmod 4755 ./node_modules/electron/dist/chrome-sandbox
# Download electron binary
npx install-electron
# Start labwc
WLR_BACKENDS=headless WLR_LIBINPUT_NO_DEVICES=1 WLR_RENDERER=pixman labwc &
touch config/custom.css
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
language: [actions, javascript-typescript]

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: github/codeql-action/init@v4
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/dep-review.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ jobs:
runs-on: ubuntu-slim
steps:
- name: "Checkout code"
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: "Dependency Review"
uses: actions/dependency-review-action@v4
uses: actions/dependency-review-action@v5
4 changes: 2 additions & 2 deletions .github/workflows/electron-rebuild.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ jobs:
runs-on: ubuntu-slim
strategy:
matrix:
node-version: [22.x, 24.x, 25.x]
node-version: [22.x, 24.x, 26.x]
steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: "Use Node.js ${{ matrix.node-version }}"
uses: actions/setup-node@v6
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-notes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
timeout-minutes: 15
steps:
- name: "Checkout code"
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: "0"
- name: "Use Node.js"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/spellcheck.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-slim
steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
ref: develop
- name: Set up Node.js
Expand Down
6 changes: 0 additions & 6 deletions .markdownlint.json

This file was deleted.

17 changes: 9 additions & 8 deletions cspell.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
"armv",
"ashishtank",
"autoplay",
"Autorestart",
"avghumidity",
"avgtemp",
"Autorestart",
"beada",
"Behaviour",
"Beschreibung",
Expand All @@ -32,6 +32,7 @@
"btoconnor",
"bughaver",
"bugsounet",
"buienradar",
"buxxi",
"byday",
"calcage",
Expand Down Expand Up @@ -183,8 +184,8 @@
"Lightspeed",
"loadingcircle",
"locationforecast",
"logg",
"lockstring",
"logg",
"lstrip",
"Luciella",
"luxon",
Expand All @@ -201,8 +202,8 @@
"Meteo",
"michaelteeuw",
"michmich",
"mintemp",
"Midori",
"mintemp",
"mirontoli",
"MISSINGLANG",
"mixasgr",
Expand All @@ -220,8 +221,8 @@
"NEWSFEED",
"newsfeedfetcher",
"newsfetcher",
"newyear",
"newsitems",
"newyear",
"nextdaysrelative",
"nfogal",
"njwilliams",
Expand Down Expand Up @@ -256,12 +257,13 @@
"pubdate",
"radokristof",
"rajniszp",
"RDATE",
"rebuilded",
"Reis",
"rejas",
"relativehumidity",
"resultstring",
"Resig",
"resultstring",
"roboto",
"rohitdharavath",
"Rosso",
Expand Down Expand Up @@ -290,7 +292,6 @@
"sthuber",
"Stieber",
"strinner",
"stylelintrc",
"sunaction",
"suncalc",
"suntimes",
Expand All @@ -302,8 +303,8 @@
"Teil",
"TESTMODE",
"testpass",
"testuser",
"teststring",
"testuser",
"thomasrockhu",
"thumbslider",
"timeformat",
Expand All @@ -324,12 +325,12 @@
"updatenotification",
"uxdt",
"Vaice",
"VCALENDAR",
"veeck",
"verjaardag",
"VEVENT",
"vgtu",
"Vitest",
"VCALENDAR",
"Voelt",
"Vorberechnung",
"vppencilsharpener",
Expand Down
15 changes: 14 additions & 1 deletion defaultmodules/calendar/calendarfetcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,21 @@ class CalendarFetcher {
*/
async #handleResponse (response) {
try {
// 304 Not Modified has no body: keep previously fetched events and just re-broadcast them.
if (response.status === 304) {
this.lastFetch = Date.now();
this.broadcastEvents();
return;
}

const responseData = await response.text();
const parsed = ical.parseICS(responseData);

const filteredData = await CalendarFetcherUtils.preFilterICS(responseData, {
includePastEvents: this.includePastEvents,
maximumNumberOfDays: this.maximumNumberOfDays
});

const parsed = await ical.async.parseICS(filteredData);

Log.debug(`Parsed iCal data from ${this.url} with ${Object.keys(parsed).length} entries.`);

Expand Down
30 changes: 30 additions & 0 deletions defaultmodules/calendar/calendarfetcherutils.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,36 @@ const CalendarFetcherUtils = {
return moment.tz.guess();
},

/**
* Calculate the time window of events to keep, as [start, end].
* Without includePastEvents the window starts now; otherwise it also
* reaches maximumNumberOfDays into the past.
* @param {object} config Needs includePastEvents (boolean) and maximumNumberOfDays (number).
* @returns {[Date, Date]} The start and end of the window.
*/
calculateFilterWindow (config) {
const today = moment().startOf("day");
const start = config.includePastEvents
? today.clone().subtract(config.maximumNumberOfDays, "days").toDate()
: new Date();
const end = today.clone().add(config.maximumNumberOfDays, "days").toDate();
return [start, end];
},

/**
* Drop ICS data outside the configured time window before it is parsed,
* so that node-ical only has to process events we might actually show.
* @param {string} rawICS The raw ICS text.
* @param {object} config Needs includePastEvents (boolean) and maximumNumberOfDays (number).
* @returns {Promise<string>} The filtered ICS text.
*/
async preFilterICS (rawICS, config) {
// ics-filter is ESM-only, so we import it dynamically from this CommonJS file.
const { icsFilter } = await import("ics-filter");
const [start, end] = CalendarFetcherUtils.calculateFilterWindow(config);
return icsFilter(rawICS, start, end);
},

/**
* Filter the events from ical according to the given config
* @param {object} data the calendar data from ical
Expand Down
2 changes: 1 addition & 1 deletion defaultmodules/compliments/compliments.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ Module.register("compliments", {
timeOfDay = "evening";
}

if (timeOfDay && this.config.compliments.hasOwnProperty(timeOfDay)) {
if (this.config.compliments.hasOwnProperty(timeOfDay)) {
compliments = [...this.config.compliments[timeOfDay]];
}

Expand Down
5 changes: 3 additions & 2 deletions defaultmodules/newsfeed/newsfeed.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ Module.register("newsfeed", {
prohibitedWords: [],
scrollLength: 500,
logFeedWarnings: false,
dangerouslyDisableAutoEscaping: false
dangerouslyDisableAutoEscaping: false,
allowedBasicHtmlTags: []
},

getUrlPrefix (item) {
Expand Down Expand Up @@ -148,7 +149,7 @@ Module.register("newsfeed", {
}
return Promise.resolve(wrapper);
}
return this._super();
return Module.prototype.getDom.call(this);
},

//Override fetching of template name
Expand Down
12 changes: 6 additions & 6 deletions defaultmodules/newsfeed/newsfeed.njk
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@
{% if config.showPublishDate %}{{ item.publishDate }}:{% endif %}
</div>
{% endif %}
<div class="newsfeed-title bright medium light{{ ' no-wrap' if not config.wrapTitle }}">{{ escapeTitle(item.title, item.url, config.dangerouslyDisableAutoEscaping, config.showTitleAsUrl) }}</div>
<div class="newsfeed-title bright medium light{{ ' no-wrap' if not config.wrapTitle }}">{{ escapeTitle(item.title, item.url, config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length), config.showTitleAsUrl) }}</div>
{% if config.showDescription %}
<div class="newsfeed-desc small light{{ ' no-wrap' if not config.wrapDescription }}">
{% if config.truncDescription %}
{{ escapeText(item.description | truncate(config.lengthDescription) , config.dangerouslyDisableAutoEscaping) }}
{{ escapeText(item.description | truncate(config.lengthDescription) , config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length)) }}
{% else %}
{{ escapeText(item.description, config.dangerouslyDisableAutoEscaping) }}
{{ escapeText(item.description, config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length)) }}
{% endif %}
</div>
{% endif %}
Expand All @@ -68,13 +68,13 @@
{% if config.showPublishDate %}{{ publishDate }}:{% endif %}
</div>
{% endif %}
<div class="newsfeed-title bright medium light{{ ' no-wrap' if not config.wrapTitle }}">{{ escapeTitle(title, url, config.dangerouslyDisableAutoEscaping, config.showTitleAsUrl) }}</div>
<div class="newsfeed-title bright medium light{{ ' no-wrap' if not config.wrapTitle }}">{{ escapeTitle(title, url, config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length), config.showTitleAsUrl) }}</div>
{% if config.showDescription %}
<div class="newsfeed-desc small light{{ ' no-wrap' if not config.wrapDescription }}">
{% if config.truncDescription %}
{{ escapeText(description | truncate(config.lengthDescription) , config.dangerouslyDisableAutoEscaping) }}
{{ escapeText(description | truncate(config.lengthDescription) , config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length)) }}
{% else %}
{{ escapeText(description, config.dangerouslyDisableAutoEscaping) }}
{{ escapeText(description, config.dangerouslyDisableAutoEscaping or (config.allowedBasicHtmlTags | length)) }}
{% endif %}
</div>
{% endif %}
Expand Down
Loading
Loading