Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/juanmatz/inspection-form-euroautos/llms.txt

Use this file to discover all available pages before exploring further.

This guide covers the most common issues encountered when using or deploying the Euroautos Inspection Form, with step-by-step resolution instructions. Issues are grouped by functional area. If the problem you are experiencing is not listed here, please check the FAQ or open an issue on the project repository.

Camera and Photos

Symptoms: Tapping the camera icon shows an error banner reading “Acceso a la cámara denegado”, or the browser never displays a permission prompt.Cause: Browser camera access requires the app to be served over a secure origin (HTTPS). When accessed over plain HTTP, browsers silently block camera APIs without showing a permission dialog — this is particularly common when the PWA has been installed from an HTTP URL.Resolution:
1

Verify the app is served over HTTPS

Check the address bar. You should see a padlock icon next to the URL. If the URL begins with http://, contact your system administrator to enable HTTPS for the deployment. For local development, use localhost (which browsers treat as a secure origin) or configure a self-signed certificate with vite --https.
2

Check browser site permissions

If the app is served over HTTPS but the camera still doesn’t work:
  • Chrome / Edge: Click the padlock icon in the address bar → Site settingsCamera → change to Allow.
  • Firefox: Click the padlock → Connection secureMore informationPermissionsUse the Camera → uncheck Use Default.
  • Safari: Go to SettingsSafariCamera → set to Allow.
3

Reinstall the PWA from HTTPS

If the app was previously installed as a PWA from an HTTP URL, the old installation may have cached the permission denial. Uninstall the PWA from the home screen, navigate to the HTTPS URL in the browser, and reinstall from there.
4

iOS Safari — permission dialog not appearing

On iOS, the camera permission dialog for PWAs will not appear if the app was added to the home screen from an HTTP origin, or if the camera permission was previously denied. Go to iOS SettingsPrivacy & SecurityCamera → find Safari (or the PWA entry if listed separately) → set to Allow.
Symptoms: After capturing or selecting a photo, the image briefly appears in the preview then disappears, or an error message is shown: “No se pudo guardar la foto”.Possible causes and resolutions:1. Photo exceeds the maximum allowed sizeThe app rejects photos larger than VITE_MAX_PHOTO_SIZE_MB (default: 5 MB) after compression. This can happen with RAW or very high-resolution images from DSLR cameras transferred from the camera roll.
  • Try capturing the photo directly using the device camera rather than selecting from the gallery.
  • Lower the camera resolution in your device’s camera settings before retaking the photo.
  • Ask your administrator to increase the VITE_MAX_PHOTO_SIZE_MB limit and redeploy, if the workshop regularly works with high-resolution imagery.
2. Available storage is full or near the quotaIf IndexedDB storage is at or near capacity, the browser will throw a QuotaExceededError when attempting to write the photo.
  • Export completed inspections via SettingsAlmacenamientoExportar datos.
  • Delete completed inspections from the app to free up space.
  • See the Storage Limits section for more detail on quota management.
3. Unsupported image formatThe app expects JPEG or PNG input. HEIC/HEIF files (the default format on newer iPhones) may not be supported depending on the browser. Enable JPEG output in the iOS camera settings: SettingsCameraFormatsMost Compatible.

Offline and Sync

Symptoms: The sync status indicator in the app header remains in a pending or error state. Inspections completed on this device are not visible from other devices or the backend dashboard.Resolution:
1

Verify VITE_API_URL is configured

Backend sync is only active when VITE_API_URL is set at build time. If the environment variable was omitted from .env.production, the sync pipeline is disabled entirely. Check the value:
# In your project root
grep VITE_API_URL .env.production
If the variable is missing or empty, add it and rebuild:
VITE_API_URL=https://api.euroautos.example.com
2

Confirm the device is online

The app only attempts to sync when the browser reports an online state. Verify connectivity by navigating to another site. If the device is connected via VPN or a captive-portal Wi-Fi network, the browser may report online while DNS or routing to the API host is not working. Try accessing VITE_API_URL directly in a browser tab.
3

Check the Service Worker is active

Open DevTools (F12) → Application tab → Service Workers (left sidebar). Confirm that a service worker for the app’s origin is listed and its status shows activated and running. If the status is waiting or redundant, click skipWaiting or perform a hard refresh.
4

Inspect the sync_queue in IndexedDB

Open DevToolsApplicationIndexedDBeuroautossync_queue. If entries are present, the app has pending mutations that haven’t yet been sent. Note the type and inspectionId values of any stuck entries.If entries are present but sync never clears them, check the browser console for POST request failures to {VITE_API_URL}/api/v1/inspections. Common causes include CORS misconfiguration on the backend, an expired auth token, or a network firewall blocking outbound requests to the API host.
5

Manually trigger a sync attempt

Navigate to SettingsSincronizaciónSincronizar ahora to force an immediate sync attempt outside of the automatic online event cycle.
Symptoms: After redeploying the app, inspectors are still running an old version. The version number shown in SettingsAcerca de does not match the latest release.Cause: The browser’s service worker lifecycle requires an explicit activation step. By default, a new service worker waits until all tabs running the old version are closed before taking over.Resolution:
1

Hard refresh the page

Press Ctrl+Shift+R (Windows/Linux) or Cmd+Shift+R (macOS) to bypass the service worker cache and force a fresh page load. This will often pick up the new service worker.
2

Force update via DevTools

Open DevToolsApplicationService Workers. If a new service worker is listed as waiting to activate, click the skipWaiting button to force it to take over immediately.
3

Close all tabs for the app

If the above steps don’t work, close all browser tabs that have the Euroautos app open, then reopen it. The new service worker will activate on the next load.
4

Unregister and reload (last resort)

In DevToolsApplicationService Workers, click Unregister next to the current service worker, then reload the page. The app will re-register the latest service worker.
To prevent update delays in production, the app uses skipWaiting() in its service worker configuration by default. If your deployment has this disabled, consider re-enabling it in vite.config.ts under the VitePWA plugin options.

Report Generation

Symptoms: Tapping the Generar informe button appears to do nothing, or there is a brief flash of activity with no file download starting.Possible causes and resolutions:1. Browser pop-up blocker is intercepting the blob URLThe report is generated client-side and triggered as a programmatic click on a blob URL (blob://...). Some browsers’ pop-up blockers treat this as an unsolicited download and silently block it.
  • Check for a blocked pop-up notification in the address bar (typically a small icon on the right).
  • Click the notification and select Always allow downloads from this site.
  • Alternatively, try generating the report in Google Chrome, which has the most permissive handling of blob URL downloads.
2. The report generation process threw a JavaScript errorOpen DevToolsConsole and look for red error messages at the time you tap the button. Common errors include:
Error messageLikely cause
Cannot read properties of undefined (reading 'sections')Inspection data is malformed. Try reopening the inspection and saving it again.
jsPDF is not definedThe PDF library failed to load. Hard-refresh the page to re-fetch all assets.
Failed to load fontA custom font used in the PDF could not be fetched. Check that the app’s static assets are being served correctly.
3. iOS Safari restrictionSafari on iOS does not support programmatic blob URL downloads. Instead of a download, Safari will attempt to open the PDF in a new tab. If the new tab is blocked, nothing appears to happen.
  • Allow pop-ups for the app: iOS SettingsSafariBlock Pop-ups → toggle off.
  • Alternatively, use the Share button (once the PDF opens in the new tab) to save it to Files.
Symptoms: The PDF report is generated successfully, but the photo thumbnails for one or more checklist items are blank, show a placeholder icon, or are absent entirely.Resolution:
1

Confirm showPhotos is enabled

The report renderer accepts a showPhotos prop. If this is false, photos are intentionally excluded from the output. Check that the Incluir fotos toggle in the report settings dialog is turned on before generating.
2

Verify photos are present in IndexedDB

Open DevToolsApplicationIndexedDBeuroautosphotos. You should see entries with inspectionId values matching the inspection you are trying to print. If the store is empty or the relevant inspection’s photos are missing, the photos may have been lost due to a storage clear or failed save (see Photo fails to attach).
3

Check for Base64 decode errors in the console

If photo records exist in IndexedDB but still don’t appear in the report, open the console and look for errors during report generation. A corrupt or truncated Base64 string in a photo record will cause that specific image to be silently skipped.
4

Re-attach missing photos

If photos are confirmed missing from IndexedDB, you will need to re-attach them to the relevant checklist items. Open the inspection, navigate to the affected items, and capture or re-select the photos.

Installation and Build

Symptoms: Running npm run dev outputs an error such as:
Error: Cannot find module 'vite'
or
[vite] Internal server error: Failed to resolve import "react"
Cause: The node_modules directory is missing, corrupted, or out of date — often after pulling new commits that modified package.json or package-lock.json.Resolution:
1

Delete node_modules and the lockfile

rm -rf node_modules package-lock.json
2

Reinstall dependencies

npm install
3

Retry the dev server

npm run dev
If the error persists after a clean install, check that your local Node.js version meets the minimum requirement (>=18.0.0). Run node --version to verify, and use a version manager like nvm to switch if needed:
nvm install 20
nvm use 20
npm install
npm run dev
Symptoms: Running npm run build fails with an error such as:
[vite]: Rollup failed to resolve import — VITE_API_URL is not defined.
or the build completes but the deployed app shows blank fields or broken sync behaviour because required variables were not inlined at build time.Cause: Vite resolves import.meta.env.VITE_* variables at build time, not at runtime. If the required variables are not present in the environment when npm run build runs, they are replaced with undefined.Resolution:
1

Create or update .env.production

Create a .env.production file in the project root (if it doesn’t exist) and add all required variables:
VITE_API_URL=https://api.euroautos.example.com
VITE_WORKSHOP_ID=ws-euroautos-medellin
VITE_DEFAULT_LOCALE=es
VITE_MAX_PHOTO_SIZE_MB=5
VITE_ENABLE_REVIEW_WORKFLOW=false
2

Verify the file is not .gitignored for CI

If you are building in CI/CD, .env.production may be in .gitignore. In that case, inject the variables as CI environment variables and they will be picked up by Vite automatically. For GitHub Actions:
- name: Build
  env:
    VITE_API_URL: ${{ secrets.VITE_API_URL }}
    VITE_WORKSHOP_ID: ${{ vars.VITE_WORKSHOP_ID }}
  run: npm run build
3

Rebuild

npm run build

Storage

Symptoms: An error is logged to the console:
DOMException: QuotaExceededError: The quota has been exceeded.
This may be accompanied by a toast notification in the app: “No se pudo guardar. Almacenamiento lleno.”Cause: The browser’s IndexedDB storage quota for the app’s origin has been exhausted. This is most commonly caused by a large number of high-resolution photos accumulating without being cleared.Resolution:
1

Export all local inspections

Go to SettingsAlmacenamientoExportar datos. This downloads a JSON file containing all inspections and photos. Save it somewhere safe before proceeding.
2

Clear completed inspections

In the inspection list, filter by Completadas and select all completed inspections. Use Eliminar selección to remove them from local storage. This should free up significant space.
3

Check remaining quota in DevTools

Open DevToolsApplicationStorage (left sidebar). The Storage usage section shows a breakdown of usage by type and the total quota. Confirm that the usage has dropped after deletion.
4

Request persistent storage (optional)

Browsers may allocate more quota and protect data from eviction if the origin is granted persistent storage. The app requests this automatically on first launch, but the user may have dismissed the dialog. Re-grant via DevToolsApplicationStorageRequest persistent storage button, or through browser settings.
Symptoms: After updating the browser or restarting the device, some or all local inspections have disappeared from the app.Cause: Browsers may evict IndexedDB data for origins that have not been visited recently, or when the device is low on storage. This is especially common on:
  • Safari on iOS/macOS — aggressively evicts non-persistent storage after approximately 7 days of inactivity.
  • Firefox — may evict storage under low-disk-space conditions.
  • Mobile browsers — operating system storage cleaners may clear browser data during a device restart if storage is low.
Prevention:
  • Install the app as a PWA. Browsers grant installed PWAs persistent storage status, making them immune to automatic eviction.
  • Enable backend sync (VITE_API_URL). Inspections that have synced to the backend are recoverable even if local storage is cleared.
  • Export regularly. Use SettingsExportar datos at the end of each working day.
  • Request persistent storage. The app requests this permission on first launch. If declined, re-grant it in browser settings.
Recovery: If data was lost and no backend sync or export was in place, recovery is unfortunately not possible. Going forward, enable at least one of the backup strategies listed above.
If you encounter a bug or issue not covered by this guide, please open a ticket on the project repository. Include the browser version, device type, app version (visible in SettingsAcerca de), and any relevant error messages from the browser console to help the development team diagnose the problem quickly.

Build docs developers (and LLMs) love