• Do Everyone's Job First

    At an early stage startup (less than 10 people), it’s a big advantage to do everyone’s job first. That doesn’t mean you don’t scale or hire other people, but doing their job first gives the most understanding about what the job actually entails and the knowledge of how it works.

    Being a founder, this can feel daunting. What do I know about customer success? I’ve never had to answer support tickets, how do I do that? And so on.

    This is the source of the advantage because everything fits into your head. You can make fast decisions. You can learn who would be successful when hiring someone to do this job in the future. You can understand more fully how your business works, what the problems are, and what to do about it.

    You will never have this pace of knowledge growth again.

    See also:


  • Using Tools for Thought as a Founder

    This is a reflection on using org-roam as a founder in the early stages of starting a company. It’s mostly a draft that I may or may not come back to.


    What I’m trying to do generally is have better quality thoughts. I want to answer questions and reason about the clearly.

    I’ve found that writing is thinking and drawing from a wide pool leads to creativity.

    Taking notes and linking them together (the vast majority of the utility from these tools for thought are just these two things) provides heterarchies that are, in practice, very useful. It helps me digest vast amounts of disparate information. It helps me find several through lines that can change over time. I can separate out the situation from “what’s going on here?”. It’s just enough distance to help me think less narrowly.

    Is it practical? It’s a lot of work and it’s easy to dismiss the effort as impractical or a distraction. Turns out, I really do reference these notes and look at them often.

    I don’t have “conversations” with my notes, but I often consult them and reference them. The most common reason is when I’m recalling some information or idea with someone else that comes up in a conversation. I realize I’ve had this thought (or something like it) before and go to my public notes, search, and share.

    The single best hack for looking at notes again was adding a “random note” button to my published notes. When I’m bored, I click around and let myself wander previous ideas and thoughts. It also keeps the quality up—I’m more likely to go back and fix/update something I wrote if I see it again.

    I don’t write more essays or blog posts. My interests are wide but focus is narrow. While I admire pundits with wide ranging essays such as Noahpinion, Matt Clancy, Bryce, and Slate Star Codex, my focus—the majority of the day (and night)—is on building a business. The way I take notes and what I do with them is heavily influenced by this focus and motivation.

    I use my notes to write internal memos and product briefs. Mostly when thinking about strategy, the market, and sharing past insights about product, engineering, and sales.

    I also use my notes to give advice and answer questions from others. If someone asks me about raising a seed round as a solo-founder or finding the first 10 users I’ve written many notes to draw from.

    What else?

    Tools for thought are single-player but at least this single-player is better prepared with more clear thoughts to share.

    Better thoughts lead to better leadership. When I’ve clarified my thinking it tends to be very solid. Conviction and confidence (or maybe just a well considered approach) are important for others who are taking a risk by working with you. Nobody want to sit through a meeting where a leader is thinking out loud and confusing everyone.


  • Simple Dot Com Domain Names Are a Multiplier

    The venerable .com TLD and a single word domain are a multiplier that improves nearly every interaction with your business. Establishing trust when someone sends a link (avoiding “this looks like spam”). Communicating your domain name to someone over the phone (try saying ‘dot S O’ to someone who can barely hear you on a land line). Interoperating with old legacy systems (some forms just don’t accept all TLDs). Signaling status to potential customers and employees (“they have the dot com they must be doing well”). Finally, it’s easier to remember off hand since you only need to recall the name not the name plus the TLD.

    These micro interactions with your business add up over time. The easier to find you and establish trust, the better your business will be.

    Is it worth millions of dollars for a domain name? I’m still doubtful. Paired with the right branding, maybe. Just keep in mind we’ve had Google for decades now and nobody searches by typing in `{name of thing I want}.com` into their browser anymore (yes, people actually used to do this).

    See also:


  • Adapting to Endure - Sequoia Capital

    Sequoia Capital is the latest big name VC to warn founders about uncertainty in venture capital due to inflation and geopolitical turmoil. Slides here.

    The cost of capital has gone up, valuations in public markets have gone down and are paying less for growth, the impact of these shocks will have second order and third order effects (like housing prices up 60+%).

    In the short term, profitability is favored to growth in a downturn. While the Nasdaq is down, Morgan Stanley’s unprofitable tech index is down 64%. In the mid to long term, durable growth is best—improving margins and growth.

    The drop in the market is steep and recovery takes a long time.

    Be quick to cut expenses to avoid a death spiral. “In 2008 all companies that cut were efficient and better.” It’s not about being the strongest, but being the most adaptable.

    There’s an opportunity in a down turn. FAANG companies all have a hiring freeze. Your competitors may not adapt and end up in a death spiral.


  • How Long Will a Recession Last?

    We are probably in a recession already, but we can’t know for sure for another quarter or so. With inflation on the rise and interest-rate hikes making less money available, it will be some time before things grow again.

    In a blog post, Fred Wilson estimates it will be another 18 months before we see any improvement. Key indicators will be a bottoming out of public stock valuations before rising again (e.g. 1980 recession took 3 years to see stocks rebound).

    Elad Gil says, “The most likely scenario is 2023 will be a much tougher environment for startups than 2022” in Changing times (or, why is every layoff 10-15%?).

    See also:


  • Cookies Set on a Public Suffix Domain Are Considered Cross-Origin

    Setting a cookie doesn’t always have the same behavior. If you set a cookie on a domain listed in the public suffix list using SameSite=strict, it will get blocked by CORS even if they request and the cookie are coming from the same domain.

    This makes sense for certain domains that are primarily used to host the sites of multiple users like compute.amazonaws.com for AWS resources or githubpreview.dev which serves preview for GitHub Codespaces. You wouldn’t want a different user hosted on the same domain to be able to set cookies for your users' site because that would be a security issue.

    A workaround is to use SameSite=none and the prerequisite Secure attribute to set the cookie, but this effectively allows cross site cookies which requires other security measures to lock down.

    See also:


  • Running Docker Compose in Codespaces

    Using the built-in docker-compose configuration in GitHub Codespaces is limited. It’s better to run docker-compose inside the Codespace but this requires a docker-in-docker setup which is finicky.

    Here’s how to use docker-compose from Codespaces so that everything is set up when the codespace is created.

    In .devcontainer/devcontainer.json:

    {
        "name": "My Space",
        // The dockerfile will be at te root of the project
        "build": {"dockerfile": "../Dockerfile"},
        // Your code path from the .devcontainer directory
        "workspaceFolder": "../app",
        // List of ports that you want to preview
        "forwardPorts": [1234, 5678],
        // Script to run to bootstrap the app when the space is created
        "postCreateCommand": ". ../path_to_setup_script.sh",
        // Automatically start the app in subsequent sessions
        "postStartCommand": "cd app && docker-compose start",
        // Privileged flag is needed to run docker-in-docker, the volume
        // is needed or docker build will fail
        "runArgs": ["--volume=/var/lib/docker", "--privileged"],
        "postCreateCommand": ". /app/scripts/codespaces.sh"
    }
    

    In DockerFile at the root of the project:

    FROM alpine:3.15.4
    
    RUN apk update
    RUN apk add --no-cache git
    RUN apk add --no-cache docker-engine
    RUN apk add --no-cache docker-cli
    RUN apk add --no-cache docker-compose
    
    ADD ./app /app
    
    EXPOSE 8000
    EXPOSE 35729
    EXPOSE 3000
    EXPOSE 1313
    

    In your setup script:

    # Assumes docker-compose.yaml is at the root /app root
    cd app
    # This setup script depends on running some code in other containers
    dockerd &
    # Ugh yes there's no nice way to wait until dockerd is ready
    sleep 5
    # Do whatever setup you need
    docker-compose up -d
    docker-compose exec {some command to run migrations etc}
    # If you need to use docker for this setup script you must stop all containers
    # otherwise, any servers running in docker will not have their ports
    # forwarded properly by codespaces.
    docker-compose stop
    

    See also:


  • Codespaces Doesn't Allow Requests Across Ports From a Preview

    At time of writing, a CORS error will occur if the web application served in a GitHub preview URL attempts to make a fetch request to a different port. Specifically, it the preflight OPTION request receive a 302 HTTP status code and fail with Redirect is not allowed for a preflight request.

    Forwarding ports in a Codespace will generate a different URL for each port. For example, opening port 8000 will have a preview URL of {codespace name}-{port}.githubpreview.dev. That means, if you have your frontend and backend servers on different ports, it won’t work.

    The workaround is to change the port from private (the default) to public. Annoyingly, there is no way to configure that a port be made public in the devcontainer.json so it needs to be set each time a codespace is created. The other way around is to add a reverse proxy to put both frontend and backend server on the same port, but that may not match what is in your production setup.

    See also:


  • Get Started With Growth Marketing

    Growth marketing is simple to get started. Sell the product directly to 10 paying customers. Review the sales process with those customers and identify an ideal customer profile and their “aha” moment—preferring customers with low friction and grow organically. Experiment with automated ways to acquire the next 100 customers from that profile. Once you’ve built a playbook that works repeatedly, move on to the next cohort.

    When you sell the product directly you’re getting immediate feedback on what’s working and you can iterate on the messaging (and product) much faster. If they’re not buying then something isn’t working. If you can sell 10 times you start to get clarity on the right people to talk to and their “aha” moment that crystallizes the value of what you are selling.

    Choosing a single ideal customer profile focuses your efforts in finding the next 100 customers. If your profile encompasses too many use cases and kinds of buyers, it will make it harder to find repeatable ways to find them.

    Experimenting with different ways to identify potential customers that match the ideal customer profile and reach them is important for error correction. Using automation is a key constraint otherwise you won’t be able to reach enough people to make the next 100 sales (not everyone you talk to will be interested or respond at all).

    If you find a repeatable playbook then great, keep running it while you work on the next customer profile and repeat the cycle.

    Based on my conversation with Jesus Requena, VP of Growth at Figma.

    See also:


  • An Anti-Universe Could Explain Dark Matter

    One of the issues with the big bang theory and observations of the cosmos is that there ought to be more stuff. The presence of dark matter must be there because we can measure its effects via gravitational waves. A possible explanation for why dark matter exists at all is that there is an anti-universe—the same as “our” universe but with neutrinos spinning the opposite way and time going backwards. If that’s true, it would be expanding in the opposite direction as the big bang.

    See also:


  • The Sinn U50 Is a Time Fortress

    I bought the Sinn u50 automatic watch in February 2022 and have worn it every day since.

    What I was looking for was simple—a way to tell the time and date that doesn’t constantly send me notifications or need to be charged. I want to admire the analog engineering of an automatic mechanical watch. I want it to look good for the kind of lifestyle I have—casual, functional, understated, and maybe ready for adventure.

    The Sinn u50 ticks the boxes and appeals to me in a way that no other watch has yet. It looks really good and I enjoy looking at it every day.

    It’s so totally overbuilt in a way that I can appreciate. It’s a time fortress sitting on your wrist that is reassuring. The Sinn u50 makes you feel a little bit invincible.

    Three-month review

    After three months, what do I think of the Sinn u50? I still get excited to wear it and it’s held up as advertised—not a single scratch so far. Now that I’ve adjusted the bracelet, it’s very comfortable and I forget that it’s on my wrist. I even wear it overnight so I can check the time when I wake up in the middle of the night.

    I see much more clearly how brutalist the design is. It’s so dull (bead-blasted matte finish) and the steel is a darker gray that somehow makes it even less conspicuous. I can see the need for having a dressier watch especially after going to a fancy event and deciding not to wear Sinn u50.

    Six-month review

    The Sinn u50 has been on my wrist continuously for about 6 months now. Still no wear, no scratches, and it looks brand new.

    At this point, I’ve purchased a few straps to try out from Nick Mankey Designs. This is a nice change of pace from the metal bracelet and extremely comfortable. I’ll probably keep playing around with new straps to keep things interesting.

    I did a little bit of traveling with it. I went to New York City, explored the Oberland of Switzerland, and went to Hawaii. The Sinn u50 felt out of place only a handful of times at a fancy dinner or wedding. In Hawaii, it was great to not worry about it in the water and heat.

    The design still feels great to me. Very unique but understated. Doesn’t work in every situation but most. I am starting to eye the Explorer I after trying it on in Switzerland so we’ll see if that starts to change my opinions.

    Twelve-month review

    Now that I’ve had the Sinn u50 for a year and I’ve worn it almost every day since getting it. Everything I wrote earlier is still true—I love the design, there are still no visible signs of wear, and I’ve taken it with me just about everywhere.

    So what’s different? In September, I received the Cartier Tank Must as a gift. The two watches complement each other perfectly. The Cartier Tank is the exact opposite of the Sinn u50—elegant, classic design, white dial, square case, and compact. The pairing addresses one of the few issues I have with the Sinn u50, it doesn’t fit well in situations that require a dress watch.

    My taste in watches has not changed much, despite visiting the Phillipe Patek Museum in Geneva, Switzerland. After a year on the wrist, I still think the Sinn u50 is going to be a classic it it’s own right—unapologetic in its modern design and rooted in utility.