[{"data":1,"prerenderedAt":1398},["ShallowReactive",2],{"announcements":3,"blog-/blog/v1-0-11-documents-redesign":28,"blog-related-/blog/v1-0-11-documents-redesign":466},[4],{"id":5,"title":6,"active":7,"body":8,"description":14,"extension":19,"link":20,"linkText":21,"meta":22,"navigation":7,"order":23,"path":24,"seo":25,"stem":26,"__hash__":27},"announcements/announcements/v1-0-12-onboarding-documents.md","v1.0.12 · Onboarding documents — multi-dept templates, per-employee copies, read-and-acknowledge that auto-completes the task",true,{"type":9,"value":10,"toc":15},"minimark",[11],[12,13,14],"p",{},"v1.0.12 finishes the onboarding/offboarding document loop. Templates now scope to multiple departments at once, every new hire gets their own per-employee copy of every onboarding doc (with their own audit trail and signing certificate), read-only docs like the employee handbook auto-complete their task the moment they're read, and an amber \"Action Required\" badge on the global sidebar surfaces what each person still owes — including offboarding reads like return-of-equipment and exit-policy acknowledgments.",{"title":16,"searchDepth":17,"depth":17,"links":18},"",2,[],"md","/whats-new/v1-0-12","See what's new",{},9,"/announcements/v1-0-12-onboarding-documents",{"title":6,"description":14},"announcements/v1-0-12-onboarding-documents","it-SxDxdUfRvp_GeATEk_rS0w9Xm_xx6J6Da8uwfOBQ",{"id":29,"title":30,"author":31,"body":32,"date":452,"description":453,"extension":19,"image":454,"meta":455,"navigation":7,"path":456,"readTime":457,"seo":458,"stem":459,"tags":460,"__hash__":465},"blog/blog/v1-0-11-documents-redesign.md","v1.0.11: The Documents Redesign — Your HR Filing Cabinet, Reimagined","AnHourTec Team",{"type":9,"value":33,"toc":439},[34,39,47,58,61,67,71,82,85,88,92,95,138,141,144,147,151,154,161,196,199,203,213,238,241,245,248,262,265,269,272,275,278,282,289,292,318,321,325,332,350,361,364,368,371,420,423,427,430,436],[35,36,38],"h2",{"id":37},"the-problem-with-upload","The Problem With \"Upload\"",[12,40,41,42,46],{},"Here is the old workflow. You open ",[43,44,45],"code",{},"/documents",", hit Upload, drag in Maria's signed offer letter, pick her name from a dropdown, and click save. A week later you need to find that letter — along with her contract from last year and the visa renewal you uploaded in March.",[12,48,49,50,53,54,57],{},"You know it is in there. You uploaded it. But \"in there\" means scrolling a flat list, filtering by name, hoping you remember whether you tagged it ",[43,51,52],{},"offer"," or ",[43,55,56],{},"offer-letter",", and squinting at thumbnails.",[12,59,60],{},"That friction is the entire reason we rebuilt Documents. v1.0.11 replaces the generic upload pile with a real filing cabinet — the same mental model HR teams have used on physical drawers for fifty years, ported into the product without losing any of the digital advantages.",[12,62,63,64,66],{},"This post is a walkthrough. Open ",[43,65,45],{}," in another tab and follow along.",[35,68,70],{"id":69},"the-filing-cabinet-lands-first","The Filing Cabinet Lands First",[12,72,73,74,76,77,81],{},"When you open ",[43,75,45],{},", you no longer arrive at an upload screen. You arrive at ",[78,79,80],"strong",{},"My Documents"," — a 2-3 column responsive grid of folder tiles. The cabinet is the page. There is no routing through a generic entry, no pile to sort through later. Every folder you might drop a document into is already in front of you.",[12,83,84],{},"Each tile shows a folder icon, a name, a document count, and a color band. Click one and you're inside that folder, looking at its contents. Click outside it and you're back at the cabinet. That's the entire navigation model.",[12,86,87],{},"The point of putting the cabinet first is simple: the moment you arrive with a document in hand, you're already looking at the place it belongs. You don't pick a destination from a dropdown — you pick a drawer.",[35,89,91],{"id":90},"thirteen-built-in-categories","Thirteen Built-In Categories",[12,93,94],{},"Every cabinet ships with thirteen built-in folders, pre-created and always visible — even when empty. They are:",[96,97,98,102,105,108,111,114,117,120,123,126,129,132,135],"ol",{},[99,100,101],"li",{},"Contracts",[99,103,104],{},"Offer Letters",[99,106,107],{},"Salary Increments",[99,109,110],{},"Performance Reviews",[99,112,113],{},"Policy Documents",[99,115,116],{},"ID Documents",[99,118,119],{},"Certificates",[99,121,122],{},"Training Materials",[99,124,125],{},"Medical Certificates",[99,127,128],{},"Visa Documents",[99,130,131],{},"Tax Documents",[99,133,134],{},"Insurance",[99,136,137],{},"Other",[12,139,140],{},"These are not suggestions. They render on day one of every account, and they keep rendering even when they hold zero documents. That choice is deliberate.",[12,142,143],{},"The alternative — folders that appear only after they have something in them — is the pattern most file managers use, and it sabotages the whole metaphor. If the Visa Documents folder doesn't exist until you put a visa document in it, you're back to choosing a category from a hidden list every time you upload. By keeping all thirteen visible at all times, the answer to \"where does this go?\" is always one click away. You drop the document straight into the right drawer.",[12,145,146],{},"Most teams will use ten of the thirteen heavily and the others occasionally. That's fine — the empty ones cost nothing to leave in place.",[35,148,150],{"id":149},"custom-folders-on-your-terms","Custom Folders, On Your Terms",[12,152,153],{},"Built-ins cover the common cases. Custom folders cover everything else.",[12,155,156,157,160],{},"Each user can create their own folders, scoped to their account. They sit ",[78,158,159],{},"above"," the built-ins in the cabinet so your bespoke organization shows first. The rules:",[162,163,164,170,184,190],"ul",{},[99,165,166,169],{},[78,167,168],{},"Names are capped at 50 characters."," Long enough for \"Q4 2026 Contractor Statements of Work\" if you really want it, short enough that the tile stays readable.",[99,171,172,175,176,179,180,183],{},[78,173,174],{},"Pick an icon from a curated Lucide set."," A folder for legal might take a ",[43,177,178],{},"gavel","; a folder for travel docs might take a ",[43,181,182],{},"plane",". The icon set is curated, not the full Lucide library — we pruned to the icons that actually read at folder-tile size.",[99,185,186,189],{},[78,187,188],{},"Pick a hex color."," Each folder carries a color band so the cabinet stays visually distinct at a glance.",[99,191,192,195],{},[78,193,194],{},"Soft-delete frees the name immediately."," Delete a folder called \"Old Vendors\" and the name slot is released the same instant — you can create a new \"Old Vendors\" right after if you want. The deleted folder still exists for recovery, but it no longer holds the namespace.",[12,197,198],{},"That last rule matters more than it sounds. The annoying version of soft-delete is when the deleted record keeps reserving the name and you have to call it \"Old Vendors 2\" on the second pass. We don't do that.",[35,200,202],{"id":201},"tag-filtering-behaves-two-ways","Tag Filtering Behaves Two Ways",[12,204,205,206,53,209,212],{},"Tags exist alongside folders. A document can live in Contracts and also be tagged ",[43,207,208],{},"q4-2026",[43,210,211],{},"priority-review",". The redesign wires tag filtering into both layers of the cabinet:",[162,214,215,229],{},[99,216,217,220,221,224,225,228],{},[78,218,219],{},"At the cabinet level",", selecting a tag drops you into a ",[78,222,223],{},"flat cross-folder result list"," — every document with that tag, regardless of which folder it's in. Useful when the tag is the actual axis you care about (\"show me everything tagged ",[43,226,227],{},"expiring-soon",", I don't care which folder it lives in\").",[99,230,231,234,235,237],{},[78,232,233],{},"Inside an open folder",", the tag scopes within that folder. Select ",[43,236,208],{}," while you're inside Contracts, and you see only Q4 contracts. The folder boundary is respected.",[12,239,240],{},"Same UI, two contextual behaviors. The first lets tags act as cross-cutting saved searches; the second lets them refine within a known location. Either is one click.",[35,242,244],{"id":243},"two-upload-modes-store-vs-sign","Two Upload Modes: Store vs Sign",[12,246,247],{},"Every upload now asks the same question up front: are you stashing this document, or are you routing it for signatures?",[162,249,250,256],{},[99,251,252,255],{},[78,253,254],{},"Store"," — drop the file into a folder and you're done. Use this for records that are already signed elsewhere, reference documents, certificates, IDs, anything where the goal is \"keep a copy I can find later.\"",[99,257,258,261],{},[78,259,260],{},"Sign"," — route the document through the signature flow. Drag-drop signature, date, and text fields onto the page. Set sequential signing if the document needs Manager → Director → Executive in that order. Each signature event lands in the audit trail with timestamp and signer identity. Use this for offer letters, NDAs, policy acknowledgments, anything that doesn't count as filed until it's signed.",[12,263,264],{},"The split matters because the two paths have different completion criteria. A stored doc is done the moment it's uploaded. A signed doc is in flight until every signer has finished. Treating them as the same flow forced compromises in both directions; separating them at the upload modal lets each path do its job.",[35,266,268],{"id":267},"the-document-detail-page-quieter","The Document Detail Page, Quieter",[12,270,271],{},"Open any document and you land on the redesigned detail page. The change is in the proportions.",[12,273,274],{},"The preview pane is large — most of the screen — and the metadata sidebar is quieter: name, folder, tags, uploaded by, uploaded at, expiry if applicable, signature status if applicable. Less chrome around the edges, more document in the middle. When you click into a contract, you should be reading the contract, not navigating around it.",[12,276,277],{},"Actions (rename, move, delete, request signature, export) collapse into a single action menu rather than a row of always-on buttons. The fewer pixels the UI takes, the more pixels the document gets.",[35,279,281],{"id":280},"expiry-reminders-60-30-7-today","Expiry Reminders: 60, 30, 7, Today",[12,283,284,285,288],{},"Documents with expiry dates — visas, certificates, insurance, anything that lapses — drive reminders on a fixed cadence: ",[78,286,287],{},"60 days, 30 days, 7 days, and the day of expiry",". The new ExpiryRail experience surfaces this in the UI, but the reminder fan-out is what matters operationally.",[12,290,291],{},"Each reminder loops in:",[162,293,294,301,307,313],{},[99,295,296,297,300],{},"The ",[78,298,299],{},"document owner"," (whoever uploaded or is assigned to it)",[99,302,296,303,306],{},[78,304,305],{},"department head"," of the affected employee's department",[99,308,309,310],{},"All ",[78,311,312],{},"executives",[99,314,309,315],{},[78,316,317],{},"administrators",[12,319,320],{},"Four notifications per cadence, four cadences per document. The intent is that a passport renewal three weeks out should never be a surprise to anyone who could act on it. Loop everyone with standing to follow up; let the first person to handle it close the loop.",[35,322,324],{"id":323},"action-required-one-tray-scoped-by-role","Action Required: One Tray, Scoped By Role",[12,326,327,328,331],{},"Documents that need a human's attention used to scatter across the app — a sign request here, an expiring cert there, an overdue acknowledgment in a third place. The redesign consolidates them into a single ",[78,329,330],{},"Action Required"," tray.",[12,333,334,335,337,338,341,342,345,346,349],{},"The tray is unified across three categories — ",[78,336,260],{},", ",[78,339,340],{},"Expiring",", and ",[78,343,344],{},"Overdue"," — and ",[78,347,348],{},"scoped per role",":",[162,351,352,355,358],{},[99,353,354],{},"An employee sees their own pending signatures, their own expiring documents, and their own overdue acknowledgments.",[99,356,357],{},"A department head sees those, plus the same for their department.",[99,359,360],{},"Executives and administrators see the org-wide view.",[12,362,363],{},"One tray, one mental check at the start of the day: is anything red? If yes, click in. If no, get on with the rest of your work.",[35,365,367],{"id":366},"quietly-hardened","Quietly Hardened",[12,369,370],{},"Everything above is the user-facing redesign. Underneath, v1.0.11 is also a security release — none of which you should have to think about, but all of which is worth knowing exists.",[162,372,373,379,385,391,397,403],{},[99,374,375,378],{},[78,376,377],{},"AES-256-GCM at rest"," is preserved on every new write path. Every new upload code path — store mode, sign mode, /assign, /bulk-send — encrypts at rest with the same envelope as the existing pipeline. There are no plaintext shortcuts in the new flows.",[99,380,381,384],{},[78,382,383],{},"Multi-tenancy enforced on every new endpoint."," Every new route validates organization scope before it touches data. No cross-tenant leakage is possible from the new endpoints.",[99,386,387,390],{},[78,388,389],{},"Role-based access matrix unified"," across list, fetch, upload, bulk-send, and templates. Previously each verb had its own slightly different permission check; now there is one matrix and every verb consults it.",[99,392,393,396],{},[78,394,395],{},"Quota gates added to /assign and /bulk-send."," Plan limits are now checked before fan-out, not after, so a bulk-send that would exceed your plan is rejected up front rather than partially completing.",[99,398,399,402],{},[78,400,401],{},"Calendar privacy enforced at every layer"," — route guard, leaves API, leave-balance API, dashboard, and per-user calendar. The privacy setting is consulted in five places, not one, so a setting change can never be bypassed by hitting a different endpoint.",[99,404,405,411,412,415,416,419],{},[78,406,407,410],{},[43,408,409],{},"npm audit"," reports zero vulnerabilities."," The transitive ",[43,413,414],{},"postcss"," and ",[43,417,418],{},"@tootallnate/once"," advisories are resolved (both bumped); the dependency tree is clean.",[12,421,422],{},"None of this changes a workflow. All of it raises the floor.",[35,424,426],{"id":425},"open-your-cabinet","Open Your Cabinet",[12,428,429],{},"The redesign is live for every cloud customer. There is no migration step on your side — your existing documents are already filed into the right built-in folders, your tags carry over, and any sign requests in flight continue to work.",[12,431,432,433,435],{},"Head to ",[78,434,45],{}," and look at your cabinet. Drop a new file into the folder it belongs in. See if you can find Maria's offer letter in under five seconds.",[12,437,438],{},"If something feels off or you want a category we didn't include, send us a note. We read every ticket, and the next iteration of Documents starts with what you tell us this one missed.",{"title":16,"searchDepth":17,"depth":17,"links":440},[441,442,443,444,445,446,447,448,449,450,451],{"id":37,"depth":17,"text":38},{"id":69,"depth":17,"text":70},{"id":90,"depth":17,"text":91},{"id":149,"depth":17,"text":150},{"id":201,"depth":17,"text":202},{"id":243,"depth":17,"text":244},{"id":267,"depth":17,"text":268},{"id":280,"depth":17,"text":281},{"id":323,"depth":17,"text":324},{"id":366,"depth":17,"text":367},{"id":425,"depth":17,"text":426},"2026-04-29","Documents now opens on a filing cabinet of folder tiles — one drawer per employee, thirteen built-in categories, custom folders with Lucide icons, expiry reminders, and a unified Action Required tray.","https://images.unsplash.com/photo-1568667256549-094345857637?w=1200&h=630&fit=crop",{},"/blog/v1-0-11-documents-redesign","8 min read",{"title":30,"description":453},"blog/v1-0-11-documents-redesign",[461,462,463,464],"release notes","documents","e-signatures","hr","bWwSmph0eA64LGr4twMtW29EB0v7wC_IsMfR-W5IV8U",[467,948,1186],{"id":468,"title":469,"author":31,"body":470,"date":934,"description":935,"extension":19,"image":936,"meta":937,"navigation":7,"path":938,"readTime":939,"seo":940,"stem":941,"tags":942,"__hash__":947},"blog/blog/v1-0-10-launch.md","What's New in v1.0.10: Team Matrix, Pay-Period Lockdown, Project Budgets, and a Faster App",{"type":9,"value":471,"toc":911},[472,476,483,499,502,506,509,561,570,574,579,582,586,589,593,596,600,603,607,610,614,617,621,624,628,637,650,653,657,662,689,693,712,715,719,722,746,764,768,782,786,795,799,802,805,809,812,889,892,896,908],[35,473,475],{"id":474},"v1010-is-our-biggest-release-since-launch","v1.0.10 Is Our Biggest Release Since Launch",[12,477,478,479,482],{},"This release touches almost every corner of the product. Time tracking grew up: pay-period lockdown, configurable rounding, free-form tags, money budgets on projects, bulk edit, and cost aggregation on reports. Schedules and timesheets got a brand-new ",[78,480,481],{},"Team Matrix view"," — the enterprise \"employee × day\" grid that every serious workforce tool eventually builds. Approvals and Reports were redesigned from the ground up. Data export is now a first-class, unified experience (Excel, PDF, CSV — one dropdown, everywhere). Settings got a global search bar so you can jump to any individual toggle instead of clicking through categories.",[12,484,485,486,337,489,337,492,341,495,498],{},"And we did a full-stack performance pass. Page loads on ",[43,487,488],{},"/reports",[43,490,491],{},"/approvals",[43,493,494],{},"/dashboard",[43,496,497],{},"/schedules"," are meaningfully faster — in some cases seventy requests on page load became ten, and double-digit-second waits became sub-two-second waits. Nothing changed for you to configure; it just works better.",[12,500,501],{},"Here's the tour.",[35,503,505],{"id":504},"team-matrix-view-for-schedules-and-timesheets","Team Matrix View for Schedules and Timesheets",[12,507,508],{},"The calendar view overlays every visible employee's shifts or time entries onto one week × 24-hour grid. It works fine for small teams. Past 20–30 people it becomes unreadable — impossible to spot who's missing entries, who's scheduled for overtime, or what still needs approval. Every enterprise workforce tool (Workday, UKG, ADP, SAP SuccessFactors, Ceridian Dayforce) solves this the same way: one row per employee, one column per day. We built that.",[162,510,511,517,523,533,539,545,551],{},[99,512,513,516],{},[78,514,515],{},"Employee × day matrix."," Each visible employee is a row; the seven days of the current week are columns. Each cell shows the aggregate (hours + status dots for timesheets; shift time + type for schedules). A Week total column on the right gives per-employee totals at a glance. The employee column and header row are sticky, so scrolling horizontally keeps the name and date context in view.",[99,518,519,522],{},[78,520,521],{},"Click-to-drill."," Click any cell with one entry or shift to open it in the edit modal. Click a cell with multiple entries to expand the row inline, grouped per day. Click an empty cell to open an Add Entry / Add Shift modal pre-seeded to that employee and date.",[99,524,525,528,529,532],{},[78,526,527],{},"Drag-resizable columns with persistence."," Every column has a drag handle; widths clamp between 60 and 600 pixels and persist per-browser in ",[43,530,531],{},"localStorage",". Double-click a handle to reset that column; a toolbar button clears every custom width at once.",[99,534,535,538],{},[78,536,537],{},"Density toggle."," Compact / Normal / Spacious, remembered across sessions. Compact fits a 30-person team on a single screen; Spacious is better for presenting or reviewing one team closely.",[99,540,541,544],{},[78,542,543],{},"Sort and filter."," Sort by name, week hours, pending count, or missing days. Filter chips toggle between All / Missing / Pending / Approved / Rejected (timesheets) or All / Unscheduled / Scheduled / 40h+ (schedules), each with a live count.",[99,546,547,550],{},[78,548,549],{},"Holiday and leave aware."," Holiday cells are tinted green with the holiday name. Cells where the employee is on leave show the leave type instead of a blank, so \"no shift scheduled\" is visibly distinct from \"scheduled off\". Unassigned open shifts render with a muted \"Open Shift\" label.",[99,552,553,556,557,560],{},[78,554,555],{},"Calendar and List views still available."," The top bar toggle is now three buttons: Team (default) / Calendar / List. The ",[43,558,559],{},"?view="," URL parameter accepts all three, so existing deep links keep working.",[12,562,563,564,415,566,569],{},"The Team view is now the default for both ",[43,565,497],{},[43,567,568],{},"/time-tracking/timesheets",".",[35,571,573],{"id":572},"time-tracking-grew-up","Time Tracking Grew Up",[575,576,578],"h3",{"id":577},"pay-period-lockdown","Pay-Period Lockdown",[12,580,581],{},"Admins can set a lockdown date after which time entries with a clock-in before that date can no longer be edited or deleted by employees. A configurable grace window (in days) lets managers close out late-submitted hours after the lock date. Only Administrators and Executives can override the lock for corrections; every override is written to the audit log with the entry's date and the lockdown cutoff, so compliance always has a reviewable trail.",[575,583,585],{"id":584},"configurable-clock-rounding","Configurable Clock Rounding",[12,587,588],{},"A new setting snaps clock-in/out to a configured interval (1–60 minutes) with UP / DOWN / NEAREST direction. Applied uniformly to live clock-in/out, manual entry, and edits so billable hours line up with the org's rounding policy regardless of how precisely the user clicks.",[575,590,592],{"id":591},"free-form-tags-on-time-entries","Free-Form Tags on Time Entries",[12,594,595],{},"Each entry can carry up to 10 tags (32 characters each) for categorisation and filtering. Tags appear in the entry modal as a comma-separated input — paste anything and the system normalises (lowercase, strips punctuation, dedupes). Filterable through the entries API.",[575,597,599],{"id":598},"project-money-budgets","Project Money Budgets",[12,601,602],{},"A new money-budget field on projects complements the hours budget with a cost ceiling. Tracked against (hours × hourly rate) of billable entries only — non-billable time never draws down the cost budget. The project detail page renders a second progress bar alongside the hours budget with matching 80% / 100% colour thresholds. Currency inherits from the organization's default.",[575,604,606],{"id":605},"bulk-delete-and-bulk-edit","Bulk Delete and Bulk Edit",[12,608,609],{},"Multi-select in the timesheet list view with a floating action bar. Bulk delete soft-deletes up to 200 entries in one request. Bulk edit supports field-level PATCH semantics — pick any combination of project, billable flag, and hourly-rate override, apply to up to 200 entries at once. Only the fields you explicitly tick get written, so one column can be restamped without touching the others. Both operations are fail-closed: if any row in the batch is blocked by lockdown or ownership rules, nothing is deleted or changed.",[575,611,613],{"id":612},"restart-timer-duplicate","Restart-Timer (Duplicate)",[12,615,616],{},"One-click duplicate on any past entry clones the project / task / description / notes and starts it as a fresh active timer. Stops any currently-running timer first so the \"one active timer per user\" invariant holds.",[575,618,620],{"id":619},"cost-aggregation-on-time-reports","Cost Aggregation on Time Reports",[12,622,623],{},"The time report now surfaces fully-loaded cost alongside hours for administrators and executives. Rate is drawn from each employee's effective Compensation record at the time each entry was logged, so mid-period raises are picked up automatically. SALARY pay types are normalised to hourly at 2080 hours/year; HOURLY is used as-is. A new Total Cost summary card appears on the report, and the Employee breakdown picks up a Cost column. Entries for employees with no Compensation on file are flagged (\"(N unpriced)\") so admins can close data gaps rather than silently under-report. Department heads continue to see hours but never cost.",[35,625,627],{"id":626},"approvals-redesigned","Approvals, Redesigned",[12,629,630,632,633,636],{},[43,631,491],{}," is now a dashboard-style overview. Four edge-joined KPI cards at the top (Total Pending, Leave Requests, Expense Reports, Timesheet Entries — the last one hidden when time tracking is off) link straight to their detail queue. A unified ",[78,634,635],{},"Pending Workload"," card shows the big-number total plus a horizontal bar breakdown per queue, followed by a Review Queues table with Queue / Status / Pending count / Review link. A pulsing amber dot in the header tells you at a glance that something is waiting; it turns green when the queues are clear.",[12,638,639,640,337,643,337,646,649],{},"Each queue has its own dedicated page — ",[43,641,642],{},"/approvals/leave",[43,644,645],{},"/approvals/expenses",[43,647,648],{},"/approvals/time"," — with a consistent layout: breadcrumb, search + filter + export toolbar, a data table with avatar cells and coloured status badges, row-click detail slideover, a three-dot action menu per row, reject modal with character counter and keyboard shortcut hint, and a bottom-pinned pagination footer with rows-per-page selector.",[12,651,652],{},"Approving or rejecting a row is now instant on every approvals page — the row drops out of the list locally without a full refetch.",[35,654,656],{"id":655},"reports-redesigned","Reports, Redesigned",[12,658,659,661],{},[43,660,488],{}," mirrors the approvals overview: five edge-joined KPI cards (Leave requests, Expenses total, Time hours, Active projects, Scheduled shifts), a two-column chart row (Expense Trend + Leave by Employee), and a three-column chart row gated on time tracking (Hours Tracked / Project Hours / Scheduled Shifts). Each chart has a settings gear with period, metric, and top-N options.",[12,663,664,665,337,668,337,671,337,674,337,677,680,681,684,685,688],{},"Five new per-type report pages — ",[43,666,667],{},"/reports/leave",[43,669,670],{},"/reports/expenses",[43,672,673],{},"/reports/time",[43,675,676],{},"/reports/projects",[43,678,679],{},"/reports/scheduling"," — each backed by a real ",[43,682,683],{},"\u003Ctable>"," with admin-style formatting, server-side pagination, exportable via the unified dropdown, and drill-down-friendly URLs. Tab navigation on both Approvals and Reports moved from hash links to query params (",[43,686,687],{},"?tab=leave","), so URLs are shareable and round-trip through the router cleanly.",[35,690,692],{"id":691},"settings-search","Settings Search",[12,694,695,696,699,700,703,704,707,708,711],{},"Every ",[43,697,698],{},"/settings/*"," page now renders a compact Stripe-style search input in the top toolbar. Press ",[43,701,702],{},"/"," anywhere to focus it. Type what you want — \"time zone\", \"auto clock out\", \"rounding\", \"lockdown\", \"audit logs\" — and results resolve to ",[43,705,706],{},"path#anchor"," deep links (e.g. ",[43,709,710],{},"/settings/general#time-zone","). Anchor IDs have been added across ~30 settings components covering General, Time Tracking, Expenses, Leave Types, Documents, Security, Notifications, Integrations, and everything in between.",[12,713,714],{},"Results are role-aware (an employee searching for \"audit logs\" gets no result) and billing-aware (locked-behind-plan features render a small 🔒 Pro / Business / Enterprise / Add-on pill). Arrow keys move the active row, Enter commits, Esc closes.",[35,716,718],{"id":717},"unified-export-excel-pdf-csv","Unified Export — Excel, PDF, CSV",[12,720,721],{},"The Export button is now one dropdown with three options — \"Export in Excel\", \"Export in PDF\", \"Export as CSV\" — applied consistently across timesheets, schedules, all three approval pages, users, and expenses.",[162,723,724,730,740],{},[99,725,726,729],{},[78,727,728],{},"Excel export"," opens a full AG Grid page with theme picker (Quartz / Alpine / Balham / Material, with dark-mode auto-switching), column visibility dropdown, Excel-style checkbox set filters per column, quick filter search across all columns, pinned bottom totals row, and CSV export of the filtered view.",[99,731,732,735,736,739],{},[78,733,734],{},"PDF export"," runs client-side via pdf-lib with a branded header (your logo + company name), paginated rows, and page-number footers. The org's logo comes from your white-label branding; if you don't have a custom domain, it falls back to ",[43,737,738],{},"SMTP_LOGO_URL"," so PDFs still look branded.",[99,741,742,745],{},[78,743,744],{},"CSV export"," respects current filters and visible columns.",[12,747,748,749,337,752,337,755,337,758,341,761,569],{},"The new \"Excel export\" pages exist at ",[43,750,751],{},"/time-tracking/timesheets/export",[43,753,754],{},"/schedules/export",[43,756,757],{},"/approvals/{leave,expense,time}-export",[43,759,760],{},"/users-export",[43,762,763],{},"/expenses-export",[35,765,767],{"id":766},"list-views-that-actually-work-at-scale","List Views That Actually Work at Scale",[12,769,770,771,774,775,774,778,781],{},"The timesheets and schedules pages now have a flat list view alongside the calendar and Team Matrix views. Columns include Date, Employee (avatar + department), Project, Description, Time, Duration, Status, and Actions. Server-side pagination (50 rows per page) keeps the API efficient; multi-select supports bulk edit and bulk delete. View mode persists in the URL query param (",[43,772,773],{},"?view=calendar"," / ",[43,776,777],{},"?view=list",[43,779,780],{},"?view=team",") so refresh doesn't flash.",[35,783,785],{"id":784},"users-page-redesign","Users Page Redesign",[12,787,788,791,792,794],{},[43,789,790],{},"/users"," matches the admin dashboard table pattern now. Inline filter dropdowns (Department, Role, Status) replace the modal-based filter; the layout is full-width; CSV and branded PDF export are one click away; and there's a full AG Grid export page at ",[43,793,760],{},". The Manage Departments modal was redesigned to a compact header/body/footer pattern with contextual icon badges per department and clickable status badges.",[35,796,798],{"id":797},"onboarding-cleaned-up","Onboarding, Cleaned Up",[12,800,801],{},"Department heads are now first-class managers of their own department's task lists — they can create, edit, delete, and manage templates scoped to their department, with auto-pinned department selection on create. Signing a document attached to an onboarding task now auto-completes the task. Due dates respect BEFORE/AFTER direction properly (a task \"7 days before hire\" is now actually before, not after). Employees can no longer mark their own onboarding tasks complete (only admins, executives, the department head of the employee's department, or the explicit task assignee). Reminders fan out to admins + executives + the assignee instead of just one person, with the employee name in the subject line. Task and instance removals now notify admins/execs/DH with the details of who removed what.",[12,803,804],{},"Drag-and-drop reordering of tasks within a template. Email CTA buttons render in the organization's brand colour. Template snapshots on each instance mean renaming or deleting a template no longer crashes the cards that referenced it.",[35,806,808],{"id":807},"a-full-stack-performance-pass","A Full-Stack Performance Pass",[12,810,811],{},"We did a directed performance audit across the hottest pages and cut request counts, round-trip time, and payload size across the board. Nothing in this section changes behaviour or API shapes — the work is entirely internal.",[162,813,814,823,829,838,847,853,867,873,883],{},[99,815,816,819,820,822],{},[78,817,818],{},"Reports overview now loads in one pass."," ",[43,821,488],{}," used to fire roughly seventy requests on mount. The summary strip now calls a single new endpoint that returns all five KPI numbers via DB aggregates; the leave-by-employee chart reads one endpoint and groups client-side instead of fanning out per user; the hours-tracked chart fetches its six monthly buckets in parallel. Typical admin loads drop from double-digit seconds to sub-2s on a 50-user org.",[99,824,825,828],{},[78,826,827],{},"Approvals overview uses one counts endpoint."," Three hidden \"tab components\" that existed purely to compute stat-card numbers are gone. One endpoint returns the three pending counts in one hop.",[99,830,831,834,835,837],{},[78,832,833],{},"Faster approvals."," Approving or rejecting on ",[43,836,648],{}," removes the row locally on success instead of refetching the entire queue. Leave and expense approvals already worked this way; timesheets are now in line.",[99,839,840,843,844,569],{},[78,841,842],{},"Dashboard reads in parallel."," The home dashboard's user-row query used to walk through five independent reads in sequence. They now run in a single ",[43,845,846],{},"Promise.all",[99,848,849,852],{},[78,850,851],{},"Schedule auto-generation cut from hundreds of queries to one."," A per-employee-per-day existence check that ran 250+ individual queries for a typical 50-person week is now a single batched query plus an in-memory check.",[99,854,855,858,859,862,863,866],{},[78,856,857],{},"People grid uses DB aggregates."," The ",[43,860,861],{},"/time-tracking/people"," endpoint was loading every time entry for the week and looping in memory. It now uses ",[43,864,865],{},"groupBy"," for the sums and only fetches the handful of actively-running timers.",[99,868,869,872],{},[78,870,871],{},"Composable fetches in parallel."," Department-head paths on the timesheet and schedule calendars now fire their two API calls in parallel instead of sequence. Preferences load once per session instead of refetching on every calendar navigation. Watcher cascades that fired together coalesce into one request via microtask debounce.",[99,874,875,878,879,882],{},[78,876,877],{},"Cross-tab notification dedup."," The unread-count poller now broadcasts results across tabs via ",[43,880,881],{},"BroadcastChannel",". Three tabs open → roughly the same load as one.",[99,884,885,888],{},[78,886,887],{},"Domain middleware merged into one query."," White-label domain lookup now loads the owning organization via a relation include on the same query, so cache-miss paths are a single DB round-trip per unique host.",[12,890,891],{},"All in: 1699 tests passing, zero behaviour changes, noticeably faster app.",[35,893,895],{"id":894},"getting-v1010","Getting v1.0.10",[12,897,898,899,53,901,903,904,907],{},"There's nothing to do — the update is live for all cloud customers. Everything above is backwards-compatible; no migrations required on your side. Open ",[43,900,497],{},[43,902,568],{}," to try the new Team view, or visit ",[43,905,906],{},"/settings/timetracking#lockdown-period-start"," to set up your first pay-period lockdown.",[12,909,910],{},"As always, if you hit anything unexpected, reach out — we read every support ticket.",{"title":16,"searchDepth":17,"depth":17,"links":912},[913,914,915,925,926,927,928,929,930,931,932,933],{"id":474,"depth":17,"text":475},{"id":504,"depth":17,"text":505},{"id":572,"depth":17,"text":573,"children":916},[917,919,920,921,922,923,924],{"id":577,"depth":918,"text":578},3,{"id":584,"depth":918,"text":585},{"id":591,"depth":918,"text":592},{"id":598,"depth":918,"text":599},{"id":605,"depth":918,"text":606},{"id":612,"depth":918,"text":613},{"id":619,"depth":918,"text":620},{"id":626,"depth":17,"text":627},{"id":655,"depth":17,"text":656},{"id":691,"depth":17,"text":692},{"id":717,"depth":17,"text":718},{"id":766,"depth":17,"text":767},{"id":784,"depth":17,"text":785},{"id":797,"depth":17,"text":798},{"id":807,"depth":17,"text":808},{"id":894,"depth":17,"text":895},"2026-04-20","v1.0.10 ships the Team Matrix view on schedules and timesheets, pay-period lockdown for payroll compliance, project money budgets, clock rounding, time-entry tags, unified Excel/PDF/CSV export, a Settings search bar, and a cross-stack performance pass.","https://images.unsplash.com/photo-1611926653458-09294b3142bf?w=1200&h=630&fit=crop",{},"/blog/v1-0-10-launch","7 min read",{"title":469,"description":935},"blog/v1-0-10-launch",[461,943,944,945,946],"time tracking","scheduling","approvals","performance","BHygeve_N_zW97jDb0ycV70YfhRqImpud3tOcc6KTAI",{"id":949,"title":950,"author":31,"body":951,"date":1172,"description":1173,"extension":19,"image":1174,"meta":1175,"navigation":7,"path":1176,"readTime":1177,"seo":1178,"stem":1179,"tags":1180,"__hash__":1185},"blog/blog/geofencing-time-tracking-guide.md","Geofencing for Time Tracking: A Practical Guide",{"type":9,"value":952,"toc":1160},[953,957,960,971,974,978,981,984,988,991,997,1003,1009,1015,1019,1022,1029,1035,1038,1042,1045,1048,1054,1060,1066,1069,1073,1076,1079,1082,1086,1089,1092,1095,1099,1102,1108,1114,1120,1123,1127,1130,1133,1136,1140,1143,1146],[35,954,956],{"id":955},"the-hours-you-never-see","The Hours You Never See",[12,958,959],{},"Most of the hours you pay for look fine on paper. An employee clocks in at 8:03, clocks out at 16:58, and the timesheet adds up. Revenue comes in from the client at the contracted rate. Payroll runs. Everyone goes home.",[12,961,962,963,967,968,569],{},"But if you are paying for work on a specific jobsite — a construction project, a client office, a warehouse, a hospital — the timesheet only tells you half the story. It says ",[964,965,966],"em",{},"when"," someone worked. It does not say ",[964,969,970],{},"where",[12,972,973],{},"For a lot of businesses that distinction doesn't matter. For a lot of others, it's the whole game.",[35,975,977],{"id":976},"what-geofencing-actually-is","What Geofencing Actually Is",[12,979,980],{},"A geofence is a virtual boundary drawn on a map. Your time tracker uses the employee's GPS location at the moment they clock in to check whether they are inside that boundary. If they are, the clock-in is allowed. If they aren't, it is either blocked, flagged for review, or silently logged for compliance — depending on how strict your policy is.",[12,982,983],{},"That's it. No satellites following your employees around all day. No background tracking. The employee's location is captured once at clock-in and once at clock-out, compared to the fence, and then nothing happens until the next clock event.",[35,985,987],{"id":986},"where-it-earns-its-keep","Where It Earns Its Keep",[12,989,990],{},"Four patterns cover most real-world use cases.",[12,992,993,996],{},[78,994,995],{},"Construction and job sites."," A framer does not need to clock in from the truck yard or from home. The site has an address. Draw a polygon around the site — irregular shapes are fine, that's what polygons are for — and the clock-in only fires when the crew is actually there. When the project ends, the fence goes away with it.",[12,998,999,1002],{},[78,1000,1001],{},"Multi-office companies."," A consulting firm with offices in Vancouver, Calgary, and Toronto doesn't want employees clocking into \"Vancouver office\" from their couch. One fence per office, all assigned org-wide, and the time entry records which office the clock-in actually matched. Now your occupancy reports are honest.",[12,1004,1005,1008],{},[78,1006,1007],{},"Field services."," Technicians who bill client visits by the hour. The job happens at the customer's address, not on the way there. A fence per client site, assigned to the specific project, means billable time doesn't start until the tech is on-premise. Your invoices match reality and your client trusts your bills.",[12,1010,1011,1014],{},[78,1012,1013],{},"Healthcare and shift work."," A hospital campus with specific buildings. A clinic with parking shared by three businesses. Labour regulations often require that shift time is counted from the moment the worker is at their station, not when they scanned their key card at the perimeter. A polygon fence around the correct building enforces that without anyone having to manually police it.",[35,1016,1018],{"id":1017},"circle-or-polygon","Circle or Polygon?",[12,1020,1021],{},"The two shapes handle almost everything.",[12,1023,1024,1025,1028],{},"A ",[78,1026,1027],{},"circle"," is a centre point plus a radius. Simplest possible fence. Good for a single-building office, a small warehouse, a standalone retail location. Ten-metre radius for a tiny site, 500-metre radius for a large campus. You pick the centre on a map, drag a handle to set the radius, you're done in 30 seconds.",[12,1030,1024,1031,1034],{},[78,1032,1033],{},"polygon"," is an ordered list of vertices. More work to draw, much more precise. Use it when the site has a shape — a construction zone spanning half a city block, a U-shaped hospital that doesn't fit neatly into a bounding circle, a delivery depot that wraps around a parking lot the public can access.",[12,1036,1037],{},"Most teams start with circles because they are faster to draw, and convert the few that matter to polygons over time. Neither is objectively better. They serve different geometries.",[35,1039,1041],{"id":1040},"three-modes-a-rollout-strategy","Three Modes — A Rollout Strategy",[12,1043,1044],{},"Geofencing adoption fails when it goes from \"off\" to \"block everything\" overnight. Your GPS fences will have edge cases you did not anticipate. An employee whose office sits right on the fence boundary. A warehouse back door that puts workers 20 metres outside the polygon. A mid-tier Android phone that reports 200-metre accuracy on a cloudy day.",[12,1046,1047],{},"The better way is three modes, in sequence.",[12,1049,1050,1053],{},[78,1051,1052],{},"Start in LOG_ONLY."," No employee-visible change. Every clock-in proceeds normally, but the system records whether the location fell inside or outside the fence. After two weeks you have real data on how well your fences cover the work that actually happens. Now you know which ones to redraw, which sites need a polygon instead of a circle, and which employees are doing legitimate work 30 metres outside your boundary because that's where the shaded break area is.",[12,1055,1056,1059],{},[78,1057,1058],{},"Graduate to OPTIONAL."," Clock-ins still succeed, but out-of-bounds attempts are flagged on a compliance dashboard. The employee experience is unchanged; managers start reviewing flagged entries weekly. This is where you build trust in the system before it starts saying no.",[12,1061,1062,1065],{},[78,1063,1064],{},"Switch on REQUIRED."," Now out-of-bounds clock-ins are blocked with a clear rejection modal showing the nearest allowed site and the distance to it. Use this once your fence coverage is solid and you have a process for employees who genuinely need to work off-site (a remote exception assignment, a temporary override).",[12,1067,1068],{},"The trap is skipping the first two phases. The cost is a week of angry Slack messages from people whose clock-ins mysteriously fail. Don't do it.",[35,1070,1072],{"id":1071},"whose-fence-wins","Whose Fence Wins",[12,1074,1075],{},"A single fence can apply to different targets — the whole organization, a single department, a specific user, or a specific project. When an employee clocks in, the most specific match wins.",[12,1077,1078],{},"Start at the top: if the project they're clocking into has its own fence, that fence applies. If not, does the user have one assigned to them directly? If not, their department? If not, the org-wide default? That's the resolution order, and it matches how most enterprise HRIS tools handle location policies.",[12,1080,1081],{},"In practice it means you can set a sensible org-wide default (\"all clock-ins must come from one of our three offices\") and then override it per project for edge cases (\"Q4 Warehouse Build is on-site only\") and per user for remote exceptions (\"Sarah works from home on Fridays\"). The four levels of scope cover almost every policy you'd want to express.",[35,1083,1085],{"id":1084},"what-about-gps-accuracy","What About GPS Accuracy?",[12,1087,1088],{},"This is the question everyone asks second, right after \"can I use polygons?\". The short answer is: you can't trust a single GPS fix to the metre, so geofencing has to be tolerant of that by design.",[12,1090,1091],{},"A good implementation does three things. First, it captures the accuracy of the reading alongside the position itself — most browser and OS location APIs return this. Second, it treats the effective allowed area as the fence radius plus a configurable tolerance plus the accuracy of the individual reading. A 50-metre GPS fix inside a 100-metre fence is obviously inside; a 200-metre GPS fix just barely outside a 100-metre fence is ambiguous, and the tolerance-plus-accuracy math treats it as inside. Third, it rejects readings whose accuracy is worse than a configurable threshold — a 5-kilometre fix is not useful for enforcement, so the clock-in fails with a specific \"GPS too weak\" message that tells the employee to move near a window.",[12,1093,1094],{},"The net effect is that mobile-web GPS, which is routinely 50-200 metres noisy, still works reliably for a 100-metre office fence. Not by pretending the noise isn't there, but by accounting for it at check time.",[35,1096,1098],{"id":1097},"privacy-and-trust","Privacy and Trust",[12,1100,1101],{},"Geofencing can slide into creepy territory fast if you let it. The guardrails are simple and should be non-negotiable.",[12,1103,1104,1107],{},[78,1105,1106],{},"Capture the location only at clock events."," Not in the background. Not continuously. Not when the app is closed. Employees should be able to open the app, work, close it, and only when they tap Clock In does their location get read. That's the whole lifecycle.",[12,1109,1110,1113],{},[78,1111,1112],{},"Store the result, not the history."," A single lat/lng on the time entry, tied to the clock-in/out you just performed, is sufficient for compliance. You do not need a minute-by-minute trail of where the employee was during the shift. You need to know where they were when they said they were working.",[12,1115,1116,1119],{},[78,1117,1118],{},"Be transparent about what's enforced."," If geofencing is on for a team, tell that team. Show the employee, before they tap the button, what fence they are being checked against and whether they currently pass. The \"live status banner\" pattern — green when inside, amber when outside, with the name of the nearest allowed site — turns a system that could feel like surveillance into one that reads as \"here's the information I need to do my job.\"",[12,1121,1122],{},"Enforcement without transparency is surveillance. Enforcement with clear, contextual feedback is just a workflow.",[35,1124,1126],{"id":1125},"offline-workers","Offline Workers",[12,1128,1129],{},"One last problem. Your field crews sometimes work where there is no cellular signal. A construction site in a basement. A client building with bad reception. A delivery route through a mountain pass. The clock-in has to work anyway.",[12,1131,1132],{},"The pattern most mobile-native workforce apps converge on is an offline queue. The app captures the clock event locally, including the timestamp and the last known GPS fix, and queues it. When the device comes back online, the queued event replays against the server with the original timestamp and location. A sensible drift tolerance (say, up to 24 hours into the past and 15 minutes into the future) prevents abuse.",[12,1134,1135],{},"Not every workforce tool handles this. The ones that don't tend to have a ticket queue full of \"my clock-in didn't save\" support requests. If your team genuinely works off-grid, ask about offline behaviour before you buy.",[35,1137,1139],{"id":1138},"how-bookyourpto-does-it","How BookYourPTO Does It",[12,1141,1142],{},"All of the patterns above are how the BookYourPTO geofencing feature is built. Circles and polygons from a single editor. Three modes — LOG_ONLY, OPTIONAL, REQUIRED. Four scope levels with the most-specific-wins resolution. Accuracy-aware distance checks with configurable tolerance and max-accuracy thresholds. A live status banner on the employee clock-in screen. An offline-queue timestamp protocol on the mobile API. A compliance dashboard with CSV export and a full audit trail of every fence change and every blocked attempt.",[12,1144,1145],{},"It is available on every plan that includes time tracking, works with both Google Maps and OpenStreetMap (no lock-in to one vendor's key), and takes about a minute to set up your first fence.",[12,1147,1148,1149,1156,1157,569],{},"Start a trial at ",[1150,1151,1155],"a",{"href":1152,"rel":1153},"https://app.bookyourpto.com/register",[1154],"nofollow","bookyourpto.com",", or read the feature details at ",[1150,1158,1159],{"href":1159},"/geofencing",{"title":16,"searchDepth":17,"depth":17,"links":1161},[1162,1163,1164,1165,1166,1167,1168,1169,1170,1171],{"id":955,"depth":17,"text":956},{"id":976,"depth":17,"text":977},{"id":986,"depth":17,"text":987},{"id":1017,"depth":17,"text":1018},{"id":1040,"depth":17,"text":1041},{"id":1071,"depth":17,"text":1072},{"id":1084,"depth":17,"text":1085},{"id":1097,"depth":17,"text":1098},{"id":1125,"depth":17,"text":1126},{"id":1138,"depth":17,"text":1139},"2026-04-19","If you manage field workers, construction crews, or multi-site teams, your time tracker needs to know where the clock-in actually happened. Here is how geofencing fits into a real workforce — without turning into surveillance.","https://images.unsplash.com/photo-1524661135-423995f22d0b?w=1200&h=630&fit=crop",{},"/blog/geofencing-time-tracking-guide","6 min read",{"title":950,"description":1173},"blog/geofencing-time-tracking-guide",[1181,943,1182,1183,1184],"geofencing","compliance","field service","construction","sjR6-s4GMnnvNWS0xlEEr4WPnrKXLnbk9drPfeHYEjo",{"id":1187,"title":1188,"author":31,"body":1189,"date":1388,"description":1389,"extension":19,"image":1390,"meta":1391,"navigation":7,"path":1392,"readTime":939,"seo":1393,"stem":1394,"tags":1395,"__hash__":1397},"blog/blog/performance-goals-one-on-ones-training.md","A Performance Foundation for Growing Teams: Goals, 1:1s, and Training (2026)",{"type":9,"value":1190,"toc":1376},[1191,1195,1198,1201,1205,1208,1211,1231,1234,1238,1241,1244,1247,1251,1254,1257,1260,1263,1267,1270,1274,1277,1280,1318,1321,1325,1328,1331,1335,1338,1342,1345,1351,1357,1361,1364,1367,1370,1373],[35,1192,1194],{"id":1193},"the-performance-gap-at-30-employees","The Performance Gap at 30 Employees",[12,1196,1197],{},"Somewhere between 20 and 50 employees, every growing company hits the same wall. The informal \"we all know each other\" model of performance management stops working. Managers forget what their reports committed to last month. Goals stop being written down. Training that was supposed to be annual becomes never. The first awkward review is scheduled because someone asked for a raise and HR realized there's no paper trail.",[12,1199,1200],{},"At that scale, buying a full performance suite from a large HRIS vendor is overkill. What small HR teams need is a lightweight layer: goals, recurring 1:1s, and an auto-assigning training system. This post covers what each looks like when designed for the 30-to-150 employee band.",[35,1202,1204],{"id":1203},"configuration-before-features","Configuration Before Features",[12,1206,1207],{},"A performance module should ship with a settings page that makes it legitimate to say \"we're not using goals this year.\" Forcing every organization into every feature is how you get half-filled goal sheets and abandoned 1:1 series.",[12,1209,1210],{},"The settings worth exposing:",[162,1212,1213,1219,1225],{},[99,1214,1215,1218],{},[78,1216,1217],{},"Who gets goals"," — none, all employees, or a specific subset",[99,1220,1221,1224],{},[78,1222,1223],{},"Cascading goals"," — whether employee goals can be linked to their manager's goals",[99,1226,1227,1230],{},[78,1228,1229],{},"1:1 enablement"," — whether the 1:1 module is on at all",[12,1232,1233],{},"A ten-person startup might turn on 1:1s and leave goals off. A fifty-person services firm might do the opposite. Both are correct.",[35,1235,1237],{"id":1236},"goals-that-people-actually-update","Goals That People Actually Update",[12,1239,1240],{},"Goal-tracking fails in most companies because the UI for updating a goal is worse than a Google Doc. The bar is low. Clear it.",[12,1242,1243],{},"A usable goal card shows title, description, progress (0-100%), status, due date, category, and owner. Progress is a slider, not a text field. Status is a dropdown. Updates take five seconds.",[12,1245,1246],{},"The card expands to show threaded comments with timestamps and author avatars. This is where the conversation happens: \"Moved the launch date, pushing this to 60% instead of 75%,\" and the manager replies two days later. The comment thread is the audit trail.",[35,1248,1250],{"id":1249},"_11s-as-a-recurring-series","1:1s as a Recurring Series",[12,1252,1253],{},"A 1:1 is not a single meeting. It is a series with a frequency (weekly, biweekly, monthly, or one-time), a first meeting date, and two participants. Everything else — agenda items, notes, action items — attaches to the series.",[12,1255,1256],{},"The layout that works is side-by-side notes: a shared column visible to both participants, and a private column visible only to the author. Managers need private notes. They use them to track hunches, performance concerns, and context they'll pull into a review six months later. Pretending managers won't keep private notes just means they'll keep them in a separate doc you can't see or back up.",[12,1258,1259],{},"The 1:1 view should also include an inline profile preview of the other participant, so the manager has hire date, role, manager chain, and recent activity one glance away during the meeting. Asking a manager to switch tabs mid-conversation is a small failure that happens a thousand times a year.",[12,1261,1262],{},"Creation and cancellation of a 1:1 should email both participants. A daily reminder cron should notify both participants of their upcoming 1:1 with the current agenda attached, so nobody shows up empty-handed.",[35,1264,1266],{"id":1265},"private-note-filtering","Private-Note Filtering",[12,1268,1269],{},"Private-note filtering must happen server-side on every API response, not just in the UI. A manager's private notes on their report do not leak to the report. The report's private notes do not leak to the manager. This is the single most common place where performance modules leak data, because the obvious implementation — \"return all notes, hide the private ones in the UI\" — fails the first time someone inspects a network tab.",[35,1271,1273],{"id":1272},"training-as-policy-not-assignment","Training as Policy, Not Assignment",[12,1275,1276],{},"The mistake most companies make with training is to manage it as individual assignments. HR thinks \"every engineer needs the secure coding refresher annually,\" and then hand-assigns it, hire by hire, year after year. It works for six months.",[12,1278,1279],{},"The correct model is to define training requirements as policy and let the system assign them:",[162,1281,1282,1288,1294,1300,1306,1312],{},[99,1283,1284,1287],{},[78,1285,1286],{},"Frequency"," — one-time, annual, every 2 years, every 3 years, every 5 years",[99,1289,1290,1293],{},[78,1291,1292],{},"Categories"," — safety, compliance, skills, role-specific, onboarding",[99,1295,1296,1299],{},[78,1297,1298],{},"Due-from-hire-days"," — how many days after hire date the first completion is due",[99,1301,1302,1305],{},[78,1303,1304],{},"Required-for filter"," — all employees, a department, a role, or specific employees",[99,1307,1308,1311],{},[78,1309,1310],{},"URL"," — optional link to the course provider",[99,1313,1314,1317],{},[78,1315,1316],{},"Self-complete toggle"," — whether the employee can mark the training complete themselves",[12,1319,1320],{},"When a requirement is created or its target filter changes, the system automatically creates training records for everyone it applies to, with due dates calculated from each person's hire date. New hires in the target scope get the training auto-assigned when they join. Leavers stop receiving reminders when they offboard.",[35,1322,1324],{"id":1323},"the-profile-training-tab","The Profile Training Tab",[12,1326,1327],{},"On each employee profile, the Training tab groups courses by category and shows due date, status, and last completion date. Inline edit lets managers update completion dates without leaving the profile. Mark-complete and dismiss actions handle the two normal outcomes: \"the employee actually took the course\" and \"this training no longer applies to this person.\"",[12,1329,1330],{},"Crucially, the tab only shows courses that actually apply to the user based on their current department and role. An engineer doesn't see the kitchen-safety course that was required for the one-person kitchen staff filter.",[35,1332,1334],{"id":1333},"training-reminders","Training Reminders",[12,1336,1337],{},"A training reminder cron runs daily and emits 7-day, 3-day, and 1-day reminders before due date, plus overdue detection that notifies both the employee and their manager. The manager loop is important. Training that silently goes overdue is a compliance risk that HR doesn't see from the dashboard until it's been a problem for weeks.",[35,1339,1341],{"id":1340},"small-ux-details-that-matter","Small UX Details That Matter",[12,1343,1344],{},"Two small things that add up:",[12,1346,1347,1350],{},[78,1348,1349],{},"No page refresh after recording completion."," Marking a training complete used to require a full page reload. Single-request creation with an optimistic UI update makes the interaction instant — the difference between \"I'll update training later\" and \"I'll update training now.\"",[12,1352,1353,1356],{},[78,1354,1355],{},"Reports To picker respects the role hierarchy."," When assigning a manager, the picker filters to users at or above the employee's level and excludes inactive users. If an employee already has a saved manager outside the filtered list (a legacy assignment from before a reorg), the picker preserves them so the admin doesn't accidentally unassign. Live updates react to in-form role changes.",[35,1358,1360],{"id":1359},"how-bookyourpto-supports-this","How BookYourPTO Supports This",[12,1362,1363],{},"Version 1.0.9 introduces the performance foundation described above. A performance settings page lets admins configure goal users (none, all, or specific), enable cascading goals, and turn the 1:1 module on or off independently. Per-employee goal cards include a progress slider, status, due date, and category, and expand to show threaded comments with timestamps and author avatars.",[12,1365,1366],{},"The 1:1 module supports recurring series with weekly, biweekly, monthly, or one-time frequency. Each 1:1 includes an inline profile preview of the other participant, an agenda, and side-by-side notes with shared and private columns. Private-note filtering is enforced server-side on every API response. Creation and cancellation emails fire automatically, and a daily reminder cron sends upcoming-1:1 notifications with the current agenda.",[12,1368,1369],{},"Training settings let admins define requirements with frequency (one-time, annual, every 2/3/5 years), categories, due-from-hire days, required-for filters (all, department, role, or specific employees), an optional URL, and a self-complete toggle. Required training auto-assigns to targeted users on create or update, with due dates calculated from each user's hire date. The profile training tab groups courses by category, shows only courses that apply to the user, and supports inline edit, mark-complete, and dismiss. A training reminder cron sends 7-day, 3-day, and 1-day reminders plus overdue notifications to both the employee and their manager.",[12,1371,1372],{},"Recording a completed training now uses an optimistic UI with single-request creation, so the page no longer refreshes after each completion. The Reports To picker filters on role hierarchy, excludes inactive users, reacts live to in-form role changes, and preserves a currently saved manager even if they fall outside the filtered list.",[12,1374,1375],{},"If your team is ready to move goals, 1:1s, and training off ad-hoc docs and into something queryable, the performance module in 1.0.9 is a reasonable starting point.",{"title":16,"searchDepth":17,"depth":17,"links":1377},[1378,1379,1380,1381,1382,1383,1384,1385,1386,1387],{"id":1193,"depth":17,"text":1194},{"id":1203,"depth":17,"text":1204},{"id":1236,"depth":17,"text":1237},{"id":1249,"depth":17,"text":1250},{"id":1265,"depth":17,"text":1266},{"id":1272,"depth":17,"text":1273},{"id":1323,"depth":17,"text":1324},{"id":1333,"depth":17,"text":1334},{"id":1340,"depth":17,"text":1341},{"id":1359,"depth":17,"text":1360},"2026-04-14","Why small HR teams are adopting lightweight performance tooling — goals with progress and threaded comments, recurring 1:1 series with private notes, and auto-assigned training by department and role.","https://images.unsplash.com/photo-1600880292203-757bb62b4baf?w=1200&h=630&fit=crop",{},"/blog/performance-goals-one-on-ones-training",{"title":1188,"description":1389},"blog/performance-goals-one-on-ones-training",[946,1396,464],"training","HoixBg6qpJ-ovo3_57lrp7Bh54rPmy8kC2jYb-VEodY",1777948946467]