<?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, the founder of ForecastOS Hivemind. I like to work where finance, investing, data science, and software intersect.]]></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, 09 May 2026 03:05:54 GMT</lastBuildDate><atom:link href="https://charliereese.ca/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[My 12 Career Principles]]></title><description><![CDATA[<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</p>]]></description><link>https://charliereese.ca/my-12-career-and-business-principles/</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[<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><p><em>EDIT: I&apos;ve since learned that some <a href="https://www2.psych.ubc.ca/~henrich/pdfs/Cheng%20et%20al.%20(2013)%20-%20Two%20Ways%20to%20the%20Top.pdf">psychologists think there are two main leadership strategies: A) dominance and B) prestige / accomplishment</a>. Try to seek out leaders who lead by prestige / accomplishment &#x2013; you&apos;ll learn more from them (and probably like them more).</em></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[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[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[A Drake Twitter-Bot - Automating the 6 God]]></title><description><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png" class="kg-image" alt loading="lazy" width="1182" height="522" srcset="https://charliereese.ca/content/images/size/w600/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 600w, https://charliereese.ca/content/images/size/w1000/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 1000w, https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 1182w" sizes="(min-width: 720px) 720px"></figure><p>I was at a bar with an old group of friends over the holidays. While we were waiting in line, one of them mentioned that he heard about a Twitter-bot that replied to tweets containing Biggie Smalls lyrics with other Biggie Smalls lyrics.</p><p>I thought the idea was hilarious, and</p>]]></description><link>https://charliereese.ca/a-drake-twitter-bot-automating-the-6-god/</link><guid isPermaLink="false">61dd41f546dbae1df7ea72d3</guid><dc:creator><![CDATA[Charlie Reese]]></dc:creator><pubDate>Tue, 09 Jan 2018 08:38:00 GMT</pubDate><content:encoded><![CDATA[<figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png" class="kg-image" alt loading="lazy" width="1182" height="522" srcset="https://charliereese.ca/content/images/size/w600/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 600w, https://charliereese.ca/content/images/size/w1000/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 1000w, https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.30.41-pm.png 1182w" sizes="(min-width: 720px) 720px"></figure><p>I was at a bar with an old group of friends over the holidays. While we were waiting in line, one of them mentioned that he heard about a Twitter-bot that replied to tweets containing Biggie Smalls lyrics with other Biggie Smalls lyrics.</p><p>I thought the idea was hilarious, and after one or five beers decided it was something I had to build. However, I wanted to do things a little differently:</p><ol><li><s>I rep the 6</s> I am from Toronto, so the Twitter-bot would be for Drake - a.k.a the DrizzyBot</li><li>The DrizzyBot would reply to tweets containing Drake lyrics with the next line of the song</li><li>The DrizzyBot would run at regular intervals with no human interaction</li><li>The DrizzyBot would not be flagged as spam by Twitter&apos;s (admittedly fairly impressive) spam filters</li></ol><p>After a day of programming, tinkering, and giggling, the DrizzyBot was born.</p><figure class="kg-card kg-image-card"><img src="https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.27.51-pm.png" class="kg-image" alt loading="lazy" width="1188" height="530" srcset="https://charliereese.ca/content/images/size/w600/2026/04/Screenshot-2026-04-28-at-12.27.51-pm.png 600w, https://charliereese.ca/content/images/size/w1000/2026/04/Screenshot-2026-04-28-at-12.27.51-pm.png 1000w, https://charliereese.ca/content/images/2026/04/Screenshot-2026-04-28-at-12.27.51-pm.png 1188w" sizes="(min-width: 720px) 720px"></figure><h1 id="technical-requirements-to-build-the-drizzybot">Technical Requirements to Build the DrizzyBot</h1><p>The following languages / software / packages are needed to build and run the DrizzyBot:</p><ol><li><a href="https://www.ruby-lang.org/en/downloads/">Ruby</a> (at least version 2.1)</li><li>The (ruby) twitter gem</li></ol><pre><code class="language-shell">$ gem install twitter    
</code></pre><ol><li><a href="https://git-scm.com/downloads">Git</a></li><li><strong>OPTIONAL</strong>: a linux environment for scheduling recurring cron jobs; I use a (perpetually running) <a href="https://www.raspberrypi.org/">Raspberry Pi</a> that my brother bought me for Christmas - thanks Tom!</li></ol><h1 id="building-the-drizzybot">Building the DrizzyBot</h1><h3 id="a-initial-set-up">A. Initial Set Up</h3><ul><li>Create and save bot.rb file in root directory (I called my root directory twitter_bot)</li><li>In bot.rb file, require Twitter gem and standard library (Date) class we will be using:</li></ul><pre><code class="language-ruby">require &apos;twitter&apos;
require &apos;date&apos;
</code></pre><h3 id="b-create-a-twitter-application">B. Create a Twitter Application</h3><ul><li>Create a <a href="https://apps.twitter.com/">twitter application here</a></li><li>Record your:</li></ul><ol><li>Consumer key</li><li>Consumer secret</li><li>Access token (generate first in <em>Keys and Access Tokens</em>)</li><li>Access token secret (generate first in <em>Keys and Access Tokens</em>)</li></ol><h3 id="c-create-a-file-containing-passwords">C. Create a File Containing Passwords</h3><ul><li>Create and save passwords file in root directory</li><li>Create a .gitignore file in root directory and add the passwords file to it:</li></ul><pre><code class="language-shell"># passwords
.passwords
</code></pre><ul><li>In .passwords file, create constant variables for passwords (containing keys from step B.):</li></ul><pre><code class="language-ruby">CONSUMER_KEY        = &quot;consumer_key123456abcdef&quot;
CONSUMER_SECRET     = &quot;consumer_secret123456abcdef&quot;
ACCESS_TOKEN        = &quot;access_token123456abcdef&quot;
ACCESS_TOKEN_SECRET = &quot;access_token_secret123456abcdef&quot;
</code></pre><h3 id="d-create-drizzybot-class">D. Create DrizzyBot Class</h3><ul><li>In bot.rb file, require .passwords file and write initialize method:</li></ul><pre><code class="language-ruby">require &apos;twitter&apos;
require &apos;date&apos;

# load passwords from dotfile here

class DrizzyBot
  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        = CONSUMER_KEY
      config.consumer_secret     = CONSUMER_SECRET
      config.access_token        = ACCESS_TOKEN
      config.access_token_secret = ACCESS_TOKEN_SECRET
    end
  end
end
</code></pre><h3 id="e-copy-and-paste-lyrics-to-various-drake-songs">E. Copy and Paste Lyrics to Various Drake Songs</h3><ul><li>Create lyrics.yaml file in root directory</li><li>Download song lyrics in the following format (album, song, lyric; please excuse syntax highlighting):</li></ul><pre><code class="language-yaml">thank_me_later:
    over:
     - Bottles on me
     - Long as someone drink it
     - Never drop the ball
     - F!ck y&apos;all thinking?
     - Making sure the young money ship is never sinking
     - Bout to set it off in this bitch Jada Pinkett
     - I shouldn&apos;t have drove
     - Tell me how I&apos;m getting home
</code></pre><ul><li>Create lyrics.rb file in root directory</li><li>In lyrics.rb file, load lyrics.yaml file:</li></ul><pre><code class="language-ruby">require &apos;yaml&apos;
lyrics = YAML.load_file(File.join(__dir__, &apos;./lyrics.yaml&apos;))
ALBUMS = lyrics
</code></pre><ul><li>In bot.rb file, import ALBUMS constant by requiring lyrics.rb file:</li></ul><pre><code class="language-ruby">require &apos;twitter&apos;
require &apos;date&apos;
require_relative &apos;lyrics&apos;

# load passwords from dotfile here

class DrizzyBot
  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        = CONSUMER_KEY
      config.consumer_secret     = CONSUMER_SECRET
      config.access_token        = ACCESS_TOKEN
      config.access_token_secret = ACCESS_TOKEN_SECRET
    end
  end
end
</code></pre><h3 id="f-write-drizzybot-rap-logic">F. Write DrizzyBot Rap Logic</h3><ol><li>Add method to (like and) reply to tweets containing (case insensitive) lyrics from a specified album and song with the next line of the song: see <strong>reply_to_tweets(album, song)</strong></li></ol><ul><li>Must create method that finds matching tweets (contains lyrics without matching next phrase of song): see <strong>find_tweets(phrase, next_phrase)</strong></li><li>Must create method that finds the most popular tweet, as replying to too many tweets will flag us as a bot: see <strong>most_popular_tweet(phrase, next_phrase)</strong></li><li>Must create method that likes tweet and generates reply with the next phrase of the song, the song name, and the album name: see <strong>reply_to_matching_tweets(phrase, next_phrase, album, song)</strong></li></ul><p>2. Add method to tweet random lyrics to circumvent being identified as a bot (only replying to tweets will flag you, as will tweeting the same content consecutively): see <strong>tweet_phrase_from_song(album, song)</strong></p><p>After adding the above logic, your bot.rb file will look like this:</p><pre><code class="language-ruby">require &apos;twitter&apos;
require &apos;date&apos;
require_relative &apos;lyrics&apos;

# load passwords from dotfile here

class DrizzyBot
  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key        = CONSUMER_KEY
      config.consumer_secret     = CONSUMER_SECRET
      config.access_token        = ACCESS_TOKEN
      config.access_token_secret = ACCESS_TOKEN_SECRET
    end
  end

  def reply_to_tweets(album, song)
    phrase_arr = ALBUMS[album][song]

    phrase_arr[0...-1].each_with_index do |phrase, idx| # can&apos;t reply to last phrase with next phrase
      reply_to_matching_tweets(phrase, phrase_arr[idx + 1], album, song)
    end
  end

  def tweet_phrase_from_song(album, song)
    phrase_arr = ALBUMS[album][song]
    phrase = phrase_arr.sample

    puts &quot;DrizzyBot tweeted: #{phrase} ##{album} ##{song}&quot;

    @client.update(&quot;#{phrase} ##{album} ##{song}&quot;)
  end

  private

  def find_tweets(phrase, next_phrase)
    tweets = @client.search(phrase, {result_type: &apos;recent&apos;}).take(500) # limits to 500
  
    tweets.select do |tweet|
      today = Date.today === Date.parse(tweet.created_at.to_s)

      tweet.full_text.match(/#{phrase}/i) &amp;&amp; 
      !tweet.full_text.match(/#{next_phrase}/i) &amp;&amp;
      today
    end
  end

  def most_popular_tweet(phrase, next_phrase)
    tweets = find_tweets(phrase, next_phrase)

    if tweets.empty?
      false
    else
      tweets.sort! do |a, b|
        b.favorite_count &lt;=&gt; a.favorite_count
      end
      
      tweets.first
    end
  end

  def reply_to_matching_tweets(phrase, next_phrase, album, song)
    tweet = most_popular_tweet(phrase, next_phrase)

    if tweet &amp;&amp; !tweet.user.screen_name.match(/The110God/i) # tweet exists and isn&apos;t my account
      screen_name = &apos;@&apos; + tweet.user.screen_name
      album = album.gsub(&apos;_&apos;, &apos;&apos;)
      song = song.gsub(&apos;_&apos;, &apos;&apos;)

      puts &quot;Favorited then tweeted at: #{screen_name}&quot;

      @client.favorite(tweet)
      @client.update(&quot;#{screen_name} #{next_phrase} ##{song} ##{album} #drizzybot&quot;, 
                    in_reply_to_status_id: tweet.id)
      
      sleep(rand(300) + 180) # add 3 - 8 minute gap between tweets
    end
  end
end
</code></pre><h3 id="g-create-drizzybot-object-and-prepare-it-to-tweet">G. Create DrizzyBot Object and Prepare it to Tweet</h3><p>At the bottom of your bot.rb file (after the last &apos;end&apos;), instantiate a DrizzyBot object and instruct it to (1) reply to tweets and (2) tweet random lyrics from a given album / song (song must be in lyrics.yaml file):</p><pre><code class="language-ruby">drizzy_bot = DrizzyBot.new
drizzy_bot.reply_to_tweets(&apos;views&apos;, &apos;one_dance&apos;) # 1
drizzy_bot.tweet_phrase_from_song(&apos;views&apos;, &apos;one_dance&apos;) # 2
</code></pre><h3 id="h-execute-botrb-file">H. Execute bot.rb File</h3><p>From your terminal, change into your root directory and type:</p><pre><code class="language-shell">$ ruby bot.rb
</code></pre><p>And that&apos;s it! Your very own DrizzyBot. </p><h3 id="i-optional-set-up-crontab">I. OPTIONAL: Set up Crontab</h3><p>If you want to have your Twitter-bot send tweets without having to lift a finger, and you have a linux environment on your computer, open your crontab:</p><pre><code class="language-shell">$ crontab -e
</code></pre><p>And add the following code to execute your Twitter-bot every day at 12:01 pm (<strong>your file paths will differ</strong>; please excuse the syntax highlighting):</p><pre><code class="language-shell">1 12 * * * cd /home/pi/programming/twitter_bot &amp;&amp; ruby bot.rb
</code></pre><p>Now you have a DrizzyBot that lives on its own!</p>]]></content:encoded></item></channel></rss>