diff --git a/docs/launch-seo-checklist.md b/docs/launch-seo-checklist.md new file mode 100644 index 00000000..326bbbd6 --- /dev/null +++ b/docs/launch-seo-checklist.md @@ -0,0 +1,99 @@ +# Launch-day SEO checklist + +Everything below is **blocked until the site goes live on the final domain +`msosorg.com`** (it can't be done on the temp host `msos.spletnimojster.si`). +Work top to bottom on launch day. The on-page/technical SEO is already done — +this is the "flip the switch" list. + +--- + +## 0. Before you flip the domain + +- [ ] **Native-speaker proofread of MK + SI content.** All Macedonian/Slovene + translations (blog post, about-us, timeline, meta descriptions) are + AI-drafted and marked for review. Fix before indexing — quality counts. +- [ ] Decide the **canonical domain**: with-`www` or bare `msosorg.com`. + Everything is currently hard-coded to `https://msosorg.com` (bare, https). + If you want `www`, tell me and I'll re-run the injector with the new base. + +## 1. DNS + hosting + +- [ ] Point `msosorg.com` DNS to the host. +- [ ] Confirm a valid **HTTPS certificate** (Let's Encrypt / host-provided). +- [ ] Confirm the site loads at `https://msosorg.com/en/` (and `/mk/`, `/si/`). + +## 2. Redirects (`.htaccess`) + +- [ ] Update the root redirect in `.htaccess` (lines 2–5): change + `msos.spletnimojster.si` → `msosorg.com` so `/` → `/en/` on the real host. +- [ ] Add a **301 from the temp domain to the final domain** so any links / + early indexing on `msos.spletnimojster.si` pass equity to `msosorg.com`: + ```apache + RewriteCond %{HTTP_HOST} ^(www\.)?msos\.spletnimojster\.si$ [NC] + RewriteRule ^(.*)$ https://msosorg.com/$1 [R=301,L] + ``` +- [ ] Pick ONE host form (www vs non-www) and 301 the other to it. +- [ ] (Ask me to make these edits — they're quick.) + +## 3. Verify the technical layer resolves on the real domain + +- [ ] `https://msosorg.com/robots.txt` loads and lists the sitemap. +- [ ] `https://msosorg.com/sitemap.xml` loads (201 URLs, all `msosorg.com`). +- [ ] Spot-check a page's `` and `hreflang` point to + `https://msosorg.com/...` (they do — just confirm live). +- [ ] Hit a bad URL (e.g. `/en/blog/xxx`) → branded **404** with 404 status + (works once the Apache `ErrorDocument` is live). + +## 4. Google Search Console ← most important + +- [ ] Add the property (prefer **Domain property** via DNS TXT — covers all + subdomains + http/https). +- [ ] Submit `https://msosorg.com/sitemap.xml`. +- [ ] Use **URL Inspection** on the homepage + a couple key pages → *Request + indexing*. +- [ ] Check **International Targeting** → no hreflang errors. +- [ ] Over the next weeks: watch **Coverage/Pages**, **Core Web Vitals**, and + the **Performance** report. + +## 5. Bing Webmaster Tools (optional, ~5 min) + +- [ ] Add the site (can import from Search Console) and submit the sitemap. + +## 6. Analytics (measure the SEO) — see `docs/` note / ask me to wire it + +- [ ] Create the analytics account (GA4 or Plausible — recommendation below). +- [ ] Give me the Measurement ID (GA4) or confirm the domain (Plausible); I add + the snippet to `tools/seo_inject.py` so it lands on all 201 pages at once. +- [ ] Verify real-time hits after deploy. + +## 7. Social / rich-result validation + +- [ ] **Rich Results Test** (search.google.com/test/rich-results) on a blog, + news, and project URL → Article + BreadcrumbList detected, no errors. +- [ ] **Facebook Sharing Debugger** — paste homepage + a blog URL, click + *Scrape Again* → correct title/description/OG image. +- [ ] **LinkedIn Post Inspector** — same check. +- [ ] Confirm the favicon shows in a browser tab and in Google results. + +## 8. Post-launch monitoring (first 2–4 weeks) + +- [ ] Watch indexing count climb in Search Console. +- [ ] Fix anything in Coverage (excluded/errors). +- [ ] Re-check Core Web Vitals (image optimization + lazy-loading should keep + these green). +- [ ] Add fresh content (blog/news) — freshness + internal links help. + +--- + +### Notes / gotchas + +- **Custom 404** only works on the Apache/LiteSpeed host via `.htaccess` + `ErrorDocument` (already added). The Python dev server ignores it. +- **Re-run after any page add/rename/delete:** + `python tools/seo_inject.py --all --sitemap` (keeps canonical, hreflang and + the sitemap in sync). +- **`images/original/`** (458 MB source masters) is gitignored — keep a + Drive/local backup; it never deploys. +- If the final domain or www-choice differs from `https://msosorg.com`, the + `DOMAIN` constant in `tools/seo_inject.py` must be updated and the injector + re-run — one-line change, ask me. diff --git a/en/blog/how-to-open-slovenian-bank-account/index.html b/en/blog/how-to-open-slovenian-bank-account/index.html index 8e7d3fd7..d1e42bbc 100644 --- a/en/blog/how-to-open-slovenian-bank-account/index.html +++ b/en/blog/how-to-open-slovenian-bank-account/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/news/proof-of-means-updated-2026/index.html b/en/news/proof-of-means-updated-2026/index.html index 7bf1a93f..ea38cd53 100644 --- a/en/news/proof-of-means-updated-2026/index.html +++ b/en/news/proof-of-means-updated-2026/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/humanitarian-tournament-in-maribor/index.html b/en/projects/humanitarian-tournament-in-maribor/index.html index b8a9f2e5..4df4ba97 100644 --- a/en/projects/humanitarian-tournament-in-maribor/index.html +++ b/en/projects/humanitarian-tournament-in-maribor/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/in-memory-of-frosina-kulakova/index.html b/en/projects/in-memory-of-frosina-kulakova/index.html index 4d84e932..6cfe503f 100644 --- a/en/projects/in-memory-of-frosina-kulakova/index.html +++ b/en/projects/in-memory-of-frosina-kulakova/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/in-memory-of-the-kochani-victims/index.html b/en/projects/in-memory-of-the-kochani-victims/index.html index 7d2bb2eb..8f3117ba 100644 --- a/en/projects/in-memory-of-the-kochani-victims/index.html +++ b/en/projects/in-memory-of-the-kochani-victims/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/macedonian-student-night-in-ljubljana/index.html b/en/projects/macedonian-student-night-in-ljubljana/index.html index 88f0ff24..09a821fe 100644 --- a/en/projects/macedonian-student-night-in-ljubljana/index.html +++ b/en/projects/macedonian-student-night-in-ljubljana/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/meet-student-slovenia-2023/index.html b/en/projects/meet-student-slovenia-2023/index.html index a65d5abc..7fe54d1b 100644 --- a/en/projects/meet-student-slovenia-2023/index.html +++ b/en/projects/meet-student-slovenia-2023/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/meet-student-slovenia-2024/index.html b/en/projects/meet-student-slovenia-2024/index.html index dba4a9b0..d6b2c0e4 100644 --- a/en/projects/meet-student-slovenia-2024/index.html +++ b/en/projects/meet-student-slovenia-2024/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/morning-coffee-in-front-of-ctk/index.html b/en/projects/morning-coffee-in-front-of-ctk/index.html index c7989ddd..23461499 100644 --- a/en/projects/morning-coffee-in-front-of-ctk/index.html +++ b/en/projects/morning-coffee-in-front-of-ctk/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/paint-and-wine-at-sunset/index.html b/en/projects/paint-and-wine-at-sunset/index.html index 2b429d38..6b47eb72 100644 --- a/en/projects/paint-and-wine-at-sunset/index.html +++ b/en/projects/paint-and-wine-at-sunset/index.html @@ -25,7 +25,7 @@ - + diff --git a/en/projects/watching-handball-together-in-slovenia/index.html b/en/projects/watching-handball-together-in-slovenia/index.html index ec3718ff..548f7b31 100644 --- a/en/projects/watching-handball-together-in-slovenia/index.html +++ b/en/projects/watching-handball-together-in-slovenia/index.html @@ -25,7 +25,7 @@ - + diff --git a/images/og-default.jpg b/images/og-default.jpg index f3f64c89..2f05d061 100644 Binary files a/images/og-default.jpg and b/images/og-default.jpg differ diff --git a/mk/blog/how-to-open-slovenian-bank-account/index.html b/mk/blog/how-to-open-slovenian-bank-account/index.html index a1ddb667..39bb3650 100644 --- a/mk/blog/how-to-open-slovenian-bank-account/index.html +++ b/mk/blog/how-to-open-slovenian-bank-account/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/news/proof-of-means-updated-2026/index.html b/mk/news/proof-of-means-updated-2026/index.html index 7582458d..51e8d74e 100644 --- a/mk/news/proof-of-means-updated-2026/index.html +++ b/mk/news/proof-of-means-updated-2026/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/humanitarian-tournament-in-maribor/index.html b/mk/projects/humanitarian-tournament-in-maribor/index.html index 0182577a..671d9896 100644 --- a/mk/projects/humanitarian-tournament-in-maribor/index.html +++ b/mk/projects/humanitarian-tournament-in-maribor/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/in-memory-of-frosina-kulakova/index.html b/mk/projects/in-memory-of-frosina-kulakova/index.html index 0147a9d3..3c609d99 100644 --- a/mk/projects/in-memory-of-frosina-kulakova/index.html +++ b/mk/projects/in-memory-of-frosina-kulakova/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/in-memory-of-the-kochani-victims/index.html b/mk/projects/in-memory-of-the-kochani-victims/index.html index 153ec58b..d02bb0c3 100644 --- a/mk/projects/in-memory-of-the-kochani-victims/index.html +++ b/mk/projects/in-memory-of-the-kochani-victims/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/macedonian-student-night-in-ljubljana/index.html b/mk/projects/macedonian-student-night-in-ljubljana/index.html index 02bf251f..c0a2e8ff 100644 --- a/mk/projects/macedonian-student-night-in-ljubljana/index.html +++ b/mk/projects/macedonian-student-night-in-ljubljana/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/meet-student-slovenia-2023/index.html b/mk/projects/meet-student-slovenia-2023/index.html index 5d247d39..3e71cd90 100644 --- a/mk/projects/meet-student-slovenia-2023/index.html +++ b/mk/projects/meet-student-slovenia-2023/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/meet-student-slovenia-2024/index.html b/mk/projects/meet-student-slovenia-2024/index.html index b8ffef7f..7e6bc16c 100644 --- a/mk/projects/meet-student-slovenia-2024/index.html +++ b/mk/projects/meet-student-slovenia-2024/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/morning-coffee-in-front-of-ctk/index.html b/mk/projects/morning-coffee-in-front-of-ctk/index.html index 13fc9d44..d20b6b4d 100644 --- a/mk/projects/morning-coffee-in-front-of-ctk/index.html +++ b/mk/projects/morning-coffee-in-front-of-ctk/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/paint-and-wine-at-sunset/index.html b/mk/projects/paint-and-wine-at-sunset/index.html index 4a20e46e..a823c409 100644 --- a/mk/projects/paint-and-wine-at-sunset/index.html +++ b/mk/projects/paint-and-wine-at-sunset/index.html @@ -25,7 +25,7 @@ - + diff --git a/mk/projects/watching-handball-together-in-slovenia/index.html b/mk/projects/watching-handball-together-in-slovenia/index.html index f26efe3f..754d698f 100644 --- a/mk/projects/watching-handball-together-in-slovenia/index.html +++ b/mk/projects/watching-handball-together-in-slovenia/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/blog/how-to-open-slovenian-bank-account/index.html b/si/blog/how-to-open-slovenian-bank-account/index.html index 69a01350..8628476d 100644 --- a/si/blog/how-to-open-slovenian-bank-account/index.html +++ b/si/blog/how-to-open-slovenian-bank-account/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/news/proof-of-means-updated-2026/index.html b/si/news/proof-of-means-updated-2026/index.html index 380780d0..8443a78f 100644 --- a/si/news/proof-of-means-updated-2026/index.html +++ b/si/news/proof-of-means-updated-2026/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/humanitarian-tournament-in-maribor/index.html b/si/projects/humanitarian-tournament-in-maribor/index.html index 264c2b03..63836021 100644 --- a/si/projects/humanitarian-tournament-in-maribor/index.html +++ b/si/projects/humanitarian-tournament-in-maribor/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/in-memory-of-frosina-kulakova/index.html b/si/projects/in-memory-of-frosina-kulakova/index.html index d5a32ad5..6a58c2ae 100644 --- a/si/projects/in-memory-of-frosina-kulakova/index.html +++ b/si/projects/in-memory-of-frosina-kulakova/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/in-memory-of-the-kochani-victims/index.html b/si/projects/in-memory-of-the-kochani-victims/index.html index 51763b20..03ed8c9b 100644 --- a/si/projects/in-memory-of-the-kochani-victims/index.html +++ b/si/projects/in-memory-of-the-kochani-victims/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/macedonian-student-night-in-ljubljana/index.html b/si/projects/macedonian-student-night-in-ljubljana/index.html index af27e5d3..89b8f18a 100644 --- a/si/projects/macedonian-student-night-in-ljubljana/index.html +++ b/si/projects/macedonian-student-night-in-ljubljana/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/meet-student-slovenia-2023/index.html b/si/projects/meet-student-slovenia-2023/index.html index f71d751f..69a8dea7 100644 --- a/si/projects/meet-student-slovenia-2023/index.html +++ b/si/projects/meet-student-slovenia-2023/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/meet-student-slovenia-2024/index.html b/si/projects/meet-student-slovenia-2024/index.html index f17eee0c..e8176388 100644 --- a/si/projects/meet-student-slovenia-2024/index.html +++ b/si/projects/meet-student-slovenia-2024/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/morning-coffee-in-front-of-ctk/index.html b/si/projects/morning-coffee-in-front-of-ctk/index.html index 192d35db..9542b319 100644 --- a/si/projects/morning-coffee-in-front-of-ctk/index.html +++ b/si/projects/morning-coffee-in-front-of-ctk/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/paint-and-wine-at-sunset/index.html b/si/projects/paint-and-wine-at-sunset/index.html index 4001bb31..09aeacc4 100644 --- a/si/projects/paint-and-wine-at-sunset/index.html +++ b/si/projects/paint-and-wine-at-sunset/index.html @@ -25,7 +25,7 @@ - + diff --git a/si/projects/watching-handball-together-in-slovenia/index.html b/si/projects/watching-handball-together-in-slovenia/index.html index 7430f303..5c97044a 100644 --- a/si/projects/watching-handball-together-in-slovenia/index.html +++ b/si/projects/watching-handball-together-in-slovenia/index.html @@ -25,7 +25,7 @@ - + diff --git a/tools/seo_inject.py b/tools/seo_inject.py index 51115b68..37b810de 100644 --- a/tools/seo_inject.py +++ b/tools/seo_inject.py @@ -39,6 +39,22 @@ SECTION_NAMES = { } HOME_CRUMB = {"en": "Home", "mk": "Дома", "si": "Domov"} +# Article dates (ISO), curated once from the English pages (dates are +# language-independent). Emitted as datePublished/dateModified in Article schema. +ARTICLE_DATES = { + "blog/how-to-open-slovenian-bank-account": {"modified": "2026-08-01"}, + "news/proof-of-means-updated-2026": {"published": "2026-08-01"}, + "projects/humanitarian-tournament-in-maribor": {"published": "2025-04-05"}, + "projects/in-memory-of-frosina-kulakova": {"published": "2025-02-08"}, + "projects/in-memory-of-the-kochani-victims": {"published": "2025-03-21"}, + "projects/macedonian-student-night-in-ljubljana": {"published": "2022-10-08"}, + "projects/meet-student-slovenia-2023": {"published": "2023-09-18"}, + "projects/meet-student-slovenia-2024": {"published": "2024-09-16"}, + "projects/morning-coffee-in-front-of-ctk": {"published": "2024-06-08"}, + "projects/paint-and-wine-at-sunset": {"published": "2025-03-08"}, + "projects/watching-handball-together-in-slovenia": {"published": "2025-01-25"}, +} + START, END = "", "" BLOCK_RE = re.compile(re.escape(START) + r".*?" + re.escape(END) + r"\s*", re.DOTALL) TITLE_RE = re.compile(r"(