Everything to deploy, configure & integrate
Practical guides for admins and developers — from your first install to your first API call.
Introduction
Oman HRM is a self-hosted HR platform that runs on your own infrastructure. The three surfaces — admin, self-service and mobile — share a single database and one JSON API.
Because everything is self-hosted, your employee data stays entirely within your network.
Self-hosted deployment
Deploy with Docker on any Linux server. Recommended minimum: 2 vCPUs, 4 GB RAM and 20 GB storage.
git clone https://git.omanhrm.local/ohrm.git
cd ohrm && docker compose up -d
# the app is now on http://localhost:8080
Environment variables
- DB_URL — PostgreSQL connection string
- DEFAULT_LOCALE — en or ar
- CURRENCY — defaults to OMR
Importing employees
Upload a CSV from Admin → Employees → Import. Columns are mapped to fields, and rows are validated before commit.
Download the CSV template from the same screen to guarantee your columns line up.
Payroll & WPS
Define salary components (basic, allowances, deductions), run a cycle, then generate the SIF file for the Wage Protection System. All amounts are in OMR to 3 decimals.
Example: net pay
# e.g. 6,500.00 + 2,000.00 − 350.00 − 500.00 = 7,650.00 OMR
EOSB / gratuity
The logic applies each country's rules. For Oman: the legacy scheme applies roughly one month of basic wage per year of continuous service, while post-reform employees are covered through mandatory social insurance.
Try the live calculator on the Oman compliance page.
Leave & attendance
Create leave types, set balances and approval workflows. Employees clock in/out from web, mobile or kiosk, and hours flow into payroll.
JSON API
Every surface is built on a REST API that returns JSON. Authenticate with a Bearer token from Admin → Developers.
Authorization: Bearer
{
"id": 101,
"name": "Mohammed Ali",
"department": "Operations",
"basic_salary": "6500.00"
}
Webhooks
Subscribe to events like leave.approved, payroll.finalized and document.expiring to trigger your own systems.
Every webhook is sent with a signature so you can verify its origin.
Can't find what you need?
Our support team is happy to help with deployment or integration.