An open-source platform connecting runners with local running clubs
Explore the docs Β»
View Demo
Β·
Report Bug
Β·
Request Feature
Table of Contents
Running Finder is a platform that helps runners discover and connect with running clubs and events in their area. The application displays running clubs and events on an interactive map, allowing users to filter by preferences like distance, weekday, or difficulty.
- Interactive Map: View running clubs and events plotted on Google Maps
- Advanced Filtering: Find runs by distance, weekday, and difficulty level
- Club Discovery: Browse and join local running clubs
- Event Registration: Register for upcoming runs directly through the platform
- Authentication: Sign in with GitHub or email to save preferences and manage registrations
- Next.js - React framework with server-side rendering
- React - Frontend library for building user interfaces
- Drizzle ORM - TypeScript ORM for SQL databases
- TailwindCSS - Utility-first CSS framework
- Neon - Serverless Postgres database
- Shadcn UI - Reusable component library
- Jest & Playwright for testing
- Node.js (v18 or higher)
- pnpm
npm install -g pnpm
- Postgres database (or use the provided Docker setup)
-
Clone the repository
git clone https://github.com/Joelheile/RunningFinder.git cd RunningFinder -
Install dependencies
pnpm install
-
Create a
.env.localfile based on.env.exampleand add your API keyscp .env.example .env.local
-
Set up the database
# For development with Docker sh docker_run.sh # Generate database schema pnpm dev:generate pnpm dev:push # Seed the database (optional) pnpm dev:seed
-
Start the development server
pnpm dev
-
Access the API documentation at http://localhost:3000/docs
runningfinder/
βββ src/ # Source code
β βββ app/ # Next.js app router pages
β βββ components/ # React components
β βββ lib/ # Utilities, hooks, and business logic
β β βββ authentication/# Auth configuration
β β βββ db/ # Database schema and connections
β β βββ types/ # TypeScript type definitions
βββ public/ # Static assets
βββ tests/ # Test files
βββ drizzle/ # Database migrations
βββ playwright-tests/ # End-to-end tests
Run all tests with:
pnpm testsOr run specific test suites:
# Unit tests
pnpm jest unit
# Integration tests
pnpm jest integration
# End-to-end tests
npx playwright test- Combine Google Maps marker dragging and place search
- Enhance club dashboard with role-based permissions
- Page editing
- Membership management
- Registration management
- Support for additional sport types
- Weather API integration for run forecasts
- Strava API integration for syncing runs
See the open issues for a full list of proposed features and known issues.
Contributions make the open-source community an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Don't forget to check our Contributing Guidelines.
Distributed under the MIT License. See LICENSE for more information.
Project Link: https://github.com/Joelheile/RunningFinder
- Google Maps Platform for mapping services
- Auth.js for authentication
- All the amazing runners and clubs who inspired this project!
- Runs
- are displayed on interactive map
- users can register for runs
- runs can be filtered by distance, weekday and difficulty
- Clubs
- Dashboard: Get to know knew running clubs
- Members: Join and leave clubs, view club details and runs
- Admins: Add and manage club details and runs
The data in the database is user generated and not generated by the backend. For the first batch of data I used a custom scraper to scrape the data from a competitor. This way first users were more motivated to use the plattform and suggest own runs.
- Setup database & API routes
- Add club
- Add recurring runs (on weekly basis)
- Authentication (when adding a run or club, you'll be redirected to /api/auth/signin)
- Displaying runs a user has liked on a own page
- Combine Google Maps marker dragging and place search
- Enhance club dashboard using roles
- Page editing
- Membership management
- Registration management
- Open plattform for other sport types
- Implement weather API to forecast conditions for runs
- Implement Strava API to sync runs
flowchart TD
%% Main Nodes
Users(["π₯ Users"]):::users --> AppRouting{{"π App Routing"}}:::routing
%% Application Modules in a row
AppRouting --> RunsModule & ClubsModule & MapModule
subgraph ApplicationModules["Application Modules"]
direction LR
RunsModule["π Runs Module"]:::module
ClubsModule["π₯ Clubs Module"]:::module
MapModule["πΊοΈ Map Module"]:::module
end
%% Application Layer below modules
RunsModule & ClubsModule & MapModule --> ApplicationLayer
ApplicationLayer["βοΈ Application Layer"]:::appLayer
%% API Gateway and Database
ApplicationLayer <--> APIGateway
APIGateway["π API Gateway"]:::apiGateway
APIGateway <--> Database
Database[("πΎ Database")]:::database
%% Advanced styling
classDef users fill:#FF6B6B,stroke:#333,stroke-width:2px,color:white,font-weight:bold,border-radius:8px
classDef routing fill:#4ECDC4,stroke:#333,stroke-width:2px,color:white,font-weight:bold
classDef module fill:#48BFE3,stroke:#333,stroke-width:2px,color:white,font-weight:bold,border-radius:4px
classDef appLayer fill:#56CFE1,stroke:#333,stroke-width:2px,color:white,font-weight:bold,border-radius:4px
classDef apiGateway fill:#5E60CE,stroke:#333,stroke-width:2px,color:white,font-weight:bold,border-radius:4px
classDef database fill:#7400B8,stroke:#333,stroke-width:2px,color:white,font-weight:bold
%% Apply classes
class Users users
class AppRouting routing
class RunsModule,ClubsModule,MapModule module
class ApplicationLayer appLayer
class APIGateway apiGateway
class Database database
%% Style the Application Modules subgraph
style ApplicationModules fill:#FFFDD0,stroke:#CBD5E0,stroke-width:2px,color:#2D3748,font-weight:bold
I use ESLint for static code analysis. Mostly running it before pulling my branch, it has helped me to catch bugs and errors before they get merged into the main branch. It is also a great tool to stay consistent. For example having a consistent Image tag and not switching.
You can run it using:
pnpm run lint
I hope you liked the project :)