{"id":35535628,"url":"https://github.com/gitayam/downtown-guide","last_synced_at":"2026-01-23T00:09:53.313Z","repository":{"id":331153697,"uuid":"1124395098","full_name":"gitayam/Downtown-Guide","owner":"gitayam","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-12T01:53:18.000Z","size":2608,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-12T06:05:08.294Z","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/gitayam.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":"ROADMAP.md","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-12-29T00:19:20.000Z","updated_at":"2026-01-12T01:53:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"adafcefb-8455-43f7-87f2-7e5dd75022e4","html_url":"https://github.com/gitayam/Downtown-Guide","commit_stats":null,"previous_names":["gitayam/downtown-guide"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/gitayam/Downtown-Guide","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitayam%2FDowntown-Guide","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitayam%2FDowntown-Guide/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitayam%2FDowntown-Guide/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitayam%2FDowntown-Guide/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gitayam","download_url":"https://codeload.github.com/gitayam/Downtown-Guide/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gitayam%2FDowntown-Guide/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"2026-01-04T03:18:31.825Z","updated_at":"2026-01-13T23:01:04.213Z","avatar_url":"https://github.com/gitayam.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fayetteville Central Calendar\n\nA unified event calendar aggregating Downtown Fayetteville and Fort Liberty events into a single API and calendar feed.\n\n## Live Sites\n\n| Resource | URL |\n|----------|-----|\n| **Website** | [fayetteville-events.pages.dev](https://fayetteville-events.pages.dev) |\n| **API** | [downtown-guide.wemea-5ahhf.workers.dev](https://downtown-guide.wemea-5ahhf.workers.dev) |\n| **iCal Feed** | [Subscribe to Calendar](https://downtown-guide.wemea-5ahhf.workers.dev/cal/events.ics) |\n\n---\n\n## Live API\n\n**Base URL:** `https://downtown-guide.wemea-5ahhf.workers.dev`\n\n### Quick Links\n\n| Resource | URL |\n|----------|-----|\n| API Docs | [/](https://downtown-guide.wemea-5ahhf.workers.dev/) |\n| All Events | [/api/events](https://downtown-guide.wemea-5ahhf.workers.dev/api/events) |\n| Today's Events | [/api/events/today](https://downtown-guide.wemea-5ahhf.workers.dev/api/events/today) |\n| iCal Feed | [/cal/events.ics](https://downtown-guide.wemea-5ahhf.workers.dev/cal/events.ics) |\n\n### Subscribe to Calendar\n\nAdd this URL to Apple Calendar, Google Calendar, or Outlook:\n\n```\nhttps://downtown-guide.wemea-5ahhf.workers.dev/cal/events.ics\n```\n\nFor section-specific feeds:\n```\n# Downtown only\nhttps://downtown-guide.wemea-5ahhf.workers.dev/cal/events.ics?section=downtown\n\n# Fort Liberty only\nhttps://downtown-guide.wemea-5ahhf.workers.dev/cal/events.ics?section=fort_bragg\n```\n\n---\n\n## Event Sources\n\n### Downtown Fayetteville\n\n|| Source | Type | Events |\n||--------|------|--------|\n|| [Distinctly Fayetteville](https://www.distinctlyfayettevillenc.com/events/) | RSS Feed | ~20-30 |\n|| [Visit Downtown](https://visitdowntownfayetteville.com/events/) | REST API | ~3-10 |\n|| [Segra Stadium](https://www.segrastadium.com/events-calendar) | JSON API | ~30 (seasonal) |\n|| [Crown Complex](https://www.crowncomplexnc.com/events/all) | Web Scraping | ~10-20 |\n|| [Dogwood Festival](https://www.thedogwoodfestival.com/2025-2026-events) | Scraping | ~6/year |\n\n### Fort Liberty (Bragg)\n\n| Source | Type | Events |\n|--------|------|--------|\n| [Fort Liberty MWR](https://bragg.armymwr.com/calendar) | Scraping | ~20-50 |\n\n---\n\n## API Reference\n\n### Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| GET | `/api/health` | Health check |\n| GET | `/api/sources` | List event sources with sync status |\n| GET | `/api/events` | List events with filters |\n| GET | `/api/events/today` | Today's events |\n| GET | `/api/events/upcoming` | Next 7 days |\n| GET | `/api/events/:id` | Single event by ID |\n| GET | `/cal/events.ics` | iCal feed |\n\n### Query Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `section` | string | `downtown` or `fort_bragg` |\n| `source` | string | Source ID (e.g., `distinctly_fayetteville`) |\n| `from` | ISO date | Start date filter |\n| `to` | ISO date | End date filter |\n| `limit` | number | Max results (default: 100) |\n| `offset` | number | Pagination offset |\n\n### Example Requests\n\n```bash\n# Get all upcoming events\ncurl \"https://downtown-guide.wemea-5ahhf.workers.dev/api/events\"\n\n# Get Fort Bragg events\ncurl \"https://downtown-guide.wemea-5ahhf.workers.dev/api/events?section=fort_bragg\"\n\n# Get events from a specific source\ncurl \"https://downtown-guide.wemea-5ahhf.workers.dev/api/events?source=distinctly_fayetteville\"\n\n# Get events in a date range\ncurl \"https://downtown-guide.wemea-5ahhf.workers.dev/api/events?from=2025-01-01\u0026to=2025-01-31\"\n```\n\n---\n\n## Local Development\n\n### Prerequisites\n\n- Node.js 18+\n- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)\n- Cloudflare account\n\n### Setup\n\n```bash\n# Install dependencies\nnpm install\n\n# Login to Cloudflare\nnpx wrangler login\n\n# Run locally\nnpx wrangler dev\n```\n\n### Sync Events\n\n```bash\n# Sync all sources (console output)\nnpx tsx scripts/sync-all-events.ts\n\n# Sync and write to D1 database\nnpx tsx scripts/sync-all-events.ts --db\n\n# Sync specific source\nnpx tsx scripts/sync-all-events.ts --source=distinctly --db\n\n# Export to JSON\nnpx tsx scripts/sync-all-events.ts --json \u003e events.json\n```\n\n### Deploy\n\n```bash\nnpx wrangler deploy\n```\n\n---\n\n## Infrastructure\n\n| Resource | Name | URL/ID |\n|----------|------|--------|\n| **Pages** (Frontend) | `fayetteville-events` | [fayetteville-events.pages.dev](https://fayetteville-events.pages.dev) |\n| **Worker** (API) | `downtown-guide` | [downtown-guide.wemea-5ahhf.workers.dev](https://downtown-guide.wemea-5ahhf.workers.dev) |\n| **D1 Database** | `downtown-events` | `fd953a64-4f1a-452c-aac4-84ad28c68370` |\n| **R2 Bucket** | `downtown-raw-data` | - |\n\n### Database Tables\n\n- `sources` - Event source registry with sync status\n- `events` - Unified event storage\n- `venues` - Normalized venue data\n- `raw_scrapes` - Sync logs and raw data references\n- `pending_events` - Community submissions (Phase 4)\n- `reminder_log` - Discord notification tracking\n\n---\n\n## Discord Integration\n\nEvent reminders are sent via Discord webhook:\n- **1 week before** events (orange embed)\n- **1 day before** events (red embed)\n\n```bash\n# Test reminders (dry run)\nnpx tsx scripts/send-discord-reminders.ts --dry-run\n\n# Send reminders\nnpx tsx scripts/send-discord-reminders.ts\n```\n\nSee [docs/DISCORD_WEBHOOK_REMINDERS.md](docs/DISCORD_WEBHOOK_REMINDERS.md) for setup.\n\n---\n\n## Documentation\n\n- [Event Sources](docs/README.md) - Integration docs for each source\n- [Discord Reminders](docs/DISCORD_WEBHOOK_REMINDERS.md) - Webhook setup\n- [UI Style Guide](UI_STYLE_GUIDE.md) - Fayetteville design system\n- [Database Schema](SCHEMA.md) - D1 tables and queries\n- [Roadmap](ROADMAP.md) - Project phases and progress\n- [Git Workflow](guides/GIT_WORKFLOW.md) - Contributing guidelines\n- [Best Practices](guides/BEST_PRACTICES.md) - Engineering standards\n\n---\n\n## Project Structure\n\n```\n├── src/\n│   └── index.ts              # Cloudflare Worker (API)\n├── web/                      # React Frontend (Cloudflare Pages)\n│   ├── src/\n│   │   ├── components/       # React components\n│   │   ├── pages/            # Page components\n│   │   └── lib/              # API client, utils, types\n│   └── public/\n├── scripts/\n│   ├── sync-all-events.ts        # Multi-source sync\n│   └── send-discord-reminders.ts # Discord notifications\n├── migrations/\n│   └── 0000_initial.sql      # D1 schema\n├── docs/                     # Source integration docs\n├── guides/                   # Engineering guides\n├── UI_STYLE_GUIDE.md         # Fayetteville design system\n├── wrangler.toml             # Worker config\n└── package.json\n```\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgitayam%2Fdowntown-guide","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgitayam%2Fdowntown-guide","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgitayam%2Fdowntown-guide/lists"}