Ownware
Home›Leavora›Quickstart
Leavora · Quickstart

Leavora Quickstart, as shipped in the download

The QUICKSTART.txt in the download — the same steps your delivery email carries.

LEAVORA — QUICKSTART
====================

Self-hosted staff leave & PTO tracker — PHP + MySQL/SQLite. Tracks leave only
(no payroll, no payment processing, no cards or crypto).


REQUIREMENTS
------------
  - PHP 8.0+ with extensions: pdo, pdo_sqlite (or pdo_mysql)
  - MySQL 5.7+ / MariaDB 10+ OR SQLite 3 (SQLite requires no extra setup)
  - A web server (Apache with mod_rewrite, or Nginx with try_files)
  - No Composer packages, no API keys, no external services.


SHARED HOSTING / CPANEL (RECOMMENDED FOR MOST BUYERS)
------------------------------------------------------
1. Upload the contents of the `app/` folder to your web root (e.g. public_html/)
   or a subdirectory (e.g. public_html/leavora/).

2. Make sure this directory is writable by PHP:
     data/

   Via cPanel File Manager: right-click -> Permissions -> set to 755 or 775.

3. Visit https://yourdomain.com/install/ in your browser.

4. Fill in the installer:
     - Database: choose MySQL (fill in host/name/user/pass) or SQLite (no setup)
     - Business name, timezone
     - Your admin name, email + password

5. The installer writes config.php, seeds starter leave types, and redirects you
   to the login page.

6. Log in, then:
     - Under Settings, set your leave-year start (e.g. Jan 1 or Apr 1) and which
       days are the weekend (non-working).
     - Add your employees (Employees > New), each with a start date and manager.
     - Review/adjust leave types under Setup > Leave types (accrual + carryover).
     - Add company holidays under Setup > Holidays.
     - Record and approve leave requests from the Leave requests page.


TRY IT WITH DEMO DATA FIRST
---------------------------
  - On the dashboard, click "Load demo data" for a sample studio team with
    accruing leave types, holidays, and a mix of approved/pending requests
    (including a span that crosses a weekend and a holiday). Then "Reset all
    data" when done.
  - Or from the command line:  php bin/demo.php
      (login: admin@leavora.app / admin123)


VPS / SELF-HOSTED (APACHE)
--------------------------
  <VirtualHost *:80>
    DocumentRoot /var/www/leavora/app
    <Directory /var/www/leavora/app>
      AllowOverride All
      Require all granted
    </Directory>
  </VirtualHost>


NGINX
-----
  location / { try_files $uri /index.php?$query_string; }
  location ~ /\.(demo-mode) { deny all; }
  location ~* \.(sqlite)$   { deny all; }
  location ~ ^/(src|data|bin|tests|controllers)/ { deny all; }
  location = /config.php    { deny all; }


DOCKER (QUICK TEST)
-------------------
  docker run --rm -p 8080:8080 \
    -v "$(pwd)/app:/var/www/html" \
    -w /var/www/html \
    php:8.3-cli \
    php -S 0.0.0.0:8080 router.php

  Then visit http://localhost:8080/install/


LEAVE TYPES & ACCRUAL
---------------------
  - Annual method: the whole yearly entitlement is available when the leave year
    starts (prorated if the employee started part-way through the year).
  - Monthly method: one twelfth accrues each month; after a full year the balance
    equals the annual figure exactly.
  - None: never accrues (use for unpaid leave — still tracked and counted).
  - Carryover cap: the most unused days that roll into next year (0 = none).
  - Days can be fractional (e.g. 1.5) and single-day requests can be half-days.


REPORTS & EXPORTS
-----------------
  - Leave requests > Export CSV: all requests for the current filter, safe to open
    in Excel / Google Sheets (formula-injection hardened).
  - Employee page > Statement PDF: a genuine, dependency-free PDF with the
    employee's balances (carried / accrued / taken / pending / available) and their
    request history.


POST-INSTALL SECURITY CHECKLIST
--------------------------------
  [ ] config.php is protected (the .htaccess does this automatically)
  [ ] data/ is not web-accessible (.htaccess blocks it automatically)
  [ ] Use HTTPS in production
  [ ] Keep PHP updated


NOTES
-----
  * Leave amounts are stored as integer centidays (1 day = 100); no floating-point
    rounding touches an accrual or a balance.
  * Working-day counts exclude weekends and company holidays; the date math is
    UTC-anchored, so leave spans crossing a daylight-saving change count correctly.
  * Leavora tracks leave only. It is not payroll and does not calculate wages,
    process payments, or handle cards, bank transfers, or cryptocurrency.

← Back to Leavora · Manual · API · Test run

Affiliate program
Recommend tools people own — earn 35% on every sale. 90-day tracking, instant delivery, payouts by Lemon Squeezy.
Become an affiliate →