FramesLog in

Create account

Search
>
>
p class="result__title"> Submit your search request
a href="{{ it.product.url }}">{{ it.product.title }}
>

Kona Clamp
GRIPS
Kona Key Grip Slip on
Header Image
e and freshen your bike with Bike Protect’s incredible water dispersing action! It’s a perfect ‘all over’, after-wash corrosion inhibitor due to its extremely high oil content. This increased oil content creates the finest bike protection spray on the market.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eIt drives out moisture and leaves a sparkling, non-sticky protective layer on your frame, drive chain, metal parts and paintwork. It’s ideal to spray onto your chain to drive out moisture before you apply any of our brilliant Muc-Off chain lubes.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003eBike Protect doesn’t just disperse water after you’ve given your bike a good clean. It also prevents dirt adhesion between washes and reduces future maintenance time as well as helping reduce friction, wear and energy consumption.\u003c\/p\u003e\n\u003cp data-mce-fragment=\"1\"\u003e*Just remember not to apply Bike Protect to your tyre treads and braking surfaces!\u003c\/p\u003e\n\u003cul\u003e[]
{ "@context": "http://schema.org/", "@type": "Product", "name": "Muc-Off Bike Protect", "url": "https:\/\/projektride.co.uk\/products\/muc-off-bike-protect","image": [ "https:\/\/projektride.co.uk\/cdn\/shop\/products\/975447ebcfc5b246d6c12d08fa9598c9f4ccedc0_1088x.jpg?v=1638900511" ],"description": "\nBike Protect is the ultimate liquid bicycle protection. Preserve and freshen your bike with Bike Protect’s incredible water dispersing action! It’s a perfect ‘all over’, after-wash corrosion inhibitor due to its extremely high oil content. This increased oil content creates the finest bike protection spray on the market.\nIt drives out moisture and leaves a sparkling, non-sticky protective layer on your frame, drive chain, metal parts and paintwork. It’s ideal to spray onto your chain to drive out moisture before you apply any of our brilliant Muc-Off chain lubes.\nBike Protect doesn’t just disperse water after you’ve given your bike a good clean. It also prevents dirt adhesion between washes and reduces future maintenance time as well as helping reduce friction, wear and energy consumption.\n*Just remember not to apply Bike Protect to your tyre treads and braking surfaces!\n\nHigh performance formula leaves dry, non-sticky protective film\nSafe on frame, metal parts, plastics, rubber, paint and carbon fibre\nDrives out excess moisture\nPrevents dirt adhesion\nLight lubricant coats moving parts\nQuick and easy to use\n500ml Aerosol Spray\n","sku": "909","brand": { "@type": "Thing", "name": "Muc-Off" },"gtin8": "5037835909005","gtin13": "5037835909005","offers": [{ "@type" : "Offer","sku": "909","availability" : "http://schema.org/InStock", "price" : 9.99, "priceCurrency" : "GBP", "url" : "https:\/\/projektride.co.uk\/products\/muc-off-bike-protect?variant=42134186557666" } ] }

<
<<
<
<
<span class="visually-hidden">ENVE Carbon Road Hub
>
>
ENVE G27 650b Gravel RimWorking HoursPlease get in touch with a member of the team either by phone (
td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eSPOKES\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eStainless 14g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eRIMS\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eWTB SX19\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eFRONT TIRE\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eWTB Horizon Comp Puncture Protect 650x47c\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eREAR TIRE\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eWTB Horizon Comp Puncture Protect 650x47c\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"a
-fragment=\"1\"\u003eBATTERYLOCK\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eAbus\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003ePAINT COLOR\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eSatin Black w\/ Metallic Mint \u0026amp; Metallic Silver Decals\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr class=\"altercolor\" data-mce-fragment=\"1\"\u003e\n\u003ctd class=\"label\" data-mce-fragment=\"1\"\u003eEXTRAS\u003c\/td\u003e\n\u003ctd class=\"data\" data-mce-fragment=\"1\"\u003eFenders, Front \u0026amp; Rear Light, Kickstand\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"specs_notice\" data-mce-fragment=\"1\"\u003eAll specifications are subject to change without notice\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv id=\"kro_geo\" data-mce-fragment=\"1\"\u003e\n\u003ch3 data-mce-fragment=\"1\"\u003e\u at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true}];window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9bc1-23b1ca52ddb0","shop_id":38436,"enabled":true,"page_types":["product","collection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-collection.js' window._RestockRocketConfigdow.Shopify.theme.theme_store_id; } fetch( `${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`, { headers } ) .then(function(response) { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(function(settings) { initializeScripts(settings); }) .catch(function(error) { // If request failed and we have cached settings (even if expired), use them as fallback if (cachedSettings) { console.debug('STOQ - using expired cached settings as fallback'); initializeScripts(cachedSettings); } else { console.error('STOQ - failed to load settings:', error); } }) .catch(function(e) { console.error(e) }) } function initializeScripts(settings) { settings = applyTranslations(settings); window._RestockRocketConfig.settings = settings; console.debug(`STO .scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) window._RestockRocketConfig.host = 'https://app.restockrocket.io' const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds function checkSettingsExpiry(settings) { try { if (!settings || !settings.updated_at) { console.debug('STOQ - Invalid settings data structure'); return null; } if (!settings.cache) { console.debug('STOQ - settings caching disabled'); return null; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // Translations enabled but no translation data in metafield // Metafield hasn't been backfilled yet - force refresh console.debug('STOQ - multi-languageQ - settings configured for ${window._RestockRocketConfig.pageType}`); if(settings.enable_app) { const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) { return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType); }) if(window._RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlColl
enabled but no translation data in cache, fetching fresh'); return null; } // Translations object exists in metafield - cache is valid // If current locale isn't translated, applyTranslations will gracefully use default locale from base fields if (window._RestockRocketConfig.normalizedLocale && !Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) { console.debug('STOQ - locale not explicitly translated, will use default language from cache'); } // Don't return null - continue using cache even for untranslated locales } const updatedAt = new Date(settings.updated_at); if (isNaN(updatedAt.getTime())) { console.debug('STOQ - Invalid updated_at date format in settings'); return null; } const age = Date.now() - updatedAt.getTime(); if (age ection); } else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'product') { createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct); } else if(hijackIntegration) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enabled for ${window._RestockRocketConfig.pageType}`); } // Check and update cart selling plans after scripts are loaded if (settings.preorder_enabled) { updateCartSellingPlans(); } // Dispatch custom event when app is loaded const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockRocketConfig.pageType, enabled: settings.enable_app, settings: sett { if (hasUpdates) { console.debug('STOQ - cart selling plans updated successfully'); } else { console.debug('STOQ - no cart selling plan updates needed'); } }) .catch(error => { console.error('STOQ - error updating cart selling plans:', error); }); } else if (attempt