{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "frappe--hrms",
    "name": "Frappe HR",
    "tagline": "Open-source HR and payroll with shift types, assignments, checkins and auto attendance, reachable through the Frappe REST API.",
    "shortTagline": "Open-source HR and payroll",
    "description": "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.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "scheduling-staffing",
    "alternativeTo": [
      "BambooHR",
      "Rippling",
      "Gusto"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "Python",
        "JavaScript"
      ],
      "frameworks": [
        "Frappe Framework",
        "Frappe UI",
        "Vue"
      ],
      "packageManager": "bench",
      "database": [
        "MariaDB"
      ],
      "hostingTarget": [
        "docker",
        "frappe-cloud",
        "bench"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/frappe/hrms",
        "owner": "frappe",
        "name": "hrms",
        "license": "GPL-3.0",
        "stars": 8712,
        "lastCommit": "2026-09-01"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://docs.frappe.io/framework/user/en/api/rest",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Define shift types and assign shifts",
        "reachable": true,
        "evidence": "Shift Type and Shift Assignment doctypes (docs.frappe.io/hr/shift-management) through /api/resource/:doctype"
      },
      {
        "job": "Submit and approve shift requests",
        "reachable": true,
        "evidence": "Shift Request doctype; PUT on /api/resource updates status and docstatus"
      },
      {
        "job": "Record employee checkins and auto attendance",
        "reachable": true,
        "evidence": "Employee Checkin doctype; auto attendance runs from checkins when enabled on the Shift Type"
      },
      {
        "job": "Apply for and approve leave",
        "reachable": true,
        "evidence": "Leave Application doctype through /api/resource"
      },
      {
        "job": "Load regional holidays",
        "reachable": true,
        "evidence": "Holiday List doctype through /api/resource"
      },
      {
        "job": "File expense claims and advances",
        "reachable": true,
        "evidence": "Expense Claim doctype through /api/resource"
      },
      {
        "job": "Run payroll",
        "reachable": null,
        "evidence": "Payroll Entry doctype exists; creating slips is a whitelisted method call, not verified this run"
      },
      {
        "job": "Run attendance and leave reports",
        "reachable": null,
        "evidence": "query reports run through /api/method/frappe.desk.query_report.run; not verified for HR reports"
      },
      {
        "job": "Geolocated mobile check-in",
        "reachable": false,
        "evidence": "captured by the Frappe HR mobile app; the API stores the result"
      },
      {
        "job": "Roster or shift schedule calendar",
        "reachable": null,
        "evidence": "shift-management docs list no Shift Schedule doctype; confirm on the installed version"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/frappe/hrms"
          },
          {
            "kind": "container",
            "url": "https://github.com/frappe/hrms/tree/develop/docker",
            "command": "cd hrms/docker && docker-compose up"
          },
          {
            "kind": "installable",
            "url": "https://docs.frappe.io/hr",
            "command": "bench get-app hrms && bench --site <site> install-app hrms"
          }
        ]
      },
      {
        "name": "Frappe Cloud Sites",
        "price": {
          "amount": 5,
          "currency": "USD",
          "period": "month"
        },
        "open": true,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://frappecloud.com"
          }
        ]
      },
      {
        "name": "Frappe Cloud Servers",
        "price": {
          "amount": 20,
          "currency": "USD",
          "period": "month"
        },
        "open": true,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://frappe.io/hr/pricing"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or skills install target in the repo."
    },
    "customization": {
      "summary": "Deployment is configured in sites/<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.",
      "envVars": [],
      "configFiles": [
        "sites/<site>/site_config.json",
        "sites/common_site_config.json",
        "docker/docker-compose.yml",
        "docker/init.sh",
        "hrms/hooks.py (reference for overrides)"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 5
    },
    "useWhen": [
      "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"
    ],
    "accounts": [
      "Frappe Cloud (hosted editions only)"
    ],
    "active": true,
    "lastActivity": "2026-09-01",
    "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"
    ],
    "fit": {
      "adaptable": 2,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: web application on Frappe Framework with a Vue UI and a mobile app",
      "executionModel": "no model SDK or AI feature in README or docs pages read",
      "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",
      "effort": "docker/docker-compose.yml and docker/init.sh in repo; site_config.json is the Frappe deployment surface",
      "editions": "frappe.io/hr/pricing: self-hosting free; Frappe Cloud Sites from USD 5 per month, Servers from USD 20",
      "active": "shortlist pushedAt 2026-09-01"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.9,
      "operability": 0.9,
      "effort": 0.6,
      "reach": 0.75,
      "editions": 0.8
    },
    "openQuestions": [
      "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": [
      {
        "url": "https://github.com/frappe/hrms",
        "foundBy": "sourcing:scheduling-staffing:curated"
      },
      {
        "url": "https://docs.frappe.io/hr/introduction",
        "foundBy": "sourcing:scheduling-staffing:curated"
      },
      {
        "url": "https://docs.frappe.io/hr/shift-management",
        "foundBy": "analysis:scheduling-staffing"
      },
      {
        "url": "https://docs.frappe.io/framework/user/en/api/rest",
        "foundBy": "analysis:scheduling-staffing"
      },
      {
        "url": "https://frappe.io/hr/pricing",
        "foundBy": "analysis:scheduling-staffing"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official framework REST API reaches every shift and attendance doctype; adaptation is framework-shaped and copyleft, so adaptable 2.",
      "disputed": []
    },
    "url": "apps/frappe--hrms.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/frappe--hrms.json"
  }
}
