What's New in v1.0.10: Team Matrix, Pay-Period Lockdown, Project Budgets, and a Faster App
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.
v1.0.10 Is Our Biggest Release Since Launch
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 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.
And we did a full-stack performance pass. Page loads on /reports, /approvals, /dashboard, and /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.
Here's the tour.
Team Matrix View for Schedules and Timesheets
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.
- 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.
- 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.
- Drag-resizable columns with persistence. Every column has a drag handle; widths clamp between 60 and 600 pixels and persist per-browser in
localStorage. Double-click a handle to reset that column; a toolbar button clears every custom width at once. - 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.
- 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.
- 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.
- Calendar and List views still available. The top bar toggle is now three buttons: Team (default) / Calendar / List. The
?view=URL parameter accepts all three, so existing deep links keep working.
The Team view is now the default for both /schedules and /time-tracking/timesheets.
Time Tracking Grew Up
Pay-Period Lockdown
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.
Configurable Clock Rounding
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.
Free-Form Tags on Time Entries
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.
Project Money Budgets
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.
Bulk Delete and Bulk Edit
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.
Restart-Timer (Duplicate)
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.
Cost Aggregation on Time Reports
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.
Approvals, Redesigned
/approvals 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 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.
Each queue has its own dedicated page — /approvals/leave, /approvals/expenses, /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.
Approving or rejecting a row is now instant on every approvals page — the row drops out of the list locally without a full refetch.
Reports, Redesigned
/reports 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.
Five new per-type report pages — /reports/leave, /reports/expenses, /reports/time, /reports/projects, /reports/scheduling — each backed by a real <table> 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 (?tab=leave), so URLs are shareable and round-trip through the router cleanly.
Settings Search
Every /settings/* page now renders a compact Stripe-style search input in the top toolbar. Press / anywhere to focus it. Type what you want — "time zone", "auto clock out", "rounding", "lockdown", "audit logs" — and results resolve to path#anchor deep links (e.g. /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.
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.
Unified Export — Excel, PDF, CSV
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.
- 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.
- 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
SMTP_LOGO_URLso PDFs still look branded. - CSV export respects current filters and visible columns.
The new "Excel export" pages exist at /time-tracking/timesheets/export, /schedules/export, /approvals/{leave,expense,time}-export, /users-export, and /expenses-export.
List Views That Actually Work at Scale
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 (?view=calendar / ?view=list / ?view=team) so refresh doesn't flash.
Users Page Redesign
/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 /users-export. The Manage Departments modal was redesigned to a compact header/body/footer pattern with contextual icon badges per department and clickable status badges.
Onboarding, Cleaned Up
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.
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.
A Full-Stack Performance Pass
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.
- Reports overview now loads in one pass.
/reportsused 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. - 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.
- Faster approvals. Approving or rejecting on
/approvals/timeremoves the row locally on success instead of refetching the entire queue. Leave and expense approvals already worked this way; timesheets are now in line. - 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
Promise.all. - 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.
- People grid uses DB aggregates. The
/time-tracking/peopleendpoint was loading every time entry for the week and looping in memory. It now usesgroupByfor the sums and only fetches the handful of actively-running timers. - 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.
- Cross-tab notification dedup. The unread-count poller now broadcasts results across tabs via
BroadcastChannel. Three tabs open → roughly the same load as one. - 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.
All in: 1699 tests passing, zero behaviour changes, noticeably faster app.
Getting v1.0.10
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 /schedules or /time-tracking/timesheets to try the new Team view, or visit /settings/timetracking#lockdown-period-start to set up your first pay-period lockdown.
As always, if you hit anything unexpected, reach out — we read every support ticket.
Written by
AnHourTec Team