msosorg.com is not yet a Google Top Stories source, so the interactive
pill dead-ends at "No results". Disable addPill() (keep the subtle footer
link, which is harmless and ready). Documented the re-enable steps in
docs/preferred-sources.md so we don't forget.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New self-contained preferred-source.js (referenced site-wide via
seo_inject GA_LINES):
- small "Add us on Google" text link in the footer (.legal-links) on
every page, trilingual, using the domain deeplink;
- Google's official interactive pill (publisher.js) on the homepage,
News hub and Blog hub only, localized (en/mk/sl).
Lets readers mark MSOS as a preferred source (Top Stories / Discover /
News / AI surfaces). Cache-bust bump included.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Warmer, accurate trilingual cookie-banner text to lift voluntary
opt-in (EN/MK/SI), keeping Accept and Decline equally one-click
(GDPR-compliant, no dark patterns).
- grant() now grants analytics_storage only; advertising consent stays
denied, matching what the banner discloses (MSOS runs no ads).
- Cache-bust bump so the updated consent.js is fetched.
(Cookie-withdrawal link already present in footer via msosOpenConsent.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds the Cloudflare Web Analytics beacon to every page (injected in
GA_LINES alongside the GA tag). Cookieless and consent-free, so it
counts all visitors regardless of the cookie banner — complements GA4,
which only records consented sessions.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Clears the 3 non-critical Events issues in Search Console
("Missing field endDate/performer/offers") across all /projects/
recap pages. These are free, single-day events, so endDate mirrors
startDate, performer is MSOS (host org), and offers is a zero-price
Offer. Generated centrally in tools/seo_inject.py and re-injected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 22sDetails
- Brand orange is now the official #FA7850 everywhere: folded the stray
oranges (#F2762E, #E8833A, #ff6b2c) into it and kept a single darker shade
(#E85D2A) for gradient depth + button hover. Added the official brand
--yellow (#FFE16E) token.
- Tablet header gap (769-1024px): the fixed header shrinks 80->60px there but
first-section paddings kept their 80px clearance; pull the first section up
by the 20px delta in that range only (phones untouched). Verified on
interior pages and the full-bleed homepage hero — gap now matches desktop,
no overlap.
- Re-stamped cache-bust (v=f95de694).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 20sDetails
- Add :root design tokens in _typography.css (was empty) — brand teal/orange,
ink/text greys, radius + type scale + section rhythm. Visually neutral;
new rules can reference var()s instead of scattered literals.
- a11y: visible :focus-visible ring on header nav + dropdown links (keyboard
users had none).
- Fix synthesized faux-bold: .route-report h1 800 -> 700 (Inter loads 400-700).
- Testimonials column: overflow-y scroll -> auto (no permanent scrollbar gutter).
- Lightbox image radius 6px -> 8px (matches the site rounding scale).
- Consistent card affordance: homepage .news-card now lifts on hover like the
news-hub / blog cards.
- Re-stamped cache-bust (v=1f64b22f).
Deferred (needs a brand decision): unifying the two primary oranges
(#FA7850 vs #F2762E) and the fuller literal->token migration.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 22sDetails
- Latest-news row and FAQ grid now go 3 -> 2 -> 1 columns (added a 1024px
tablet step); .news-card drops its brittle fixed 405.33px width and fills a
responsive grid cell. Fixes cramped 3-across cards on 769-1024px.
- Contrast: replace #98A2B3 text color (2.58:1 on white) with the palette
muted #667085 (~4.8:1) across 13 CSS files (31 text-color uses; borders/
backgrounds untouched, verified none on dark backgrounds).
- Re-stamped cache-bust (v=6770822f).
Note: the ~20px-looser header top-gap at 769-1024px is left as a minor,
lower-risk follow-up (would need a coordinated multi-page padding pass).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 21sDetails
From the QA audit — high-impact, low-risk fixes:
- SI homepage hero: replace leftover template boilerplate subtitle
("timski nabiralniki"...) and truncated badge with proper Slovene copy
matching EN/MK.
- Footer: .footer-container was a hard width:1280px and got clipped by
overflow-x:clip on 769-1279px screens; now width:100%; max-width:1280px.
- WCAG AA contrast: darken orange text (.article-publish-date, .mm-real-link)
and the Ask-MSOS footer (.msa-foot) which were ~2.6-3:1 on white.
- iOS Safari focus-zoom: bump form/search/assistant inputs to 16px
(.ms-field, .msa-input, .filterbar-search-field).
- Re-stamped cache-bust (v=9ff60d7a).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 20sDetails
Stops deploys being served stale from browser cache — the recurring "changes
do not show up until a hard refresh" problem.
- New tools/cache_bust.py stamps a global content hash onto every local
<link>/<script> CSS/JS ref AND the @import lines in css/main.css (so partial
edits bust too). External (https://) refs are untouched. Deterministic and
idempotent: same content -> same stamp, any asset edit -> new stamp sitewide.
- Wired as the final step of tools/build_site.py so every build/deploy stamps.
- Initial stamp applied across 259 pages + main.css (v=64a53dd6).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deploy to Production on Develop Push / deploy (push) Successful in 19sDetails
In in-app browsers (Instagram/Facebook) the floating pill (z-index 9999, same
as the cookie banner) sat on top of the cookie Accept button and the language
banner, so consent could not be tapped. The pill now hides whenever the
cookie-consent (.msos-cc) or language (.lang-suggest) banner is present, via a
MutationObserver on <body>, and reappears once they are dismissed. With the
pill yielding, the language banner is dropped back to the bottom edge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a soft box-shadow to .news-card-media so the card image separates from the
teal (#2D738C) News section background — needed when an image has blue edges
that otherwise merge into the section colour.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add the Capital Asset Management logo to the partner/sponsor marquee on the
homepage and Support page (both carousel groups, EN/MK/SI).
- Fix the Meet Student Slovenia livestream embeds: the 2024 page was embedding
the 2023 recording. Now 2024 embeds the 2024 live (00GGIfVx8wA) and 2023
embeds the 2023 live (DJD02mQIE98), as proper iframes on all three languages
(MK/SI 2024 previously had only a placeholder "#" link).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Meet Student Slovenia 2026 news card had an empty description because the
auto-extractor looks for the first <p> right after .news-article-body, but that
page starts with the sticky-CTA <a>, so nothing matched. Add a curated
description (EN/MK/SI) via seo_inject DESC_OVERRIDES; this now fills the meta
description, OG/Twitter/JSON-LD, the News-hub card excerpt, and llms.txt.
MK/SI copy AI-drafted — flag for native review.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The blog index cards showed placeholder icons even for published posts that
have a hero image. Replace the icon thumb with the post hero (cover-cropped)
for every published card in EN/MK/SI, and add a .blog-thumb--image rule to
mirror the existing featured-card image style. Coming-soon / unpublished cards
keep their icons.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On phones the lightbox caption and "Read the story" button were pinned to the
screen bottom, cramped and overlapped by the floating "Ask MSOS" pill
(z-index above the lightbox). Now:
- lightbox becomes a centred column on <=600px: image -> button -> caption
flow directly under the photo instead of being absolutely bottom-pinned;
- image capped at 62vh so tall/portrait photos leave room for the button;
- the Ask-MSOS pill is hidden while the viewer is open (body.lightbox-open),
so it can no longer overlap the controls.
Desktop layout is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- On phones the language-suggestion banner sat at the bottom and the floating
"Ask MSOS" pill (higher z-index) overlapped its bottom-right, hiding the
dismiss (x) button. Raise the banner above the pill (bottom: 84px) so they
stack and the x is fully visible and tappable.
- The success-screen "Read the welcome guide" button used the base .btn
white-space:nowrap, so the long MK label overflowed the box on narrow
screens. Allow .ms-success-links .btn to wrap (white-space: normal).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Parents and "other" registrants will not be studying, so the "Your study
plans" section is now hidden for those roles. Gating is driven by the role
<select>; validate()/collect() skip any field inside a hidden container, so
the study fields are neither required nor submitted for those roles. Students
(future/current) are unchanged: the section stays visible and required.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Remove the "a-new-space-for-the-community-3" (toast) and "additional-12"
(diploma) photos from the Teambuilding / MSOS Hub opening event: drop the
inline article image and both gallery thumbnails, promote one hidden thumb to
keep 5 visible, and correct the "+more" badges and album photo count
(16 -> 14). Delete the two now-orphaned webp files. All three languages.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Live-stream line now invites online registration ("Не можеш да дојдеш во
живо? Пријави се и следи го настанот онлајн." / EN / SI equivalents).
- MK grammar fix: "некој да им го кажел" -> "некој да им каже".
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Change the "See the full album" caption under the moments gallery from
singular last-year to plural past-years, across MK/EN/SI.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add Capital Asset Management sponsor logo (images/partners/capital.png),
replacing the plain-text sponsor name in the event partners row.
- Set the in-article hero to the clean event banner (mss-2026-hero.webp) and
the News/homepage listing cards to the sponsor-strip promo variant
(mss-2026-card.webp) via a new front-matter `card:` field.
- Update the venue everywhere (event page key info + prose + confirmation
text, and the homepage promo banner) to
"НЛБ експозитура, локација East Gate Mall, Скопје" (EN: NLB branch;
SI: poslovalnica NLB), across all three languages.
Build tooling: build_content emits an optional data-card on the hero <img>;
build_listings prefers data-card as the listing thumbnail so the card can
differ from the in-article hero. Rebuilt news pages, listings and search index.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This reverts commit fb26cda to publish the MSS 2026 event page,
homepage banner, and listings ahead of the 4 Sep 2026 event.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Name Google Forms (membership/feedback/event forms) and Google Analytics as
processors in the privacy policy, add form-submission data to 'what we collect'
and its legal basis, and note the possible US transfer under SCCs. Applied to
EN/MK/SI. Draft wording — pending review.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Now that msosorg.com serves the docroot, 301 every non-canonical host
(the temp domain msos.spletnimojster.si, any www., the origin host) to
https://msosorg.com to consolidate ranking signals. Runs before the
HTTPS-force so the temp domain reaches the canonical in a single hop; the
condition excludes msosorg.com itself so there is no redirect loop.
Mark the redirect steps done in the launch checklist.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add the interview 'Македонците се поврзуваат — интервју со лидерот на МСОС'
(youtube.com/watch?v=Vi6wzK9Zfwc) as the first item in the In the media list
on the EN/MK/SI press pages, with localized descriptions.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the Macedonian reviewer's date fix to Slovenian and English: expand
feb/mar/sep... to full month names inside the deadline table cells on
application-deadlines, bachelor- and master-application (SI + EN).
Replacement is scoped to <td> cells to avoid touching words like SI 'nov'.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Landing intro: 'заради' -> 'поради' (додипломски/магистерски студии)
- Landing study-cities paragraph reworded (Словенија не е само Љубљана)
- student-accommodation: 'Почнете рано' -> 'Почнете порано со барањето'
- Spell out abbreviated months in deadline tables (фев->февруари, сеп->
септември, ...) on application-deadlines, bachelor- and master-application
- ljubljana-through-our-eyes: 'каналот Градашчица' -> 'каналот на Градашка река'
Skipped (do-not-touch): reword of the .guide-help 'Se uste vi treba pomos?'
feedback block. MK only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Landing page: refine hero lead, intro and study-cities paragraphs; rename
route-generator title/labels/button (Pripravi svojo študijsko pot, Kdo ste?,
Raven študija, Kje ste trenutno?, Prikaži mojo pot) and section subtitle.
student-guide.js: relabel SI phase options and switch budget options to
'X € / mesec' with en-dash ranges + gender-inclusive wording.
Shared across all SI guide pages: rewrite 'Dobro je vedeti' box into three
paragraphs (+ CSS), change 'Nazadnje preverjeno' -> 'Posodobljeno' (30 pages),
and refine the 'preverite najnovejše informacije' warning (22 pages).
complete-student-journey: reword the 'Devet korakov' subtitle.
New route-generator state 'Prijavo sem že oddal/-a' intentionally deferred
(needs my-route.js + Google Form wiring). SI only per request.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Remove the MSS 2026 news page, homepage promo banner, and listing entries,
then rebuild listings/sitemap/llms.txt/search-index so no MSS references
remain. Keeps shared event CSS/JS intact for other events. MSS 2026 stays
on feat/no-code-cms for a later, separate publish.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bring CMS/event branch up to date with develop. Net incoming change is the
CI deploy runner config (install rsync/openssh); all other develop history
was already present via shared kristijan-dev lineage.
Meet Student Slovenia 2026 remains on this branch only (unpublished).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>