Skip to content

Spranz Management Tool - Performance Analysis

Server: designer.spranz.de (23.88.122.78, Hetzner) SSH: ssh spranz-live (adminwayne key) Tool path: /var/www/designer.spranz.de/managementtool/ (aliased to /spranzmanagementtool/ in nginx) Dev Project: PROJ-2026-0053

This page documents a performance investigation conducted on 13 March 2026, based on nginx access log analysis covering 27 Feb – 13 Mar 2026 (161,253 total requests), plus the deployment of a live performance monitoring dashboard.


A live monitoring dashboard was deployed at:

https://designer.spranz.de/spranzmanagementtool/perf-dashboard/

It is also accessible via the ⏱ .perf button in the tool’s navigation bar.

EventDescription
page.loadFull page load time with TTFB, DNS, connect, transfer breakdown
page.dom_readyDOMContentLoaded time
api.*Every SpranzTool.fetchApi() call, auto-timed
thumbnails.batchBatch stats every 50 thumbnails (avg/min/max ms)
thumbnails.completeFinal thumbnail summary on page leave (total, avg, p95)
FilePurpose
managementtool/api/perf-log.phpAccepts batched events via sendBeacon, writes to logs/perf-YYYY-MM-DD.jsonl
managementtool/assets/js/perf.jsClient-side monitor, loads on every page
managementtool/perf-dashboard/index.phpDashboard UI with Chart.js, auto-refreshes every 15s
managementtool/includes/header.phpPatched to load perf.js and expose .perf nav link

🔴 Critical: PostgreSQL auth failure on every editor load

Section titled “🔴 Critical: PostgreSQL auth failure on every editor load”
pg_connect(): Unable to connect to PostgreSQL server —
FATAL: password authentication failed for user "postgres"
in /var/www/designer.spranz.de/managementtool/editor/index.php on line 15

The editor still functions (falls back to file-based storage), but the failed connection attempt adds latency on every load.

Fix: Correct the PostgreSQL credentials in editor/index.php line 15, or remove the pg_connect() call if local DB is not used on this server.


🔴 Critical: save-project.php returning HTTP 500 (61 errors)

Section titled “🔴 Critical: save-project.php returning HTTP 500 (61 errors)”

Timeline of 500 errors:

DateCountWindow
3 Mar120:39
5 Mar115:59
6 Mar1008:22–14:15
9 Mar40+06:46–11:28
11 Mar713:27–13:46
12 Mar2(update/add technique)

Response body is only 56 bytes — a short error message. The error handling in save-project.php needs investigation, likely a database write failure.


🟠 High: load-project.php serving files up to 28 MB

Section titled “🟠 High: load-project.php serving files up to 28 MB”
SKUResponse sizeTimes loaded
9323-00.00128.3 MB1
382-69.00110.8 MB
101-56.0019.6 MB1
3391-00.0287.5 MB
426-AB.0016.9 MB
377-00.0045.4 MB

Fix options:

  • Enable gzip compression on the endpoint (quick win)
  • Split large SVG projects into lazy-loaded layers
  • Store project data normalised rather than as a single JSON blob

🟠 High: log-frontend.php = 67% of all traffic

Section titled “🟠 High: log-frontend.php = 67% of all traffic”

Fix: Batch log calls (debounce/queue), add rate limiting, or reduce logging verbosity in production (SpranzTool.config.debug = false).


🟡 Medium: Thumbnail loading — 47 client timeouts (HTTP 499)

Section titled “🟡 Medium: Thumbnail loading — 47 client timeouts (HTTP 499)”

The pdf-browser loads all 619 thumbnails simultaneously with no lazy loading. The browser fires 619 individual requests to pdf-thumbnail.php on page load, saturating the server. On 47 occasions the browser gave up waiting (HTTP 499).

Fix: Use IntersectionObserver to only load thumbnails as they scroll into view. Already partially instrumented in perf.js — the dashboard will show real batch timing data once usage accumulates.


Several PDFs are referenced but missing from disk:

FileNotes
101-16.001.pdf
245-58.001.pdf
775-00.001neu.pdfFile exists as 775-00.001Neu.pdfcase mismatch
6309-00.001.pdf
3391-00.001.pdf
6350-00.001.pdf
522-00.001.pdf
371-00.001.pdf

The 775-00.001neu.pdf case mismatch suggests a naming convention issue. Linux filesystems are case-sensitive.


MetricValue
Total requests161,253
HTTP 200128,661 (80%)
HTTP 304 (not modified)32,411 (20%)
HTTP 50069
HTTP 499 (client timeout)64
HTTP 40443
EndpointHits
2dtool/api/log-frontend.php108,900
api/pdf-thumbnail.php41,384
2dtool/api/save-svg-2d.php1,710
2dtool/api/project-api.php1,077
editor/api/upload-pdf-convert.php431
editor/api/load-project.php252
editor/api/create-pdf-fast.php190

  1. Fix PostgreSQL credentials in editor/index.php:15 — low effort, removes error noise on every load
  2. Investigate save-project.php 500 errors — users are losing work
  3. Enable gzip on load-project.php — quick win for large project files
  4. Lazy-load thumbnails in pdf-browser — fixes the 619-request flood
  5. Reduce log-frontend.php call frequency in 2dtool — reduces 67% of server load
  6. Fix PDF filename casing — at minimum fix 775-00.001neu775-00.001Neu