(float) env('QR_PRICE_PER_QR_GHS', 5.0), 'min_topup_ghs' => (float) env('QR_MIN_TOPUP_GHS', 5.0), 'max_pdf_bytes' => (int) env('QR_MAX_PDF_BYTES', 104857600), // 100 MB /* | Uploaded images are downscaled and re-encoded before storage. These assets | are proxied through PHP to public bio pages, so an oversized original costs | a worker and full bandwidth on every single view — a 9000x6600 18MB cover | once accounted for ~1.6GB of 1.9GB of image traffic during a launch. */ 'image' => [ 'max_dimension' => (int) env('QR_IMAGE_MAX_DIMENSION', 2000), 'jpeg_quality' => (int) env('QR_IMAGE_JPEG_QUALITY', 82), // Small files are stored untouched rather than lossily re-encoded. 'passthrough_bytes' => (int) env('QR_IMAGE_PASSTHROUGH_BYTES', 512000), ], 'short_code_length' => (int) env('QR_SHORT_CODE_LENGTH', 8), 'scan_unique_window_hours' => (int) env('QR_SCAN_UNIQUE_WINDOW_HOURS', 24), ];