From 8251f983133d264cf4a4a3dbba9d1f23b76336ad Mon Sep 17 00:00:00 2001
From: Mark
Date: Mon, 12 Oct 2026 22:24:54 +0200
Subject: [PATCH] Improve homepage Lighthouse performance
---
.gitea/workflows/deploy.yml | 5 +
.htaccess | 11 ++-
404.html | 6 +-
css/main.css | 51 +---------
css/pages/_home.css | 9 +-
css/source.css | 50 ++++++++++
en/about-us/index.html | 12 +--
en/become-a-member/index.html | 14 +--
.../index.html | 12 +--
.../how-i-coped-with-leaving-home/index.html | 12 +--
.../index.html | 12 +--
en/blog/index.html | 16 ++--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
en/cookie-policy/index.html | 12 +--
en/faq/index.html | 10 +-
en/gallery/index.html | 12 +--
.../a-table-full-of-macedonia/index.html | 12 +--
.../index.html | 12 +--
en/get-to-know-macedonia/index.html | 12 +--
.../index.html | 12 +--
.../ohrid-more-than-a-postcard/index.html | 12 +--
.../skopje-a-city-of-many-layers/index.html | 12 +--
.../welcome-to-macedonia/index.html | 12 +--
.../index.html | 12 +--
en/get-to-know-slovenia/index.html | 12 +--
.../index.html | 12 +--
.../ljubljana-through-our-eyes/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../welcome-to-slovenia/index.html | 12 +--
en/index.html | 35 +++++--
en/legal/index.html | 12 +--
en/msos-hub/index.html | 12 +--
en/news/index.html | 16 ++--
en/news/meet-student-slovenia-2026/index.html | 14 +--
.../proof-of-means-updated-2026/index.html | 12 +--
en/press/index.html | 10 +-
en/privacy-policy/index.html | 12 +--
.../index.html | 12 +--
.../in-memory-of-frosina-kulakova/index.html | 12 +--
.../index.html | 12 +--
en/projects/index.html | 14 +--
.../index.html | 12 +--
en/projects/kafanska-vecher-2025/index.html | 12 +--
.../index.html | 12 +--
.../meet-student-slovenia-2023/index.html | 12 +--
.../meet-student-slovenia-2024/index.html | 12 +--
.../index.html | 12 +--
.../morning-coffee-in-front-of-ctk/index.html | 12 +--
.../paint-and-wine-at-sunset/index.html | 12 +--
.../index.html | 12 +--
en/projects/sepa-webinar-2026/index.html | 12 +--
.../teambuilding-hub-opening-2026/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../academic-life/index.html | 14 +--
.../administrative-basics/index.html | 14 +--
.../admission-and-enrolment/index.html | 14 +--
.../application-deadlines/index.html | 14 +--
.../arrival-checklist/index.html | 14 +--
.../bachelor-application/index.html | 14 +--
.../choose-a-programme/index.html | 14 +--
.../complete-student-journey/index.html | 14 +--
.../document-preparation/index.html | 14 +--
.../evs-application-guide/index.html | 14 +--
.../healthcare-in-slovenia/index.html | 14 +--
en/student-welcome-guide/index.html | 16 ++--
.../master-application/index.html | 14 +--
.../means-accommodation-address/index.html | 14 +--
en/student-welcome-guide/my-route/index.html | 14 +--
.../index.html | 14 +--
.../prepare-to-move/index.html | 14 +--
.../recognition-of-education/index.html | 14 +--
.../renew-change-graduate/index.html | 14 +--
.../rm-si-3-health-insurance/index.html | 14 +--
.../student-accommodation/index.html | 14 +--
.../student-budget/index.html | 14 +--
.../student-meals/index.html | 14 +--
.../index.html | 14 +--
.../student-residence-permit/index.html | 14 +--
.../student-transport/index.html | 14 +--
.../student-work/index.html | 14 +--
.../study-cities/index.html | 14 +--
.../tuition-and-scholarships/index.html | 14 +--
.../visa-and-residence-explained/index.html | 14 +--
.../wellbeing-and-community/index.html | 14 +--
.../where-to-apply-for-residence/index.html | 14 +--
en/support/index.html | 14 +--
en/timeline-and-milestones/index.html | 12 +--
images/HeroSection-img1-mobile.webp | Bin 0 -> 103376 bytes
mk/about-us/index.html | 12 +--
mk/become-a-member/index.html | 14 +--
.../index.html | 12 +--
.../how-i-coped-with-leaving-home/index.html | 12 +--
.../index.html | 12 +--
mk/blog/index.html | 16 ++--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
mk/cookie-policy/index.html | 12 +--
mk/faq/index.html | 10 +-
mk/gallery/index.html | 12 +--
.../a-table-full-of-macedonia/index.html | 12 +--
.../index.html | 12 +--
mk/get-to-know-macedonia/index.html | 12 +--
.../index.html | 12 +--
.../ohrid-more-than-a-postcard/index.html | 12 +--
.../skopje-a-city-of-many-layers/index.html | 12 +--
.../welcome-to-macedonia/index.html | 12 +--
.../index.html | 12 +--
mk/get-to-know-slovenia/index.html | 12 +--
.../index.html | 12 +--
.../ljubljana-through-our-eyes/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../welcome-to-slovenia/index.html | 12 +--
mk/index.html | 35 +++++--
mk/legal/index.html | 12 +--
mk/msos-hub/index.html | 12 +--
mk/news/index.html | 16 ++--
mk/news/meet-student-slovenia-2026/index.html | 14 +--
.../proof-of-means-updated-2026/index.html | 12 +--
mk/press/index.html | 10 +-
.../meet-student-slovenia-2026/index.html | 10 +-
mk/privacy-policy/index.html | 12 +--
.../index.html | 12 +--
.../in-memory-of-frosina-kulakova/index.html | 12 +--
.../index.html | 12 +--
mk/projects/index.html | 14 +--
.../index.html | 12 +--
mk/projects/kafanska-vecher-2025/index.html | 12 +--
.../index.html | 12 +--
.../meet-student-slovenia-2023/index.html | 12 +--
.../meet-student-slovenia-2024/index.html | 12 +--
.../index.html | 12 +--
.../morning-coffee-in-front-of-ctk/index.html | 12 +--
.../paint-and-wine-at-sunset/index.html | 12 +--
.../index.html | 12 +--
mk/projects/sepa-webinar-2026/index.html | 12 +--
.../teambuilding-hub-opening-2026/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../academic-life/index.html | 14 +--
.../administrative-basics/index.html | 14 +--
.../admission-and-enrolment/index.html | 14 +--
.../application-deadlines/index.html | 14 +--
.../arrival-checklist/index.html | 14 +--
.../bachelor-application/index.html | 14 +--
.../choose-a-programme/index.html | 14 +--
.../complete-student-journey/index.html | 14 +--
.../document-preparation/index.html | 14 +--
.../evs-application-guide/index.html | 14 +--
.../healthcare-in-slovenia/index.html | 14 +--
mk/student-welcome-guide/index.html | 16 ++--
.../master-application/index.html | 14 +--
.../means-accommodation-address/index.html | 14 +--
mk/student-welcome-guide/my-route/index.html | 14 +--
.../index.html | 14 +--
.../prepare-to-move/index.html | 14 +--
.../recognition-of-education/index.html | 14 +--
.../renew-change-graduate/index.html | 14 +--
.../rm-si-3-health-insurance/index.html | 14 +--
.../student-accommodation/index.html | 14 +--
.../student-budget/index.html | 14 +--
.../student-meals/index.html | 14 +--
.../index.html | 14 +--
.../student-residence-permit/index.html | 14 +--
.../student-transport/index.html | 14 +--
.../student-work/index.html | 14 +--
.../study-cities/index.html | 14 +--
.../tuition-and-scholarships/index.html | 14 +--
.../visa-and-residence-explained/index.html | 14 +--
.../wellbeing-and-community/index.html | 14 +--
.../where-to-apply-for-residence/index.html | 14 +--
mk/support/index.html | 14 +--
mk/timeline-and-milestones/index.html | 12 +--
si/about-us/index.html | 12 +--
si/become-a-member/index.html | 14 +--
.../index.html | 12 +--
.../how-i-coped-with-leaving-home/index.html | 12 +--
.../index.html | 12 +--
si/blog/index.html | 16 ++--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
si/cookie-policy/index.html | 12 +--
si/faq/index.html | 10 +-
si/gallery/index.html | 12 +--
.../a-table-full-of-macedonia/index.html | 12 +--
.../index.html | 12 +--
si/get-to-know-macedonia/index.html | 12 +--
.../index.html | 12 +--
.../ohrid-more-than-a-postcard/index.html | 12 +--
.../skopje-a-city-of-many-layers/index.html | 12 +--
.../welcome-to-macedonia/index.html | 12 +--
.../index.html | 12 +--
si/get-to-know-slovenia/index.html | 12 +--
.../index.html | 12 +--
.../ljubljana-through-our-eyes/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../welcome-to-slovenia/index.html | 12 +--
si/index.html | 35 +++++--
si/legal/index.html | 12 +--
si/msos-hub/index.html | 12 +--
si/news/index.html | 16 ++--
si/news/meet-student-slovenia-2026/index.html | 14 +--
.../proof-of-means-updated-2026/index.html | 12 +--
si/press/index.html | 10 +-
si/privacy-policy/index.html | 12 +--
.../index.html | 12 +--
.../in-memory-of-frosina-kulakova/index.html | 12 +--
.../index.html | 12 +--
si/projects/index.html | 14 +--
.../index.html | 12 +--
si/projects/kafanska-vecher-2025/index.html | 12 +--
.../index.html | 12 +--
.../meet-student-slovenia-2023/index.html | 12 +--
.../meet-student-slovenia-2024/index.html | 12 +--
.../index.html | 12 +--
.../morning-coffee-in-front-of-ctk/index.html | 12 +--
.../paint-and-wine-at-sunset/index.html | 12 +--
.../index.html | 12 +--
si/projects/sepa-webinar-2026/index.html | 12 +--
.../teambuilding-hub-opening-2026/index.html | 12 +--
.../index.html | 12 +--
.../index.html | 12 +--
.../academic-life/index.html | 14 +--
.../administrative-basics/index.html | 14 +--
.../admission-and-enrolment/index.html | 14 +--
.../application-deadlines/index.html | 14 +--
.../arrival-checklist/index.html | 14 +--
.../bachelor-application/index.html | 14 +--
.../choose-a-programme/index.html | 14 +--
.../complete-student-journey/index.html | 14 +--
.../document-preparation/index.html | 14 +--
.../evs-application-guide/index.html | 14 +--
.../healthcare-in-slovenia/index.html | 14 +--
si/student-welcome-guide/index.html | 16 ++--
.../master-application/index.html | 14 +--
.../means-accommodation-address/index.html | 14 +--
si/student-welcome-guide/my-route/index.html | 14 +--
.../index.html | 14 +--
.../prepare-to-move/index.html | 14 +--
.../recognition-of-education/index.html | 14 +--
.../renew-change-graduate/index.html | 14 +--
.../rm-si-3-health-insurance/index.html | 14 +--
.../student-accommodation/index.html | 14 +--
.../student-budget/index.html | 14 +--
.../student-meals/index.html | 14 +--
.../index.html | 14 +--
.../student-residence-permit/index.html | 14 +--
.../student-transport/index.html | 14 +--
.../student-work/index.html | 14 +--
.../study-cities/index.html | 14 +--
.../tuition-and-scholarships/index.html | 14 +--
.../visa-and-residence-explained/index.html | 14 +--
.../wellbeing-and-community/index.html | 14 +--
.../where-to-apply-for-residence/index.html | 14 +--
si/support/index.html | 14 +--
si/timeline-and-milestones/index.html | 12 +--
tools/build_css_bundle.py | 89 ++++++++++++++++++
tools/build_site.py | 1 +
268 files changed, 1891 insertions(+), 1740 deletions(-)
create mode 100644 css/source.css
create mode 100644 images/HeroSection-img1-mobile.webp
create mode 100644 tools/build_css_bundle.py
diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml
index 046a4eca..63f3b208 100644
--- a/.gitea/workflows/deploy.yml
+++ b/.gitea/workflows/deploy.yml
@@ -25,6 +25,11 @@ jobs:
python -m pip install --quiet beautifulsoup4
python tools/build_search_index.py
+ - name: Bundle CSS and refresh asset versions
+ run: |
+ python tools/build_css_bundle.py
+ python tools/cache_bust.py
+
- name: Deploy to Server via rsync
run: |
sudo apt-get update -qq
diff --git a/.htaccess b/.htaccess
index 7041b58d..a8ee7df6 100644
--- a/.htaccess
+++ b/.htaccess
@@ -70,13 +70,13 @@ Options -Indexes
# ----- Browser caching -----
-# No file-hashing on this site, so keep CSS/JS short (updates must propagate)
-# and cache images/fonts longer. HTML is always revalidated.
+# CSS/JS references carry a global content hash from tools/cache_bust.py, so
+# browsers can keep those immutable assets for a year. HTML is revalidated.
ExpiresActive On
ExpiresByType text/html "access plus 0 seconds"
- ExpiresByType text/css "access plus 1 day"
- ExpiresByType application/javascript "access plus 1 day"
+ ExpiresByType text/css "access plus 1 year"
+ ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
@@ -86,6 +86,9 @@ Options -Indexes
Header set X-Content-Type-Options "nosniff"
+
+ Header set Cache-Control "public, max-age=31536000, immutable"
+
# HSTS: after the first HTTPS visit, browsers refuse plain HTTP for this
# host. Conservative 6-month max-age, no preload/includeSubDomains so it
# stays easy to adjust. (Ignored by browsers over plain HTTP — harmless.)
diff --git a/404.html b/404.html
index 3a8abc36..9e2579db 100644
--- a/404.html
+++ b/404.html
@@ -25,7 +25,7 @@
-
+
@@ -70,7 +70,7 @@
-
-
+
+