HR, leave & timesheets In progress
Our own product, for companies of a few to a few hundred people
Leave, trips and project hours, approved by email and lost there
Leave, sick days, trips and project hours requested by email or on paper — and the HR software on offer built for companies ten times the size.
BeforeLeave, trips and hours, approved by email and kept in a spreadsheet
AfterEvery request on one screen, with who approved it and when


Before
- 1“fine”, from a phone at midnight — the only record of the approval
- 2Days left: three people, three different numbers
- 3Project hours rebuilt from memory at month end
After
- 1Every request goes to a named person, and the answer comes back with a time
- 2A trip needs the manager and the budget owner; the money needs finance, separately
- 3Hours a manager enters are confirmed by the person they are about
Illustrative interface. All values synthetic.
- Sector
- Other
- Scale
- SMB
- Duration
- Two days to a working version
- Engagement
- Build sprint
In plain terms
- The problem
- In a lot of companies, asking for a day off means sending an email and hoping somebody answers. Hours spent on each project get written down at the end of the month, from memory. Nobody can say for sure who approved what, or how many days anyone has left.
- What was delivered
- We built one place where people ask for leave, a sick day, a trip or money for a trip, and it goes to the right person to say yes or no. People also write down which project they worked on each day, and the boss can see all of it on one screen.
- Outcome
- Every request now has one answer, from one person, written down with the date. We built the first working version in two days, and it is not yet in use at a company.
The detail
The problem
Small and mid-size companies run leave, sick days, remote days, travel and project hours on email, paper forms and a spreadsheet somebody updates when they remember. Approvals live in inboxes, so nobody can say with certainty what was approved, by whom, or when. The HR suites on offer are priced and built for organisations ten times the size.
Constraints
- Personal data about employees, so every company's records must stay separate from every other's — enforced, not assumed
- Greek employment rules, including the Digital Work Card, which an internal tool must not pretend to satisfy
- People in the field as well as in the office, so the everyday flows have to work on a phone
- Nothing in it may calculate pay or statutory entitlement until a labour lawyer has reviewed the rules
Approach
- Wrote down who is allowed to approve what before writing any screen — manager, project owner, finance, HR — and where one person must not approve both sides
- Built each company's data wall twice, once in the application and once in the database, and tested that one company cannot read another's rows
- Kept every rule that changes over time versioned with an effective date — leave policies, work schedules, who reports to whom — so history is never rewritten
- Treated office check-in as a record of presence, never as the legal Digital Work Card, and said so on screen
What was delivered
- Leave, sick, remote and other requests, each routed to a named approver with a recorded decision
- Project timesheets, including hours a manager enters for someone in the field, which that person then confirms
- Trip requests approved by the manager and the project budget owner, and travel advances that need a separate finance approval
- Office check-in by scanning a code on a screen at the entrance — built, and switched off until the security checks are done
- A month calendar, a company directory, announcements with read receipts, and a personal monthly report
- HR administration for departments, positions, reporting lines and work schedules
Outcome
Time to a working version
—
Two days
Before: —. After: Two days.
A protected preview, not yet in use at a company
Separation between companies
One check
Two, tested
Before: One check. After: Two, tested.
In the application, and again in the database, which the application cannot switch off
Approvals with a named approver and a date
In inboxes
Every one
Before: In inboxes. After: Every one.
Stack
Next.jsTypeScriptPostgreSQLNeonClerkVercel
Where AI helped, and where it didn't
Twenty-one tables, twenty endpoints and sixteen screens in two days is AI-assisted development doing what it is good at. What it did not supply: which approvals must be separated, that a scanned code at the door is not the legal work card, and that the tool must refuse to calculate anyone's leave entitlement until the rules have been checked by a lawyer.
The situation
In a company of forty or four hundred people, most HR is email. Someone asks for three days in August; their manager replies “fine” from a phone; the reply sits in two inboxes. Somebody else keeps a spreadsheet of who is off, updated when they remember. Project hours are reconstructed at month end from calendars and memory, which is exactly when a contractor needs them to be right, because they are what gets billed.
None of it is broken in a way anyone notices on a given day. It is broken the day someone asks how many days a person has left, or who approved the trip, or why the hours on a project do not match the invoice.
Why it had not been fixed
The HR suites on the market are built for companies ten times this size: priced per seat, configured by a consultant, with a hundred modules and a payroll engine the company does not want from them, because its accountant already runs payroll. So the company stays on email, because the alternative costs more than the problem appears to.
The rules first, then the screens
The interesting part was never the forms. It was writing down, before any screen existed, who is allowed to say yes to what.
- Leave goes to the manager. Who the manager is changes over time, so reporting lines carry an effective date, the history is kept, and a chain that loops back on itself is refused.
- A trip needs two yeses — the manager, and whoever owns the project budget — and collapses to one decision when they are the same person.
- Money is separated from the trip. A travel advance can only be requested against an approved trip, and needs a finance approver who is not the person who approved the trip. It is an authorisation only: nothing is paid out.
- Hours for people in the field. A manager can enter hours for someone who was on site all day. The record keeps who typed it, and the person it is about confirms it.
Every decision is stored with who made it and when. The question “who approved this?” has one answer, and it is not in anyone’s inbox.
One company’s data never reaches another’s
Several companies share the same portal, and what it holds is personal. So the wall between companies is built twice. The application checks every request against the person’s company and role. Underneath, the database enforces the same boundary on every row, and the account the application runs under is not allowed to switch that off. A test builds the whole database from scratch and confirms that one company sees nothing of another’s.
People with HR, finance or admin access must sign in with a second factor; the server rejects their session otherwise.
The office code, and what it is not
At an office entrance, a screen shows a code that lasts well under a minute and works once. Staff scan it with their phone to record arriving or leaving, so a photographed or forwarded code is useless by the time it arrives. It is built, and switched off until each company’s security checks are done.
Greek employers covered by the Digital Work Card have to report start and end of work to the state’s system within minutes, through routes the state approves. A scan in our portal is not that, and the portal says so: it never labels a check-in as a work-card record. Connecting the two is a separate piece of work, to be done only once the official route and the company’s own advisers have signed it off. A tool that looks compliant but is not is worse than one that is honest about it.
Where we were deliberately conservative
It does not calculate anyone’s statutory leave entitlement, public holidays, pay, or leave balance. Those rules depend on the company’s sector and its employment contracts, and they get checked by a labour lawyer before any code computes them. A sick-day request asks for no medical detail at all. Work schedules, leave policies and reporting lines are versioned, never overwritten, so what was true in March can still be seen in September.
What it runs on
A Next.js application in TypeScript, with Postgres at Neon in Frankfurt, Clerk for sign-in and the second factor, and Vercel for hosting, pinned to its Frankfurt region. Twenty-one tables across eleven migrations, twenty endpoints, sixteen screens — small enough that one person can read the whole schema in an afternoon, which is the point.
What actually changed
Nothing yet, and we would rather say so than dress a build up as a result. The portal works and is not yet in use at a company. This section gets written by the first one that uses it, with its own numbers.
Client anonymised. Most of this work touches commercial or operational internals; references available on a call.