- Refactored all cache-busting v arguments in base.html to pass directly through the Flask url_for Jinja function (v=app_version) rather than string concatenation.
- Moved the os import in context_processors.py to the top level scope to avoid redundant runtime overhead on every request.
- Added dynamic ?v={{ app_version }} cache-busting query strings to all core stylesheet and script references in base.html.
- Created and registered the inject_app_version context processor in app/context_processors.py and app/__init__.py to inject the APP_VERSION environment variable into all templates dynamically.
- Refactored copy-assets.js to detect production context (NODE_ENV=production or DOCKER_BUILD=true) and fail loudly (process.exit(1)) if assets are missing, avoiding silent failures in the build pipeline.
- Set DOCKER_BUILD=true during the Dockerfile asset compilation step to enforce deterministic production build verification.
- Set updateViaCache to 'none' in SW registration to bypass HTTP cache for the worker script.
- Implemented periodic update checks every hour and update listeners.
- Integrated immediate activation (self.skipWaiting) and adoption (self.clients.claim) in sw.js to resolve cache lock-in instantly.
- Optimized stale-while-revalidate strategy in sw.js to use event.waitUntil to guarantee background fetches complete.
- Removed duplicate css/main.css stylesheet load in base.html template.
- Added app/static/js/vendor/ and app/static/css/vendor/ to .dockerignore to keep Docker daemon build contexts clean.
- Relocated Alpine.js, HTMX, Flowbite, Bowser, Inapp-spy, and Animate.css assets out of node_modules into safe vendor folders during build.
- Created cross-platform Node.js copy-assets.js script to copy required front-end packages.
- Updated base.html template to serve assets from secure vendor folders instead of node_modules and fixed Alpine plugin loading order.
- Modified .gitignore to ignore portable local development tools and compiled vendor assets.
- Updated title block in frame.html for clarity.
- Improved localization for the "Next" button in steps.html.
- Refactored the WizardController JavaScript for better readability and organization.
- Added detailed comments to the wizard architecture for future reference.
- Enhanced button visibility and state management based on interaction requirements.
- Implemented swipe gesture handling for mobile navigation.
- Updated subproject commit to indicate a dirty state.
- Add copyToClipboard() utility function in base.html with fallback support
- Replace direct navigator.clipboard.writeText() calls with new utility
- Support both HTTPS (modern clipboard API) and HTTP contexts (document.execCommand fallback)
- Add manual copy alert as last resort for complete compatibility
- Update all clipboard usage locations (invite modal, admin invites, invite cards)
Fixes#711🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This adds page titles, as well as link preview titles and descriptions (e.g. iMessage, Signal, WhatsApp previews)
Cleaned up the user injection / template tag naming since it was missing in some places and duplicated in others