<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vance Lucas</title>
    <description>The latest articles on DEV Community by Vance Lucas (@vlucas).</description>
    <link>https://dev.to/vlucas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F114420%2F66561ec6-88ad-446e-b51b-47efa89183f3.jpg</url>
      <title>DEV Community: Vance Lucas</title>
      <link>https://dev.to/vlucas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vlucas"/>
    <language>en</language>
    <item>
      <title>How I Built a Google Sheets Extension Making $1.6k+ MRR</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Mon, 23 May 2022 01:55:34 +0000</pubDate>
      <link>https://dev.to/vlucas/how-i-built-a-google-sheets-extension-making-16k-mrr-1amn</link>
      <guid>https://dev.to/vlucas/how-i-built-a-google-sheets-extension-making-16k-mrr-1amn</guid>
      <description>&lt;p&gt;I created and run &lt;a href="https://www.budgetsheet.net"&gt;BudgetSheet&lt;/a&gt;, a Google Sheets Extension currently making $1.6k MRR and growing. If you have ever wondered if there was money to be made with extensions and addons, there absolutely is! Here's how I built BudgetSheet:&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick The Right Problem
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.budgetsheet.net/"&gt;BudgetSheet&lt;/a&gt; was born of frustration. I used many personal finance and budgeting apps, but was frustrated with all of them. &lt;a href="https://mint.intuit.com/"&gt;Mint&lt;/a&gt; is free, but constantly spams you with credit card and loan offers and doesn't have great budgeting tools. &lt;a href="https://www.youneedabudget.com/"&gt;YNAB&lt;/a&gt; wants you to budget their own specific way. &lt;a href="https://www.ramseysolutions.com/ramseyplus/everydollar"&gt;EveryDollar&lt;/a&gt; was slow and had a clunky UI that took 5+ clicks and a bunch of time just to re-categorize a single transaction. Multiply that times 200, and it was rage inducing 🤬. &lt;strong&gt;All I wanted was my own transactions in my own spreadsheet&lt;/strong&gt;! In a spreadsheet, I could blaze right down the "Category" column and re-categorize my 200 transactions in a few minutes! Why wasn't it easier to just use a spreadsheet for this? Clearly this was a problem that needed solving!&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore The Idea
&lt;/h2&gt;

&lt;p&gt;Extensions and addons can be fairly limited by the platform you are building into, so you need to make sure what you want to do is even possible first. I scratched my own itch and built BudgetSheet after about a week of experimenting to see if it was even possible with &lt;a href="https://developers.google.com/apps-script"&gt;Google Apps Script&lt;/a&gt;. &lt;strong&gt;Building something like BudgetSheet was not only possible, but I discovered how awesome and powerful Google Apps Script is (seriously!)&lt;/strong&gt;. It would let me do so much more than I ever thought possible - all with no hosting costs or web service to maintain! Once I realized that it was possible to build what I wanted using 100% Apps Script, I got to work. After about another month or two, I had a good first release on the &lt;a href="https://workspace.google.com/marketplace/"&gt;Google Workspace Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Charge Money
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ruhhb2r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vancelucas.com/wp-content/uploads/2022/04/Screen-Shot-2022-05-04-at-9.54.12-AM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ruhhb2r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://vancelucas.com/wp-content/uploads/2022/04/Screen-Shot-2022-05-04-at-9.54.12-AM.png" alt="Screen shot of Gumroad metrics" width="880" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Money is the ultimate validation. People will tell you all day long how cool your product is, but things get real pretty quickly when you ask for money. From the start, BudgetSheet has had a paid upgrade plan. The free version allowed users to connect 1 account, and the paid Pro version was required for connecting more than 1 account.&lt;/p&gt;

&lt;p&gt;BudgetSheet v1.0 was actually pretty awful. To use BudgetSheet, users had to go sign up for their own &lt;a href="https://plaid.com/"&gt;Plaid&lt;/a&gt; developer account, get their own API keys, plug them into a certain place in a "BSA_Settings" spreadsheet (the extension created this for you), and then connect all their bank accounts in dev mode to even get started. It was a ton of manual work, and was very error prone! &lt;strong&gt;Despite all of these ridiculous hoops to jump through and a lot of early missteps, I not only got my first paying customers, but my free to paid conversion rate was 4%&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;If you are looking for specifics, the easiest way to take money within the context of an extension or addon without having to build a payment page or web service is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Use a Gumroad link for payments along with their &lt;a href="https://help.gumroad.com/article/76-license-keys"&gt;Gumroad License Key&lt;/a&gt; service. This will generate a new unique license key per sale that will be emailed to the user.&lt;/li&gt;
&lt;li&gt; Add a screen or a form for the user to input their license key. Use the Gumroad License Key API to ensure their key is valid.&lt;/li&gt;
&lt;li&gt; Set a flag in the extension that the user has paid and record their license key (I used &lt;a href="https://developers.google.com/apps-script/guides/properties"&gt;Document Properties&lt;/a&gt; in Google Apps Script)&lt;/li&gt;
&lt;li&gt; Add logic gates around paid features that check for that flag being set&lt;/li&gt;
&lt;li&gt; ???&lt;/li&gt;
&lt;li&gt; Profit!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Focus on Stability and Quality After Validation
&lt;/h2&gt;

&lt;p&gt;Now that I knew the idea was possible AND that people would pay money for it (yes! 🙌), it was time to re-build it with a focus on stability and quality. I could now fully justify investing a lot more time into this little side project of mine to build it into something bigger.&lt;/p&gt;

&lt;p&gt;Around the same time I was evaluating all the different approaches I could take on this, Plaid reached out to me. I had gained so many users so quickly that &lt;strong&gt;Plaid had taken notice that I was having end users sign up for developer accounts, and reached out to me directly to let me know (very gently and graciously) that was a violation of their terms of service&lt;/strong&gt;. They were actually pretty impressed with what I had built, and were in the process of &lt;a href="https://plaid.com/blog/microsoft-announcement/"&gt;building something similar for Microsoft Money&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I spoke back and forth with Plaid a bit about expectations and timelines with me as a solo dev with a family and a full time job, and &lt;strong&gt;they gave me nearly 8 months to re-build the whole extension&lt;/strong&gt; around running all the connections through my own Plaid account and paying for them (the proper way!). &lt;strong&gt;The phrase "It is better to ask forgiveness than permission" has never been more true in my entire life.&lt;/strong&gt; This required a complete re-architecture, running my own web service, database, etc. - the whole deal. No more freeloading on 100% Google Apps Script and no Plaid fees (directing end users to setup their own Plaid accounts had allowed me to bypass them)!&lt;/p&gt;

&lt;p&gt;The new setup was a lot more work, maintenance, and cost compared to the 100% profit margins I was enjoying doing things the freeloader way, but it was the right thing to do. It was time for me to put some real skin in the game on this and build out a proper web service. The end result was much higher stability for bank connections and transactions, and a much nicer onboarding flow for my users with fewer manual steps. Since I could control the runtime, I could also run things faster (Apps Script is great, but it runs slow!), longer (Apps Script has low script timeouts!), and do more than I could previously - like support oAuth bank connections that required a stable URL endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Leverage Where Possible
&lt;/h2&gt;

&lt;p&gt;As a lifetime developer of 20+ years (I started very young!), my strength is on the code and tech side of things and almost non-existent on the sales and marketing side of things. Creating an addon was a perfect solution to this, because &lt;strong&gt;Google has over 3 billion users and provides a built-in marketplace and distribution channel to funnel users straight to me&lt;/strong&gt; without me having to lift a finger.&lt;/p&gt;

&lt;p&gt;Naming is important for discovery both in the marketplace and SEO. So I chose the name "BudgetSheet" to leverage those looking for tools that helped them budget in spreadsheets. Strong brand names are ultimately better in the long run so I may re-brand at some point, but I think this name that is more specific to what I am targeting has really helped me get a great start.&lt;/p&gt;

&lt;p&gt;Time is the most precious resource, and I knew that my time was going to be seriously constrained between my family, my full time job, and growing BudgetSheet on the side. When building out the web service, I made very specific technology choices like Serverless tech with &lt;a href="https://nextjs.org"&gt;Next.js&lt;/a&gt; and &lt;a href="https://vercel.com"&gt;Vercel&lt;/a&gt; that would completely eliminate me worrying about servers, software upgrades, uptime, SSL certs, scaling, capacity, etc. I also use &lt;a href="https://aws.amazon.com/rds/"&gt;Amazon AWS RDS&lt;/a&gt; for PostgreSQL. Now &lt;strong&gt;I can focus nearly 100% on the product, the code and data without any concern for servers or deployments&lt;/strong&gt;. Vercel and RDS have been well worth the cost for the piece of mind they offer and the time the save me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Have Fun
&lt;/h2&gt;

&lt;p&gt;BudgetSheet is a joy to run. As a spreadsheet lover myself, I often think to myself "these are my people" when a user sends me a cool formula or shares charts and graphs of things they have done with their finances using BudgetSheet. I love when users share these things or just pass along some nice comments. It's an amazing feeling, and it is consistent validation that BudgetSheet is solving a real problem for many people.&lt;/p&gt;

&lt;p&gt;Seeing real traction and getting such positive customer feedback is such a game changer. I have launched many things over the years, but BudgetSheet is by far the most fun startup to run out of all of them. It is also the only one to grow so much organically.&lt;/p&gt;

&lt;p&gt;Make a good product that you are proud of in a space that you love, and you will have fun running it along the way. It's the best way to stay sane and do what you love.&lt;/p&gt;

&lt;p&gt;If you made it this far and you like spreadsheets, &lt;a href="https://www.budgetsheet.net/"&gt;&lt;strong&gt;check out BudgetSheet&lt;/strong&gt;&lt;/a&gt;! It's free to try for 45 days, so there is nothing to lose. Who, knows? You might like it!&lt;/p&gt;

</description>
      <category>addons</category>
      <category>extensions</category>
      <category>javascript</category>
      <category>google</category>
    </item>
    <item>
      <title>Work Hard and Don’t Burn Bridges</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Wed, 09 Jun 2021 14:43:33 +0000</pubDate>
      <link>https://dev.to/vlucas/how-6-months-of-work-over-2-summers-during-an-internship-lead-to-an-opportunity-that-transformed-my-career-3g40</link>
      <guid>https://dev.to/vlucas/how-6-months-of-work-over-2-summers-during-an-internship-lead-to-an-opportunity-that-transformed-my-career-3g40</guid>
      <description>&lt;p&gt;On a cold December day in 2014 I got a random call from a contact that had lay dormant in my phone for 12 years. It was Ryan, the owner of Element Fusion – a company that I had worked for in the summers of 2004 and 2005 while I was in college. &lt;a href="https://www.netsuite.com"&gt;NetSuite&lt;/a&gt; had recently acquired Element Fusion (EF) and they were looking to hire JavaScript developers to help build a custom Content Management System into NetSuite’s E-commerce platform. It was good timing for me. It was big and ambitious – full of challenges and unknowns. We talked for a bit on the phone about the opportunity and what was needed. I went in for an interview, &lt;a href="https://vancelucas.com/blog/working-for-the-man/"&gt;and took the job&lt;/a&gt;. Things went well – &lt;em&gt;really&lt;/em&gt; well. After about a year of hard work leading and implementing the new CMS architecture, I was promoted to Principal Software Engineer and JavaScript Team Lead. I stayed there almost 4 more years before moving on – completing all the code changes I wanted to make, coordinating with the Uruguay office (and their half of our product), building the product and leading the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The somewhat insignificant 6 months of work over 2 summers during an internship lead to an opportunity that transformed my career&lt;/strong&gt;. I had always written a lot of JavaScript, but never full-time before NetSuite, and never exclusively on the front-end – I had always been a full-stack developer in every previous job, and even in the freelance consulting I did as well. My time at NetSuite enabled me to re-shape my career into an expert front-end/React developer and a effective team leader that was able to get some pretty hard things done and change the trajectory of the product we were building to a much better one than the course it was on before I got there.&lt;/p&gt;

&lt;p&gt;Thinking back to my internship at EF, I did some good work while I was there. learned a lot, and made a good impression. At the end of my internship in 2004, I was invited to return as an intern again the next summer (2005). At the end of my internship in 2005, &lt;strong&gt;EF wanted to hire me full-time, even while I was still in college&lt;/strong&gt;. They were confident they could make everything work around my schedule. I thought about it for a while, but ultimately &lt;strong&gt;turned it down&lt;/strong&gt;. I didn’t want to have a full-time work commitment while trying to focus on my studies in college and getting my degree. EF was also deep into the Microsoft development stack with ASP and .NET, which was interesting to learn, but I did not want to work in the Microsoft tech stack full time back then. I preferred open source tech stacks like JavaScript, PHP, and MySQL and wanted to advance further with those. I was direct and upfront with Ryan about all of this, and left on amicable terms. Though our parting in 2005 was friendly, I never expected to work there ever again.&lt;/p&gt;

&lt;p&gt;Fast-forward 11 years later, and I was working for Ryan again after a single phone call. I got a handsome salary and RSU package – just because (1) he remembered my strong skill set and good work ethic, and (2) now that NetSuite had acquired them, they had to develop a new product and integration with an open source tech stack and needed deep JavaScript expertise, which I now had by focusing on it for over a decade. But (3) most importantly, &lt;strong&gt;I didn’t burn a bridge when I left, and I left a good impression when I was there&lt;/strong&gt;. This was even though I didn’t like Element Fusion’s tech stack and was pretty sure in 2005 that I would never work there again because of that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never burn bridges&lt;/strong&gt;. You never know where they might lead in the future, or if you will ever need to cross them again. &lt;strong&gt;Always do your best work&lt;/strong&gt; , even if it seems futile. Even if the work itself doesn’t ultimately matter, &lt;strong&gt;people around you will notice and remember&lt;/strong&gt;. People move jobs, companies get bought, and things change. It could lead to an amazing opportunity in your future, even when you least expect it.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://vancelucas.com/blog/work-hard-and-dont-burn-bridges/"&gt;Work Hard and Don’t Burn Bridges&lt;/a&gt; appeared first on &lt;a href="https://vancelucas.com"&gt;Vance Lucas&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opinion</category>
      <category>advice</category>
      <category>leadership</category>
      <category>work</category>
    </item>
    <item>
      <title>How to sleep() With Promises and async/await</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Thu, 10 Sep 2020 15:25:42 +0000</pubDate>
      <link>https://dev.to/vlucas/how-to-sleep-with-promises-and-async-await-1lm8</link>
      <guid>https://dev.to/vlucas/how-to-sleep-with-promises-and-async-await-1lm8</guid>
      <description>&lt;p&gt;Occasionally you may find the need to &lt;code&gt;sleep&lt;/code&gt; for a bit or use &lt;code&gt;setTimeout&lt;/code&gt; in your code or your test suite if some async work is going on that you know will finish during that time (like a quick deferred function or something like that). Here’s an easy way to do it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function sleep(ms) {
  return new Promise(resolve =&amp;gt; setTimeout(resolve, ms));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now you can use it wherever you need to like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await sleep(1000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Caveat&lt;/strong&gt; : Keep in mind that generally random &lt;code&gt;setTimeout&lt;/code&gt; calls are a code smell – ideally you would know what you are waiting on and chain things up to happen after that work is done, or orgainze your code so that you know what you are waiting on specifically. This &lt;code&gt;sleep&lt;/code&gt; method is for those times where that is not possible.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>technical</category>
      <category>javascript</category>
      <category>promises</category>
    </item>
    <item>
      <title>How to Fix Git fatal: The current branch has no upstream branch</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Thu, 20 Aug 2020 15:44:38 +0000</pubDate>
      <link>https://dev.to/vlucas/how-to-fix-git-fatal-the-current-branch-has-no-upstream-branch-9i6</link>
      <guid>https://dev.to/vlucas/how-to-fix-git-fatal-the-current-branch-has-no-upstream-branch-9i6</guid>
      <description>&lt;p&gt;If you constantly get the following git error message after attempting a &lt;code&gt;git push&lt;/code&gt; with a new local branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fatal: The current branch &amp;lt;branchname&amp;gt; has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin &amp;lt;branchname&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the issue is that you have not configured git to always create new branches on the remote from local ones.&lt;/p&gt;

&lt;p&gt;The permanent fix if you always want to just create that new branch on the remote to mirror and track your local branch is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; git config --global push.default current
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can &lt;code&gt;git push&lt;/code&gt; without anymore errors!&lt;/p&gt;

</description>
      <category>howto</category>
      <category>programming</category>
      <category>software</category>
      <category>git</category>
    </item>
    <item>
      <title>Scorched Earth: Quitting Twitter and Deleting Everything</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Wed, 05 Aug 2020 16:48:22 +0000</pubDate>
      <link>https://dev.to/vlucas/scorched-earth-quitting-twitter-and-deleting-everything-32ko</link>
      <guid>https://dev.to/vlucas/scorched-earth-quitting-twitter-and-deleting-everything-32ko</guid>
      <description>&lt;p&gt;After getting into yet another stupid and pointless opinion scuffle on Twitter where no one wins, I decided to pull the plug and just quit Twitter completely for a while.&lt;/p&gt;

&lt;p&gt;It’s not really the specific exchange of tweets that was the issue this time because it was honestly pretty mild and not super antagonistic. It’s just that &lt;strong&gt;I finally fully realized just how completely pointless it all is, and what a massive waste of time it is.&lt;/strong&gt; No one wins or proves anything, and no one changes their mind. The only thing achieved is that everyone gets upset and mad at each other, misunderstands each other, takes the other person’s text to mean the worst possible thing, and talks past each other. So in the end it’s actually worse than pointless. Twitter is great for some things, but &lt;strong&gt;most serious discourse on Twitter is actively harmful&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With social media, we spend more time reading other people’s random opinions and knee-jerk reactions to current events, and less time reading carefully considered thoughts and factually informed opinions from experts and experienced professionals.&lt;/strong&gt; It’s exactly the opposite of what we as a society should be doing.&lt;/p&gt;

&lt;p&gt;I finally got to a point mentally where I could not in good conscience continue participating in this madness. Time is precious. Don’t waste yours anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delete all your tweets and likes
&lt;/h2&gt;

&lt;p&gt;Quitting Twitter wasn’t enough for me. The whole ecosystem is so bad that people are actually incentivized to trudge through all your old tweets and textual vomits, and then weaponize them against you. I’ve seen it happen over and over and over. I have always been relatively careful of what I publicly share and most of my strong opinions aren’t too far away from mainstream anyways so I am not too concerned about this. Nevertheless, the risk is still there no matter what because popular opinions change over time.&lt;/p&gt;

&lt;p&gt;The only real solution to significantly reduce or eliminate this risk is to delete everything. So I did this, and then wrote a separate post on &lt;a href="https://vancelucas.com/blog/how-to-delete-tweets-and-likes-from-twitter/"&gt;how to delete all your tweets and likes from Twitter&lt;/a&gt; if you are interested in doing the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is This The End?
&lt;/h2&gt;

&lt;p&gt;Not quite. I am not going to interact on Twitter at all (no tweets or likes, etc.) for a while – I am not sure how long. At least a few months most likely. However, I am still keeping my Twitter account itself, and may check my feed once a week or so to keep a pulse on current events (something Twitter does well). I may also hook up this blog to it to auto-post any new blog posts that I write for a little extra exposure for those that still follow me on Twitter.&lt;/p&gt;

&lt;p&gt;As much as I have just riffed on Twitter in this post, it still does have its uses. &lt;strong&gt;I have made connections and had some real interactions with more of my industry peers on Twitter than I ever did with LinkedIn&lt;/strong&gt; – a social network with the explicit purpose of professional/work connections (what does that say about the state of LinkedIn?).&lt;/p&gt;

&lt;p&gt;If/when I do come back to Twitter, &lt;em&gt;I will take an entirely different approach to it&lt;/em&gt;. I can’t allow myself to get sucked into it again the same way I did before. I am still thinking through what that might be or what that would look like. I don’t want to get sucked into Twitter again, where I am just mindlessly scrolling through my feed and posting whatever thoughts come into my mind at the moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving Forward
&lt;/h2&gt;

&lt;p&gt;My ideal future would be more blogging and long-form thoughtful communication; less off the cuff remarks and knee-jerk reactions. &lt;strong&gt;The things you and I post online are forever. They should be our best thoughts, tempered with wisdom, viewed through the lens of reality and facts&lt;/strong&gt;. Social media as it exists today isn’t built for that. It doesn’t seem like it ever will be.&lt;/p&gt;

</description>
      <category>opinion</category>
      <category>twitter</category>
      <category>socialmedia</category>
    </item>
    <item>
      <title>How to Delete Tweets and Likes from Twitter</title>
      <dc:creator>Vance Lucas</dc:creator>
      <pubDate>Wed, 05 Aug 2020 16:21:13 +0000</pubDate>
      <link>https://dev.to/vlucas/how-to-delete-tweets-and-likes-from-twitter-2kpn</link>
      <guid>https://dev.to/vlucas/how-to-delete-tweets-and-likes-from-twitter-2kpn</guid>
      <description>&lt;p&gt;I &lt;a href="https://vancelucas.com/blog/scorched-earth-quitting-twitter-and-deleting-everything/"&gt;recently quit Twitter&lt;/a&gt; and deleted all my tweets and likes. This post shows how you can do the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delete All Your Tweets
&lt;/h3&gt;

&lt;p&gt;Start out by deleting all your tweets. You can use a &lt;a href="https://tweetdelete.net"&gt;3rd party tweet delete tool&lt;/a&gt; to do this for you for free for up to 3200 tweets, and it’s quick and easy.&lt;/p&gt;

&lt;p&gt;I think I had right around 3,100 or so tweets, so I was just under the free limit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delete All Your Likes
&lt;/h3&gt;

&lt;p&gt;Deleting all your likes seems to be a lot more difficult than deleting all your tweets. I am not sure why, but a lot of tools don’t offer it as an option. It also appears to be rate-limited, so you may have to make multiple attempts at this over several days before you are able to unlike everything if you have lots of likes.&lt;/p&gt;

&lt;p&gt;Go to your likes page: &lt;code&gt;https://twitter.com/&amp;lt;username&amp;gt;/likes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/tools/chrome-devtools/open"&gt;Open up the Developer Tools&lt;/a&gt; console, and paste in the following script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function _unlikeAll() {
  const randomNumber = (x, y) =&amp;gt; ~~(Math.random() * y) + x;
  let unlikes = Array.from(document.querySelectorAll('[data-testid="unlike"]'));

  unlikes.forEach((unlikeEl) =&amp;gt; {
    setTimeout(() =&amp;gt; {
      unlikeEl.click();
    }, randomNumber(100, 8500));
  });

  window.scrollTo(0, document.body.scrollHeight);
}
var interval = setInterval(_unlikeAll, 12000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let this run for a while. Use a tool like &lt;a href="https://www.intelliscapesolutions.com/apps/caffeine"&gt;Caffieine&lt;/a&gt; to keep your computer awake while this is running if needed.&lt;/p&gt;

&lt;p&gt;This script stopped a few times for me, so I had to re-run it over the course of a few days to get everything. Twitter seems to have some kind of rate-limiting built into their web API, so you may run into it also.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleanup
&lt;/h3&gt;

&lt;p&gt;After authorizing apps to delete tweets for you (which requires full read and write access), make sure to head over to the &lt;a href="https://twitter.com/settings/applications"&gt;authorized applications settings&lt;/a&gt; page on your Twitter account and revoke access to all the various apps you have used over the years.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other Options
&lt;/h3&gt;

&lt;p&gt;Here are a few more scripts and things I found when researching how to do this. Some of them worked, and some of them did not. If the above script is not working well for you, feel free to try a few others:&lt;/p&gt;

&lt;p&gt;GitHub Gist: delete-likes-from-twitter.js: &lt;a href="https://gist.github.com/aymericbeaumet/d1d6799a1b765c3c8bc0b675b1a1547d"&gt;https://gist.github.com/aymericbeaumet/d1d6799a1b765c3c8bc0b675b1a1547d&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Gist: delete-rt-and-tweets.js: &lt;a href="https://gist.github.com/FocusWho/5a8e74895293eae0071cec612477c72f"&gt;https://gist.github.com/FocusWho/5a8e74895293eae0071cec612477c72f&lt;/a&gt;&lt;/p&gt;

</description>
      <category>howto</category>
      <category>socialmedia</category>
      <category>twitter</category>
    </item>
  </channel>
</rss>
