Releases: LibreBooking/librebooking
v4.3.0
v4.3.0 (2026-04-03)
Bug Fixes
-
Allow special characters in passwords for user creation (
a903be1) -
Correct check-in status display in resource details popup (
ed3dcbc) -
Improve tooltip rendering and fix Smarty issues (
3eb0179) -
Show the Custom Attribute label name when deleting (
b1b06e5) -
Update the reservation email templates for various languages (
667ddc3) -
Update the reservation email templates for various languages (
e94ad11) -
admin: Prevent permission loss when DataTables paginates resources (
cec8823) -
auth: Use per-user database language when no language cookie is set (
b2437db) -
blackouts: Require repeat-until in recurrence UI (
8840ec0) -
blackouts: Require termination date for recurring blackouts (
4cda32d) -
calendar: Generate correct reservation detail URLs server-side for guest views (
25e2391) -
calendar: Pass correct groupSeriesByResource boolean instead of privacyFilter object (
5a7d9ee) -
config: Avoid empty buckets when rewriting legacy keys (
e091b3f) -
config: Make config key lookup case-insensitive (
822ccfe) -
config: Preserve existing config values when merging new keys from config.dist.php (
e2006d1) -
config: Reject case-insensitive key collisions (
eeea6f9) -
config: Restore legacy config key mappings (
74db95a) -
config: Rewrite legacy section keys into canonical sections (
64964cb) -
config: Treat empty-string section as unsectioned in GetKey (
7241c59) -
database: Make 2.9+ upgrades idempotent and raise DB minimums (
3f632d4) -
dataTable: Add default page size configuration and update DataTable length menu (
a959247) -
email: Correctly render reservation attributes in created emails (
0d2bce9) -
email: Honor secondary category in reservation email attributes (
42c98d5) -
email: Populate resource custom attribute values when loading reservation from DB (
5a9756e) -
email: Restore submitter language after sending approval notification emails (
e33a6ab) -
en_gb: Show only time in popup (
5999309) -
i18n: Add English fallback for 3 languages missing parent translation calls (
e202d44) -
i18n: Add English fallback for 8 languages missing parent translation calls (
4ee1ab8) -
i18n: Add missing embedded_datetime date format to en_gb locale (
a4e45d6) -
i18n: Replace HTML entities with UTF-8 characters in Italian locale (
a0c0f46) -
js: Add no-unused-vars rule, remove dead code, and fix bugs (
f009211) -
lang/es.php: Spanish translations (
1b91ad3) -
ldap: Install the 'pear/net_ldap2' library by default (
f3d225e) -
ldap: Require 'ext-ldap' (
e55e63a) -
registration: Resolve a server error when more than one attributes in the register page (
71a3f73) -
reports: Prevent chart modal from hanging on render errors (
e81f465) -
reservation: Correct guest reservation URI validation from calendar and schedule view (
9aca6a1) -
reservation: Correct guest reservation URI validation from calendar and schedule view (
1f9a739) -
reservation: Resolve a crash when the email field is not an array (
618a2f4) -
resource-display: Update date input handling in resource display (
fbee303) -
schedule: Avoid recursive buffer item ids (
b139461) -
schedule: Correct tall view rendering for reservations with hidden blocked periods (
7e80933) -
schedule: Use correct StartDate field in reservation sort (
a83246c) -
spanish-translations: Update Spanish terms for consistency and clarity (
698cbec) -
time: Make Time parsing/formatting DST-safe for time-only values (
6bef7db) -
translation: Fix date formats for italian (
44ceb2b) -
UI: Standardized the size of remaining form inputs and buttons to sm across the interface. (
cab32b6) -
validators: Allow empty schedule filter params (
9aca6a1) -
validators: Remove redundant EXISTS from combined route validators (
9aca6a1) -
validators: Remove redundant EXISTS from combined route validators (
47860f1) -
view-reservation: Correctly display the duration of the reservation (
af1e2ce) -
webservice: Respect configured inactivity timeout per session (
3da795d)
Build System
- assets: Vendor Hind font for local frontend usage (
22b283a)
Chores
-
Correct the location of jquery-migrate (
6e828e8) -
Remove bootstrapValidator CSS includes (
7079d8e) -
Remove unused wysihtml5 assets (
ccaf27b) -
Upgrade jQuery UI assets to 1.14.2 ([
4a0818e](https://github.com/LibreBooking/librebooking/...
v4.2.0
v4.2.0 (2026-03-03)
Bug Fixes
-
Add
composer.lockto the repository (febdc12) -
Add null-safety for PHP 8.1+ string function deprecations (
b817269) -
Issue with GetHeader called with non-existing header (
0f387cc) -
Null parameter error in debug mode (
f1719d8) -
Pdf generation for on the reservation page (
4d84247) -
When an unknown error happens use HTTP 500 (
20521ac) -
admin: Correct bulk checkbox handling in blackouts and clean up user script (
a1fa73d) -
admin: Fetch reservation deletion checkboxes when needed instead of from a cache (
0224527) -
admin: Make delete button visible on all user table pages (
e285c95) -
auth: Repair MoodleAdv config access and add regression coverage (
109ac86) -
authentication: Preserve guest sessions during cookie login (
a0b96e4) -
config: Time constraint 'same_day' config not working (
772ad0e) -
db: Give a more helpful error if can't connect to database (
48f5818) -
documentation: Start and end reminders can only be minutes, hours and days (
e8105b0) -
documentation: Update reservation start time constraint documentation (
0d15ca3) -
htaccess: Correct possible redirect loop (
411e787) -
htaccess: Infinite redirect to base URL (
e42cb4a) -
preflight: Resolve phpstan issue with PHP 8.5 (
93fef16) -
shibboleth: Use correct config key names (
937cfb2)
Chores
-
Add some agents files (
8933f86) -
Add the .github/copilot-instructions.md symbolic link (
14541f9) -
Fix malformed test file (
a707a92) -
Have 'php-cs-fixer' be composer installed (
13e26c9) -
Remove dev dependency 'kint' as unused (
c27d335) -
Run php-cs-fixer on the code base (
1c7e576) -
Update flatpickr.min.js version 4.6.13 (
06654c5) -
dependabot: Increase version in composer.json (
94bfb2a) -
dependabot: Run updates each day for composer (
aebf8d8) -
monolog: Change use of deprecated variables (
0d0692e) -
phpstan: Add comments to
phpstan.neon(b053d4c) -
phpstan: Enable level 2 on tests with phpstan-phpunit extension (
b30b1ab) -
phpstan: Enable level 2 without a baseline (excluding tests) (
051f21c) -
stripe: Handle non-existing
invoiceattribute (d54cb07) -
translations: Updates to French translation (
e34fdda)
Code Style
- data-cleanup: Enhance admin interface with responsive card design (
60c0e73)
Continuous Integration
-
Remove duplicate 'setup-php' in GitHub CI (
9540596) -
Run the phpstan and phpcsfixer job on push (
0221450) -
Start testing with PHP 8.5 (
bbdd167) -
dependabot: Initial setup of dependabot (
537620c) -
php-cs-fixer: Enforce php-cs-fixer in CI (
59e8b9b) -
phplint: Parallelize the phplint run (
aa0739a) -
phpstan: Add an initial 'phpstan_next' check (
55b9cb1) -
phpstan: Add caching to speed up the CI (
daf5166) -
phpstan: If phpstan fails, run again with verbose/debug (
bcb3fdc) -
phpstan: Use a matrix for phpstan jobs (
c15bd82) -
refactor: Move phpunit to its own YAML file (
cd5e596)
Documentation
-
Create comprehensive copilot-instructions.md file (
098b48f) -
Repository renamed to 'Librebooking/librebooking' (
b8e7751) -
api: Add note to API web page about slash characters (
032fea7) -
API: Add warning about trailing slash characters (
d5bda61) -
changelog: Add the CHANGELOG to the documentation site (
d083950) -
changelog: Update CHANGELOG.md to use PSR formatting style (
84e8038) -
ci: Use 'doc8' to check ReStructuredText files (
4efd995) -
config: Clarify prevent.participation setting description (
93b2f02) -
config: Correct the
app.debughelp text (96d0ea6) -
cron: Add documentation on how to setup cron jobs (
75d7539) -
logging: Correct LB_LOGGING_* names (
88551cf) -
README: Update the demo site link to have the
/Web/path (e005a61) -
saml: Minor cleanup of SAML docs (
3952a26) -
translation: Add missing Finnish lang strings (
4468d76) -
translation: Add missing Finnish language email templates ([
2b928db](2b928db...
v4.1.0
v4.1.0 (2026-02-05)
Bug Fixes
-
Add command-line usage instructions for CombineDbFilesTask and UpgradeDbTask causing phpstan issue (
bea840d) -
Add default value handling in ConfigurationFile::GetKey method (
0f785cb) -
Add null check in EnsureNull method (
1bda603) -
Api group update will create a new group rather than updating the group (
b939389) -
Availability edit button disappears after editing schedule (
f12d65f) -
Cannot access offset type on ShibbolethConfigKeys (
a853e09) -
Changed wrong auth details response code to 401 (
da4d633) -
Database migration for 4.0 (
0b6c844) -
Display current reservation on tablet view and refine layout (#803,
570b889) -
Edited plugin config example to use nested layout (
1b14b35) -
Error in keycloak/oauth url generation (
eb548ff) -
Error in reservation.start.time.constraint (
98b72b4) -
Exporter page broken after config validation (
f7c6c3d) -
Flatpickr week start day ignored for Starts Today schedules (
a46c31a) -
GetConfigGroup and ConfiKeys in API (
12fc5dc) -
Ignore invalid configs in ManageConfiguration (
711e01e) -
Include conditionally displaying title and description (#941,
46d3069) -
Informational log message changed to more appropriate level (DEBUG instead of ERROR) (
dadca6b) -
Null error on unknown key (
a8363f1) -
Reorder PSR12 rule (
7c3473a) -
Show option key rather than values on config wrong choice (
e35a030) -
Standardize log messages and improve error handling in configuration tests (
0214c6d) -
Trumbowyg fails to load when use.local.js.libs is set to true (
ccaba0b) -
Update environment variable keys and add resource options in config files (
5cbd1a1) -
Update manual database setup documentation (
9c175bf) -
Use BooleanConverter for TABLET_VIEW_ALLOW_RESERVATIONS (
d941886) -
Use ConfigKey instead of hard-coded name (
62a1e9b) -
Use default logging level of 'error' (
0e850d3) -
Use lower-case log_level (
44ca668) -
Wrong section for slack token (
f407878) -
auth: Prevent auto-registration when self-registration is disabled (
9f24a5a) -
auth: Updated plugin configuration keys into nested structures (
1cfe196) -
AutocompleteUser: Handle potential null values (
d90b7ab) -
chore: Resolve many html escape issues (
c8a6396) -
config: Preserve unknown subkeys in original structure for validation and improve error logging for invalid config values (
723f238) -
config: Update configurator to new plugin config (
3fe962b) -
htaccess: Prevent redirect loop for /Web path without trailing slash (
ad8bde2) -
image-upload: Use correct directory for uploading image (
88cb94a) -
ldap: Rename debug configuration key for consistency (
f8efae3) -
ldap: Update default search filter to be optional with improved description (
7c17c7c) -
pdf: Enhance PDF generation error handling and improve table formatting (
b165000) -
pdf: Handle default values for repeat options and reservation details in PDF generation (
fda8a76) -
profile: Resolve loading the profile page when multiple attributes (
e5e423f) -
profile: Resolve saving of unchecked checkbox in the profile (
2672584) -
reservation: Resolve html rendering in announcement emails (
1fad3be) -
reservation: Resolve weekly series checkbox status on load (
d7a62b4) -
Resources: Improve string retrieval logic (
7e27ac5) -
schedule: Correct date display and layout issues (
d684695) -
templates: Replace regex check with empty check in Italian email templates (
1e71f81) -
test: Update configuration key test (
3444e6c) -
tests: Update symbolic link creation and improve PHPUnit error handling (
ae628bc)
Chores
-
Update phpstan-baseline.neon (
200517a) -
git: Enforce LF line endings (
85a929f) -
git: Normalize all line endings to LF (
b211a9a) -
phpstan: Update for 2.1.25 release (
86594c1) -
phpstan: Update phpstan-baseline.neon (
79ac102) -
scripts: Remove jQuery Timepicker plugin files (
1632653) -
templates: Remove unused Timepicker includes (
9d25543)
Code Style
-
Enhance PHP-CS-Fixer rules with Symfony standards (
a42d5f8) -
Redesign API help page with Bootstrap and improved UI (
3f13add) -
vscode: Add initial
.vscode/settings.json(afae984)
Continuous Integration
-
Mark the 'develop' branch as a release branch (
02c4e20) -
Prevent merge-commits in a PR ([
ebe5589](https://github.co...
v4.0.0
Highlights
- New configuration file format. Please read the documentation for more
details. Thanks to @lucs7 for all of their work. - Initial work on getting PHPStan setup and working. We have level 1 working
with no baseline and are currently using level 2 with a baseline. - Add configuration option to be able to choose the resource contact from a
drop-down list of registered users. - Language selector now working on the login page.
- New date selector library used, thanks @labmecanicatec
What's Changed
- style(manage_resources): don't default collapse CustomAttributes by @JohnVillalovos in #682
- fix: EmailMessage.php variable defined after use by @lucs7 in #683
- fix: captchas not working by @lucs7 in #684
- fix(participation): add missing ParticipationNotification import by @JohnVillalovos in #686
- chore: ensure all config variables are in both config files by @JohnVillalovos in #689
- fix(reservation): fix the delete reason not submitted when a reservation is not approved. by @belcirelk in #696
- fix(reservation): pdf generation is not working in French by @belcirelk in #697
- fix(API): stop storing multiple custom attributes of same type for Reources by @JohnVillalovos in #681
- chore: Replace jQuery UI datepicker with flatpickr by @labmecanicatec in #756
- fix(login): Language selector is not working due to httponly cookie by @belcirelk in #763
- fix: allow setting language for non-HTTPS by @JohnVillalovos in #764
- chore: remove exec permission from some files by @JohnVillalovos in #765
- chore: add text to the "More Resource Actions" drop-down by @JohnVillalovos in #766
- refactor: timezone handling and remove jstz library by @labmecanicatec in #769
- feat: optional: resource contact may be chosen via a drop-down list of users by @JohnVillalovos in #770
- Fix for reminders on cancelled reservations by @cgutteridge in #773
- Fix for phpunit tests and additional error check by @lucs7 in #774
- fix: error in WebAuthenticationTest and Facebook login by @lucs7 in #781
New Contributors
- @belcirelk made their first contribution in #696
Full Changelog: v3.0.3...v4.0.0
v3.0.3
Highlights
- Improvements to the Installation guide at https://librebooking.readthedocs.io/en/latest/INSTALLATION.html
What's Changed
- fix(API): add endpoint to get resource types by @JohnVillalovos in #663
- remove old docs by @JohnVillalovos in #665
- fix(schedule): datepicker conflicts with url validation by @lucs7 in #661
- Fix for #671 / Adjusting css to enable datepicker styling by @lucs7 in #673
- doc: remove trailing whitespace from *.rst files by @JohnVillalovos in #674
- fix(CustomAttribute): handle invalid data by @JohnVillalovos in #662
- fix: allow guests to book reservations by @JohnVillalovos in #668
- update(docs): update installation documentation: cloning, composer setup, and database config by @labmecanicatec in #675
- docs: add link to API docs, use notes, update PHP version by @JohnVillalovos in #676
Full Changelog: v3.0.2...v3.0.3
v3.0.2
Highlights
- Now have a documentation/home page website at https://librebooking.readthedocs.io/
What's Changed
- docs: add a
.readthedocs.ymlfile by @JohnVillalovos in #647 - docs: remove 'beta' designation of the
developbranch by @JohnVillalovos in #649 - docs: fix theme options list by @ClemCordier in #650
- Fix date and autogrow issues by @lucs7 in #657
- fix: correct datepicker issue introduced in e0cfcbc by @lucs7 in #658
- fix: don't attempt to reserve view-only resource by @JohnVillalovos in #656
New Contributors
- @ClemCordier made their first contribution in #650
Full Changelog: v3.0.1...v3.0.2
v3.0.1
v3.0.0
Highlights
- Bootstrap 5 Framework and Bootstrap icons now used.
- Modernization of the user interface.
- Integration of libraries such as Datatables and Trumbowyg.
- Migrate external libraries to be pulled in via composer instead of storing the code for those projects in the repository. Also upgraded versions of external libraries used.
- Improvements to the CI system.
- Thanks to @labmecanicatec and @lucs7 for all their work this release.
What's Changed
- dev-bootstrap5 by @labmecanicatec in #406
- Dev bootstrap5 by @labmecanicatec in #409
- Resurrect unit tests by @hakito in #408
- Switch to utf8mb4 by @hakito in #415
- Replace use of deprecated ldap_connect function with supported one by @nrundle in #422
- Mail translations by @hakito in #423
- PICKME Refactor Email system to builder pattern by @hakito in #426
- Revert " PICKME Refactor Email system to builder pattern" by @effgarces in #441
- Dev bootstrap5 by @labmecanicatec in #443
- Mail translations 2nd attempt by @hakito in #450
- Fix checkin/out button on Reservation page by @njm506 in #458
- Improved SAML instructions by @cgutteridge in #456
- fix: add secure and httponly flags to cookies and also add samsite 'l… by @VitorVieira20 in #461
- fix: add uri and params validations in guest-reservation, view-schedu… by @VitorVieira20 in #462
- Update Server.php by @cgutteridge in #465
- Update emailheader.tpl by @cgutteridge in #466
- New Styling plugin by @JohnXLivingston in #467
- Show ical subscription link only for logged in users by @lucs7 in #468
- feature: Allow hiding specific fields in the registration form (#367) by @VitorVieira20 in #469
- Fix Facebook login, smarty upgrade, Fix error on reservation page, when accessory is NULL on max or min. by @lennert1986 in #448
- docs: add information about the Discord channel by @JohnVillalovos in #475
- Dev bootstrap5 by @labmecanicatec in #477
- Added keycloak as external auth provider by @lucs7 in #482
- Updated js for datatables and resource admin view and editor fordescription/notefield by @lucs7 in #478
- Dev bootstrap5 by @labmecanicatec in #486
- Dev bootstrap5 by @labmecanicatec in #489
- chore(CAS): Use '.' instead of '_' for 'cas.logout.servers' by @JohnVillalovos in #519
- ci: add a 'stale' automatic workflow by @JohnVillalovos in #524
- ci(stale): don't require label to mark as stale by @JohnVillalovos in #525
- chore(ci): enable manual triggering of stale workflow by @JohnVillalovos in #526
- chore: setup issue templates by @JohnVillalovos in #527
- chore(issue_template): fix filename of 01-bug_report.md by @JohnVillalovos in #528
- docs: update Discord invite link by @JohnVillalovos in #529
- chore(stale): increase operations-per-run value by @JohnVillalovos in #530
- chore(authentication): support Drupal >= 10.1 hash algorithm by @JohnVillalovos in #531
- Add Oauth2 auth Provider by @larsl-net in #499
- Cleanup documentation and enable linter for the Markdown files. by @JohnVillalovos in #535
- chore: update composer.json and validate it in CI by @JohnVillalovos in #536
- chore: add '[Enhancement]' to Feature Request issue titles by @JohnVillalovos in #539
- fix: database 2.9 schema upgrade was invalid by @JohnVillalovos in #541
- chore: remove usage of deprecated
E_STRICTby @JohnVillalovos in #542 - Cleanup and resolve deprecations in
lib/Common/SmartyPage.phpby @JohnVillalovos in #545 - chore: enable error reporting for
config.devel.phpby @JohnVillalovos in #546 - chore: fix deprecated message in unit tests. by @JohnVillalovos in #550
- chore(tpl/Schedule): add comment headers for development use by @JohnVillalovos in #551
- chore: run Rector 'php81' rule on 'Jobs/' by @JohnVillalovos in #559
- chore: run Rector 'php81' rule on 'phing-tasks/' by @JohnVillalovos in #560
- chore: run Rector 'php81' rule on 'Controls/' by @JohnVillalovos in #561
- chore(.gitignore): ignore everything in
.phpunit.cache/by @JohnVillalovos in #562 - feat: add granular API access based on groups by @JohnVillalovos in #552
- test: default timezone must be 'America/Chicago' for unit tests by @JohnVillalovos in #564
- Revert "test: default timezone must be 'America/Chicago' for unit tests" by @JohnVillalovos in #565
- chore: fix another Smarty deprecation issue by @JohnVillalovos in #566
- chore: update Discord link again. by @JohnVillalovos in #569
- Fix for url validation issue with public schedule/calendar by @lucs7 in #570
- chore: fix deprecation warning by @JohnVillalovos in #571
- keep description and note edit from closing when losing focus by @lucs7 in #572
- chore: add CONTRIBUTING.md file by @JohnVillalovos in #575
- Fix .ics File by @supaeasy in #577
- Minor style improvements, removal of unnecessary code by @labmecanicatec in #579
- Trumbowyg is implemented in announcements by @labmecanicatec in #580
- ci: initial tox setup and environment to run commitizen by @JohnVillalovos in #583
- Composer migrate deps by @labmecanicatec in #585
- chore(resource creation): don't grant access by default by @JohnVillalovos in #554
- Resolve #558: Enable configurable mobile views and auto-scroll by @labmecanicatec in #586
- chore: drop docker-related objects by @colisee in #589
- New Export plugin: by @JohnXLivingston in #582
- fix: unclosed div in tpl\Dashboard\announcements.tpl by @labmecanicatec in #590
- fix(layout): Adjust tooltip and inline element alignment for custom footer by @labmecanicatec in #591
- docs(ldap): Show example ldap hosts with 'ldap://' prefix by @JohnVillalovos in #592
- refactor: fix PHPDoc annotations and register additional classes in SmartyPage by @labmecanicatec in #601
- docs(readme): modernize structure, add demo, checklist features, and badge section by @lucs7 in #602
- fix: register 'ResourcePermissionType' in Smarty by @JohnVillalovos in #603
- chore: remove font-awesome in favor of Bootstrap 5 icons by @JohnVillalovos in #605
- chore: remove unused LESS styles from Web/css/less by @JohnVillalovos in #606
- chore: remove deprecated external login images by @JohnVillalovos in #607
- refactor: replace colorpicker.js with Bootstrap 5 color input by @JohnVillalovos in #608
- chore(css): Move entityChoices styles to librebooking.css by @JohnVillalovos in #609
- refactor: monitor-display.css & monitor-display-schedule.tpl by @JohnVillalovos in #610
- chore: stop loading unused CSS files in preparation for removal by @JohnVillalovos in #611
- feat: Enable searchClear for filterCapacity by @JohnVillalovos in #612
- refactor(schedule.css): Remove @media (max-width: 1000px) by @JohnVillalovos in #613
- chore: remove unused assets from ColorPicker and C...
2.8.6.2 - GA4 Fix
The previous 2.8.6.2 had an issue with the Google Analytics 4 integration, if previously downloaded you can simply replace the globalfooter.tpl file in the tpl folder.
Check the commit history https://github.com/LibreBooking/app/commits/master for all the changes (there are many)
Thanks to everyone that has contributed, your efforts allow this project to keep going.