Doorman
doorman.zjm.me


My apartment building, like a lot of buildings in Seattle, has an intercom system for guests. When someone comes to visit, they punch in my apartment number, I get a phone call, and I can press “9” to have the door buzz open. This is super convenient for letting people up, or even letting people in to check on my plants while I’m traveling. However, it’s less convenient when I have a bunch of people over for drinks. I keep having to respond to phone calls from the door to let people in.
So, of course, I decided to automate it. I actually stole the idea from my friend Alex, who built a similar solution in python, but the project was simple enough that I used it to learn a couple new technologies. In fact, Doorman is in perhaps it’s fourth or fifth version, since it’s so useful for learning new Web frameworks — I originally wrote it in Node.js, then Rails, then AWS serverless, and now in Phoenix (Elixir). I also wrote a simple iOS app for it, but the app never felt as polished as I wanted — but I’m sure I’ll resurrect it someday.
So, of course, I decided to automate it. I actually stole the idea from my friend Alex, who built a similar solution in python, but the project was simple enough that I used it to learn a couple new technologies. In fact, Doorman is in perhaps it’s fourth or fifth version, since it’s so useful for learning new Web frameworks — I originally wrote it in Node.js, then Rails, then AWS serverless, and now in Phoenix (Elixir). I also wrote a simple iOS app for it, but the app never felt as polished as I wanted — but I’m sure I’ll resurrect it someday.
The logic is pretty simple. Instead of calling my phone number, the intercom calls a Twilio phone number I have, which triggers a webhook on the Doorman server. In the normal case, the server instructs Twilio to forward the call to my cell phone, which preserves all the normal functionality of the intercom. However, if I know several people will be arriving within, say, an hour, I can tell the Doorman server to automatically open the door for them. In that case, when Twilio checks the webhook, the server will respond with a “Dial 9” instruction, which will open the door instead of calling me. It also sends me a text so I know someone is on their way up.
The project is a good one for learning new frameworks because it’s an actually useful service, unlike a blog or twitter clone. There are nested resource relationships (“User’, “Door”, and “Grant”). There’s an external API integration with Twilio. There’s also plenty of opportunity for front-end and design practice — what’s the most useful way to display a Door and its controls? What about visualizing access history?
In each of its forms, Doorman has been pretty useful for me, since I like to host people. It’s been harder to convince anyone else to use it, though — it’s a pretty niche use case, and the hassle of setting it up probably outweigh the benefit. The fact that you have to get your building manager to change the phone number in the intercom is a high barrier to entry for people on the fence.
Still, it scratches my itch, and in a relatively elegant way, I think.