Header Image

Ethiopia (ETBBr) _start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}],"disabled_plan_ids":[713813721471,713176482175,714631872895],"cached_at":"2026-04-09T09:16:46Z"}; if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) { // Find the maximum updated_at from all items in old array abled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":3500,"price_min":3500,"price_max":3500,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":55294475927935,"title":"Black","option1":"Black","option2":null,"option3":null,"sku":"KNG12144","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Knog Plus Light Twinpack - Black","public_title":"Black","options":["Black"],"price":3500,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":55294475960703,"title":"Clear","option1":"Clear","option2":null,"option3":null,"sku":"KNG12145","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Knog Plus Light Twinpack - Clear","public_title":"Clear","options":["Clear"],"price":3500,"weighFaroe Islands (DKKkr.) ride.co.uk\/cdn\/shop\/files\/Screenshot2025-04-08at12.45.33.png?v=1744112911"},"aspect_ratio":0.987,"height":1196,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/Screenshot2025-04-08at12.45.33.png?v=1744112911","width":1180}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eThe Plus Bike Light Twinpack is a super-bright set that can be mounted on your bike or clipped onto your clothing, helmet, backpack etc. Equally impressive as primary or secondary bike lights, Plus is perfect for commuters and road cyclists alike\u003c\/p\u003e\n\u003cp\u003eOur most versatile bike lights ever. Mount to your handlebar, front fork, or remove from the mount and clip it onto just about anything.\u003c\/p\u003e\n\u003cp\u003eFeatures:\u003c\/p\u003e\n\u003cp\u003eBe seen from up to 450 metres away\u003cbr\u003eLatest COB Technology - Efficient Chip on Board (COB) LEDs provide maximum brightness level for up to 90% of the battery burn time.\u003cbr\u003eIntegrated USB Connecto add('stoq-buy-now-pending'); setTimeout(function () { document.documentElement.classList.remove('stoq-buy-now-pending'); }, 6000); } } catch (e) { /* fail open */ } window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-product-bis.js' window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/019faf5b-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/assets/restockrocket-collection-bis.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, windoFinland (EUR€) < <
<
che age if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) { console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh'); window._RestockRocketConfig.isLiquidCacheFresh = true; window._RestockRocketConfig.liquidCacheAge = null; } else { const now = Math.floor(Date.now() / 1000); // Current time in seconds const liquidCacheAge = now - liquidRenderedAt; // Age in seconds // Surfaced into funnel events: a stale cache means the app rendered with // outdated inventory/selling-plan data — a real "had the opportunity but // failed" cause. Negative (client clock ahead) clamps to 0. window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge); // Handle client clock ahead of server if (liquidCacheAge France (EUR€) 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
age = Date.now() - updatedAt.getTime(); if (age 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') // Fire stoq_initialized once per page load so the funnel pipeline has a definitive // "our code ran on this page" signal independent of any cus
French Southern Territories (EUR€) onStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1; window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq)); } catch (e) { /* sessionStorage unavailable (private mode) — leave 0 */ } Shopify?.analytics?.publish?.('stoq_initialized', { cart_token: _stoqInitConfig.cartToken || '', page_url: window.location.href, page_type: _stoqInitConfig.pageType || '', shop_domain: _stoqInitConfig.shop || '', market_id: _stoqInitConfig.marketId || '', // Buyer's storefront country (localization.country.iso_code). Seeds the // pixel's extension_details blob so it rides forward onto Shopify's native // events too — a market can span countries, so this is the finer signal. country_code: _stoqInitConfig.countryIsoCode || '', detected_variant_ids: _stoqDetectedVariantIds, selected_variant_id: _stoqSelectedVariantId || '', page_load_seq: _stoqPageSeq, liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0, app_version
rm so it's correct on collection/index/search too. block_accelerated_checkout // context (STOQ-1612) rides in `properties` (forwarded verbatim by the pixel, no schema // change): a buy_now click on a preorder variant while the gate was armed is a visible // bypass signal for order debug. Also sends page_url (top-level, like the pixel's native // events) and two preorder signals in properties (see below). try { var _sqTrack = window._RestockRocketConfig; if (_sqTrack.preordersConfigured) { document.addEventListener('click', function (e) { try { var t = e.target; if (!t || !t.closest) return; var host = t.closest('.shopify-payment-button, shopify-payment-terms'); if (!host) return; var channel = host.matches && host.matches('shopify-payment-terms') ? 'shop_pay_installments' : 'buy_now'; var form = host.closest('form'); var vidEl = form && form.querySelector('[name="id"]'); var variantId =
Georgia (GBP£)
Comoros (KMFFr) Congo - Brazzaville (XAFCFA)
Congo - Kinshasa (CDFFr)
Côte d’Ivoire (XOFFr)
Croatia (EUR€)
Greenland (DKKkr.)

Cyprus (EUR€)

Guadeloupe (EUR€)

Czechia (CZKKč)

Guernsey (GBP£)
Denmark (DKKkr.)
Guinea (GNFFr)
Djibouti (DJFFdj)
Guinea-Bissau (XOFFr) Egypt (EGPج.م) Postage is free on orders over £50. Orders under £50, our postage charge is £3.99. ProjektRide Bike Shop Edinburgh Equatorial Guinea (XAFCFA) Iceland (ISKkr) Eritrea (GBP£) #SiteFooter { --PT: 100px; --PB: 10px; --bg-lighten-darken-shimmer-bg: #0d0d0d; --bg-lighten-darken-shimmer-effect: #121212; --text: #ffffff; --text-alpha-15: rgba(255, 255, 255, 0.15); --text-alpha-50: rgba(255, 255, 255, 0.6); --text-alpha-85: rgba(255, 255, 255, 0.85);--border: #ffffff;} #SiteFooter .footer-bottom { --grid-columns: 3; }Estonia (EUR€)
Frame Hungary (HUFFt) We also have a physical store, if you are local please pop in -High-performance hydroformed alloy, Removable Integrated Battery, internal cable routing, Motor Armour, post-mount disc 82 Newington Road, EH91QN, Edinburgh.
Fork SR Suntour NVX30, coil spring, preload adjuster, 100 mm QR, 60 mm travel Ireland (EUR€)
Isle of Man (GBP£)
Eswatini (GBP£)
Italy (EUR€)
Ethiopia (ETBBr) Jersey (GBP£)
Faroe Islands (DKKkr.) Kenya (KESKSh) Kosovo (EUR€) France (EUR€) Latvia (EUR€) Lesotho (GBP£) Liberia (GBP£) Gambia (GMDD) Libya (GBP£) Cookie Policy Liechtenstein (CHFCHF) Lithuania (EUR€) Ghana (GBP£) Luxembourg (EUR€)
Finland (EUR€)
French Southern Territories (EUR€)
Gabon (XOFFr) Bontrager Connection, double-wall, 32-hole, 20 mm width, Presta valve Privacy Policy
Spokes 14 g stainless steel, blackGeorgia (GBP£) Terms of Service
Germany (EUR€)
Gibraltar (GBP£)
Madagascar (GBP£)
Greece (EUR€)
Malawi (MWKMK)
Mali (XOFFr) Mauritania (GBP£) Moldova (MDLL)
Malta (EUR€)
Mauritius (MUR₨)
Mayotte (EUR€)
Monaco (EUR€)
Montenegro (EUR€)
Morocco (MADد.م.)
Mozambique (GBP£) Namibia (GBP£) Netherlands (EUR€) Niger (XOFFr) Nigeria (NGN₦) North Macedonia (MKDден) Norway (GBP£) Poland (PLNzł) Portugal (EUR€) Réunion (EUR€)
Romania (RONLei)
Rwanda (RWFFRw)
San Marino (EUR€) Senegal (XOFFr) Sierra Leone (SLLLe) Somalia (GBP£)
São Tomé & Príncipe (STDDb)
Serbia (RSDРСД)
Seychelles (GBP£)
Slovakia (EUR€)
Slovenia (EUR€)






.
Greece (EUR€)
St. Helena (SHP£) American Express Greenland (DKKkr.) Diners Club Svalbard & Jan Mayen (GBP£) Discover Google Pay Guinea (GNFFr) Klarna
WeightSudan (GBP£) Apple Pay L - 26.60 kg / 58.65 lbs (excluding battery) Guadeloupe (EUR€)
Weight limit Guernsey (GBP£) This bike has a maximum total weight limit (combined weight of bicycle, rider and cargo) of 136 kg (300 lb).Sweden (SEKkr)
Switzerland (CHFCHF) Maestro
Guinea-Bissau (XOFFr) Mastercard
Tanzania (TZSSh)
PayPal

We reserve the right to make changes to the product information contained on this site at any time without notice, including with respect to equipment, specifications, models, colours, materials and pricing. Due to supply chain issues, compatible parts may be substituted at any time without notice. The prices shown are the manufacturer's suggested retail prices.Hungary (HUFFt)

Shop Pay
Togo (XOFFr)

Bike and frame weights are based on pre-production painted frames at time of publication. Weights may vary in final production.Iceland (ISKkr) Union Pay

Tristan da Cunha (GBP£)

Ireland (EUR€)
Tunisia (GBP£)
Isle of Man (GBP£) Türkiye (GBP£)
Italy (EUR€)
Uganda (UGXUSh)

Jersey (GBP£)

Ukraine (UAH₴)
  • Kenya (KESKSh) United Kingdom (GBP£)

    Kosovo (EUR€) United States (GBP£) Latvia (EUR€)

    Vatican City (EUR€)
  • Lesotho (GBP£) Western Sahara (MADد.م.)

    Liberia (GBP£)

    Zambia (GBP£)

    Libya (GBP£)

    Zimbabwe (USD$)
Liechtenstein (CHFCHF)
Mayotte (EUR€)