Changelog
A history of updates, fixes, and new features. For the full commit history, see our GitHub commits.
Complete site redesign — moved from a dashboard-oriented sidebar layout to a content-first design with a horizontal top navigation bar
Mintlify-style mega menu: "Learn" dropdown (2×2 grid: Lessons, Grammar, Quizzes, Progress), "Blog" dropdown (categories + lazy-loaded latest posts), "About" simple dropdown
Responsive mobile drawer menu with accordion-style expandable sections for Learn, Blog, and About
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
FAQPage schema on the homepage for Google rich result eligibility
Footer redesigned as a 3-column layout: brand + CC0 license, Learn links, Company links
Left sidebar and bottom mobile nav replaced by the new top navigation bar
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
Google AdSense auto ads scoped to blog pages only (/blog and /blog/*) — homepage, lessons, grammar, and quizzes are ad-free
ads.txt file at /ads.txt for Google AdSense publisher verification
Blog list page container widened to max-w-5xl for a more spacious editorial feel
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
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
Single post layout changed to 3-column: left sticky ad sidebar (post-sidebar slot) | centered max-w-2xl article | right TOC
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
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
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
Category sections now show 6 posts per section (1 lead feature + 5 stacked mini-cards) for better left/right column balance
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
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
IndexNow key file hosted at /c1c02929ad4d4c7ba63a4561cc5e83b5.txt for domain ownership verification
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
Category filter pills updated to minimal black border / filled style matching editorial aesthetic
Culture Picks slider now contained within the max-width grid with rounded corners rather than full-width bleeding
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
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
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
Automatic content backup system — every save and edit creates a snapshot before overwriting; deletion always saves a pre-delete copy that is kept forever
Daily full-site backup at 02:00 UTC via Vercel Cron — all posts saved as a single JSON snapshot
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
"Backup All Now" button for on-demand full-site manual snapshots
Multi-category support for blog posts — assign more than one category per post; first selected is the primary
New blog categories: Polish Music, Memes & Pop Culture, Arts
Culture Picks slider on the blog front page — auto-populated from the culture category with prev/next arrows and brand-blue background
Blog posts included in the global header search with grouped results (Blog / Lessons / Grammar / Quizzes)
Per-quiz SEO metadata — each quiz gets its own title, description, and Open Graph tags
Ad slot in the blog hero right column (300×250)
Live word/character/reading-time/paragraph/sentence/H2/H3 counters in the post editor
Search box in Link Manager with live result count
Google AdSense verification meta tag
Author avatar now shows the PolishPal logo on all posts, including older ones, without any database change
External outbound links are dofollow by default; nofollow is opt-in only via title="nofollow"
Dark mode border lines changed from white to gray-700/800; light mode lines softened to gray-200
Blog front page redesigned as a newspaper layout — 3-column masthead grid, category sections, and "Coming soon" placeholder for empty categories
Referrer spam blocking — 403 returned for known spam domains (rankchief.shop, skyrocketlink.shop)
New brand color (#242EF7) across the whole site — softer periwinkle canvas, rounder cards, and pill-style active navigation
Logo and favicon recolored to match the new brand
Advertisement slots managed from the CMS — image banners, ad-network embeds, or a default "Advertise here" placeholder linking to the contact page
Magazine-style blog front page: lead story, Latest column, and a Culture Picks section
Collapsible in-article table of contents on mobile (desktop keeps the sidebar TOC)
Legacy markdown blog files and dead code removed — the Supabase CMS is the single source of truth
Content Visualizer — a pillar → cluster "pyramid" showing how posts relate, with green/orange flags for whether cluster posts actually link to their pillar
Search-intent tagging on posts (informational / commercial / transactional / navigational)
Mark a post as a "pillar" — Link Genius and agents now prioritize internal links to pillar posts
Visible SEO score on every post in the list (color-coded) with a "worst-first" sort to spot pages to improve
Link Manager now shows inbound anchor text + source URL — see exactly which keywords point to each page
Application Passwords — REST API keys so agents/apps can publish posts without logging into the CMS
Sorting & search in Posts, Comments, and Link Manager
Link Manager dofollow/nofollow badges (green/orange) for external links
"Latest from the Blog" section on the homepage
Custom 404 page (returns a proper 404 status, not a soft 200)
llms.txt — a curated index that helps AI assistants understand and cite the site
Cookie Policy updated to document the admin login cookie (cms_session)
Custom CMS at /polaris — write, edit, and publish blog posts from the browser
Markdown editor with live preview, formatting toolbar, and word/reading-time counter
RankMath-style SEO panel — focus keyword, density, title/meta length, and live score
Link Genius — keyword-based internal link suggestions across lessons, grammar, quizzes, and posts
Image uploads auto-converted to WebP and stored in Supabase Storage
Secure cookie-based CMS login; comment moderation folded into the CMS
Blog content migrated from repo files to the Supabase database (instant publishing)
Share box on every lesson and grammar page — Facebook, X, Bluesky, Reddit, Instagram, and copy link
"Download PDF" button on lessons and grammar topics (clean, content-only export)
New PolishPal logo — a speech bubble with the Polish "Ł", in calm blue-indigo
Favicon regenerated to match the new logo
Logo color switched from red to blue-indigo to suit the language-learning niche and match the site brand
Blog section with 11 articles covering grammar, pronunciation, culture, and learning tips
About page with project background story
Contact page with GitHub issue templates
Editorial policy explaining content review process
Privacy policy and cookie policy pages
Changelog page (you're reading it!)
Mobile hamburger menu for Blog and About navigation
All blog images converted from JPG to WebP for faster loading
Canonical URLs updated to www.polishpal.pl
Sidebar "PolishPal" changed from h1 to span to avoid duplicate h1 tags
Supabase integration for shared star ratings and comments
Comment moderation dashboard with hide/delete/stats
Threaded comment replies (2 levels deep)
URL spam detection — comments with links are blocked automatically
30-second rate limiting on comments per author
Dark mode toggle moved from bottom nav to top bar on mobile
Accessibility panel: dyslexia font, high contrast, monochrome, big cursor, reading guide
Collapsible sidebar on desktop
Right-side contextual sidebars with progress and study tips
Text-to-speech (TTS) for Polish vocabulary, dialogues, and grammar examples
SEO: JSON-LD schemas (WebSite, Course, Article, FAQ, Breadcrumb), OG tags, Twitter cards
Sitemap.xml and robots.txt for search engines
15 grammar reference topics with color-coded tables
Frequency adverb visual bar chart (zawsze → nigdy)
Znać vs wiedzieć vs umieć comparison guide
Instrumental, Accusative, and Genitive case reference pages
Full-text search across all lessons, grammar, and quizzes (⌘K shortcut)
Dark mode with three-way toggle (light/dark/system) and flash prevention
Matching quiz bug where duplicate values caused wrong selections
Nested button hydration error in PhraseList component
16 structured lessons from 37 real university lectures (A0–A1)
16 interactive quizzes with multiple choice, fill-in-blank, and matching
Progress tracking with lesson completion, quiz scores, and streaks
Responsive design with mobile bottom nav and desktop sidebar
CC0 1.0 Universal public domain dedication