{"id":31639994,"url":"https://github.com/jonaylor89/thirdspacelist.com","last_synced_at":"2025-10-29T07:38:30.473Z","repository":{"id":312280626,"uuid":"1046711274","full_name":"jonaylor89/thirdspacelist.com","owner":"jonaylor89","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-29T14:00:42.000Z","size":92,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-07T02:25:11.947Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonaylor89.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-29T05:29:34.000Z","updated_at":"2025-08-29T14:00:47.000Z","dependencies_parsed_at":"2025-08-29T16:56:36.919Z","dependency_job_id":"22da857a-4411-4106-ba92-e3a09f5cb402","html_url":"https://github.com/jonaylor89/thirdspacelist.com","commit_stats":null,"previous_names":["jonaylor89/thirdspacelist.com"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonaylor89/thirdspacelist.com","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaylor89%2Fthirdspacelist.com","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaylor89%2Fthirdspacelist.com/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaylor89%2Fthirdspacelist.com/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaylor89%2Fthirdspacelist.com/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonaylor89","download_url":"https://codeload.github.com/jonaylor89/thirdspacelist.com/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonaylor89%2Fthirdspacelist.com/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281584772,"owners_count":26526169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-29T02:00:06.901Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-07T02:08:36.586Z","updated_at":"2025-10-29T07:38:30.460Z","avatar_url":"https://github.com/jonaylor89.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ThirdSpaceList 🏢☕📚\n\nA mobile-first PWA for discovering work-friendly cafes, libraries, and community spaces with real-time data on WiFi speeds, noise levels, and amenities.\n\n## Features ✨\n\n- **Interactive Map \u0026 List View** - Browse places on an interactive map with clustering or in a clean list format\n- **Real-time Observations** - Crowdsourced data on:\n  - WiFi speed testing (download/upload/latency)\n  - Noise level measurement via microphone\n  - Outlet availability and crowdedness ratings\n- **Smart Filtering** - Filter by category, amenities, workability score, and operating hours\n- **Workability Score** - AI-powered aggregation of observations into a single score\n- **PWA Support** - Installable app with offline functionality\n- **Location-based Search** - Find places near you with distance calculations\n- **User Contributions** - Submit observations and build your contribution profile\n\n## Tech Stack 🛠️\n\n- **Frontend**: Next.js 15 (App Router), React 19, TypeScript\n- **Database**: Supabase (PostgreSQL + PostGIS for geospatial data)\n- **Search**: Typesense (Fast search engine with geolocation + filtering)\n- **Maps**: Mapbox GL JS with clustering\n- **Styling**: TailwindCSS\n- **State Management**: Zustand + TanStack Query\n- **PWA**: Service Worker + Web App Manifest\n- **APIs**: OpenStreetMap data via Overpass API\n- **DevOps**: Just command runner + Docker Compose\n\n## Quick Start 🚀\n\n### Prerequisites\n\n- Node.js 18+\n- [Just](https://github.com/casey/just) command runner\n- Docker \u0026 Docker Compose\n- A Supabase project\n- A Mapbox account and access token\n\n### 1. Environment Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/jonaylor89/thirdspacelist.git\ncd thirdspacelist\n\n# Install Just command runner\n# macOS: brew install just\n# Linux: curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to ~/bin\n\n# Copy environment template\ncp .env.example .env.local\n```\n\n### 2. Configure Environment Variables\n\nEdit `.env.local` with your credentials:\n\n```env\n# Supabase Configuration\nNEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\nSUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key\n\n# Mapbox Configuration\nNEXT_PUBLIC_MAPBOX_ACCESS_TOKEN=your_mapbox_access_token\n\n# Typesense Configuration (for development)\nTYPESENSE_HOST=localhost\nTYPESENSE_PORT=8108\nTYPESENSE_PROTOCOL=http\nTYPESENSE_API_KEY=dev-api-key-123\n```\n\n### 3. Complete Setup\n\n```bash\n# Run complete development setup\njust setup\n```\n\nThis will:\n- Install dependencies\n- Start Typesense search engine\n- Set up database schema\n- Seed places data from OpenStreetMap\n- Sync data to Typesense\n\n### 4. Start Development\n\n```bash\n# Start the development server\njust dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser.\n\n### 5. Available Commands\n\n```bash\n# See all available commands\njust\n\n# Common commands:\njust dev              # Start development server\njust check            # Run linting and type checking  \njust typesense        # Start search engine\njust sync-typesense   # Sync data to search\njust seed-places      # Import places from OpenStreetMap\njust health-check     # Check all services\n```\n\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for the complete command reference.\n\n## Database Schema 🗄️\n\n### Core Tables\n\n- **`places`** - Locations with geospatial data, categories, and basic info\n- **`observations`** - User-submitted measurements and ratings\n- **`profiles`** - User profiles linked to Supabase Auth\n\n### Key Features\n\n- **PostGIS Integration** - Efficient geospatial queries for location-based search\n- **Real-time Functions** - Automatic workability score calculation\n- **Row Level Security** - Proper permissions and data isolation\n- **Optimized Indexes** - Fast queries on location, categories, and scores\n\n## API Routes 📡\n\n### Places\n- `GET /api/places` - Search places with filters and location\n- `GET /api/places/[id]` - Get detailed place info with stats\n\n### Observations\n- `POST /api/observations` - Submit new observations\n- `GET /api/observations` - Fetch observations with filtering\n\n## Contributing 🤝\n\n### Development Workflow\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Make your changes\n4. Test thoroughly\n5. Commit changes: `git commit -m 'Add amazing feature'`\n6. Push to branch: `git push origin feature/amazing-feature`\n7. Submit a pull request\n\n### Code Standards\n\n- TypeScript strict mode enabled\n- ESLint + Prettier for code formatting\n- Component-based architecture with proper separation of concerns\n- API-first design with proper error handling\n\n## Deployment 🚢\n\n### Vercel (Recommended)\n\n1. Connect your GitHub repository to Vercel\n2. Set environment variables in Vercel dashboard\n3. Deploy automatically on push to main branch\n\n### Other Platforms\n\nThe app is a standard Next.js application and can be deployed to:\n- Netlify\n- Railway\n- Digital Ocean App Platform\n- Self-hosted with PM2\n\n## Roadmap 🗺️\n\n- [ ] User authentication and profiles\n- [ ] Push notifications for updates\n- [ ] Advanced filtering (hours, ratings, etc.)\n- [ ] Social features (favorites, reviews)\n- [ ] Multi-city support beyond NYC\n- [ ] Integration with calendar apps\n- [ ] Accessibility improvements\n- [ ] Performance optimizations\n\n## License 📄\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Support 💬\n\n- [Documentation](https://github.com/yourusername/thirdspacelist/wiki)\n- [Issues](https://github.com/yourusername/thirdspacelist/issues)\n- [Discussions](https://github.com/yourusername/thirdspacelist/discussions)\n\n---\n\nBuilt with ❤️ for remote workers and digital nomads everywhere.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonaylor89%2Fthirdspacelist.com","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonaylor89%2Fthirdspacelist.com","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonaylor89%2Fthirdspacelist.com/lists"}