docs: update CHANGELOG and PROJECT.md for pSEO template improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-24 02:14:14 +01:00
parent 71b003cb49
commit c574fe7e62
2 changed files with 28 additions and 1 deletions

View File

@@ -6,7 +6,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased] ## [Unreleased]
### Fixed
- **Double language prefix in article URLs** — articles were served at
`/en/en/markets/italy` (double prefix) because `generate_articles()` stored
`url_path` with the lang prefix baked in, but the blueprint is already mounted
at `/<lang>`. Now `url_path` is stored without the prefix; canonical URLs,
breadcrumbs, sitemap, and admin links all generate correct single-prefix URLs.
- **`/markets` removed from RESERVED_PREFIXES** — pSEO articles live under
`/markets/` and the explicit `/markets` route takes priority over the catch-all,
so the reservation was blocking article generation.
- **`country-overview` schema_type** — changed from `[Article]` to
`[Article, FAQPage]` to enable FAQ rich results for existing FAQ content.
### Added ### Added
- **Bilingual pSEO templates (DE + EN)** — all 3 article templates
(`city-cost-de`, `city-pricing`, `country-overview`) now generate proper
German prose via `{% if language == "de" %}` conditionals. German text uses
informal "Du/Dein", natural business German (not calque translation), and
localized labels/units (€/Std, Hauptzeit/Nebenzeit, etc.).
- **Expanded English pSEO content** — all 3 templates expanded from ~400900
words to ~13001500 words each. Added: Market Context/Landscape sections,
analytical commentary after scenario markers, cross-template links
(cost ↔ pricing ↔ country), planner links in FAQ answers, second CTA at
bottom of each article, 2 additional FAQ questions per template.
- **Scenario cross-reference** — `city-pricing` template now embeds
`[scenario:city-cost-de-{{ city_key }}:operating]` to show operating cost
data from the investment analysis template.
- **CMS admin improvement** — articles list now has HTMX filter bar (search, - **CMS admin improvement** — articles list now has HTMX filter bar (search,
status, template, language), pagination (50/page), and stats strip status, template, language), pagination (50/page), and stats strip
(total/live/scheduled/draft counts). Article actions (publish/unpublish, (total/live/scheduled/draft counts). Article actions (publish/unpublish,

View File

@@ -1,7 +1,7 @@
# Padelnomics — Project Tracker # Padelnomics — Project Tracker
> Move tasks across columns as you work. Add new tasks at the top of the relevant column. > Move tasks across columns as you work. Add new tasks at the top of the relevant column.
> Last updated: 2026-02-23. > Last updated: 2026-02-24.
--- ---
@@ -80,6 +80,8 @@
- [x] Per-city financial model overrides (rates, rent, utilities, permits, court config) - [x] Per-city financial model overrides (rates, rent, utilities, permits, court config)
- [x] Admin CMS (template CRUD, data row management, bulk CSV upload, bulk generate, publish toggle, rebuild) - [x] Admin CMS (template CRUD, data row management, bulk CSV upload, bulk generate, publish toggle, rebuild)
- [x] Admin CMS v2: HTMX filter/search/pagination, background generation, inline actions, sitemap invalidation, markdown editing - [x] Admin CMS v2: HTMX filter/search/pagination, background generation, inline actions, sitemap invalidation, markdown editing
- [x] pSEO template improvements: bilingual DE+EN (all 3 templates), expanded content depth (~1500 words), cross-template links, scenario cross-references, FAQPage schema fix, 2 extra FAQs per template, second CTAs
- [x] URL prefix fix: articles stored without lang prefix (was causing `/en/en/markets/...`), all consumers updated
- [x] Markets hub (`/<lang>/markets`) — article listing with FTS + country/region filters - [x] Markets hub (`/<lang>/markets`) — article listing with FTS + country/region filters
- [x] DuckDB refresh script (`refresh_from_daas.py`) - [x] DuckDB refresh script (`refresh_from_daas.py`)