Weekly Notes #3 / Digital gardening

Some stirrings here and there lately, for anyone paying attention. As I mentioned two weeks ago I’ve been keeping a separate blog of “startup explorations,” which I’ve now decided to merge with this site, so that it might benefit somehow from proximity to everything else that interests me. This is an experiment.

I’ve been thinking more of this space as a “digital garden,” a space in which to pursue multiple streams of thought (“blogchains”), and discover points at which they might intersect. A digital garden might take the form of a personal wiki, or a loose collection of networked pages, folders, and files, which may or may not be organized by publication date. For my current purposes, the reverse-chronological blog stream works well enough—a particular disadvantage of it is that older posts are necessarily left to decay in favor of newer ones, although this is exactly what I want, until I change my mind.

I rather detest the idea of specializing in any one thing, and have always looked up to polymaths, multi-hyphenates, and many-hat-wearers. But surely even these people must be able to synthesize all their competencies into a a singular purpose or other, if only out of convenience? My aim here is to discover if I can—if nothing else, a great excuse to write.

Startup explorations #11 / Art and content: In praise of content creators

As I inch further into this whole business with which I’ve occupied myself in the last four weeks, I notice how my thinking has shifted squarely away from “musicians” or “artistic types” and, for better or worse, toward “content creators.” In the past I have been irritated by this rather unwieldy phrase, thinking it to be dull and meaningless. But now I’m inclined to think it’s a better term than “artist.”

Who is an artist? My formal education is in music so I’m used to narrow definitions of artistry. Sometimes people take it to mean profound technical mastery of some craft or other, or on the other hand, pure, uninhibited self-expression. But over time I’ve come to view it more broadly as the extent to which one dares take ownership of their work; how much of yourself—your own personality, beliefs, values, quirks—you allow it to reflect, no matter the form: literature, music, software, business, whatever.

Take the world of classical music, for example. Again and again one encounters people who are masters of technique, but are peons under established standards of acceptable expression. Unsurprising; after all this is an industry that appeals mainly to a specific kind of taste, rather narrow and unresistant to shock. They have their place in the world. But why are we so ready to call any of it artistry?

On the other hand, there are those masters of expression, to whom I’m generally much more sympathetic. The problem with them is that they’re no good at thriving in society, whether it’s their own fault or not. History is full of examples of great creators who went unappreciated in their lifetimes: Beethoven, Vincent van Gogh, Herman Melville, and the list goes on. That this is so says something about how society at large relates to artistry—that most of the time, when it comes to art, we probably have no idea what we’re talking about.

Now, we have content creators. I happen to think that genuine artistic talent is rather rare, just as the movers and shakers of other disciplines are rare. But the average content creator need not be concerned with such lofty notions—there is joy in creation, enough to reverberate visibly, even without reaching the highest possible levels of mastery. There is an element of artistry in allowing work to reflect even a little something of its maker; yet the quality of content is irreducible to self-expression only, but always tempered with needfulness. The word content itself implies that it does not and cannot exist by itself: it must fill a vessel, or a need, or else it’s irrelevant.

Content has no need either to be as polished as the great examples of art; but we are given the chance to see it become more and more polished over time. Perhaps when creators let go of the baggage associated with artistry, they are more able to create without fear of mediocrity, and not have to wait until they’re dead to find appreciation.

Startup explorations #10 / More adventures in Twitter: Who’s following me?

In my last post I summarized one prospective product in terms of problems and solutions. I might summarize it even further as: a smart assistant to help you discover your community. But what does it mean anyway to discover one’s community? I have been thinking about how we might describe the ideal members of our personal communities—how we might identify those people with whom we might find some sort of lasting connection.

In the spirit of experimentation, I looked at my own current Twitter account and its grand total of 34 followers to see if, based on those who choose to have my tweets on their feed, we can paint any broad pictures: the kind of thing a smart technological solution ought to be able to do at scale. I chose to look at several different parameters: the type (whether it’s an individual, a company, or something else), level of anonymity, continent, keywords gleaned from a user’s profile, number of tweets, number of accounts followed, number of followers, and whether I have had any prior connection with them (friends, followers from previous accounts, etc.). The following table represents a partial picture of my most recent followers.

As we can see from the data, my followers consist largely of “builder” types: software developers or technological people working on indie projects. Many of them I’ve described as “thoughtful”—this is strictly not something that appears as a keyword in any profile, but a description of my own making, based on a quick glance at a particular profile, with attention to writing style, subject matter, and tone, among others. We can infer that my ideal community is made up of people in the tech industry who are indie creators and are interested in “thoughtful” subjects—thus we know to be more deliberate about seeking such people out.

Looking at the numbers as well—especially number of followers—we can see, as anyone might correctly assume, that at this time I’m far more likely to be followed by people whose follower counts are under 1,000. Two of my followers have over 6,000—but one is a prior connection from one of my earlier accounts. Knowing this, I would probably focus my efforts on people whose follower counts are between 1 and 1,000.

This is only a quick scratch at the surface: there are many more ways to play around with this data; many more ways that we might use our knowledge to find what we’re looking for. I would only emphasize that ultimately, the point isn’t numbers (i.e., getting the most number of follows possible) but to maximize our chances of finding people who might become part of our audience, and with whom we might build meaningful connections. How can we introduce a more human element to this whole process? Are there any other insights we might be able to gather that only a human mind can think of?

Startup explorations #9 / Ideas worth pursuing

By now I feel like I have enough of an idea, at which I hinted in my last post, to begin a little wireframing. From here the idea begins to leave the safety and comfort of my own head, and goes little by little into the open where it’s much more vulnerable to reality. The following is a quick summary of the key points:

Problem:

  1. Building an audience from the ground up is too intimidating or discouraging.
  2. Careful searching for like-minded people to follow is too time consuming.
  3. Difficult to engage with already established people.

Solution:

  1. A discovery tool that recommends the best people for you to follow, which would most likely result in good engagement.
  2. Integration with popular social network sites like Twitter and Instagram.
  3. No need to calibrate or manually specify a whole bunch of parameters; the technology would automatically base its recommendations on various dynamic factors: follower counts, frequency of use, keywords, etc. It would learn more about you and your ideal community over time.

Again, I would describe our ideal user base as: those creators who are fully committed to their work and have something valuable to share, but struggle to build a consistent following, are intimidated by having to start from the bottom, or find it difficult to find a like-minded community.

*

As I begin sketching out screens and figuring out menus and buttons here or there, I’m forced to confront my own ideas even more. The most formidable hurdles at this point are all psychological: the more shape an idea takes, the more I doubt myself. What if I’ve gotten it all wrong? What if this idea sucks? It always seems much less convincing the moment I get it down on paper; suddenly a dozen other ideas seem much more interesting.

But as the truism goes, “ideas are cheap.” A recent post by Seth Godin expresses it in a different way: one’s big idea is probably not original, not breathtaking, and won’t be immediately popular—but it’s worth pursuing if it’s helpful and generous. “All the big ideas that made a difference follow this pattern.” Will this small idea transform into something bigger down the road? It could, but first it needs to be pursued.

Weekly Notes #2

Yesterday I put the finishing touches on a new piece (an art song…?) for baritone voice, violin, and cello, which I began writing in December but had been neglecting since the new year. It’s short, not quite 5 minutes long, and rather weird. The text is by me; I won’t vouch for it at all. But I’m honored to be in a program with some great New York-based talent—you can read the press release here.

I contributed an earlier song to the same project in its first iteration in 2019, but this time I chose to replace it with a completely different piece. The project’s theme is immigration: funny, because I’m in my home country for the foreseeable future. But “it is part of morality not to be at home in one’s home,” as Adorno said. At any rate, I’m happy this is done and look forward to a long break from composing.

*

Naturally the bulk of my time is devoted to my new job, exploring ideas for a new project in the creator economy space. I wrote three posts about it this week—fewer than I would have liked. I forget how difficult simply thinking can be—and expressing thoughts without filters, even more so. Hopefully as I get used to writing more frequently, my internal filters won’t be as strong. Above all, I can’t wait to start building.

Startup explorations #8 / Adventures in Twitter

I continue to obsess over this frustrating subject I’ve chosen—audience building—but in the last few days have focused my exploration largely on Twitter. Twitter is my favorite of the big social media sites; I have met many interesting people on it, some of whom have become steady internet friends, though I have never used it in any strategic way. I’ve had several accounts over several years, none of which has ever gained more than a few hundred followers. But it is a fun game to play.

Twitter’s great strength is naturally the tweet: a short post with a specific character limit, which makes the barrier to entry very low. It is like the public square of old; anybody can take part. In theory, this makes it very easy to find ongoing conversations, slip in and out of them, and make connections with like-minded people. But in practice, human nature makes it difficult to build a following this way: no matter the content, people with already large followings will always attract more people than those who don’t. This is my main frustration with using this platform: not so much the platform itself, but those aspects of human nature which it encourages.

Of course, this is the power that a following commands which it makes it so valuable and coveted: it is more than what the word “audience” implies—a passive, faceless group of people to which you need only shout and sell a product. It is a community of people with whom you continually engage and grow. It is a following around yourself, as a person, which potentially can outlive products and companies; an engine that generates demand around your work. For these reasons, some argue that the best way to go about starting a venture is to build an audience first.

Still, the hard part remains: starting from the bottom. A creator who might have valuable things to share might spend a long time shouting into the void, and struggle to find true engagement rather than just followers, as long as their follower count is not high enough—despite the fact that theoretically, all it takes to get an audience is a tweet here and a follow there. I think there will always be an element of unpredictability to this, as with any endeavor centered around people.

But imagine if we could make this a lot easier: how can we get all the thoughtful, interesting, quirky people together who are just starting out on the path to audience building? How can we get these people to find like-minded spirits in similar situations with whom they’ll be more likely to start lasting relationships? The world is a big place: there is room for more communities to be formed—more opportunities to create such communities that don’t just rely on getting noticed by someone famous.

Startup explorations #7 / Creators follow creators

I enjoyed this podcast episode from How I Built This with Guy Raz—an interview with the founders of Patreon, Jack Conte and Sam Yam. I think theirs is a great story not only because I love seeing musicians and artistic types venturing outside of their particular bubbles, but also because it’s a great example of finding a very specific problem and addressing it in such a succinct way that it seems like a no-brainer. In this case, the problem was that creators who already had a sizable following were making very little money on the “traditional” platforms such as itTunes and Youtube. The solution, then, was to give them a better way of getting paid directly by fans through a subscription or patronage model.

As Patreon grew, and more and more creators began to sign up, its limitations became clear. The ones who find most success in the platform are creators who have followings on other platforms and are able to direct them to Patreon, while creators in the early stages of growing their audiences struggle to gain traction. The founders admit this; this is a gap for which Patreon was not designed. How to fill this gap? This is a worthy problem indeed, a good solution to which would allow a greater range of people to join the creator economy—perhaps not as superstars or celebrities, but a “middle class,” which I referred to in my last post.

Conte and Yam themselves give us a clue in the podcast. They describe the early stages of Patreon: how they started with just a handful of artists (including Conte, who is himself a musician), and how they struggled at first to get people to sign up. What eventually did it was artists seeing other artists getting on the platform and getting visible results—a slow process at first, but with compounding effects. Creators follow creators.

Startup explorations #6 / Inching further, and thoughts on a “middle class” of the creator economy

I found this essay by Li Jin very compelling and have been letting it guide my thinking at this “discovery” stage. I believe in it fully—the creator economy does need a middle class. The truth is that not everyone is fit, nor even wants to be, among those in the top 1 or 2 percent of moneymakers or celebrities on the current creator platforms. But that is no reason why there can’t be a larger percentage of these creators who are able to derive a decent income from their audiences. Furthermore, as Jin argues, “Creator platforms flourish when they provide opportunity for anyone to grow and succeed. When the American Dream is just a dream, the fate of platforms becomes precarious.”

The essay outlines several strategies toward creating a more robust middle class of creators among these platforms: focusing on content type with less replay value, better discovery algorithms for new content with an element of randomness, and facilitating collaboration and community, among others. (The rest are well worth considering as well, but these are the ones that have interested me the most so far.)

I’ve been thinking in the last several days about how all of this relates to my own prospective project. In my previous post, I wrote about some of the initial insights I derived from doing several customer discovery interviews: I was very intrigued by the popularity of Instagram among several different content types, and also surprised by the lack of mention of subscription-based platforms such as Patreon. I suspect that for many prospective middle-class creators, the development of a robust following—most easily measured by follower count, which Instagram is very successful at facilitating—is the great hurdle to be surpassed, before they can even think about ways to monetize that following.

From here, we can see how we inch a little closer to a clearer picture of our prospective customers, as well as a more succinct understanding of their problems. I’m interested in those creators or artists who are truly making an effort—as shown by a discernible body of work that can be stored digitally and accessed publicly—who are trying the currently available tools in some combination, but may be stuck somewhere and are not yet getting the results they want. I don’t think any app or tool can directly give anybody a high follower count—but I think the best way to facilitate this is to get these people together somehow and allow them build a community and “pool” followers together. A good “discovery” system, as Jin suggests—an easy way for artists to connect with one another as well as with fans—would be essential to any platform that seeks to serve this customer base.

Building an RSS Reader for Android from nothing #2: Searching for feeds using Feedly’s Search API

Previously, I wrote about the component that handles retrieving and parsing raw RSS feeds from the web. This component represents one of NiceFeed’s main data sources, giving us an actual RSS feed, in the form of interrelated model objects that we’ve defined (Feed, Entry, FeedWithEntries), which the app can then display. All we need to do is give it the URL of any particular RSS feed, and it does all the work.

In real life, nobody’s going to want to keep entering URLs manually; sometimes, a user won’t even know what they are. A respectable RSS reader would have to have some way for the user to search for new feeds. Therefore, we need another data source—this data source would accept a keyword and return to the user a list of RSS feeds from the internet based on that keyword. The user would then able to choose any of these RSS feeds to subscribe to.

Feedly’s public Search API exists for this very purpose. It accepts a string search query as input, with some optional parameters such as the number of desired search results and a specific locale; in return, we get an organized collection of data in the form of JSON. This data, basically a collection of RSS feeds, is organized into fields such as “title,” “website,” “feedId,” “description,” and so on.

To get this data into the app, we pick the fields we want and create a new data class containing relevant properties corresponding to those fields. I named this data class SearchResultItem, which represents one item (containing data from one RSS feed) in a list of search results.

data class SearchResultItem(
    val title: String?,
    @SerializedName("feedId") val id: String?,
    val website: String?,
    val description: String?,
    val updated: String?,
    @SerializedName("visualUrl") val imageUrl: String?
): Serializable

To actually accomplish the task of communicating with Feedly API to obtain the needed data, some housekeeping is needed. I used the Retrofit library to do all the heavy lifting with regard to networking and parsing JSON from Feedly, making it very easy to implement the whole thing. All that’s needed is a simple interface which sends the request to the API, with an annotation that defines the request—in this case @GET, which represents the method for fetching data. The method returns a Call, which represents one HTTP request, with the parameter SearchResult—a class defined solely to contain one or more SearchResultItems—representing the type of a successful response.

interface FeedlyApi {
    @GET
    fun fetchSearchResult(@Url url: String): Call<SearchResult>
}
class SearchResult {
    @SerializedName("results")
    lateinit var items: List<SearchResultItem>
}

And now for the main event. I created a class called FeedSearcher to contain all the methods needed to carry out a Feedly search request. It has one public method: getFeedList, which takes a String query or keyword, and returns a LiveData wrapping a list of SearchResultItems.

/*  Generates a search query and returns a list of results from Feedly */
class FeedSearcher(private val networkMonitor: NetworkMonitor) {

    private val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    private val feedlyApi = retrofit.create(FeedlyApi::class.java)

    fun getFeedList(query: String): LiveData<List<SearchResultItem>> {
        return if (networkMonitor.isOnline) {
            val path = generatePath(query)
            val request: Call<SearchResult> = feedlyApi.fetchSearchResult(path)
            fetchSearchResult(request)
        } else {
            MutableLiveData(emptyList())
        }
    }

    private fun generatePath(query: String): String {
        return Uri.Builder()
            .path("v3/search/feeds")
            .appendQueryParameter("count", RESULTS_COUNT.toString())
            .appendQueryParameter("query", URLEncoder.encode(query, "UTF-8"))
            .build()
            .toString()
    }

    private fun fetchSearchResult(
        request: Call<SearchResult>
    ): MutableLiveData<List<SearchResultItem>> {
        val searchResultLiveData = MutableLiveData<List<SearchResultItem>>()
        val callback = object : Callback<SearchResult> {
            override fun onFailure(call: Call<SearchResult>, t: Throwable) {} // Do nothing

            override fun onResponse(
                call: Call<SearchResult>,
                response: Response<SearchResult>
            ) {
                val feedSearchResult = response.body()
                searchResultLiveData.value = feedSearchResult?.items ?: emptyList()
            }
        }

        request.enqueue(callback)
        return searchResultLiveData
    }

    companion object {
        private const val RESULTS_COUNT = 100
        private const val BASE_URL = "https://cloud.feedly.com/"
    }
}

There are several things going on here. First we need a Retrofit object with a base URL of “https://cloud.feedly.com/” to be able to do anything—it accepts the above FeedlyApi interface, and uses it to create a request. To the request itself, we pass a String path to make a complete search URL on top of the base URL; the private method generatePath accepts our String query and returns it in the form (which includes a specified number of search results, in this case 100) that the Feedly search engine expects.

Finally, within the private method fetchSearchResult, the request object is enqueued, which actually executes the HTTP request. The method immediately returns a LiveData to the previous method that called it. We also pass in a callback object that defines what should happen after a request completes successfully or unsuccessfully. In this case, upon a successful request, the aforementioned LiveData is updated with the response—a list of SearchResultItems. And thanks to the attached GsonConverterFactory, Retrofit automatically does the work of parsing the response body from JSON.

Like our first data source, FeedParser, FeedSearcher is also self-contained so that we can completely replace it with something else without affecting anything else in the app, although Feedly’s search engine works perfectly for my purposes. The most important thing it gives us is a collection of usable RSS feed URLS—any of these URLS can then be passed on to FeedParser to attempt to retrieve an actual RSS feed.

Weekly Notes #1

I’m going to start these weekly notes at the end of every week as a way to pump a little more life into this site. While I have many amateur writing projects in the back burner that I’d like to dump here, it’s just not a priority right now—but I can at least try to post a little more consistently. No high literary ambitions here, etc., etc.

Two weeks ago I started a new job with a venture/startup studio based in Singapore, which I’m doing all from the comfort of home. The business model is fascinating to me: a company that builds other companies in succession. Officially I’m a mobile app developer, but I’m also getting a crash course in business and entrepreneurship. I’m writing a blog about what I’m doing—I’ll be spending much more time over there than here in the coming months.

*

Recent news out of the US has got me thinking about a few different things—not really the events themselves, but the unnatural extent to which I’m constantly bombarded with American media while I’m all the way out here. And then there is the dirty business of forming opinions based on the news, coupled with a disturbing tendency toward totalizing (and in my opinion, unearned) moral language that seems to be becoming more in vogue… Maybe a post for another day.

*

I’ve decided that my resolution for 2021 is focus. Between my new job, having to learn many new things on the fly, coding in the evenings, writing these blogs posts, music (right now the least of my concerns), I feel as if I’m committed to too many things. But this is a “pandemic pivot,” a period of discovery—my goal in the next few months is to uncover the things that are truly important, and free myself of the rest.