HASS.Agent .NET10
A modern, lightweight Windows companion for Home Assistant: notifications, media control, sensors, commands, and one-click updates.
Discover Asheville events, live music, festivals and free things to do. AVL GO brings local listings together and offers a free public events API.
Translation pending
LifestyleTypeScript · CSSGitHub @MattB543OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A web app that aggregates events from 10+ sources for the Asheville, NC area, featuring AI-powered tagging, semantic search, and user authentication.Read the full README ↗A web app that aggregates events from 10+ sources for the Asheville, NC area, featuring AI-powered tagging, semantic search, and user authentication.
Want to get this running locally? Here's the fastest path:
On a Mac with Homebrew Postgres: npm install && npm run db:setup-local sets up a local database (installing pgvector if needed), writes DATABASE_URL to .env, fills in the public sign-in keys from avlgo.com so Google sign-in works locally, and offers to copy the live site's upcoming events in, scores included. Then npm run dev. The steps below are the hosted-Supabase route.
Head to supabase.com and create a new project. Once it's created, go to Settings > Database and copy the Connection Pooler URI (Transaction mode). It looks something like:
postgresql://postgres.[project-ref]:[password]@aws-0-us-east-1.pooler.supabase.com:6543/postgres
Copy the example env file and add your database URL:
cp .env.example .env
Then edit .env and paste your Supabase connection string:
DATABASE_URL=postgresql://your-connection-string-here
That's the only required variable. The others are optional (AI features, auth, etc.).
npm install
npx drizzle-kit push
The first command installs dependencies. The second creates the tables in your database.
npm run backfill
This scrapes ~30 pages of Eventbrite events and saves them to your database. Takes a couple minutes.
npm run dev
Open http://localhost:3000 and you should see events!
"tsx: command not found" - Run npm install -D tsx to add it locally.
No events showing - Make sure the backfill completed. Check with npm run db:count.
Database connection errors - Double-check your DATABASE_URL in .env. Make sure you're using the Connection Pooler URL from Supabase.
Create a .env file in the project root:
# Required
DATABASE_URL=postgresql://...
# Optional - Cron authentication
CRON_SECRET=your-random-secret-min-16-chars
# Optional - AI Features (Google Gemini)
GEMINI_API_KEY=your-gemini-api-key
# Optional - AI Features (Azure OpenAI)
AZURE_OPENAI_API_KEY=
AZURE_OPENAI_ENDPOINT=
# Optional - Supabase Auth
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
NEXT_PUBLIC_GOOGLE_CLIENT_ID=
See .env.example for the full list of optional variables.
npm install
npm run dev
Open http://localhost:3000 to view the app.
npx drizzle-kit push
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run cron:schedule # View cron job schedules and next run times
npm run db:check # Check database connection
npm run db:count # Count events by source
npm run db:tags # Check tag statistics
npm run db:clear # Clear all events (use with caution)
npm run test:avl # Test AVL Today scraper
npm run test:eventbrite # Test Eventbrite scraper
npm run test:meetup # Test Meetup scraper
npm run test:harrahs # Test Harrah's scraper
npm run test:orangepeel # Test Orange Peel scraper
npm run test:greyeagle # Test Grey Eagle scraper
npm run backfill # Backfill events from Eventbrite
npm run test:tagging # Test AI tagging
npm run test:image-gen # Test AI image generation
npm run test:summary # Test AI summary generation
npm run test:embedding # Test embedding generation
npm run tag:events # Tag all untagged events
npm run backfill:embeddings # Backfill embeddings
| Endpoint | Method | Description |
|---|---|---|
/api/cron/scrape | GET | Trigger event scraping (requires auth) |
/api/cron/ai | GET | Trigger AI processing (requires auth) |
/api/cron/cleanup | GET | Cleanup dead/duplicate events (requires auth) |
/api/cron/dedup | GET | AI semantic deduplication (requires auth) |
/api/health | GET | Health check endpoint |
/api/chat | POST | AI conversational event discovery |
/api/preferences | GET/POST | User preferences sync |
/api/events/[id]/favorite | POST/DELETE | Favorite/unfavorite events |
/api/events/submit | POST | Submit new event |
/api/export/xml | GET | RSS XML export |
/api/export/markdown | GET | Markdown export |
The app scrapes events from 10+ sources:
| Source | Method |
|---|---|
| AVL Today | CitySpark API |
| Eventbrite | HTML scraping + API |
| Meetup | GraphQL API |
| Browser automation (local only) | |
| Harrah's Cherokee | Ticketmaster API |
| Orange Peel | Ticketmaster API + JSON-LD |
| Grey Eagle | JSON-LD |
| Live Music AVL | ICS feeds |
| Explore Asheville | Public API |
| Misfit Improv | Crowdwork API |
| NC Stage | ThunderTix |
| Story Parlor | Squarespace JSON-LD |
The cron jobs are configured in vercel.json:
curl -X GET https://your-domain.vercel.app/api/cron/scrape \
-H "Authorization: Bearer YOUR_CRON_SECRET"
asheville-event-feed/
├── app/ # Next.js App Router
│ ├── api/ # API routes (cron, chat, preferences, etc.)
│ ├── auth/ # Auth routes (callback, signout)
│ ├── events/[slug]/ # Individual event pages
│ ├── login/ # Login page
│ ├── profile/ # User profile page
│ ├── u/[slug]/ # Curator profile pages
│ └── page.tsx # Main page
├── components/ # React components
├── lib/
│ ├── ai/ # AI integrations (Gemini, Azure OpenAI)
│ ├── db/ # Database schema and queries
│ ├── scrapers/ # Event source scrapers
│ ├── supabase/ # Supabase client and utilities
│ └── utils/ # Utility functions
└── scripts/ # CLI utility scripts
MIT