Introduction
Adam: I’m Adam Gordon Bell. And this is CoRecursive. Each episode is the story of a piece of software being built.
Whenever I work on the side project, I can’t help but daydream of it taking off in a big way. Years ago, I worked on this little typing program. I added features to it to try to highlight the weak spots in my typing. And I would catch myself just imagining people using it and finding it amazing, like it would spread virally. Bill Gates would tweet out like, “Oh, I’ve just eradicated malaria. But yeah, also this typing program by Adam is really awesome.” Or something like that.
But that didn’t happen. But for today’s guests, something like that sort of did happen. When Nadia started building her side project, she didn’t know that it would end up spreading virally. She didn’t know that it would end up competing with an Amazon product. She didn’t know that keeping it up would be something that would drive her close to tears.
Today is story of The StoryGraph. Let’s get into it.
Goodreads
Adam: So, can you tell me who you are and what you do?
Nadia: I am Nadia Odunayo. I live in London in England, I was born here, and I am the founder and CEO of The StoryGraph.
Adam: Nadia is a big reader, and she’s been tracking her reading in Goodreads for a long time. Goodreads is a social network for readers that’s based around tracking and rating books.
Nadia: There was a time in my life where it was my favorite app, because I just thought how wonderful and magical that I can track all the books I’m reading, and have this history, and see what I thought of each book at each time.
But there was one thing that I always found myself wanting to do that I couldn’t do on Goodreads, and that was to have private lists, or lists that I could share with one or two friends that were quite personal, and that I could then track my progress through that list.
For example, one of my best friends, we have very similar reading tastes. So, whenever she marked a book as five stars, I wanted to keep track of those and then slowly work my way through her list of five-star books. And so that was the original side project. And I’d been sitting on that side project for years.
Adam: The friend she wanted to track was Ana.
Nadia: I did a software bootcamp, and she was actually the receptionist. She was at the front desk then, but since then she herself took the course and is now a software engineer. So she’s got an awesome story as well. But yeah, she’s just become a close friend of mine and we are big readers. One of the things we’ve bonded over is our love of books. And so whenever she rates something five stars, I’m always like, “Ooh, what’s that?” I’m always curious.
And there are a few other people over the years that I’ve found that with, because everyone’s rating scale is unique and personal to them. And so you learn over time, if you follow someone in their reading and their habits, you kind of learn which people seem to be similar to you, or complete opposite to you which could also be helpful as well. And then you can use that to help decide what you want to put on your radar.
Side Project Hacking
Adam: At the beginning of 2019, Nadia had some money saved up and she had no job.
Nadia: And I said, “Well, now I’m just going to hack on my side projects for January, and see how it goes.” So I wasn’t putting any pressure on anything. And my two main side projects that I was really excited about was this reading lists app that I had, that I’d been sitting on for years. And another one that I’d been sitting on for years, which was a running app, where you could put in how far you wanted to run, and it would auto-generate a running route for you starting and ending at the same place. So I found myself, I would go on a run about once a week, and I found myself once I figured out my 5K route or my 10K route, I just did the same thing.
And similarly when on holiday in particular, or when traveling for conferences, it was really hard to map out a new route and know where to go, and get the right distance. So for years, I’d also been slowly hacking away on this running mobile app. Anyway, back to January 2019, I had these two projects that I was super excited about and couldn’t believe didn’t exist in the form I wanted them. And so I remember sitting down and saying, “Which one shall I start with?” And I just chose the reading one and I haven’t stopped since.
The Story Graph V1
Adam: So was it easy to build that first version, the initial list?
Nadia: The first version was easy because… Well, one, my first job in software was at Pivotal Labs, and people might be familiar with the tool Pivotal Tracker? The thing since, I’ve worked at Pivotal, it doesn’t matter if I’m doing a small side project just by myself, I will have a backlog in Pivotal Tracker that I’ll work through. Because I had been working or had this idea for ages and even my friend, Ana, she separately had the same idea.
And so we did collaborate on it for a while. We had a backlog set up already for an MVP, a V1. And so that first day in January when I said, “I’m going to do this.” I opened up Pivotal Tracker, and I just started working through those stories. And it only took maybe a few days? It was within a week, I had a first version.
Adam: That first version was easy to build, but more importantly, it was really fun.
Nadia: I think that was the first time apart from tinkering away on this product over the years, it was the first time I’d done focused full-time development on something to do with books and reading. And I loved it so much that I said, “Okay, originally I said I didn’t want to put any entrepreneurial pressure to say, what’s my startup, what’s my idea? But I have now found something where I feel a calling to this industry. I feel like I want to work in this space.” That was the first version. So it’s incredibly funny and wild how it’s developed into what it is now.
Talking to Users
Adam: Nadia might have just been playing around with a side project, but she knew if she wanted to make this into a thing, there was work she needed to do. And so if you want to understand why her project became as big as it did, when so many other similar efforts failed, then you need to know what she did next. She stopped writing code, and she started talking to potential customers.
Nadia: My first set of customer interviews that I set up, I did demo this app. And I just remember the feedback being very much along the lines of, “Yeah, this is cool. Yeah, I’d use this!” And I just knew that, okay, first of all, this product is definitely not compelling enough. It’s very much a nice-to-have. And then second of all, I knew that showing the demo was almost clouding over whatever real pain points there might be in the reading space.
Adam: Well, what did you hope they would say, when you talked to them? What does a good reaction look like?
Nadia: Well, so this is the thing. I went into it, almost trying to make sure I wasn’t hoping for anything. Cause I didn’t want to imprint my hopes onto what people were saying. I went into it being like, okay, maybe there is… I know I want to build something in the book space, and maybe it is tracking. Maybe it is recommendations, but I just want to talk to these people as if I’m just trying to do research, and I’m not leaning in any particular direction. So I want to hear what naturally just comes out, and then I’m going to go away, synthesize all of that feedback, and see if there are any themes and patterns.
And obviously as a Goodreads user, as someone very much in the industry, I knew that there was a risk of there just not being anything compelling to solve for. And so getting that first MVP out was easy, but then putting it to the side and just doing customer interviews for three months and trying to figure out if there was something in the industry to build was the harder part. Especially because so far I’m still working solo, and it’s my first time doing something entrepreneurial completely solo.
“What Should I Read Next?”
Adam: The main thing people said in the interviews, the common theme was that they didn’t know what book to read next.
Nadia: People would have a stack of books by their bookshelf or they would go onto Goodreads and see a bunch of reviews, or see that people that they followed had rated these books four or five stars, but they didn’t know how to choose which one. And they knew that from past experience that wasn’t necessarily an indicator that they were going to enjoy that book.
And I think the other side of it is they were seeing a lot of recommendations put in front of them, whether was Amazon directly from purchase history or Goodreads or things like that, or people telling them which books to read, but they were finding that they weren’t necessarily loving those books. And so it was the, is there not a place where I can just reliably say, “Tell me which book to read next.” And it will give me a book and I can trust that it’s great. So obviously, this is an incredibly hard problem! But I was like, it’s still a problem, so I’m going to try.
Adam: Did you have doubts? Like, the thing they want you to build is to peer into their soul and find the true book for them?
Nadia: Yes, I had a lot of doubt, again particularly in the first year when I was mainly solo. But the thing that kept me going was like I said, I took everything in small chunks. So, after I had had done a few rounds of research and I saw that, okay, it’s the recommendation side, and choosing the next book. And that’s when I said, “Well, it’s me. And then there’s Goodreads and Amazon and all these other big organizations, am I going to go into this space?”
And at this point I’m thinking of my tech skills as mainly being Ruby Rails. I’d done some iOS stuff and things like that, but it was mainly web development. And I didn’t know any machine learning or anything like that. But I just said to myself, “Look, just keep following the research, keep following and iterating on the research. And as you hit pain points, which could be skill set or whatever? Deal with that at that time, but just keep following the research for now.”
Mood Readers
Adam: What the research said was if you want to pick the perfect next book for somebody, you need to know what mood they’re in. And people will tell you what mood they’re in, which meant she now had a name for her customers. They weren’t just any readers. They were mood readers.
Nadia: A mood reader is someone who they typically have a long to-be-read list. They, every time they hear of a book that sounds exciting to them, they add it to a list somewhere. And already, while they’re reading one book, they’re thinking about, what am I going to read next? But they can’t make a decision because every day or every hour, they’re feeling like something different.
They could be very heavily swayed by the book they’re currently reading and they’ll say, “Oh, this book made me cry.” Or, “This book made me really feel a lot of emotions. I want something similar or I need a break.” And then when they come to choose their next book, they’re incredibly indecisive and they will pick up something, maybe read a few pages and say, “Oh, I’m not sure I’m feeling this.” They’ll pick up something else. They typically have multiple books on the go, and they are not afraid to stop reading a book if it’s not working for them.
Adam: So now she knows who her ideal user is and she what they need. So she makes it official. StoryGraph is for mood readers.
Nadia: I was doing that as a way for people who were mood readers for it to resonate with them, and for them to come on board, and then I would have a focused set of customers to iterate on the earliest, earliest version. And I remember being nervous to do it, but I said, you have to do it because if this product goes the way you’re going to go, you’re going to be able to flesh out something really good with the mood readers. And then if your hypothesis of, actually everyone is a mood reader to varying extents, but they are? Then eventually the product will have wider appeal naturally, as it gets better and better. And so far, that’s what we are finding, but it took years.
Building for Mood Readers
Adam: Now with vision in hand, Nadia just has to build the product. It’s time to switch back to developer from product research.
Nadia: With all my research, I was able to pull out a feature list and I was able to prioritize a list of features that I knew were needed.
Adam: The core use case is, you have a reading history, what books you’ve read in the past and whether you like them or not. And then you probably also have a to-be-read list, maybe books you own, or books that you want to buy. And probably you have all this data on Goodreads. So, Nadia has to get this data from your Goodreads account, and then ask you what kind of book you’re in the mood for. And then StoryGraph will make a recommendation.
Nadia: Then it was similar in most startups where there was a lot of manual work at the beginning. So I had to manually build up databases. Like there were hours and hours of work of just me finding data that I could use, in terms of just bibliographic data and manually entering it until such time that we became bigger and had the ability to hook into different sources. And there was just a lot of manual work, and so it was just building things out, things seeming more automated than they were. People in the earliest days of the app, it was, oh, this book’s not here, send a request. And then I got an email, and then I had to go and research and find information about the book to make an entry in the app.
Yeah. In terms of actually building it, it’s a very straightforward app, really. It’s a rails app at its core.
Adam: Building a Ruby on Rails app is well within her abilities. The hard part is keeping your motivation up, and keeping plugging away.
Nadia: Yeah. There’s this weird thing when you are a solo founder, where you kind of, you can wake up one day and you realize, if I don’t go to work today, if I don’t go to my desk, if I just stop, that’s it. Like, it felt weird how much at this point, perhaps I had tens of users, super, super early days, and I would wake up and be like, is this nothing more than a nice-to-have?
Should I keep going? And I would have moments of doubt and think like, what am I doing here? And it was weird to me how much, if I just said, no, I’m done, that was it. But the thing that kept me going, and I think it was twofold. One was, I always had a next best action that I could take, because, I would say, “Oh, I just did a research round, and this is what I learnt. So either this is a feature I should build, or this is something I should look into.” Or I didn’t know what to do, in which case, customer research time!
I always felt like there was a direction to go in or something that I could do. And I still had lots of runway. So there was no pressure to stop in that respect, to get a job or do something else. But the second thing was the founder product thing, where I just loved the fact that I was building a product to do with books and reading, it just made me so happy. And I just felt like I can’t give up on this. There’s something here, this feels like such a good fit for me. It’s bringing together all of the things that I’m interested in and that I care about, and that I find fun. And so those two things combined just kept me going, and I was like, I’m just going to try and take it each day, because it’s not like you’re going to suddenly quit now. So therefore just get through today and get through tomorrow. And yeah, that’s how I kept on going.
Data Entry Time
Adam: Somewhere along the way in this solo founder process, Nadia started a newsletter that she sent out weekly, and she would describe what she had been working on throughout the week and what her challenges were.
Nadia: One of the recurring themes in the early days was, oh, I’ve spent so many hours inputting all these books and manually onboarding people, manually adding in all their Goodreads data. Am I doing this right? I know that they say, you’ve got to do things that don’t scale, but there a path to something more automated? And I remember I would have people message me and say things like, “Yeah, good luck. I’ve tried this before. It’s probably not going to work.” I would even have people say things like, “Well, surely you can automate it this way or that way, but all of the ways suggested I knew they weren’t viable long term, because either they involved relying on the Goodreads API, which I knew I couldn’t do at all, if I was going to build something, which was potentially going to be a commercial competitor with it.
Adam: Yeah. I never thought of this, but you can’t just build a competitor to Goodreads on top of Goodreads’ own APIs. Amazon would never stand for that. You risk them just pulling the carpet out from underneath you at some point, but Goodreads does have an export process. And if you get that data, you can not only make recommendations, but also show cool graphs and stuff from people’s reading history.
But that’s just the reading data. Nadia also has to manually label books with various moods and paces, just one book at a time determining its mood. It’s wild how much of turning a side project into a profitable software business is not related to building software at all. It’s just this kind of grunt work.
Nadia: I said, “Well, this is part of it. This is part of why it’s hard. And if you don’t get through this, you won’t have a chance of potentially succeeding and you might still fail, but at least give yourself the chance to really fail. And not just because you gave up, because it got hard.”
Machine Learning Arrives
Adam: Meanwhile, one of Nadia’s friend Saron is reading her newsletter, and then her husband Rob starts reading her newsletter. And then he reaches out.
Nadia: He said, “I saw that you’re spending a lot of time doing manual entry and research on different books. I’ve been actually learning machine learning on the side, no promises because obviously with machine learning, you need millions and millions of, you know, data points. But if you are cool with it, if you could give me an export of what you’ve done so far, I’ll have a little play around and see what I can do.”
And I remember that he said, “How many books do you have?” And I think at that point we had about 2,000 books in the database. And he was like, “Hm, okay, well, we’ll see.” And I remember two days later, because I was in Japan and actually this was to be the last time I was abroad until still today, I haven’t been abroad since.
So this was November 2019, two days later, I was in Japan, speaking at [Ruby World 00:19:26] in Shimane. And I remember being in the hotel lobby and getting this email from Rob. And it was a lot of text, but I remember there was one part that stuck out for me and it said, “Hey, I think I’ve got a model, it’s only 60 to 70% accurate. So I’m not very happy with it.” And I remember thinking, whoa, whoa, two days ago I had zero machine-learning model. Now you’re telling you’ve got something that’s 60 to 70% accurate?
And then he had had attached a spreadsheet of results. And I’ll always remember this. I was trying to figure out, what is he deeming accurate? And I realized that what he was deeming as accurate was how well his model matched what myself had had the book at.
So, there was this one book that he called out in his spreadsheet, and it was classed as a fail for the model, because the model tagged it as mysterious. And I took a look at the book, and it was a murder-mystery. So I said, “You’re saying, this is a fail, but this book is a murder-mystery, and so therefore your model is more accurate than we have been.” So the human error piece that came into that. And so that was an oversight on us somehow, that book missed off the mysterious tag, which it should have had. And so I was very excited at this point.
Dev BackStory
Adam: So Rob joins as a co-founder, and also Nadia finds Abbie, a book expert, and she joins part-time to do some data entry. It seems like some of the manual work that Nadia’s been busy doing might have an end in sight, and she can get back to development, which she loves. She loves coding, although she didn’t always love it. At one point, she could never imagine herself being excited about it. Here’s the backstory.
Nadia: I won a competition to go to a bootcamp in London, Makers Academy. And at the time the course was £8,000 pounds, so about $10,000. I got a free place, and even then I was still hesitating whether to go to take the place. I was like, I’m not going to be a developer. Do I want to do a three-month bootcamp, learning how to code? But since I didn’t have a job then, I decided to go for it. And it was while on that course that I fell in love with coding, well parts of coding and development, because I’m quite a mathematical logical person in the sense that I like problem-solving and I’m also quite creative.
I like reading, writing, music, dance, singing. Those are all things that I like. And so I felt like coding and building an app, or putting up a webpage, had all of these aspects. At Makers Academy it was all about full-stack development, right? So we were doing Ruby, but we were also doing like HTML, CSS and JavaScript. And so I started to fall in love with it, the backend stuff, because it was problem-solving and things like that. The front end stuff was design, and even there was design in how are you going to put together these models? How are these models going to communicate to each other? What makes sense, abstractions, things like that?
I love that kind of stuff. Especially when I have a chance to just do pure TDD on a new feature, and it’s not some like debugging or whatever, it’s something new. It’s something that I can fit in my head and I understand and I just get to do some TDD. I’m always so happy. Rob always sees me. He’s like, you’re having fun. You’re just coding. And I’m like, yeah! I just… Failing test, fix the test, yeah!
Adam: Yeah. It can be really addictive when you have a very quick feedback cycle when it’s like, okay, yes. Now that’s working, now the next thing. Personally, if I have a lot on my mind and I have to do something that’s like that with very quick feedback, and then it gets a bit more complex and then it’s hard to keep it all in my head. And then whatever I was worrying about just by necessity gets pushed out and I’m just able to focus in. Like pushing the worries out of your head just because there’s no space for them.
Nadia: Exactly.
Getting to 1000 Users
Adam: So as Nadia and Rob and Abbie were building things out, their user base started to slowly grow.
Nadia: We were waiting for 1,000. I made all these funny videos on Instagram of me, it was the club music pumping on, on Rail’s admin, like zooming in and out. And I posted this on the Instagram, the StoryGraph Instagram, like, “Hey everybody, a thousand users!” Was so happy.
Adam: Unfortunately, that happiness turned into confusion two or three days later, when something started going wrong.
Nadia: Back then I used to get an email every time somebody wanted to do a GoodReads import, because… I mean, what I got, not even one an hour back then, it was like I suddenly saw a lot of emails. I think I got a lot of errors because the system had been set up to run a few at a time. And I suddenly like many, many emails in my inbox of people, of imports failing because the APIs that we were hooking into or whatever overloaded. I was like, what’s going on?
And then I went into sidekiq. And there were like a hundred or something items in the queue. I was like, what’s going on? Now earlier that day, someone who was very well connected in the publishing industry had tweeted about us, and that person had 45,000 followers. And it had got like a decent amount of traction. So I was being like, let me go back and check that tweet. Has it suddenly kicked off?
Turns out someone, just a random person in the books community, 200 followers, had quote-tweeted this tweet, and essentially wrote something which hit at all of the kind of key points that would make people want to take notice.
The Viral Tweet
Adam: There are a bunch of things happening in the world at this time. First of all, there was a backlash against Goodreads brewing. And the tweet mentioned that.
Nadia: “Can we please stop using Goodreads? It’s owned by Jeff Bezos and Amazon.”
And at this time Amazon had lots of negative press because already people were getting tired of Amazon because of the worker conditions and things like that. And also it was during the pandemic, very peak pandemic, and Jeff Bezos was getting richer and Amazon weren’t paying their taxes.
So, there was a lot of just anti-Amazon sentiment. And in particular, there was a lot of anti-Amazon sentiment in the books world because of the publishing industry, the low prices, all of that stuff. So there was a lot of anti-Amazon sentiment in general, and in the books industry.
And then the person referenced the fact that this was founded by a black woman. This was maybe a few days or a week after George Floyd’s murder. And what happened was, there was… Online, it started in a very angry, obviously devastated space. And there was a shift maybe a few days to a week later, where it became, we need to support black-owned businesses. And so that was put in there, and it’s also got all these awesome features and it’s independent. It was all in one tweet.
Adam: So this tweet by a person with just 200 followers, it went viral. It got thousands and thousands of likes and thousands and thousands of retweets.
The Incident
Nadia: Then essentially, we went from never having more than eight Goodreads imports in the queue, to having a queue of 18,000. I was the only developer, I still am the only developer. I don’t know why I’m saying I was, I still am! And I just looked at this, the app, basically it didn’t work. It crashed!
I’m like, okay, I’m a boot camp grad who only ever used to working with software engineers more experienced than I am. At Pivotal, I was always pairing. And then I worked with Saron for a bit, Rob’s wife, actually. And it was very low stakes then, because we were just building out a product that no one ever ended up using. So this was the first time where, wow, this felt very real.
Adam: So what did you do that week?
Nadia: That was a dark two weeks! So we had two like cues. One was doing Goodreads imports. And the other one was processing recommendations for people. So looking at their data and generating their recommendations. It just got to the point where we had to make the decision to say, “Okay, both of these are standing still right now. We can’t juggle both.”
Because both needed rearchitecting. Is rearchitecting a word? Both needed rejigging. And so we just said, “Look, the most important thing, the most wow value-add is when you put your Goodreads data in the app and you see all your stats.” Because you could have been tracking on Goodreads for a decade, and you’ll get StoryGraph stats for the last decade.
Disabling Things
Adam: Stats are cool. I’m sure that’s an amazing feature, but this original vision of these great recommendations that Nadia had been working on, the feature all the customer interviews had pointed her to, the cause of all the data entry and the machine learning? Well, bad news about that.
Nadia: We actually had a notice in the app that said, “We’ve had to shut down recommendations because there’s too many people!” Obviously we said it in a more professional way than that, but that was the gist.
Adam: So what was the scaling issue? A whole bunch of things, or just your database was overwhelmed or what happened?
Nadia: It was a whole bunch of things. We were, as I said, yeah, we learned about IOPS. So the sense that we’re doing a lot of heavy writes to the database, adding things to users every second and the database that we had provisioned just wasn’t good enough. We had to chuck more money at the database. That was one of the things.
Some of the other things were… I’m trying to think. I know that I had a lot of inefficiencies in the code of maybe looping through things. I had memory issues, trying to store certain things in memory. In terms of maybe I wasn’t doing the most efficient things to even open people’s Goodreads files and reading them? There were memory issues. I had inefficiencies with database indexes or indices. And I remember at the time we were using PG Search as well. I remember that just wasn’t configured well, and a big part of the import was searching, because to find, is this book in your Goodreads spreadsheet, do we have it already?
So there was in efficiencies there. It was things like that. Just like scripts, just not scaling well and also the infrastructure, just not realizing, okay, you’re now operating at a different scale. You need to upgrade things.
Increasing the Spend
Adam: One problem with upgrading, and maybe a problem with bootstrapping a social network from your own savings account in general is just the cost to run these things.
Nadia: Probably what we were spending monthly, just running the app, shot up in those few days too. And at this point we’re still bootstrapping. I had already been putting money into the business. Rob had started putting money into the business when he came on board. And so we’re like, okay, yeah. Now the costs are in… We’re now in the thousands. Hmm.
Adam: During this time, Nadia was trying to get help. So she shared metric charts from her database in her newsletter.
Nadia: This is the response times. And you know, things like that is what made Andy text and say, “Wait, which database are you using?”
Adam: Andy is Nadia’s friend, Andy Kroll.
Nadia: When I told him, and he said, “You’re doing these Goodreads imports, which are like putting in thousands and thousands of records every second, what plan are you on? Oh, no way. That’s for small side projects. You need to pay for the expensive one now.” It was just literally, every time we did something, okay, what are our logs and metrics telling us? What does this mean? Okay, let’s go research. Or, you know I mentioned IOPS. We never knew about tracking IOPS, figured it out that the reason why we would go okay for a little bit and then start crushing is because we were overshooting our IOPS limit by a considerable amount. And then the database we were using had a burstable capacity, but then the burst amount got shut down.
So things like that where we need to track it, So okay we can’t have 20 workers on this database, you can have two. Figuring out all this kind of stuff, I still sometimes am like, do I fully understand this database pools and connections? All that stuff, read so many blog posts, tried so many different iterations, just trying to figure stuff out. So it was literally a week of all hands on deck, just trying to see pain points and then say, “Okay, how do we get this to look normal? How do we get this to go down? How do we figure out where the memory leak is?”
Waiting Users
Adam: Meanwhile, tens of thousands of people are trying to use The StoryGraph, and for them it just doesn’t work.
Nadia: The other thing that happened is when you did a Goodreads import, we sent you a message saying it will be done in a few minutes, because they were always done in few minutes.
So we had like 10,000 people emailing and messaging and saying, “It’s not done yet. I only have 100 books, what’s going on?” Not knowing that they’re number 12,046 in a queue, we haven’t started it. No one’s in [inaudible 00:33:37].
Adam: To tackle this as they always did, they split the work in half. Rob owned the machine learning and Nadia would work on the website and the imports.
Nadia: There was one point where Rob had kind of solved his issues. Things that I didn’t really see or interface with, he said, “Okay, I need to do this. I need to do that, done.” And there was this one point where I remember opening up my emails or something at one point, because I was out of ideas. And I remember feeling inside scared and feeling this pit in my chest of there’s nothing I can even ask. Because I don’t even know what the surface area is of where I’m meant to be looking. And I remember Rob said like, “Okay, I’ve sorted out my side, how’s yours going?”
And I had made no progress, and I remember just feeling like, uh! And I remember vividly he was on a video call and I had him on one side and I just had my emails on the other side. And I was just like, “I don’t know what to do right now.”
But the great thing about working with Rob is that he’s a great pair, even though he doesn’t know Ruby Rails. So I can say, “Okay, I’m seeing this issue.” And he knows the right questions to ask to help me start thinking about different things. I can explain a domain or I can explain what code is doing. And he can say, “Conceptually, I would do it this way.” Or with his work, he uses some Python sometimes. So, he does have a sense of some of the code as well.
So I was never alone alone. There were moments where I felt alone, because I felt like I’m meant to be the web expert. I’m the CEO of this company, I’m running this ship. I need to step up! No matter how helpful Rob was, I still felt I am deep down the leader. Not even deep down, I am! So I need to get my act together and not be, “Oh, I don’t know what I’m doing.”
So yeah, there were moments where I was like, I’m not sure, but I just kept on going. I know it just sounds like, oh you just kept on going? And I just did. Like, if something’s not working, there was always somewhere that you can look, there’s going to be something that will just indicate that something’s not quite right. So I just kept on looking.
Dark Days
Adam: A lot of this looking is alone. Nadia is in London in GMT time, and Rob’s in PST. I think that’s eight hours difference. They only have so much overlap, and this incident is just stretching on for days. They’ve never had this many people on the website before, and they’ve never had the site working less well.
Nadia: I mean, it was two days of this and I was just like… I remember one day I was out of ideas, and I remember going into my bathroom, sitting in the dark, and I wouldn’t allow myself to actually say, “You can’t do this, stop.” But it was on the tip of my tongue. I felt close to tears as well. Because I said, “Oh, you’ve wanted this all these years. You’ve wanted your product to take off. You’ve wanted to build a successful company. Now, here it comes.” And I wasn’t going to say it, but I was thinking it, and I said to myself, “No, you cannot say you can’t do this. You’re going to get out there and you’re going to keep going. You’re going to keep researching. You’re going to ask the people that you know in your…
Luckily, because of my speaking, I had a lot of Ruby Rails friends and people who were just familiar with different bits of infrastructure and architecture that could help us figure out where to look. And it took two weeks, but after two weeks there is a newsletter that I’ve sent out that says something like, “Caught up.” Or, “We’re back in business.” Something like that because yeah, it took two weeks, but we made it, we caught up.
Celebrating
Adam: And then people started to get their data imported, and they started tweeting about how great StoryGraph was.
Nadia: “Oh wow. This was worth the wait!” So the positive feedback was coming in. So at that point I said, “Okay, cool. We’re past this hump now, now it’s onwards. Can we keep these people? What’s their feedback going to be over the coming weeks after the novelty has worn off?”
Adam: Nice. And what did you do? Did you have an app? Did you punch the air and say yes? Did you post a weird dance on Instagram?
Nadia: Probably. No, I probably did… Dancing is actually one of my main hobbies, so, well we were in the pandemic, so I must have done some dance routine in my house. Probably did that as a break.
When I’m excited and happy, I can go wild. I would just be doing silly dances, silly moves, amping myself up. And yes, that kind of stuff like cheering. So there was a mix of just like relief, probably relaxed for a little bit. There wasn’t anything like, “Okay, I’m taking some days off now.”
No, because it was just the beginning. So now these people are here, now we’re over the hump. We need to keep going to keep up the momentum. So it wasn’t anything like that, but I’m sure I continually said to Rob, “Wow, we did it. We made it, I was worried, were we going to make it? We made it!”
Adam: From there, things kept growing. People liked StoryGraph, and they recommended it to others and readers know other readers. And it started spreading by word of mouth. And there’s no VC or giant team. It’s just Nadia and Rob, and they’re making it work.
Nadia: Since then, whenever we’ve had any scaling issues or problematic issues, I always say to Rob, “Okay, I have to remind myself when it was 18,000, and it was literally at standstill and I didn’t know what to do. Nothing is as bad as that. So we’ll get through this.”
“I’m not a tech pro”
Adam: Scaling a consumer social network like this, building it from scratch with your own bank account and your own code. It gives you bragging rights. It’s a huge accomplishment, but Nadia has trouble thinking of herself as an experienced developer.
Nadia: It’s more, I’m like, I’m just being realistic. I did a bootcamp five years ago and I haven’t been full-time developing since then. I’ve been doing all these other things. So I’m not as good as I could be. And there are a bunch of other people who’ve been doing it focused for the last two decades. So yeah, I’m not the best, but whenever I tell Rob or Saron, “Oh, I’m not a tech pro.” They go, “Nope. Mm-mm (negative). You are. Nope, we don’t want to hear it. You’re a tech pro.” So I guess I’m a tech pro!
Adam: Yeah, well because I think you took a Rails app to whatever, like 40,000 people using it on some days, or whatever? I think if you wrote down your bullet points of your engineering achievements…
Nadia: That’s the thing. I think that’s the difference, right? If you write it down, running an app that on the heaviest traffic days had like, what was it? We had millions of page views, millions of unique visitors, right? And it interacts with these systems and these APIs, and uses all these different technologies. It would look very accomplished, but I think it’s like, I think of the behind-the-scenes, what it looks like when I’m at my desk and the hours I spend Googling and trying things. Or when I take down the production app, because I didn’t think, oh yeah, you can’t do that, Nadia. You can’t do a migration like that anymore. Like, come on!
Things like that, which I feel are rookie errors, then that’s the bit that I know that makes me say, yeah. But it’s fine. If I did ever need to get a job, I feel like hopefully not. But if I ever did? Yeah, I’ll definitely be bigging myself up and say, “Yeah, I’m the best, look what I did.” But between you and me, I definitely feel like behind-the-scenes though, it’s not pretty,
Adam: I think it’s hilarious. I can imagine you interviewing for some job at some place, like that has a big Rails infrastructure. And you’re like, “Okay, so it says here you scaled the database to bazillion reads per second. How did you and your team tackle that?” And you’re like, “You mean Rob? What do you mean my team?”
Nadia: Yeah, oh, that is the thing that makes me, I guess… One of the things that makes me most proud right now, because I run the Instagram. In the bio it says it’s run by the founder, but no one really looks at that. So no one knows they’re talking to me, and I often get like, “Congrats to your dev team.” Or, “Can you pass this bug onto your dev team?” Or, “Will you be able to help me with this issue? If not, can you pass me onto someone?”
And I’m like, “Well, I sure hope I can help you because I built it.” I don’t say it like that, but that’s how I think! But there have been a couple of times where things have been worded in a way where people know they’re talking to me, but they assume I’m not the technical person. And so depending, sometimes I will say, “Oh no, it’s me. I’m the one that coded it.”
Because sometimes I’m like, you’ve assumed that I don’t know anything about the technical side. You’re wrong! And I’ve been asked, “Is there a feedback form or is there a way that I can tell someone higher ups that you deserve a gold star, or can I give you five star feedback?” And I’ll just say like, “Ah, I’m the founder. There’s no one, it’s me.” So those are fun.
Becoming Profitable
Adam: StoryGraph is killing it. I keep forgetting to say THE. It’s The StoryGraph. It’s almost up to a million users and it’s growing, and they now have a paid product, so the company has very recently become profitable.
Nadia: I might be on the verge of getting my first paycheck, because we’ve also recently just rearchitected a bunch of stuff. And so we’re saving a lot of money on that side of things and also being more performant. We’ve still got more work to do on that.
But combined with our growing number of subscribers, we’re getting to the point, but we haven’t reached it yet. So need to start, once that side of things being sustainable and profitable long term so we can keep going. And I feel like, yeah, once we get there, then I’ll feel like, okay. And I want to make sure I keep pushing and pushing until I get to the point where I feel like, okay, there is nothing glaringly sub-excellent in the product.
“A Story of Perseverance”
Adam: Your story is obviously not over, you have a lot of things you still want to do, but what kind of story is this?
Nadia: I think it is a story of perseverance. I needed to give myself the chance to fail, when it was really hard and I was like, what am I doing? Who do I think I am? Just me, a junior developer trying to build a Goodreads competitor.
But then I just said to myself, “Well, if you think of the products out there that are successful, and the people that make it one, the product are really good and they’re solving a need, but the founders have overcome difficult things, or they’ve put in the work. And if you stop, then you never will have the chance to see if this can be successful.”
And so as long as there’s a direction to go in, then going to keep following that direction and I’m going to keep being patient. That’s the other thing, I think one of the most difficult things for me right now is I know the level of where I want the product to be, but we have so many eyes on the product right now.
I mean, millions of eyes and there’s so much feedback that comes in all the time. I’m very receptive to feedback. I take it in, but it can be hard when people say things that either you know is a shortcoming that you’ve been wanting to work on for ages. Or it’s almost pitched as if, “Didn’t you think about this, didn’t you guys think about this?” And it’s like, yes we did. But one thing at a time.
And so it’s the patience of saying, even though I know the product has to be this, this, this, and look like this and I have to do this kind of research and that kind of research, we’re a small team. We’re going the boot-strapped, indie route. Things take time. I just have to be patient. Patient with our customers and patient with myself, and just know that as long as I keep taking one step every day, eventually I’ll get to where I need to be. And then everything will be amazing.
Outro
Adam: Thanks to Nadia for sharing her story, and check out The StoryGraph, thestorygraph.com. StoryGraph Plus is her paid program. And because of that she’ll soon be able to get a paycheck.
And a big thank you to my wife, Courtney. Courtney is a mood reader who will read a history book and a thriller book and a literary fiction book all at the same time.
She’s the smartest person I know and the love of my life. And she started using StoryGraph recently to track her reading, and pointed Nadia out to me. So thank you, Kourtney.
Also, if you want to hear more of my conversation with Nadia, please support the show. On the 15th Patreon supporters will get a new bonus episode featuring a continuation of me talking with Nadia. We’re going to talk about how she did some of her user research in more depth, how she built early versions of the product, and how the product continues to grow.
That’ll be the fifth Patreon episode I’ve put out. There’s a bunch of them, and they’re all really good. There’s a continued interview with Paul Lutus, the guy behind Apple Writer. I have a chat with Joey Hess, about Debian and other things he’s built. I talk with Andreas Kling about how he inspires people to join his project.
And now this episode with Nadia, so hopefully it’s a great value. I got to be honest, I feel a little bit weird trying to sell the Patreon donations, but I really do appreciate that. So for everyone already supporting me, thank you so much. And until next time, thank you so much for listening.