# Installing JasperWho?

<div style="text-align: justify;">

JasperWho? is a standard Laravel application. The setup is intentionally slim — pull the repository, install dependencies, configure the environment, migrate the database. A standard installation is up and running in under 30 minutes.

---

<h3 id="what-you-dont-need" style="color: #203671; margin-top: 2.2em;">What You Don't Need</h3>

Before listing what is required, it is worth being explicit about what is not:

- **No Java** — the render engine is pure PHP. No JVM, no Java runtime, no Java SQL drivers.
- **No Node.js / npm / Vite** — the frontend assets are pre-built and bundled with the repository.
- **No Jaspersoft Server** — JasperWho? is entirely self-contained.
- **No Docker** — optional for the database only, not required for the application itself.

---

<h3 id="system-requirements" style="color: #203671; margin-top: 2.2em;">System Requirements</h3>

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Requirement</th>
      <th style="text-align: left; padding: 6px 10px;">Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">PHP &gt;= 8.2</td>
      <td style="padding: 6px 10px;">Required extensions: <code>ctype</code>, <code>curl</code>, <code>fileinfo</code>, <code>filter</code>, <code>hash</code>, <code>mbstring</code>, <code>openssl</code>, <code>pcntl</code>, <code>pdo</code>, <code>pdo_sqlite</code>, <code>posix</code>, <code>session</code>, <code>simplexml</code>, <code>tokenizer</code>. For report database connections, additionally: <code>pdo_mysql</code> (MySQL / MariaDB), <code>pdo_pgsql</code> (PostgreSQL). SQL Server is listed separately below.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">Composer</td>
      <td style="padding: 6px 10px;">PHP dependency manager — <a href="https://getcomposer.org">getcomposer.org</a></td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">MySQL or MariaDB</td>
      <td style="padding: 6px 10px;">JasperWho?'s own application database. A Docker container works fine if no local instance is available.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">poppler-utils</td>
      <td style="padding: 6px 10px;">Provides <code>pdftoppm</code>, used for generating report thumbnails. Install via <code>apt install poppler-utils</code>.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">Supervisor</td>
      <td style="padding: 6px 10px;">Keeps the Laravel queue worker running for background jobs (thumbnail generation, purge tasks).</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">Apache2 or nginx</td>
      <td style="padding: 6px 10px;">Optional reverse proxy. Not required for local or development setups.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;">php-sqlsrv / pdo_sqlsrv</td>
      <td style="padding: 6px 10px;">Only required when connecting to Microsoft SQL Server as a report data source. Not needed otherwise.</td>
    </tr>
  </tbody>
</table>

<h4 style="color: #203671; margin-top: 1.4em;">Bundled Dependencies</h4>

The following components are bundled with JasperWho? — no separate installation required:

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Component</th>
      <th style="text-align: left; padding: 6px 10px;">Purpose</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://github.com/QuilhaSoft/JasperPHP">JasperPHP</a></td>
      <td style="padding: 6px 10px;">Pure PHP render engine — parses <code>.jrxml</code> and generates PDFs via TCPDF. Installed automatically by Composer.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://github.com/opcodesio/log-viewer">Log Viewer</a></td>
      <td style="padding: 6px 10px;">In-browser Laravel log viewer for monitoring application logs.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://scribe.knuckles.wtf/">Scribe</a></td>
      <td style="padding: 6px 10px;">Generates the interactive API documentation from source annotations.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://github.com/google/material-design-icons/tree/master/variablefont">Material Design Icons</a></td>
      <td style="padding: 6px 10px;">Icon set used throughout the frontend.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://ace.c9.io/">Ace Editor</a></td>
      <td style="padding: 6px 10px;">In-browser code editor for writing SQL queries.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;"><a href="https://github.com/sinister-labs/sinister-labs">Logo &amp; Color Concept</a></td>
      <td style="padding: 6px 10px;">Visual identity by sinister-labs.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;">Jaspersoft Studio 6.21.5</td>
      <td style="padding: 6px 10px;">Desktop IDE for designing <code>.jrxml</code> report templates. Installed separately on the designer's machine — not on the server. <a href="https://community.jaspersoft.com/download-jaspersoft/community-edition/jaspersoft-studio_windows_6.x">Download here.</a></td>
    </tr>
  </tbody>
</table>


---

<h3 id="deployment-options" style="color: #203671; margin-top: 2.2em;">Deployment Options</h3>

JasperWho? can be deployed in two ways: self-hosted on your own infrastructure, or fully managed and operated by kiwi software. Both options deliver identical functionality — the choice depends on your team's operational preferences and existing infrastructure.

<h4 id="self-hosted" style="color: #203671; margin-top: 1.4em;">Self-Hosted</h4>

You run JasperWho? on your own servers. The infrastructure footprint is intentionally small — no Java runtime, no application server, no container orchestration required. A single modest Linux VPS covers all but the most demanding workloads.

<table style="width: 100%; border-collapse: collapse;">
  <thead>
    <tr style="border-top: 1px solid #e6e8ef; border-bottom: 1px solid #e6e8ef;">
      <th style="text-align: left; padding: 6px 10px; white-space: nowrap;">Component</th>
      <th style="text-align: left; padding: 6px 10px;">Minimum</th>
      <th style="text-align: left; padding: 6px 10px;">Recommended</th>
      <th style="text-align: left; padding: 6px 10px;">Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">JasperWho? server (Linux)</td>
      <td style="padding: 6px 10px;">1 vCPU, 1 GB RAM</td>
      <td style="padding: 6px 10px;">2 vCPU, 4 GB RAM</td>
      <td style="padding: 6px 10px;">A <a href="https://www.hetzner.com/cloud/">Hetzner CX22</a> (2 vCPU, 4 GB RAM, 40 GB NVMe) is more than sufficient for most deployments. Any comparable entry-level VPS or on-premises Linux server works equally well.</td>
    </tr>
    <tr style="border-bottom: 1px solid #e6e8ef;">
      <td style="padding: 6px 10px; white-space: nowrap;">Disk</td>
      <td style="padding: 6px 10px;">10 GB</td>
      <td style="padding: 6px 10px;">40 GB</td>
      <td style="padding: 6px 10px;">Application and report thumbnails. Scale with report volume and history retention period.</td>
    </tr>
    <tr>
      <td style="padding: 6px 10px; white-space: nowrap;">Background Printing Service (Windows)</td>
      <td colspan="2" style="padding: 6px 10px;">Any Windows 10/11 machine or Windows Server with the target printers installed</td>
      <td style="padding: 6px 10px;">Runs as a lightweight console process — a few dozen MB of memory, negligible CPU. In most deployments, an existing Windows PC on the shop floor or in the office serves as the print host. No dedicated hardware required.</td>
    </tr>
  </tbody>
</table>

<div style="border-left: 4px solid #5fc75d; background: #f6fdf6; padding: 10px 16px; margin: 16px 0; border-radius: 0 4px 4px 0;">
ℹ️ <strong>MySQL and JasperWho? can share the same VM</strong> for small to medium deployments. A dedicated database server is only worth considering when multiple JasperWho? instances share one database, or under very high render throughput.
</div>

<h4 id="managed-hosting" style="color: #203671; margin-top: 1.4em;">Managed Hosting</h4>

If you prefer not to manage infrastructure yourself, JasperWho? can be hosted and operated for you. Instances run exclusively in Germany on Hetzner hardware — reliable, fast, and GDPR-compliant by location. Updates, monitoring, and backups are handled on your behalf.

Managed hosting works well for most use cases. Depending on your network connection to the hosting location, render requests may see slightly higher latency compared to a locally deployed instance — typically not noticeable, but worth considering for high-frequency, latency-sensitive workloads such as real-time label printing on the shop floor.

For managed hosting enquiries, get in touch directly.

</div>