This site has limited support for your browser. We recommend switching to Edge, Chrome, Safari, or Firefox.This site has limited support for your browser. We recommend switching to Edge, Chrome, Safari, or Firefox.

Create account
Search
Cart
to qualify for free shipping

Congratulations! Your order qualifies for free shipping
p class="result__title">{{ it.item.text }} > { "@context": "http://schema.org", "@type": "Organization", "name": "ProjektRide","sameAs": [ null, null, null, null, null, null, null ], "url": "https:\/\/projektride.co.uk" }
Header Image





Riders seeking a comfortable, high-performance steel bike


Genesis Vagabond 20 — Enhanced Adventure PerformanceAvailable at ProjektRide Bike Shop in Edinburgh

{ "@context": "http://schema.org", "@type": "Article", "articleBody": "Genesis Croix de Fer 40 — Long-Distance Comfort Meets Modern Gravel\nThe Croix de Fer 40 is engineered for riders who demand a combination of classic steel comfort and modern component performance. Ideal for extended gravel rides and loaded touring, this model offers both endurance geometry and precise handling.\nThe Tech: Modernized Steel\n\n\nSteel frame tuned for comfort and stiffness balance\n\n\nCarbon fork reduces vibration for long rides\n\n\nShimano mid- to high-range groupset for smooth, reliable shifting\n\n\nHydraulic disc brakes for consistent stopping power\n\n\nMultiple mounts for racks, fenders, and water bottles\n\n\nThe Benefit: Ride longer, carry more, and experience the smooth, forgiving ride that steel delivers without sacrificing modern performance.\nThe \"Sag\": Slight frame flex and compliant tyres absorb road chatter, keeping your hands and wrists fresh even after hours in the saddle.\nWhy It’s Different\n\n\nEndurance Geometry: Comfortable position for long days on the bike\n\n\nReliable Components: Shimano drivetrain and disc brakes ensure confidence in all conditions\n\n\nTouring \u0026amp; Gravel Ready: Perfect for bikepacking or multi-day adven

Posted by Andy graham on Jan 16, 2026
Genesis Vagabond 10 — Adventure Touring Made Simple

<
div class="rich-text__image-bg bg-pos-left-center no-js-image" style="background-image: url(//projektride.co.uk/cdn/shop/files/6C38B349-FE2F-4327-BC62-F8425A4062B6_2048x.jpg?v=1695398151);"> Read more of our blogs1Learn more about the latest trends by keeping up to date with our latests posts BLOG POSTS2 3 4Newsletter Subscribe for updates5 6 Subscribe to our newsletter29 .site-footer { --bg: #1f2324; --text: #ffffff; --text-alpha-15: rgba(255, 255, 255, 0.15); --text-alpha-60: rgba(255, 255, 255, 0.6); --text-alpha-85: rgba(255, 255, 255, 0.85); } .footer-content__logo__image { width: 170px; }
< img src="//projektride.co.uk/cdn/shop/files/logo_header_2048x2048.png?v=1634060673" alt="" class="logo--footer">
SETTINGS_CACHE_DURATION) { console.debug('STOQ - settings changed recently, skipping cache'); return null; } return settings; } catch (error) { console.debug('STOQ - Error checking settings cache:', error); return null; } } function createRestockRocketContainer() { const restockRocketContainer = document.createElement('div'); restockRocketContainer.id = 'restock-rocket'; document.body.appendChild(restockRocketContainer); } function createRestockRocketScript(scriptUrl) { const restockRocketScriptElement = document.createElement('script'); restockRocketScriptElement.setAttribute('defer', 'defer'); restockRocketScriptElement.src = scriptUrl; document.body.appendChild(restockRocketScriptElement); } createRestockRocketContainer() console.debug('STOQ - extension activated') function applyTranslations(settings) { try { // Skip translation logic entirely if multi-language is not enabled if (!settings || !settings.multi_language_enabled) { return settings; } if (!settings.translations) { console.debug('STOQ - No translations found, skipping translation'); return settings; } const normalizedLocale = window._RestockRocketConfig.normalizedLocale; const translations = settings.translations; if (!normalizedLocale) { // No matching locale has translations; drop payload to save memory console.debug('STOQ - No matching locale for translations. Available:', Object.keys(translations || {})); delete settings.translations; return settings; } console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`); const translatedFields = translations[normalizedLocale]; if (translatedFields && typeof translatedFields === 'object') { Object.keys(translatedFields).forEach(function(key) { const value = translatedFields[key
]; if (value !== null && value !== undefined && value !== '') { settings[key] = value; } }); } else { console.debug('STOQ - No translated fields found for locale:', normalizedLocale); } delete settings.translations; return settings; } catch (e) { console.debug('STOQ - error applying translations:', e); return settings; } } // Setup event listener for cart selling plan updates // This must be called before any scripts are loaded to avoid race conditions function setupCartSellingPlanUpdater(settings) { // Setup listener regardless - updateCartSellingPlans has its own guards // This ensures cleanup happens even when preorders are disabled globally // Listen for stoq:inventory-data-loaded event dispatched by api.js window.addEventListener('stoq:inventory-data-loaded', function(event) { console.debug('STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) { window._RestockRocket.updateCartSellingPlans() .then(hasUpdates => { 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); }); } }); } // First try to get settings from metafields with expiry check const cachedSettings = window._RestockRocketConfig.cachedSettings; const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; if (validCachedSettings) { console.debug('STOQ - using cached settings'); initializeScripts(validCachedSettings); } else { console.debug('STOQ - fetching fresh settings'); const headers = { 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.S
hopify.shop, 'ngrok-skip-browser-warning': 'skip' }; if (window.Shopify?.theme?.role === 'main') { headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name; headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version; headers['X-Shopify-Theme-Store-Id'] = window.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(cac hedSettings); } 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(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); // Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions setupCartSellingPlanUpdater(settings); 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._RestockRocketCon