'1.9.1', 'release_date' => '2026-07-29', 'codename' => 'Atlas', 'status' => 'stable', 'changelog' => [ '1.9.1' => [ 'date' => '2026-07-29', 'changes' => [ 'Fix world map: zero-padded ISO numeric ids left 31 countries unrendered (Brazil, Australia, Belgium, Austria, Algeria and more)', 'Fix world map: Russia and Fiji smeared across the full map width at the antimeridian; rings are now unwrapped and drawn at both edges', 'World map cropped to 84N-60S with evenodd fill rule, 174 countries', 'Logger::tail() reads the log backwards in chunks instead of loading the whole file', 'External links get rel="noopener noreferrer" in the footer and in Markdown content', 'formatDisplayName() cleaned up and guarded against empty input', 'Export statistics as CSV (Excel-compatible BOM) or JSON', 'GeoIP database auto-updates when older than 35 days', 'Editor shortcuts: Ctrl/Cmd+S to save, Ctrl/Cmd+N for a new page', 'Live search filter in the admin content browser', 'Content versioning: timestamped .bak copies in content/-backups/, 5 versions per file', ] ], '1.9.0' => [ 'date' => '2026-07-29', 'changes' => [ 'Visitor statistics dashboard (/admin/statistics) with SVG world map choropleth', 'GeoIP country resolution with provider chain: local DB-IP Lite, MaxMind .mmdb, or external API', 'Built-in pure-PHP MaxMind DB reader (no Composer dependency required)', 'cli/geoip-update.php downloads DB-IP Lite and builds a compact binary index', 'cli/generate-world-map.php generates the world map SVG from Natural Earth TopoJSON', 'Aggregated statistics in admin/storage/stats.json (survives log clearing)', 'Unique visitors, human vs bot split, top pages, referrers and daily chart', 'Period filter (7 / 30 / 90 days / all time)', 'Optional IP anonymization and configurable retention period', 'Country column with flags in the request log and KPI cards on the dashboard', ] ], '1.8.0' => [ 'date' => '2026-07-29', 'changes' => [ 'BotGuard security engine for configurable Bot, AI, and Scraper protection', 'Admin Security page (/admin/security) with toggles, rate limiting, and block/allowlists', 'Per-IP rate limiting (configurable max requests & window)', 'Dynamic robots.txt generation (/robots.txt) and noai/noimageai meta tags', 'Real IP detection with HAProxy/PFSense and multi-proxy header support', 'Status column and filtering in admin request logs', 'One-click System Update via admin console (/admin/update)', 'Git-safe local configuration (config.json & admin.json auto-generated and ignored)', ] ], '1.7.1' => [ 'date' => '2026-07-28', 'changes' => [ 'Auto-detect first available content page when default_page is set to "auto"', 'default_page now defaults to "auto" in config.json for fresh installs', 'Admin config form preserves "auto" as a selectable option', 'No more empty "-- Selecteer --" option that silently saved "index"', ] ], '1.7.0' => [ 'date' => '2026-07-28', 'changes' => [ 'Content API for PHP content files (getAllPages, getPage, getMenu, getConfig, etc.)', 'Admin guide page with rendered markdown (CommonMark with TOC, tables, code blocks)', 'HeadingPermalinkExtension for anchor links in guide TOC', 'Deep links fixed: heading IDs moved from hidden permalink anchors to heading elements', 'Code block styling (light theme) in admin guide and frontend', 'Config form with separate fields (site_title, default_page, language, SEO, author, features)', ] ], '1.6.0' => [ 'date' => '2026-07-14', 'changes' => [ 'Clean URLs: /nl/page/path instead of ?page=...&lang=nl', 'Clean admin URLs: /admin/route instead of admin.php?route=...', 'Apache .htaccess rewrite rules for clean URLs', 'PHP dev server router (cms/router.php) for local clean URLs', 'CSRF token on admin login form', 'Directory listing blocked (Options -Indexes)', 'Secure cookies (HttpOnly, Secure, SameSite)', 'Backup/sourcemap files blocked in .htaccess', 'Version disclosure disabled (meta generator removed)', 'Media browser modal with upload and recursive content tree scan', 'CodeMirror editor with formatting toolbar (bold, italic, heading, link, image, list)', 'Media button in editor toolbar with image size prompt (Markdown vs HTML mode)', 'Inline file rename in content-edit page (no separate rename page)', 'Content move and directory management in admin', 'Theme management subdirectory structure (themes/naam/theme.json)', 'Theme CRUD in admin (create, activate, edit, delete)', 'Unsaved changes detection: Back button turns into red Cancel', 'Disabled state on upload and create buttons until input is valid', 'Editor mode switching for new pages (Markdown/PHP/HTML)', '/-media/ URL prefix for media files from any content subdirectory', 'Backward-compatible /-assets/ media serving', 'Improved breadcrumb handling (no more stray dots)', 'Numerous security and code quality improvements', ] ], '1.5.0' => [ 'date' => '2025-11-26', 'changes' => [ 'Complete guide documentation rewrite with comprehensive examples', 'Implement plugin system with HTMLBlock and MQTTTracker plugins', 'Enhanced bilingual support (NL/EN) throughout the system', 'Improved template system with better layout options', 'Enhanced security headers and code quality improvements', 'Updated documentation and configuration examples', 'Plugin architecture for extensibility', 'Real-time analytics and tracking capabilities', ] ], '1.0.0' => [ 'date' => '2025-11-24', 'changes' => [ 'Initial stable release', 'Complete security hardening (100/100 pentest score)', 'Multi-language support (NL/EN)', 'Responsive design with Bootstrap 5', 'Automatic navigation and breadcrumbs', 'Search functionality', 'Markdown, HTML, and PHP content support', 'Mustache templating system', 'Comprehensive security headers', 'XSS and path traversal protection', 'Automated penetration test suite', 'Functional test coverage', ] ] ], 'system_requirements' => [ 'php' => '>=8.0', 'extensions' => ['json', 'mbstring'], 'optional' => ['opcache' => 'Recommended for performance'] ], 'credits' => [ 'author' => 'E.Noorlander / CodePress Development Team', 'license' => 'AGPL v3 / Commercial', 'license_info' => 'Dual-licensed: AGPL v3 for open-source, Commercial license for proprietary use', 'repository' => 'https://git.noorlander.info/E.Noorlander/CodePress.git', 'contact' => 'commercial@noorlander.info' ] ];