Frappe HR
Complete open-source HRMS for employee lifecycle, attendance, payroll, and performance — built on Frappe Framework with a mobile PWA.
Frappe HR is a comprehensive open-source Human Resource Management System that unifies every stage of the employee lifecycle — from job openings and onboarding through leave management, payroll processing, performance appraisals, and exit interviews — into a single platform. Built on the Frappe Framework with ERPNext integration, it eliminates the need to reconcile HR and finance data across separate tools.
The system is purpose-built for organizations that want full ownership of their HR data and workflows. Its low-code Frappe Framework foundation lets administrators define custom doctypes, approval workflows, print formats, and reports without writing application code. Regional payroll compliance (including India-specific HRA exemption and income tax slab calculations) is built in, making it practical for businesses operating across different jurisdictions.
Frappe HR ships with three distinct frontends: the full-featured Frappe Desk for HR managers, a Progressive Web App (PWA) built with Vue.js and Ionic for employee self-service on mobile, and a dedicated Roster module (TypeScript + Vue 3) for shift scheduling and attendance management. Deployment options include Docker Compose for local development, Frappe Bench for on-premises production, and Frappe Cloud for managed hosting.
What You Get
- Employee Lifecycle Management - Track every stage from job applicant and onboarding through promotions, transfers, and exit interviews, with task-based boarding workflows that auto-create Frappe projects and assign activities to responsible parties.
- Attendance, Shifts, and Geolocation Check-In - Process auto-attendance from shift types, manage shift assignments and schedules through the dedicated Roster module, and capture employee check-ins with GPS coordinates via the mobile PWA.
- Payroll Engine with Regional Tax Compliance - Define salary structures with formula-based components, configure income tax slabs, process standard and off-cycle runs, handle additional salaries and arrears, and generate compliant salary slips — with built-in India-specific HRA and marginal relief calculations.
- Leave and Holiday Management - Configure multiple leave types and policies, pull regional holiday calendars with a click, track leave balances and encashments, and set up compensatory leave workflows with multi-level approvals.
- Performance Appraisals with KRA Alignment - Create appraisal cycles and templates with weighted KRAs, enable employee self-evaluations, collect peer feedback ratings, and track goal progress through configurable review forms.
- Expense Claims and Advances with GL Integration - Submit and approve employee advances and expense claims through configurable multi-level workflows, with automatic journal entries posted to ERPNext accounts on approval.
- Employee Self-Service PWA - Built with Vue.js and Ionic, the mobile PWA lets employees apply for leaves, check in or out with geolocation, view pay slips, access their profile, and receive real-time push notifications for approvals.
- Low-Code Customization via Frappe Framework - Extend doctypes, build custom reports, create print formats, and configure approval workflows using Frappe’s desk builder and scripting tools — no custom application code required for most HR customizations.
Common Use Cases
- Multi-location payroll processing - A manufacturing company with branches across multiple states uses Frappe HR to process region-specific salary structures, apply state-level tax slabs, and auto-post payroll entries to ERPNext cost centers for each location.
- Remote team leave and attendance management - A distributed SaaS team relies on the Frappe HR PWA for employees to submit leave requests and check in daily from their phones, with managers approving requests from their mobile devices via push notifications.
- Shift-based workforce scheduling - A logistics company uses the Roster module to assign rotating shifts across departments, automatically mark attendance based on shift type rules, and generate shift attendance reports without manual data entry.
- Replacing proprietary HRMS to eliminate per-seat fees - A growing nonprofit migrates off a commercial HRMS to Frappe HR on Frappe Cloud, preserving all employee records and cutting recurring SaaS licensing costs while gaining full data ownership.
Under The Hood
Architecture
Frappe HR is structured as a Frappe Framework application — a layered monolith where business entities are defined as DOCTYPEs (declarative JSON schemas plus Python controller classes). Each module (hr, payroll, regional) is a Python package with its own doctype directory, controllers, and scheduled job registrations. Cross-module coupling is managed entirely through Frappe’s lifecycle hooks system: document events like on_submit, on_cancel, and validate trigger handlers registered in hooks.py, keeping the salary slip, expense claim, payroll entry, and accounting modules loosely coupled without a separate message broker. Regional compliance overrides (India HRA, UAE) are registered as named override functions in hooks.py, allowing country-specific payroll logic to be swapped in declaratively rather than through conditionals scattered through the core.
Tech Stack
The backend is Python 3.10+ running on the Frappe Framework, which provides ORM-style database access over MariaDB, a REST API layer, background job queuing via Redis, and a role-based permission engine. Frontend surfaces split into three dedicated apps: the classic Frappe Desk (server-rendered with client-side JS bundles managed by Ruff-linted Python + Vite), the employee PWA built with Vue.js 3 and Ionic for a native-like mobile experience, and the Roster shift-scheduling module written in TypeScript with Vue 3 and Tailwind CSS. Yarn workspaces manage the multi-frontend monorepo, and pre-commit hooks run Ruff (Python linting and formatting) plus Prettier and commitlint for JavaScript — ensuring consistent code style across both language stacks. The Crowdin integration with automated .pot/.po file generation handles localization for international deployments.
Code Quality
The codebase maintains an extensive automated test suite with 125 test files covering doctype controllers, scheduled jobs, regional overrides, and cross-module interactions. A shared before_tests setup function in hrms/tests/test_utils.py standardizes test environment initialization. Mixin classes (AppraisalMixin, PWANotificationsMixin) extract shared validation and notification logic, keeping controllers focused. The payroll module uses a _safe_eval abstraction for formula evaluation in salary components — an explicit boundary that prevents arbitrary code execution in user-defined salary formulas. Type annotations are present on whitelisted API methods (enforced by require_type_annotated_api_methods = True in hooks) but absent from most internal controller methods, reflecting a pragmatic trade-off given Frappe’s dynamic ORM. CI runs Python unit tests across three parallel matrix containers on every pull request and nightly, with Codecov tracking coverage trends.
What Makes It Unique
Frappe HR’s most distinctive characteristic is its deep integration with ERPNext accounting as a first-class design constraint, not an afterthought — payroll entries, expense claims, employee advances, and leave encashments all generate double-entry accounting records automatically, making it one of the few open-source HRMS solutions where HR and finance operate from a single source of truth. The Roster module adds a dedicated TypeScript frontend for shift scheduling with calendar-driven UX, while the Ionic-based PWA delivers geolocation check-in and push-notification-driven approvals without requiring app store distribution. The regional override pattern in hooks.py means jurisdiction-specific payroll logic (India, UAE, and potentially others) can be contributed as isolated modules without forking the core — a genuinely extensible compliance architecture.
Self-Hosting
Frappe HR is licensed under the GNU General Public License v3.0 (GPLv3), a strong copyleft license. For self-hosters, GPLv3 means you can run, modify, and distribute the software freely — but if you distribute a modified version to others (outside your organization), you must release those modifications under the same license. Internal deployments within a single organization, including modifications used only internally, do not trigger the distribution requirement, so most self-hosting scenarios carry no GPL obligation beyond what you’d voluntarily choose to share.
Operationally, self-hosting Frappe HR is non-trivial. The application requires Python 3.10+, MariaDB, Redis, and the Frappe bench toolchain. The recommended production path uses Frappe Bench — a Python-based site management tool — which handles multi-site setups, background workers, scheduled jobs, and asset building. Docker Compose is available for local development but not recommended for production use without additional hardening. You are responsible for database backups, server patching, Frappe Framework upgrades (coordinated with ERPNext and hrms version pinning), and monitoring worker queues. The application ships frequent releases (multiple per week across v15 and v16 branches), so keeping up requires an active maintenance posture. Team size and infrastructure complexity scale significantly with employee count and transaction volume.
Frappe Cloud (frappecloud.com) offers a managed hosting alternative where infrastructure, upgrades, monitoring, backups, and support are handled by Frappe Technologies. The cloud tier adds SLA-backed uptime, automated database backups with point-in-time recovery, and access to enterprise support channels — none of which come with self-hosted deployments. For organizations without dedicated DevOps capacity, Frappe Cloud substantially reduces the operational burden while keeping the same codebase and feature set. The platform is itself open-source (the frappe/press repository), so organizations with the technical resources could in principle self-host the hosting platform as well.