Shopping isn't fun anymore.

Autobidding software is ruining eBay: scripts hosted on blazing-fast internet connections click 'bid' at the last moment, faster than a human possibly could. That's no fun.

Penny auction sites are confusing: they often use 'bids' as a middleman currency, and have all sorts of restrictions. They offer very little transparency, and their inventory is limited to cheap items. That's no fun.

All the above eCommerce platforms also have a fundamental flaw, from the user's perspective: bidding on an item effectively raises its cost. This can be abused by vendors. That's no fun!

So how can we #MakeShoppingFunAgain?

Enter Spinthrift.

What it does

The elevator pitch says it best. Pay 10% of the cost of an item for a 10% chance of winning it.

To elaborate a bit: multiple slots can be purchased by the same user. Once all ten slots have been purchased, the Spinwheel selects a winner at random. If no slots have been purchased by anyone yet, the 'Buy it Now' feature is available for the item.

How I built it

Lots and lots of RAMEN! No, not the noodle-turned-programmer-fuel. I'm talking about my favorite web stack, the main components of which are React, Alt, MongoDB, Express, and Node. React is Facebook's brilliant view layer framework, and Alt is a kickass implementation of Facebook's Flux paradigm, courtesy of Airbnb's goatslacker. The analogy far from perfect, but React is the 'V' in 'MVC', while Alt covers the 'M' and 'C'.

I've spiced up my RAMEN: it features universal (previously isomorphic) Javascript for improved initial page load, SEO, and support for browsers with Javascript disabled. I also use a custom view-layer navigation and page loading system to automatically handle authentication/authorization, as well as to ensure the data needed by the view layer has been retrieved and properly parsed for rendering.

On the backend, I've prioritized security and scalability. Sanitizing sensitive ObjectIds and rolling my own custom schema/model middleware for the Spinthrift API has enabled fine-grained control over (and tracking/analysis of) data transactions and security events.

Confession: I did something I shouldn't have, in the name of learning! I rolled my own salting and hashing, as well as my own session middleware augmented by Passport.js. To all you CTOs out there, I'm sowwy. ^_^

Challenges I ran into

This project gave me a valuable chance to engage with new technology. That implied some hiccups as I learned. Some of the more hiccup-ridden features are:

  • Image hosting (AWS S3 integration)
  • Websockets/push notifs (for Chat)
  • Server-side cookie forwarding
  • React animations/transitions
  • Custom SVG clip-path (used for the Spinwheel)
  • Cryptography (for salting & hashing)

Accomplishments that I'm proud of

  • Taught my little brother to code and brought him to his first hackathon!
  • Improved my RAMEN recipe by learning and incorporating a bunch of new 'best practices'.
  • Created a pluggable chat sidebar widget, complete with 'Recent' and 'Search' tabs and an intuitive chat thread UI.
  • Finished something tangible. Glad to be able to spare the judges a bunch of console printouts and wireframes!

What I learned

  • To teach is to learn.
  • I need to find a mentor.
  • It never hurts to think like a hacker!
  • Implementation is everything.
  • Effort should not be confused with achievement.
  • Everything listed under 'Challenges I ran into'

What's next for Spinthrift


  • MSP (minimum saleable product)
  • Port app to mobile via React Native or Xamarin
  • Then...



None of this would have happened without my sensei, Daniel-San, who I first encountered on a rock in the middle of the Pacific. He remains a valuable source of wisdom and entertaining texts. I cannot overstate the importance of the latter.

All of this would have happened without Nutella, but the world would be a sadder place without it. So thank you, Nutella. Please always exist.

Share this project: