The Rove AL 700 is what you’ve come to love as the dependable go-anywhere steed. Perhaps you’re gravel-curious, but not quite sure of how often you’ll really want to push your limits off the paved road. That, my friend, is what the Rove AL 700 is here for. It’s the road biker’s gravel/touring/do-it-all steed. It provides everything you need for a fast, comfortable ride and nothing you don’t. It’s the perfect bike for commuting, partaking in weekend warrior adventures, or diving deeper into longer tours.Components
content":"\u003cp\u003e \u003c\/p\u003e\n\u003csection id=\"shopify-section-template--15666339381292__562a6646-41fc-4d3b-9fe0-4c3d22334652\" class=\"shopify-section shopify-section--custom-liquid\" data-mce-fragment=\"1\"\u003e\n\u003cdiv class=\"section section-full bg-custom text-custom\" data-mce-fragment=\"1\"\u003e\n\u003cdiv class=\"custom-product-description\" data-mce-fragment=\"1\"\u003e\n\u003cp data-mce-fragment=\"1\"\u003e\u003cspan data-mce-fragment=\"1\"\u003eThe Rove AL 700 is what you’ve come to love as the dependable go-anywhere steed. Perhaps you’re gravel-curious, but not quite sure of how often you’ll really want to push your limits off the paved road. That, my friend, is what the Rove AL 700 is here for. It’s the road biker’s gravel\/touring\/do-it-all steed. It provides everything you need for a fast, comfortable ride and nothing you don’t. It’s the perfect bike for commuting, partaking in weekend warrior adventures, or diving deeper into longer tours.\u003c\/span\u003e\
u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection id=\"shopify-section-template--15666339381292__94b2a615-ab63-42b9-ba46-55862e02cd3e\" class=\"shopify-section shopify-section--custom-liquid\" data-mce-fragment=\"1\"\u003e\n\u003cdiv class=\"section section-blends section-full\" data-mce-fragment=\"1\"\u003e\n\u003ca id=\"specs\" data-mce-fragment=\"1\"\u003e\u003c\/a\u003e\u003cspan\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"section section-blends section-full\" data-mce-fragment=\"1\"\u003e\n\u003cspan\u003e\u003c\/span\u003e\u003cbr\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"section section-blends section-full\" data-mce-fragment=\"1\"\u003e\n\u003ch3 data-mce-fragment=\"1\"\u003eSPECIFICATIONS\u003c\/h3\u003e\n\u003cdiv class=\"table_wrapper\" data-mce-fragment=\"1\"\u003e\n\u003cdiv class=\"scrollable-wrapper\"\u003e\n\u003ctable data-mce-fragment=\"1\"\u003e\n\u003ctbody data-mce-fragment=\"1\"\u003e\n\u003ctr data-mce-fragment=\"1\"\u00
9cb0b4-f8c1-740a-9811-1284dd89b0c8/restock-rocket-shopify-464/assets/restockrocket-collection.js'
window._RestockRocketConfig.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
const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = nowLoading more - liquidRenderedAt; // Age in seconds
// Handle client clock ahead of server
if (liquidCacheAge <. 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 .age = Date.now() - updatedAt.getTime();
if (age
!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
The Dew Deluxe is the workhorse of choice for commuters from all around the world, whether riding to work or to the grocery store. A reliable, easy-to-ride bike ensures a safe and efficient ride every time you’re on it. With upright and comfortable geometry, a reliable 11-speed drivetrain, hydraulic disc brakes, fast-rolling, puncture-resistant 650x47c tires, and fenders with mud flaps, the Dew Deluxe will get you there in no time at all.
SPECIFICATIONS
FRAME MATERIAL
Kona 6061 Aluminum Butted
SIZES
S, M, L, XL
REAR SHOCK
n/a
FORK
Kona Project Two Aluminum Disc
CRANKARMS
Samox
CHAINRINGS
38t
B/B
FSA 68mm
PEDALS
Kona JS2
CHAIN
KMC X11
CASSETTE
Shimano Deore 11-51t 11spd
CHAINGUIDE
n/a
F/D
n/a
R/D
Shimano Deore
SHIFTERS
Shimano Deore
BRAKE CALIPERS
Tektro HDM275 Hydraulic
FRONT BRAKE ROTOR
Tektro TR160 160mm
REAR BRAKE ROTOR
Tektro TR160 160mm
BRAKE LEVERS
Tektro HDM275 Hydraulic
HEADSET
Feimin FP-H863
HANDLEBAR
Kona Aluminum Riser
STEM
Kona Commuter
SEATPOST
Kona Thumb w/Offset 27.2mm
SEAT CLAMP
Kona Clamp
GRIPS
Kona Key Grip
SADDLE
Kona Commuter
FRONT HUB
Formula 100x9mm
REAR HUB
Formula 135x10mm
SPOKES
Stainless Black 14g
RIMS
Double Wall alloy
FRONT TIRE
WTB Horizon Comp w/ Puncture Protection 650x47c
REAR TIRE
WTB Horizon Comp w/ Puncture Protection 650x47c
PAINT COLOR
Gloss Porcelain w/ Charcoal & Cyan Decals
EXTRAS
Fenders w/ Mudflaps & Kickstand
All specifications are subject to change without notice
GEOMETRYmminches
SIZE
S
M
L
XL
1
ST LENGTH
420
470
520
580
2
TT LENGTH
550
597
636
686
3
REACH
398
423
439
465
4
STACK
569
607
644
682
5
STANDOVER
687
722
757
798
6
HT ANGLE
70.0
70.0
70.0
70.0
7
HT LENGTH
135
175
215
255
8
ST ANGLE
75.0
74.0
73.0
72.0
9
CS LENGTH
450
450
450
450
10
BB DROP
70
70
70
70
11
BB HEIGHT
272
272
272
272
12
WHEELBASE
1077
1116
1146
1185
13
FRONT CENTER
636
675
705
744
14
FORK LENGTH
410
410
410
410
15
FORK OFFSET
50
50
50
50
Thanks for considering ProjektRide for your next purchase. All bikes are fully assembled and test rode before leaving our bike shop in Edinburgh. Please allow 5-7 days for bicycle delivery although we aim to post bikes out the same day.
If any purchases are to be made using any cycle to work schemes, please either pop into the shop or get in touch via email/phone to get the ball rolling. If you are not 100% sure with bike sizing, please feel free to contact us to double check.
All bike sales include a free running in service after 6-10 weeks.
ProjektRide
Buy Sell Ride Confident
FAQ
Questions and answers
Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -