# Frappe HR

Open-source HR and payroll with shift types, assignments, checkins and auto attendance, reachable through the Frappe REST API.

Frappe HR is a full HRMS on the Frappe Framework: employee lifecycle, shift management (Shift Type, Shift Assignment, Shift Request, Employee Checkin with auto attendance), leave, expenses, appraisals and payroll, plus a mobile app. Every doctype is exposed through the framework's /api/resource REST API with token auth, published by the same organization. Self-hosting is free; Frappe Cloud hosts it from USD 5 per month.

Alternative to: BambooHR, Rippling, Gusto

- Capabilities: adaptable, operable
- Vertical: scheduling-staffing
- Shape: business-app
- Form factor: web-app
- Execution model: deterministic
- Provenance: human-written (recorded, never ranked)
- Repo: https://github.com/frappe/hrms (GPL-3.0), 8712 stars, last commit 2026-09-01
- Last activity: 2026-09-01
- Page: apps/frappe--hrms.html
- JSON: apps/frappe--hrms.json

## Use it when

- I run shifts for hourly staff and want checkins to become attendance and leave balances automatically
- I want my agent to assign shifts, approve leave and pull attendance through one API rather than three HR tools

## Gotchas

- Requires ERPNext installed on the same site (README: bench get-app erpnext before hrms); this is not a standalone app
- GPL-3.0 per the repository; frappe.io/hr/pricing says AGPL-3.0, so check LICENSE before redistributing
- Framework-shaped: bench, sites and doctypes have a learning curve; customizing in the hrms repo directly makes upgrades painful
- Shift scheduling is shift assignment plus checkins, not drag-and-drop rostering

## Editions

- Self-hosted: Free, open source
  - source: https://github.com/frappe/hrms
  - container: cd hrms/docker && docker-compose up
  - installable: bench get-app hrms && bench --site &lt;site> install-app hrms
- Frappe Cloud Sites: $5 per month, open source
  - hosted: https://frappecloud.com
- Frappe Cloud Servers: $20 per month, open source
  - hosted: https://frappe.io/hr/pricing

## Adaptable: make it yours

Effort: config-only (5 things to edit)

Deployment is configured in sites/&lt;site>/site_config.json and sites/common_site_config.json (database, redis, mail, encryption key); docker/docker-compose.yml and docker/init.sh bootstrap a site. Shift types, leave policies, holiday lists and approval workflows are records you create in the app, and field or form changes use Customize Form and Server Script without touching code. Code-level changes belong in a small custom app whose hooks.py overrides Frappe HR, not in the hrms repo itself.

- Env vars: none
- Config files: sites/&lt;site>/site_config.json, sites/common_site_config.json, docker/docker-compose.yml, docker/init.sh, hrms/hooks.py (reference for overrides)
- Prompt files: none
- Accounts you'll need: Frappe Cloud (hosted editions only)

## Operable: what an agent can drive

Operability: official. Interface: api at https://docs.frappe.io/framework/user/en/api/rest (published by the builder, both).

### Reach (partial coverage)

- Define shift types and assign shifts: reachable. Shift Type and Shift Assignment doctypes (docs.frappe.io/hr/shift-management) through /api/resource/:doctype
- Submit and approve shift requests: reachable. Shift Request doctype; PUT on /api/resource updates status and docstatus
- Record employee checkins and auto attendance: reachable. Employee Checkin doctype; auto attendance runs from checkins when enabled on the Shift Type
- Apply for and approve leave: reachable. Leave Application doctype through /api/resource
- Load regional holidays: reachable. Holiday List doctype through /api/resource
- File expense claims and advances: reachable. Expense Claim doctype through /api/resource
- Run payroll: undetermined. Payroll Entry doctype exists; creating slips is a whitelisted method call, not verified this run
- Run attendance and leave reports: undetermined. query reports run through /api/method/frappe.desk.query_report.run; not verified for HR reports
- Geolocated mobile check-in: not reachable. captured by the Frappe HR mobile app; the API stores the result
- Roster or shift schedule calendar: undetermined. shift-management docs list no Shift Schedule doctype; confirm on the installed version

## Code stack

- Languages: Python, JavaScript
- Frameworks: Frappe Framework, Frappe UI, Vue
- Package manager: bench
- Database: MariaDB
- Hosting target: docker, frappe-cloud, bench

## Evidence and confidence

- formFactor: README: web application on Frappe Framework with a Vue UI and a mobile app (confidence 0.95)
- executionModel: no model SDK or AI feature in README or docs pages read (confidence 0.9)
- operability: docs.frappe.io/framework/user/en/api/rest: /api/resource/:doctype and token api_key:api_secret, published by Frappe Technologies which also ships hrms (confidence 0.9)
- effort: docker/docker-compose.yml and docker/init.sh in repo; site_config.json is the Frappe deployment surface (confidence 0.6)
- editions: frappe.io/hr/pricing: self-hosting free; Frappe Cloud Sites from USD 5 per month, Servers from USD 20 (confidence 0.8)
- active: shortlist pushedAt 2026-09-01
- reach:  (confidence 0.75)

## Open questions

- Does the installed version include Shift Schedule and Shift Schedule Assignment doctypes for recurring rosters?
- Which license applies: repo metadata says GPL-3.0, the pricing page says AGPL-3.0
- Is the Frappe REST API rate-limited or restricted on Frappe Cloud Sites plans?

## Sources

- https://github.com/frappe/hrms (sourcing:scheduling-staffing:curated)
- https://docs.frappe.io/hr/introduction (sourcing:scheduling-staffing:curated)
- https://docs.frappe.io/hr/shift-management (analysis:scheduling-staffing)
- https://docs.frappe.io/framework/user/en/api/rest (analysis:scheduling-staffing)
- https://frappe.io/hr/pricing (analysis:scheduling-staffing)
