Version: 3.13.0
Highlights
Mobile push notifications
Leantime can now send push notifications to the mobile apps, with its own on/off switch separate from email, routing data so taps open the right item, and a relay send path plus admin settings for self-hosted servers. (#3966, #3969, #3964, #3974)
Per-project modules
Each project can now switch individual modules - including Time Tracking - on or off, and projects with a module turned off are left out of search, goal roll-ups and reports. (#3928, #3935, #3937, #3932)
Upgrade Notes
- Database update: 3.13 runs three migrations (db version 3.5.33). They add a
metadatacolumn to projects for the module switches, give roles a separate key and base role so custom roles can exist, and grant the new permissions to existing roles. After upgrading, log in as an admin and confirm the database update screen, or runphp bin/leantime db:migrate. - Laravel 12: Leantime now runs on Laravel 12. PHP 8.2 is still the minimum; the Docker images move to PHP 8.4. The release packages include the new dependencies; git-based installs need to run
composer install. - McpServer plugin: update to McpServer 2.0. Core now ships laravel/mcp 1.x, which McpServer 1.x can't run on.
- Other plugins: the 3.13 releases of CustomFields, Notes, PgmPro, StrategyPro and Whiteboards require Leantime 3.13. Update Leantime first, then the plugins.
- MCP clients:
/mcpspeaks the MCP 2026-07-28 protocol and still answersinitializefor 2025-03-26 to 2025-11-25 clients. Errors now come back with HTTP 400/404/500 instead of 200. - Plugin authors: htmx client events are now declared on the domain event classes (
CLIENT_EVENT), and theHtmxTicketEventsenum is gone. Reference events by class, e.g.TicketUpdated::class(#3949).
New Features
- Mobile push notifications - Delivery tier, category and routing data in push payloads, a dedicated mobile push toggle, and a relay send path with admin settings for self-hosted servers (#3966, #3969, #3964, #3974)
- Two-factor at mobile SSO - OIDC now verifies the second factor during the mobile SSO exchange (#3972)
- "Assigned to you" notifications - Ticket assignment now sends an "Assigned to you" notification (#3970)
- Per-project modules - Turn individual modules, including Time Tracking, on or off per project (#3928, #3935, #3937)
- Expanded roles and permissions - New
projects.viewAllandroles.managepermissions reach custom roles, with roles stored as data keyed by level and base role (#3944, #3940) - Color schemes and backgrounds - Core color schemes and backgrounds with a tidied account settings tab, plus links that turn to the text colour on hover without an underline (#3945, #3946)
- MCP 1.x support - Upgraded to laravel/mcp 1.x and the MCP 2026-07-28 protocol (#3957)
- Shared layout components - Content boxes, page headers, section titles, field labels, accordions and resizable sidebars now use shared components for a consistent layout (#3954, #3948, #3950, #3942, #3930, #3926)
Bug Fixes
- Personal webhooks no longer follow the email switch and now include your own changes (#3955)
- Fresh installs create the access tokens table with the push columns (#3963)
- List view detail now initializes its fields and the My Calendar toolbar stays on one line (#3953)
- UI states are stored per row so saves apply immediately and can't overwrite each other (#3947)
- Link-only goals are counted once in roll-ups (#3934)
- Removed the empty view bar and set a single 10px gap between page boxes (#3933)
- Restored the Retrospectives menu entry (#3926)
- Dashboard Month view events and the "+N more" popover are readable again (#3880)
- Each class's events are now named after that class (#3936)
Localization
- All 43 languages updated - Brought every language up to date with en-US, added ten more selectable languages, and translated JS/PHP and project module strings across all languages (#3931, #3941, #3938)
- English strings centralized - Moved hard-coded English out of JavaScript, PHP and core templates into en-US.ini (#3938, #3929)
Dependency Updates
- Upgraded to Laravel 12 (#3956)
- Docker images, dev environment and CI now run on PHP 8.4 (#3959)
- Bumped DOMPurify to 3.4.17 and fast-uri to 3.1.9 (#3965)
- Bumped markdown-it to 14.3.3 for DoS advisories (#3960)
- Bumped bundled plugins for project modules, menuType retirement and laravel/mcp 1.x (#3958, #3939)
What's Changed
Other Changes
- fix(calendar): make dashboard Month view events and "+N more" popover readable by @Pichatu in #3880
- fix(blueprints): restore Retrospectives menu entry; feat(components): layout.page-header by @marcelfolaron in #3926
- fix(i18n): move hard-coded English in core templates into en-US.ini by @marcelfolaron in #3929
- feat(projects): per-project module switches by @marcelfolaron in #3928
- feat(components): section titles on elements.section-header by @marcelfolaron in #3930
- fix(modules): leave Goals-off projects out of goal roll-ups and reports by @marcelfolaron in #3932
- fix(components): no empty view bar; one 10px gap between page boxes by @marcelfolaron in #3933
- feat(i18n): move user-visible English out of JavaScript and PHP by @marcelfolaron in #3938
- feat(i18n): bring all 43 languages up to date with en-US; ten more selectable (machine translation) by @marcelfolaron in #3931
- fix(goals): count a link-only goal once in roll-ups by @marcelfolaron in #3934
- fix(events): name each class's events after that class by @marcelfolaron in #3936
- feat(search): leave out projects that switched a module off by @marcelfolaron in #3937
- feat(modules): Time tracking as a per-project module by @marcelfolaron in #3935
- feat(i18n): translate the JS/PHP and project module strings into all 43 languages by @marcelfolaron in #3941
- chore(plugins): bump submodule for project modules and menuType retirement by @marcelfolaron in #3939
- feat(roles): store roles as data with separate key, level and base role by @marcelfolaron in #3940
- feat(components): move the hand-written accordions onto elements.accordion by @marcelfolaron in #3942
- feat(theme): one box padding token for the page header and content box by @marcelfolaron in #3943
- feat(theme): links turn to the text colour on hover, without an underline by @marcelfolaron in #3946
- feat(roles): projects.viewAll and roles.manage; new permissions reach custom roles by @marcelfolaron in #3944
- fix(ui): store UI states per row so saves are immediate and can't overwrite each other by @marcelfolaron in #3947
- feat(theme): core color schemes and backgrounds, account settings tab cleanup by @marcelfolaron in #3945
- feat(events): declare htmx client events on the domain event classes by @marcelfolaron in #3949
- feat(components): move the remaining field labels onto forms.label by @marcelfolaron in #3950
- feat(components): layout.content-box with resizable sidebars by @marcelfolaron in #3948
- test(acceptance): leave the previous page before restoring the session cookie by @marcelfolaron in #3952
- fix(ui): List view detail initializes its fields; My Calendar toolbar stays on one line by @marcelfolaron in #3953
- feat(components): every core content box on layout.content-box by @marcelfolaron in #3954
- chore(deps): upgrade to Laravel 12 by @marcelfolaron in #3956
- fix(notifications): personal webhooks ignore the email switch and include your own changes by @marcelfolaron in #3955
- feat(mcp): laravel/mcp 1.x and the MCP 2026-07-28 protocol by @marcelfolaron in #3957
- fix(deps): bump markdown-it to 14.3.3 (DoS advisories) by @marcelfolaron in #3960
- chore: run Docker images, dev env and CI on PHP 8.4 by @marcelfolaron in #3959
- fix(deps): bump DOMPurify to 3.4.17 and fast-uri to 3.1.9 by @gloriafolaron in #3965
- chore(plugins): bump app/Plugins to plugins main (laravel/mcp 1.x) by @marcelfolaron in #3958
- fix(install): create zp_access_tokens with the push columns on fresh installs by @gloriafolaron in #3963
- feat(push): routing data in push payloads (parentTicketId, projectId, type, threadId) by @gloriafolaron in #3964
- feat(push): separate push on/off from the email switch by @gloriafolaron in #3969
- feat(push): relay send path for self-hosted servers + admin settings by @gloriafolaron in #3966
- feat(notifications): "Assigned to you" on TicketAssigned by @gloriafolaron in #3970
- feat(oidc): verify the second factor at the mobile SSO exchange by @gloriafolaron in #3972
- feat(push): delivery tier and category in the payload; per-platform FCM shape by @gloriafolaron in #3974
- chore(plugins): bump app/Plugins to plugins main for 3.13 by @marcelfolaron in #3975
- Release v3.13.0 by @marcelfolaron in #3976
Full Changelog: v3.12.0...v3.13.0