DEV Community

Cover image for Building EventStack – A Lightweight, Real-Time Doodle & Luma Clone Using Tornado
Abhiraj Adhikary
Abhiraj Adhikary

Posted on

Building EventStack – A Lightweight, Real-Time Doodle & Luma Clone Using Tornado

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"} ) 
Enter fullscreen mode Exit fullscreen mode

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)