Version History
v1.0.46 - User Management Permissions Refactoring & Nudger 3-Mode Selector
- 3-Mode Nudger Access Control: Replaced the separate
Nudger AdminandNudger Viewercheckboxes in the user editor modal with a single dropdown menu labeled Nudger Access ("No Access", "View Nudger", and "Manage Nudger"). Updated the frontend logic to map these selection values to database properties, update status badges on the user listings, and dynamically hide the Nudger sidebar link for users with no access. - Pixel Manager Sidebar & Button Hiding: Repositioned the Pixel Manager sidebar navigation button above the Analytics button in the main layout. Updated
renderPixelsto hide the "+ Create Pixel" button and the "Edit" and "Delete" action buttons for users without permission to manage pixels (instead of displaying a "Read-Only" label). - Checkout Creator Button Visibility Fix: Added
id="btnCreateCheckout"to the "+ Create Checkout" button in the Checkouts layout, enabling JavaScript to successfully find and hide the creation button for checkout viewers. - UI Role Restriction for Superadmins: Removed
is_superadminbypass overrides for pixel/checkout/route manager capability checks in the frontend UI. This allows superadmins who explicitly disable their own manager permissions to experience and test the read-only viewer mode. - Superadmin Authorization Bypass Fix: Patched the backend Hono global middleware to ensure users with
is_superadminstatus bypass permission checking for pixels, checkouts, and analytics endpoints, preventing403 Forbiddenerrors. - SQL Migration: Created the migration file 0013_qabot_test_queue.sql to provision the
qabot_test_queuetable in production, enabling the QA Bot test scheduling queue engine to function outside the local environment. - QA Runner MCP Tool: Added the
setup_qa_runner_skillMCP tool to the Admin MCP router inside mcpRouter.js. This tool returns a detailed step-by-step system instruction prompt to instruct external Claude agents to run the automated QA testing queue loop. - QA Scheduler Draining and Auto-Recycle Loop Fix: Patched
submit_qa_test_resultto transition finished test routes to a'completed'status to prevent infinite single-route looping. Modifiedget_next_qa_test_routeto automatically recycle all'completed'routes back to'pending'when no pending routes remain, enabling continuous loop testing for decentralized runners. Added thereset_qa_test_queuetool to manually reset the queue status back to pending at any time. - Searchable Dropdown Input Fix: Fixed the route search input behavior in qabot/public/app.js where it aggressively reset the user's typed search text back to the active route path during typing/deletion. Added auto-selection of text on input focus, automatic text reversion to the selected route path (or empty) when clicking outside without selecting, and full keyboard arrow-key navigation (ArrowDown, ArrowUp, Enter, Escape) to navigate and select options inside the dropdown list.
- Tab Layout Height Collapse Fix: Resolved an issue in qabot/public/app.js where switching from "Runs History" back to "Markdown Test" collapsed the editor viewport height. Fixed by changing the element display override to
display: flexinstead ofdisplay: blockto keep the layout expansion.
v1.0.45 - Move Copy Production Routes Logic to Aegis Admin
- Relocated Copy Production Routes: Moved the "Copy Production Routes Locally" button and modal from the QA Bot workspace into the Aegis Admin Panel under the super admin user dropdown. Restricted visibility of the Copy button to super admins on local environments. Integrated the import fetch request with automatic datagrid refreshing using
loadData(). - Backend Sync Endpoint & Variables: Added the
POST /api/proxy-export-configendpoint to theadminworker backend (restricted to superadmins). Configured the local secretPROD_SYNC_TOKENinadmin/.dev.vars, and declaredPROD_ADMIN_API_URLandPROD_ROUTER_URLvariables inadmin/wrangler.tomlandadmin/wrangler.dev.tomlto authorize configuration exports from production.
v1.0.44 - QA Bot Runs History Tab UI & Environment Routing Fixes
- Runs History Tab UI Fix: Resolved the issue where the Runs History tab (
#resultsTabBtn) was disabled/greyed out in the QA Bot dashboard UI. Modified qabot/public/app.js to callenableResultsTab()during initial load ininitApp()if aroute_idquery parameter is present, when a route is selected from the searchable dropdown list, or when a route is imported from production. AddeddisableResultsTab()triggers when the route selection is explicitly cleared (either by clicking "-- All Tests (No Route) --" or clearing the search input text completely). - Runs History Environment Proxy Routing Fix: Fixed an issue where the runs history list would show "No runs recorded yet" or fail because the frontend was requesting
/api/qabot/runsand/api/qabot/runs/:idwithout theenvparameter. Added?env=${currentEnv}to both fetches in qabot/public/app.js to ensure the proxy worker routes requests to the correct Admin environment (production vs local) holding the reports database.
v1.0.43 - Edge Router Hydration, Image Proxy, & Routing Loop Fixes
- TanStack Router Base Path Hydration Fix: Resolved a fatal
Invariant failedcrash on TanStack Start/Router routes (such as/scent-discovery-quiz/). Updated router/src/index.js to catch and replace empty basepath declarations (basepath:""orbasepath:t="") withbasepath:window.__BASENAME__||""on the client JS bundle. When the proxy injectswindow.__BASENAME__ = "/scent-discovery-quiz", the client-side router successfully initializes its base path, allowing the browser path to match the root route correctly. - Outgoing Proxy Host Header Loop Fix: Resolved
internal errorcrashes on forwarded and fallback requests (like/or/favicon.ico) in theworkerd/ Miniflare runtime. Programmatically stripped the incomingHostheader from all outgoing proxyfetchrequests, preventing Miniflare from loopback routing requests recursively back to the local worker. - Local Dev Image Compression Proxy Fix: Fixed broken images on proxied routes during local development. Changed the image compression rewriter to construct absolute asset URLs using the original Lovable origin (
matchedRoute.origin) instead of the proxy host (url.origin). This enables the publicwsrv.nlcompression service to successfully fetch and compress the assets from the internet (since it cannot access local dev ports likelocalhost:8787). - React Router Basename Variable Override Fix: Resolved client-side
404 Oops! Page not foundrendering errors on standard React Router SPAs (like/csk-hero-bof-new/) when running on local/staging environments. Added a JS bundle rewriter replacing hardcoded hostname checks (window.location.hostname.includes("purdyandfigg")) withtrue. This forces the router's basename to resolve to the correct proxy subpath (e.g."/csk-hero-bof-new") on all local/proxied traffic, bypassing any modifications to React Router's internal destructuring syntax to avoid syntax crashes.
v1.0.42 - QA Bot Serverless Migration & Markdown-Based Testing
- Serverless QA Bot Migration: Re-architected the
qabotservice from a Node.js/Express app running on Render to a serverless Cloudflare Workers + Hono architecture. - Markdown Test Runner Integration: Replaced Playwright
.spec.jstemplates with.test.mdMarkdown test files. Introduced a securePOST /api/qabot/runsendpoint for Claude test runners to submit execution reports to D1. - Runs History Dashboard: Added a "Runs History" tab panel list to the QA Bot frontend dashboard, letting users query past runs, view execution cards, and render runner Markdown reports dynamically in the viewport.
- Wizard Monitor Configuration Defaults: Updated the route wizards to default new routes to only having ROUTE ACTIVE and PIXEL CHECK audits enabled, and created SQL migrations (
0011_qabot_markdown_runs.sql,0012_update_default_monitor_config.sql) to synchronize the database states. - Inactive Route Audit Tooltips: Enhanced the Route Audits modal to visually block and flag the CAP Code Scan using a
βοΈicon with a tooltip warning if the route is not live (Live Ads disabled), explaining that the compliance scan will not run. - CI/CD Cleanup: Removed Render deployment workflows from
.github/workflows/deploy.ymland replaced them with Cloudflare Worker deployments forqabot.
v1.0.41 - Route GA expectations Modal Redesign & Ignore Logic
- Route GA Expectations Modal Redesign: Refactored the split-pane list layout into a single-pane card design with a select dropdown for active GA modules, an "Enabled for Route" checkbox, and a 4-column dynamic expectations elements table ("Data Attribute Name", "Expected Value", "Ignore", "Status") matching the Master GA configuration modal styling.
- Ignore Column and Playwright Test Filtering: Added an "Ignore" checkbox column to the Route GA expectations table. Checking "Ignore" sets the attribute's expected value to
__IGNORE__, disables the expected value input field, styles the attribute name with a line-through, and excludes the attribute from generated Playwright test files in bothqabot/public/app.jsandadmin/src/mcpRouter.js. - Change Tracking and Save Auto-Disabling: Implemented change-tracking for the Route GA expectations modal, automatically disabling and ghosting out the "Save & Generate Test" button if the configuration is unmodified, and dynamically enabling it once changes are detected on module enabling, expected value input typing, or attribute ignoring.
- Cancel Button Integration: Added a "Cancel" button to the left of "Save & Generate Test" in the Route GA expectations modal to discard unsaved configuration adjustments.
- Synchronized D1 Schema: Verified and updated
sql/schema.sqldatabase schema definitions to match all migrations (e.g.,ga_framework,route_ga_config,qabot_test_templates,qabot_tests,qabot_test_versions) for seamless database setups. - Sign-off and Edit Reference Bug Fix: Resolved a
ReferenceError: route is not definedcrash in/api/routes/:id/edit. Correctly queried and retrieved the route'sstorevalue to compute the live domain for Slack notification logs. Also patched similar missingstorefields and undefined references in route lock, archive, and audit-slack endpoints.
v1.0.40 - GA Custom Framework Refactoring & Custom Confirmation Modals
- Custom Confirmation Modals: Standardized confirm dialogs inside the QABot frontend by replacing native browser
confirm()popups with a modern, glassmorphic styled HTML modal (#customConfirmModal) for GA custom framework configuration deletion and Playwright suite version deletion. - Backend DELETE API Fix: Patched a critical 500 error on the Express server
/api/test/ga-framework/:idendpoint by handling cases wherereq.bodyis undefined during fetch DELETE requests from the client. - Default GA Framework Seeding: Updated migration_add_ga_framework.sql and the main schema.sql with default database configuration seeds for all 5 GA custom tracking modules (
announcement_bar,hero,multi_step_buybox,membership_block,faq). - Synchronized D1 Schema: Synced
sql/schema.sqlto include the test templates table (qabot_test_templates), missing indices (idx_route_ga_config_route,idx_qabot_test_versions_lookup), and template seed data from the individual migration files.
v1.0.39 - QABot Authentication & UserManager Integration
- User Manager QA Bot Access: Updated UserManager in Aegis Admin to support granular
access_qabotcheckbox control in the Edit/Create User modal. - SQL Migration: Created and executed
sql/migration_add_qabot_access.sqlto alteruserstable and grant QABot access permission to all existing superadmins. - Granular Launch Button Control: Configured the Aegis routes table to only display the
π€ QA Botlaunch button to users possessingis_superadminoraccess_qabotpermissions. - QABot Session & Auth Middleware: Secured the QABot backend with
/api/loginand/api/logoutendpoints, session storage, and path-interception middleware checking theqabotTokencookie. - QABot Card-Style Login UI: Designed and integrated a secure card-style login overlay modal in the QABot frontend matching the Nudger design aesthetics.
- Global Fetch Interceptor: Overrode global
window.fetchto catch 401 Unauthorized responses and force-redirect users to the login screen immediately. - Admin Profile Dropdown Username Display: Added a dedicated user status header inside the Aegis Admin profile dropdown to clearly identify the active logged-in user.
- User Wizard UX Improvements: Configured the user wizard modal overlay to automatically close upon successful submission, and standardized button labels to display "Create User" for new creations and "Save User" for editing existing accounts.
- Aegis-to-QABot SSO Auto-Login: Engineered a Single Sign-On (SSO) bridge passing the active Aegis session token in URL parameters when launching QABot, enabling QABot to auto-authenticate users and bypass the login prompt seamlessly.
- Admin Favicon Integration: Configured native favicon support for Aegis Admin by embedding the logo markup tag in the page template and establishing a backend redirect routing
/favicon.icodirectly to the active logo resource. - User Wizard Bug Fix: Fixed a client-side crash (
TypeError: Cannot read properties of null) occurring when opening or closing the User Wizard by adding a safe existence check for the legacy cancel button element (cancelUserEditBtn). - SSO Session Revocation Sync: Configured QABot backend to dynamically cross-verify the Aegis Admin session token against Aegis Admin API during active requests. Logging out from Aegis Admin instantly terminates active QABot sessions and forces the user to the login screen.
v1.0.38 - QABot MCP Tools & Claude Integration
- QABot MCP Tools Integration: Added three new MCP tools (
get_qa_test,create_qa_test,update_qa_test) directly to the Aegis Admin MCP router. These tools enable automated test suite creation (auto-generating route-specificplaywright.config.jsand blankga-tracking.spec.jsplaceholders alongsidedefault.spec.js), version-controlled updates, and setting active test baselines directly in the database. - Claude & Cursor Integration URL: Added a second connection details block and copy button in the Integrations tab of the Aegis Admin UI, displaying the root MCP URL (
https://aegis.purdyandfigg.dev/api/mcp) for connecting general AI agents with administrative and QA capabilities. - Superadmin Local Privileges: Upgraded developer database initialization and profile cache handling, enabling easier access to administrative tabs (like App Tokens) in local development setups.
v1.0.37 - QABot Version Synchronization & Suite UI
- Pre-Flight Monitor Integration: Natively tied the QABot testing suite into the central Aegis Monitor engine. Added a dynamic Pre-Flight Monitor UI block that parses the route's
monitor_configto explicitly run required pixel and health checks before executing the Playwright browser tests, automatically aborting the test suite if upstream monitor health checks fail. - Suite Versioning Consolidation: Overhauled the QABot frontend to treat
playwright.config.js,ga-tracking.spec.js, anddefault.spec.jsas a unified testing "Suite." Replaced individual file version trackers with a single master suite controller, strictly synchronizing all three files via simultaneous API calls to guarantee configuration alignment. - SQLite D1 Type Affinity Fix: Resolved a critical SQLite type-casting bug in the Admin D1 Database where the proxy was writing versions to an integer
route_idbut attempting to read them using a text'route_id', causing silent version desynchronization. Fully patched both theGETandPOSTendpoints to aggressively cast parameters to integers. - New Version Extraction Bug: Patched a 500 Internal Server Error in the
POST /api/qabot/testsendpoint by properly extracting theversionproperty from the incoming JSON payload prior to database insertion. - QA Bot Branding: Reverted the large Aegis shield logo on the QABot interface to exactly match the native
π€ QA Botstyling found in the primary Aegis Admin navigation menu.
v1.0.36 - QABot Integration & Analytics Pausing
- QA Automation Engine: Integrated a comprehensive
qabotQA automation environment powered by Playwright and Monaco Editor, hosted seamlessly on Render. - Dynamic Dashboard Routing: Implemented environment-aware dynamic QA Bot linking natively across the Admin Dashboard (
aegis.purdyandfigg.dev) and Nudger toolkits. - Analytics Sandbox Flags: Architected a centralized
DRY_RUNandSTORE_LOCALLYtelemetry pausing mechanism inside the Cloudflareanalyticsworker to prevent live data pollution during QA testing. - Dashboard UI Overhaul: Overhauled the Admin Dashboard's Data Visualization layer to natively read analytics environment variables and instantly trigger a blurred "Analytics Disabled" modal overlay when live statistics are paused...
v1.0.35 - Dashboard UI & Analytics Overhaul
- Sidebar Reorganization: Reordered the sidebar navigation menu to prioritize Analytics and Uptime Monitor above Pixel Manager and User Manager.
- Full-Width Layout & Typography: Removed rigid max-width constraints so tables dynamically expand to fill the entire browser window. Stripped out redundant card subheaders ("Routes", "System Users") for a much cleaner, cohesive aesthetic.
- Granular Session Tracking: Replaced generic KPI cards with highly specific timeframes: Total Sessions (Today, This Week, 30 Days, This Year, All Time).
- Historical Data Integration: Added a permanent base offset of
12,662,051sessions natively into the "This Year" and "All Time" counters to accurately reflect historical traffic prior to the analytics module rollout. - Live Routes Fix: Corrected a Dashboard bug where live routes were returning 0 due to an incorrect boolean evaluation (
is_activevsactive), successfully restoring the live tally. - Optimized Analytics Backend: Engineered a brand new
/api/analytics/dashboardendpoint leveraging highly efficient, single-pass SQLite aggregations across the different time blocks. - Interactive Trend Chart: Deployed a glowing blue Chart.js "Sessions Trend (Last 30 Days)" line chart natively onto the main Dashboard overview, surfacing immediate visual insights upon login without requiring a tab switch.
- Lovable MCP Integration: Upgraded the internal model context protocol to seamlessly interface with the Lovable MCP, enhancing automated deployment tracking and cross-service communication for Lovable builds.
- Extensive Monitoring & Debugging: Upgraded the standalone
monitorandvisual-monitormodules to provide deep systemic telemetry, real-time error tracing, and extensive debugging capabilities across all deployment environments.
v1.0.34 - CI/CD Optimization & Modal UX
- Shopify CDN Asset Injection Engine: Ripped out the legacy Base64 inline-asset compiler limit for Shopify deployments to solve bundle bloat and 500KB file-size limits. Engineered a completely custom CI/CD script (
externalise-assets.mjs) that automatically hooks into the Shopify Admin GraphQL API to dynamically upload compiled Vite images to the global Shopify CDN. It then aggressively parses the raw.jsand.cssVite chunks, running a sweeping string-replacement to swap out local/assets/...paths with the livecdn.shopify.com/...URLs prior to pushing the theme! - Shopify Image Caching (CI/CD Optimization): Implemented GitHub Actions Cache (
actions/cache@v3) within thedeploy.ymlpipeline. Engineered auploaded-images.jsonstate map insideexternalise-assets.mjsto dynamically memorize Vite content hashes. This strictly prevents the CI runner from blindly re-uploading identical images to the Shopify CDN across deployments, drastically slashing CI build times for media-heavy landing pages. - Shopify Themes Searchable Dropdown: Ripped out the overly aggressive nativegit branch HTML5
<datalist>for the Shopify Theme ID selector in the Promote modal. Engineered a fully custom, accessible floating search-dropdown component in Vanilla JS that instantly filters by both Theme Name and ID simultaneously. - Live Origin Domain Parsing: Fixed a UI gap where the active Shopify deployment origin was displaying the internal
shopify://routeproxy URI. Engineered a real-time environment parser that perfectly translates the internal string into the fully qualified public domain (e.g.staging-purdy-global.myshopify.comorpurdyandfigg.com), making the live origin fully clickable natively inside the deployment modal and main dashboard table. - Build Sequence UX Stability: Removed frontend layout rules that abruptly hid the "Current Active Origin" metadata block when clicking "Force Provision & Build". The target deployment topography now stays visibly locked in place while the CI/CD pipeline streams its logs.
v1.0.33 - UI & UX Dashboard Overhaul
- Origin Column: Replaced plain text host names with clean brand SVG icons (Shopify, Cloudflare). Upgraded the URL and action links into a clean, minimalist row of icon buttons (π View Origin, βοΈ Edit Lovable Project, π Set Origin) with rich tooltips.
- Store Column: Replaced colored text badges (UK / US) with large flag emojis (π¬π§ / πΊπΈ).
- Pixels Column: Completely overhauled pixel tracking display. Instead of text pills, the dashboard now renders a dynamic row of SVG brand icons for every globally registered pixel (Meta, TikTok, Google, Snapchat, etc.). Icons are visually ghosted if not assigned to the route, and fully opaque if they are.
- Status Column:
- Replaced bulky 'Active/Inactive' text pills with sleek π’ / π΄ dot indicators with tooltips.
- Replaced "Missing Sign-Offs" text with a row of 4 role icons (π€ Author, π Growth, π» Tech, π€ AI) wrapped in a dynamic, rounded border (Green if fully signed off, Red if missing) and separated from the final β / β status icon by a vertical divider.
- Reordered the Live Timer to sit cleanly below the sign-off row and updated its logic to persistently show historical data ("Was live for [time]") when a route is inactive.
- Preview Images: Upgraded the screenshot API fallback image to gracefully display the Aegis shield logo natively, removing the gray background and border, and disabled zoom interactions for fallback images.
- Edge Router Path Normalization: Fixed a critical URL concatenation bug in the proxy router that was injecting double slashes (
//) into asset paths when reverse-proxying Lovable builds. The edge router now safely normalizes origins and sub-paths, completely eradicating404 Not Founderrors for nested CSS, JS, and image assets.
v1.0.32
- Shopify D1 Database Caching: Engineered a robust local caching layer using Cloudflare D1 (
shopify_cachetable) for storing Shopify product and discount payloads. This completely eliminates 403 WAF blocks when the Admin UI or MCP agents fetch the store catalogues. - Automated Catalog Syncing: Implemented a
scheduledCloudflare Worker event that silently synchronizes both the US and UK Shopify catalogs in the background every midnight. - Manual Cache Controls: Injected a new "Sync Shopify Data" administrative action directly into the Checkouts panel of the UI, allowing teams to instantly override the cache locally without dropping into the terminal.
- Payload Token Optimization: Significantly reduced the token context burned by Claude when searching for products. Added an optional
queryparameter tonudger_checkout_list_productsto perform server-side title/handle filtering before returning the JSON dump. - Strict Checkout Workflow Enforcement: Explicitly embedded the deterministic step-by-step interactive checkout building workflow (
Store -> Product -> Variant -> Selling Plan -> Discount -> Quantity -> Save) directly into the MCP tool schemas, guaranteeing consistent AI interactions.
v1.0.31
- Interactive QA Bot Setup: Upgraded the QA Bot preview proxy to support point-and-click section setup. Users can now click on any element in the iframe to instantly highlight it and append it to the QA testing checklist as a new action.
- Smart Section & GA Extraction: Enhanced the click-to-add functionality to intelligently scan the parent section for heading tags (
h1-h6,.title) to auto-generate readable section names, and dynamically recursively search fordata-tracked="true"attributes to auto-populate GA requirements. - QA UI Streamlining: Consolidated the QA configuration row by moving the "Highlight Section (ποΈ)" button into the primary summary action bar alongside the directional arrows and trash icons for better spatial consistency.
- Documentation Overhaul: Created a suite of comprehensive, module-specific User Guides (
admin,router,visual-monitor,analytics,compliance-ai,monitor,nudger) housed natively inside thedocumentation/folder to standardize onboarding and architectural clarity.
v1.0.30
- Nudger Checkout Link Automation: Implemented a new 'Checkout Links (from Trello)' QA action within the Nudger automation engine. The system now dynamically fetches exact checkout URLs mapped to Trello custom fields and runs visual validation against live landing pages.
- Visual Monitor Multi-Link Parsing: Refactored the
aegis-visual-monitorheadless puppeteer service to securely handle flat arrays of checkout URLs. The QA engine now natively identifies target<a>anchors on live pages, triggers auto-scroll, and captures isolated, targeted screenshots of every checkout button. - Strict Custom Field Binding: Upgraded the
trello.jsdata fetching logic to deterministically extract theCheckout URLcustom field strictly by its exact internal Trello ID, bypassing legacy fuzzy regex guessing and ensuring 100% accurate link ingestion into the QA bot. - Dynamic UX Form Rendering: Enhanced the Nudger QA Dashboard to seamlessly hide configuration dropdowns (Copy Mode, GA Tagging) specifically for the Checkout Link action, and directly injected Trello's captured checkout state into the frontend text-area for instant modification.
v1.0.29
- Nudger Module Introduction: Engineered and deployed the brand-new standalone
aegis-nudgermodule. This dedicated Cloudflare Worker automates the complete project lifecycle by seamlessly linking Trello board active tracking with Slack notifications, compliance workflows, and time-in-list monitoring. - Global Nudger Automation Defaults: Implemented a comprehensive global settings interface natively inside the Admin Dashboard to standardize nudge targets and time-in-list thresholds across all project cards.
- Dynamic Nudge Rules Engine: Enforced business rules directly into the worker logic to automatically suppress and "ghost out" nudge targets if an action is marked as "Not Required," "Already Provided," or if the card successfully reaches the "Done" list.
- Asynchronous Slack Tag Rendering: Resolved race conditions in the Nudger configuration modal by natively awaiting Slack user fetching, definitively replacing raw Slack IDs with human-readable names inside the audit UI.
- Cross-Service MCP Tool Proxying: Supercharged the Admin MCP Router to organically proxy Model Context Protocol tool requests directly into the standalone Nudger worker. Created
nudger_card_state,nudger_todo_list_status, andnudger_overall_summarytools so Claude Desktop can natively query live Trello statuses directly through the Admin connector. - Secure Internal Service Bindings: Hardened cross-worker communication by binding
aegis-nudgerdirectly into theaegis-adminenvironment variables, routing internal fetches using explicitX-Aegis-Internalbypass headers instead of exposing sensitive PAT tokens. - UI UX Enhancements: Refined the Admin Dashboard settings modals by horizontally expanding layouts, adding sticky headers, and injecting interactive "ποΈ Show Password" visibility toggles natively into all user and account credential fields.
v1.0.28
- Checkout Link Builder State Hydration: Fixed a UI bug where the auto-generated Shopify checkout URL preview failed to render when editing an existing route due to hidden
<select>elements not resolving their values synchronously. Added DOM stabilization delays and step-triggered generation. - Checkout URL Persistance Safety: Resolved a state-loss bug where directly clicking "Save Changes Now" bypassed the wizard's auto-save logic. Injected an asynchronous interception into the form submission to definitively save newly drafted checkouts to the database before committing the route.
- D1 Checkout ID Return Binding: Refactored the
POST /api/checkoutsworker endpoint to natively execute aRETURNING idquery instead of just yielding a generic success boolean. This guarantees the frontend instantly maps the dynamically created Shopify checkout back to the parent route. - Slack Monitor Consolidation: Re-architected the
monitorworker to eliminate Slack notification spam. Overhauled the hourly visual drift loop to strictly tally results and output a single aggregated payload:Proxy Monitor Audit {X} passes / {Y} failures ({Z} sites monitored). - Global Audit Report Index Page: Engineered a brand new lightweight HTML endpoint at
/api/reportsthat surfaces a unified index of all monitored routes. It dynamically partitions Active, Disabled, and Archived targets, rendering one-click hyperlinks to each URL's most recent visual inspection payload.
v1.0.27
- Cloudflare Browser Rendering Fix: Fixed a critical
wrangler.tomlbinding syntax error ([browser]) that was silently preventing the production Visual Monitor worker from connecting to the remote Cloudflare headless browser. - Route Archiving Safety: Upgraded the
POST /api/routes/:id/archiveendpoint to automatically setactive = 0whenever a route is archived. This guarantees that disabled routes are fully disconnected from the proxy router, and remain safely disabled if later restored. - Visual Audits Dashboard UI: Added a dynamically injected "π View Last Audit" button into the Route Audits modal that appears immediately upon opening if a baseline exists, saving users from re-running full tests just to view the current report.
- Visual Diff Noise Floor: Overhauled the
pixelmatchsensitivity logic to completely eliminate false-positive visual mutations. Increased the sensitivity threshold to0.2(to ignore anti-aliasing) and instituted a hard0.1%screen-area noise floor, mechanically preventing tiny 14px ticker bars or countdown timers from triggering "Content Mutated" alarms. - Puppeteer Hang Prevention: Engineered a safety
Promise.racetimeout wrapper arounddocument.fonts.readyevaluations. This permanently prevents headless browser sessions from hanging infinitely if a Shopify web-font fails to load, successfully eradicating theD1_ERROR: Network connection lostworker timeout crashes.
v1.0.26
- Developed a comprehensive "No Proxy (Direct Link)" architectural flow inside the Route Configuration Wizard, allowing growth teams to instantly hook native external domains (Shopify, Webflow, Unbounce) into the proxy's pixel-tracking engine without actually proxying the end-user traffic.
- Overhauled the Admin Dashboard data tables to support generic "N/A (External Origin)" badges for non-proxied routes, preventing hardcoded metadata overlaps when configuring sites outside of the Lovable ecosystem.
- Upgraded the
/api/routes/:id/image-scanendpoint to perform aggressive dual-domain audits. The system now parses the raw Lovable origin side-by-side with the Edge Proxied route, mechanically triggering "Success" UI badges when bloated assets are successfully minimized in real-time by the Edge Router. - Refined the compliance dashboard nomenclature by systematically renaming "CAP Code Scan" buttons to "Audit Report" across the entire interface.
- Built a dynamic Proxy Type categorization filter directly into the table header (
All Routes,Proxied Routes,Direct Links) to isolate specific pipeline deployments quickly. - Implemented responsive filtering logic that automatically hides the Lovable/Cloudflare specific "Origin Filter" dropdown when users are explicitly querying for "Direct Link" routes.
- Added retroactive auto-healing to the
POST /api/routes/:id/editendpoint. If a user manually corrects an existing route into a direct link, the database query automatically strips residuallovable_urlassociations so the dashboard correctly removes the "π Lovable URL" visual badge. - Squashed a strict HTML5 validation bug (
An invalid form control is not focusable) by precisely managing therequiredattribute DOM states when toggling between proxy and non-proxy deployment wizards. - Enforced standard multi-step sign-off requirements (Growth/Tech) for Native external routes instead of auto-activating them, strictly preserving compliance tracking before any pixels can dynamically fire.
- Overhauled and fine-tuned the
compliance-aiLlama 3 8B prompt engine. Transitioned from a rigid ASA-style rulebook to a minimalist "binary-exists" fact-checking prompt, stopping the model from hallucinating "prominence" and "placement" violations. - Injected strict exclusionary definitions into the prompt for "Stylistic Puffery", "Brand Voice", and pre-verified P&F statistics (e.g., "89,200+ reviews", "pH-neutral") to massively reduce false positives.
- Engineered a programmatic Javascript post-processing "Hallucination Killer" inside the AI worker. This safety layer automatically intercepts the AI's JSON output and forcefully deletes flagged violations for "Advertisement Feature" or "Competitor Name" if the raw HTML text demonstrably contains the correct compliance disclosures.
- Disabled
<script>tag stripping inside the AI'sstripHtml()payload generator, granting the model full visibility into dynamically injected React bundle content (like footer disclosures) that were previously invisible. - Fully decoupled the AI CAP Scanning logic from the automated hourly Uptime Monitor, transitioning it to a strictly on-demand audit tool. This cleanly contains any future LLM hallucinations within manual "Go-Live" admin workflows rather than disrupting background production systems.
- Upgraded the automated Uptime Monitor to strictly inherit
isNonProxyRoutelogic. The monitor now dynamically hits the naked consumer-facing Shopify domain (purdyandfigg.com) for direct links instead of forcing proxy resolution viaget.purdyandfigg.com, successfully preventing false-positive 403 Forbidden failures caused by native Shopify bot-mitigation. - Refactored the raw R2 Audit HTML generator to natively inject global
ENABLE_IMAGE_COMPRESSIONdeployment statuses directly into the report UI header for faster diagnostic debugging. - Built a manual
POST /api/routes/:id/audit-slackoverride endpoint, granting growth teams the ability to instantly broadcast freshly generated CAP Code Audit Reports (and their corresponding R2 URIs) directly into the#ai-landingpagesSlack channel via the UI. - Redesigned the Admin Audit UI to permanently un-nest the
View Detailed Reportbutton from the scrolling violations container, docking it explicitly in the static modal footer next to theSend to Slackdeployment action for instant accessibility. - Consolidated the legacy "Compliance AI Report" and the "Unified Visual Audit Report" into a single, cohesive dynamic view accessed natively via
/api/report/:audit_id. - Stripped out obsolete standalone R2 HTML generator logic from the AI
cap-scanendpoint to strictly centralize all compliance and visual data inside the dynamic unified UI. - Whitelisted the
/api/report/endpoint inside the core Admin authentication middleware, permitting cross-platform clicks (like Slack notifications) to securely view the audit report without mandating an active Aegis Admin dashboard session. - Upgraded the
visual-monitorSlack notification engine to utilize strict D1RETURNING idinserts, natively injecting direct clickableView Detailed Audit Reporthyperlinks directly into#ai-landingpagesvisual drift alerts. - Migrated the
compliance-aiworker off the deprecated Cloudflare Llama 3 and 3.1 Instruct models (@cf/meta/llama-3.1-8b-instruct), transitioning to the recommended tool-calling model Kimi K2.6 (@cf/moonshotai/kimi-k2.6) ahead of the May 30th deadline.
v1.0.25
- Engineered a brand new standalone
page_auditMCP Tool directly inside the Admin Edge Router, granting Claude Desktop the ability to dynamically fetch, scrape, and run AI compliance checks against any arbitrary URL on the internet outside the purview of the local SQLite database. - Bypassed global Hono authentication for all
/api/mcpendpoints to allow strictmcp-remoteconnections to actively ping and download the fresh tool manifest without requiring a valid session cookie. - Whitelisted all
/api/audits/routes in the core authentication middleware, rendering dynamically generated HTML Site Reports completely public and freely accessible via direct hyperlink clicks from Slack/Claude. - Resolved a critical deployment bug where the standalone MCP crawler was triggering SQLite D1 Foreign Key Constraint errors by intentionally stripping dummy
route_idproperties out of the Llama 3.1 payload, forcing thecompliance-aiworker to securely skip organic database insertion logic.
v1.0.24
- Resolved the 524 Timeout and 9401 Origin loop issues caused by Lovable's strict WAF blocking native Cloudflare Image Resizer IPs by dynamically routing asset URLs through the
wsrv.nlexternal image CDN proxy. - Engineered a specialized Javascript payload interceptor to natively rewrite
new URL("img.webp", import.meta.url).hrefVite bundler resolutions without corrupting the trailing.hrefstring primitive. - Hardened the proxy URL generation to mechanically condense arbitrary double slashes (
//) within dynamically concatenated origin paths, preventing404 Not Foundrejections from Lovable upstream servers. - Wrapped the entire image compression engine behind a dynamic
ENABLE_IMAGE_COMPRESSIONenvironment flag deployed viawrangler.toml, allowing growth teams to instantly kill the optimization layer if edge cases arise during testing.
v1.0.23
- Merged the Model Context Protocol (MCP) Router (
mcpRouter.jsand/api/mcp) natively into the Admin Worker. This securely exposes SQLite database tools (list_routes,lock_route,unlock_route) allowing the standalone Purdy & Figg Slackbot to query and mutate proxy configurations dynamically via Claude's Custom Connector. - Stripped out all obsolete Personal Access Token (PAT) generation UI interfaces and
/api/me/patbackend endpoints. Adapted the architecture to align with Claude Desktop's strict connector constraints, which relies onmcp-remotelocal stdio bridging and staticAuthorizationheaders instead of dynamic web UI tokens.
v1.0.22
- Revamped the CAP Code scan extraction engine to execute strict string literal regex parsing, aggressively stripping out all structural JavaScript boilerplate and noise to drastically improve the AI context window.
- Upgraded the AI prompt instructions to mandate a deterministic
"suggested_fix"JSON property, empowering the Llama 3.1 model to proactively write and suggest compliant marketing copy variations. - Overhauled the raw HTML audit outputs into a comprehensive multi-section Site Report.
- Developed a dynamic media extraction pipeline using custom
htmlImgReandjsImgReregexes to capture and render every single image asset (PNG/JPG/WEBP/SVG) embedded in the HTML skeleton or buried within the React JS bundles. - Hardened the media extraction regex engines to perfectly parse deeply nested URL query strings (e.g., Shopify
?v=123CDN parameters) while intelligently rejecting trailing JavaScript syntax characters that would otherwise corrupt the asset paths. - Embedded an asynchronous HTTP
GETscanner into the Site Report generator that aggressively probes every single image URL, manually intercepting and terminating the payload streams to accurately parse theContent-Lengthheaders for real-time asset size calculations. - Integrated automated performance flagging that wraps any scraped image exceeding 500KB in a heavy red border with a
β οΈ [SIZE] KB (LARGE)warning badge directly in the Site Report UI to instantly isolate bloated assets dragging down page speeds. - Implemented deterministic fallback validation where any AI scan flagging only "Medium Risk" violations gracefully forces a system
PASS, bypassing deployment blockers while still rendering a customizedβ CAP Compliance Passed (With Warnings)modal header containing the itemized risk list. - Cleaned up the automated Slack webhooks and UI summaries by removing raw HTML anchor strings and porting them into a beautifully rendered, dedicated "View Detailed Site Report & Images" button at the bottom of the modal via the
auditUrlparameter. - Re-architected the R2 Bucket URL generation logic to dynamically parse and inject the sanitized
route.pathdirectly into the object key filename (e.g.,jacket-potato_20_[TIMESTAMP].html), making the raw R2 links significantly more human-readable. - Reprioritized the visual hierarchy of the HTML Site Report to prominently hoist the Image Gallery directly underneath the CAP Code scan, and explicitly stripped the
<details open>tags to cleanly collapse the massive 30,000+ character raw HTML/JS payloads upon page load. - Significantly hardened proxy security by removing the
/api/audits/authentication bypass from the core Hono middleware. - Upgraded the admin authentication mechanics to seamlessly deploy a secondary, secure
HttpOnlybrowser cookie upon login. This natively authenticates direct cross-platform navigations (like clicking a Site Report hyperlink directly from Slack) without relying solely onlocalStorageBearer tokens. - Injected an explicit italicized warning disclaimer directly into the Slack webhook payloads informing team members that they must hold an active session on the admin dashboard to view the locked Site Reports.
v1.0.21
- Hardened AI Compliance workflows strictly decoupling compliance failures from automated
active=0route disabling mechanisms for already-live pipelines. - Integrated a human-in-the-loop manual AI Sign-off Override feature natively inside the Admin Dashboard, mandating explicit justification reasons permanently captured asynchronously inside
route_audit_logs. - Extracted and safely isolated explicit internal variables natively logging manual intervention (
ai_overridden = 1) apart from organic compliance outputs directly onto the internalroutesSQLite tables. - Reclassified Image Size bounds from triggering systemic critical proxy failing statuses strictly into non-blocking
Warningseverities seamlessly isolated completely to daily 9AM Slack summaries without halting route traffic.
v1.0.20
- Supercharged the Image Size Scanner to aggressively perform root-level binary
.arrayBuffer().byteLengthparsing explicitly when CDN networks dynamically strip standardContent-Lengthheaders, physically eliminating arbitrary CDN logic masking >500k assets payloads. - Corrected the
universalImgRegexpattern parser organically bypassing stricthttps://proxy origins dynamically isolating root/images/bundles accurately tracking Lovable React UI payload maps. - Decoupled
SLACK_WEBHOOKvariable routing completely out of dynamic payload configuration dependencies, directly mounting generic environments intrinsically inside.dev.varsstrings. - Integrated a comprehensive suite of Slack Administrative Audit hooks specifically deploying granular pipeline updates natively into the master communications channels to automatically broadcast exact payloads when:
- Routes are Lock/Unlocked
- Routes are Archived/Restored
- A Route is Permanently Deleted
- A Manual Route Image Audit explicitly fails (>500KB)
- A Structural Compliance CAP Review fails AI Analysis
v1.0.19
- Enforced proxy-level zero-leak tracking by dynamically suppressing the internal
shopify_page_slugparameter from appending acrossURLSearchParamsfetches during metadata-attached 302 redirects. - Engineered an automated checkout validation interceptor (
?test) natively triggering the Cloudflare Edge Worker to decode dynamic cart targets and output isolated JSON schemas (variant_id,discount,quantity,selling_plan) enabling completely headless synthetic end-to-end Cypress/Playwright workflows natively skipping heavily bundled native Shopify checkout nodes. - Re-architected the Proxy
findBestRouteMatchinterceptor to robustly decode incomingRefererheaders for any 404 falling through to the primary asset pipeline. By analyzing the parent<window>frame, the proxy seamlessly catches arbitrary/landing.htmlsub-resource fetches natively initiated by unbundled<iframe>tags and forces them back to their origin test servers dynamically without failing over to Shopify origins natively. - Developed trailing-slash 302 normalization strictly executing against
lovable.appproxy instances. By mechanically verifying that preview environment payloads receive trailing slashes upstream natively on the proxy, React Router v6 cleanly interprets exact directory boundaries (pathname === basename /\/$/) explicitly guaranteeing exactpath="/"Index rendering without plunging into wild-card client-side bounds. - Added explicit 'GitHub Repository' data modeling seamlessly into the core UI Route Configuration Wizard payload to map specific deployment targets safely to specific URL scopes.
- Outfitted the Route Origins schema generator natively adding
Cloudflare + Shopifytoggles to support dual simultaneous deployment architectures across the master CI/CD Github action runner.
v1.0.18
- Fixed SQLite database proxy bugs, ensuring
shopify_urlnative paths correctly register without redundant re-provisioning. - Expanded Route Configure Wizard to natively accept
shopify_page_slugmetadata parameters for custom-named route deployment paths natively into Shopify (e.g.,purdyandfigg.com/pages/custom-promo-24). - Intercepted the "Cancel" dialog UI component on GitHub pipeline execution, freezing user inputs to prevent accidental CLI pipeline closures.
- Overhauled Route Table linking topologies to dynamically route to explicit origin platforms based on active deployments (
UK Shopify Native,Lovable Builder,Cloudflare Edge). - Built an explicit 'All Origins' table UI dropdown to rapidly search and index proxy tables by physical deployed topography.
v1.0.17
- Executed full automation of the proxy CI/CD pipeline to support deploying React/Vite widgets flawlessly into headless Shopify Themes natively via the
shopify theme pushAPI architecture. - Injected dynamic build-time code patching (
BrowserRouter->MemoryRouter) into the GitHub Action orchestrator to actively prevent layout routing collisions inside the Shopify Liquid container format. - Engineered a native dual-compilation step generating
vite.shopify.config.tson-the-fly to compile frontend proxy logic into purely "Zero-Chunk" monolithic JS bundles by disabling split chunks usinginlineDynamicImports: true. - Built robust image handling by configuring Vite
assetsInlineLimit: 100000000to unconditionally Base64 encode all imported widget assets directly into the localized Javascript payload, cleanly bypassing absolute pathing and CDN URL 404s inherent to the Shopify storefront. - Parameterized the entire theme deployment architecture with unique deterministic slugs (
${safeName}) to guarantee zero file collisions or overlaps across an infinite number of parallel proxy routes inside the same Master Shopify Theme. - Upgraded the Admin Dashboard CI/CD "Promote" GUI to output an interactive, contextual "Next Steps" modal specifically coaching growth teams which unique Shopify template file (
page.lovable-hub-5.liquid) belongs to which Proxy Dashboard instance.
v1.0.16
- Designed a secure Route Configuration Lock mechanism (
POST /api/routes/:id/lock) to mandate password authorization before editing, toggling, archiving, or deleting high-value production routes. - Updated the Admin Dashboard dropdown UI to tightly suppress restricted actions (edit, delete, toggle) seamlessly behind the "Unlock Configuration" wall.
- Refactored the
authFetchnetwork interception layer to accurately preserve and inject JWT authorization tokens across secured cross-origin internal API calls, resolving401 Unauthorizedmisfirings. - Eliminated persistent Cloudflare ESBuild
SyntaxErrors by sanitizing deeply nested backticks and unescaped line breaks (\nto\\n) embedded inside the worker's frontend UI compiler templates. - Architectural Overhaul: Split the monolithic server-side HTML template into discrete static files (
public/index.html,app.js,style.css) and bound them natively to Cloudflare Workers Assets. - Backend Refactor: Replaced the native
fetchrouter with a robust, modular Hono framework backend architecture inside theadminworkspace. - Tailwind UI Overhaul: Stripped out legacy Vanilla CSS and embedded a highly dynamic Tailwind
@layer componentslayout, enhancing the aesthetics with vibrant gradients, glassmorphism hovers, drop shadows, and scale animations.
v1.0.15
- Implemented a "My Account" self-service modal, allowing standard users to update their credentials securely via a new
POST /api/meendpoint. - Bulletproofed the user management subsystem by enforcing strict database constraints (no blank passwords) and real-time frontend password-matching validation.
- Overhauled the Admin Dashboard RBAC layer, granting Growth and Tech Reps organic read-only visibility to the routes table without risking unauthorized mutations.
- Locked down deletion mechanics (
DELETE /api/routes/:id), restricting privileges strictly to Global Superadmins or the original Route Author. - Deployed a specialized
Sign-Offmodal block exclusively for Growth and Tech reps to cleanly execute their route approval workflows while protecting the underlying proxy config parameters. - Conditionally suppressed advanced technical documentation (Checkout Builders & Pixel Managers) from displaying to lower-tier users in the internal Guide.
- Standardized a comprehensive global Audit Logging engine (
route_audit_logs) to track and permanently record all user-driven actions (creations, edits, deletions, health checks, and toggles) for strict compliance traceability. - Expanded the AI Compliance cap-scanning protocol to save hard forensic records of compliance failures by permanently logging the exact
violations_jsonarrays into a dedicatedai_cap_auditshistory table. - Upgraded the Route Configuration Wizard UX by embedding dynamic
Save Changescheckpoint buttons directly into Step 1 and Step 2 menus, eliminating the need to traverse the entire form to preserve metadata changes. - Bulletproofed database bindings via a global
try-catchJSON traceback system, immediately surfacing precise SQLite syntax errors directly to the Admin UI screen instead of blindly cratering the worker pipeline. - Fixed a silent bug causing assigned Tracking Pixels to be bypassed on initial Route creation workflows.
v1.0.14
- Added a
project_urlcolumn mapping arbitrary frontend source projects (like Lovable builders) directly into theroutesschema. - Integrated a rigorous 3-step Route Sign-off approval system (
Page Author,Growth Representative,Tech Representative) directly into D1 SQLite logic. - Protected Ad Traffic integrity by blocking UI toggling natively through backend
api/routes/*/togglevia HTTP 400 rejections until complete route activation sign-offs are submitted. - Extended the
analytics_statsschema processing pipelines to natively parse and ingestutm_campaignmetrics from Proxy and Webhook feeds. - Intercepted the embedded
π Analyticsportal to inject expandable drill-down rows, surfacing high-performing Campaign attribution neatly underneath Source/Medium groupings.
v1.0.13
- Integrated dedicated preview domain mapping (
preview.purdyandfigg.com) dynamically into the Proxy Router to flawlessly bypass Vite/React Router SPAs base URL mismatches. - Updated the Admin Dashboard's proxy routing logic to natively detect the active preview host and correctly generate clickable preview URLs out to the user interface.
- Prevented ad-subdomain catch-all logic from accidentally swallowing
preview.test environments.
v1.0.12
- Built the dedicated Analytics reverse proxy workspace (
/analytics) natively outfitted with webhook handlers for Shopify, Elevar, Meta, Google, and Klaviyo payloads. - Eliminated static map variables and pushed global ad tracking into a dynamic
known_channelsD1 SQL table to share classifications smoothly between the router and analytics nodes. - Designed a resilient, high-volume Rolling Aggregate Metrics engine (
analytics_stats) to infinitely crunch proxy ad clicks and Elevar purchase webhook values directly into Cloudflare D1. - Injected a fully immersive
π AnalyticsData Visualization portal natively into the Admin Dashboard using embedded Chart.js APIs and glassmorphism styling parameters. - Re-architected project migrations into a tidy
sql/folder hierarchy and securely blocked backend Webhook HMAC secrets inside.dev.varsfrom pushing to Github. - Engineered synthetic GA4 debugging capabilities directly into the Admin Dashboard 'Test HTML' workflow.
- Created
POST /~internal/validate-ga4secure diagnostics bridge routing natively to the Google Analytics/debug/mp/collectAPI. - Re-mapped underlying analytics payload to send tracking interactions under the
proxy_ad_clicktag name to sidestep native Google Ads reservation filters. - Engineered a zero-latency
analytics-queueCloudflare Queue bridge allowing the Proxy Router to drop massive raw telemetry payloads intoanalytics_logswithout impacting user page load speeds - Built a background native Queue Consumer function into the
analyticsnode to handle asynchronous D1 BatchINSERTqueries and auto-purge metrics older than 90 days. - Exposed a secure
GET /api/analytics/rawAdmin endpoint to allow headless dumping of un-aggregated API logs. (to send to data proxy) - Performed a repo-wide Security Sweep: Ripped all clear-text production passwords/tokens from the
wrangler.tomlfiles and instituted local.dev.varsmasking. - Completely overhauled the
README.mdto document the unified GitHub Action deployments, infrastructure provisioning (npx wrangler queues), and secret key management workflows.
v1.0.11
- Expanded routing database schema to support arbitrary key-value custom routing parameters (
route_metadata) and UTM overrides. - Overhauled the Admin Dashboard with advanced tracking inputs for Custom Metadata Keys and UTMs.
- Significantly upgraded the Admin Dashboard UI with client-side Pagination, real-time Text Search filtering, and Active/Inactive status organization.
- Implemented a
DELETE /api/routes/:idAPI for hard-deleting routes along with their chained pixel binding and metadata history. - Upgraded the ad-source detector logic to dynamically extract channels from any subdomain prefix (e.g.
snapchat.purdyandfigg.com) recursively. - Refined reverse-proxy redirect logic to forcibly append and expose customized proxy variables directly inside the client's URL search bar, allowing local client-side Javascript tag reading.
v1.0.10
- Configured GitHub Actions CI/CD workflow to fully deploy all components (
router,admin,monitor) to Cloudflare automatically on push. - Overhauled Hetzner VPS deployment pipeline (
deploy_server) to natively pull code, sync JSONfallbackConfig.jsonroute states, and gracefully restartworkerd. - Whitelisted
het.purdyandfigg.comandhet.getpurdyandfigg.comas internal proxy hostnames so Ad testing redirects function natively on the backup cluster without jumping. - Activated the
/testroute infallbackConfig.jsonbundles to ensure strict200 OKhealth-checks from Hetzner instances instead of returning 404 Shopify fallbacks.
v1.0.0
- Added versioning and history tracking.
- Implemented automatic pruning of logs older than 48 hours in the proxy monitor.
- Added automated deployment workflows for Cloudflare workers and Hetzner VPS using GitHub actions.
- Introduced
deploy_hetznerfunctionality to auto-deploy to the Hetzner node cluster.