Chao Lam

Working on the next small things …

No one beat a path to my door

leave a comment »

"Build a better mousetrap, and the world will beat a path to your door." ~Ralph Waldo Emerson

It is December 1999 — I am on top of the world. Two months prior, my first venture-backed company sold for $193 million. My second startup, ShoppingList, just closed another round of financing, raising tens of millions. We were pooh-poohing 9-figure acquisition offers. We were partying like it was… the end of the millennium! And I was insufferable.

It would take less than twelve months for everything to come crashing down.

You may have heard of the dotcom boom and subsequent crash. Starting ShoppingList remains the pride of my life: I convinced over sixty smart, hardworking and adventurous souls to join me with just a dream and many promises. But having to lay off these same kindred spirits just two years later and ultimately having no choice but to shut down the company along with those promises was the most painful time of my life.

Still, I am grateful for it was through this tumultuous period that I started forging a worldview that guides me to this day: Yes, do build a better mousetrap — just don’t expect the world to beat a path to your door.

With millions raised, ShoppingList splurged on expensive radio campaigns and partnerships with AOL and Yahoo! where we actually had to pay them to put our content on their shopping sites (you had to be there to understand this upside down dotcom logic!). We were justifiably proud of these efforts. We became one of the world’s top 500 most popular websites for an instant in time!

However, we were blind to the sad reality: despite our reach, customers (retailers and manufacturers) weren’t signing up. Forget profits; even our revenues were less than $500k. A pittance compared to what was invested.

ShoppingList had a traditional marketing strategy. We were in secretive "stealth mode" and didn’t talk about ourselves without employing a legalistic NDA before launch. While engineering was furiously coding up the site, marketing was just as frantically staking out our positioning and lining up advertising campaigns and PR interviews.

This traditional strategy may have had a ghost of a chance if we, in post-dotcom parlance, already achieved Product Market Fit. But of course, as a brand new startup, our product wasn’t what customers wanted in all different kinds of ways. Our engineering and marketing teams were toiling for months to an idealized product vision. And because we never really questioned that the product vision was flawed, we hired many good folks and spent millions of dollars only to find out that oops, what we imagined wasn’t real.

It wasn’t just the expenses. The easiest way to motivate and coordinate tens of people working on a project is to have a shared vision and plan. If a plan changes every day, folks naturally get frustrated. So, riding high on dotcom fumes, we were basically aping big company practices without big company profits to sustain us. Of course, we were doomed!

It was only years later, with the benefit of perspective and reading other more perceptive founders like Steve Blank and Eric "Lean Startup" Ries that I came to realize there were better and more fun ways to start Internet businesses for way less money!

In 4-6 months, this is what we did at ShoppingList:

But nowadays, this is what we do:

Today, at Next Small Things, we start with a small idea, doable by just 2 of us in a few weeks. It’s the exact opposite of raising millions of dollars, hiring a big team, and having a fixed plan approved by an official board of directors! The launch of the product is just the start, we try to improve the product every day with two guiding questions: 1) is this what users want? 2) how do we get more users?

The first question has become conventional wisdom and I don’t have much to add. It’s in trying to answer the second question that we have had a few unique successes.

The Internet is the first read-write mass medium. Business schools still have not quite caught up to the fact that customers/users/readers can talk to each other in real time while using your product!

Every user interaction can thus be a chance to create a virtual billboard with your product. Often, it’s a billboard for something users themselves want to publicize (to each other)but your service gets a free mention for helping put up the billboard.

From this lens, you can see there is a thread to some of the most successful services on the Internet. When you imagine a video, do you also see the iconic YouTube play button? Did Facebook’s Like button become even more memorable than its logo?

When user interface designers decry, "you are putting lipstick on a pig", it’s because they are expected to doll up a product after it’s already been coded. User experience is best designed when each workflow is just being crafted. It’s sorta the same logic for building an audience. If we apply this "billboard" lens for every user interaction in our product as they are being designed, it’s easier to come up with engaging ways your users can help publicize your product for you, all the while doing what they want to get done on your product!

Our own @ThreadReaderApp invites users to make a request to us publicly on Twitter. We reply with a link to a blog-like article of the tweet thread they want unrolled. But, to us, a key element of the experience is that everyone on Twitter can see our user perform the unroll. It’s an integral part of user experience!

Building an audience is one of the biggest stumbling blocks to starting a successful Internet business. We have found that thinking about distribution at the same time as we are designing and building the product goes a long way to deciding whether to do a project and if we do decide, ensuring the project’s success.

When I look back at the string of failures and the handful of small successes we have worked at over a decade at Next Small Things, the successful ones all share this sense that we have answered "how do we get more users" well.

There are days when I recollect wistfully about the go-go dotcom days when I believed I could be building the Next Big Thing from merely a brilliant idea, strong ambition, and millions of other people’s money. Then, that familiar uneasiness seeps back in as I recall the anguish of disappointing so many and how I pissed away millions. In a blink, I am brought back to reality and I know the next small thing is a more fulfilling journey.

Written by Pseudonymous

October 19, 2022 at 7:19 pm

Posted in Uncategorized


Chao, what is your Next Small Thing?

with one comment

Are you a fan of Studio Ghibli’s Japanese anime? Did you watch Spirited Away yet again? Were you wishing to adopt the adorable cat, Moon, from Whispers of the Heart? Or fly a glider over the Castle in the Sky?

As a Ghibli fanboy, you can imagine the sugar rush when I came across a tweet reporting that Ghibli Park was going to open in Nagoya, Japan come November! I remember vividly telling myself, "Wow, this has to be on my Bucket List." … and maybe this could be my next small thing.

Call me Chao. I’ve been running a 2+ person company called Next Small Things for over the past 10 years. It’s a vehicle that allows me to indulge my ADHD-like nature: I can’t resist experimenting with new stuff. When problems in my current project look seemingly intractable, I shamefully admit to staring wistfully at the next shiny new thing. So, we try several new online software ideas a year and if we’re lucky, maybe 1 or 2 actually gain some traction and manage to pay the bills.

Naturally, once I explain what Next Small Things is, I am often asked, "So, what Next Small Thing are you working on now?". This idea of an online, sharable bucket list is my current obsession.

Of course, there are a ton of travel sites out there. But they mainly focus on "where are you going next?". Few of us are about to travel at this moment, but almost all of us have travel aspirations! Why not create a website for a community of travel dreamers and not just travel planners? Think GoodReads as a place for book lovers and not Amazon, a site that caters more to book buyers.

Of course, with some technical expertise, you can create your own little Google My Maps and pin down a list of places you would like to go one day. But where is the romance and sense of adventure in that? And who will look at your lonely list?

You may be wondering if I chose this project on a whim. I really have 2 criteria when choosing my Next Small Things:

  1. It has to be a software project that I am excited about or it solves a problem I’m personally frustrated about. This usually means a consumer-oriented service as I’m clueless about selling to big business. And it has to be something that I have a personal intuition about – like fantasizing I were at Ghibli Park right now
  2. I need to at least have some idea how to make this service become popular; most of my successful "small things" involve baking discovery and distribution of the service right into the product itself.

What do I mean by "baking distribution into the product"? A previous Next Small Thing may be illustrative. @ThreadReaderApp is a Twitter bot that converts a series of Tweets into a simple one-page blog-like format that makes for easier reading, sharing and archiving. What is unusual about @ThreadReaderApp is that when you make a request for this blog-like "unroll" (as we call it), it is done publicly on Twitter itself and often seen by thousands of other Twitterers on that thread. Our bot then replies with the requested article usually in the same reply chain. This is a very natural and organic advertisement of our service! Several authors have told me privately that it is a badge of honor when one of their threads receives an unroll request!

​​My guess is that similar dynamics could be at play with our online travel bucket list. If I see an Instagram post of Ghibli Park’s opening day, I would love to be able to comment "@bucketlist can’t wait to go there next year!". This comment would not only automagically add to my list of places I’m dreaming of, but would also subtly signify my personal and public endorsement of Ghibli Park and the Instagram post itself. Our bot’s reply could share a link to my newly updated bucket list, thus making it just a little less lonely.

Our online bucket list idea may not work. In fact, given my track record, it’s most likely to bomb. But that’s actually what gets me going! I like to quickly come up with a simple service and test how well it works and then rapidly iterate based on empirical results and feedback. Of course, it’s not all sunshine and adorable kittens. It feels crummy when my cherished intuitions don’t pan out. But it’s often in those failures, with my ego bruised, that I’m compelled to ruminate on what went wrong 7/24. It’s this uncertainty and constant learning that ultimately makes this still feel fresh after more than a decade.

Folks have asked, "Why small? Why not work on the Next Big Thing" like those who follow the path of Steve Jobs. It’s partly because of my contrarian nature and it’s mostly because I really enjoy this initial ideation phase where everything appears possible. It has taken me two failed venture-backed startups, where we too were on a Captain Ahab-esque hunt for the Next Big Thing, to finally learn that scaling up and managing folks just don’t play to my strengths. It’s my firm belief that innovation comes from small, humble beginnings. The Next Big Thing is invariably birthed from many small things.

For this project, I’m also experimenting with something new in how I create. I’m trying to work and write in public and hence this little essay. If you hate this idea, please let me know why it won’t work. Thank you for saving me umpteen hours of work ahead! If you love it or simply have questions, please DM me! Perhaps you’d like to be an early tester or even a co-conspirator?

Written by Pseudonymous

October 11, 2022 at 10:00 pm

Posted in Uncategorized


Book Review: The Network State

leave a comment »

Balaji Srinivasan is a great follow on Twitter. I’m not sure how I came across him: it wasn’t so much his string of very impressive accomplishments and credentials. I think it was how engagingly he painted a startup/techno-positive vision that attracted me.

I had a few vague notions such as how the rise of the Internet was gradually displacing the geo-political lens so predominant in the 20th century. Not only did Srinivasan present a sunny view of technology quite different from the Black Mirror-esque portrayal now so tirelessly repeated, he could be incredibly prescient and offered important but forgotten references and perspectives that bolster his viewpoints. He was sounding the alarm bells about Covid way back in Jan 2020.

It was thus with great anticipation when Srinivasan debut his book The Network State. I love how Srinivasan stresses that The Network State is a work in progress, and he views the book as a process of continual improvement. Alan Kay incisively said, "the Mac is the first personal computer good enough to be criticized". It is in this vein that I offer this write up in the hope that it may help propel the idea of Network States forward in whatever tiny but meaningful way. Also as a way for me to improve my own writing!

A common product critique we hear from Chris Dixon, a16z Crypto investor, is that it is Skeuomorphic; meaning the new product is overly constrained, by too closely aping an older product of a different paradigm. And usually, this is not a good thing The oft-quoted example in UI Design is when Apple’s iBooks used bookshelves as a way to organize books on the iPhone (eg. one iBook can reside in multiple collections, a physical book can’t)

The Network State dwells on an old paradigm: the Nation State. This is very well presented and the links around the topic were simply fascinating and in-depth. However, I feel that in presenting the Network State as a revolutionary idea, it is sadly hewing too closely to the idea of the Westphalian Nation State (the book describes what this is beautifully). By analogy, imagine when Steve Jobs first introduced the trailblazing iPhone, he spent a majority of his keynote talking about the history of Alexander Bell’s Telephone!

How did this constrain Srinivasan? One area is the idea of Exits and how it relates to another concept introduced in the book, the One Commandment.

A digital book can reside in many bookshelves at the same time, unlike a physical one. Similarly, I can belong to multiple network states at the same time. While it is true there are folks with multiple citizenships, this is exceedingly rare. And of course, I can’t possibly be physically in 2 countries at the same time.

This is a fundamental difference between the digital and physical domains. And of course the difficult and fundamental problem bitcoin solves is to prevent a bitcoin from residing in two different wallets at the same time (aka the double spend problem), thereby limiting the world to 21 million bitcoins.

I wish Srinivasan had focused more of his intellect on this crucial difference. For example, he rightfully stresses the importance of exits as fundamental human right. So, if we were to live in a world where there is an abundance and ease of entry and exits to and from Network States – that would be a very fundamental change from one where 99.99% of humanity are tied to one nation state for life. What are the ramifications? How would that change society?

As another example, take the concept of the One Commandment that Srinivasan introduces as the moral premise for the existence of a Network State. As Srinivasan explains, One Commandments have been successful in uniting religions and nation states. But in a world of easy and multiple entries and exits, would this still hold? What happens when your One Commandment were to evolve to conflict with another and you happen to be a "citizen" of both? As Srinivasan argues, "the Soviets were devout believers in their ideology", would this still hold true if Exits were easy and social networks can easily retell the successful lives of such Exits?

This leads me to think about the rise of another institution: the multinational corporation that has arguably shared as much success as the nation state in the past few centuries. While I enjoyed Srinivasan’s very informative romp through the history of nation states, I think it would be equally as illuminating to learn about Network States through the lens of the Corporation. While there is certainly a moral premise to many successful corporations, it is certainly more diluted than a religion or a nation state. Would a similar dilutive effect occur for network states?

Finally, this leads to my biggest and more amorphous critique. What problem is the Network State trying to solve?

The book goes into great detail about what is wrong with the world today.

It also describes how Network States are different. But there is very little about how Network States can solve the problems we face today (eg. from anarchy to authoritarianism).

Today many online communities and social networks are thriving. This is beyond dispute. Srinivasan seems to imply that Network States will evolve from these digital communities 1) by better organization and collaboration through cryptography and esp. cryptocurrencies and 2) by acquiring physical land that will eventually achieve diplomatic recognition

I wish Srinivasan would elaborate a lot more on (1). When introduced to this book, this was what I was most excited about. Unfortunately, beyond explaining how all manners of historical activities can now be put "on chain" and thus be preserved more honestly for future analysis (an important point), I found myself yearning for more ideas in this area. The vision that crypto can lead to a renaissance of decentralized cooperation across the globe is a compelling one. Since Srinivasan is one of the leading lights of the crypto movement, I was hoping he could give us a glimpse of that future that is perhaps already unevenly distributed here today.

I am more skeptical of (2): how and why would a thriving online community naturally evolve to one that would collaborate to acquire physical land and furthermore strive to achieve diplomatic separation/recognition.

I found many of the examples given for Network States a little lame. For example, the oft-repeated example of a Keto Kosher "sugar-free" community. I could see compelling reasons to join, say, the Reddit board r/keto. But would these currently 3.2 MM strong members want to collectively buy/own land? Sure, it’ll be nice for my kid to grow up in a neighborhood where I don’t have to worry when she visits some other kids’ home, she’ll be tempted with their sugary products. But is that enough to make me uproot myself and live in such a neighborhood? And if I am not willing to uproot myself, would I be willing to contribute $$ to buying land for others? To imagine that this neighborhood would require diplomatic recognition seems even more far-fetched. What are the plausible paths to such a future? Why not just start your own old skool city?

My book club buddy suggested a more compelling example: a Gay Pride Network State (especially if we time traveled back 30 years ago without the great strides made in the past decades). How would, say, the San Francisco gay community have been different if the technologies and ideas of the Network State were available in the 80s?

In the end, the Network State was a disappointing sugar high. I was very excited and intrigued by its premise, but wished it offered more substantive and "weird but makes total sense once explained" visions of the future.

Written by Pseudonymous

September 15, 2022 at 5:58 pm

Posted in Uncategorized


Applying for StartX

leave a comment »

We applied for Stanford’s StartX accelerator program and were fortunate enough to be shortlisted to the interview round. After not having had to be interviewed for over a decade, I was definitely rusty! Here’re a few thoughts more as notes for myself but maybe it’ll be helpful for future applicants as well:

  1. Answer to the intent of the question, don’t necessarily give the literal answer. In our pre-interview, we were prepped that we would be interrupted and possibly barraged with unexpected questions. Sure enough, one of the interviewers suddenly asked our cap table: What is the equity split between you three?
    Given what I knew of StartX, and how it was known for *not* asking for equity from its member companies and the collegial nature of Stanford, I was not expecting such a question and definitely had a deer in headlights moment.
    On reflection, I think I should have asked a clarify question such as "to better answer your question, could I ask why you would like to know our cap table at this stage?" I think that would have 1) allowed me to better answer to what the interviewer was looking for 2) given me more time to think on my feet!
  2. Keep a sense of humor. I think this is where my good friend John is trying to coach me. I want the interview to feel more like a collaboration, that they get so engaged in our project that they would like to be involved and help out. Being relaxed and having a sense of humor just makes the collaboration more fun!
  3. No matter how the interview goes, I think it’s a good idea to sum up the opportunity the way we see it in a succinct manner, perhaps something like: We’re have thousands of paying customers and are profitable, we’ve made good progress in becoming viral and ensuring free distribution. I think together we can figure out how we can scale this project to the next level of our strategy, in Chris Dixon’s words: "Come for the Tool, Stay for the Community"

Written by Pseudonymous

March 4, 2020 at 11:03 pm

Posted in Uncategorized

Tagged with


Integrating your app with Zapier using OAuth2

leave a comment »

If you’re trying to add your own trigger or action for Zapier, and your end point is only accessible via a valid OAuth2 token, be sure to add the Bearer token in the API end point headers!

Here’s what I tripped me for a couple of hours:

I had some API end point. I even tested it as a "test" end point when setting up OAuth v2 authentication and everything worked. But the end point kept returning a 401 Unauthorized code.

I finally figured out I had to manually add the OAuth2 access token http header for each endpoint url:

Written by Pseudonymous

July 22, 2019 at 9:39 pm

Posted in Uncategorized


Twitter Activity Webhook – Inexplicable error

with one comment

I had some code relying on Twitter’s Activity Webhook which I hadn’t touched for a while.

Today, when I started playing around with the project again, I got this inexplicable error that took me a while to figure out:
HTTP Error 348: Client application is not permitted to access this user’s webhook subscriptions

After many other rabbit holes, I finally found the solution. It turns out if you have changed your Twitter apps permissions, your accessToken and accessTokenSecret keys will be changed

But that isn’t the half (or quarter of it :). These changed keys won’t help you create a subscription. You now need to go to your "regular" Twitter account "app and settings" and revoke access to this app. Finally, you need to regenerate the apps access token and access token secret.

Phew! Would never figured this out without this helpful link:

Once again coding by googling ftw!

Written by Pseudonymous

May 2, 2019 at 5:21 pm

Posted in Uncategorized


Force legacy database using BLOBs to behave as utf-8 strings in rails

leave a comment »

I was working on a legacy mysql database which had a BLOB column "user_name". I think it used a blog so that it could have emojis as strings (before utf8mb4?)

Anyway, my action mailer emails were failing when they encountered these emoji characters. ActiveRecord does all these magical things behind the scenes, but unfortunately it was magically convert the BLOB to 8-bit ASCII upon which action mailer barfed when it encountered these emoji characters.

Finding the issue was the hard part, the fix was easy:

def user_name

Written by Pseudonymous

April 23, 2019 at 6:01 pm

Posted in Uncategorized


TLS/SSL on Mac

leave a comment »

This article was helpful but out of date:

This is the latest Postgres 11 docs to create self-signed certs:

This talks about creating client certs but I’m not sure if it’s needed (at least if client/server are on the same machine):

Written by Pseudonymous

April 2, 2019 at 11:08 pm

Posted in Uncategorized


Default Active Record tables to utf8mb4 encoding

leave a comment »

I found several articles on how to convert existing rails tables to support 4-byte unicode characters including emojis but didn’t find one talking about how to create a new table.

So, here’s the code I used:

create_table :twitter_users, {options:"DEFAULT CHARSET=utf8mb4"} do |t|

Written by Pseudonymous

February 14, 2019 at 10:14 pm

Posted in Uncategorized


Adventures in KenKen

leave a comment »

My Mom enjoys sudoku and I like playing KenKen!

Here’s one I think is worth replaying:

I quickly started out with the basic rules to get this layout:

The only "given" 3 provides a clue to the 45x at the top. The candidates are 1335, given the fixed 3, there can be only 2 possible set of positions for the 45x. A tricked I figured out for 19+ is that it cannot contain digits 1,2 and 3. Thus :

With the double 3s in place, looking at 168x, there are two possible combinations 378 or 467. The double 3s preclude 378, so 467 it is! And with our 21+ eliminating 6 and 7, one of those squares can only be a 4:

Then, looking at the 48x just below 168x, We know there are 4 possible combinations: 344, 624, 618, 328. The first is now eliminated with the 4. 624 and 614 are also eliminated because of the 67 above. So the only combination left is 328:

Now looking at 112x at the bottom. there are 3 combinations: 7144,7224,7128. But the double 2s and 4s are not possible because of the double 24s on the last column (and last two rows). So the only combination 7128. After applying some other clean on the left, we get:

Now here comes a tricky part: The two pairs 15 and 56 circled above, ensures that 19+ cannot have a 5. When 5 is eliminated, 19+ then also cannot have a 6. In fact, the only combination left standing is 478:

Looking at 70x, we know it needs a 2 (in 257), so the 8+ above cannot have a 2, which means it’s 17. Hence (with more cleanup):


which collapses and leads to the solution:

Written by Pseudonymous

February 11, 2018 at 5:54 am

Posted in Uncategorized


Recent Posts



Blog Stats

  • 35,863 hits