createTable/addColumn are guarded by a live getTableSchema() check, so re-running a migration against an already-migrated schema is a no-op instead of failing with "table/column already exists". This addresses installations where the migration history and the actual schema had drifted apart (partial/aborted updates, restored dumps, or an interrupted uninstall).uninstall.php now drops each table only if it exists (still in FK-safe, children-first order). Previously a single missing table threw and left the remaining tables behind, while HumHub wiped the whole migration history regardless — so on reinstall the migrations re-ran against the leftover tables and failed. Combined with the idempotent migrations above, a leftover schema now self-heals on the next migrate.safeDown() in the permission-fields migration: m250721_..._bbb_add_permission_fields tried to drop a non-existent waitingroom column (the actual column is has_waitingroom) and never dropped it; the down migration is now correct and idempotent. Also removed erroneous return false after successful drops in the public-join and public-token down migrations, and converted the initial migration to safeUp()/safeDown() for consistency with the rest.hooksCreate response format, name/text-based echo dedup).session-page.png to reflect the current chat UI; removed the now-redundant session-page-chat.png / session-with-chat.png.*bold*, _italic_, ~strikethrough~ and `code`. Input is HTML-encoded before formatting, so no markup can be injected.is-running poll (used for the "Active" badge and the join-waiting page) triggered a live, synchronous API call to the BBB server. During a session with many participants, this added up to a steady stream of blocking outbound requests that competed with the meeting's own media load, degrading the whole HumHub instance. isRunning() now answers from the local bbb_session_meeting table (kept current via the same BBB webhook introduced for chat, which is now always registered for every session regardless of the chat-integration setting), and only falls back to a live BBB call - throttled to at most once per 15s per session - if no local record is found (e.g. webhook not delivered).bbb_presentation_hidden_on_login, not a valid BBB parameter) and was silently ignored by BBB. Corrected to bbb_hide_presentation_on_join./bbb/public/join/TOKEN) across all views and form?token=TOKEN) for backwards compatibility