Changelog
A history of updates, fixes, and new features. For the full commit history, see our GitHub commits.
- Changed
Full visual redesign: a friendlier, app-like look with rounded Fredoka headings, Nunito body text, tactile buttons and bordered tiles
- Changed
New colour palette inspired by Łowicz papercuts (wycinanki): Polish crimson as the brand colour, with each blog topic and grammar category getting its own colour
- Added
Homepage lesson path showing the course in order, plus live pronunciation buttons on the hero phrase card
- Added
Blog posts now end with a short "start lesson 1" card and show the article summary under the title
- Added
Quiz feedback bar that pops in after each answer with the correct answer and explanation
- Fixed
Blog images inside paragraphs no longer cause a hydration error
- Removed
Dark mode and the theme switcher: the site is now light mode only
- Changed
Complete site redesign — moved from a dashboard-oriented sidebar layout to a content-first design with a horizontal top navigation bar
- Added
Mintlify-style mega menu: "Learn" dropdown (2×2 grid: Lessons, Grammar, Quizzes, Progress), "Blog" dropdown (categories + lazy-loaded latest posts), "About" simple dropdown
- Added
Responsive mobile drawer menu with accordion-style expandable sections for Learn, Blog, and About
- Changed
Homepage completely rewritten as a proper landing page (hero, stats strip, 3-column features, how-it-works steps, latest blog posts, FAQ, final CTA) — no longer a personal dashboard
- Added
FAQPage schema on the homepage for Google rich result eligibility
- Changed
Footer redesigned as a 3-column layout: brand + CC0 license, Learn links, Company links
- Removed
Left sidebar and bottom mobile nav replaced by the new top navigation bar
- Added
Editor's Picks / highlighted posts system — tick the "Highlight this post" checkbox in the CMS to feature a post in a dedicated section on the blog page and below the TOC on every single post
- Added
Google AdSense auto ads scoped to blog pages only (/blog and /blog/*) — homepage, lessons, grammar, and quizzes are ad-free
- Added
ads.txt file at /ads.txt for Google AdSense publisher verification
- Changed
Blog list page container widened to max-w-5xl for a more spacious editorial feel
- Changed
Blog list page and filtered/paginated view now have sticky left and right ad sidebars (w-[160px], visible at 2xl breakpoint) — fully managed via /polaris/ads using slot keys blog-sidebar-left and blog-sidebar-right
- Changed
Blog sidebar ads positioned at 25vh offset and sticky at 30vh so they appear in the mid-screen zone rather than pinned to the top edge
- Changed
Single post layout changed to 3-column: left sticky ad sidebar (post-sidebar slot) | centered max-w-2xl article | right TOC
- Fixed
Single post TOC and left ad sidebar were not sticky — caused by items-start on the flex container collapsing aside height; removed items-start so asides stretch to article height
- Fixed
Single post left and right sidebars were pushed to page edges because center column used flex-1 (consumed all space); changed to w-full max-w-2xl with justify-center so sidebars hug the article
- Changed
Section dividers and borders throughout the blog page softened — dark mode uses gray-700/800 instead of near-white; light mode uses gray-100/200 instead of bold gray-900 lines
- Changed
Category sections now show 6 posts per section (1 lead feature + 5 stacked mini-cards) for better left/right column balance
- Added
IndexNow CMS page (/polaris/indexnow) — bulk-submit any combination of blog posts, lessons, grammar pages, quizzes, and static pages to Bing/Yandex/other search engines with one click
- Added
IndexNow auto-submit on publish — when a post is saved as published or toggled to published, its URL is automatically submitted to IndexNow in the background
- Added
IndexNow key file hosted at /c1c02929ad4d4c7ba63a4561cc5e83b5.txt for domain ownership verification
- Changed
Blog page redesigned with Atlantic/every.to-inspired editorial layout — compact max-width container (max-w-4xl), left/right breathing margins, bold masthead, 2-column hero with numbered "More Stories" list, Atlantic-style thick-rule section headers per category, and lead feature + stacked mini-card layout for each category section
- Changed
Category filter pills updated to minimal black border / filled style matching editorial aesthetic
- Changed
Culture Picks slider now contained within the max-width grid with rounded corners rather than full-width bleeding
- Fixed
Blog category sections now always show all posts — previously, if the newest post in a category became the hero or a side story, the entire section appeared empty
- Fixed
Multi-category posts (e.g. tagged as both Culture and Arts) now appear in every category section they belong to, not just the Culture slider
- Changed
Content Visualizer now auto-clusters posts under pillars — posts in the same category as a pillar group automatically without needing a manual assignment; tag and keyword overlap breaks ties between multiple pillars in the same category
- Added
Automatic content backup system — every save and edit creates a snapshot before overwriting; deletion always saves a pre-delete copy that is kept forever
- Added
Daily full-site backup at 02:00 UTC via Vercel Cron — all posts saved as a single JSON snapshot
- Added
Backups CMS page (/polaris/backups) — browse all backups by type, filter by slug, preview JSON, and restore any post to any past state in one click
- Added
"Backup All Now" button for on-demand full-site manual snapshots
- Added
Multi-category support for blog posts — assign more than one category per post; first selected is the primary
- Added
New blog categories: Polish Music, Memes & Pop Culture, Arts
- Added
Culture Picks slider on the blog front page — auto-populated from the culture category with prev/next arrows and brand-blue background
- Added
Blog posts included in the global header search with grouped results (Blog / Lessons / Grammar / Quizzes)
- Added
Per-quiz SEO metadata — each quiz gets its own title, description, and Open Graph tags
- Added
Ad slot in the blog hero right column (300×250)
- Added
Live word/character/reading-time/paragraph/sentence/H2/H3 counters in the post editor
- Added
Search box in Link Manager with live result count
- Added
Google AdSense verification meta tag
- Fixed
Author avatar now shows the PolishPal logo on all posts, including older ones, without any database change
- Fixed
External outbound links are dofollow by default; nofollow is opt-in only via title="nofollow"
- Fixed
Dark mode border lines changed from white to gray-700/800; light mode lines softened to gray-200
- Changed
Blog front page redesigned as a newspaper layout — 3-column masthead grid, category sections, and "Coming soon" placeholder for empty categories
- Added
Referrer spam blocking — 403 returned for known spam domains (rankchief.shop, skyrocketlink.shop)
- Changed
New brand color (#242EF7) across the whole site — softer periwinkle canvas, rounder cards, and pill-style active navigation
- Changed
Logo and favicon recolored to match the new brand
- Added
Advertisement slots managed from the CMS — image banners, ad-network embeds, or a default "Advertise here" placeholder linking to the contact page
- Added
Magazine-style blog front page: lead story, Latest column, and a Culture Picks section
- Added
Collapsible in-article table of contents on mobile (desktop keeps the sidebar TOC)
- Removed
Legacy markdown blog files and dead code removed — the Supabase CMS is the single source of truth
- Added
Content Visualizer — a pillar → cluster "pyramid" showing how posts relate, with green/orange flags for whether cluster posts actually link to their pillar
- Added
Search-intent tagging on posts (informational / commercial / transactional / navigational)
- Added
Mark a post as a "pillar" — Link Genius and agents now prioritize internal links to pillar posts
- Added
Visible SEO score on every post in the list (color-coded) with a "worst-first" sort to spot pages to improve
- Added
Link Manager now shows inbound anchor text + source URL — see exactly which keywords point to each page
- Added
Application Passwords — REST API keys so agents/apps can publish posts without logging into the CMS
- Added
Sorting & search in Posts, Comments, and Link Manager
- Added
Link Manager dofollow/nofollow badges (green/orange) for external links
- Added
"Latest from the Blog" section on the homepage
- Added
Custom 404 page (returns a proper 404 status, not a soft 200)
- Added
llms.txt — a curated index that helps AI assistants understand and cite the site
- Changed
Cookie Policy updated to document the admin login cookie (cms_session)
- Added
Custom CMS at /polaris — write, edit, and publish blog posts from the browser
- Added
Markdown editor with live preview, formatting toolbar, and word/reading-time counter
- Added
RankMath-style SEO panel — focus keyword, density, title/meta length, and live score
- Added
Link Genius — keyword-based internal link suggestions across lessons, grammar, quizzes, and posts
- Added
Image uploads auto-converted to WebP and stored in Supabase Storage
- Added
Secure cookie-based CMS login; comment moderation folded into the CMS
- Changed
Blog content migrated from repo files to the Supabase database (instant publishing)
- Added
Share box on every lesson and grammar page — Facebook, X, Bluesky, Reddit, Instagram, and copy link
- Added
"Download PDF" button on lessons and grammar topics (clean, content-only export)
- Added
New PolishPal logo — a speech bubble with the Polish "Ł", in calm blue-indigo
- Changed
Favicon regenerated to match the new logo
- Changed
Logo color switched from red to blue-indigo to suit the language-learning niche and match the site brand
- Added
Blog section with 11 articles covering grammar, pronunciation, culture, and learning tips
- Added
About page with project background story
- Added
Contact page with GitHub issue templates
- Added
Editorial policy explaining content review process
- Added
Privacy policy and cookie policy pages
- Added
Changelog page (you're reading it!)
- Added
Mobile hamburger menu for Blog and About navigation
- Changed
All blog images converted from JPG to WebP for faster loading
- Changed
Canonical URLs updated to www.polishpal.pl
- Fixed
Sidebar "PolishPal" changed from h1 to span to avoid duplicate h1 tags
- Added
Supabase integration for shared star ratings and comments
- Added
Comment moderation dashboard with hide/delete/stats
- Added
Threaded comment replies (2 levels deep)
- Added
URL spam detection — comments with links are blocked automatically
- Added
30-second rate limiting on comments per author
- Changed
Dark mode toggle moved from bottom nav to top bar on mobile
- Added
Accessibility panel: dyslexia font, high contrast, monochrome, big cursor, reading guide
- Added
Collapsible sidebar on desktop
- Added
Right-side contextual sidebars with progress and study tips
- Added
Text-to-speech (TTS) for Polish vocabulary, dialogues, and grammar examples
- Added
SEO: JSON-LD schemas (WebSite, Course, Article, FAQ, Breadcrumb), OG tags, Twitter cards
- Added
Sitemap.xml and robots.txt for search engines
- Added
15 grammar reference topics with color-coded tables
- Added
Frequency adverb visual bar chart (zawsze → nigdy)
- Added
Znać vs wiedzieć vs umieć comparison guide
- Added
Instrumental, Accusative, and Genitive case reference pages
- Added
Full-text search across all lessons, grammar, and quizzes (⌘K shortcut)
- Added
Dark mode with three-way toggle (light/dark/system) and flash prevention
- Fixed
Matching quiz bug where duplicate values caused wrong selections
- Fixed
Nested button hydration error in PhraseList component
- Added
16 structured lessons from 37 real university lectures (A0–A1)
- Added
16 interactive quizzes with multiple choice, fill-in-blank, and matching
- Added
Progress tracking with lesson completion, quiz scores, and streaks
- Added
Responsive design with mobile bottom nav and desktop sidebar
- Added
CC0 1.0 Universal public domain dedication