A large-scale survey of 12,000 people found that remote work increases employee happiness by as much as 20%
Read Remote Work is Linked to Happiness: Study of 12,455 Respondents.
A large-scale survey of 12,000 people found that remote work increases employee happiness by as much as 20% Read Remote Work is Linked to Happiness: Study of 12,455 Respondents.
Startups are a microcosm of the economy and we can observe that things are changing quickly towards a recession footing. The effects of inflation on valuations are readily apparent, but we also see that things were too good to be true and investors and late stage companies exploited it. Everyone looks like a genius when things are going well, but as it turns out, that wasn’t very durable. How should we think about running a startup during a recession? See also:
As inflation rises there will be a tightening of money supply and higher interest rates to control it. This causes a repricing of assets and, in particular, high-growth tech stocks. The median public company software valuations dropped from 12x forward revenue to 5x or less—an almost 60% decline. The decline of public company valuations creates downward pressure on startup valuations. A startup whose valuation was 100x forward revenue (ARR) should expect that to be brought down significantly closer to their comparable public company valuations with a slight premium for faster growth (more like 10-15x). This has big implications for running a startup during a recession. Availability of capital will go down as VCs make fewer deals, more selectively, and with lower valuations. Many companies will run out of cash and fail to raise additional rounds of financing. YCombinator recommends founders cut expenses and plan for 24 months without additional fundraising.
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:
St. Pierre’s Cathedral in Geneva is built on top of another church which is built on yet another church going back hundreds of years. At the center, at the lowest layer, is a grave that is believed to be an chieftain from the original settlers of the area. They built the original church around this grave and the city of Geneva grew around it.
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 This makes sense for certain domains that are primarily used to host the sites of multiple users like A workaround is to use See also:SameSite=strict
, it will get blocked by CORS
even if they request and the cookie are coming from the same domain.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.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.
SameSite
is important to prevent cross site request forgery (CSRF) attacks
Using the built-in Here’s how to use In In In your setup script: See also: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.docker-compose
from Codespaces so that everything is set up when the codespace is created..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"
}
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
# 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
githubpreview.dev
is on the public suffix list
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 Forwarding ports in a Codespace will generate a different URL for each port. For example, opening port 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 See also:OPTION
request receive a 302
HTTP status code and fail with Redirect is not allowed for a preflight request
.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.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.
The fact that humans exist with the capacity to observe and theorize about the universe is the explanation for the universe being the way that it is. The physics that creates the preconditions for intelligent life means that intelligent life could only ever observe this kind of universe. If other universes don’t support intelligent life, they will have different physics from our universe and, potentially, our physics is universal to intelligent life. From The Beginning of Infinity and A Brief History of Time. See also:
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:
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:
A sentence that, upon closer inspection, has no real meaning.
The theory of relativity shows that time is not a constant, but a relative measurement to the observer. For example, it’s long been established that clocks running further away from the Earth’s gravity run slightly slower than those on the surface when they are compared. See also:
According to the Q1 2022 survey by Ladders, 24% of all job posting in the US and Canada are now for permanent remote positions—an increase from 18% in Q4 2021 or roughly 3MM jobs. This is mostly led by fields in technology but similar trends are happening everywhere. For example, software development job postings went from 2.9% remote in Q1 2020 to 33.44% in Q1 2022. See also:
Using license-finder by GitLab makes it easy to list all open source licenses from dependencies of your codebase. What’s nice is that it uses a docker image so it’s easy to run in any environment with no setup. In the directory to scan, run: docker run \
–volume “$PWD”:/code \
–env=LM_REPORT_VERSION=“2.1” \
–env=CI_PROJECT_DIR=/code \
registry.gitlab.com/gitlab-org/security-products/analyzers/license-finder:latest
Employment and tax compliance is not static. Requirements change because of new laws, hiring in a new state, employees relocating, or when government agencies tell you they’ve changed—UI rate changes, notifications and enforcements. Companies change too as headcount grows, revenue increases in more places, and what they are registered in each jurisdiction. Since compliance is constantly changing, businesses need to answer “what do I need to do to be compliant?” continuously. Compliance is really a workflow, one that never stops over the course of doing business. See also:
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. 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. 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. 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.Three-month review
Six-month review
Twelve-month review
There is not a great way to dynamically fill the vertical space in a parent element in CSS without setting a fixed height. To do this in For example:React
using flexbox
, you need to get a reference to the parent element and calculate the height using a callback hook.const [interiorHeight, setInteriorHeight] = useState<number>(0);
const measuredRef = useCallback((node) => {
// Before the component mounts the node ref will be null
if (node !== null) {
setInteriorHeight(
node.current.getBoundingClientRect().height
);
}
}, []);
return (
<div ref={measuredRef} className="p-6 pt-10">
<div className="flex items-center" style={{height: `${interiorHeight}px`}}>
I'm {interiorHeight} pixels tall!
</div>
</div>
)
The March WFH Research survey results show that 54% of unemployed respondents are either exclusively looking for jobs that allow them to work from home or prefer jobs that allow them to work from home. This presents a large opportunity for employers who are hiring remotely to attract more talent. See also:
The way I write more is by doing it every day. I write first thing in the morning (journaling and note taking) and publishing my notes (like this one). For work, I write product briefs to clarify the situation, my interpretation of the facts, and what we should do about it. I write memos for the team for anything important. I write investor updates. I do it without thinking—even when drafting a tricky email I’ll write it out to understand what I’m trying to do. Taking an interest in good writing helps. Being curious about what makes for good communication, reading about writing, and trying out new things to try and communicate more clearly. To cultivate that, I recommend The Pyramid Principle by Barbara Minto which is the best business writing book and reading about knowledge creation with The Beginning of Infinity by David Deutsch. Using tools you enjoy gives something to look forward to while building up a writing habit. For example, a fountain pen, a nice notebook, a mechanical keyboard, beautifying your favorite text editor, or generally improving the ‘hand feel’. See also:
When it comes to raising money, being a solo founder goes against the grain. Many investors figure it’s safer to invest in founders that come in pairs. (Possibly because of this essay from Paul Graham) It makes some sense if you think about it. Founder drama happens and if there are multiple co-founders the company goes on, if it’s a solo-founder and they leave—game over. The good news is that fundraising as a solo founder stops being a problem after raising the seed round. The bad news is that you have to be able to raise the seed round in the first place. Fundraising is always hard despite what people might tell you. Ignore anyone who hasn’t recently raised money for their own startup. The way to mitigate the challenges of raising solo is to 1) have all of the skills needed to lead the company (if you’re building a software product that means being an engineer and/or product leader) 2) have unique knowledge about the market problem you are going to solve (maybe by having built something related before) 3) increase the positive signal around you (e.g. coming out of a high-profile company, exited a previous startup, have a large following) and 4) already have the relationships with investors so they know you before you raise money. See also:
One of the reasons making broad, sweeping predictions about the future tend to be wrong is that it does not account for the creation of new knowledge. Trends are not explanations and without an explanatory model of how knowledge will change (i.e. creativity) predictions such as the end of the world are just another example of a Malthusian catastrophe. That doesn’t mean they are not useful. In the case of climate change, we should not assume success is guaranteed simply and predictions based on current trends is useful if only to lay out the possible scenarios. However, trying to know the unknowable leads to pessimism in policy (e.g. consumption reduction) rather than optimism (e.g. investing in renewable energy research). See also:
According to Betteridge’s Law pretty much any headline that is posed as a question is usually going to be answered with a ‘no’ in the body. I’ve found this to be pretty much always the case to the point where it’s funny that it’s even used in news writing.
Three things lead me to believe that websites will soon become an heirloom passed down generation to generation: 1) the ubiquity of the web generally (which is still only 59% of the world’s population) 2) the scarcity of web domains 3) the value of search engine ranking. Similar to passing down a piece of jewelry that has both sentimental value and actual wealth attached to it, an old domain that is well established in existing search indices would increase in value over time. The next generation would see the previous generation’s toil and old technology as something to be restored and preserved while adding to it. See also: