Board-gamers.com: a Telegram bot, Telegram login, and leading people who don't report to me
Time for an update on board-gamers.com, the side project I keep coming back to in the evenings. Quick recap if you have never seen it: it is an open source Django platform for board game clubs and associations. Locations host tables, players join them. That's the core, and it is intentionally simple.
This year I shipped two things I'm happy with: a Telegram bot and Telegram login. But honestly the code is not what I have been thinking about the most. I'll get to that.
The Telegram bot
Clubs already live on Telegram. That's where people ask "anyone up for something heavy on Thursday?", where they share photos and complain about who forgot to bring the expansion. Asking them to open a website to check if a table has free seats is asking them to leave the place where the conversation actually happens. Most won't.
So in March I built a Telegram bot. The flow is short:
- A club manager generates a token on the site.
- They run /setup with that token in the club's Telegram group. It also works inside a specific topic of the group, because many clubs organize their groups in threads and nobody wants a bot spamming the general chat.
- The group is now linked to that location, and anyone can type /tables to see the upcoming tables and how many seats are still free.
Nothing fancy. But it moves availability into the chat people already read, and that is the whole point.
Telegram login, and the users with no email
In April I added Telegram login through social auth. If you have linked your board-gamers.com account with Telegram, you can just log in with it. One less password to forget.
The part I underestimated: users who sign up via Telegram have no email and no password. A lot of the app quietly assumed that every user has an email. So I had to go around and fix things:
- No email notifications for those users (sending mail to an empty string is not a feature).
- The profile page hides the email section when there is nothing to show or change.
- Their name is not overwritten with the Telegram one on every login. The first version did that, which is exactly the kind of bug that makes people think your app is haunted.
Small stuff, but it is a good reminder that adding a login method is never just adding a button.
The hard half is people
I'm the main contributor and, right now, the only maintainer. That sounds like a technical role. It mostly isn't. Writing the bot took a few evenings. Deciding what the platform should and should not do takes much longer, and it never really ends.
Different clubs want different things, and they are all reasonable from where they stand. A club representative wants control over their location and how tables are managed. An individual player wants things to be quick and wants to join a game without asking for permission. Sometimes those two wishes point in opposite directions, and I end up being the person in the middle, arbitrating between people who are all doing this for free, for the love of cardboard.
And then there is saying no. Every request that makes sense for one club risks making the platform worse for the others, or turning it into a pile of settings nobody understands. So I have to say no, or "not now", quite often. The problem is that I have zero authority to back it up. Nobody reports to me. Nobody is paid. If people don't like the direction, they can simply stop using it, or fork it (it is open source, after all, and that is fine).
This is very different from my day jobs. At GreatPixel I led a team of 30+ people, and at Bakeca I built a division of 15+ from scratch. There was a hierarchy. Even if I always tried to lead by empowerment and coaching rather than by title, the title was there, and at the end of a long discussion somebody could make the call and everybody knew who. Here that fallback doesn't exist. In an open source community you only have influence.
What seems to work, so far:
- Explain the why, every time. A no with a reason is a conversation. A no without one is a door slammed in someone's face.
- Look for the general version of a request. Often a club asks for something very specific, and behind it there is a need other clubs have too. Building that is an easier yes for everybody.
- Ship, then talk. Showing a working thing, like the bot inside a real group, convinces people faster than any discussion about what it could be.
- Accept being slower. Consensus takes time. With a team I could push a decision through in a meeting. Here pushing just burns the goodwill the whole project runs on.
I'm not sure I get the balance right. Some days I feel like a benevolent dictator, other days like a customer support desk with a git repository attached. Probably the truth is somewhere in between, and it moves.
What I do know is that this project is teaching me something my formal roles didn't, at least not as clearly: how much of leadership is still there when you remove the org chart. Quite a lot, it turns out. It just has to be earned again every single time someone opens an issue.