Have you ever struggled to coordinate a meeting time with a group? Tools like Doodle make scheduling easier — but I wanted to create something simpler, open-source, and custom-built with a modern stack. That’s how EventStack was born.
EventStack is a lightweight event scheduling app that allows users to propose time slots, vote on availability, and finalize meetings — all with a slick frontend and real-time updates.
Why I Built It
I wanted to explore Tornado, a powerful Python framework known for handling asynchronous and real-time web apps. Unlike Flask or Django, Tornado gives fine-grained control over sockets, routing, and performance. I also wanted to integrate:
- GitHub OAuth for easy login
- PostgreSQL as a robust backend
- A beautiful frontend using Tailwind CSS
- Potential for WebSocket-based real-time voting
This project was a perfect way to combine learning with utility.
Tech Stack
- Backend: Tornado – asynchronous Python framework
- Frontend: Tailwind CSS + custom HTML templates
- Auth: GitHub OAuth2 (manual token exchange using
requests
) - Database: PostgreSQL (used NeonDB Postgres during initial dev, later moved to local)
- Hosting: Runs locally and deployable to platforms like Railway, etc.
Authentication with GitHub
OAuth integration was handled manually — bypassing libraries like Authlib — to better understand the token exchange process. Users log in via GitHub, and their profile data is stored securely in the database.
# Get GitHub token manually using requests response = requests.post( "https://github.com/login/oauth/access_token", data={...}, headers={"Accept": "application/json"} )
Features
- ✅ Secure GitHub login
- ✅ Create events with multiple time slots
- ✅ Vote for available slots
- ✅ Real-time voting updates
- ✅ Auto-finalization and notifications (planned)
Frontend Preview
- A clean dashboard for users to view and manage events
- Interactive voting interface
- Markdown-ready comment section (coming)
All templates are rendered server-side with Jinja2 and styled using Tailwind for responsiveness and polish.
Lessons Learned
- Tornado requires more boilerplate than Flask, but it pays off for async control.
- GitHub OAuth is surprisingly easy when broken down.
- NeonDB's PostgreSQL is handy for prototyping — but local or cloud-managed Postgres is better for production.
- Real-time updates will require integrating
tornado.websocket.WebSocketHandler
.
What's Next?
- Email or GitHub notifications on finalization
Final Thoughts
EventStack is more than just a clone — it’s a showcase of how you can build something powerful, fast, and modern with minimal libraries. If you’re looking to build real-time apps in Python, give Tornado a try.
Want to contribute? The GitHub repo will be public soon. Drop a ⭐️ if you like the project!
Top comments (0)