One core for two products
November's 61 commits were about alignment. Rather than keep a separate HR base alive, we brought this codebase onto the same shared core that Mintage Payroll runs on. The employee model was copied across from Mintage Payroll, older code was removed in two passes, and more of the shared modules were switched on.
Sharing a core matters for a time and attendance product. TimeKeeper's job is to feed accurate hours into payroll, and that is far simpler when both sides agree on what an employee record looks like. Along the way the employee model gained support for a bimonthly pay frequency.
Knowing who changed what
We switched on an activity log and automatic tracking of which user created or last changed each record. For attendance data, where a single edited time can change someone's pay, that history is essential. File uploads were also moved onto cloud object storage, and sign-in and module settings were updated to match the shared core.
Moving data between systems
The second half of the month went into a sync API. It lets employee and location data move between systems in steps, with checks before anything is written, and it compresses the data it sends. Late in the month we added locations to the sync and gave its routes a clear prefix.
This was groundwork rather than a release. It set up the fresh start that followed in January.
This article was written from Mintage TimeKeeper’s commit history for November 2025. See Mintage TimeKeeper today