A comprehensive pan-European directory for Roundnet (Spikeball) clubs, communities, and events. Built with Next.js 14, Prisma, PostgreSQL with PostGIS, and Tailwind CSS.
- 🗺️ Interactive Map - Find clubs near you with Leaflet-powered geolocation
- 🔍 Advanced Search - Filter by country, city, club type, and features
- 🌍 Multilingual - Full i18n support (EN, DE, FR, ES, IT)
- 📱 Responsive - Mobile-first design with PWA support
- 🔐 Authentication - NextAuth with role-based access control
- 📊 Admin Dashboard - Moderate submissions, manage clubs, view analytics
- 🔄 Data Sync - Automated scraping from IRF and national federations
- 📍 SEO Optimized - Dynamic sitemap, schema.org markup, hreflang tags
- Framework: Next.js 14 (App Router)
- Database: PostgreSQL with PostGIS extension
- ORM: Prisma
- Authentication: NextAuth v5
- Styling: Tailwind CSS
- UI Components: Radix UI primitives
- Maps: Leaflet / react-leaflet
- Scraping: Cheerio, Puppeteer
- Validation: Zod
- Node.js 18+
- PostgreSQL 14+ with PostGIS extension
- pnpm (recommended) or npm
-
Clone the repository
git clone https://github.com/roundnet-directory/europe.git cd europe -
Install dependencies
pnpm install
-
Set up environment variables
cp .env.example .env
Edit
.envwith your configuration:DATABASE_URL="postgresql://user:password@localhost:5432/roundnet?schema=public" NEXTAUTH_SECRET="your-secret-key" NEXTAUTH_URL="http://localhost:3000" -
Set up the database
# Create PostGIS extension (requires superuser) psql -d roundnet -c "CREATE EXTENSION IF NOT EXISTS postgis;" # Run migrations pnpm prisma migrate dev # Seed initial data pnpm prisma db seed
-
Start the development server
pnpm dev
Open http://localhost:3000 in your browser.
├── prisma/
│ ├── schema.prisma # Database schema
│ └── seed.ts # Seed data
├── scripts/
│ ├── scrapers/ # Data scraping scripts
│ └── cron/ # Scheduled sync jobs
├── src/
│ ├── app/
│ │ ├── [locale]/ # Localized pages
│ │ ├── admin/ # Admin dashboard
│ │ └── api/ # API routes
│ ├── components/
│ │ ├── ui/ # Base UI components
│ │ ├── layout/ # Header, Footer
│ │ ├── clubs/ # Club-related components
│ │ └── map/ # Map components
│ ├── lib/
│ │ ├── auth.ts # NextAuth config
│ │ ├── db.ts # Prisma client
│ │ └── i18n/ # Internationalization
│ └── locales/ # Translation files
└── public/ # Static assets
The directory aggregates data from multiple sources:
- International Roundnet Federation (IRF) - Official member federations
- National Federation Websites - Scraped with permission
- User Submissions - Community-contributed clubs
- Direct API Integration - Where available
# Run all scrapers
pnpm scrape:all
# Scrape specific federation
pnpm scrape:irf
pnpm scrape:france
pnpm scrape:germanyGET /api/clubs- List clubs with filteringGET /api/clubs/[slug]- Get club detailsGET /api/events- List upcoming eventsGET /api/countries- List countries with club countsPOST /api/submissions- Submit a new club
GET /api/admin/submissions- List pending submissionsPOST /api/admin/submissions/[id]/approve- Approve submissionPOST /api/admin/submissions/[id]/reject- Reject submission
Supported languages:
- 🇬🇧 English (en) - Default
- 🇩🇪 German (de)
- 🇫🇷 French (fr)
- 🇪🇸 Spanish (es)
- 🇮🇹 Italian (it)
Translation files are located in src/locales/. To add a new language:
- Create a new JSON file:
src/locales/[lang].json - Add the locale to
src/lib/i18n/config.ts - Update
src/lib/i18n/dictionaries.ts
We welcome contributions! See CONTRIBUTING.md for guidelines.
- Submit clubs - Know a club that's missing? Use the submission form
- Report issues - Found a bug or inaccuracy? Open an issue
- Add translations - Help us reach more communities
- Improve scrapers - Add support for more federation websites
This project is licensed under the MIT License - see LICENSE for details.
- International Roundnet Federation
- All national federations and clubs who provided data
- The European Roundnet community
Made with ❤️ for the European Roundnet community
// Force rebuild