HumHub logo

HumHub

Open-source private social network and collaboration platform

Alternative to: Facebook Workplace, Yammer, Nextdoor


About Versions (104)

v1.19.0-beta.1

2026-07-21
  • Fix #8334: The module administration showed a “Configure” button on disabled modules to users holding ManageSettings but not ManageModules — a disabled module now only offers the “Enable” action; the ManageSettings permission description now also mentions module settings, since module config controllers are guarded by this permission
  • Enh #8332: Add test coverage for the unencoded short text converter (FORMAT_SHORT_TEXT) — the existing test exercises the encoded legacy FORMAT_SHORTTEXT path only
  • Fix #8326: Deleting a user or running the PurgeDeletedContents job crashed with a fatal error when hitting a content entry whose underlying record no longer exists — orphaned entries are now removed directly, matching the integrity check (#8312)
  • Fix #8327: The 1.19 upgrade aborted with a foreign key violation in the comment content_id migration when the database contained a reply whose parent comment (or a comment whose content) was already gone — such orphaned comments are now deleted before the RESTRICT foreign keys are created
  • Enh #8321: Add the UnreadCountChangedEvent, triggered whenever a user’s unseen notification count changes or by modules such as Messenger
  • Fix #8322: On iOS (Safari & Chrome), programmatically focusing a field (e.g. opening a comment reply form) only showed the keyboard without scrolling the field into view until the first keystroke — a just-focused input, textarea or richtext editor that ends up hidden behind the keyboard is now scrolled into view once the keyboard has settled, network-wide
  • Fix #8318: Comments inserted via AJAX (a newly posted comment, “Show previous/next comments”, the comments popup) were missing the separator line and spacing towards the preceding comment — most visibly a new comment sticking directly to the highlighted comment on a comment permalink view; the BS5 refactoring (#7902) moved the separator out of the comment view into the list views, so the comment/post and comment/show responses no longer contained it (regression from #7902)
  • Fix #8318: Submitting a comment right after a page reload restored the entered text via the richtext backup but failed with “Message cannot be blank” — the backup was only restored into the editor, while the underlying input is synced on focusout only; the restored content is now written to the input right away, so the form can be submitted without focusing the editor again. Also, submitting a restored value within the first backup interval (3s) left the stored backup behind, so the text reappeared on the next reload — the restored value now counts as the backuped value, so the reset after submitting reliably clears it
  • Enh #8318: The comment counter of a content (“Comment (n)”) now includes sub comments instead of counting only top-level comments; posting or deleting a sub comment updates both the reply counter of its parent comment and the total counter, and deleting a comment subtracts its sub comments from the total
  • Enh #8318: The upload and submit buttons of the comment form only appear once the text input is focused or already has content (e.g. a prefilled mention), in line with the upcoming comment UI design
  • Fix #8318: Action links created via Link::withAction() (e.g. the “Show previous/next comments” pagination, “Notify members”, the timezone toggle) rendered as anchors without href — no pointer cursor, not keyboard focusable and not announced as links by screen readers; they now carry href="#" (the action framework prevents the default), and loading more comments moves the keyboard focus to the loaded continuation link or the first loaded comment instead of dropping it
  • Fix #8318: Replying to a sub comment did nothing on the first click (the second click worked) — the reply form is hidden via an inline style, but the BS5 jQuery shim decided the slideToggle()/fadeToggle() direction solely by the d-none class, so the first toggle slid the already hidden form further up and only the thereby added d-none made the next toggle work; the shim now respects the computed display and slideDown() also reveals elements hidden by an inline style or stylesheet rule (latent since #7902 — in 1.18 a broken instanceof check in the comment Form widget kept reply forms always visible, so the wrong toggle direction never surfaced)
  • Enh #8318: Improved comment list pagination — the “Show previous/next {count} comments” links show the real remaining count (counting down while loading) and are centered, a single remaining comment is shown directly instead of a pagination link (#8320), and the list on a comment permalink stays anchored around the linked comment (a window of previous comments with a “Show previous” link) instead of inlining up to 25 previous comments without pagination
  • Fix #8313: Notifications, activities and mail subjects for content without text (e.g. a post containing only an image) rendered broken sentences like “Sam likes .” or “Sam just commented your in Space Misc” — the content preview (SocialActivity::getContentInfo() / ContentHelper::getContentInfo()) now falls back to the content name (“Sam likes post.”); the NewComment notification showed the misleading “[Deleted]” placeholder for such content and, for actually deleted records, leaked the comment text as preview — “[Deleted]” is now shown if and only if the commented record no longer exists. Also fixed the capitalized “Space” in the “commented … in Space {space}” / “just wrote … in Space {space}” notification mail subjects (translation keys renamed accordingly, existing translations were preserved)
  • Fix #8303: Pinned npm-asset/intl-messageformat (11.1.2) and npm-asset/socket.io-client (2.5.0) — the newer mirror packages ship an “iife” file that is actually an ES module (its top-level export broke the combined humhub-app.js entirely) resp. no longer contain the dist/ files referenced by SocketIoAsset
  • Fix #8294: Likes were not deleted when their content was hard-deleted — the like module now deletes a content’s likes on ContentActiveRecord::EVENT_BEFORE_DELETE (matching the comment module)
  • Enh: Removed the now-unused Controller::$doNotInterceptActionIds flag and Controller::isNotInterceptedAction() — action interception is handled by the user gate system (see docs/develop/user-gates.md); see the migration guide
  • Enh: When Step 1 of the two-step login form redirects to an external auth client, the resolved user’s e-mail address is now stored as a one-shot login hint (LoginHintService) — external auth clients (SAML, OIDC) can consume it and forward it to the IdP so its login mask is pre-filled with the identity the user already typed
  • Enh #8292: The installer “Modules” step no longer downloads a recommended module from the marketplace when it is already available locally (e.g. via moduleAutoloadPaths) — the local module is enabled instead
  • Enh: Added the central user gate system (humhub\components\gates) for modules that intercept requests to route the user through a mandatory flow (2FA check, terms acceptance, wizards) — gates register via GateManager::EVENT_INIT_GATES, are evaluated in a deterministic order with at most one redirect per request, answer AJAX/API requests with machine-readable responses instead of HTML redirects, and cache the all-closed state per session; the must-change-password and maintenance-mode enforcement were migrated from ControllerAccess fixed rules to the first core gates, and the unused legacy codeCallback mechanism was removed (see docs/develop/user-gates.md and the migration guide)
  • Enh #8284: Remote (e.g. S3) mount support hardening — AssetImage::exists() lookups are cached (previously every rendered avatar, banner, logo and favicon paid one fileExists() round trip against the data mount per request), module asset publishing is driven by the cached AssetManager publish state instead of per-request is_file() checks against the mount, the ALTCHA captcha worker is served same-origin via captcha/worker (the Worker constructor rejects cross-origin scripts), and useXSendfile is applied only to local data mounts — other mounts fall through to the temporary-URL redirect / stream
  • Enh #8190: Added guest mode config options comment.guestHideComments (hide the comment panel for guests; Comment and Like buttons stay visible and lead to the login modal) and post.guestExpandPosts (always show posts fully expanded to guests)
  • Enh: Asset publishing copies far fewer files (a dev instance published 7,500+ files, most of them never referenced) — all bundles publishing the whole @humhub/resources tree now share default publish options (AssetBundle::HUMHUB_RESOURCES_PUBLISH_OPTIONS) excluding the production build output (build/, ~1,800 files) and scss/ sources, and the npm-based core bundles (jquery-ui, @fontsource/open-sans, font-awesome, animate.css, bluebird, select2, timeago, jquery.cookie, intl-messageformat, jquery) now publish only the files they register plus runtime-loaded locales/fonts. Note: bundles sharing a source path must declare identical publish options, as the published copy is keyed by source path only
  • Fix: Mercure live driver could not deliver updates when the hub is co-located with the app but the public address is not reachable over loopback (e.g. the Docker image with a non-localhost SERVER_NAME) — the single hubUrl was used for both server-side publishing and browser subscribing. Added MercurePushDriver::$internalHubUrl (defaults to hubUrl): the server now publishes via internalHubUrl while the browser keeps subscribing via the public hubUrl
  • Fix #8242: Within a space, “member joined”/“left” activities now link to the member’s profile instead of the (redundant) space; in the global/dashboard stream and for grouped entries (multiple members) they keep linking to the space
  • Enh: A UserSource can declare email optional via UserSourceInterface::isEmailRequired() (default true); User::isEmailRequired() now consults the user’s source (through UserSourceService), so sources for external/federated users can provision accounts without an email address
  • Fix: migrate/up --includeModuleMigrations=1 now fully registers each enabled module before applying its migrations (namespace alias from config.php, module instance available via Yii::$app->getModule()), matching the web-based migration — id-derived aliases alone could not autoload classes of modules whose id differs from their namespace (e.g. auth-keycloak vs. humhub\modules\authKeycloak); a module that fails to register (e.g. a stale module during a core upgrade) is skipped with a warning and migrated when the module itself is updated
  • Fix #8227: Clear cache no longer fails with “Permission denied” when the assets mount directory is not deletable (e.g. on Docker); only its contents are removed
  • Enh: Added #[WithoutModuleAutoload] attribute for console controllers that do not require module loading (e.g. settings/*, cache/*)
  • Enh #8214: Introduced ModuleDiscoveryService centralising all module filesystem discovery and ModuleService encapsulating per-module lifecycle operations (enable, disable, remove); slimmed down ModuleAutoLoader and ModuleManager
  • Enh: Refactored MarketplaceController CLI — skips third-party module autoloading at bootstrap (#[WithoutModuleAutoload]), loads each module on demand, and runs update-all sub-updates in isolated subprocesses
  • Enh: Icon-only Button automatically derives aria-label from tooltip; logs a warning in YII_DEBUG mode when neither is set
  • Enh: Improved community module handling in the marketplace — admins can opt in via a new “Include community modules” option to show modules contributed by the community
  • Fix #8181: Encoded HTML entities in notification mail subjects
  • Enh #8179: Improved meta tag handling — use property instead of name for og:image, do not override meta tags set by modules with proper key, and allow image URL strings in ViewMeta::setImages()
  • Enh #8011: Added AssetImage as replacement for ProfileImage, SiteIcon, LogoImage, LoginBackground, MailHeader
  • Enh #8011: Added AssetManager FlySystem support — data and asset storage are Flysystem mounts, enabling remote storage (e.g. S3); image processing reads and writes through the store and applies the imageWebpQuality option (#8310)
  • Enh #8078: Added client-side translation support via the new i18n JS module (humhub.i18n.js), including a message extractor command
  • Enh #7980: Remove deprecations
  • Enh #7917: Refactored the comment module — comments reference their content via content_id/parent_comment_id foreign keys instead of polymorphic object_model/object_id columns; introduced CommentListService (see the migration guide)
  • Enh #7933: Refactored the activities system — content activities extend BaseContentActivity, are dispatched via ActivityManager::dispatch() and render via getMessage() instead of view files; the activity table’s polymorphic object_model/object_id columns were replaced by content/container foreign keys. Upgrade note: the restructure migration is irreversible and permanently deletes activities that cannot be resolved to existing content — take a database backup before upgrading (see the migration guide)
  • Enh #8025: Implement URL for Content Created Activity
  • Fix #8031: Border Radius for Color Picker under Theme Customisation
  • Fix #8006: Web Installer Nginx Example
  • Fix #8041: Update Button::asLink to Link::to
  • Fix #8070: Refactor Content deletion to make it possible only from ContentActiveRecord
  • Fix #8071: Fix button link with icon only
  • Enh #8083: Store module version in DB
  • Enh #5141: Added CLI command to delete disabled or soft deleted users
  • Enh #8100: Move static and themes into protected/humhub
  • Enh #8128: Exact search for user id in admin user search
  • Enh #8129: Limit activity content length
  • Enh #8139: Update rector rules
  • Fix: Auto-flush cache when database schema is missing (recovers from dev DB wipes that left a stale InstallationState=INSTALLED cache entry)
  • Fix: SingleLogout — always clear the local Yii identity in AuthController::actionLogout(), even when the AuthClient short-circuits with an SLO redirect. The user is now locally logged out at the moment they leave HumHub, regardless of whether the IdP ever redirects back (e.g. front-channel iframe SLO setups).
  • Enh #8147: Sort modules alphabetically in admin module list
  • Enh: View overrides via components.view.theme.pathMap in common.php — per-file (.php key) and directory entries supported; mapping survives runtime theme switches
  • Enh #8165: Rename User::STATUS_DISABLED to STATUS_DEACTIVATED (deprecated alias kept); i18n labels Disabled / Disabled users renamed accordingly
  • Enh #8168: Improve safe migration methods
  • Enh: Added optional post title (off / optional / required, configurable under Admin → Design); shown as a heading above the post content
  • Fix #8005: Remove space followers on change to private visibility
  • Enh #8178: New sign in & sign up flow
  • Enh #8180: Topic picker handling
  • Fix #8201: [Security] Restrict live event unserialize() to LiveEvent subclasses to prevent PHP object injection
  • Enh #8223: Define default user idle timeout to 4 hours
  • Enh #8232: Fix absolute URLs in mail summary
  • Enh #8237: Allow symfony/mailer ^7.0 and widen all mailer bridge constraints to unblock symfony/event-dispatcher 7.x
  • Enh #8244: Log progress of the queued search index rebuild (SearchRebuildIndex) — start, interim item count, completion, and failures/skips, each prefixed with the worker process ID — via the search-indexing log category
  • Fix #8246: Add aria-label attribute for icon-only buttons
  • Enh #8255: CI tests now support a database engine selector (MariaDB/MySQL); per-push runs use MariaDB 11.8, plus a weekly DB-compatibility sweep across MariaDB and MySQL versions
  • Enh #8261: In the mobile app settings, change Whitelist domains to URLs, and also send auth client (SSO) URLs to the mobile app to open all of them in the in-app browser instead of the external one
  • Enh #8254: Allow reading content in State mode for owner
  • Fix #8267: Delete \humhub\widgets\PageAddonStack unused class
  • Fix #8283: Redirect invite links to the external single auth client instead of the local registration form when local registration is disabled
  • Enh #8287: Add ContentContainerActiveRecord::EVENT_INIT_PROFILE_IMAGE and EVENT_INIT_BANNER_IMAGE
  • Enh #8150: Topic sidebar widget
  • Fix #8312: Fix Integrity Checks on cleaning up orphaned content, like, comment, activity data