<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Matthew Tse]]></title><description><![CDATA[internet musings, mostly about programming and entrepreneurship]]></description><link>https://substack.matthewtse.com</link><image><url>https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png</url><title>Matthew Tse</title><link>https://substack.matthewtse.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 07 May 2026 03:44:40 GMT</lastBuildDate><atom:link href="https://substack.matthewtse.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Matthew Tse]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[matthewtse@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[matthewtse@substack.com]]></itunes:email><itunes:name><![CDATA[Matthew Tse]]></itunes:name></itunes:owner><itunes:author><![CDATA[Matthew Tse]]></itunes:author><googleplay:owner><![CDATA[matthewtse@substack.com]]></googleplay:owner><googleplay:email><![CDATA[matthewtse@substack.com]]></googleplay:email><googleplay:author><![CDATA[Matthew Tse]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Fixing Cmd+V Pasted Images in Claude Code]]></title><description><![CDATA[Do you get annoyed you need to remember to Ctrl+V for images pasted into Claude Code?]]></description><link>https://substack.matthewtse.com/p/fixing-cmdv-pasted-images-in-claude</link><guid isPermaLink="false">https://substack.matthewtse.com/p/fixing-cmdv-pasted-images-in-claude</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Sun, 26 Apr 2026 04:51:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>EDIT</strong>: I abandoned my script in favor of Andy Tran&#8217;s <a href="https://x.com/andyhtran_/status/2049276642468471146">CopyCat</a>!</h3><h3>Problem</h3><p>I use Claude Code in terminal all day. This drives me crazy: I take a screenshot, switch to terminal, hit <strong>Cmd+V</strong> &#8212; and <em>nothing happens</em>.</p><p>Cmd+V into terminal doesn&#8217;t paste images on macOS, because <em>reasons</em>. Claude Code offers Ctrl+V as a workaround, my muscle memory is Cmd+V, and I&#8217;d rather not retrain a thirty-year-old reflex.</p><h3>Options</h3><p><a href="https://karabiner-elements.pqrs.org/">Karabiner-Elements</a> can rebind Cmd+V to run a shell script when iTerm is frontmost. I tried vibe coding it. It didn&#8217;t work, too many layers of weird interactions.</p><p><a href="https://github.com/hqhq1025/clipaste">clipaste</a>, someone else built something similar, but it was designed to allow pasting images over tmux with an SSH remote tunnel&#8212;too much extra complexity for me.</p><p>Building a custom Swift app is a bit too much hassle.</p><h3>The Solution</h3><p><a href="https://www.hammerspoon.org/">Hammerspoon</a> turned out to be the sweet spot. One config file, one permission, one process. The eventtap API is the documented way to intercept keystrokes conditionally on the frontmost app. The system clipboard is never touched. The whole thing fits in 30 lines:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;07723630-3d4d-4171-a606-860b586e08dc&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">local ITERM_BUNDLE = "com.googlecode.iterm2"
local CACHE_DIR = os.getenv("HOME") .. "/.cache/iterm-paste-fix"
hs.fs.mkdir(CACHE_DIR)

local cmdV = hs.eventtap.new({ hs.eventtap.event.types.keyDown }, function(event)
local flags = event:getFlags()
local isCmdV = event:getKeyCode() == hs.keycodes.map["v"] and flags.cmd and not flags.alt and not flags.ctrl and not flags.shift
if not isCmdV then return false end

local app = hs.application.frontmostApplication()
if not app or app:bundleID() ~= ITERM_BUNDLE then return false end

local image = hs.pasteboard.readImage()
if not image then return false end

local path = string.format("%s/screenshot-%s.png", CACHE_DIR, os.date("%Y%m%d-%H%M%S"))
if not image:saveToFile(path) then return false end

hs.eventtap.keyStrokes(path)
return true
end)

cmdV:start()</code></pre></div><p>Cmd+V in terminal: if the clipboard is an image, save it as a PNG and type the path. Otherwise, pass through. In any other app, <em>untouched</em>. In iTerm with a text clipboard, untouched. Claude Code sees the path and reads it as an image attachment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b72S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b72S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 424w, https://substackcdn.com/image/fetch/$s_!b72S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 848w, https://substackcdn.com/image/fetch/$s_!b72S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 1272w, https://substackcdn.com/image/fetch/$s_!b72S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b72S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png" width="880" height="286" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:286,&quot;width&quot;:880,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49588,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.matthewtse.com/i/195497587?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b72S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 424w, https://substackcdn.com/image/fetch/$s_!b72S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 848w, https://substackcdn.com/image/fetch/$s_!b72S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 1272w, https://substackcdn.com/image/fetch/$s_!b72S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F507ba74d-c52e-4b9c-858e-57c0facce4ad_880x286.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Honestly, the right place for this is inside Claude Code itself. There are at least five GitHub issues asking for it; the most active one, <a href="https://github.com/anthropics/claude-code/issues/2102">#2102</a>, has been open for months. I&#8217;m not holding my breath for Anthropic to fix this, so for now, this Lua snippet is doing the job.</p><p>I <em>really love</em> how Claude Code lets me easily write customization layers on top of existing apps. I&#8217;m a super picky computer user, and it always killed me begging software maintainers to write the thing I need.</p><p>The full setup lives in my <a href="https://github.com/m-tse/codex/tree/master/mac/hammerspoon">repo</a>.</p>]]></content:encoded></item><item><title><![CDATA[My Secrets For Hiring Offshore Tech Talent]]></title><description><![CDATA[Typical tech screening doesn't work, here's what does]]></description><link>https://substack.matthewtse.com/p/my-secrets-for-hiring-offshore-tech</link><guid isPermaLink="false">https://substack.matthewtse.com/p/my-secrets-for-hiring-offshore-tech</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Fri, 17 Apr 2026 06:24:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="http://improvmx.com">ImprovMX</a> is not some fast-growing VC startup, so we have to be lean with our hires and salaries. Offshore tech talent promises <em>great value</em>, but finding <em>good talent</em> is the difficulty. There doesn&#8217;t seem to be much content about this, because otherwise I wouldn&#8217;t have had to make all the mistakes I&#8217;m going to talk about:</p><h2>Throw out the resume</h2><p>Nobody has a &#8220;good&#8221; resume in these locales. Nobody&#8217;s worked for any company you&#8217;ve ever heard of. Honestly, my best devs had zero professional coding experience. Anywhere they may have worked for probably had terrible coding standards, and coding is completely different with AI anyway. So you&#8217;re better off finding someone who has high potential to be trained.</p><h2>Typing speed is such a cheat code</h2><p><em><strong>Best signal I&#8217;ve found by far</strong></em>. Not my idea, I got it from <a href="https://x.com/sweatystartup">Nick Huber</a> on some podcast.</p><p>Your typing speed naturally gets <strong>wayyyyy</strong> faster if you&#8217;re doing lots of real computer work and you&#8217;re an internet native &#8212; because you want to transmit thoughts to the machine faster. This is basically a 100% linear correlation with productivity for these remote tech roles.</p><p>My top dev and I both hit 120wpm cold, 160+ when trying. I&#8217;m experimenting with a hard 60wpm cutoff, and 80wpm for a full developer.</p><p>On the Zoom call, watch their eyes. If they dart between keyboard and screen, they&#8217;re hunt-and-pecking &#8212; not a computer native, no matter what they say.</p><h2>Tech literacy</h2><p>Ask them to share their screen for the typing test (I like <a href="https://monkeytype.com/">monkeytype.com</a>). If they struggle to find the &#8220;share screen&#8221; button, they&#8217;ll struggle with every SaaS tool you give them: Slack, Linear, GitHub, Claude Code, etc.</p><h2>Hire young (under 30)</h2><p>People in these countries got computers later than Americans. A 30-something American probably had a PC as a kid; a 30-something elsewhere may not have gotten one until their twenties. That&#8217;s a decade+ of technical experience that translates purely to productivity.</p><h2>English proficiency</h2><p>Accent is fine. Grammar and fluency aren&#8217;t. Consistent bad grammar or a struggle to express themselves means you&#8217;ll have trouble communicating work to them, and they&#8217;ll have trouble communicating back. Compounds horribly on a remote team.</p><h2>Look for Hunger</h2><p>Two types of candidates: &#8220;just looking for a remote job,&#8221; and <em><strong>hungry</strong></em> &#8212; genuinely excited at a chance to work for a Western company, chomping at the bit to learn and prove themselves.</p><p>Find the second type. You&#8217;ll feel it in the first 5 minutes of a call. And you&#8217;ll continue feeling it, or the lack of it for the rest of their time at your company.</p><h2>Geography</h2><p>You want a sweet spot in the country&#8217;s economic development. Too developed and the high labor costs and laziness will bite you. But too underdeveloped, and there won&#8217;t be good tech infrastructure for employees to be good at technology, and some of these hires will be too mercenary due to their environment being too harsh.</p><p><strong>Eastern Europe</strong> is the best region I&#8217;ve found so far. Strong tech education and fundamentals, decent English, good work ethic, reasonable time zone overlap with the US.</p><ul><li><p>I&#8217;m experimenting with <strong>Latin/South America</strong> too. </p></li></ul><ul><li><p><strong>South Africa</strong> has good English and work ethic for finance, accounting, sales, but I&#8217;ve not found technical talent density.</p></li><li><p>Open to trying some <strong>Southeast Asian</strong> countries like Vietnam, Thailand, but we&#8217;ll see. <strong>East Asian</strong> is probably too expensive. While <strong>South Asian</strong> seems too underdeveloped.</p></li><li><p>Don&#8217;t touch <strong>North America/Western Europe</strong> with a ten foot pole&#8212;lazy, expensive, lots of labor compliance, I say this as an American :)</p></li></ul><h2>Just use a recruitment agency</h2><p>~20% of first-year salary. I paid it for my first hire, that went great. I tried to save the fee for my 2nd hire and regretted it so hard &#8212; posting on all the boards, sifting hundreds of resumes, scheduling interviews, running typing tests. Not worth my time at all.</p><p>Happy to give a rec if you want &#8212; email me at <a href="mailto:matthew@improvmx.com">matthew@improvmx.com</a>.</p><p></p><p>All of the above criteria, I&#8217;ve come to from making the mistake myself once, i.e. I hired someone who didn&#8217;t type that fast, someone with only okay grammar, or someone older, etc. and in each case it was a huge waste of time and money, and worst of all, I had to deal with the emotional toil of letting someone go for a mistake I made (hiring incorrectly).</p><p>Don&#8217;t make my mistakes!</p><p>Thanks for reading! Got your own offshore hiring war stories? Comment below or hit me up.</p>]]></content:encoded></item><item><title><![CDATA[saas.unbound podcast appearance]]></title><description><![CDATA[Didn&#8217;t realize this got posted way back, watching it myself for the first time now!]]></description><link>https://substack.matthewtse.com/p/saasunbound-podcast-appearance</link><guid isPermaLink="false">https://substack.matthewtse.com/p/saasunbound-podcast-appearance</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Mon, 26 Jan 2026 16:35:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/WNK3o0jaEZA" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Didn&#8217;t realize this got posted way back, watching it myself for the first time now!</p><div id="youtube2-WNK3o0jaEZA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;WNK3o0jaEZA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/WNK3o0jaEZA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Another Podcast Appearance]]></title><description><![CDATA[with Jared of Buying Online Businesses]]></description><link>https://substack.matthewtse.com/p/another-podcast-appearance</link><guid isPermaLink="false">https://substack.matthewtse.com/p/another-podcast-appearance</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Thu, 04 Sep 2025 03:27:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/O4SEKOmAwaU" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-O4SEKOmAwaU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;O4SEKOmAwaU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/O4SEKOmAwaU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>It was something special getting on air with Jared, because I had actually closely watched one of his episodes when I was contemplating getting into the acquisition entrepreneurship space.</p><p>Watch the episode to dive deep into:</p><ul><li><p>How many businesses do you <em>really</em> need to analyze before finding &#8220;the one&#8221;</p></li><li><p>The critical mindset shifts that help you push through failed deals and land a winner</p></li><li><p>Why chasing small, cheap businesses can actually cost you more in the long run</p></li><li><p>The price range I now recommend for friends looking to buy online</p></li><li><p>Top growth levers for scaling SaaS&#8212;starting with retention before expansion</p></li></ul><p>See more of his content <a href="https://buyingonlinebusinesses.com/ep-339-the-journey-of-buying-a-saas-business-online-to-replace-your-income-with-matthew-tse/">here</a>. </p>]]></content:encoded></item><item><title><![CDATA[Podcast Appearance: ]]></title><description><![CDATA[An unfiltered take on the journey to acquire ImprovMX]]></description><link>https://substack.matthewtse.com/p/podcast-appearance</link><guid isPermaLink="false">https://substack.matthewtse.com/p/podcast-appearance</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Thu, 03 Apr 2025 20:03:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/iP_YLGGX8co" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-iP_YLGGX8co" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;iP_YLGGX8co&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/iP_YLGGX8co?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Wow it was so much fun going on this podcast with Brady @ Churnkey. The thing most surprising thing was how easy and utterly unscripted podcasts are. It&#8217;s really just recording cool conversations between people, and what comes out is so genuine and authentic.</p><p>Hope to hop on more of these in the future!</p>]]></content:encoded></item><item><title><![CDATA[MicroConf: The Conference for Misfits]]></title><description><![CDATA[Why this was the best conference I've ever attended in my life.]]></description><link>https://substack.matthewtse.com/p/microconf-the-conference-for-misfits</link><guid isPermaLink="false">https://substack.matthewtse.com/p/microconf-the-conference-for-misfits</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Thu, 20 Mar 2025 05:02:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Just flew back from <a href="https://microconf.com/americas">Microconf 2025</a> in New Orleans, Louisiana. I'm still smiling from how satisfying the last few days were. It was, by an order of magnitude, the best conference I've ever been to in my life, coming from someone who utterly hates conferences.</p><p>I've been to several giant conferences before, <a href="https://reinvent.awsevents.com/">AWS re:Invent</a>, <a href="https://io.google/2025/">Google I/O</a>, etc. They crammed in thousands of attendees into these giant convention centers. Keynotes were supposed to inspire, but didn't say much of anything. Workshops provided surface knowledge. And I never met anyone I stayed in touch with&#8212; I honestly never got much value out of meeting employees at other tech companies, except maybe once every 4 years when I was looking for a new job.</p><p>But Microconf was different in every way.</p><h2>The People</h2><p>This was the main reason why I decided to come.</p><p>I didn't look at the agenda or the workshops or the speakers at all. All I knew was that <a href="https://robwalling.com/">Rob Wailing</a> hosts a conference, and I got a lot of value from his appearances on podcasts, and I kinda like the guy and what he stands for. So I assume he put together something I'd like, and people similar to me would show up, and that would be cool. That was pretty much the entire expected value in my head of attending.</p><p>I didn&#8217;t realize how much this would matter.</p><p>I've just never been in a social setting in my life, where there was such a high hit rate of meeting a person, and having a really interesting genuine conversation, with high likelihood of value exchange.</p><p>Basically 95% of the time that I talked to some random person, one or multiple of the following would occur:</p><ul><li><p>we talk about our businesses, and they realize they have the exact problem that I solve, and might want to be my customer. Or I offer some expertise that helps them out.</p></li><li><p>we talk about our businesses, and I realize I have the exact problem they solve, and I might want to be their customer. Or they offer me some expertise that helps me out</p></li><li><p>I realize this other person is doing something super unique and interesting with their business or their life, and I want to know more</p></li><li><p>they realize I'm doing something super unique and interesting, and they want to know more. Usually when I pop the phrase "I bought an X figure SaaS 3 months ago", their eyes widen and I start telling my story.</p></li><li><p>we happen upon some random topic, and go into a 1 hour rabbit hole conversation about all our explorations on the topic</p></li><li><p>we'd met online previously and we're meeting in person for the first time. Or we'd forgotten we'd met online and both of us are surprised to realize we're now meeting in person.</p></li><li><p>as we're talking animatedly about one of the above, another person overhears what we're talking about and joins in, and adds one of the above to the mix</p></li></ul><p>The first day when we picked up badges, there was a 2 hour happy hour. I usually dread these things. Loud, crowded, hours of exhausting small talk. And to my surprise, I was just constantly meeting cool people and having genuine conversations with mutual value exchange. I later told Rob that in the first 2 hours, I had already recouped the entire value of the event! If I had left that night, I would have been happy after one founder gave me tips on my landing page conversion, and another founder wanted to learn more about being a new enterprise customer of mine.</p><p>By the end of it, I&#8217;d connected with, and gotten the contact information of a handful or two of new great people, and I think I&#8217;ll actually stay in touch with many of them!</p><h2>The Content</h2><p>I've honestly fallen asleep to 98% of workshops I've ever been to. At Microconf, there were only like ~6 speeches, and many (though not all) were so useful that I struggled to pay rapt attention while jotting down notes about what I need to do for ImprovMX.</p><p><strong>Rob Wailing talked about SaaS growth plateaus</strong>. <a href="https://improvmx.com/">ImprovMX</a> isn&#8217;t at a plateau yet, but certainly will hit one eventually. It was very useful to hear from someone experienced about what I&#8217;m about to run into. This was amazing, I&#8217;m definitely going to read <a href="https://amzn.to/4iBJvG6">The SaaS Playbook</a> by Rob after this talk. I actually purchased this eBook last year, but put it down immediately because I was in the 0-1 phase, and the book is more for growing 1-10 (which I&#8217;m at now!).</p><p><strong><a href="https://www.linkedin.com/in/marcoslrivera/">Marcos Rivera</a> talked about pricing your SaaS properly.</strong> </p><p>This was extremely interesting to me because I&#8217;ve been struggling recently on how to think about pricing.</p><p><a href="https://improvmx.com/">ImprovMX</a> has a freemium -&gt; basic -&gt; pro -&gt; enterprise pricing model. This is just the pricing scheme I inherited from the acquisition. But I have no idea if it's actually good, which probably means it&#8217;s bad. But I have no idea on whether to raise, lower, or change the nature of pricing.</p><p>Marcos provided a framework on how to think about it. He described a few styles of value delivery:</p><ul><li><p>value based on usage, i.e. Amazon EC2, the more a customer uses compute, the more value the customer gets, this should have usage based pricing</p></li><li><p>value based on work done by employees, i.e. Slack, the more employees, the more the SaaS provides value, this should charge by headcount</p></li><li><p>fixed value, fixed effort, i.e. a newspaper subscription. It&#8217;s a fixed value and it&#8217;s passive, so this should be a fixed cost</p></li></ul><p>Clearly, ImprovMX is usage based, so I should stick to and refine usage-based pricing.</p><p>Then he explained that you should estimate how much value you&#8217;re providing, and divide it by a ratio depending on if you&#8217;re dealing with SMB or Enterprise. Counterintuitively, the amount of value relative to how much you charge is much HIGHER for SMB than Enterprise, because SMB tends to be far more price sensitive than Enterprise.</p><p><strong>Victor Purolnik talked about offshore hiring. </strong>This gave me some good ideas on the rates that different regions charge, and which regions I was most likely to find quality technical talent.</p><h2>The Format</h2><p>I was quite impressed by the intentionality of MicroConf's format. As mentioned before, I hate conferences. They're exhausting because they&#8217;re:</p><ul><li><p>too long</p></li><li><p>too many long boring keynotes and speeches</p></li><li><p>too many useless workshops, and too many workshops to pick from</p></li><li><p>too sprawling</p></li><li><p>networking events don&#8217;t have any underlying theme, so I never get any value out of those conversations</p></li></ul><p>I feel like MicroConf was designed with the introverted SaaS founder in mind, which makes sense because Rob is probably of that type.</p><p>It was only 2.5 days long, which felt perfect. I still had fun and got value the last night, but I didn't want to stay any longer.</p><p>The venue, the Higgins Hotel, was a nice, fancy, and contained space, perfect for the number of people and the types of events. It was impossible to get lost, and you knew where to go without having to consult maps and apps.</p><p>There was a good pacing of sitting listening to keynotes and breakout sessions, meals, workshops, and excursions, so you never felt like you'd been sitting around too long.</p><p>Each evening was kicked off with an early happy hour, followed by unstructured evening time, which meant founders usually grouped up to head to dinner for some deeper conversations.</p><h2>The Quirkiness</h2><p>Very often we'd call ourselves a "group of misfits". Which we really were. Everyone was a bootstrapped SaaS founder or adjacent. It's already unique to be a founder, and being a bootstrapped founder gave us even more shared tribal identity. Yet at the same time, there was incredible diversity in hobbies/interests, because bootstrapped founders tend to have quirky interests (the one expected lack of diversity was gender, it was mostly men).</p><p>This reminded me a ton of the good old days of <a href="https://hackernoon.com/how-to-build-a-product-loved-by-millions-and-get-acquired-by-google-the-firebase-story-82dab4e3e80c">Firebase</a>. We were a group of quirky tech people wearing bright yellow shirts showing up at hackathons. I miss that vibe, and this was the closest to experiencing that in years.</p><h2>The Resulting Mindset Shift</h2><p>So by the end of the conference, due to all learnings absorbed from workshops, and conversations I had with founders both further and earlier along in the journey than me, my mindset about <a href="https://improvmx.com/">ImprovMX</a> shifted entirely.</p><p>I was previously in a mood of fear &amp; defense. I was afraid of many things:</p><ul><li><p>infrastructure going down and customers getting angry</p></li><li><p>competitors stealing my customers</p></li><li><p>changing something about the product that annoys many customers</p></li><li><p>not being smooth or knowledgable enough to close an enterprise contract</p></li><li><p>our product not having all the features I think we need</p></li><li><p>customers/enterprise clients thinking I didn&#8217;t know what I was doing or talking about</p></li></ul><p>Before MicroConf, I had this base assumption that <a href="https://improvmx.com/">ImprovMX</a> has been growing steadily and organically for the last several years. So it's &#8220;<em>working</em>", and I shouldn't mess with the formula too much. This probably has a lot to do with my prior <a href="https://substack.matthewtse.com/p/0-for-1-learnings-from-my-first-launch">utter failures</a> to find PMF. This led to me focusing my first few months of owning <a href="https://improvmx.com/">ImprovMX</a> on:</p><ul><li><p>improving reliability &amp; automation around the infrastructure</p></li><li><p>bug fixes and UI polish</p></li><li><p>cutting server/subscription service costs</p></li><li><p>getting legal/financial/tax ducks in row</p></li></ul><p>These were all very safe, no risk minor improvements.</p><p>But MicroConf gave me the feeling that ImprovMX is actually <strong>terribly un-optimized</strong>! There's a blue ocean of untapped revenue (and customers I could be helping!) in front of me. It's my job to find out who my best customers are, position my product for them, and get it in front of their eyes. I need to stop feeling constrained by "<em>what's working</em>", and make bold moves to discover "<em>what's best</em>".</p><p>Honestly, it's perfect timing. It was probably important to spend some time putting the house in good order before enacting on a massive remodel. But I was definitely starting to feel antsy about not making big enough changes. And MicroConf came at exactly the right time to get me amped up about taking great risks with the company.</p>]]></content:encoded></item><item><title><![CDATA[How to Buy a SaaS: ImprovMX]]></title><description><![CDATA[Gave up on 0-1, Trying for 1-10]]></description><link>https://substack.matthewtse.com/p/how-to-buy-a-saas-improvmx</link><guid isPermaLink="false">https://substack.matthewtse.com/p/how-to-buy-a-saas-improvmx</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Thu, 09 Jan 2025 10:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ac4ebb64-ca36-418e-b5df-8923e4387eec_264x264.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m officially the new owner of <a href="http://improvmx.com">ImprovMX</a>! It&#8217;s an email-forwarding SaaS with a beautiful design, nice technical niche, and fantastic organic growth.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EgLy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EgLy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 424w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 848w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 1272w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EgLy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png" width="642" height="158.27083333333334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:142,&quot;width&quot;:576,&quot;resizeWidth&quot;:642,&quot;bytes&quot;:6529,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EgLy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 424w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 848w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 1272w, https://substackcdn.com/image/fetch/$s_!EgLy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684a0a6e-d84d-48cc-840a-abc7ee9caa4c_576x142.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Let me take a step back to explain how I got here.</p><p>Early this year, I <a href="https://substack.matthewtse.com/p/on-entrepreneurship">left my 9-5 for entrepreneurship</a>. I knew of &#8220;acquisition entrepreneurship&#8221;&#8212;buy &amp; grow something rather than build from scratch&#8212;but decided to launch something to get my feet wet first.</p><p>I launched <a href="http://taxestimate.fyi">TaxEstimate.fyi</a> which got some traction but had no path to revenue (see <a href="https://substack.matthewtse.com/p/0-for-1-learnings-from-my-first-launch">post</a>). I then launched <a href="https://autoexpense.unicornplatform.page/">AutoExpense.ai</a>. The idea was to first create a landing page, validate the idea with ads, and only then build it. It also failed. Perhaps I&#8217;ll write more on it someday, but in short, clicks &amp; sign ups &#8800; paying customers. I had a commoditized product in a competitive space, and it would be a long grind to cut my slice out of the market.</p><p>After that, I took a break for a month or two, traveled, focused on myself. I soon got bored and started seriously looking at buying a business. The thought process:</p><ul><li><p>Wow 0-1 is hard. I feel a deep pit in my stomach at the thought of taking another of my mediocre ideas and struggling mightily to make it work.</p></li><li><p>I&#8217;ve been working, saving, and investing for over a decade now. I don&#8217;t need to start from 0, and I should use capital leverage to my advantage.</p></li><li><p>When buying a business, you pay for current and expected future profits. But basically <em>for free</em>, you get years of a risky search for product market fit taken on by the founder(s). Ultimately 0-1 isn&#8217;t worth my time/effort unless I&#8217;m truly confident or passionate about an idea.</p></li></ul><p>So I read everything I could on acquisition entrepreneurship. My favorites:</p><ul><li><p><a href="https://amzn.to/49vtUEy">Buy Then Build</a> by Walker Deibel - kind of the acquisition bible. It&#8217;s more for buying brick &amp; mortar businesses, but still a great primer.</p></li><li><p><a href="https://www.youtube.com/c/AcquiringMinds">Acquiring Minds</a> Youtube Channel - deep dive interviews with people who&#8217;ve bought businesses. Also mostly brick &amp; mortar, but there are some SaaS/ecommerce videos in there.</p></li><li><p><a href="https://www.youtube.com/@AcquisitionsAnonymousPodcast">Acquisitions Anonymous</a> YouTube Channel - a group of entrepreneurs meet weekly to evaluate listings. Very useful for getting a feel of what you should be looking for in different types of business listings.</p></li><li><p><a href="https://notes.xo.capital/">Andrew Pierno of XO Capital</a> - a guy who specifically buys small SaaS&#8217; and writes about the process. Golden!</p></li></ul><p>I started looking at listings from <a href="http://flippa.com">Flippa</a>, <a href="http://acquire.com">Acquire</a>, <a href="http://quietlight.com">QuietLight</a>, etc. This was the &#8220;naive optimism&#8221; phase of the <a href="https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect">Dunning-Kruger</a> curve. There are literally thousands of listings available. I thought I would spend a few hours looking through them, put a few offers in, and have a business in a few weeks.</p><p>But I soon entered the <em>trough of disillusionment</em>. Many listings looked decent, but on digging in, I found serious problems (massaged metrics, declining growth, commoditized product, etc.). Days became weeks, and weeks became months, without anything to show for. I often worried if I would ever find a business I wanted to buy.</p><p>I did eventually find something. It was a <a href="https://quietlight.com/">QuietLight</a> listing for a 10+ year old SaaS in the recruitment space. It looked old and would need a UI redesign, but it had stable revenues and wasn&#8217;t too complicated, so I figured it would be a not too expensive starting point. I messaged the broker, video called the founder, and submitted a strong LOI (full asking price, <a href="https://www.investopedia.com/what-is-an-sba-loan-7551104">SBA-loan</a>, would pay all-cash if loan fell through). The broker and founder initially liked me, but eventually took someone else after stringing me along for a few weeks.</p><p>A little dismayed, but I was back on the search. At this point, I had a pretty clear idea on my criteria:</p><ul><li><p>SaaS, not e-commerce. I wanted to leverage my pre-existing skill set.</p></li><li><p>At least 3 years old</p></li><li><p>Nothing hype (crypto, AI, etc.). I want a boring stable business.</p></li><li><p>Revenue: at least stable, ideally growing. Nothing declining.</p></li></ul><p>This seems like a fairly short requirements list. Most notably, I wasn&#8217;t even requiring a working distribution channel. But even then, there were very few qualified listings and they were all at a high 5x multiple with multiple other buyers.</p><p>I did eventually find a second SaaS on <a href="http://acquire.com">acquire.com</a>. It was a knowledge base SaaS very similar to the first one (old, stable, needs a redesign, needs someone to figure out growth). I put an all-cash asking price offer on it, and the founder agreed! I was excited to finally be moving forward on something.</p><p>But the very next day, a QuietLight listing hits my inbox. It&#8217;s an email forwarding SaaS, and when I sign the NDA and see <a href="http://improvmx.com">ImprovMX</a>, <em>my jaw drops</em>. <a href="http://improvmx.com">ImprovMX</a> is a product I already use and love. When I started indie hacking, I literally thought &#8220;wow, if I could build an ideal SaaS, I would build ImprovMX. I wish I had that idea&#8221;. And here that business was for sale, and in my price range!</p><p>I immediately sent an email to the ImprovMX broker, scheduled a call with the founders the next morning, and seriously reviewed all the business details. The next morning, I had the call, and found <a href="https://bsky.app/profile/cnicodeme.com">Cyril</a> and <a href="https://x.com/antoineminoux?lang=en">Antoine</a> to be absolutely wonderful founders, and more importantly, trustworthy, and they liked my entrepreneurial fit as well. I submitted an LOI about 2 hours later. And simultaneously broke the LOI with the prior SaaS&#8212;luckily, I was polite and fair about it, so the other founder didn&#8217;t take it personally and found another buyer soon afterwards!</p><p>There&#8217;s a truth to buying or building a business, that every business has sh*t, and you need to pick the type of sh*t you want to eat or that you&#8217;re good at eating. That said, ImprovMX is a <em>nearly ideal</em> business for me for two main reasons:</p><ol><li><p>The weakness of this business is it&#8217;s technical complexity. The average buyer won&#8217;t be able to handle the technical &amp; reliability requirements. But I&#8217;ve built a career out of becoming a top tier <a href="https://en.wikipedia.org/wiki/Site_reliability_engineering">Site Reliability Engineer</a>.</p></li><li><p>The strength of the business is very strong organic growth. It&#8217;s one of those &#8220;build a quality product, and people will find you&#8221; dream SaaS businesses. This complements my weakness in sales, marketing, and distribution.</p></li></ol><p>So, <em>its</em> <em>weakness is my strength</em>, and <em>its strength is my weakness</em>, <strong>perfect complement</strong>.</p><p>So a few days later, I had a counter signed LOI. I beat other qualified buyers by offering a good price, being a good fit, and showing extreme sincerity in wanting a quick &amp; easy close.</p><p>Next was the due diligence and transition process. Despite this being my first acquisition, it ended up being fairly manageable, especially for someone not bogged down by a 9-5.</p><p>In broad strokes:</p><ul><li><p>technical due diligence (I would evaluate the code myself)</p></li><li><p>product due diligence (fully understand the product, it&#8217;s competitors, and know how to sell it)</p></li><li><p>financial due diligence (I paid <a href="https://centurica.com/">Centurica</a> to do this for me, basically verifying the earnings and expenses).</p></li><li><p>Legal (draft an Asset Purchase Agreement)</p></li><li><p>Form a business entity to acquire the business</p></li><li><p>Get the money ready to wire</p></li><li><p>Migrate all the accounts</p></li></ul><p>In between those lines, there were plenty of unexpected complications and roadblocks. But ultimately having a collaborative attitude with the sellers was key to success. <strong>Piece of advice:</strong> every business is going to be much more hassle than you envisioned. Go after something worth your time (large enough MRR), otherwise you&#8217;ll give up. If you can&#8217;t afford something good yet, I recommend waiting and saving up rather than making the mistake of buying too small.</p><p>And here we are! At the close of 2024, and I own a SaaS that I&#8217;m super proud of. It&#8217;s funny because I created a 2024 EOY goal on my calendar to have a business with <em>some</em> MRR. I deleted it in dismay back in November, thinking there&#8217;s no way I&#8217;d hit it with no ideas and deal flow drying up EOY. But then ImprovMX appeared, and I actually hit my stretch goal.</p><p>Now, it&#8217;s on to scaling ImprovMX! After getting a handle on everything new, I&#8217;ll soon be focusing on scaling the team up to create the bandwidth for new features and improved customer service.</p><p>Huge thanks to Antoine and Cyril for deciding to sell their baby to a first time acquirer! They took a bet on me, and I tried my best to be a partner beyond reproach throughout the process.</p><p>And special thanks to Afanasiy Yermakov, for being a perpetual sounding board on this entrepreneurial journey, wouldn&#8217;t be here without him. Checkout his awesome business, <a href="https://foldologypuzzle.com/">Foldology</a>!</p>]]></content:encoded></item><item><title><![CDATA[0 for 1, Learnings From my First Launch Failure]]></title><description><![CDATA[A Postmortem of TaxEstimate.fyi]]></description><link>https://substack.matthewtse.com/p/0-for-1-learnings-from-my-first-launch</link><guid isPermaLink="false">https://substack.matthewtse.com/p/0-for-1-learnings-from-my-first-launch</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Thu, 25 Apr 2024 13:56:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>After building for ~2 months, I <a href="https://substack.matthewtse.com/p/why-i-built-taxestimatefyi">launched</a> and abandoned my first project <a href="https://taxestimate.fyi/">TaxEstimate.fyi</a> within the same week.</p><p>I knew from the get-go this would be a learning launch. Though harboring some secret hope it would find success, I was fairly realistic that it would likely flop, and I should strictly time-bound this thing.</p><h3>Why Spend 2 Long Months?</h3><p>I kind of intentionally wasted more time than I should have because honestly, building it was <em>novel and</em> <em>fun</em>:</p><ul><li><p>I hadn&#8217;t written front-end code in a decade</p></li><li><p>I hadn&#8217;t played with ChatGPT/Copilot augmented development yet</p></li><li><p>I hadn&#8217;t ever done product design to think through a customer problem and crafting a product to solve that</p></li><li><p>I hadn&#8217;t ever done UI/UX design to think in the eyes of the user</p></li><li><p>I hadn&#8217;t ever written marketing copy</p></li><li><p>I hadn&#8217;t ever &#8220;launched&#8221; anything</p></li><li><p>I hadn&#8217;t ever played with search-engine-marketing</p></li><li><p>I hadn&#8217;t ever searched for users</p></li></ul><p>Doing all the above was energizing in and of itself. But eventually I had to face the reality that the &#8220;learnings&#8221; were more for fun, and not actually bringing me any closer to my goals.</p><h3>What Went Well</h3><p>I&#8217;m honestly proud of the user experience I built. I set out to create a better tax estimator for myself, and I will definitely be using this for my own tax estimations. Luckily, I built efficiently so it will continue to be hosted forever on free-tier infrastructure.</p><p>I also had a few moments of creator-joy for the first time in my life:</p><ul><li><p>the second customer I showed it to, said with glowing eyes &#8220;wow that&#8217;s amazing&#8221; on two separate occasions.</p></li><li><p>heard &#8220;very simple and very useful&#8221; via email feedback</p></li><li><p>heard &#8220;I love the detailed breakdowns, Turbotax is terribly surface-level&#8221; via email feedback</p></li></ul><p>Though all the above should be taken with a grain of &#8220;friends trying to be encouraging&#8221; salt.</p><h3>What Went Wrong</h3><p><strong>Ultimately, it didn&#8217;t solve a pressing enough problem</strong>. Tax estimates are <a href="https://substack.matthewtse.com/i/136803302/the-excel-spreadsheet">hard to do</a> and <a href="https://substack.matthewtse.com/i/136803302/the-surprise-tax-bill">useful to have</a>. But people won&#8217;t pay for something slightly better when there are pre-existing free &amp; adequate solutions (<a href="https://www.irs.gov/individuals/tax-withholding-estimator">IRS</a>, <a href="https://turbotax.intuit.com/tax-tools/calculators/taxcaster/">Turbotax</a>, <a href="https://smartasset.com/taxes/income-taxes">Smartasset</a>). There&#8217;s probably some type of upmarket service that people would be willing to pay for, but the discovery path seems long and hard.</p><h3>Surprising Learnings</h3><p><strong>Cool Doesn&#8217;t Pay</strong> - I&#8217;ve heard countless &#8220;that&#8217;s so cool&#8221;, and I impress myself with &#8220;that&#8217;s so cool&#8221; on a regular basis when creating new features. But &#8220;cool&#8221; is just self-masturbation, and so far away from enough value for someone to pay</p><p><strong>Iteration on Bad Ideas is Futile</strong> - I knew initial traction was very thin. Only a few potential users found it useful, and none would pay for it. I convinced myself that I could continually make improvements until the whole thing &#8220;clicked together&#8221;. But that was never going to happen.</p><p><strong>The Web Can Be a Silent Void</strong> - I had some grandiose expectations that posting to <a href="https://news.ycombinator.com/item?id=40131156">HN</a> and <a href="https://www.reddit.com/r/SideProject/comments/1c5jxu9/taxestimatefyi_estimate_understand_your_taxes/">reddit</a> would kickstart my user base, or at the very least start a discussion. But both were met by crickets. I&#8217;ve realized, to work, these types of posts need to be really sexy in their own right or backed by a strong pre-existing audience who trusts your sexy brand. Going to start building my personal entrepreneur brand.</p><h3>What&#8217;s Next</h3><p><strong>Follow The Money</strong> - I approached my first product far too idealistically. I had all these good-sounding prerequisites that I now realize were naive:</p><ul><li><p>unique passion for the product&#8212;I&#8217;m most passionate about fun things like bouldering or snowboarding, hard to build an enterprise SaaS out of those</p></li><li><p>hasn&#8217;t been done before&#8212;probably because it&#8217;s a bad business, it&#8217;s unlikely I&#8217;m building the next ChatGPT from my laptop</p></li><li><p>very low overhead&#8212;means my product won&#8217;t provide much value</p></li><li><p>solves my own problem&#8212;all my own problems are just low-value consumer annoyances</p></li></ul><p>My next project is going to tackle higher value problems that people are willing to pay for.</p><p><strong>B2B</strong> - Really want to do B2B rather than B2C. It&#8217;s higher barrier to entry because I don&#8217;t know B2B needs as well, and I have fewer natural acquisition channels. But it&#8217;s probably worth it because <em>it really sucks</em> begging consumers for my $5 app.</p><p><strong>Validate Even Faster</strong> - No more &#8220;playing entrepreneur house&#8221;. It was fun lying to myself and pretending to be building something useful. But it&#8217;s time to be more ruthless and not waste time on a &#8220;fun idea&#8221;.</p><p></p><p>Hope you guys found this useful or entertaining. Any thoughts or things I missed? Let me know in the comments below!<br><br>P.S. I recommend watching Alex West&#8217;s <a href="https://www.youtube.com/watch?v=WAigd4b9jsA&amp;t=1s">YouTube video</a> on business ideas. I fell for every one of the pitfalls he mentions. He really captures exactly where I&#8217;m at in the &#8220;learning from failure&#8221; process.</p>]]></content:encoded></item><item><title><![CDATA[Why I Built TaxEstimate.fyi]]></title><description><![CDATA[I used to only think about taxes in April.]]></description><link>https://substack.matthewtse.com/p/why-i-built-taxestimatefyi</link><guid isPermaLink="false">https://substack.matthewtse.com/p/why-i-built-taxestimatefyi</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Tue, 23 Apr 2024 06:54:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eP7x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I used to only think about taxes in April. But as my income increased and diversified, I ran into surprise tax bills and penalties. I then created complicated spreadsheets, read the IRS tax code and paid my accountant a lot.</p><p>For most tax situations, people shouldn't have to do any of that, so I built <a href="https://taxestimate.fyi">TaxEstimate.fyi</a> to share my tax estimation solution with everyone.</p><h3>The Surprise Tax Bill</h3><p>Like most people, I started earning a salaried income with taxes withheld each paycheck. Every April, I'd pay a bit to turbotax, enter some data, and get a small refund or pay a few hundred. A bit annoying, but no big deal.</p><p>As the years passed, my salary increased, and I started adding new income sources (selling stocks, interest income, etc.). Still, I assumed my prior of leaving taxes off until April would be fine&#8212;the additional non-withheld income sources weren't big.</p><p>But one April:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u_IH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u_IH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 424w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 848w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 1272w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u_IH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png" width="1456" height="145" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d07a4552-129d-4eb4-ae89-81008330b890_1466x146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:145,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66759,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u_IH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 424w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 848w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 1272w, https://substackcdn.com/image/fetch/$s_!u_IH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd07a4552-129d-4eb4-ae89-81008330b890_1466x146.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>Turbotax said I owed <strong>$17,826</strong> and a <strong>$1,569</strong> <strong>penalty for underpayment!</strong></p><p>Shocked, I spent the rest of my day digging through income statements and my tax return, looking for some obvious mistake. By the end, I realized there was no mistake, and I actually owed $17,826. Time to sell a bunch of stock(more taxes!) to pay it off.</p><p>So why was it so off? At first I checked my <a href="https://www.nerdwallet.com/article/taxes/how-to-fill-out-form-w4-guide">W4 Withholding Document</a>, but that was filled as "no allowances", maximum withholding. It turns out the federally mandated withholding amounts diverge from what you actually owe, and this divergence increases the more income you have. This is silly, because the IRS knows exactly how much we owe, so why not just withhold that amount? #IRS</p><h3>The Excel Spreadsheet</h3><p>So I got serious to avoid any future surprise bills/penalties. I read the IRS tax code, made an excel spreadsheet, and consulted an accountant. Over the years I continued refining it, adding more complexity as income sources diversified, and getting it closer to what I actually owed&#8212;eventually just a few hundred dollars off.</p><p>But the spreadsheet had its limits. Without code it couldn't handle many edge cases well, so it was littered with workarounds. Which meant I often didn't fully trust the spreadsheet when making updates.</p><p>Furthermore, whenever I told the story of my spreadsheet to coworkers, I discovered most of them have the same tax estimation issue. They "solve" it by either paying an accountant a lot, eating the penalties, or guestimating their taxes and hoping for the best.</p><h3>TaxEstimate.fyi</h3><p>So I decided to make a webapp out of my spreadsheet: <a href="https://TaxEstimate.fyi">TaxEstimate.fyi</a>&#8212;you can clearly see the spreadsheet design influences.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eP7x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eP7x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 424w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 848w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 1272w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eP7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png" width="1456" height="964" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:964,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:409850,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eP7x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 424w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 848w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 1272w, https://substackcdn.com/image/fetch/$s_!eP7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8d1054e-550a-451a-91dd-1050abda1f0f_2506x1660.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I think it's better than what's out there (<a href="https://smartasset.com/taxes/income-taxes">smartasset</a>, <a href="https://turbotax.intuit.com/tax-tools/calculators/taxcaster">turbotax</a>, <a href="https://www.irs.gov/individuals/tax-withholding-estimator">IRS</a>) for a few reasons:</p><h4>Quick &amp; Easy Input</h4><p>I tried the <a href="https://www.irs.gov/individuals/tax-withholding-estimator">IRS</a> withholding estimator multiple times. But it's so long and complicated that I've always given up before the end.</p><p><a href="https://taxestimate.fyi">TaxEstimate.fyi</a> lets you to quickly add your income sources and get immediate cumulative calculations.</p><h4>Intra-Year Tax Calculations</h4><p>All other calculators ask your full year's income, then give you a single number. But people's income is distributed, often unevenly, throughout the year. <a href="https://taxestimate.fyi">TaxEstimate.fyi</a> uniquely lets you select any date in the year, and see how much you owe up to that date. This is great for quarterly payments, because you won't need to redo an estimation 4 separate times.</p><h4>Transparent Calculations</h4><p>I hate how all the estimators just give you a final number with zero or minimal explanation. It really erodes trust if I don't know where the number comes from. <a href="https://taxestimate.fyi">TaxEstimate.fyi</a> lets you click into each tax component to see a detailed breakdown of how it's calculated, along with relevant links to the official IRS tax code.</p><h4>Save &amp; Update</h4><p>People have taxable events throughout the year, i.e. deciding to sell some stock. When that happens, no one wants to redo an entire tax estimation to include that one change. <a href="https://taxestimate.fyi">TaxEstimate.fyi</a> lets you save your tax estimate and update just that one component later. This makes it easy to keep track of all your income sources and tax liabilities throughout the year.</p><p></p><p></p><p>I hope you find this tool useful! If you don't, it doesn't cover your use case, or have any other suggestions, I'd love to hear from you. Shoot me a message at <a href="mailto:contact@taxestimate.fyi">contact@taxestimate.fyi</a>.</p>]]></content:encoded></item><item><title><![CDATA[On Entrepreneurship]]></title><description><![CDATA[I know nothing about this, and that's exciting!]]></description><link>https://substack.matthewtse.com/p/on-entrepreneurship</link><guid isPermaLink="false">https://substack.matthewtse.com/p/on-entrepreneurship</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Sat, 24 Feb 2024 13:35:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Yesterday, Friday 02/23/2024, was my last day of employment&#8212;just short of the 10-year mark since graduating college.</p><p>What&#8217;s next? I&#8217;m hoping to become unemployable via the terrifying-exciting path of entrepreneurship.</p><p>Why now? Some part of me wishes I&#8217;d started sooner, but another part realizes there really is a time and place for everything. If you&#8217;re curious, here&#8217;s my meandering path to this moment.</p><h4>2014 - 2018: Firebase/Google in San Francisco</h4><p>Graduated from college, moved to SF and found a coding job at a database startup. Very quickly and luckily, Firebase was <a href="https://techcrunch.com/2014/10/21/google-acquires-firebase-to-help-developers-build-better-realtime-apps/">acquired by Google</a>, and I became a comfy FAANG engineer.</p><p>Despite that, life was honestly pretty crappy. I&#8217;d been a life long sufferer of an autoimmune inflammation disease, which got worse in my 20s. It&#8217;s a testament to just how cushy of a job Google circa mid-2010s was, for a cripple to hold a full-time engineering role and get promotions.</p><p>In 2017, I became one of the first public patients of a breakthrough therapy fast-tracked by FDA. Within a matter of months 99% of my symptoms disappeared. Modern medicine is nothing short of <em><strong>miraculous</strong></em>, and I owe my life to pharmaceutical research. I spent the next several years re-learning how to be a human again, simple things like exercise, eating normal foods, travel, etc. </p><p>At some point during this time, I encountered the <a href="https://en.wikipedia.org/wiki/FIRE_movement">FIRE movement</a>, learned frugality, savings, investment, and decided my goal would be to race towards early retirement.</p><h4>2018: Crypto Side Project</h4><p>Towards the tail end of my Google employment, I got involved with a friend arbitraging cryptocurrencies across exchanges. This was still early days, so simple dumb strategies were extremely profitable, even for a total HFT novice like me. This worked for awhile and we made a nice chunk, but we parted ways over priority differences.</p><p>The most valuable takeaway was the feeling as an adult of being &#8220;wired&#8221; into a pursuit (I&#8217;d only experienced this as a child before). For months, I couldn&#8217;t think of anything but our trading program. Every morning I would wake up at 5AM, check our PNL, improve the algorithm for a few hours, go to work thinking about the algorithm, go home and code until 2AM, rinse/repeat every day, weekdays and weekends. Despite being terribly sleep deprived, this was the most fulfilled I&#8217;d ever felt.</p><h4>2019: Aurora</h4><p>I left Google in 2019 to join <a href="https://aurora.tech/">Aurora Innovations</a>, a self driving car startup. This was a fairly naive decision process that went something like &#8220;What&#8217;s cool in tech? Self-driving cars are cool. Maybe I&#8217;ll be happy there.&#8221; I lasted about a year, realizing that cloud engineering for a self-driving car company isn&#8217;t much different than for an ad company.</p><h4>2020 - 2024: Quant Fund in NYC</h4><p>By 2020, I was getting tired of SF and I wanted to be closer to family on the east coast. I figured the best coders in NYC went to finance. So as Covid closed the world down, I snuck several last minute flights back/forth to NYC to interview with quant funds. Signed a good offer with one, and transitioned into a NYC life.</p><p>My career was in a good place, so I took this time period to get as much as I could out of NYC life. I started weightlifting and dieting much more seriously, dressing better, socializing better, etc.</p><h4>2024+: The Exciting/Scary Future</h4><p>It had always been in the back of my mind to do a startup, especially since my first employer was a small startup. But there was never enough motivation, and I always came up with reasonable sounding excuses: most fail, it&#8217;s not worth the sacrifice, other parts of life are more important, etc.</p><p>So what changed? I was feeling fairly stagnant in 2023&#8212;nothing was moving forward in my life (social life, travels, work, etc.). I&#8217;d also reached a point of serious diminishing returns on spending additional money (bought an expensive watch and realized how empty it was the minute I put it on). I knew the way out of this had to be something more internal.</p><p>I began searching, reading, listening, and looking for wisdom from others. Through a chance dinner conversation, I was recommended a <a href="https://www.youtube.com/watch?v=V0ej29G7ZGg">podcast</a> interviewing Pieter Levels, a solo-entrepreneur who just builds cool stuff (and is very financially successful from it). Watching that video was &#8220;<em>the moment</em>&#8221; for me. I had a &#8220;fever night&#8221; that evening, where I literally could not sleep out of excitement of the possibilities and regret for not realizing this about myself sooner.</p><p>I realized a few things:</p><ul><li><p>I&#8217;ve been most happy in life when building stuff I was passionate and proud of&#8212;stuff I thought was &#8220;cool&#8221;.</p></li><li><p>If, rather than working for someone else, I double down on my own creations, there&#8217;s a chance and likelihood of greater financial success.</p></li><li><p>This won&#8217;t be that big of a risk for me, I have fairly good entrepreneur &#8220;starting stats&#8221;:</p><ul><li><p>coding - I&#8217;m very technical and am well positioned to utilize the &#8220;<a href="https://twitter.com/naval/status/1002106893265920000?lang=en">permissionless leverage</a>&#8221; of code. </p></li><li><p>perseverance - I have a history of taking on difficult years-long goals, and sticking with them despite not seeing progress.</p></li><li><p>capital - I&#8217;ve earned, saved, and invested a lot over the years, so I have a healthy runway to keep trying until something works. And I don&#8217;t have a family that will starve if I fail.</p></li><li><p>These are my advantages, my disadvantages would probably be lack of marketing/selling experience, and not too many connections. But overall I think I have a decent starting spot.</p></li></ul></li></ul><p>So with the above realizations made, it&#8217;s became basically illogical for me not to try starting my own thing.</p><p>All that said, here&#8217;s my current &#8220;flavor&#8221; of entrepreneurship:</p><ul><li><p>Follow my curiosity, build something <em><strong>cool</strong></em>, build something that keeps me up at night with a smile on my face.</p></li><li><p>Bootstrap until something works. I have some small ideas, and some bigger ideas. Going to start with the smaller ones to get some experience with the whole &#8220;launching a business&#8221; whirlwind, before I tackle the bigger ideas which might require co-founders and funding.</p></li></ul><p>And these are my keystone inspirations:</p><ol><li><p><a href="https://amzn.to/4bDV2C2">The Almanack of Naval Ravikant</a> - basically my new favorite book. I had actually started reading it before, and it left no impression. But I read it again this year and was <em>consumed by it</em>. My favorite lesson is that you should do things that you&#8217;re excited/curious about, do it in a <a href="https://x.com/naval/status/1002106317064949763?s=20">leveraged way</a>, and you&#8217;ll naturally achieve wealth as a side effect.</p></li><li><p>Paul Graham&#8217;s essays, specifically &#8220;<a href="https://paulgraham.com/greatwork.html">How to Do Great Work</a>&#8221; &#8220;<a href="https://paulgraham.com/wealth.html">How to Make Wealth</a>&#8221;, and his book <a href="https://amzn.to/3OMVdRB">Hackers &amp; Painters</a>.</p></li><li><p><a href="https://www.mfmpod.com/">My First Million Podcast</a> - <a href="https://twitter.com/thesamparr/">Sam Parr</a> and <a href="https://twitter.com/ShaanVP">Shaan Puri</a> are just awesome. Two hilarious tech dudes podcasting about money and business, and having a blast along the way. As mentioned before, I loved their <a href="https://youtu.be/V0ej29G7ZGg?si=kIPCtdDLkVB-paqK">episode</a> on <a href="https://levels.io/">Pieter Levels</a>, who&#8217;s a solopreneur digital nomad with multiple 7-figure bootstrapped startups.</p></li></ol><p>Thanks for reading this somewhat rambling post. Looking forward to sharing all the mistakes and learnings from launching, finding product market fit, and scaling! Any thoughts? Comment below, or send me a DM at matthew@matthewtse.com.</p>]]></content:encoded></item><item><title><![CDATA[Ninja Text Navigation in macOS]]></title><description><![CDATA[How and Why to Setup a DefaultKeyBinding.dict File]]></description><link>https://substack.matthewtse.com/p/ninja-text-navigation-in-macos</link><guid isPermaLink="false">https://substack.matthewtse.com/p/ninja-text-navigation-in-macos</guid><dc:creator><![CDATA[Matthew Tse]]></dc:creator><pubDate>Tue, 20 Feb 2024 04:27:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kGkd!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61dcc0a3-1f2c-4998-b33e-acf3201c3423_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever wanted to navigate/edit text from the home row, without needing to use the keyboard arrow keys or the mouse? Well, if you&#8217;re on macOS, you&#8217;re in luck!</p><p>As a coder obsessed with efficiency, I&#8217;m particular about my keyboard shortcuts. Surprisingly, I&#8217;ve yet to encounter anybody in person who also loves macOS&#8217;s out-of-box emacs style text navigation shortcuts (<a href="https://news.ycombinator.com/item?id=30881169">here&#8217;s</a> someone who agrees with me on the web).</p><p>Windows and Linux use the control (&#8963;) key as a main modifier, e.g. &#8963;f for find, &#8963;c for copy. This is unfortunately overloaded with <a href="https://mally.stanford.edu/~sr/computing/more-unix.html">unix</a>/<a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Moving-Point.html">emacs-style navigation</a>, e.g. &#8963;f to move forward one character, &#8963;b to move back one character, etc.</p><p>In contrast, macOS uses the command (&#8984;) key for main modifiers, e.g. &#8984;f for find, &#8984;c for copy. This frees up the control key, and therefore macOS natively out-of-box uses the control key for emacs style navigation!</p><p>So when interacting with text input on macOS (for example writing this blog post), if I need to make edits, I can move forwards/backwards/beginning_of_line etc. by just typing &#8963;f/&#8963;b/&#8963;a/etc. which is far faster and more ergonomic than shifting my hands over to the arrow keys, or even worse, clicking the spot with my mouse.</p><p>That&#8217;s <em>amazing</em>, but emacs has more in store: <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Words.html">word-based navigation</a>. If we&#8217;re already hitting &#8963;f to move forward a character, what if we want to move forward by a whole word instead? Intuitively, emacs has you hit meta-f to move forward by a word, where meta is typically the modifier key to the right of control, e.g. the alt or the option (&#8997;) key.</p><p>Unfortunately, macOS doesn&#8217;t support word-based navigation out-of-box, but luckily supports custom keyboard shortcuts for this. Apple&#8217;s <a href="https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/TextDefaultsBindings/TextDefaultsBindings.html">documentation</a> describes how you can create a configuration file with the following contents, to recreate the emacs style keybindings.</p><pre><code>/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    /* tilde represents the meta/option key */
    "~f"    = "moveWordForward:";
    "~b"    = "moveWordBackward:";
    "~d"    = "deleteWordForward:";
    "~\010" = "deleteWordBackward:"; /* Meta-backspace */
}</code></pre><p>This is great, you just create that file at the specified location, and meta word-based navigation now works for you! I used a similar configuration for <em>years</em>, but one thing always bothered me:</p><p>Although I could hit meta-f for forward-by-word and meta-b for backward-by-word, I also wanted to do meta-shift-f for select-forward-by-word, and meta-shift-b for select-backward-by-word, another really useful emacs feature.</p><p>Apples API explicitly lists the capability for this, with <a href="https://developer.apple.com/documentation/appkit/nsstandardkeybindingresponding/3005264-movewordforwardandmodifyselectio">moveWordForwardAndModifySelection</a> and <a href="https://developer.apple.com/documentation/appkit/nsstandardkeybindingresponding/3005262-movewordbackwardandmodifyselecti">moveWordBackwardAndModifySelection</a>. Both these methods do what I want them to do, but I was unable to get the desired shortcut to trigger them.</p><p>My DefaultKeyBindings.dict would look like this:</p><pre><code>{
    /* $ represents the shift key */
    "~f"    = "moveWordForward:";
    "~$f"   = "moveWordForwardAndModifySelection:";
    "~b"    = "moveWordBackward:";
    "~$b"   = "moveWordBackwardAndModifySelection";
    "~d"    = "deleteWordForward:";
    "~\010" = "deleteWordBackward:"; /* Meta-backspace */
}</code></pre><p>But for some reason, pressing &#8997;&#8679;f would always result in typing the character &#207; and &#8997;&#8679;b would always result in typing the character &#305;. </p><p>Perhaps this could be solved with some third party app like <a href="https://karabiner-elements.pqrs.org/">Karabiner-Elements</a>, but I didn&#8217;t want to install some third party tool just for this. Over the past few years, I spent countless hours searching StackOverflow and trying every permutation of DefaultKeyBindings.dict to try to get this to work, but to no avail. And the other day, while setting up DefaultKeyBindings.dict on a new macbook, I decided to give it another attempt.</p><p>Hours later, I was about to give up, when I stumbled upon a <a href="https://apple.stackexchange.com/a/462618">related answer</a> that gave me a clue. The author explains that binding &#8220;shift + 6&#8221; is impossible, because shift+6 would result in the ^ character, so you need to bind &#8220;shift + ^&#8221;</p><p>I quickly ran back to my DefaultKeyBinding.dict, and tried the following (notice the capital F and capital B):</p><pre><code>{
    "~f"    = "moveWordForward:";
    "~$F"   = "moveWordForwardAndModifySelection:";
    "~b"    = "moveWordBackward:";
    "~$B"   = "moveWordBackwardAndModifySelection";
    "~d"    = "deleteWordForward:";
    "~\010" = "deleteWordBackward:"; /* Meta-backspace */

}</code></pre><p><strong>THIS WORKS!!!</strong> All I needed to do was change the binding to a capital F and capital B! So now I finally have fully working by-word key navigation with selection.</p><p>You can find the <a href="https://github.com/m-tse/codex/blob/master/mac/DefaultKeyBinding.dict">complete set</a> of my DefaultKeyBinding.dict in my GitHub <a href="https://github.com/m-tse/codex/tree/master">codex</a> repository (along with all my other system configuration settings!).</p>]]></content:encoded></item></channel></rss>