HACKER Q&A
📣 ycomverdantnest

Choosing a framework for the next big thing


Let's pretend you're working at a startup to build the next Airbnb. Your team is very small, it's just you and maybe 1-2 other developers. You need to build an application with the following requirements/assumptions:

  - User facing "CRUD"
    - 10+ domain models (eg. House, Guest, Cart, Booking, etc)
    - Lots of forms w/ custom validation
    - Pagination so you can display 1k+ records in tables/infinite-scroll
    - Some areas of rich interactivity (eg. Host availability calendar) but mostly presentational UI / forms
  - Admin panel
  - Background jobs / tasks
    - Scheduled - Run specific job at point in future (eg. Remind user in 3 months about upcoming trip)
    - Recurring - Run cron jobs for repetitive tasks (eg. Run daily report at midnight)
  - Emails / Notifications
    - 10+ custom email templates (booking confirmation, upcoming trip reminder, etc.)
    - Usually sent via background job
  - File uploads / storage (eg. Users upload pictures of house)
  - Auth
    - Users login to book
    - Hosts login to manage their home listings
  - Testing
    - Primarily integration / e2e tests of core flows
You need to choose a framework:

  - Laravel (v9)
  - Rails (v7)
  - Django (v4)
  - Phoenix (v1.6)
Which framework do you choose?

Assume your team knows each framework equally well. Which one allows you to start quickly and still be maintainable 2-3 years down the road while continually adding new features?


  👤 skidipap Accepted Answer ✓
Django, Django is "Web Frameowkr For Perfectionist With Deadline". Django has builtin Admin Panel so you don't have to create again. Django have good builtin authentication and security.

👤 rlawson
Ok I feel like I can give some good advice here. I wrote 4 Django apps over the last few years some for work and some during vacation/downtime (and sold a couple). One was a car reservation system with reminder emails. The others were covid screening, warehouse management and a car key replacement service.

They all were multi-tenant and had the concept of an admin login and a user login. Basically I had organizations and each org can have admins and users. Each user had a profile with a role/organization_id which determined what UI they were served.

I used Django apps this way:

  * core-app - models and common services
  * admin-app - admin ui and admin services
  * user-app - user ui and user services
Of course you could code up the admin and user projects separately for maximum decoupling but you'd want your common core app to be a dependency for each.

Messages (Email and SMS) to be sent were dropped on a queue and processed by workers. Each message was self contained and basically was the type of email to send, a map of data and a pointer to the template. I think in the later version I skipped the worker and called a lambda on the message appearing (this was AWS)

Reminders in the future were just put in the db and then a cron job grabbed them when it was time to send. For instance, the time to remind someone that their car reservation was about to expire was configurable by the admin - so you could say 24 hrs before or less depending on the dealer's policy. Anyway you get the picture.

UI was all simple with a bootstrap based admin template that was mobile friendly and mostly web 1.0. I did add some fanciness with intercooler or later htmx. I also used a js grid extensively for reports.

I can't share the code with you (sold it or was for employer) but I can certainly share some poc code on other projects as well as the general approach. My email is in my profile and I am happy to talk you through it and login and show you the some of the systems that I still do enhancements for.

The main point is Django was rock solid and super productive. Deploying was the only hassle and since I know AWS pretty well that's what I went with.

I do know there are products that you can purchase that have a lot of stuff already setup. I haven't used them but this one seems to come up a lot - https://www.saaspegasus.com/


👤 legrande
Well since I know PHP I would go with Laravel. Build on strength.

👤 likortera
Laravel