.blog-post { display: block; } .blog-post h3 { display: block; z-index: 1; transition: color 0.25s ease-in-out; margin: 1em 0; padding-bottom: 10px; color: #b5b5b5; font-size: calc(1rem*var(---font-adjust-heading)); } .blog-post h3 strong { display: block; margin-top: 0.5em; color: var(--text); font-size: calc(2rem*var(---font-adjust-heading)); } .blog-post header { position: relative; } .blog-post .excerpt { margin-bottom: 2rem; } .blog-post header a { z-index: 2; position: absolute; left: 0; top: 0; width: 100%; height: 100%; } .blog-post .image-container { display: block; position: relative; width: 100%; height: 0; overflow: hidden; padding-top: 50%; background: rgb(24,69,74); background: linear-gradient(326deg, rgba(24,69,74,1) 0%, rgba(35,87,93,1) 100%); } .blog-post .image-container img { object-fit: cover; object-position: center; position: absolute; left: 0; top: 0; width: 100%; height: 100%; transform: scale(1); transition: 0.25s ease-in-out; } .blog-post:hover .image-container img { transition: 0.25s ease-in-out; transform: scale(1.2); } .pr-pagniation .page { display: inline-block; font-size: 100%; width: auto; border-radius: 3px; margin-right: 0.5rem; background-color: #ececec; width: 1.8rem; text-align: center; padding: 0.15rem 0; color: var(--text); } .pr-pagniation .prev { margin-right: 0.6rem; } .pr-pagniation .prev a, .pr-pagniation .next a { text-decoration: none !important; color: inherit; transition: color 0.25s ease-in-out; } .pr-pagniation .prev a:hover , .pr-pagniation .next a:hover { color: #f60; transition: color 0.25s ease-in-out; } .pr-pagniation .page a { text-decoration: none !important; } .pr-pagniation .page a:hover { color: #f60; } .pr-pagniation .page.current a:hover { color: inherit; } .pr-pagniation .page.current { display: inline-block; font-size: 100%; width: auto; border-radius: 3px; margin-right: 0.5rem; background-color: #242424; width: 1.8rem; text-align: center; padding: 0.15rem 0; color: white; } .blog-tags-list { justify-content: left !important; } .blog-tags-list .blog-tag{ text-decoration: none !important; }
Find a blog to read below

Genesis Croix de Fer 40 — Long-Distance Comfort Meets Modern Gravel

Posted by andy graham on Posted by Andy graham on Jan 16, 2026

Genesis Croix de Fer 40 — Long-Distance Comfort Meets Modern Gravel

Genesis Equilibrium — Lightweight All-Rounder

The 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.

The Tech: Modernized Steel

    Read more >>
  • Steel frame tuned for comfort and stiffness balance

  • Carbon fork reduces vibration for long rides

  • Posted by Andy graham on Jan 16, 2026

    Shimano mid- to high-range groupset for smooth, reliable shifting

    Genesis Equilibrium Disc — Balanced Performance for Gravel & Road
  • Hydraulic disc brakes for consistent stopping power

  • Read more >>
  • Multiple mounts for racks, fenders, and water bottles

The Benefit : Ride longer, carry more, and experience the smooth, forgiving ride that steel delivers without sacrificing modern performance.

The "Sag" Posted by Andy graham on Jan 16, 2026: Slight frame flex and compliant tyres absorb road chatter, keeping your hands and wrists fresh even after hours in the saddle.

Genesis Vagabond Frameset — Custom Adventure Build

Why It’s Different

  1. Endurance GeometryRead more >>: Comfortable position for long days on the bike

  2. Reliable Components : Shimano drivetrain and disc brakes ensure confidence in all conditions

  3. Posted by Andy graham on Jan 16, 2026

    Touring & Gravel Ready : Perfect for bikepacking or multi-day adventuresGenesis Vagabond Full Bike — Ultimate Adventure Ready

Is It Right For You?

Read more >>
  • Gravel explorers covering long distances

  • Cyclists planning extended tours with gear

  • Posted by Andy graham on Jan 16, 2026

.

← Older PostRead more >> Newer Post →

>>
Website by
Juan Borges Designs 0) { console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else if (liquidCacheAge <= LIQUID_CACHE_MAX_AGE) { console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else { console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`); window._RestockRocketConfig.isLiquidCacheFresh = false; } } 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-language 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 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