🚀 Changelog — Flatboard 5.1.0

Release date: February 27, 2026


🛠️ Bug Fixes

🔔 Notifications — Debug warning, bell visibility, per-item delete, stale component

Several issues across the notification system were resolved:

  • Debug mode alert

    • When config.debug = true, a system notification is automatically created for each admin on first dashboard load.
    • Links directly to /admin/config.
    • Writes a Logger::warning() entry on every dashboard load while debug is active.
    • Not duplicated if an unread copy already exists.
  • Notification bell hidden when empty

    • #notification-bell-wrapper now starts with d-none.
    • loadNotificationsUnified() reveals it only if at least one notification exists.
    • #notification-count appears only if unread count > 0.
    • “Mark all as read” hides the badge but keeps the bell accessible.
  • Per-item delete button

    • Added fas fa-trash-alt button in notification-manager.js.
    • Sends POST to notifications/delete.
    • 250ms fade-out animation.
    • Calls loadNotificationsUnified() to refresh state.
    • Navigation click area and delete button are fully isolated.
  • Stale native bell component

    • app/Views/components/notification-bell.php rewritten to match premium theme.

    • Updated structure:

      • <li id="notification-bell-wrapper" class="d-none">
      • Font Awesome icon
      • notification-count badge
      • notification-list-container
      • “Mark all as read” button
      • “View all” footer link

Affected files

FileScope
app/Controllers/Admin/DashboardController.phpCore
app/Services/NotificationService.phpCore
app/Views/components/notification-bell.phpShared
themes/premium/views/components/notification-bell.phpPremium
themes/assets/js/main.jsShared JS
themes/assets/js/frontend/modules/notification-manager.jsShared JS
languages/fr | en | de | zh/main.jsoni18n

🔌 NotificationService — Custom Types Hook

NotificationService::validateNotificationType() rejected plugin-defined types.

Fix:

  • Added notification.types.register hook.
  • $allowedTypes passed by reference.
  • Plugins extend types at boot:
PHP
Plugin::hook('notification.types.register', function(array &$types): void {
    $types[] = 'my_custom_type';
});
FileScope
app/Services/NotificationService.phpCore

👤 Profile — Subscriptions Tab Date Fix

Issue: Displayed $discussion['updated_at'] instead of created_at.

Fix:

  • Changed updated_at ?? created_atcreated_at.
  • Sorting still uses updated_at (recent activity first).
FileScope
app/Views/users/profile.phpShared

🤖 Presence — Bots Leaking Into Anonymous Visitors

Root cause: Over-broad exception array in \bbot\b fallback.

Fixes:

  • Removed exception array.

  • Added missing $botCache writes.

  • Added detection patterns:

    • NaverBot / Yeti
    • 360Spider
    • YisouSpider
    • Aspiegel
    • ClaudeBot
    • NetpeakSpider
    • Omigili
    • Datadog Synthetics
    • netsystemsresearch
FileScope
app/Models/Visitor.phpCore

🏷️ Presence — Bot Name Display Fixes

  • Added friendly labels for unmapped bots.
  • Fixed key ordering (googlebot-image before googlebot).
FileScope
app/Models/Visitor.phpCore

📄 Presence — Visitors/Bots Pagination

Problem: Hard limit of 20 entries.

Fixes:

  • Added:

    • fetchVisitors(offset, append)
    • fetchBots(offset, append)
  • Added “View more…” button when hasMore = true.

  • Polling resets offset every 30 seconds.

FileScope
themes/assets/js/presence-lists.jsShared JS

🛠️ Admin — File Permission Fix Tool

Available in Admin → Maintenance → Fix Permissions

Modes

  • Analyze (dry-run)
  • Apply

Rules Applied

TargetPermission
Standard directories (app/, themes/, plugins/, languages/, vendor/)0755
Writable directories (stockage/, public/uploads/)0775
PHP/JS/CSS/JSON files0644
Data files (stockage/*.json)0664
Sensitive files (config.json, *.key, *.pem, *.env)0640
Shell scripts (*.sh)0755

Additional Behavior

  • Excludes .git, .svn, node_modules.
  • JSON response includes counters + failed chmod list (max 20).
  • Entire maintenance section only visible if config.debug = true.
  • “Debug” badge shown in UI.
  • Translated maintenance.debug_only_notice key (5 languages).
FileScope
app/Controllers/Admin/MaintenanceController.phpCore
app/Views/admin/dashboard.phpShared
themes/assets/js/admin/modules/dashboard-management.jsShared JS
app/Core/App.phpCore

📦 Files Changed (5.1.0)

FileScope
app/Services/NotificationService.phpCore
app/Views/users/profile.phpShared
app/Models/Visitor.phpCore
themes/assets/js/presence-lists.jsShared JS
app/Controllers/Admin/MaintenanceController.phpCore
app/Views/admin/dashboard.phpShared
themes/assets/js/admin/modules/dashboard-management.jsShared JS
app/Core/App.phpCore


🚀 Changelog — Flatboard 5.0.7

Release date: February 23, 2026


🛠️ Bug Fixes

🤖 Flatbot / PrivateMessaging — Unauthorized View Error

  • Added missing authorized_views entries:

    • plugins/Flatbot/views.json
    • plugins/PrivateMessaging/views.json

👤 User Profile — Bio Markdown Rendering

  • Applied \App\Helpers\MarkdownHelper::parse() to bio field.

⭐ Post — “Best Answer” Link Layout

  • Restructured markup for clean label + attribution.
  • Added fallback 'par' if translation missing.

📄 Pagination — Subdirectory Load More Fix

  • Removed /api/ exception in buildUrl().
  • Fixed currentOffset initialisation.

🗄️ Cache — PHP 8.3 Deprecation

  • Added (int) cast before usleep() call.

🤖 Flatbot — Avatar Rendering Fix

  • Added view.user.avatar hook.
  • Implemented renderFlatbotGenericAvatar() handler.

📅 Flatbot — Date Separators in Chat

  • Added:

    • dateKeyFromTs()
    • makeDateSeparator()
  • Added translations for Today/Yesterday.

  • Dark-mode compatible CSS.


🤖 Flatbot — Bot Group & Profile Completion

  • Added ensureFlatbotGroupExists().
  • Set email_verified = 1.
  • Added translated signature.
  • Added language keys (bot_signature, today, yesterday, etc.).

✉️ PrivateMessaging — Base URL Redirect Fix

Replaced hardcoded redirects with window.url() in:

  • compose.php
  • view.php
  • frontend.php

📤 Upload — Missing Permission Check

  • Added PermissionHelper::can($userId, 'attachment.upload').

👁️ Presence — API Permission Enforcement

  • Added presence.view check in:

    • getVisitorsList()
    • getBotsList()
    • getPageStats()
    • getActive()

🔐 Authentication — “Remember Me” Fixes

  • Skipped timeout checks when _remember_me = true.
  • Re-sent persistent cookie after session_regenerate_id().
  • Set session.gc_maxlifetime = 30 days.
  • Stored _remember_me in session.

✨ New Features

👁️ Presence Indicator — Plugin Hook System

New Hooks

HookPurpose
visitor.page_infoInject page metadata
presence.anonymous_visitorsModify anonymous visitors
presence.botsModify bots list
presence.usersModify active users
visitor.before_trackModify visitor tracking data

Plugins Updated

PluginURL PatternPresence Type
EasyPages/page/{slug}easypages
FlatBlog/blog/*blog_*
PrivateMessaging/messages/*messages
Reputation/reputation/*reputation
polls/polls/*polls
ResourceManager/resources/*resources
CookieConsent/cookieconsent/*cookieconsent
Flatbot/flatbotflatbot
TranslationManager/translations/*translations


🚀 Changelog — Flatboard 5.0.6

Release date: February 22, 2026


🛠️ Bug Fixes

🌐 API — Autoloader Fix

  • Replaced inline bootstrap in public/api.php with:

    PHP
    require_once BASE_PATH . '/bootstrap.php';

🔄 StorageMigrator — Multiple Fixes

IssueFix
Undefined DATA_PATHReplaced with BASE_PATH . '/stockage' fallback
Session::delete() crashReplaced with Session::remove()
Dates overwritten in migrationAdded createDiscussionWithId() and createPostWithId()

📦 Files Changed (5.0.6)

FileScope
public/api.phpCore
plugins/StorageMigrator/StorageMigratorController.phpPlugin
app/Storage/JsonStorage.phpCore
app/Storage/Migrations/SqliteToJsonMigration.phpCore


🚀 Changelog — Flatboard 5.0.5

Release date: February 19, 2026


🛠️ Bug Fixes

🔎 SEO — rel="nofollow ugc"

  • Added to all external user-generated links.

  • Applied to:

    • Profile website field
    • MarkdownHelper
    • EasyMDEHelper

🎨 EasyMDE — Font Awesome 7 Compatibility

  • Replaced glyph rendering with inline SVG background-image.
  • Preserved <i class="fa fa-*"> structure.
  • Covers 25 toolbar icons.
  • Fully supports hover, active, dark mode.

💻 EasyMDE & TUIEditor — Code Block Redesign

  • Unified .tui-code-block.
  • Integrated header bar.
  • JS-only collapse.
  • Added translations.
  • Added --force to rebuild:markdown.

🧠 Cache — Null Value Fix

  • Replaced isset() with array_key_exists().

🏷️ Discussion Status Badges

  • Fixed JS target container.
  • Added data-status attributes.
  • Ensured translated labels appear.

🧑‍⚖️ Moderation Dropdown

  • Removed duplicate “Ban user” button.

📜 Logger — Placeholder Fix

  • Injected discussion title into {title}.

📄 Load More — Profile Tabs Fix

  • Separated JSON and HTML handlers.
  • Added container IDs.
  • Fixed pagination ownership.

🎨 UI Styling

  • Removed dropdown left indentation (padding-left: 0).

📈 Improvements

📄 EasyPages — Banner Metadata & Rendering

  • Banner uses first post created_at.
  • Shows “Updated on” if edited.
  • Removed duplicate title/author.
  • Unified layout with Markdown pages.

📊 EasyPages — Consolidated Page Views

BeforeAfter
One file per visitSingle data/views.json
O(n) glob scanConstant-time lookup
Plain IP storageSHA-256 hashed IPs

Includes automatic one-time migration.


🎯 Icon Picker — CSS-Parsed Catalogue

  • Python script parses font-awesome.min.css.
  • 1,906 validated icons across 20 categories.
  • Automatic solid/brands detection.
  • Supports --dry-run and --stats.

Voici la version corrigée, complète et homogénéisée du Changelog 5.0.5, avec :

  • ✅ Sections normalisées
  • ✅ Emojis cohérents
  • ✅ Tableaux propres
  • ✅ Structure professionnelle uniforme

🚀 Changelog — Flatboard 5.0.5

Release date: February 19, 2026


🛠️ Bug Fixes

🔎 SEO — rel="nofollow ugc"

  • Ajout automatique de rel="nofollow ugc" sur tous les liens externes générés par les utilisateurs.

  • Appliqué à :

    • Champ site web du profil
    • MarkdownHelper
    • EasyMDEHelper

🎨 EasyMDE — Compatibilité Font Awesome 7

  • Remplacement du rendu glyph par background-image SVG inline.
  • Conservation de la structure <i class="fa fa-*">.
  • Compatible hover / active / dark mode.
  • 25 icônes toolbar couvertes.

💻 EasyMDE & TUIEditor — Refonte des blocs de code

  • Unification sous .tui-code-block.
  • Ajout barre d’en-tête intégrée.
  • Collapse JS-only.
  • Ajout traductions associées.
  • Ajout option --force pour rebuild:markdown.

🧠 Cache — Correction valeur null

  • Remplacement de isset() par array_key_exists().
  • Corrige les faux positifs “Invalid cache data”.

🏷️ Discussion Status Badges

  • Correction ciblage JS du conteneur.
  • Ajout attributs data-status.
  • Garantie affichage des labels traduits.

🧑‍⚖️ Dropdown de modération

  • Suppression du bouton “Ban user” dupliqué.

📜 Logger — Placeholder {title}

  • Injection correcte du titre de discussion dans les logs.

📄 Pagination — Onglets Profil

  • Séparation handlers JSON / HTML.
  • Ajout IDs de conteneurs.
  • Correction ownership pagination.
  • Fix du "Load More".

🎨 UI — Dropdown Alignment

  • Suppression padding-left: 0 résiduel.
  • Alignement propre des menus déroulants.

📈 Improvements

📄 EasyPages — Rendu des pages issues de discussions

  • Le bandeau utilise created_at du premier post.
  • Affiche “Updated on” si édité.
  • Suppression doublon titre/auteur.
  • Layout unifié avec pages Markdown natives.

📊 EasyPages — Consolidation du système de vues

AvantAprès
1 fichier par visite1 fichier data/views.json unique
Scan glob() O(n)Lookup constant
IP stockées en clairSHA-256 hash

✔ Migration automatique exécutée une seule fois.


🎯 Icon Picker — Catalogue généré depuis CSS

  • Script Python analyse font-awesome.min.css.
  • 1 906 icônes validées.
  • 20 catégories.
  • Détection automatique solid / brands.
  • Options --dry-run et --stats.

📦 Files Changed (5.0.5)

FileScope
app/Helpers/MarkdownHelper.phpCore
app/Helpers/EasyMDEHelper.phpCore
app/Helpers/Cache.phpCore
app/Controllers/DiscussionController.phpCore
app/Controllers/UserController.phpCore
app/Services/EasyPagesService.phpCore
app/Views/users/profile.phpShared
themes/assets/js/main.jsShared JS
themes/assets/js/profile-tabs.jsShared JS
themes/assets/css/style.cssShared CSS
plugins/Logger/Logger.phpPlugin
plugins/EasyPages/*Plugin
tools/icon_picker_generator.pyTooling

Edited on Feb 27, 2026 By Fred .