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 permission denied — no camera access dialog appears
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 settings → Camera → change to Allow.
Firefox: Click the padlock → Connection secure → More information → Permissions → Use the Camera → uncheck Use Default.
Safari: Go to Settings → Safari → Camera → 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 Settings → Privacy & Security → Camera → find Safari (or the PWA entry if listed separately) → set to Allow.
Photo fails to attach to a checklist item
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 Settings → Almacenamiento → Exportar datos.
Delete completed inspections from the app to free up space.
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: Settings → Camera → Formats → Most Compatible.
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 rootgrep 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 DevTools → Application → IndexedDB → euroautos → sync_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 Settings → Sincronización → Sincronizar ahora to force an immediate sync attempt outside of the automatic online event cycle.
Service worker is not updating to the latest version
Symptoms: After redeploying the app, inspectors are still running an old version. The version number shown in Settings → Acerca 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 DevTools → Application → Service 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 DevTools → Application → Service 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.
PDF download doesn't start when tapping 'Generate report'
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 DevTools → Console and look for red error messages at the time you tap the button. Common errors include:
Error message
Likely cause
Cannot read properties of undefined (reading 'sections')
Inspection data is malformed. Try reopening the inspection and saving it again.
jsPDF is not defined
The PDF library failed to load. Hard-refresh the page to re-fetch all assets.
Failed to load font
A 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 Settings → Safari → Block Pop-ups → toggle off.
Alternatively, use the Share button (once the PDF opens in the new tab) to save it to Files.
Generated report is missing photos
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 DevTools → Application → IndexedDB → euroautos → photos. 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.
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 20nvm use 20npm installnpm run dev
Build fails with environment variable errors
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:
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:
"QuotaExceededError" appears in the browser console
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 Settings → Almacenamiento → Exportar 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 DevTools → Application → Storage (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 DevTools → Application → Storage → Request persistent storage button, or through browser settings.
Inspection data was lost after a browser update or device restart
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 Settings → Exportar 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 Settings → Acerca de), and any relevant error messages from the browser console to help the development team diagnose the problem quickly.