a flask app i built for a friend's rental business is now used by 5 investors and the whole thing is one file
a buddy who buys rental properties kept asking me to look up numbers for him. zestimate vs asking price, estimated rent, cash flow at different down payments. he was doing this on zillow manually like 10 times a morning and texting me screenshots asking "do these numbers work."
i told him i'd build him something over a weekend. reached for flask because i just needed a form that takes an address, hits an api, and shows the results. didn't need anything fancier than that.
the backend is one file. about 80 lines of actual logic. a route that takes the address from the form, calls a rest api called zillapi that returns zillow data as json, calculates a simple deal score based on rent-to-price ratio and zestimate gap, and renders a template with the numbers. that's it.
i added a second route that saves properties to a sqlite database so he can track ones he's watching. and a third route that loops through saved properties and refreshes the data. i run that one manually with a cron job on my server every sunday.
the deal score is basic. if the rent-to-price ratio is above 0.8% and the asking price is below the zestimate, it's green. if one condition is met, yellow. neither, red. my friend said this alone saves him 30 minutes every morning because he can scan 15 properties in one glance instead of opening 15 zillow tabs.
he showed it to guys at his real estate meetup and now 5 investors use it. i added flask-login with a simple user table and foreign keys on the saved properties. multi-tenant in like 20 lines.
for the ai side i set up a skill so they can ask claude about their saved properties:
npx clawhub@latest install zillow-full
total cost is a $5/month digitalocean droplet running flask + sqlite + nginx. handles all 5 users doing maybe 50 lookups a day total. no queue, no background workers, no orm beyond raw sqlalchemy core.
i keep thinking i should rewrite this in something with async or add celery for the refresh job but honestly why. it works. nobody's complained about speed. the refresh takes 40 seconds for all saved properties across all users. flask is doing exactly what it's supposed to do.