Inspiration - The project came from a practical problem: high-value Singapore events are scattered across many communities and platforms, while the decision to attend usually starts with a simple question—“Am I free on that date?” Existing event lists optimize for browsing; JJ's Event Agent optimizes for fitting opportunities into real life. As an avid events goer, I always find it a pain to find good events that fit my schedule, passion points (AI/Tech/Marketing) and other parameters (such as matching agendas with personal goals, F&B, timing, location, etc.). I often find myself spending hours researching for suitable events on various data sources before sharing it with my fanclub community of like-minded event goers.

What it does - It collects, normalizes, filters, ranks, and publishes relevant Singapore events in a calendar-first dashboard. Users can navigate months, jump from a date to event details, filter by source or F&B type, and see demand signals such as people going, seats left, or waitlist status.

How I built it - The backend is Python 3.11+ with Playwright, Requests, BeautifulSoup, Jinja2, and date parsing utilities. Each source emits a shared raw-event model; the curation layer handles Singapore location, timing, explicit-paid admission, keyword, perk, deduplication, and popularity rules. Jinja2 produces one self-contained HTML dashboard. Pytest and Ruff verify behavior, while GitHub Actions schedules collection and deploys GitHub Pages.

Challenges I ran into - The biggest challenges were inconsistent event markup, authenticated sources that must not leak sessions, incomplete price/F&B/capacity fields, changing website UIs, and keeping summaries faithful to source descriptions. The solution isolates failures per source, keeps authentication local, treats missing data honestly, and backs each normalization rule with focused tests.

Accomplishments that I'm proud of -

Working multi-source event pipeline and public demo. A real responsive month calendar plus detailed agenda. Description-only summaries with private-source protection. F&B taxonomy, source filters, and Hot Pick capacity signals. Weekly SGT-aware automation and GitHub Pages deployment. Full Git-history and deployed-artifact credential audit.

What I learned -

Useful event automation depends less on collecting the largest possible feed and more on honest normalization: time zones, missing fields, privacy boundaries, and transparent confidence signals. A date-first interface also changes discovery from passive scrolling into an actionable scheduling decision.

What's next for JJ's Event Fanclub Agent -

Add an explicit “Add to calendar” .ics action. Move authenticated collection to a locked-down self-hosted runner. Add user-controlled notification preferences and source health alerts. Improve public description extraction and cross-source deduplication.

Built With

Share this project:

Updates