An interactive map showcasing bike routes, bike share stations, attractions, and bike resources in Chattanooga, TN. Built with love by iFixit for the Chattanooga cycling community.
- Curated Bike Routes: Explore popular routes including the Riverwalk Loop, Zoo Loop, and local greenways
- Real-time Bike Share Data: Live availability for Chattanooga's bike share stations via GBFS API
- Points of Interest: Discover attractions, bike shops, and local resources
- Mobile-First Design: Optimized for on-the-go route planning with PWA support
- Interactive Map: Powered by Mapbox with custom styling and route visualization
- Bike Share Stations: Chattanooga Bike Share GBFS API
- Mapping: Mapbox GL JS
- Bike Routes: Custom curated routes from local cycling community
- Node.js 20+
- pnpm 10+ (recommended) or npm
- Clone the repository:
git clone https://github.com/kwiens/bikemap.git
cd bikemap- Install dependencies:
pnpm install- Set up environment variables (MapBox secret key):
cp .env.example .env.local
# Add your Mapbox token if using a custom one- Run the development server:
pnpm dev- Open http://localhost:3000 to view the map
pnpm dev- Start development serverpnpm build- Build for productionpnpm start- Start production serverpnpm test- Run tests in watch modepnpm test:run- Run tests oncepnpm lint- Check code qualitypnpm lint:fix- Auto-fix linting issues
The project includes comprehensive test coverage for critical features:
# Run all tests
pnpm test:run
# Run tests in watch mode
pnpm testTest coverage includes:
- GBFS API integration (bike share data fetching)
- Mapbox geocoding and geospatial utilities
- Route calculations and mapping functions
bikemap/
├── src/
│ ├── app/ # Next.js app directory
│ ├── components/ # React components
│ │ ├── ui/ # Reusable UI components
│ │ ├── Map.tsx # Main map component
│ │ └── MapMarkers.tsx
│ ├── data/ # Data sources and types
│ │ ├── gbfs.ts # Bike share API integration
│ │ └── geo_data.ts # Routes, attractions, resources
│ ├── utils/ # Utility functions
│ └── hooks/ # React hooks
├── public/ # Static assets
├── tests/ # Test setup and utilities
└── .github/workflows/ # CI/CD workflows
We welcome contributions from the community! Whether you're fixing bugs, adding features, or improving documentation, your help makes this project better for everyone.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes and add tests if applicable
- Run tests and linting (
pnpm test:run && pnpm lint) - Commit your changes (
git commit -m 'Add amazing feature') - Push to your branch (
git push origin feature/amazing-feature) - Open a Pull Request
Found a bug or have a feature request? Please open an issue with:
- A clear description of the problem or suggestion
- Steps to reproduce (for bugs)
- Screenshots if applicable
- Your environment (browser, OS, etc.)
This project is dedicated to providing a welcoming and inclusive experience for everyone. Please be respectful and constructive in all interactions.
- Framework: Next.js (React)
- Styling: Tailwind CSS
- Mapping: Mapbox GL JS
- UI Components: Radix UI
- Icons: Font Awesome
- Testing: Vitest
- Package Manager: pnpm
- Linting: ESLint + Biome
This project is dedicated to the memory of our friend and collaborator Yoseph. In his honor, consider donating to Yoseph's Bikes to help children access the joy of riding.
This project is open source and available under the MIT License.
- Thanks to the Chattanooga cycling community for route curation and feedback
- Bike Chattanooga for providing bike share infrastructure
- iFixit for supporting open-source community projects
Made with ❤️ in Chattanooga, TN

