[{"data":1,"prerenderedAt":483},["ShallowReactive",2],{"$f10hh24w3meqhc":3,"mdc-m5yg74-key":15},{"release":4,"newer":10,"older":12,"page":14},{"tag":5,"name":5,"publishedAt":6,"url":7,"prerelease":8,"markdown":9},"v1.0.19","2026-08-07T03:44:41Z","https:\u002F\u002Fgithub.com\u002Fanhourtec\u002FBookYourPTO-SaaS\u002Freleases\u002Ftag\u002Fv1.0.19",false,"### Probation review tracking, accurate leave carry-over, and a stricter browser security policy\r\n\r\nThis release adds **Probation Milestone Tracking** — a new employee event that sits\r\nalongside birthdays and work anniversaries on the dashboard and calendar, with automated\r\nreminder emails so a probation review never quietly slips past its date. It also lands a\r\nsubstantial correctness pass on leave carry-over, where the balance shown on the calendar\r\nand the balance the booking form enforced could disagree. Rounding it out: leave allowance\r\nbecomes a proper administrator control, the browser-side security policy is now enforced\r\nrather than advisory, and product analytics is added under the existing consent flow.\r\n\r\n### Probation Milestone Tracking\r\n\r\n- **Probation period on every employee** — When creating or editing an employee you can now\r\n  set a probation period of **None**, **3 Months**, or **6 Months**. The Add User form also\r\n  gained a Hire Date field, so a new starter can be set up with their probation in one pass.\r\n\r\n- **The review date calculates itself** — The probation review date is derived from the hire\r\n  date plus the probation period (hired Jan 15 on a 3-month probation → review due Apr 15).\r\n  Both the employee form and the Add User form show a live preview of the resulting date as\r\n  you choose, and month-end dates are handled sensibly — a Nov 30 hire on a 3-month\r\n  probation reviews on Feb 28 (or Feb 29 in a leap year), never spilling into March.\r\n\r\n- **Extend probation when you need to** — Administrators can override the calculated date\r\n  with a custom **Probation Review Date**. When set, it takes precedence everywhere the\r\n  milestone appears and is labelled as extended, so it is obvious the date was moved by\r\n  hand rather than calculated.\r\n\r\n- **On the dashboard and the calendar** — Probation reviews now render as their own employee\r\n  event, using a dedicated icon and colour distinct from birthdays and work anniversaries,\r\n  with a tooltip naming the employee, the probation length, and whether it was extended.\r\n  Managers can spot an upcoming or overdue review at a glance without working the date out\r\n  by hand.\r\n\r\n- **On the employee profile** — The Job tab now shows Hire Date, Probation Period, and the\r\n  calculated (or overridden) Probation Review Date together, giving HR a single reference\r\n  point when reviewing someone's record.\r\n\r\n- **Automated reminder emails** — A reminder now goes out **14 days before**, **7 days\r\n  before**, and **on** the probation review date. Each email carries the employee's name,\r\n  position, department, hire date, probation length, and review date, plus a direct link to\r\n  their profile so the reviewer can start immediately. A matching in-app notification is\r\n  raised at the same time.\r\n\r\n- **Choose who gets reminded** — Reminder recipients are configurable per organization from\r\n  the notification settings: the employee's **direct manager**, their **department head**,\r\n  all **administrators**, all **executives**, or any combination. Reminders can also be\r\n  switched off organization-wide. Manager and department head are resolved per employee, so\r\n  each reminder reaches the people who actually run that person's review.\r\n\r\n- **Reminders follow the employee's calendar** — The countdown to a review is evaluated in\r\n  the employee's own timezone (falling back to the organization's), so a review due \"today\"\r\n  means today where that person works, not where the server happens to run.\r\n\r\n- **Probation status stays confidential** — Unlike a birthday, whether someone is on\r\n  probation is only visible to the employee themselves, their direct manager, their\r\n  department head, and administrators or executives. Other colleagues simply do not see the\r\n  milestone.\r\n\r\n### Leave carry-over accuracy\r\n\r\n- **The calendar and the booking form now agree** — A user with a custom allowance plus a\r\n  manual carry-over adjustment could see one figure on their calendar balance card and be\r\n  told a different, smaller number when they tried to book. Every place that computes a\r\n  leave balance — the balance card, the dashboard people list, the booking check, and the\r\n  leave edit check — now runs through one shared calculation, so the number you are shown is\r\n  the number that is enforced.\r\n\r\n- **Carry-over no longer repeats every year** — A manual carry-over adjustment is now\r\n  anchored to the fiscal year it was granted for. Previously an adjustment had no year of\r\n  its own, so every subsequent fiscal year kept counting it — days granted for one year\r\n  still appeared in the next.\r\n\r\n- **No more double-counted carried days** — The allowance tile on the balance card was adding\r\n  carried days on top of a total that already included them, so someone with 15 base days\r\n  plus 5 carried read \"16 \u002F 25 days\" instead of \"16 \u002F 20\". The tile now shows the\r\n  entitlement before carry-over, so the row reads base + carried − used = remaining.\r\n\r\n- **Bookings check the right year** — A leave request is now balanced against the fiscal year\r\n  the leave actually falls in, rather than the year the request happens to be filed in.\r\n  Booking next January's holiday in December is checked against next year's allowance.\r\n\r\n- **Expired adjustments clear themselves** — Once a carry-over adjustment's expiry date\r\n  passes, the days stop counting toward the balance and the figure is now cleared from the\r\n  profile automatically. Previously it lingered on the record and an administrator had to\r\n  zero it by hand.\r\n\r\n- **A week's warning before days lapse** — A new daily reminder notifies the employee's\r\n  department head — falling back to administrators and executives when they have no manager\r\n  — seven days before a carry-over adjustment expires, in-app and by email, so someone can\r\n  extend the expiry or top the days up before they are lost. Day counting runs in the\r\n  employee's own timezone, and the reminder cannot fire twice for the same adjustment.\r\n\r\n- **Clearer allowance wording** — The Leave Allowance tab now names the fiscal year an\r\n  adjustment applies to and states that the days are cleared automatically afterwards,\r\n  instead of implying they are permanent.\r\n\r\n### Permissions\r\n\r\n- **Leave allowance is an administrator control** — The fields that decide how many paid days\r\n  someone can book — custom allowance, carry-forward settings, and carry-over days — are now\r\n  restricted to administrators and executives organization-wide, and to department heads for\r\n  members of their own department. Nobody can change their own.\r\n\r\n- **Probation is an administrator control** — Probation period and the probation review date\r\n  override are restricted the same way, so the date that drives the reminder emails cannot be\r\n  moved by the person being reviewed.\r\n\r\n### Privacy & Security\r\n\r\n- **Stricter browser security policy, now enforced** — The application's content security\r\n  policy moved from advisory to actively enforced, so the browser blocks anything outside the\r\n  vetted allowlist. Additional cross-origin isolation protections were added at the same\r\n  time, and the server no longer advertises its underlying framework in responses.\r\n\r\n- **Security disclosure contact published** — The application now publishes a standard\r\n  machine-readable security contact so researchers have a clear route to report an issue.\r\n\r\n- **Dependency security updates** — Third-party dependencies flagged by automated security\r\n  scanning were updated to patched releases across the tree, with the full test suite and a\r\n  production build verified on the new versions.\r\n\r\n### Product analytics & consent\r\n\r\n- **Product analytics added under the analytics consent category** — A product-analytics\r\n  tool was added to help us understand how features are actually used. It loads **only**\r\n  after a visitor grants analytics consent, only on our own canonical web domains, and never\r\n  inside the mobile app's web session or on white-label customer domains. Withdrawing\r\n  analytics consent switches it off immediately.\r\n\r\n- **Everyone is asked to consent again** — Because a new vendor joined the analytics\r\n  category, the consent banner reappears once for every visitor, with no pre-ticked toggles\r\n  and nothing loading until a fresh choice is made. The new vendor is disclosed by name in\r\n  the cookie Customize panel and the category description was updated to match.\r\n\r\n### Fixes\r\n\r\n- **Icons render across the app again** — Icons are now bundled with the application rather\r\n  than fetched at runtime, restoring them everywhere under the enforced security policy and\r\n  removing a network round trip on every page.\r\n\r\n- **Document and PDF previews render again** — Document previews, template detail views,\r\n  expense receipt viewing, and the personal data-drive preview all display correctly under\r\n  the enforced policy.\r\n\r\n- **Location maps render again** — The map pane on the document and timesheet location views\r\n  displays again, including for organizations without their own maps key configured.\r\n\r\n### Behind the scenes\r\n\r\n- Probation review dates resolve through a single shared implementation used by the server,\r\n  the dashboard, the calendar, the profile, and the reminder job — so a date shown in the UI\r\n  can never disagree with the date a reminder fires on. Leave carry-over math was\r\n  consolidated the same way, replacing four drifting copies with one.\r\n\r\n- All calendar-day handling in the new code follows the project's date-only convention, with\r\n  regression tests exercising non-UTC organization timezones on both sides of UTC, month-end\r\n  clamping, and leap years.\r\n\r\n- Demo data now includes probation periods, extended reviews, and reminder recipients, so the\r\n  demo environment reflects the new feature.\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fanhourtec\u002FBookYourPTO-SaaS\u002Fcompare\u002Fv1.0.18...v1.0.19",{"tag":11,"name":11},"v1.0.20",{"tag":13,"name":13},"v1.0.18",1,{"data":16,"body":17},{},{"type":18,"children":19},"root",[20,29,43,48,219,225,298,304,327,333,366,372,402,408,441,447,465],{"type":21,"tag":22,"props":23,"children":25},"element","h3",{"id":24},"probation-review-tracking-accurate-leave-carry-over-and-a-stricter-browser-security-policy",[26],{"type":27,"value":28},"text","Probation review tracking, accurate leave carry-over, and a stricter browser security policy",{"type":21,"tag":30,"props":31,"children":32},"p",{},[33,35,41],{"type":27,"value":34},"This release adds ",{"type":21,"tag":36,"props":37,"children":38},"strong",{},[39],{"type":27,"value":40},"Probation Milestone Tracking",{"type":27,"value":42}," — a new employee event that sits\nalongside birthdays and work anniversaries on the dashboard and calendar, with automated\nreminder emails so a probation review never quietly slips past its date. It also lands a\nsubstantial correctness pass on leave carry-over, where the balance shown on the calendar\nand the balance the booking form enforced could disagree. Rounding it out: leave allowance\nbecomes a proper administrator control, the browser-side security policy is now enforced\nrather than advisory, and product analytics is added under the existing consent flow.",{"type":21,"tag":22,"props":44,"children":46},{"id":45},"probation-milestone-tracking",[47],{"type":27,"value":40},{"type":21,"tag":49,"props":50,"children":51},"ul",{},[52,84,94,111,121,131,161,199,209],{"type":21,"tag":53,"props":54,"children":55},"li",{},[56,61,63,68,70,75,77,82],{"type":21,"tag":36,"props":57,"children":58},{},[59],{"type":27,"value":60},"Probation period on every employee",{"type":27,"value":62}," — When creating or editing an employee you can now\nset a probation period of ",{"type":21,"tag":36,"props":64,"children":65},{},[66],{"type":27,"value":67},"None",{"type":27,"value":69},", ",{"type":21,"tag":36,"props":71,"children":72},{},[73],{"type":27,"value":74},"3 Months",{"type":27,"value":76},", or ",{"type":21,"tag":36,"props":78,"children":79},{},[80],{"type":27,"value":81},"6 Months",{"type":27,"value":83},". The Add User form also\ngained a Hire Date field, so a new starter can be set up with their probation in one pass.",{"type":21,"tag":53,"props":85,"children":86},{},[87,92],{"type":21,"tag":36,"props":88,"children":89},{},[90],{"type":27,"value":91},"The review date calculates itself",{"type":27,"value":93}," — The probation review date is derived from the hire\ndate plus the probation period (hired Jan 15 on a 3-month probation → review due Apr 15).\nBoth the employee form and the Add User form show a live preview of the resulting date as\nyou choose, and month-end dates are handled sensibly — a Nov 30 hire on a 3-month\nprobation reviews on Feb 28 (or Feb 29 in a leap year), never spilling into March.",{"type":21,"tag":53,"props":95,"children":96},{},[97,102,104,109],{"type":21,"tag":36,"props":98,"children":99},{},[100],{"type":27,"value":101},"Extend probation when you need to",{"type":27,"value":103}," — Administrators can override the calculated date\nwith a custom ",{"type":21,"tag":36,"props":105,"children":106},{},[107],{"type":27,"value":108},"Probation Review Date",{"type":27,"value":110},". When set, it takes precedence everywhere the\nmilestone appears and is labelled as extended, so it is obvious the date was moved by\nhand rather than calculated.",{"type":21,"tag":53,"props":112,"children":113},{},[114,119],{"type":21,"tag":36,"props":115,"children":116},{},[117],{"type":27,"value":118},"On the dashboard and the calendar",{"type":27,"value":120}," — Probation reviews now render as their own employee\nevent, using a dedicated icon and colour distinct from birthdays and work anniversaries,\nwith a tooltip naming the employee, the probation length, and whether it was extended.\nManagers can spot an upcoming or overdue review at a glance without working the date out\nby hand.",{"type":21,"tag":53,"props":122,"children":123},{},[124,129],{"type":21,"tag":36,"props":125,"children":126},{},[127],{"type":27,"value":128},"On the employee profile",{"type":27,"value":130}," — The Job tab now shows Hire Date, Probation Period, and the\ncalculated (or overridden) Probation Review Date together, giving HR a single reference\npoint when reviewing someone's record.",{"type":21,"tag":53,"props":132,"children":133},{},[134,139,141,146,147,152,154,159],{"type":21,"tag":36,"props":135,"children":136},{},[137],{"type":27,"value":138},"Automated reminder emails",{"type":27,"value":140}," — A reminder now goes out ",{"type":21,"tag":36,"props":142,"children":143},{},[144],{"type":27,"value":145},"14 days before",{"type":27,"value":69},{"type":21,"tag":36,"props":148,"children":149},{},[150],{"type":27,"value":151},"7 days\nbefore",{"type":27,"value":153},", and ",{"type":21,"tag":36,"props":155,"children":156},{},[157],{"type":27,"value":158},"on",{"type":27,"value":160}," the probation review date. Each email carries the employee's name,\nposition, department, hire date, probation length, and review date, plus a direct link to\ntheir profile so the reviewer can start immediately. A matching in-app notification is\nraised at the same time.",{"type":21,"tag":53,"props":162,"children":163},{},[164,169,171,176,178,183,185,190,192,197],{"type":21,"tag":36,"props":165,"children":166},{},[167],{"type":27,"value":168},"Choose who gets reminded",{"type":27,"value":170}," — Reminder recipients are configurable per organization from\nthe notification settings: the employee's ",{"type":21,"tag":36,"props":172,"children":173},{},[174],{"type":27,"value":175},"direct manager",{"type":27,"value":177},", their ",{"type":21,"tag":36,"props":179,"children":180},{},[181],{"type":27,"value":182},"department head",{"type":27,"value":184},",\nall ",{"type":21,"tag":36,"props":186,"children":187},{},[188],{"type":27,"value":189},"administrators",{"type":27,"value":191},", all ",{"type":21,"tag":36,"props":193,"children":194},{},[195],{"type":27,"value":196},"executives",{"type":27,"value":198},", or any combination. Reminders can also be\nswitched off organization-wide. Manager and department head are resolved per employee, so\neach reminder reaches the people who actually run that person's review.",{"type":21,"tag":53,"props":200,"children":201},{},[202,207],{"type":21,"tag":36,"props":203,"children":204},{},[205],{"type":27,"value":206},"Reminders follow the employee's calendar",{"type":27,"value":208}," — The countdown to a review is evaluated in\nthe employee's own timezone (falling back to the organization's), so a review due \"today\"\nmeans today where that person works, not where the server happens to run.",{"type":21,"tag":53,"props":210,"children":211},{},[212,217],{"type":21,"tag":36,"props":213,"children":214},{},[215],{"type":27,"value":216},"Probation status stays confidential",{"type":27,"value":218}," — Unlike a birthday, whether someone is on\nprobation is only visible to the employee themselves, their direct manager, their\ndepartment head, and administrators or executives. Other colleagues simply do not see the\nmilestone.",{"type":21,"tag":22,"props":220,"children":222},{"id":221},"leave-carry-over-accuracy",[223],{"type":27,"value":224},"Leave carry-over accuracy",{"type":21,"tag":49,"props":226,"children":227},{},[228,238,248,258,268,278,288],{"type":21,"tag":53,"props":229,"children":230},{},[231,236],{"type":21,"tag":36,"props":232,"children":233},{},[234],{"type":27,"value":235},"The calendar and the booking form now agree",{"type":27,"value":237}," — A user with a custom allowance plus a\nmanual carry-over adjustment could see one figure on their calendar balance card and be\ntold a different, smaller number when they tried to book. Every place that computes a\nleave balance — the balance card, the dashboard people list, the booking check, and the\nleave edit check — now runs through one shared calculation, so the number you are shown is\nthe number that is enforced.",{"type":21,"tag":53,"props":239,"children":240},{},[241,246],{"type":21,"tag":36,"props":242,"children":243},{},[244],{"type":27,"value":245},"Carry-over no longer repeats every year",{"type":27,"value":247}," — A manual carry-over adjustment is now\nanchored to the fiscal year it was granted for. Previously an adjustment had no year of\nits own, so every subsequent fiscal year kept counting it — days granted for one year\nstill appeared in the next.",{"type":21,"tag":53,"props":249,"children":250},{},[251,256],{"type":21,"tag":36,"props":252,"children":253},{},[254],{"type":27,"value":255},"No more double-counted carried days",{"type":27,"value":257}," — The allowance tile on the balance card was adding\ncarried days on top of a total that already included them, so someone with 15 base days\nplus 5 carried read \"16 \u002F 25 days\" instead of \"16 \u002F 20\". The tile now shows the\nentitlement before carry-over, so the row reads base + carried − used = remaining.",{"type":21,"tag":53,"props":259,"children":260},{},[261,266],{"type":21,"tag":36,"props":262,"children":263},{},[264],{"type":27,"value":265},"Bookings check the right year",{"type":27,"value":267}," — A leave request is now balanced against the fiscal year\nthe leave actually falls in, rather than the year the request happens to be filed in.\nBooking next January's holiday in December is checked against next year's allowance.",{"type":21,"tag":53,"props":269,"children":270},{},[271,276],{"type":21,"tag":36,"props":272,"children":273},{},[274],{"type":27,"value":275},"Expired adjustments clear themselves",{"type":27,"value":277}," — Once a carry-over adjustment's expiry date\npasses, the days stop counting toward the balance and the figure is now cleared from the\nprofile automatically. Previously it lingered on the record and an administrator had to\nzero it by hand.",{"type":21,"tag":53,"props":279,"children":280},{},[281,286],{"type":21,"tag":36,"props":282,"children":283},{},[284],{"type":27,"value":285},"A week's warning before days lapse",{"type":27,"value":287}," — A new daily reminder notifies the employee's\ndepartment head — falling back to administrators and executives when they have no manager\n— seven days before a carry-over adjustment expires, in-app and by email, so someone can\nextend the expiry or top the days up before they are lost. Day counting runs in the\nemployee's own timezone, and the reminder cannot fire twice for the same adjustment.",{"type":21,"tag":53,"props":289,"children":290},{},[291,296],{"type":21,"tag":36,"props":292,"children":293},{},[294],{"type":27,"value":295},"Clearer allowance wording",{"type":27,"value":297}," — The Leave Allowance tab now names the fiscal year an\nadjustment applies to and states that the days are cleared automatically afterwards,\ninstead of implying they are permanent.",{"type":21,"tag":22,"props":299,"children":301},{"id":300},"permissions",[302],{"type":27,"value":303},"Permissions",{"type":21,"tag":49,"props":305,"children":306},{},[307,317],{"type":21,"tag":53,"props":308,"children":309},{},[310,315],{"type":21,"tag":36,"props":311,"children":312},{},[313],{"type":27,"value":314},"Leave allowance is an administrator control",{"type":27,"value":316}," — The fields that decide how many paid days\nsomeone can book — custom allowance, carry-forward settings, and carry-over days — are now\nrestricted to administrators and executives organization-wide, and to department heads for\nmembers of their own department. Nobody can change their own.",{"type":21,"tag":53,"props":318,"children":319},{},[320,325],{"type":21,"tag":36,"props":321,"children":322},{},[323],{"type":27,"value":324},"Probation is an administrator control",{"type":27,"value":326}," — Probation period and the probation review date\noverride are restricted the same way, so the date that drives the reminder emails cannot be\nmoved by the person being reviewed.",{"type":21,"tag":22,"props":328,"children":330},{"id":329},"privacy-security",[331],{"type":27,"value":332},"Privacy & Security",{"type":21,"tag":49,"props":334,"children":335},{},[336,346,356],{"type":21,"tag":53,"props":337,"children":338},{},[339,344],{"type":21,"tag":36,"props":340,"children":341},{},[342],{"type":27,"value":343},"Stricter browser security policy, now enforced",{"type":27,"value":345}," — The application's content security\npolicy moved from advisory to actively enforced, so the browser blocks anything outside the\nvetted allowlist. Additional cross-origin isolation protections were added at the same\ntime, and the server no longer advertises its underlying framework in responses.",{"type":21,"tag":53,"props":347,"children":348},{},[349,354],{"type":21,"tag":36,"props":350,"children":351},{},[352],{"type":27,"value":353},"Security disclosure contact published",{"type":27,"value":355}," — The application now publishes a standard\nmachine-readable security contact so researchers have a clear route to report an issue.",{"type":21,"tag":53,"props":357,"children":358},{},[359,364],{"type":21,"tag":36,"props":360,"children":361},{},[362],{"type":27,"value":363},"Dependency security updates",{"type":27,"value":365}," — Third-party dependencies flagged by automated security\nscanning were updated to patched releases across the tree, with the full test suite and a\nproduction build verified on the new versions.",{"type":21,"tag":22,"props":367,"children":369},{"id":368},"product-analytics-consent",[370],{"type":27,"value":371},"Product analytics & consent",{"type":21,"tag":49,"props":373,"children":374},{},[375,392],{"type":21,"tag":53,"props":376,"children":377},{},[378,383,385,390],{"type":21,"tag":36,"props":379,"children":380},{},[381],{"type":27,"value":382},"Product analytics added under the analytics consent category",{"type":27,"value":384}," — A product-analytics\ntool was added to help us understand how features are actually used. It loads ",{"type":21,"tag":36,"props":386,"children":387},{},[388],{"type":27,"value":389},"only",{"type":27,"value":391},"\nafter a visitor grants analytics consent, only on our own canonical web domains, and never\ninside the mobile app's web session or on white-label customer domains. Withdrawing\nanalytics consent switches it off immediately.",{"type":21,"tag":53,"props":393,"children":394},{},[395,400],{"type":21,"tag":36,"props":396,"children":397},{},[398],{"type":27,"value":399},"Everyone is asked to consent again",{"type":27,"value":401}," — Because a new vendor joined the analytics\ncategory, the consent banner reappears once for every visitor, with no pre-ticked toggles\nand nothing loading until a fresh choice is made. The new vendor is disclosed by name in\nthe cookie Customize panel and the category description was updated to match.",{"type":21,"tag":22,"props":403,"children":405},{"id":404},"fixes",[406],{"type":27,"value":407},"Fixes",{"type":21,"tag":49,"props":409,"children":410},{},[411,421,431],{"type":21,"tag":53,"props":412,"children":413},{},[414,419],{"type":21,"tag":36,"props":415,"children":416},{},[417],{"type":27,"value":418},"Icons render across the app again",{"type":27,"value":420}," — Icons are now bundled with the application rather\nthan fetched at runtime, restoring them everywhere under the enforced security policy and\nremoving a network round trip on every page.",{"type":21,"tag":53,"props":422,"children":423},{},[424,429],{"type":21,"tag":36,"props":425,"children":426},{},[427],{"type":27,"value":428},"Document and PDF previews render again",{"type":27,"value":430}," — Document previews, template detail views,\nexpense receipt viewing, and the personal data-drive preview all display correctly under\nthe enforced policy.",{"type":21,"tag":53,"props":432,"children":433},{},[434,439],{"type":21,"tag":36,"props":435,"children":436},{},[437],{"type":27,"value":438},"Location maps render again",{"type":27,"value":440}," — The map pane on the document and timesheet location views\ndisplays again, including for organizations without their own maps key configured.",{"type":21,"tag":22,"props":442,"children":444},{"id":443},"behind-the-scenes",[445],{"type":27,"value":446},"Behind the scenes",{"type":21,"tag":49,"props":448,"children":449},{},[450,455,460],{"type":21,"tag":53,"props":451,"children":452},{},[453],{"type":27,"value":454},"Probation review dates resolve through a single shared implementation used by the server,\nthe dashboard, the calendar, the profile, and the reminder job — so a date shown in the UI\ncan never disagree with the date a reminder fires on. Leave carry-over math was\nconsolidated the same way, replacing four drifting copies with one.",{"type":21,"tag":53,"props":456,"children":457},{},[458],{"type":27,"value":459},"All calendar-day handling in the new code follows the project's date-only convention, with\nregression tests exercising non-UTC organization timezones on both sides of UTC, month-end\nclamping, and leap years.",{"type":21,"tag":53,"props":461,"children":462},{},[463],{"type":27,"value":464},"Demo data now includes probation periods, extended reviews, and reminder recipients, so the\ndemo environment reflects the new feature.",{"type":21,"tag":30,"props":466,"children":467},{},[468,473,475],{"type":21,"tag":36,"props":469,"children":470},{},[471],{"type":27,"value":472},"Full Changelog",{"type":27,"value":474},": ",{"type":21,"tag":476,"props":477,"children":481},"a",{"href":478,"rel":479},"https:\u002F\u002Fgithub.com\u002Fanhourtec\u002FBookYourPTO-SaaS\u002Fcompare\u002Fv1.0.18...v1.0.19",[480],"nofollow",[482],{"type":27,"value":478},1790889963334]