Master the Bike

Your guide to cycling stronger, faster, and smarter.

Cycling Techniques

Climbing

Master seated and standing climbs for efficiency and power.

Descending

Build confidence and control on technical descents.

Cadence

Find your optimal RPM for endurance and speed.

Cornering

Learn to hold your line and maintain speed through turns.

Pacing

Execute your race plan perfectly from start to finish.

Bike Maintenance Essentials

1. Remove the wheel. 2. Use tire levers to remove one side of the tire bead. 3. Pull out the old tube. 4. Check inside the tire for sharp objects. 5. Slightly inflate the new tube and insert it. 6. Use levers to put the tire back on. 7. Inflate to the correct pressure.

A clean chain is a fast chain. 1. Use a degreaser and brush to scrub the chain, cassette, and chainrings. 2. Rinse thoroughly with water. 3. Dry the chain completely with a rag. 4. Apply one drop of bike-specific lube to each chain link roller. 5. Let it sit for a few minutes, then wipe off all excess lube.

Before every ride, check your brakes. 1. Squeeze your brake levers; they should feel firm, not spongy, and stop well before hitting the handlebar. 2. Check your brake pads for wear; replace them if the grooves are gone. 3. Ensure pads are aligned with the rim (for rim brakes) or rotor (for disc brakes) and not rubbing.

Training Plans

Structured workouts for every goal, from your first century to a new PR.

Find Your Plan

Gear Guides

Reviews and recommendations for bikes, helmets, accessories, and more.

Browse Gear

Latest Cycling Articles

Cycling Tools & Tips

Gear Ratio Calculator
Cycling Tip of the Day

Loading tip...

Anatomy of a Bike
Bike Anatomy

Learn the key components of your machine.

Indoor vs. Outdoor

  • Develops real-world bike handling, cornering, and descending skills.
  • Builds resilience to elements like wind and heat.
  • Engages different muscle groups for balance and control.
  • Allows for highly specific, uninterrupted interval training (e.g., ERG mode).
  • Provides a safe, consistent environment regardless of weather or time of day.
  • Perfect for focused power-building sessions.

Upcoming Cycling Events (Dummy)

Dec 01, 2025
Tour de BangladeshStage Race - All Divisions
Feb 10, 2026
Chittagong Hill ClimbRoad Race - Chittagong, BD

What Cyclists Say

Cycling FAQs

Cadence is your pedaling speed, measured in revolutions per minute (RPM). Most cyclists aim for a cadence between 80-100 RPM for optimal efficiency, blending power with endurance.

It depends on your riding conditions. A good rule of thumb is every 100-150 miles (160-240 km) or after any wet ride. A clean, lubed chain is quieter, shifts better, and lasts much longer.

Get Cycling-Specific Updates

Subscribe for bike maintenance tips, new gear reviews, and training plans.

Loading...

// --- Theme & Accent Logic (from Trihardmurad) --- const accentDots = document.querySelectorAll('.accent-dot'); const themeSwitch = document.getElementById('themeSwitch'); const themeSwitchDot = document.getElementById('themeSwitchDot'); const themeIcon = document.getElementById('toggleIcon'); const html = document.documentElement; function applyTheme(t){ html.setAttribute('data-theme',t); localStorage.setItem('site-theme',t); if(t==='dark'){ themeSwitchDot.style.left='23px'; themeIcon.className='fas fa-moon mr-2'; } else { themeSwitchDot.style.left='3px'; themeIcon.className='fas fa-sun mr-2'; } setPrimaryRgbVariable(); } function applyAccent(a){ html.setAttribute('data-accent',a); localStorage.setItem('site-accent',a); accentDots.forEach(d=>d.setAttribute('aria-checked', d.dataset.accent === a)); setPrimaryRgbVariable(); drawHamburger(); } function setPrimaryRgbVariable() { try { const pC=getComputedStyle(html).getPropertyValue('--primary').trim(); if(pC.startsWith('#')){const r=parseInt(pC.substring(1,3),16),g=parseInt(pC.substring(3,5),16),b=parseInt(pC.substring(5,7),16); html.style.setProperty('--primary-rgb',`${r},${g},${b}`);} else if(pC.startsWith('rgb')){const m=pC.match(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/); if(m)html.style.setProperty('--primary-rgb',`${m[1]},${m[2]},${m[3]}`); else html.style.setProperty('--primary-rgb',`32,201,151`);} else html.style.setProperty('--primary-rgb',`32,201,151`);}catch(e){console.warn("RGB parse error."); html.style.setProperty('--primary-rgb',`32,201,151`);}} function drawHamburger(){ const accent=getComputedStyle(document.documentElement).getPropertyValue('--primary').trim()||'#20c997'; const svg=`data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath stroke='${encodeURIComponent(accent)}' stroke-width='2' d='M3 6h18M3 12h18M3 18h18' stroke-linecap='round'/%3E%3C/svg%3E`; const el=document.getElementById('hamburgerSvg'); if(el){ el.style.backgroundImage=`url("${svg}")`; el.style.backgroundSize='20px 20px'; el.style.display='inline-block'; el.style.width='24px'; el.style.height='24px'; } } if(themeSwitch) themeSwitch.addEventListener('click', () => applyTheme(html.getAttribute('data-theme')==='dark'?'light':'dark')); accentDots.forEach(dot => dot.addEventListener('click', () => applyAccent(dot.dataset.accent))); const storedTheme = localStorage.getItem('site-theme')||'light'; const storedAccent = localStorage.getItem('site-accent')||'green'; applyTheme(storedTheme); applyAccent(storedAccent); drawHamburger(); // --- Toast Notification --- const toastEl = document.getElementById('toastNotification'); let toastTimeout; function showToast(message, isError = false) { clearTimeout(toastTimeout); toastEl.textContent = message; isError ? toastEl.classList.add('error') : toastEl.classList.remove('error'); toastEl.classList.add('show'); toastTimeout = setTimeout(() => { toastEl.classList.remove('show'); }, 3000); } // --- Newsletter Form Submission --- const newsletterForm = document.getElementById('newsletterForm'); if (newsletterForm) { newsletterForm.addEventListener('submit', async (e) => { e.preventDefault(); const emailInput = document.getElementById('newsletterEmail'); const email = emailInput.value; const button = newsletterForm.querySelector('button'); button.disabled = true; button.textContent = 'Subscribing...'; try { await addDoc(collection(db, 'newsletter_subscriptions'), { email: email, source: 'Cycling Page', // Updated source subscribedAt: serverTimestamp() }); showToast('Subscription successful! Thank you.'); emailInput.value = ''; } catch (error) { console.error("Newsletter sub error:", error); showToast('Subscription failed. Please try again.', true); } finally { button.disabled = false; button.textContent = 'Subscribe'; } }); } // --- Footer Contact Form --- window.handleContact = async function(e, formId){ e.preventDefault(); const form = document.getElementById(formId); if (!form) return; const btn = form.querySelector('button[type="submit"]'); const originalText = btn.textContent; btn.disabled = true; btn.textContent = 'Sending...'; try { let name = form.querySelector('#cname').value; let email = form.querySelector('#cemail').value; let message = form.querySelector('#cmsg').value; await addDoc(collection(db,'contacts'), { name, email, message, source: formId, createdAt: serverTimestamp() }); showToast('Thanks!'); form.reset(); } catch(err){ showToast('Send failed.',true); } finally { btn.disabled = false; btn.textContent = originalText; } }; const footerForm = document.getElementById('mainContact'); if (footerForm) footerForm.addEventListener('submit', (e) => handleContact(e, 'mainContact')); // --- Scroll-to-Top FAB --- const scrollTopFab = document.getElementById('scrollTopFab'); if (scrollTopFab) { window.addEventListener('scroll', () => { if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) { scrollTopFab.style.display = 'flex'; scrollTopFab.style.opacity = '1'; } else { scrollTopFab.style.opacity = '0'; setTimeout(() => { if (!(document.body.scrollTop > 100 || document.documentElement.scrollTop > 100)) { scrollTopFab.style.display = 'none'; } }, 300); } }); scrollTopFab.addEventListener('click', () => window.scrollTo({ top: 0, behavior: 'smooth' })); } // --- Floating Quote Card (Cycling Focused) --- const quotes = [ { text: "It never gets easier, you just get faster.", author: "G. LeMond" }, { text: "Ride as much or as little, as long or as short as you feel. But ride.", author: "E. Merckx" }, { text: "The bicycle has a soul. If you succeed in loving it, it will give you emotions that you will never forget.", author: "M. Cipollini" }, { text: "Life is like riding a bicycle. To keep your balance, you must keep moving.", author: "A. Einstein" } ]; const quoteTextEl = document.getElementById('quoteText'); const quoteAuthorEl = document.getElementById('quoteAuthor'); let quoteIndex = 0; function updateQuote(){ if (!quoteTextEl || !quoteAuthorEl) return; quoteTextEl.style.opacity = '0'; quoteAuthorEl.style.opacity = '0'; setTimeout(() => { let newIndex = quoteIndex; while (newIndex === quoteIndex) { newIndex = Math.floor(Math.random() * quotes.length); } quoteIndex = newIndex; quoteTextEl.textContent = `"${quotes[quoteIndex].text}"`; quoteAuthorEl.textContent = `— ${quotes[quoteIndex].author}`; quoteTextEl.style.opacity = '1'; quoteAuthorEl.style.opacity = '1'; }, 500); } updateQuote(); setInterval(updateQuote, 8000); // --- Page Transitions --- document.querySelectorAll('a.nav-link, a.dropdown-item, .card-body a, .plan-card a, .race-list-item a, .blog-card a, .author-bio a, .pb-ticker-card a, .coach-spotlight a, .gear-spotlight a').forEach(a=>{ a.addEventListener('click', (ev)=>{ const href = a.getAttribute('href'); if (a.hasAttribute('download')) return; if (!href || href.startsWith('http') || href.startsWith('mailto:') || href.startsWith('#')) return; ev.preventDefault(); document.body.style.transition = 'opacity 0.3s ease-out'; document.body.style.opacity = '0'; setTimeout(()=> { location.href = href; }, 300); }); }); // --- NEW: Gear Ratio Calculator Logic --- const calcGearRatioBtn = document.getElementById('calcGearRatioBtn'); if (calcGearRatioBtn) { calcGearRatioBtn.addEventListener('click', () => { const chainring = parseFloat(document.getElementById('chainring').value); const cog = parseFloat(document.getElementById('cog').value); const resultEl = document.getElementById('gearRatioResult'); if (!chainring || !cog || cog === 0) { resultEl.textContent = "Enter valid numbers."; return; } const ratio = (chainring / cog).toFixed(2); let comment = " (Very Easy)"; if (ratio > 4) comment = " (Very Hard)"; else if (ratio > 3) comment = " (Hard)"; else if (ratio > 2.5) comment = " (Standard)"; else if (ratio > 2) comment = " (Easy)"; resultEl.textContent = `Ratio: ${ratio}${comment}`; }); } // --- Gemini API for Cycling Tip --- const geminiApiKey = ""; // API key is handled by the environment const geminiApiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${geminiApiKey}`; const geminiSystemPrompt = "You are an expert cycling coach. Provide a single, concise, actionable training tip (for climbing, sprinting, endurance, or maintenance) in 1-2 sentences. Be motivating. Do not use greetings or markdown."; async function fetchWithRetry(url, options, retries = 3, delay = 1000) { /* ... same fetch retry ... */ for(let i=0;i= 400 && r.status < 500) throw new Error(`Client error: ${r.status}`); } catch(e){} await new Promise(res => setTimeout(res, delay)); delay*=2; } throw new Error('API fetch failed.'); } async function callGeminiApi(userPrompt, systemPrompt) { const payload = { contents: [{ parts: [{ text: userPrompt }] }], systemInstruction: { parts: [{ text: systemPrompt }] }, }; const options = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }; const result = await fetchWithRetry(geminiApiUrl, options); const candidate = result.candidates?.[0]; if (candidate?.content?.parts?.[0]?.text) { return candidate.content.parts[0].text; } else { throw new Error('Invalid API response.'); } } async function handleGetCyclingTip() { const tipEl = document.getElementById('cyclingTipContent'); const loadingEl = document.getElementById('cyclingTipLoading'); const btnEl = document.getElementById('getCyclingTipBtn'); if (!tipEl || !loadingEl || !btnEl) return; btnEl.disabled = true; loadingEl.style.display = 'block'; tipEl.style.display = 'none'; try { const tip = await callGeminiApi("Give me a new cycling technique tip.", geminiSystemPrompt); tipEl.textContent = tip.trim(); } catch (err) { tipEl.textContent = "Focus on a smooth, circular pedal stroke, not just pushing down. Pull up on the backstroke."; } // Fallback finally { btnEl.disabled = false; loadingEl.style.display = 'none'; tipEl.style.display = 'block'; } } // --- Initial Load --- loadLatestCyclingArticles(); handleGetCyclingTip(); // Load first tip document.getElementById('getCyclingTipBtn').addEventListener('click', handleGetCyclingTip); $('[data-toggle="popover"]').popover(); // Initialize Bootstrap Popovers