<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Charlie Reese]]></title><description><![CDATA[Hey! I'm Charlie - from Vancouver, Canada. I like to work where finance, data science, and software intersect. Nice to virtually meet you!]]></description><link>https://charliereese.ca/</link><image><url>https://charliereese.ca/favicon.png</url><title>Charlie Reese</title><link>https://charliereese.ca/</link></image><generator>Ghost 4.44</generator><lastBuildDate>Sat, 18 Apr 2026 17:32:49 GMT</lastBuildDate><atom:link href="https://charliereese.ca/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[12 Principles For Your Career / Business]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">We&#x2019;re finishing a small friends and family allocation for <a href="https://blog.forecastos.com/from-narratives-to-numbers-measuring-belief-at-scale-with-hivemind/">ForecastOS Hivemind</a> over the next couple weeks (US$100k of our US$2MM raise). If you&#x2019;re interested, let me know - I&#x2019;ll share the deck + details.</div></div><hr><p>It&apos;s been ~2 years since I</p>]]></description><link>https://charliereese.ca/building-hivemind/</link><guid isPermaLink="false">69794190da87150864257268</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Thu, 29 Jan 2026 12:07:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">We&#x2019;re finishing a small friends and family allocation for <a href="https://blog.forecastos.com/from-narratives-to-numbers-measuring-belief-at-scale-with-hivemind/">ForecastOS Hivemind</a> over the next couple weeks (US$100k of our US$2MM raise). If you&#x2019;re interested, let me know - I&#x2019;ll share the deck + details.</div></div><hr><p>It&apos;s been ~2 years since I founded <a href="https://forecastos.com/">ForecastOS</a> and ~12 years since I started my investment banking -&gt; software engineering -&gt; quantitative investing -&gt; founder arc. </p><p>I&#x2019;ve learned a lot the hard way (pain) and the easy way (patterns).</p><p>Below is a collection of 12 principles I keep coming back to. Take what&#x2019;s helpful. Ignore the rest.</p><hr><ol><li>Expect Everyone to Act In Their Own Self Interest and You&apos;ll Rarely Be Surprised</li><li>Once Something Is Agreed, Paper it Immediately</li><li>Don&apos;t Deviate Far From Standard Terms</li><li>Be A Good Steward of Capital</li><li>Beware The Most Dangerous Person in the Room</li><li>Improve Health to Improve Productivity</li><li>What Product-Market Fit Feels Like</li><li>(How to) Hire Extraordinary Employees</li><li>Avoid Complexity</li><li>There Can Only Be One (Founder &amp; CEO)</li><li>Know Your Odds of Success. Be Good Enough To Succeed</li><li>The Central Limit Theorem of Advice</li></ol><hr><h3 id="1-expect-everyone-to-act-in-their-own-self-interest-and-youll-rarely-be-surprised">1. Expect Everyone to Act In Their Own Self Interest and You&apos;ll Rarely Be Surprised</h3><p>A nicer way to say this is: <em>&#x201C;show me the incentive and I&#x2019;ll show you the outcome.&#x201D;</em></p><p>People aren&#x2019;t evil. They&#x2019;re incentivized. And incentives beat values more often than we&#x2019;d like to admit, especially when money, ego, status, or job security are involved.</p><p>Don&#x2019;t rely on other people to be saints.</p><p>Instead:</p><ul><li>Assume self-interest. If someone benefits from doing something that disadvantages you, expect them to consider doing it.</li><li>Design for it. Make it in peoples&#x2019; best interest to do what you want, and not in their best interest to do what you don&#x2019;t want.</li></ul><p><strong>This applies everywhere, including</strong>:</p><p><strong>A) Employees / ESOPs</strong></p><p>Retain and motivate employees by structuring comp and equity such that staying and performing is rational (i.e. better than what is available to them elsewhere). Don&#x2019;t rely on loyalty. Loyalty can be fragile when rent is due.</p><p><strong>B) Customers / Vendor Risk</strong></p><p>No one gets fired for buying from Salesforce. People do get fired (or look dumb) for betting their roadmap on a startup that disappears in 18 months.</p><p>If you&#x2019;re early-stage, you&#x2019;re selling against risk, not just features. You can reduce that risk by:</p><ul><li>selling to smaller / risk-tolerant customers first,</li><li>selling something low-effort to adopt (i.e. low switching cost), or</li><li>building something new (i.e. not available elsewhere) or 10x better so that the buyer can justify the risk.</li></ul><p><strong>C) Investors / Partners / Advisors</strong></p><p>Always ask: what do they want? How does my success (or failure) affect them? Once you see their incentive clearly, advice becomes easier to evaluate.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><strong>A closing note</strong>: this isn&apos;t about convincing someone that your goals are in their best interest. It&apos;s about real alignment of incentives. Substantial commission, equity, profit sharing, bonuses (with substantial variation), etc. Use the carrot, not just the stick.</div></div><h3 id="2-once-something-is-agreed-paper-it-immediately">2. Once Something Is Agreed, Paper it Immediately</h3><p>I&#x2019;ve regretted not doing this more than once; I was slower than I should have been to learn this lesson.</p><p>A surprising number of people will change spoken commitments after the fact - sometimes without highlighting changes. Putting something in writing doesn&#x2019;t <em>&#x201C;ruin the vibe.&#x201D;</em> If they&#x2019;re serious about their verbal commitment, nothing changes.</p><p>Paper it. Immediately. And validate all details are as agreed.</p><h3 id="3-dont-deviate-far-from-standard-terms">3. Don&apos;t Deviate Far From Standard Terms</h3><p>Weird terms create weird problems later.</p><p>If your salaries, equity grants, board rights, valuation, customer contracts, or investor terms are too far from normal ranges, future employees / customers / investors will ask: <em>&#x201C;why is this weird?&#x201D;</em></p><p>Find out what typical bounds look like. Pick a sensible spot in that range. Save your novelty for your product / solution.</p><h3 id="4-be-a-good-steward-of-capital">4. Be A Good Steward of Capital</h3><p><em>Won&#x2019;t someone think of the shareholders?</em></p><p>If you raised money, that&#x2019;s shareholder money, not your money. Treat it with respect. Protect it. Try to grow it. Cut waste aggressively.</p><p>You should be proud to show investors each line item on your income statement:</p><ul><li><em>&#x201C;Look what we built.&#x201D;</em></li><li><em>&#x201C;Look how little we spent doing it.&#x201D;</em></li><li><em>&#x201C;Look how capital-efficient we were.&#x201D;</em></li></ul><p>Keep offices austere. Revisit spend constantly. If you&#x2019;re technical, find technical deals: negotiate vendors, use spot instances where possible (often 70% savings), avoid shiny tooling that doesn&#x2019;t move the needle, etc.</p><p>We wouldn&apos;t have survived long enough to build a successful product (<a href="https://blog.forecastos.com/from-narratives-to-numbers-measuring-belief-at-scale-with-hivemind/">Hivemind</a> was our fourth product) if we weren&apos;t so careful with our finances.</p><p>In startups, survival is compounding. The longer you survive, the longer you have to find product-market fit, and the more likely you are to produce returns for shareholders. <strong>It&apos;s all about the shareholders.</strong></p><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2026/01/aijfvn.gif" class="kg-image" alt loading="lazy" width="360" height="270"></figure><h3 id="5-beware-the-most-dangerous-person-in-the-room">5. Beware The Most Dangerous Person in the Room</h3><p>Watch out for people in (senior) roles who don&apos;t deserve them on paper. They have the most to lose. </p><p>My experience has been they (by necessity) prioritize politics, posturing, and narrative management over outcomes. Expect them to behave accordingly. </p><p>You can sometimes spot them by:</p><ul><li>unimpressive schooling / grades in fields where it matters,</li><li>unimpressive experience,</li><li>exaggerated achievements,</li><li>shallow understanding of (and network in) the problem space,</li><li>a pattern of conflict (e.g. public lawsuits, accusations),</li><li>etc.</li></ul><p>Avoid working with them if possible, despite charisma and assurances. Remember: where there&#x2019;s smoke, there&#x2019;s fire. </p><h3 id="6-improve-health-to-improve-productivity">6. Improve Health to Improve Productivity</h3><p>The healthier you are, the higher your average speed. Being healthy isn&#x2019;t just self-care; it&#x2019;s throughput. As such:</p><ul><li>sleep +8 hours whenever possible,</li><li>do cardio and lift weights - a little goes a long way, and</li><li>work &lt;=60 hours a week (hands on keyboard).</li></ul><p>As a former investment banking analyst, I can confidently say the following about +60 hour work weeks:</p><ul><li>outside of doing god&apos;s work (i.e. rearranging logos in PowerPoint at 4 AM for a 9 AM meeting), they are not needed / productive,</li><li>your health (and output) will slowly degrade, and</li><li>your marginal hourly productivity will become negative. You aren&apos;t well enough rested to be clever.</li></ul><p>Every successful founder I know doesn&apos;t sustainably work more than 60 hours a week (hands on keyboard). </p><p>Work (sustainably) hard. Exercise. Rest. </p><p>It&apos;s a marathon, not a sprint.</p><h3 id="7-what-product-market-fit-pmf-feels-like">7. What Product-Market Fit (PMF) Feels Like</h3><p>Product-market fit is not a dashboard metric. It&#x2019;s a feeling. It&#x2019;s the moment selling flips from actively pushing your product to having it pulled from you.</p><ul><li><strong>You don&apos;t sell the product</strong>, you describe it / demo it. Buyers want it based on that alone.</li><li><strong>Buyers don&apos;t need to be educated</strong>. They are aware they have the problem you are solving and are actively trying to solve it.</li><li><strong>Buyers want to talk to you</strong>. Most schedule additional calls. Inbound interest picks up substantially.</li></ul><p><strong>To find PMF, find a painful, resourced problem.</strong></p><p>The best problems are:</p><ul><li>common in a specific niche,</li><li>valuable to solve,</li><li>known by customers; budget exists to solve it, and</li><li>currently solved badly.</li></ul><p>Solve that. Sell that.</p><p><strong>Listen to problems. Ignore proposed solutions.</strong></p><p>Customers are excellent at describing their problems but (often) bad at designing solutions.</p><p>As the old adage goes: to travel large distances quickly, people will ask for a faster horse, but what they need is a car. </p><p><strong>You can only do one thing well.</strong></p><p>That doesn&#x2019;t mean only try one thing. Try many things quickly. But once something hits (you&apos;ll feel the pull), focus on that.</p><h3 id="8-how-to-hire-extraordinary-employees">8. (How to) Hire Extraordinary Employees</h3><p>I have a lot to say about identifying and hiring top talent... BUT I think one heuristic that captures 80% of what is important is: <strong>extraordinary people do extraordinary things.</strong></p><p><strong>When looking to hire extraordinary employees, look for people with extraordinary accomplishments or achievements.</strong> That could be academic, athletic, or professional. Often achievement is not isolated, but repeated, and easy to identify.</p><p>Don&apos;t expect people without extraordinary achievements to do extraordinary things. While there are (many) exceptions, if they haven&apos;t produced extraordinary achievements by the time you are interviewing them, why would they start now? Answer: they probably won&apos;t.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Be honest with yourself. For the role you are filling, do you benefit from hiring someone truly extraordinary? Can you afford to? <br><br>If you&apos;re building a startup, you absolutely need your first several hires to be extraordinary (and you can compensate them appropriately with equity), but most jobs don&apos;t require this and most budgets don&apos;t allow for this.</div></div><p>With the above in mind, a few other things to be mindful of when hiring:</p><ul><li>Do you like them? You&apos;ll be spending +40 hours a week, every week, with them.</li><li>Do they want the job you are hiring for? If they don&apos;t, save the time you&apos;ll spend convincing / motivating them and find someone who does.</li><li>Do they have the right attitude and aptitude? Everything else can be taught.</li></ul><h3 id="9-avoid-complexity">9. Avoid Complexity</h3><p>You can only load so much context into a brain (or LLM, it turns out).</p><p>Complexity is a tax:</p><ul><li>harder to understand,</li><li>harder to debug,</li><li>harder to onboard,</li><li>harder to improve, and</li><li>easier to break.</li></ul><p>Simple is clever. Clever scales.</p><h3 id="10-there-can-only-be-one-founder-ceo">10. There Can Only Be One (Founder &amp; CEO)</h3><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2026/01/Screenshot-2026-01-27-at-9.29.44-pm.png" class="kg-image" alt loading="lazy" width="1192" height="586" srcset="https://charliereese.ca/content/images/size/w600/2026/01/Screenshot-2026-01-27-at-9.29.44-pm.png 600w, https://charliereese.ca/content/images/size/w1000/2026/01/Screenshot-2026-01-27-at-9.29.44-pm.png 1000w, https://charliereese.ca/content/images/2026/01/Screenshot-2026-01-27-at-9.29.44-pm.png 1192w" sizes="(min-width: 720px) 720px"></figure><p>Elon, Gates, Zuck, etc. With very few exceptions, successful companies (and governments) have one person at the top. </p><p>Co-founders are great; they work hard for less cash (and more equity), provide continuity should other co-founders burn out, etc. </p><p>But decision-making authority and clarity matter. If you have co-founders, decide who has final say. They become your company&apos;s benevolent dictator - the CEO. They become accountable for all top level decisions. They also become the shareholders&apos; <em>one throat to choke</em>.</p><h3 id="11-know-your-odds-of-success-be-good-enough-to-succeed">11. Know Your Odds of Success. Be Good Enough To Succeed</h3><p>In university level calculus - before grade inflation, <a href="https://www.urbandictionary.com/define.php?term=smh">smh</a> at you Gen Z - perhaps 50% of the class would fail the final. No one, and I mean no one, thought any of the top math students would be among the 50% that failed. And they never were. They were consistently at the top.</p><p>Startups are similar. Maybe 10% succeed. And it&#x2019;s often the top 10% of founders (and teams) that do.</p><p>Anecdotally, all of the most impressive entrepreneurs I know (who were also top decile in academics and work ethic) have succeeded. More or less everyone else failed, perhaps predictably.</p><p>Further, in business, like in Catan, they are many winning strategies. The best strategy for you depends on i) what you&apos;re top 10% at executing and ii) how the board is set.</p><p><strong>The uncomfortable takeaway</strong>: avoid games you are unlikely to win. Be honest about what you&#x2019;re top-tier at, and choose a game where that actually matters.</p><p>Two more practical angles below.</p><p><strong>A) Know What Success Requires: My Experience Biking Across the Country</strong></p><p>When I <a href="https://charliereese.ca/journey-for-jonny-biking-4-447km-trans-canada-for-cancer/">biked across the country</a>, I did napkin math on what success demanded: km/day, watts/hr, calories consumed, changes in wind resistance and power requirements due to elevation and headwinds (I went Toronto to Vancouver, into the wind), etc. </p><p>I did the math on what was needed. Then I trained until my fitness could meet or exceed that.</p><p>Companies are multivariate (i.e. many things matter), but the principle holds. Identify the 5-20 variables that actually determine your outcome (ROI, distribution, conversion, retention, product milestones, iteration velocity, hiring, etc.), measure them, then make sure you meet or exceed what&apos;s needed.</p><p>Easy in theory, hard in practice. But a helpful exercise nevertheless.</p><p><strong>B) Persistence Increases Odds of Success</strong></p><p><em>&#x201C;Never give up&#x201D;</em> is not a strategy. But persistence plus learning is powerful. Survival buys you attempts. Attempts buy you luck. Luck buys you outcomes.</p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text"><strong>A final note</strong>: no matter what you do, success typically requires both building and selling. You need top-tier capability in both.</div></div><h3 id="12-the-central-limit-theorem-of-advice">12. The Central Limit Theorem of Advice</h3><p>Repeated advice is good advice. </p><p>Everyone is searching for the secret insight they&#x2019;re missing. In practice, you&#x2019;ve probably already heard the advice you need - multiple times.</p><p>Pay attention to what you hear most often. That&#x2019;s the signal.</p><hr><p>Consider the above an n=1 sample from an infinite number of viewpoints on principles for your career / business. </p><p>Take what&#x2019;s helpful. Ignore the rest.</p><p><strong>Remember</strong>: these thoughts are worth what you paid for them ;)</p>]]></content:encoded></item><item><title><![CDATA[Q4 2024 Update: Growing ForecastOS]]></title><description><![CDATA[<p>Hey y&apos;all!</p><p>It&apos;s been a while since my last personal newsletter.</p><p>Today, I&apos;m excited to update you on:</p><ol><li>The status of ForecastOS (which I founded a year ago)</li><li>How I&apos;m avoiding getting fat in my 30s</li><li>What we&apos;re considering for</li></ol>]]></description><link>https://charliereese.ca/q4-2024-update-growing-forecastos/</link><guid isPermaLink="false">6732fadeda87150864256d36</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Tue, 12 Nov 2024 09:43:49 GMT</pubDate><content:encoded><![CDATA[<p>Hey y&apos;all!</p><p>It&apos;s been a while since my last personal newsletter.</p><p>Today, I&apos;m excited to update you on:</p><ol><li>The status of ForecastOS (which I founded a year ago)</li><li>How I&apos;m avoiding getting fat in my 30s</li><li>What we&apos;re considering for our next car</li><li>Embracing my founder personality traits</li></ol><h3 id="1-the-status-of-forecastos">1. The status of ForecastOS</h3><p>I founded <a href="https://forecastos.com/">ForecastOS</a> in September 2023.</p><p>The goal of the company remains largely the same: providing data and software solutions to institutional investors and finance professionals. Our offering is a mix of open-source software, financial SaaS (Software as a Service), and data as a service. </p><p>Our goal continues to be to build quant-first offerings otherwise similar to the giants in the space, like Bloomberg, FactSet, MSCI, S&amp;P Global, and/or LSEG. It would be an understatement to say that we still have a lot of work to do!</p><p>But despite being a small team of 2, we&apos;ve made good progress in the past year:</p><p>A) Our annualized run-rate revenue is over C$200,000, admittedly ahead of where we hoped to be in Q4, and over 10x where we were a year prior. </p><p>B) We&apos;re ready to kick off a Q1 2025 seed round fundraising process to help us grow the team to 5 to accelerate sales, product, and dataset development. </p><p>C) We&apos;ve reached several meaningful milestones: </p><ul><li>Our investment system of record application (we call it Skylight) is ready for institutional use</li><li>We&apos;ve made +1000 features for ML-driven financial forecasts available. They can be consumed anywhere in 1 line of code through <a href="https://forecastos.com/">ForecastOS</a> FeatureHub</li><li>We&apos;ve advanced our open-source portfolio engineering and backtesting framework <a href="https://investos.io/">InvestOS</a></li><li>We&apos;ve created a couple proprietary financial datasets that we&apos;re testing for alpha</li><li>We&apos;ve developed a <a href="https://blog.forecastos.com/pricing-datasets-for-quantitative-investors/">process to price / value datasets</a></li><li>We&apos;ve released a <a href="https://www.youtube.com/watch?v=iqFLnNzur44">~13 minute demo</a> building and backtesting an ML-powered market and factor neutral quantitative investment strategy using ForecastOS FeatureHub and InvestOS; what used to take an institutional team a full year now takes minutes!</li></ul><p>With the above said, there couldn&apos;t be more left to do. </p><p>If you know anyone who can <strong>help build the next great software and data company</strong> for institutional investors and finance professionals - <em>a systematic institutional investor, savvy VC, or quant finance engineer</em> - please let me know!</p><h3 id="2-how-im-avoiding-getting-fat-in-my-30s">2. How I&apos;m avoiding getting fat in my 30s</h3><p>If you&apos;ve visited my wife and I in BC, you probably know that we have a garage gym. Because of this, I was reluctant to join a gym near our office in Vancouver (despite packing on some wedding-season lbs). </p><p>That was a mistake that I have since corrected. I found a great $60 / month gym downtown that&apos;s never busy at lunch. I&apos;d tell you, but then it might get busy... so you&apos;ll just have to take my word for it.</p><p>I&apos;m not sure there is a better way to reinvigorate yourself than a quick lunch workout. I wish I could be an early morning person and work out at 6:00 AM everyday (which I&apos;ve done with moderate success for various stretches of time), but that habit never seemed to stick for me. Lunch time workouts, however, are easy to stick to.</p><p><strong>A quick note</strong>: I can&apos;t explain why, and I haven&apos;t deeply investigated this, but lifting weights meaningfully reduces my stress levels. Picking up heavy things calms the mind in a way that cardio doesn&apos;t. Much like cardio gives me energy that lifting weights doesn&apos;t. </p><h3 id="3-what-were-considering-for-our-next-car">3. What we&apos;re considering for our next car</h3><p>For the last several years I&apos;ve been interested in road fatality statistics in relation to the cars people choose to drive. </p><p>The data I&apos;ve seen suggests you&apos;re <a href="https://www.iihs.org/ratings/driver-death-rates-by-make-and-model">an order of magnitude less likely to die in a midsize luxury SUV vs a common compact car</a>, although there might be some selection bias at play.</p><p>To me, it seems sensible to chose to drive a car that meaningfully reduces your chance of early fatality. Heavy cars generally do that, albeit while increasing risk for other road users. Given this, it seems odd that car manufacturers like Rivian are allowed to release +6000 lbs EVs to the masses!</p><p>All this is to say: our next car will likely be a Volvo :)</p><h3 id="4-embracing-my-founder-personality-traits">4. Embracing my founder personality traits</h3><p>I&apos;ve always (I think rightfully) thought of founders as: </p><ul><li>difficult, </li><li>stubborn, </li><li>machiavellian, and </li><li>ruthless.</li></ul><p>However, when the aforementioned bad traits are mixed with: </p><ul><li>obsessive work ethic, </li><li>competitiveness, </li><li>skill / creativity / curiosity / insight (developed from years of relevant work and exploration),</li><li>long-term orientation, </li><li>honesty, and </li><li>a sense of justice, </li></ul><p>you have the makings of a great founder.</p><p>My experience has been that you rarely find successful founders without both the good and bad traits I&apos;ve listed above. Further, I think some of the bad founder traits are just as necessary as the good founder traits. </p><p>Without some of the bad traits, it&apos;s too easy to be pushed off the ball. If you aren&apos;t at least a little stubborn or machiavellian, you&apos;re more likely to accept the status quo and/or undersell yourself, both of which are behaviours that are unlikely to lead to success.</p><p>Similarly, founders with few of the good traits seem to flame out around seed / series A; it&apos;s hard to build a successful business if you don&apos;t deeply understand the problem space, aren&apos;t deeply committed, and aren&apos;t deeply respected by your staff.</p><p><strong>All this is to say</strong>: I seem to have some of the bad founder traits. I&apos;ve spent my life working around them, managing them, and apologizing for them. And to be clear, I think people with those traits should cultivate the ability to manage them; if you can&apos;t control your behaviour, it controls you.</p><p>Fortunately, I seem to also have the good founder traits. And as a founder, I&apos;m finally accepting both the good and bad traits as part of who I am and who I need to be. </p><p>I feel fortunate to be in a role where I get the chance to be myself. To put my good and bad traits to work for fun and profit. </p><p>It feels natural.</p><hr><p>Until next time - your friend in Vancouver,</p><p>Charlie</p>]]></content:encoded></item><item><title><![CDATA[Sep 2023 Update: Building ForecastOS]]></title><description><![CDATA[<blockquote><em>Quick note: <strong>I created this monthly</strong>(ish)<strong> update</strong> <strong>to keep in touch with friends and family</strong> outside of social media. If you don&#x2019;t want to receive these updates, please let me know :)</em></blockquote><p>Hey y&apos;all!</p><p>The middle half of 2023 has been busy! I&apos;ve been</p>]]></description><link>https://charliereese.ca/q3-2023-update-building-forecastos/</link><guid isPermaLink="false">64f79ba5da8715086425688f</guid><category><![CDATA[monthly-update]]></category><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Wed, 06 Sep 2023 00:20:00 GMT</pubDate><content:encoded><![CDATA[<blockquote><em>Quick note: <strong>I created this monthly</strong>(ish)<strong> update</strong> <strong>to keep in touch with friends and family</strong> outside of social media. If you don&#x2019;t want to receive these updates, please let me know :)</em></blockquote><p>Hey y&apos;all!</p><p>The middle half of 2023 has been busy! I&apos;ve been fortunate to spend a lot of time in Toronto over the last several months, which has been a treat; I&apos;ve been able to see many of you!</p><p>As is becoming the norm with my email updates, I have 3 fun things to share from the last 6 months:</p><ol><li>Building ForecastOS and InvestOS</li><li>Getting married</li><li>Riding Lord of the Squirrels</li></ol><h2 id="1-building-forecastos-and-investos">1. Building ForecastOS and InvestOS</h2><p>It has been a poorly kept secret for the last 5 months that I&apos;ve been working with <a href="https://delphia.com/">Delphia</a> and <a href="https://www.oraclealpha.com/">Oracle Alpha</a> to create and spin out a new software company.<br><br>On day 1, the idea was to create a portfolio optimization and backtesting solution for quantitative investors. It has since evolved into two offerings:</p><ul><li><a href="https://forecastos.com/">ForecastOS</a>, our SaaS solution for simplifying and managing financial forecasting / AI</li><li><a href="https://investos.io/">InvestOS</a>, our open-source, extensible portfolio optimization and backtesting solution, which integrates with ForecastOS</li></ul><p>So what are they, in more detail?</p><p><strong><a href="https://forecastos.com/">ForecastOS</a></strong> allows anyone, even non technical executives, to understand, analyze, audit, backtest, and (dare I say) manage their financial forecasts through a friendly UI without changing their current solution at all; it plugs into existing financial machine learning pipelines and ties datasets, features, forecasts, and portfolio optimizations / backtests together.</p><p>The result is more collaboration, more predictive ideas, better forecast performance, better understanding of and willingness to take risk / deploy capital, and easier to manage AI.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://charliereese.ca/content/images/2023/09/backtest.png" class="kg-image" alt loading="lazy" width="2000" height="1139" srcset="https://charliereese.ca/content/images/size/w600/2023/09/backtest.png 600w, https://charliereese.ca/content/images/size/w1000/2023/09/backtest.png 1000w, https://charliereese.ca/content/images/size/w1600/2023/09/backtest.png 1600w, https://charliereese.ca/content/images/size/w2400/2023/09/backtest.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>ForecastOS backtest screenshot</figcaption></figure><p><strong><a href="https://investos.io/">InvestOS</a></strong>, on the other hand, is an open-source (i.e. free) Python module for portfolio optimization and backtesting. It integrates with ForecastOS, but exists independently.</p><p>I&apos;ll spare you further details and possible (likely?) boredom... but if your eyes didn&apos;t just glaze over and roll into the back of your head, or if finance is your thing, <strong>I invite you to <a href="https://blog.forecastos.com/#/portal/signup/free">follow and subscribe</a> to weekly updates on the ForecastOS journey!</strong></p><div class="kg-card kg-button-card kg-align-left"><a href="https://blog.forecastos.com/#/portal/signup/free" class="kg-btn kg-btn-accent">Subscribe to ForecastOS Updates</a></div><h2 id="2-getting-married">2. Getting married</h2><p>On April 21, 2023, I got married to Jacqueline, the love of my life, at the top of Grouse Mountain, overlooking Vancouver.</p><p>They say a picture is worth a thousand words, so here are a few of my favourites:</p><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/33859596-050E-4D2F-93EF-5EE0A4F61A4B_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="724" height="1086" srcset="https://charliereese.ca/content/images/size/w600/2023/09/33859596-050E-4D2F-93EF-5EE0A4F61A4B_1_105_c.jpeg 600w, https://charliereese.ca/content/images/2023/09/33859596-050E-4D2F-93EF-5EE0A4F61A4B_1_105_c.jpeg 724w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/3881203B-C4CE-497D-A8E0-3BC41A25AC26_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="1086" height="724" srcset="https://charliereese.ca/content/images/size/w600/2023/09/3881203B-C4CE-497D-A8E0-3BC41A25AC26_1_105_c.jpeg 600w, https://charliereese.ca/content/images/size/w1000/2023/09/3881203B-C4CE-497D-A8E0-3BC41A25AC26_1_105_c.jpeg 1000w, https://charliereese.ca/content/images/2023/09/3881203B-C4CE-497D-A8E0-3BC41A25AC26_1_105_c.jpeg 1086w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/867A18B0-6A11-49AF-994B-9C5ED368C768_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="1086" height="724" srcset="https://charliereese.ca/content/images/size/w600/2023/09/867A18B0-6A11-49AF-994B-9C5ED368C768_1_105_c.jpeg 600w, https://charliereese.ca/content/images/size/w1000/2023/09/867A18B0-6A11-49AF-994B-9C5ED368C768_1_105_c.jpeg 1000w, https://charliereese.ca/content/images/2023/09/867A18B0-6A11-49AF-994B-9C5ED368C768_1_105_c.jpeg 1086w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/DA2A2748-6607-47D2-9801-08CB8FD4CCD6_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="1086" height="724" srcset="https://charliereese.ca/content/images/size/w600/2023/09/DA2A2748-6607-47D2-9801-08CB8FD4CCD6_1_105_c.jpeg 600w, https://charliereese.ca/content/images/size/w1000/2023/09/DA2A2748-6607-47D2-9801-08CB8FD4CCD6_1_105_c.jpeg 1000w, https://charliereese.ca/content/images/2023/09/DA2A2748-6607-47D2-9801-08CB8FD4CCD6_1_105_c.jpeg 1086w" sizes="(min-width: 720px) 720px"></figure><h2 id="3-riding-lord-of-the-squirrels">3. Riding Lord of the Squirrels</h2><p>There always has to be a biking update. It&apos;s a law of the universe. I wish it wasn&apos;t so.</p><p>Several weeks ago I rode the famous Mount Sproatt trail Lord of the Squirrels for the first time! In between leg-numbing climbing and descending, I captured some beautiful pictures and video. Check them out below!</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/abh9Pl5Bj0M?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Lord of the Squirrels - Full Descent into Whistler"></iframe></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/599CE19C-1486-44D9-A221-3E23CAD141E9_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="1024" height="769" srcset="https://charliereese.ca/content/images/size/w600/2023/09/599CE19C-1486-44D9-A221-3E23CAD141E9_1_105_c.jpeg 600w, https://charliereese.ca/content/images/size/w1000/2023/09/599CE19C-1486-44D9-A221-3E23CAD141E9_1_105_c.jpeg 1000w, https://charliereese.ca/content/images/2023/09/599CE19C-1486-44D9-A221-3E23CAD141E9_1_105_c.jpeg 1024w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/E0782F35-885A-46AA-BE5E-A021D043594A_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="768" height="1024" srcset="https://charliereese.ca/content/images/size/w600/2023/09/E0782F35-885A-46AA-BE5E-A021D043594A_1_105_c.jpeg 600w, https://charliereese.ca/content/images/2023/09/E0782F35-885A-46AA-BE5E-A021D043594A_1_105_c.jpeg 768w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2023/09/56048F0D-F3B9-40DD-BD32-ED0E5C7C08A5_1_105_c.jpeg" class="kg-image" alt loading="lazy" width="768" height="1024" srcset="https://charliereese.ca/content/images/size/w600/2023/09/56048F0D-F3B9-40DD-BD32-ED0E5C7C08A5_1_105_c.jpeg 600w, https://charliereese.ca/content/images/2023/09/56048F0D-F3B9-40DD-BD32-ED0E5C7C08A5_1_105_c.jpeg 768w" sizes="(min-width: 720px) 720px"></figure><hr><p>Until next time!</p><p>Your friend in Vancouver,</p><p>Charlie</p>]]></content:encoded></item><item><title><![CDATA[MTB Racing, Founderpath, and a Wedding]]></title><description><![CDATA[<p>It&apos;s been a while since I&apos;ve written. Almost exactly a year, to be precise.</p><p>I&apos;ve missed writing as a creative medium, and as a way to share updates and research. I hope to share more with you all - friends, family, and likeminded individuals</p>]]></description><link>https://charliereese.ca/mtb-racing-founderpath-and-wedding-season/</link><guid isPermaLink="false">634cb50787372125e8878ee4</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Mon, 17 Oct 2022 04:59:56 GMT</pubDate><content:encoded><![CDATA[<p>It&apos;s been a while since I&apos;ve written. Almost exactly a year, to be precise.</p><p>I&apos;ve missed writing as a creative medium, and as a way to share updates and research. I hope to share more with you all - friends, family, and likeminded individuals on the internet - going forward!</p><p><strong>Updates</strong>:</p><ol><li>My GoPro footage from <strong><a href="https://youtu.be/vdark-I8HzQ">racing in the Norco Canadian Enduro Series</a></strong> (NCES) on Vancouver Island</li><li>A cursory review of the <strong>progress</strong> made to date at <strong>Founderpath</strong> from an <strong>analytics</strong> perspective</li><li><strong>Jacqueline and I are getting married</strong> April 2023 (for those of you who don&apos;t know)!</li></ol><h2 id="1-racing-in-the-norco-canadian-enduro-series-on-vancouver-island">1. Racing in the Norco Canadian Enduro Series on Vancouver Island</h2><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/10/nces-cumberland-enduro-2022-smallest.png" class="kg-image" alt loading="lazy" width="640" height="428" srcset="https://charliereese.ca/content/images/size/w600/2022/10/nces-cumberland-enduro-2022-smallest.png 600w, https://charliereese.ca/content/images/2022/10/nces-cumberland-enduro-2022-smallest.png 640w"></figure><p>Since moving to the west coast of Canada (and settling down in Vancouver / Port Moody), I&apos;ve gotten (really) into mountain biking. So into it, that a couple buddies and I entered a Cumberland / Mt Washington 2-day enduro race.</p><p>It was an exciting, humbling experience. I came almost last &#xA0;&#xAF;\_(&#x30C4;)_/&#xAF; </p><p>You can check out a video of the first day of racing here: <a href="https://youtu.be/vdark-I8HzQ">https://youtu.be/vdark-I8HzQ</a>. My favourite stage (to ride and watch) was stage 4.</p><h2 id="2-analytics-progress-at-founderpath">2. Analytics Progress at Founderpath</h2><p>When I moved to BC, I unfortunately wasn&apos;t able to keep my quant finance job at CPP Investments. Fortunately, I found a great opportunity at Founderpath as the Head of Strategy (although <em>[random-senior-title]</em> of Quant Finance / Data Science is probably a more apt description). <a href="https://founderpath.com/">Founderpath provides recurring revenue advances</a> to SaaS companies (often with $200k - $20MM ARR).</p><p>It has been 10 months since I joined. Since joining, I&apos;ve spent most of my time A) creating a distributed data pipeline, and B) forecasting <em>mostly credit-related ML</em> outcomes for SaaS companies. </p><p>The aforementioned pipeline is now serving (via API) almost all of the data used, consumed, and displayed by the Founderpath app - for thousands of private SaaS companies! Further, since implementation, the accuracy of our analytics tools has drastically increased, and the amount of time it takes to ingest and prepare new users&apos; data has drastically decreased!</p><p>Now that our data is cleaner and more accurate, I&apos;ll be able to continue iterating on research to better forecast default events / credit risk - of which great progress has been made to date!</p><h2 id="3-jacqueline-and-i-are-getting-married-april-2023">3. Jacqueline and I Are Getting Married April 2023</h2><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/10/prop.png" class="kg-image" alt loading="lazy" width="1024" height="576" srcset="https://charliereese.ca/content/images/size/w600/2022/10/prop.png 600w, https://charliereese.ca/content/images/size/w1000/2022/10/prop.png 1000w, https://charliereese.ca/content/images/2022/10/prop.png 1024w" sizes="(min-width: 720px) 720px"></figure><p><strong>Saving the best for last</strong>: for those of you who don&apos;t know, Jacqueline said <em>&quot;Yes&quot; </em>in August of 2021!!! We couldn&apos;t be more excited to be getting married in April 2023 at the top of Grouse Mountain &#x1F60A;</p>]]></content:encoded></item><item><title><![CDATA[Journey For Jonny: Biking 4,447km Trans-Canada For Cancer]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png" class="kg-image" alt loading="lazy" width="1862" height="1600" srcset="https://charliereese.ca/content/images/size/w600/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1000w, https://charliereese.ca/content/images/size/w1600/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1600w, https://charliereese.ca/content/images/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1862w" sizes="(min-width: 720px) 720px"></figure><p>From August 7 to 28 (2021), I biked 4,447km from Toronto to Vancouver to raise money for The Canadian Cancer Society and The <a href="https://www.instagram.com/jonnykellockfoundation/?hl=en">Jonny Kellock Foundation</a>. The journey was in memory of all Canadian cancer victims, like my dear friend <a href="https://www.instagram.com/jonnykellock/?hl=en">Jonny Kellock</a>.</p><p><strong>This article includes:</strong></p><ol><li>Ride itinerary (with links</li></ol>]]></description><link>https://charliereese.ca/journey-for-jonny-biking-4-447km-trans-canada-for-cancer/</link><guid isPermaLink="false">61dd2ad846dbae1df7ea715b</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Thu, 02 Sep 2021 06:05:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png" class="kg-image" alt loading="lazy" width="1862" height="1600" srcset="https://charliereese.ca/content/images/size/w600/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1000w, https://charliereese.ca/content/images/size/w1600/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1600w, https://charliereese.ca/content/images/2022/01/Screenshot-2022-01-10-at-11.28.46-PM.png 1862w" sizes="(min-width: 720px) 720px"></figure><p>From August 7 to 28 (2021), I biked 4,447km from Toronto to Vancouver to raise money for The Canadian Cancer Society and The <a href="https://www.instagram.com/jonnykellockfoundation/?hl=en">Jonny Kellock Foundation</a>. The journey was in memory of all Canadian cancer victims, like my dear friend <a href="https://www.instagram.com/jonnykellock/?hl=en">Jonny Kellock</a>.</p><p><strong>This article includes:</strong></p><ol><li>Ride itinerary (with links to Strava activities)</li><li>Where I shared updates</li><li>A note / thank you from me (written after the final ride)</li></ol><hr><h3 id="ride-itinerary">Ride Itinerary</h3><p>Ride 1 (Aug 7): <a href="https://www.strava.com/activities/5755811462">Toronto &gt; Tobermory</a> (338km)</p><p>Ride 2: <a href="https://www.strava.com/activities/5761710198">Tobermory &gt; Ferry to South Baymouth &gt; Thessalon</a> (264km)</p><p>Ride 3: <a href="https://www.strava.com/activities/5766900436">Thessalon &gt; Michipicoten</a> (303km)</p><p>Ride 4: <a href="https://www.strava.com/activities/5772656396">Michipicoten &gt; Terrace Bay</a> (259km)</p><p>Ride 5: <a href="https://www.strava.com/activities/5778160380">Terrace Bay &gt; Thunder Bay</a> (201km)</p><p><em>Day off 1 (Aug 12): in Thunder Bay</em></p><p>Rides 1 to 5: 1,365km</p><p>Ride 6: <a href="https://www.strava.com/activities/5788270980">Thunder Bay &gt; Ignace</a> (237km)</p><p>Ride 7: <a href="https://www.strava.com/activities/5793835699">Ignace &gt; Kenora</a> (242km)</p><p>Ride 8: Kenora &gt; Elie | <a href="https://www.strava.com/activities/5799243897">part A</a> and <a href="https://www.strava.com/activities/5799856756">part B</a> (257km)</p><p>Ride 9: <a href="https://www.strava.com/activities/5804401590">Elie &gt; Virden</a> (240km)</p><p>Ride 10: <a href="https://www.strava.com/activities/5810124902">Virden &gt; Regina</a> (280km)</p><p><em>Day off 2 (Aug 18): in Regina</em></p><p>Rides 6 to 10: 1,256km</p><p>Ride 11: <a href="https://www.strava.com/activities/5820968086">Regina &gt; Swift Current</a> (245km)</p><p>Ride 12: <a href="https://www.strava.com/activities/5825889136">Swift Current &gt; Medicine Hat</a> (221km)</p><p>Ride 13: Medicine Hat &gt; Strathmore | <a href="https://www.strava.com/activities/5831026840">part A</a> and <a href="https://www.strava.com/activities/5831967575">part B</a> (246km)</p><p>Ride 14: <a href="https://www.strava.com/activities/5837590342">Strathmore &gt; Banff</a> (186km)</p><p><em>Day off 3 (Aug 23): in Banff</em></p><p>Rides 11 to 14: 898km</p><p>Ride 15: <a href="https://www.strava.com/activities/5848311575">Banff &gt; Rogers Pass</a> (232km)</p><p>Ride 16: <a href="https://www.strava.com/activities/5854077250">Rogers Pass &gt; Shuswap</a> (210km; forest fire smoke ended ride a little early)</p><p>Ride 17: <a href="https://www.strava.com/activities/5859489084">Kamloops &gt; Boston Bar</a> and <a href="https://www.strava.com/activities/5859688391">forest fire make-up laps</a> (258km)</p><p>Ride 18 (Aug 27): <a href="https://www.strava.com/activities/5864301945">Boston Bar &gt; Vancouver</a> (227km)</p><p>Rides 15 to 18: 927km</p><h3 id="where-i-shared-updates">Where I Shared Updates</h3><ul><li><a href="https://www.strava.com/athletes/68833302">Strava</a>: for activity stats from daily rides</li><li><a href="https://www.instagram.com/jcharlesreese/">Instagram</a>: for pictures and videos from daily rides</li></ul><h3 id="a-note-thank-you-from-me">A Note / Thank You From Me</h3><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/IMG_5407--1-.png" class="kg-image" alt loading="lazy" width="960" height="1280" srcset="https://charliereese.ca/content/images/size/w600/2022/01/IMG_5407--1-.png 600w, https://charliereese.ca/content/images/2022/01/IMG_5407--1-.png 960w" sizes="(min-width: 720px) 720px"></figure><p>We made it! Toronto to Vancouver. 4,447 kilometres cycled over 3 weeks.</p><p>I cannot think of a more intense way to celebrate Jonny, and explore the mountains he loved to surround himself with, than this journey.</p><p>Jonny was an adventurous, accomplished (yet humble), hard-working, and light-hearted person. I miss having him around, cracking jokes, and sharing a laugh. I know many of you do too.</p><p>To everyone who donated in his memory, joined me for part of the ride, provided encouragement, and shared the journey: thank you, thank you, thank you. As of today, over $29,000 has been donated to the Jonny Kellock Foundation and the Canadian Cancer Society.</p><p>A special thanks to 1) my fianc&#xE9; Jacqueline, 2) the Kellock family, and 3) the Jonny Kellock Foundation. Your encouragement, advice, and assistance made the Journey For Jonny possible. Without you, it would not have been.</p><p>Thank you all &lt;3</p>]]></content:encoded></item><item><title><![CDATA[Y Combinator - Top 50 Software Startups]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image.png" class="kg-image" alt loading="lazy" width="170" height="240"></figure><p>This article contains a list of the top 50 YC software startups (sourced from the October 2019 YC Top Companies page). It also contains aggregated statistics for valuations and back-end programming languages used.</p><p>Values in this article are sourced, but I cannot guarantee their accuracy.</p><p>Find me <a href="https://twitter.com/charlieinthe6">on Twitter @charlieinthe6</a></p>]]></description><link>https://charliereese.ca/y-combinator-top-50-software-startups/</link><guid isPermaLink="false">61dd2cd046dbae1df7ea718f</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Mon, 14 Sep 2020 06:10:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image.png" class="kg-image" alt loading="lazy" width="170" height="240"></figure><p>This article contains a list of the top 50 YC software startups (sourced from the October 2019 YC Top Companies page). It also contains aggregated statistics for valuations and back-end programming languages used.</p><p>Values in this article are sourced, but I cannot guarantee their accuracy.</p><p>Find me <a href="https://twitter.com/charlieinthe6">on Twitter @charlieinthe6</a>. View <a href="https://news.ycombinator.com/item?id=24279611">article comments on HackerNews</a>.</p><p><strong>Table of Contents:</strong></p><ol><li>Top 50 Software Startups</li><li>Aggregated Stats</li></ol><h2 id="1-top-50-software-startups">1. Top 50 Software Startups:</h2><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Company</th>
<th>Latest val ($MM)</th>
<th>Initial back-end language(s)</th>
<th>DataSci / LowLv</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://stripe.com">Stripe</a>: <br>Payment / economic infrastructure for internet</td>
<td>36,000 <small> <a href="https://detroit.cbslocal.com/2020/08/11/general-motors-cfo-exits-suddenly-for-silicon-valley/">source</a> </small></td>
<td>Ruby <small> <a href="https://qr.ae/pN2pJk">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://getcruise.com">Cruise</a>: <br>Building self-driving car tech</td>
<td>19,000 <small> <a href="https://www.thedrive.com/tech/27872/gm-cruise-divisions-new-1b-investment-sets-valuation-at-staggering-19b">source</a> </small></td>
<td>C++, Python <small> <a href="https://angel.co/company/cruise-automation/jobs/757823-staff-deep-learning-optimization-engineer">source</a>, <a href="https://angel.co/company/cruise-automation/jobs/841627-staff-software-engineer-c-frameworks">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://airbnb.com">Airbnb</a>: <br>Marketplace to rent someone&#x2019;s room</td>
<td>18,000 <small> <a href="https://sanfrancisco.cbslocal.com/2020/08/11/airbnb-ipo-reportedly-close-to-filing-wsj/">source</a> </small></td>
<td>Ruby <small> <a href="https://www.forbes.com/sites/quora/2018/02/20/what-technology-stack-does-airbnb-use/#448ff4184025">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://doordash.com">DoorDash</a>: <br>Food delivery</td>
<td>16,000 <small> <a href="https://www.cnn.com/2020/06/18/tech/doordash-funding-valuation/index.html">source</a> </small></td>
<td>Python <small> <a href="https://medium.com/@DoorDash/implementing-rest-apis-with-embedded-privacy-a2394dc4dceb">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://twitch.tv">Twitch</a>: <br>Gaming video platform / community</td>
<td>15,000 <small> <a href="https://www.cnbc.com/2020/06/16/amazon-media-assets-worth-500-billion-almost-as-much-as-aws-needham.html#:~:text=To%20get%20to%20%24500%20billion,business%20is%20at%20%243.8%20billion.">source</a> </small></td>
<td>C++, Ruby <small> <a href="https://blog.twitch.tv/en/2015/12/18/twitch-engineering-an-introduction-and-overview-a23917b71a25/">source</a> (founded before Go)</small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://instacart.com">Instacart</a>: <br>Grocery pick-up / delivery</td>
<td>13,700 <small> <a href="https://techcrunch.com/2020/06/11/instacart-raises-225-million-at-13-7-billion-valuation/">source</a> </small></td>
<td>Ruby <small> <a href="https://stackshare.io/posts/the-tech-behind-instacarts-grocery-delivery-service">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://dropbox.com">Dropbox</a>: <br>File hosting / syncing</td>
<td>8000 (market cap @ Aug 2020) <small> <a href="https://finance.yahoo.com/quote/DBX?p=DBX">source</a> </small></td>
<td>Python <small> <a href="https://eranki.tumblr.com/post/27076431887/scaling-lessons-learned-at-dropbox-part-1">source</a> </small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://coinbase.com">Coinbase</a>: <br>Cryptocurrency exchange</td>
<td>8,000 <small> <a href="https://www.coindesk.com/coinbase-existing-valuation-doesnt-need-ipo-lawyer-says">source</a> </small></td>
<td>Ruby <small> <a href="https://blog.coinbase.com/scaling-connections-with-ruby-and-mongodb-99204dbf8857">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://gusto.com">Gusto</a>: <br>Employee payroll and benefits</td>
<td>3,800 <small> <a href="https://www.forbes.com/sites/donnafuscaldo/2019/07/24/gusto-amasses-3-8-billion-valuation-with-latest-fundraising-round/#50e7fa8d2820">source</a> </small></td>
<td>Ruby <small> <a href="https://boards.greenhouse.io/gusto/jobs/1337386?t=bae6d7cd1">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://rappi.com">Rappi</a>: <br>On-demand delivery</td>
<td>3,500 <small> <a href="https://techcrunch.com/2020/04/08/ifood-merges-with-delivery-heros-domicilios-com-to-challenge-rappi-in-colombia/">source</a> </small></td>
<td>Go, Node, Python, Java <small> <a href="https://www.rappi.com/jobs/position-detail?id=b88ad33f-7ad5-4e3b-8ecb-f13a3cce3a6a&amp;lang=lang">source</a> (may have used PHP - no source)</small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://flexport.com">Flexport</a>: <br>Freight forwarding platform</td>
<td>3,200 <small> <a href="https://www.joc.com/technology/wework-spanner-flexports-works_20191021.html">source</a> </small></td>
<td>Ruby <small> <a href="https://stackshare.io/posts/how-flexport-builds-software-to-move-over-1-billion-dollars-in-merchandise">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://reddit.com">Reddit</a>: <br>Online network of communities</td>
<td>3,000 <small> <a href="https://techcrunch.com/2019/02/11/reddit-300-million/">source</a> </small></td>
<td>Lisp <small> <a href="http://www.aaronsw.com/weblog/rewritingreddit">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://about.gitlab.com">GitLab</a>: <br>DevOps platform</td>
<td>2,750 <small> <a href="https://www.forbes.com/sites/alexkonrad/2019/09/17/gitlab-doubles-valuation-to-nearly-3-billion/#483591ce1794">source</a> </small></td>
<td>Ruby <small> <a href="https://about.gitlab.com/blog/2018/10/29/why-we-use-rails-to-build-gitlab/">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://brex.com">Brex</a>: <br>Corporate credit cards</td>
<td>2,750 <small> <a href="https://techcrunch.com/2020/05/19/brex-brings-on-150m-in-new-cash-in-case-of-an-extended-recession/">source</a> </small></td>
<td>Elixir <small> <a href="https://medium.com/brexeng/why-brex-chose-elixir-fe1a4f313195">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://pagerduty.com">PargerDuty</a>: <br>SaaS incident response platform</td>
<td>2,270 <small> <a href="https://www.google.com/search?tbm=fin&amp;q=NYSE:+PD&amp;stick=H4sIAAAAAAAAAONgecRowS3w8sc9YSn9SWtOXmPU5OIKzsgvd80rySypFJLmYoOyBKX4uXj10_UNDdOyCwszkotLeBaxcvhFBrtaKQS4AAASRGHASAAAAA&amp;sa=X&amp;ved=2ahUKEwjCtra68ZbrAhUYXc0KHdn_DoAQ3ecFMAB6BAhqEBc&amp;biw=1278&amp;bih=968#scso=_Z4c0X5TmCsjOtQbEu5zQAQ1:0">source</a> </small></td>
<td>Ruby <small> <a href="https://www.pagerduty.com/blog/elixir-at-pagerduty/">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://checkr.com">Checkr</a>: <br>Background checks</td>
<td>2,200 <small> <a href="https://www.forbes.com/sites/bizcarson/2019/09/19/checkr-background-funding-round/#552c8c845460">source</a> </small></td>
<td>Ruby <small> <a href="https://engineering.checkr.com/yet-another-attempt-at-faster-builds-caching-db-schema-efe63d367f5">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://podium.com">Podium</a>: <br>Interaction management platform</td>
<td>1,500 <small> <a href="https://techcrunch.com/2020/04/07/utahs-podium-raises-125m-series-c-led-by-yc-after-reaching-100m-arr/">source</a> </small></td>
<td>Ruby <small> <a href="https://devchat.tv/elixir-mix/emx-072-people-centered-solutions-with-travis-elnicky/">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://segment.com">Segment</a>: <br>Customer data platform</td>
<td>1,500 <small> <a href="https://www.bloomberg.com/news/articles/2019-04-02/startup-segment-is-worth-1-5-billion-thanks-to-companies-troves-of-customer-data">source</a> </small></td>
<td>Go, JS <small> <a href="https://www.workatastartup.com/companies/88">source</a>, <a href="https://angel.co/company/segment/jobs/348613-senior-software-engineer">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://docker.com">Docker</a>: <br>Build / deliver software in containers</td>
<td>1000 est. <small> <a href="https://techcrunch.com/2019/11/13/mirantis-acquires-docker-enterprise/">source</a>, <a href="https://techcrunch.com/2018/10/15/docker-has-raised-92-million-in-new-funding/">source</a> </small></td>
<td>Go <small> <a href="https://thenewstack.io/go-programming-language-helps-docker-container-ecosystem/">source</a>, <a href="https://techcrunch.com/2019/11/13/after-selling-enterprise-biz-docker-lands-35m-investment-and-new-ceo/">source</a> </small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://scale.com">Scale</a>: <br>Training / validation data for ML</td>
<td>1,000 <small> <a href="https://www.forbes.com/sites/stevenli1/2019/12/22/scale-ai-growth-story/#3360214b6f4a">source</a> </small></td>
<td>Python, JS <small> <a href="https://scale.com/careers/41e05b90-7e65-4dac-8676-50be9c1afc27">source</a>, <a href="https://scale.com/careers/37b0c485-cd77-4170-ac07-a8521b9a10fc">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://amplitude.com">Amplitude</a>: <br>Product / customer analytics</td>
<td>1,000 <small> <a href="https://www.forbes.com/sites/davidjeans/2020/05/20/amplitude-now-valued-1-billion-backed-sequoia-benchmark/#68a1ad2041c7">source</a> </small></td>
<td>Python, Java <small> <a href="https://news.ycombinator.com/item?id=13301832&amp;p=2">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://zapier.com">Zapier</a>: <br>Connect apps and automate workflows</td>
<td>1000 est. (20x 2018 ARR) <small> <a href="https://www.drift.com/blog/how-zapier-grew/">source</a> </small></td>
<td>Python <small> <a href="https://zapier.com/blog/zapier-tech-stack/">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://faire.com">Faire</a>: <br>B2B wholesale marketplace</td>
<td>1,000 <small> <a href="https://www.forbes.com/sites/laurendebter/2019/10/30/faire-wholesale-marketplace-series-d-1-billion-valuation/#21c2bdfb7aa9">source</a> </small></td>
<td>Java <small> <a href="https://boards.greenhouse.io/faire/jobs/4187498002">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://plangrid.com">PlanGrid</a>: <br>Construction software</td>
<td>875 <small> <a href="https://techcrunch.com/2018/11/20/autodesk-agrees-to-buy-plangrid-for-875-million/#:~:text=Autodesk%20announced%20plans%20to%20acquire%20PlanGrid%20for%20%24875%20million%20today.">source</a> </small></td>
<td>Python <small> <a href="https://stackoverflow.com/jobs/companies/plangrid">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://mixpanel.com">Mixpanel</a>: <br>User analytics</td>
<td>865 <small> <a href="https://www.forbes.com/pictures/feki45efhmk/mixpanel/#71dc3892190f">source</a> </small></td>
<td>Python<small> <a href="https://boards.greenhouse.io/mixpanel/jobs/1545756?gh_jid=1545756">source</a> (founded before Go)</small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://benchling.com">Benchling</a>: <br>Biotech research</td>
<td>850 <small> <a href="https://www.forbes.com/sites/amyfeldman/2020/05/28/biotech-rd-software-startup-benchling-started-by-mit-undergrads-scores-850-million-valuation-amid-coronavirus-pandemic/#5de0e0c61dcd">source</a> </small></td>
<td>Python <small> <a href="https://www.workatastartup.com/companies/445">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://meesho.com">Meesho</a>: <br>Social commerce platform</td>
<td>700 <small> <a href="https://economictimes.indiatimes.com/small-biz/startups/newsbuzz/meesho-raised-125-mn-from-naspers-and-others/articleshow/70641492.cms">source</a> </small></td>
<td>Java <small> <a href="https://angel.co/company/meesho/jobs/596045-software-development-engineer-iii">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://optimizely.com">Optimizely</a>: <br>Digital experience optimization / testing</td>
<td>600 <small> <a href="https://pitchbook.com/newsletter/optimizely-brings-in-50m#:~:text=Optimizely%2C%20which%20operates%20an%20optimization,with%20participation%20from%20Accenture%20Ventures">source</a> </small></td>
<td>Python <small> <a href="https://news.ycombinator.com/item?id=2647003">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://algolia.com">Algolia</a>: <br>Search service</td>
<td>578 <small> <a href="https://www.bizjournals.com/sanfrancisco/news/2019/10/15/fast-growing-san-francisco-search-company-scores.html">source</a> </small></td>
<td>C++, Ruby <small> <a href="https://www.algolia.com/doc/faq/why/what-architecture-does-algolia-use-to-provide-an-high-performance-search-engine/">source</a>, <a href="https://stackshare.io/posts/how-algolia-built-their-realtime-search-as-a-service-product">source</a> </small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://goat.com">Goat</a>: <br>Sneaker marketplace</td>
<td>550 <small> <a href="https://www.forbes.com/sites/kurtbadenhausen/2019/02/07/foot-locker-invests-100-million-in-secondary-sneaker-firm-goat/#3b07b65e568d">source</a> </small></td>
<td>Ruby <small> <a href="https://www.workatastartup.com/jobs/20990">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://standard.ai">StandardCognition</a>: <br>Autonomous checkout</td>
<td>535 <small> <a href="https://techcrunch.com/2019/07/25/standard-cognition-lands-35m-at-535m-valuation-to-battle-amazon-go/">source</a> </small></td>
<td>Python <small> <a href="https://jobs.lever.co/standard/9b874041-7cfe-4e0a-a459-fcd66451ee75">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://people.ai">People.ai</a>: <br>Intelligent CRM</td>
<td>500 <small> <a href="https://techcrunch.com/2019/05/21/people-ai-the-predictive-sales-startup-raises-60m-at-around-500m-valuation/#:~:text=People.ai%2C%20the%20predictive%20sales,around%20%24500M%20valuation%20%7C%20TechCrunch">source</a> </small></td>
<td>Python <small> <a href="https://www.workatastartup.com/companies/1299">source</a>, <a href="https://news.ycombinator.com/item?id=16974829">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://razorpay.com">Razorpay</a>: <br>Digital payments</td>
<td>450 <small> <a href="https://www.pymnts.com/news/investment-tracker/2019/razorpay-sequoia-india-ribbit-capital/#:~:text=With%20the%20funding%2C%20Razorpay%20is,Razorpay%20X%20neo%2Dbanking%20platform.">source</a> </small></td>
<td>PHP <small> <a href="https://news.ycombinator.com/item?id=12407955">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://equipmentshare.com">EquipmentShare</a>: <br>Equipment rentals</td>
<td>400 est. <small> <a href="https://www.forbes.com/sites/alexkonrad/2019/11/18/softbank-looks-to-invest-equipmentshare-unicorn/#48a6b2d779b8">source</a> </small></td>
<td>Python <small> <a href="https://news.ycombinator.com/item?id=16492994&amp;p=2">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://weebly.com">Weebly</a>: <br>Website builder</td>
<td>365 <small> <a href="https://techcrunch.com/2018/04/26/square-acquires-weebly/">source</a> </small></td>
<td>PHP <small> <a href="https://news.ycombinator.com/item?id=2839742">source</a>, <a href="https://news.ycombinator.com/item?id=5729035">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://webflow.com">Webflow</a>: <br>Website builder</td>
<td>350 <small> <a href="https://growthhackers.com/articles/how-webflow-quietly-grew-without-vc-money?r=latest">source</a> </small></td>
<td>JS <small> <a href="https://boards.greenhouse.io/webflow/jobs/1838218">source</a>, <a href="https://www.workatastartup.com/companies/566">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://matterport.com">Matterport</a>: <br>3D technology platform</td>
<td>325 <small> <a href="https://techcrunch.com/2019/03/05/matterport-2/#:~:text=Matterport%20had%20raised%20just%20under,DCM%2C%20Qualcomm%20Ventures%20and%20more.">source</a> </small></td>
<td>C++ <small> <a href="https://news.ycombinator.com/item?id=3300290">source</a>, <a href="https://news.ycombinator.com/item?id=5186626">source</a> </small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://influxdata.com">InfluxData</a>: <br>InfluxDB creator</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/influxdb/company_financials">source</a> </small></td>
<td>Go <small> <a href="https://github.com/influxdata/influxdb">source</a> </small></td>
<td>N / Y</td>
</tr>
<tr>
<td><a href="https://embarktrucks.com">Embark</a>: <br>Self-driving trucks</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/embark-trucks/company_financials">source</a> </small></td>
<td>Python, C++ <small> <a href="https://jobs.lever.co/embark/25999d12-5d82-45fc-b3e4-0ebc335f6f59">source</a> </small></td>
<td>Y / Y</td>
</tr>
<tr>
<td><a href="https://sendbird.com">SendBird</a>: <br>Chat / calls as a service</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/sendbird/company_financials">source</a> </small></td>
<td>Python <small> <a href="https://sendbird.com/careers/4317963002">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://rescale.com">Rescale</a>: <br>Cloud simulation platform</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/rescale/company_financials">source</a> </small></td>
<td>Java, Python <small> <a href="https://news.ycombinator.com/item?id=5828217">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://gocardless.com">GoCardless</a>: <br>Direct debit payments</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/gocardless/company_financials">source</a> </small></td>
<td>Ruby <small> <a href="https://news.ycombinator.com/item?id=14978103">source</a>, <a href="https://news.ycombinator.com/item?id=16283469">source</a>, <a href="https://news.ycombinator.com/item?id=4596703">source</a>, <a href="https://boards.greenhouse.io/gocardless/jobs/2282283">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://rigetti.com">Rigetti Computing</a>: <br>Quantum computing</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/rigetti-computing/company_financials">source</a> </small></td>
<td>Python, Lisp, C <small> <a href="https://news.ycombinator.com/item?id=16968407">source</a> </small></td>
<td>Y / Y</td>
</tr>
<tr>
<td><a href="https://messagebird.com">MessageBird</a>: <br>Omnichannel customer communication</td>
<td>300 <small> <a href="https://www.fool.com/investing/2020/03/13/twilio-investors-keep-tabs-on-startup-messagebird.aspx">source</a> </small></td>
<td>Go, PHP, Python, Java <small> <a href="https://careers.sh/uk/kompaniya/messagebird/robochi-mistsya/71009">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://ironcladapp.com">Ironclad</a>: <br>Digital contracting platform</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/ironclad/company_financials">source</a> </small></td>
<td>JS, Java <small> <a href="https://jobs.lever.co/ironcladapp/2d6616e3-27b8-4138-a6fc-238e46757822">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://sift.com">Sift</a>: <br>Digital safety and fraud detection</td>
<td>300 est. <small> <a href="https://www.crunchbase.com/organization/sift-science/company_financials">source</a> </small></td>
<td>Java, Ruby <small> <a href="https://news.ycombinator.com/item?id=6657091">source</a> </small></td>
<td>Y / N</td>
</tr>
<tr>
<td><a href="https://mattermost.com">Mattermost</a>: <br>Open source Slack alternative</td>
<td>250 est. <small> <a href="https://app.dealroom.co/companies/mattermost">source</a> </small></td>
<td>Go <small> <a href="https://github.com/mattermost/mattermost-server">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://xendit.co">Xendit</a>: <br>Digital payments</td>
<td>150 est. <small> <a href="https://www.ycombinator.com/topcompanies/">source</a> </small></td>
<td>JS <small> <a href="https://www.workatastartup.com/companies/938">source</a>, <a href="https://www.xendit.co/en/careers/job-application/?gh_jid=4114942003">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://easypost.com">EasyPost</a>: <br>Logistics software</td>
<td>150 est. <small> <a href="https://www.ycombinator.com/topcompanies/">source</a> </small></td>
<td>Ruby <small> <a href="https://news.ycombinator.com/item?id=6231587">source</a>, <a href="https://news.ycombinator.com/item?id=13542390">source</a>, <a href="https://www.linkedin.com/jobs/view/senior-software-engineer-at-easypost-1669977835/">source</a> </small></td>
<td>N / N</td>
</tr>
<tr>
<td><a href="https://newfrontinsurance.com">Newfront</a>: <br>Insurance platform</td>
<td>150 est. <small> <a href="https://www.ycombinator.com/topcompanies/">source</a> </small></td>
<td>JS, Go <small> <a href="https://www.keyvalues.com/newfront">source</a>, <a href="https://news.ycombinator.com/item?id=21683554">source</a> </small></td>
<td>N / N</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Notes:</p><ul><li><em>Ginkgo Bioworks, Boom Supersonic, Grin, Memebox, Helion Energy, North, RelativitySpace, and The Athletic were excluded from the below list; I didn&apos;t feel they were primarily software businesses. Feel free to disagree with my judgement.</em></li><li><em>Values current as of August 15, 2020.</em></li><li><em>If one language was the primary language used to build the initial product, one language is listed above. If it was not clear which language was primary, multiple languages are listed above.</em></li><li><em>If I couldn&apos;t find which language was used to build the startup initially, I referenced the oldest job posting I could find.</em></li><li><em>Valuations are approximate and predominantly sourced from recent articles online. Where I couldn&apos;t find an indication of value, ~$150M is assumed; startups listed above were all worth +$150M as of October 2019, as per the <a href="https://www.ycombinator.com/topcompanies/">YC Top Companies</a> page.</em></li><li><em>&quot;Y&quot; and &quot;N&quot; values in the &quot;DataSci / LowLv&quot; column describe a startup&apos;s primary product (i.e. ML startups would have a &quot;Y&quot; for DataSci). It was included to provide additional colour on why initial back-end language(s) may have been used / selected. The values in this column are based entirely on my own judgement. Feel free to disagree with them or ignore them.</em></li><li><em>Ruby and ruby on rails was a popular choice for YC startups around 2010 - 2012. Anecdotally, ~40% of YC startups used ruby during its peak popularity.</em></li></ul><h2 id="2-aggregated-stats">2. Aggregated Stats:</h2><p><strong>Startups with one (initial) primary back-end language:</strong></p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Language</th>
<th>Count</th>
<th>Total Valuation ($BN)</th>
</tr>
</thead>
<tbody>
<tr>
<td>All</td>
<td>35 (70%)</td>
<td>132.1 (75%)</td>
</tr>
<tr>
<td>Ruby</td>
<td>13 (26%)</td>
<td>92.4 (52%)</td>
</tr>
<tr>
<td>Python</td>
<td>11 (22%)</td>
<td>29.9 (17%)</td>
</tr>
<tr>
<td>Lisp</td>
<td>1 (2%)</td>
<td>3.0 (2%)</td>
</tr>
<tr>
<td>Elixir</td>
<td>1 (2%)</td>
<td>2.8 (2%)</td>
</tr>
<tr>
<td>Java</td>
<td>2 (4%)</td>
<td>1.7 (1%)</td>
</tr>
<tr>
<td>Go</td>
<td>3 (6%)</td>
<td>1.6 (1%)</td>
</tr>
<tr>
<td>PHP</td>
<td>2 (4%)</td>
<td>0.8 (0%)</td>
</tr>
<tr>
<td>JS</td>
<td>2 (4%)</td>
<td>0.5 (0%)</td>
</tr>
<tr>
<td>C++</td>
<td>1 (2%)</td>
<td>0.3 (0%)</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Startups with multiple (initial) primary back-end languages:</strong></p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Language</th>
<th>Count</th>
<th>Total Valuation ($BN)</th>
</tr>
</thead>
<tbody>
<tr>
<td>All</td>
<td>15 (30%)</td>
<td>44.4 (25%)</td>
</tr>
<tr>
<td>C++ is one</td>
<td>4 (8%)</td>
<td>34.9 (20%)</td>
</tr>
<tr>
<td>Python is one</td>
<td>8 (16%)</td>
<td>25.7 (15%)</td>
</tr>
<tr>
<td>Ruby is one</td>
<td>3 (6%)</td>
<td>15.9 (9%)</td>
</tr>
<tr>
<td>JS is one</td>
<td>5 (10%)</td>
<td>6.5 (4%)</td>
</tr>
<tr>
<td>Java is one</td>
<td>6 (12%)</td>
<td>5.7 (3%)</td>
</tr>
<tr>
<td>Go is one</td>
<td>4 (8%)</td>
<td>5.5 (3%)</td>
</tr>
<tr>
<td>Lisp is one</td>
<td>1 (2%)</td>
<td>0.3 (0%)</td>
</tr>
<tr>
<td>C is one</td>
<td>1 (2%)</td>
<td>0.3 (0%)</td>
</tr>
<tr>
<td>PHP is one</td>
<td>1 (2%)</td>
<td>0.3 (0%)</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Note: &quot;Startups with multiple (initial) primary back-end languages&quot; table doesn&apos;t add to 100% because multiple languages were used for startups.</p><p><strong>All startups:</strong></p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Language</th>
<th>Count</th>
<th>Total Valuation ($BN)</th>
</tr>
</thead>
<tbody>
<tr>
<td>All</td>
<td>50 (100%)</td>
<td>176.5 (100%)</td>
</tr>
<tr>
<td>Ruby is one</td>
<td>16 (32%)</td>
<td>108.3 (61%)</td>
</tr>
<tr>
<td>Python is one</td>
<td>19 (38%)</td>
<td>55.6 (32%)</td>
</tr>
<tr>
<td>C++ is one</td>
<td>5 (10%)</td>
<td>35.2 (20%)</td>
</tr>
<tr>
<td>Java is one</td>
<td>8 (16%)</td>
<td>7.4 (4%)</td>
</tr>
<tr>
<td>Go is one</td>
<td>7 (14%)</td>
<td>7.0 (4%)</td>
</tr>
<tr>
<td>JS is one</td>
<td>7 (14%)</td>
<td>7.0 (4%)</td>
</tr>
<tr>
<td>Lisp is one</td>
<td>2 (4%)</td>
<td>3.3 (2%)</td>
</tr>
<tr>
<td>Elixir is one</td>
<td>1 (2%)</td>
<td>2.8 (2%)</td>
</tr>
<tr>
<td>PHP is one</td>
<td>3 (6%)</td>
<td>1.1 (1%)</td>
</tr>
<tr>
<td>C is one</td>
<td>1 (2%)</td>
<td>0.3 (0%)</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Note: &quot;All startups&quot; table doesn&apos;t add to 100% because multiple languages were used for some startups.</p>]]></content:encoded></item><item><title><![CDATA[How to Host Your Own Podcast RSS Feed]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-14.png" class="kg-image" alt loading="lazy" width="960" height="539" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-14.png 600w, https://charliereese.ca/content/images/2022/01/image-14.png 960w" sizes="(min-width: 720px) 720px"></figure><p>I recently started a podcast with my friend Tom Zaragoza called the DEVpreneur. It&apos;s a podcast about working on a software / SaaS business as a software developer.</p><p>Below I&apos;ll explain both how and why you should host your own podcast, as well as potential drawbacks of</p>]]></description><link>https://charliereese.ca/how-to-host-your-own-podcast-rss-feed/</link><guid isPermaLink="false">61dd34de46dbae1df7ea7227</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Wed, 02 Sep 2020 06:43:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-14.png" class="kg-image" alt loading="lazy" width="960" height="539" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-14.png 600w, https://charliereese.ca/content/images/2022/01/image-14.png 960w" sizes="(min-width: 720px) 720px"></figure><p>I recently started a podcast with my friend Tom Zaragoza called the DEVpreneur. It&apos;s a podcast about working on a software / SaaS business as a software developer.</p><p>Below I&apos;ll explain both how and why you should host your own podcast, as well as potential drawbacks of doing so.</p><p><strong>Table of contents</strong>:</p><ol><li>How to host your own podcast</li><li>Why you should host your own podcast</li><li>Drawbacks of hosting your own podcast</li><li>Ending thoughts</li></ol><h2 id="how-to-host-your-own-podcast">How to host your own podcast</h2><p>In order to host your own podcast, you need to do three things:</p><p>i. Add a valid RSS feed to your website<br>ii. Add the media (e.g. mp3) file to your website<br>iii. Add the RSS feed to various podcast platforms</p><p><strong>Add a valid RSS feed to your website</strong></p><p>If your website isn&apos;t built using something like WordPress (i.e. you coded it yourself), or you simply want to build an RSS feed for your podcast manually, then you need to create of a valid RSS feed. Apple provides a <a href="https://help.apple.com/itc/podcasts_connect/#/itcbaf351599">sample RSS feed</a> as well as <a href="https://help.apple.com/itc/podcasts_connect/#/itcb54353390">documentation on different required RSS feed fields</a> to help you create your own feed.</p><p>The XML / <a href="https://charliereese.ca/devpreneur-podcast/rss">RSS feed for the DEVpreneur podcast looks like this</a>.</p><p>After you&apos;ve created your own feed, you can validate it using the <a href="https://podba.se/validate">Podbase podcast validator</a>. Remember that as you add new episodes to your podcast, you will have to update your feed (or write code that updates your feed for you automatically).</p><p><strong>Add the media (e.g. mp3) file to your website</strong></p><p>The RSS feed you add to your website must contain URLs that link podcast episodes to their associated media (e.g. mp3) files. As such, you need to upload media files to a publicly accessible location.</p><p>You have many choices for where you host your media files. For DEVpreneur, we host the files on charliereese.ca (the same server that hosts our RSS feed) under the /podcasts route (e.g. https://charliereese.ca/podcasts/ep_01.mp3). You could, however, use one of the many cloud storage providers - as long as the file has a publicly accessible route.</p><p><strong>Add the RSS feed to various podcast platforms</strong></p><p>After you finish creating a podcast RSS feed and have hosted your media file(s) in a publicly accessible place, it&apos;s time to add your podcast&apos;s RSS feed to various platforms so that it can be found by future listeners!</p><p>Which platforms you add your podcast to is a matter of preference, but you may want to check out the following to get started!</p><p>Podcast platforms:</p><ul><li><a href="https://itunesconnect.apple.com/login?module=PodcastsConnect">Apple Podcasts</a></li><li><a href="https://play.google.com/music/podcasts/publish?u=0">Google Podcasts</a></li><li><a href="https://www.stitcher.com/">Stitcher</a></li><li><a href="https://tunein.com/podcasts/">TuneIn</a></li><li><a href="https://www.blubrry.com/">Blubrry</a></li><li><a href="https://podcasters.spotify.com/">Spotify</a></li></ul><h2 id="why-you-should-host-your-own-podcast">Why you should host your own podcast</h2><p>At this point you might be thinking, why go through the above trouble to host my podcast when I can pay a nominal fee to have a hosting provider (like <a href="Transistor.fm">Transistor.fm</a>) do it for me? That&apos;s a fair question, and there is one reason (other than nerd clout) why you may wish to do so: control.</p><p>You retain full control / customization of your RSS feed if you host your own podcast; it&apos;s easy to add specific XML tags to your RSS feed if you host it yourself - it may not be possible if you use a hosting provider.</p><h2 id="drawbacks-of-hosting-your-own-podcast">Drawbacks of hosting your own podcast</h2><p>Hosting your podcast isn&apos;t without drawbacks, however.</p><p>Every time someone downloads your podcast, a large media file has to be sent from your server (or cloud file storage provider). This could cause problems if you&apos;re expecting a very large audience to build over a short period of time, or if you have little bandwidth on the server hosting it.</p><p>Further, hosting your own RSS feed and media files will almost certainly take more time to set up initially than using a podcast hosting provider, and your feed may also be more brittle / error prone as a result.</p><h2 id="ending-thoughts">Ending thoughts</h2><p>While hosting your own podcast is both relatively simple and beneficial, it may not be worth it if you&apos;re concerned about setup time, stability, or bandwidth.</p><p>Do you host your own podcast RSS feed, or are you planning to? Why or why not? Let me know <a href="https://twitter.com/charlieinthe6">@charlieinthe6</a>!</p>]]></content:encoded></item><item><title><![CDATA[Ngrok: Create & Share a URL to Your Localhost Server]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-2.png" class="kg-image" alt loading="lazy" width="1418" height="410" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-2.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-2.png 1000w, https://charliereese.ca/content/images/2022/01/image-2.png 1418w" sizes="(min-width: 720px) 720px"></figure><p><strong>This article covers how to use ngrok to easily share a public URL that connects to your local web server</strong> (which may be running a website or application that you are developing). This is a great way to test and develop webhook endpoints, or share web applications that are under</p>]]></description><link>https://charliereese.ca/ngrok-create-share-a-url-to-your-localhost-server/</link><guid isPermaLink="false">61dd2ea046dbae1df7ea71ad</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Tue, 18 Aug 2020 06:17:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-2.png" class="kg-image" alt loading="lazy" width="1418" height="410" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-2.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-2.png 1000w, https://charliereese.ca/content/images/2022/01/image-2.png 1418w" sizes="(min-width: 720px) 720px"></figure><p><strong>This article covers how to use ngrok to easily share a public URL that connects to your local web server</strong> (which may be running a website or application that you are developing). This is a great way to test and develop webhook endpoints, or share web applications that are under development, all without having to deploy your code!</p><p>This article is broken down into the following steps:</p><ol><li>Installing ngrok</li><li>Creating a secure introspectable tunnel to localhost (i.e. creating a URL to share your local web server)</li><li>Accessing a web application running on localhost</li><li>Using the ngrok dashboard to replay requests</li></ol><h2 id="1-installing-ngrok">1. Installing Ngrok</h2><p>Installing ngrok is incredibly simple:</p><ul><li>Create a free <a href="https://ngrok.com/">ngrok</a> account</li><li><a href="https://dashboard.ngrok.com/get-started">Download ngrok</a></li><li>Unzip ngrok (Mac users can unzip ngrok by simply double clicking it in their downloads folder)</li><li>Move the unzipped ngrok binary into your path (so you can call ngrok). Command for Mac users: <code>mv ~/Downloads/ngrok /usr/local/bin</code></li><li>Your ngrok binary may be in a different location than mine, so you may have to run a slightly different command than listed above</li><li>Connect to your ngrok account by running the ngrok auth command in your terminal <a href="https://dashboard.ngrok.com/get-started">found here</a></li><li>It should look something like <code>ngrok authtoken abc123...</code></li></ul><p>After completing the above steps, you are ready to begin creating instant, secure URLs to your localhost server! Time for step 2.</p><h2 id="2-creating-a-secure-introspectable-tunnel-to-localhost">2. Creating a Secure Introspectable Tunnel to Localhost</h2><p>Now that you&apos;ve moved the ngrok binary into your path, you can start using it! To create a tunnel to your localhost server on port 3000, you can run the following:</p><p><code>ngrok http 3000</code></p><h2 id="3-accessing-a-web-application-running-on-localhost">3. Accessing a Web Application Running on Localhost</h2><p>The previous command you ran, <code>ngrok http 3000</code>, will output something like this:</p><pre><code>ngrok by @inconshreveable                                                           (Ctrl+C to quit)

Session Status                online
Account                       YOUR@EMAIL (Plan: Free)
Version                       YOUR.VERS.ION
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://e123fe.ngrok.io -&gt; http://localhost:3000
Forwarding                    https://e123fe.ngrok.io -&gt; http://localhost:3000
</code></pre><p>You will be able to access whatever you are running on localhost:3000 through the URL that follows <strong>Forwarding</strong> above! That means you can share the URL with colleagues in different locations, and they will also be able to access what you are running locally!</p><h2 id="4-using-the-ngrok-dashboard-to-replay-requests">4. Using the Ngrok Dashboard to Replay Requests </h2><p>Using the <strong>Web Interface</strong>, which by default runs at localhost:4040, you are able to view information for all requests and responses. You are also able to replay previous requests as many times as desired; replaying previous requests is very helpful when debugging or developing webhook endpoints (for services like Twilio)!</p><hr><p>And there you have it! Ngrok is easy to install and use, and it&apos;s a great way to make what you&apos;re running locally temporarily available to the world!</p><p><em>Note: don&apos;t forget to be mindful of security when using ngrok</em></p>]]></content:encoded></item><item><title><![CDATA[Rails Performance: 3 Tips For Removing N+1 Queries]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-1.png" class="kg-image" alt loading="lazy" width="1024" height="320" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-1.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-1.png 1000w, https://charliereese.ca/content/images/2022/01/image-1.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;re here because your rails app is slow, and you either suspect or discovered it has <a href="https://youtu.be/gAp6zOMhOHc?t=86">n+1 queries</a> causing performance issues. I&apos;ve been there.</p><p>This article discusses what causes n+1 queries. It also covers 3 tips specific to rails apps for:</p><ul><li>How you can</li></ul>]]></description><link>https://charliereese.ca/rails-performance-3-tips-for-removing-n-1-queries/</link><guid isPermaLink="false">61dd2fde46dbae1df7ea71bf</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Mon, 10 Aug 2020 06:23:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-1.png" class="kg-image" alt loading="lazy" width="1024" height="320" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-1.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-1.png 1000w, https://charliereese.ca/content/images/2022/01/image-1.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>You&apos;re here because your rails app is slow, and you either suspect or discovered it has <a href="https://youtu.be/gAp6zOMhOHc?t=86">n+1 queries</a> causing performance issues. I&apos;ve been there.</p><p>This article discusses what causes n+1 queries. It also covers 3 tips specific to rails apps for:</p><ul><li>How you can identify n+1 queries by checking your terminal output or by using the <a href="https://github.com/flyerhzm/bullet">bullet gem</a></li><li>Avoiding n+1 queries by eager loading associations (i.e. load all associations once instead of n+1 times)</li><li>Avoiding n+1 queries by using <code>.size</code> instead of <code>.count</code></li></ul><h2 id="table-of-contents">Table of contents:</h2><ul><li>What causes n+1 queries</li><li>How you can identify n+1 queries</li><li>How to eager load associations</li><li>Using <code>.size</code> instead of <code>.count</code></li></ul><h2 id="what-causes-n1-queries">What causes n+1 queries?</h2><p>N+1 queries are caused by code that loads children of a parent-child relationship (children are the many in a &#x201C;one-to-many&#x201D; association). Since most ORMs have lazy loading enabled by default, queries must be issued for the parent record (1 query), and for each child record (n queries).</p><p>Said another way, instead of loading all parent and child records at once, n+1 queries loads each record separately.</p><h2 id="how-you-can-identify-n1-queries">How you can identify n+1 queries</h2><p><strong>A. In your terminal:</strong></p><p>If you are running your rails application in a local development environment, watch your terminal as your run the controller action (possibly by loading a web app page in your browser) you suspect causes n+1 queries.</p><p>Look out for terminal output that looks like the below:</p><pre><code>...
Contact Load (1.1ms)  SELECT &quot;contacts&quot;.* FROM &quot;contacts&quot; INNER JOIN &quot;contacts_messages&quot; ON &quot;contacts&quot;.&quot;id&quot; = &quot;contacts_messages&quot;.&quot;contact_id&quot; WHERE &quot;contacts_messages&quot;.&quot;message_id&quot; = ? ORDER BY &quot;contacts&quot;.&quot;id&quot; ASC LIMIT ?  [[&quot;message_id&quot;, 4], [&quot;LIMIT&quot;, 1]]
  &#x21B3; app/views/messages/_message.html.erb:4
...
Contact Load (0.1ms)  SELECT &quot;contacts&quot;.* FROM &quot;contacts&quot; INNER JOIN &quot;contacts_messages&quot; ON &quot;contacts&quot;.&quot;id&quot; = &quot;contacts_messages&quot;.&quot;contact_id&quot; WHERE &quot;contacts_messages&quot;.&quot;message_id&quot; = ? ORDER BY &quot;contacts&quot;.&quot;id&quot; ASC LIMIT ?  [[&quot;message_id&quot;, 5], [&quot;LIMIT&quot;, 1]]
  &#x21B3; app/views/messages/_message.html.erb:4
...
Contact Load (0.2ms)  SELECT &quot;contacts&quot;.* FROM &quot;contacts&quot; INNER JOIN &quot;contacts_messages&quot; ON &quot;contacts&quot;.&quot;id&quot; = &quot;contacts_messages&quot;.&quot;contact_id&quot; WHERE &quot;contacts_messages&quot;.&quot;message_id&quot; = ? ORDER BY &quot;contacts&quot;.&quot;id&quot; ASC LIMIT ?  [[&quot;message_id&quot;, 6], [&quot;LIMIT&quot;, 1]]
  &#x21B3; app/views/messages/_message.html.erb:4
...
</code></pre><p>As you can see above, a query is being made for <code>Contact</code> records (which have not been cached) multiple times. In the above instance, the contact records were children of a parent record, and they weren&apos;t eager loaded (more on eager loading below), causing queries for each child record to occur.</p><p><strong>B. Using the bullet gem:</strong></p><p><a href="https://github.com/flyerhzm/bullet">Bullet</a> is designed to help you increase your application&apos;s performance by reducing queries made; it catches query performance issues in your code. It will watch your queries while you develop and notify you when you should add eager loading to avoid N+1 queries, when you&apos;re using eager loading that isn&apos;t needed, and when you should use counter cache.</p><p>If you decide to use it (which I recommend you do), use bullet in test, development, or another non-production mode.</p><p>I personally have configured bullet for development and testing; if <code>BULLET=true rails test</code> is run, my tests fail for n+1s, unused_eager_loading, and counter_cache. My bullet configuration is as follows:</p><p>Gemfile:</p><pre><code class="language-ruby">group :development, :test do
  gem &apos;bullet&apos;
end
</code></pre><p>config/environments/development.rb:</p><pre><code class="language-ruby">config.after_initialize do
  Bullet.enable = true
  Bullet.rails_logger = true # logs violations
  Bullet.add_footer = true # adds footer to view with violation
end
</code></pre><p>config/environments/test.rb:</p><pre><code class="language-ruby">if ENV[&apos;BULLET&apos;]
  config.after_initialize do
    Bullet.enable = true
    Bullet.bullet_logger = true
    Bullet.raise = true # raise an error if n+1 query occurs
  end
end
</code></pre><p>Appended to or required in test/test_helper.rb:</p><pre><code class="language-ruby">if ENV[&apos;BULLET&apos;]
  module MiniTestWithBullet
    def before_setup
      Bullet.start_request
      super if defined?(super)
    end

    def after_teardown
      super if defined?(super)
      Bullet.end_request
    end
  end

  class ActiveSupport::TestCase
    include MiniTestWithBullet
  end
end
</code></pre><h2 id="how-to-eager-load-associations">How to eager load associations</h2><p>You can avoid most n+1 queries in rails by simply eager loading associations. Eager loading allows you to load all of your associations (parent and children) once instead of n+1 times (which often happens with lazy loading, rails&apos; default).</p><p>To eager load associations in rails, use the <a href="https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes"><code>.includes</code></a> method:</p><pre><code class="language-ruby">Message.includes(:contacts)
  .order(:scheduled_time)

# or

Blog.includes(articles: [{ comments: :guest }, :tags])
  .find(1)
</code></pre><p>As seen above, <code>.includes</code> allows nested association eager loading!</p><h2 id="using-size-instead-of-count">Using <code>.size</code> instead of <code>.count</code> </h2><p>When calculating the number of child associations that exist, use <code>.size</code> instead of <code>.count</code> to avoid n+1 queries in rails.</p><p><strong>Why?</strong></p><p>When <code>.count</code> is called on an <code>ActiveRecord::Relation</code>, it executes a COUNT query on the database. <code>.size</code>, on the other hand, will call the <code>.length</code> method on an <code>ActiveRecord::Relation</code> if it is loaded (if it isn&apos;t loaded, it will call <code>.count</code>). See for yourself in the <a href="https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-size">source code</a>:</p><pre><code class="language-ruby"># File activerecord/lib/active_record/relation.rb, line 260
def size
  loaded? ? @records.length : count(:all)
end
</code></pre><p>Therefore, using <code>.size</code> instead of <code>.count</code> will avoid an extra database query each time it is called if your <code>ActiveRecord::Relation</code> is already (eager) loaded!</p><p>This is especially counter-intuitive, since <code>.size</code>, <code>.count</code>, and <code>.length</code> all behave the same when sent to an instance of <code>Array</code> in ruby. &#xAF;\<em>(&#x30C4;)</em>/&#xAF;</p>]]></content:encoded></item><item><title><![CDATA[Ruby Multithreading - Concurrent API Requests]]></title><description><![CDATA[<blockquote>This article contains boilerplate code demonstrating how multithreaded requests can be made in ruby; ruby makes it easy to make multiple API requests at the same time!</blockquote><p>Today, while putting finishing touches on a fin-tech MVP I&apos;m building, I realized I needed to hit an external API twice</p>]]></description><link>https://charliereese.ca/ruby-multithreading-concurrent-api-requests/</link><guid isPermaLink="false">61dd3fe046dbae1df7ea72ad</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Sun, 09 Aug 2020 07:30:00 GMT</pubDate><content:encoded><![CDATA[<blockquote>This article contains boilerplate code demonstrating how multithreaded requests can be made in ruby; ruby makes it easy to make multiple API requests at the same time!</blockquote><p>Today, while putting finishing touches on a fin-tech MVP I&apos;m building, I realized I needed to hit an external API twice before loading one of the pages... ew. Totally not cool, and definitely wouldn&apos;t give a programmer like myself a <a href="https://en.wikipedia.org/wiki/Big_O_notation">big-O</a> (please look up big-O notation if you didn&apos;t get that. I&apos;m funny, I swear).</p><p>Anyway, since I&apos;m <em>ABSOLUTELY NOT</em> willing to increase my server response time by 50 ms, today was the day that I learned how to make concurrent API (HTTPS) requests in ruby.</p><p><strong>Please find below boilerplate code demonstrating how multithreaded requests can be made in ruby:</strong></p><pre><code class="language-ruby">require &apos;httparty&apos;
require &apos;nokogiri&apos;
require &apos;thread&apos;

def return_parsed_response(url)
  HTTParty.get(url).parsed_response 
end

threads = []

parsed_response_a = nil
parsed_response_b = nil

url_a = &apos;https://snapagram.com&apos;
url_b = &apos;https://twitterface.com&apos;

threads &lt;&lt; Thread.new { 
  parsed_response_a = return_parsed_response(url_a)
}

threads &lt;&lt; Thread.new { 
  parsed_response_b = return_parsed_response(url_b)
}

# wait for threads to finish execution before continuing
threads.each(&amp;:join)
</code></pre><p><em>Note: There is no need to start a thread after creating it, it begins running automatically when CPU resources become available.</em></p><hr><p>I hope you found this quick tutorial on multithreading in ruby helpful!</p>]]></content:encoded></item><item><title><![CDATA[Rails - Time Zones & Daylight Savings Time]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-4.png" class="kg-image" alt loading="lazy" width="1024" height="320" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-4.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-4.png 1000w, https://charliereese.ca/content/images/2022/01/image-4.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>Today, while putting the final touches on an appointment scheduling engine, I noticed some odd behaviour in my tests.</p><p>I discovered that the failing tests were related time zones, and more specifically, to crossing daylight savings time boundaries. This brief article will demonstrate how to easily show time (in the</p>]]></description><link>https://charliereese.ca/rails-time-zones-daylight-savings-time/</link><guid isPermaLink="false">61dd323d46dbae1df7ea71e5</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Fri, 15 Nov 2019 07:33:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-4.png" class="kg-image" alt loading="lazy" width="1024" height="320" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-4.png 600w, https://charliereese.ca/content/images/size/w1000/2022/01/image-4.png 1000w, https://charliereese.ca/content/images/2022/01/image-4.png 1024w" sizes="(min-width: 720px) 720px"></figure><p>Today, while putting the final touches on an appointment scheduling engine, I noticed some odd behaviour in my tests.</p><p>I discovered that the failing tests were related time zones, and more specifically, to crossing daylight savings time boundaries. This brief article will demonstrate how to easily show time (in the relevant time zone) in your rails app, as well as correctly traversing date time boundaries.</p><p><strong>Table of contents:</strong></p><ol><li>Always store time in UTC</li><li>How to convert UTC time into a users&apos; local time zone</li><li>How to traverse daylight savings time boundaries</li><li>How to convert local time back to UTC</li></ol><h2 id="1-always-store-time-in-utc">1. Always store time in UTC</h2><p>Always store time in UTC (Coordinated Universal Time) in your database (often the default setting).</p><p>Why? Because it will ensure that you can easily compare times in your database across time zones. Is 5:00 pm EST before 3:00 pm PST? This question would be much easier to answer if both times were in UTC and were <em><a href="https://www.youtube.com/watch?v=ueyLBbWPPQM">same same</a></em>.</p><p>If you wanted to compare relative wealth, you wouldn&apos;t compare two peoples&apos; net worth in USD vs Yuan. You would pick one currency to compare wealth in.</p><p>Keep your times in UTC in your database, and thank me later.</p><h2 id="2-how-to-convert-utc-time-into-a-users-local-time-zone">2. How to convert UTC time into a users&apos; local time zone</h2><p>Lucky for us, rails makes converting time from UTC to another time zone very easy.</p><p>It is this easy:</p><pre><code class="language-ruby">$ irb
:001 &gt; require &apos;active_support/all&apos;
:002 &gt; time_zone = ActiveSupport::TimeZone[&quot;Eastern Time (US &amp; Canada)&quot;]
:003 &gt; Time.now.in_time_zone(time_zone).advance(days: 1)
=&gt; Tue, 19 Nov 2019 23:52:47 EST -05:00
:004 &gt; Time.now.in_time_zone(time_zone)
=&gt; Thu, 14 Nov 2019 23:52:48 EST -05:00
</code></pre><h2 id="3-how-to-traverse-daylight-savings-time-boundaries">3. How to traverse daylight savings time boundaries</h2><p>To avoid surprises when traversing daylight savings time boundaries, use the <a href="https://api.rubyonrails.org/classes/Time.html#method-i-advance">advance</a> method:</p><pre><code class="language-ruby">$ rails console
:001 &gt; time_zone = ActiveSupport::TimeZone[&quot;Eastern Time (US &amp; Canada)&quot;]
:002 &gt; Time.now.in_time_zone(time_zone).advance(days: 115)
=&gt; Sun, 08 Mar 2020 23:52:47 EDT -04:00
:003 &gt; Time.now.in_time_zone(time_zone)
=&gt; Thu, 14 Nov 2019 23:52:48 EST -05:00
</code></pre><p>If instead of advance you try one of the following when traversing daylight savings time boundaries...</p><ul><li><code>{{X}}.days.ago.in_time_zone(...)</code></li><li><code>{{X}}.weeks.from_now.in_time_zone(...)</code></li><li><code>(Time.now + {{X}}.days).in_time_zone(...)</code></li></ul><p>... You will find your output is inexplicably off by 1 hour.</p><pre><code class="language-ruby">$ rails console
:001 &gt; time_zone = ActiveSupport::TimeZone[&quot;Eastern Time (US &amp; Canada)&quot;]
:002 &gt; Time.now.in_time_zone(time_zone)
=&gt; Fri, 15 Nov 2019 00:00:01 EST -05:00
:003 &gt; 115.days.from_now.in_time_zone(time_zone)
=&gt; Mon, 09 Mar 2020 01:00:02 EDT -04:00
</code></pre><p>Always use advance when traversing daylight savings time to save yourself the headache of being off by 1 hour (as per above).</p><h2 id="4-how-to-convert-local-time-back-to-utc">4. How to convert local time back to UTC</h2><p>Finally, let&apos;s say that you want to convert local time back to UTC and into a DB ready string. It is this easy:</p><pre><code class="language-ruby">Time.now
  .in_time_zone(ActiveSupport::TimeZone[&quot;Eastern Time (US &amp; Canada)&quot;])
  .advance(days: 1)
  .utc.to_s(:db)
</code></pre>]]></content:encoded></item><item><title><![CDATA[Byebug Not Working - Rails]]></title><description><![CDATA[<h3 id="1-byebug-problem">1. Byebug problem:</h3><p>Recently while debugging a rails test with a <code>byebug</code> command, I noticed byebug had fired twice:</p><pre><code>[39, 48] in /Users/.../text.rb

[39, 48] in /Users/.../text.rb
   39:   		[:from, :country]
   40:   	end
   41:
   42: 		def post_initialize
   43: 			byebug
=&gt; 44: 			self.from ||= self.class.const_</code></pre>]]></description><link>https://charliereese.ca/byebug-not-working-rails/</link><guid isPermaLink="false">61dd331546dbae1df7ea7207</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Sat, 26 Oct 2019 06:35:00 GMT</pubDate><content:encoded><![CDATA[<h3 id="1-byebug-problem">1. Byebug problem:</h3><p>Recently while debugging a rails test with a <code>byebug</code> command, I noticed byebug had fired twice:</p><pre><code>[39, 48] in /Users/.../text.rb

[39, 48] in /Users/.../text.rb
   39:   		[:from, :country]
   40:   	end
   41:
   42: 		def post_initialize
   43: 			byebug
=&gt; 44: 			self.from ||= self.class.const_get(&apos;TRIAL_NUMBER_&apos; + country)
   45: 	        self.twilio_client = Twilio::REST::Client.new
   46:   	end
   47:   end
   48: end


   39:   		[:from, :country]
   40:   	end
   41:
   42: 		def post_initialize
   43: 			byebug
=&gt; 44: 			self.from ||= self.class.const_get(&apos;TRIAL_NUMBER_&apos; + country)
   45: 	        self.twilio_client = Twilio::REST::Client.new
   46:   	end
   47:   end
   48: end
</code></pre><p>I had to Ctrl+C out of the frozen byebug REPL, which led to the following error:</p><pre><code>Errno::ENOENT...connect(2)...DRb::DRbConnError
</code></pre><h3 id="2-cause-of-byebug-problem">2. Cause of byebug problem:</h3><p>As of rails 6, tests are run parallel by default.</p><p>Since multiple workers were executing my tests all at once, the workers all eventually reached the <code>byebug</code> statement in my test, which started multiple byebug REPLs at the same time, causing the byebug REPL to freeze.</p><h3 id="3-solution-to-frozen-byebug-repl">3. Solution to frozen byebug REPL:</h3><p>Only run one thread at a time when debugging a test with a <code>byebug</code> statement:</p><p><code>PARALLEL_WORKERS=1 rails test</code></p>]]></content:encoded></item><item><title><![CDATA[Exploring Rails Internals]]></title><description><![CDATA[<p>After an appropriate stint of rails-related imposture syndrome, I decided it was time to get a rough idea how rails works under the hood. Below is a list of knowledge gained / discoveries, in no particular order.</p><h3 id="knowledge-gained-discoveries">Knowledge Gained / Discoveries:</h3><ol><li>How to Start a VM for Ruby on Rails Core Development</li></ol>]]></description><link>https://charliereese.ca/exploring-rails-internals/</link><guid isPermaLink="false">61dd370246dbae1df7ea723b</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Sun, 08 Sep 2019 06:53:00 GMT</pubDate><content:encoded><![CDATA[<p>After an appropriate stint of rails-related imposture syndrome, I decided it was time to get a rough idea how rails works under the hood. Below is a list of knowledge gained / discoveries, in no particular order.</p><h3 id="knowledge-gained-discoveries">Knowledge Gained / Discoveries:</h3><ol><li>How to Start a VM for Ruby on Rails Core Development</li><li>Jumping Into the Console to Explore Changes</li><li>Rails is Comprised of a Collection of Standalone Gems</li><li>Learning How to Contribute to Rails is Easy</li><li>Running Tests for Rails is Easy</li><li>Ruby Has Great Introspection Methods</li></ol><h3 id="1-how-to-start-a-vm-for-ruby-on-rails-core-development">1. How to Start a VM for Ruby on Rails Core Development </h3><p>After perusing <a href="https://alexkitchens.net/2017/05/06/rails-source-code.html">Alex Kitchen&apos;s rails blog post</a> and using instructions in <a href="https://github.com/rails/rails-dev-box">this repository</a>, it was simple to get a VM up and running using the latest release of rails.</p><p>This allows you to run tests / explore new features, patch bugs and issue pull requests (if you want to be a rails contributor), as well as alter code to see the impact.</p><h3 id="2-jumping-into-the-console-to-explore-changes">2. Jumping Into the Console to Explore Changes</h3><p>After using instructions in <a href="https://github.com/rails/rails-dev-box">this repository</a> to set up a rails development box, you can easily drop into irb (with local rails repos loaded) using the console tool that ships with rails available at <code>rails/tools/console</code>.</p><p>This allows you to easily experiment with any modification you make.</p><p>Want to know where a method on an object is defined? Try <code>[OBJECT].method(:method_a).source_location</code> or <code>[CLASS].instance_method(:method_a).source_location</code> in irb and find out!</p><p>If you are looking for where a ruby builtin method is defined, you&apos;ll have to check the C source code; look for the right C file (they&apos;re organized by class) and find the rb_define_method for the method.</p><h3 id="3-rails-is-comprised-of-a-collection-of-standalone-gems">3. Rails is Comprised of a Collection of Standalone Gems</h3><p>Rails is comprised of a series of (mostly) standalone gems. Other than Action Mailer / Mailbox, Active Job, Action Cable, Active Storage, and Action Text, and Railties, the gems can be used outside of rails and replaced with different gems inside of rails.</p><p>As of 6.0, rails is comprised of the following core gems:</p><ul><li><a href="https://github.com/rails/rails/tree/master/actionpack">Action Pack</a>: routing and controllers</li><li><a href="https://github.com/rails/rails/tree/master/actionview">Action View</a>: view template lookup and rendering</li><li><a href="https://github.com/rails/rails/tree/master/activemodel">Active Model</a>: non-Active Record (DB) model interfaces</li><li><a href="https://github.com/rails/rails/tree/master/activerecord">Active Record</a>: connects and associates models with DB</li><li><a href="https://github.com/rails/rails/tree/master/activesupport">Active Support</a>: collection of utility classes and standard library extensions</li><li><a href="https://github.com/rails/rails/tree/master/railties">Railties</a>: glues frameworks together, handles rails initialization / bootstrapping process, manages rails CLI, provides generators core</li></ul><p>And supplementary gems:</p><ul><li><a href="https://github.com/rails/rails/tree/master/actioncable">Action Cable</a>: WebSockets integration / support</li><li><a href="https://github.com/rails/rails/tree/master/actionmailbox">Action Mailbox</a>: routes incoming emails to controller-like mailboxes for processing</li><li><a href="https://github.com/rails/rails/tree/master/actionmailer">Action Mailer</a>: email delivery</li><li><a href="https://github.com/rails/rails/tree/master/actiontext">Action Text</a>: rich text content and editing</li><li><a href="https://github.com/rails/rails/tree/master/activejob">Active Job</a>: queueing framework for delayed jobs</li><li><a href="https://github.com/rails/rails/tree/master/activestorage">Active Storage</a>: easily upload, reference, and associate files in cloud storage</li></ul><h3 id="4-learning-how-to-contribute-to-rails-is-easy">4. Learning How to Contribute to Rails is Easy</h3><p>Rails encourages everyone to contribute to Ruby on Rails! It&apos;s easy to learn how to <a href="https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html">contribute to rails by reading their guide</a>.</p><p>If you contribute, your name gets put on <a href="https://contributors.rubyonrails.org">this sweet list of rails contributors</a>!</p><h3 id="5-running-tests-for-rails-is-easy">5. Running Tests for Rails is Easy</h3><p>After using instructions in <a href="https://github.com/rails/rails-dev-box">this repository</a> to set up a rails development box, running tests is simple.</p><p>With the dev box running, running tests is simple:</p><pre><code class="language-bash"># All tests (be prepared to wait):
cd rails
bundle exec rake test

# Component tests:
cd railties
bundle exec rake test

# Directory within component tests:
cd railties
TEST_DIR=generators bundle exec rake test

# Specific file tests:
cd actionview
bundle exec ruby -w -Itest test/template/form_helper_test.rb

# Single test:
cd actionmailer
bundle exec ruby -w -Itest test/mail_layout_test.rb -n test_explicit_class_layout
</code></pre><p>For more tips and tricks (e.g. testing with a specific seed or DB), check out the <a href="https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#running-tests">rails testing documentation</a>.</p><h3 id="6-ruby-has-great-introspection-methods">6. Ruby Has Great Introspection Methods</h3><p>Not sure what class an object is, or what parent classes / modules it has?</p><pre><code class="language-ruby">object_a.class.name
object_a.ancestors
</code></pre><p>Not sure if an object is an instance of a certain class?</p><pre><code class="language-ruby">object_a.instance_of?(ClassA)
</code></pre><p>Not sure what methods an object / class has?</p><pre><code class="language-ruby">ClassA.methods
ClassA.instance_methods
</code></pre><p>Not sure if a method is available to a given object?</p><pre><code class="language-ruby">object_a.respond_to?(:method_a)
</code></pre><p>Want to see the instance variables of an object?</p><pre><code class="language-ruby">object_a.instance_variables
</code></pre><h3 id="other-takeaways">Other Takeaways</h3><ul><li>Checking out the *.gemspec in the root folder of a gem quickly shows you its dependencies</li><li>There is a <a href="https://guides.rubyonrails.org/autoloading_and_reloading_constants.html">great guide explaining how rails autoloading / reloading works</a>. Check out <code>rails/activesupport/lib/active_support/dependencies/autoload.rb</code> to see the code</li><li>In the first level of rails gems (e.g. Active Record), the <code>lib</code> directory contains a file with the name of the module (e.g. <code>active_record.rb</code>), which configures how the gem is loaded when it&#x2019;s started up</li><li>Some gems have a <code>rails/generators</code> directory which holds the generators pertaining to the gem (e.g. <code>rails g model</code>)</li><li><code>git log -S --reverse --patch --pickaxe-all</code>; A way to search commits in reverse order with all code changes</li></ul>]]></content:encoded></item><item><title><![CDATA[How to Validate Your Startup Idea]]></title><description><![CDATA[<p>Do you have an idea for a new business or startup? The first thing you should do is validate your idea to avoid failure. How should you do this, and why is this important? This article will explore that in the following order:</p><ol><li>Why do startups fail?</li><li>Why validate your</li></ol>]]></description><link>https://charliereese.ca/how-to-validate-your-startup-idea/</link><guid isPermaLink="false">61dd416e46dbae1df7ea72cb</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Sat, 07 Sep 2019 07:36:00 GMT</pubDate><content:encoded><![CDATA[<p>Do you have an idea for a new business or startup? The first thing you should do is validate your idea to avoid failure. How should you do this, and why is this important? This article will explore that in the following order:</p><ol><li>Why do startups fail?</li><li>Why validate your startup idea?</li><li>How to validate you startup idea</li></ol><h2 id="1-why-do-startups-fail">1. Why Do Startups Fail?</h2><p>According to a recent <a href="https://www.cbinsights.com/research/startup-failure-reasons-top/">CB Insights study</a>, the most common reason is <strong>no market need</strong>. Said another way, the reason almost half of startups fail is not enough people want to buy their product.</p><p><strong>Common reasons startups fail</strong>:</p><ul><li>No market need (42%)</li><li>Ran out of cash (29%)</li><li>Not the right team (23%)</li><li>Outcompeted (19%)</li><li>Pricing / cost (18%)</li><li>Poor user experience (17%)</li><li>No business model (17%)</li></ul><p>Note: <em>most startups surveyed indicated multiple reasons - above list adds up to over 100%</em></p><h2 id="2-why-validate-your-startup-idea">2. Why Validate Your Startup Idea?</h2><p>Put simply, validating your startup idea helps you ensure that your startup is less likely to fail for any of the above reasons; this saves your team time and money. Further, validating your idea can be done relatively quickly at little or no cost.</p><h2 id="3-how-to-validate-your-startup-idea">3. How to Validate Your Startup Idea</h2><p>There are several common ways to validate your idea:</p><p>A) Google AdWords <em>(low effort / accuracy)</em></p><p>B) Check if competitors exist <em>(low effort / accuracy)</em></p><p>C) Check if a community exists <em>(low effort / accuracy)</em></p><p>D) Market research <em>(low effort / accuracy)</em></p><p>E) Create a landing page <em>(medium effort / accuracy)</em></p><p>F) Create an explainer video <em>(medium effort / accuracy)</em></p><p>G) Wizard of Oz <em>(medium effort / accuracy)</em></p><p>H) Sell your idea to 10 people <em>(medium effort, high accuracy)</em></p><p>The above are all different ways to quickly test whether your idea might solve a customer pain point for an appropriate market size (i.e. amount of potential customers). Said another way, they help you test whether your idea could become a successful business. Let&apos;s explore the above ways in more detail below.</p><p><strong>A) Google AdWords</strong> <em>(low effort / accuracy)</em></p><p>A quick and dirty way to validate an idea is to check whether people are searching Google for associated keywords. If lots of people are searching Google for phrases pertaining to your product, you might be on to something.</p><p><strong>B) Check if competitors exist</strong> <em>(low effort / accuracy)</em></p><p>Another easy way to begin validating your idea is to check whether any competitors exist in the space. If no similar products exist, it might be an indication that there is no market need. It might also indicate that your idea is too early (i.e. people aren&apos;t ready for it yet).</p><p><strong>C) Check if a community exists</strong> <em>(low effort / accuracy)</em></p><p>Do conferences, groups, or online forums exist in the space? If so, are they talking about the problem you are trying to solve?</p><p><strong>D) Market research</strong> <em>(low effort / accuracy)</em></p><p>Check relevant books, journals, newspapers, blogs, podcasts, etc. Are they discussing the problem your idea solves? If not, create a short survey and send it to 100 of your target customers.</p><p><strong>E) Create a landing page</strong> <em>(medium effort / accuracy)</em></p><p>A great way to see if potential customers are willing to buy (or sign up for) your product is to create a landing page describing your product. If visitors click buy / subscribe, let them know that the product is under development, and ask for their contact information for future product updates.</p><p><strong>F) Create an explainer video</strong> <em>(medium effort / accuracy)</em></p><p>Creating an explainer video allows you to visually show potential customers what you plan to sell. By posting links to the video in various online communities (e.g. Reddit, Hacker News, Facebook, etc.), you can quickly receive vital feedback.</p><p><strong>G) Wizard of Oz</strong> <em>(medium effort / accuracy)</em></p><p>The Wizard of Oz consists of building a rudimentary service for customers, and manually doing everything behind the scenes. It&apos;s a great minimum viable product (MVP) for non-technical founders with technical ideas. It is also a great way to inexpensively gauge potential demand.</p><p>For example, imagine you thought it was a great idea to build an online company that sells and ships hats. Instead of building the company right away, you could build (or pay someone to build) a basic website that listed hats for sale in your neighbourhood. When an order came in, you could physically buy and ship the hat yourself.</p><p><strong>H) Sell your idea to 10 people</strong> <em>(medium effort, high accuracy)</em></p><p>By far, the best way to validate your idea is to sell it. Given that the most common reason startups fail is no market need, selling your idea to 10 people is the best way you can validate it before you spend the time and resources required to build it.</p>]]></content:encoded></item><item><title><![CDATA[Canadian Entrepreneurs - Andrew David Osborne of Minifridge Media]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-18.png" class="kg-image" alt loading="lazy" width="742" height="417" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-18.png 600w, https://charliereese.ca/content/images/2022/01/image-18.png 742w" sizes="(min-width: 720px) 720px"></figure><blockquote>&quot;I really thought I had blown my chance at the big leagues. I felt like I was at rock bottom, and things couldn&#x2019;t get any worse. In which case, why not start my own company?&quot;</blockquote><p>Discover why Andrew David Osborne founded Minifridge Media - a <a href="https://www.minifridgemedia.com/">Toronto</a></p>]]></description><link>https://charliereese.ca/canadian-entrepreneurs-andrew-david-osborne-of-minifridge-media/</link><guid isPermaLink="false">61dd3f3a46dbae1df7ea7295</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Sat, 07 Sep 2019 07:28:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2022/01/image-18.png" class="kg-image" alt loading="lazy" width="742" height="417" srcset="https://charliereese.ca/content/images/size/w600/2022/01/image-18.png 600w, https://charliereese.ca/content/images/2022/01/image-18.png 742w" sizes="(min-width: 720px) 720px"></figure><blockquote>&quot;I really thought I had blown my chance at the big leagues. I felt like I was at rock bottom, and things couldn&#x2019;t get any worse. In which case, why not start my own company?&quot;</blockquote><p>Discover why Andrew David Osborne founded Minifridge Media - a <a href="https://www.minifridgemedia.com/">Toronto video production agency</a> shaking up corporate videos.</p><h2 id="hi-andrew-whats-your-background-and-whats-minifridge-media">Hi Andrew! What&apos;s your background, and what&apos;s Minifridge Media?</h2><p>Minifridge Media is a video production company in downtown Toronto that I started in January 2016. We create commercials, explainer videos, and corporate videos for businesses and brands across the GTA. Our goal is to create video content that is of a higher quality than the traditional bland &apos;corporate video.&#x2019; We want our videos to look like TV commercials, even if they&#x2019;re for a local insurance company.</p><p>Really, what it is is an excuse for me to do what I&#x2019;ve always done, which is write, produce, direct and edit videos. As a kid my favourite toy was the camcorder; I scored a 98% in high school videography class (that sounds like I&#x2019;m bragging but it actually wasn&#x2019;t considered cool at the time); I studied film at Queen&#x2019;s University and made comedic segments for Queen&#x2019;s TV. I&#x2019;ve had a lot of side projects, from a docu-series on stand-up comedy, to an instagram skit channel called <a href="https://www.instagram.com/thatskitcray/">@thatskitcray</a> that had 25K followers at its peak.</p><p>So I make videos whether I&#x2019;m getting paid to or not. But it sure is nice to get paid for it.</p><h2 id="what-motivated-you-to-get-started-with-minifridge-media">What motivated you to get started with Minifridge Media?</h2><p>The truth is that I lost my job and couldn&#x2019;t find another one. My first big &#x2018;film job&#x2019; out of school was at this really high-end editing firm in Toronto, which I had to intern at for months to get. I was an assistant editor on commercials for big brands like Rogers, Orville Redenbacher&#x2019;s, and FedEx.</p><blockquote><em>&quot;Getting a good job in the Toronto film business is tough. I somewhat miraculously did it once; doing it twice seemed nearly impossible.&quot;</em></blockquote><p>I lost that gig in November 2015 and landed right back to where I was when I graduated&#x2014;going around town, handing out resumes and looking for a job. Getting a good job in the Toronto film business is tough. I somewhat miraculously did it once; doing it twice seemed nearly impossible.</p><p>That was kind of a dark time for me. I really thought I had blown my chance at the big leagues. I felt like I was at rock bottom, and things couldn&#x2019;t get any worse. In which case, why not start my own company?</p><p>In hindsight, I realize that I still had a lot to lose at that point. But it doesn&#x2019;t matter if you&#x2019;re actually at rock bottom&#x2014;you just have to feel like you are, and then it&#x2019;s easier to take a big risk. So go ahead and lose your job, and maybe get your girlfriend to dump you while you&#x2019;re at it. You&#x2019;ll have the next Apple on your hands.</p><h2 id="how-have-you-attracted-customers-and-grown-minifridge-media">How have you attracted customers and grown Minifridge Media?</h2><p>When Minifridge Media started, I cold-called just about every company in Toronto asking if they needed a video. The thing is, we were brand new and didn&#x2019;t have a portfolio yet. It makes me cringe to think about, but it&#x2019;s true. I was calling businesses asking if they wanted commercials, when I hadn&#x2019;t even made one yet.</p><p>Eventually one guy told me to just stop calling him until I had made some videos. So I made some low-budget videos for my dad&#x2019;s company, and I made an explainer video for my friend Bryan Gold&#x2019;s influencer-marketing company #Paid.</p><blockquote><em>&quot;The fear of failure outweighs the fear of potentially bothering some nice executive out there.&quot;</em></blockquote><p>Once I had some work to show, the cold-calling went a little bit easier. But it&#x2019;s still hard. I do it anyway, because for me, the fear of failure outweighs the fear of potentially bothering some nice executive out there.</p><h2 id="whats-your-business-model-why-do-you-focus-on-corporate-videos">What&apos;s your business model? Why do you focus on corporate videos?</h2><p>Our business model is this: if you need video content made for your business, and you have a certain amount of money (usually starting at $5K, but sometimes it&#x2019;s as high as $50K), we&#x2019;ll make it for you. Part of that cost covers fees for writing, producing, directing, and editing. Those fees are the company&#x2019;s profits.</p><p>We started focusing on corporate videos because, especially at the beginning, we were aware of our size and knew that Old Spice wasn&#x2019;t gonna come calling to handle their Super Bowl spots. So I thought, let&#x2019;s take this dusty old genre of corporate video, which has a reputation of being cheesy and boring, and make videos for Toronto businesses that look and feel more like TV commercials.</p><p>After years of this approach, we&#x2019;re now being approached to do <em>real</em> commercials; we just finished one for <a href="https://vimeo.com/296873845">Chuck&#x2019;s Roadhouse Grill</a> that would be totally at home playing on TV in front of a Leafs game. So I think that&#x2019;s the direction we&#x2019;re heading in, although we&#x2019;re still doing plenty of corporate videos.</p><h2 id="what-do-you-think-has-had-the-biggest-impact-on-your-sales-since-you-started">What do you think has had the biggest impact on your sales since you started?</h2><p>I think that as our portfolio gets better, it&#x2019;s easier to convince companies that we can handle their video. Our early clients took a leap of faith on us. Now, we have quite a large portfolio with a lot of variety, which is reassuring to potential clients.</p><p>I&#x2019;ve also learned that there is so much that&#x2019;s out of our control as salespeople. We don&#x2019;t know what&#x2019;s happening behind those closed boardroom doors. You could pull your hair out blaming yourself when a deal doesn&#x2019;t go through, when really you were doomed from the start for some internal reason you could never have predicted, or done anything about.</p><h2 id="have-you-found-any-resources-or-habits-particularly-helpful-or-advantageous">Have you found any resources or habits particularly helpful or advantageous?</h2><p>There are a lot of resources that help me make professional videos; websites like Mandy (the casting site, not the insanely cool Nicolas Cage movie), or Voices.com with its database of voiceover actors, or Motion Array, which has After Effects templates.</p><p>As far as habits go, I wish I could tell you that I get up at 5AM every day, crunch out a bunch of one-handed push-ups and eat raw eggs for breakfast, but that&#x2019;s not the case. I actually wake up closer to 8AM and do those things. And they really help.</p><h2 id="do-you-have-any-helpful-advice-for-other-aspiring-entrepreneurs-wantrepreneurs">Do you have any helpful advice for other aspiring entrepreneurs / wantrepreneurs?</h2><p>Just start and get the first year over with.</p><p>The first year is the worst, and when it&#x2019;s done you&#x2019;ll have a pretty good idea of whether your business will work or not. So take Nike&#x2019;s advice and just do it already.</p><p>Thanks for sharing Andrew!</p>]]></content:encoded></item></channel></rss>