<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on David's Obsessions</title><link>https://www.davidsobsessions.com/categories/projects/</link><description>Recent content in Projects on David's Obsessions</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 07 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.davidsobsessions.com/categories/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>MTG Whiteboard Tokens</title><link>https://www.davidsobsessions.com/p/mtg-tokens/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.davidsobsessions.com/p/mtg-tokens/</guid><description>&lt;img src="https://www.davidsobsessions.com/p/mtg-tokens/tokens.jpg" alt="Featured image of post MTG Whiteboard Tokens" /&gt;&lt;p&gt;One of my on again off again obsessions is Magic the Gathering. My friends and I play a lot of commander which always requires lots of fiddly counters and a random assortment of tokens.&lt;/p&gt;
&lt;p&gt;I got sick of using miscellaneous bits of paper to represent tokens so I designed these dry erase tokens.&lt;/p&gt;
&lt;p&gt;The front of the token can be used to represent tokens, with a space for indicating the color, type, power and toughness.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="3024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/mtg-tokens/dry-erase.jpg" srcset="https://www.davidsobsessions.com/p/mtg-tokens/dry-erase_hu_6ea316e2bdfd7724.jpg 800w, https://www.davidsobsessions.com/p/mtg-tokens/dry-erase_hu_82beef52f419e3cd.jpg 1600w, https://www.davidsobsessions.com/p/mtg-tokens/dry-erase_hu_87be9f8645763e39.jpg 2400w, https://www.davidsobsessions.com/p/mtg-tokens/dry-erase.jpg 4032w" width="4032"&gt;&lt;/p&gt;
&lt;p&gt;The back can be used to keep track of the overall strength of a roided out commander, or the number of +1/+1 counters on a creature.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Track Counters" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="3024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/mtg-tokens/counters.jpg" srcset="https://www.davidsobsessions.com/p/mtg-tokens/counters_hu_2a41aa98fc4c5119.jpg 800w, https://www.davidsobsessions.com/p/mtg-tokens/counters_hu_ad87525e7f551a7b.jpg 1600w, https://www.davidsobsessions.com/p/mtg-tokens/counters_hu_f9261ca5b5aa0fc6.jpg 2400w, https://www.davidsobsessions.com/p/mtg-tokens/counters.jpg 4032w" width="4032"&gt; &lt;img alt="Track the overall status of a creature" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="3024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/mtg-tokens/equipment.jpg" srcset="https://www.davidsobsessions.com/p/mtg-tokens/equipment_hu_e56952113f9e9505.jpg 800w, https://www.davidsobsessions.com/p/mtg-tokens/equipment_hu_8d15c75a008a117d.jpg 1600w, https://www.davidsobsessions.com/p/mtg-tokens/equipment_hu_8e3f0529d478ca71.jpg 2400w, https://www.davidsobsessions.com/p/mtg-tokens/equipment.jpg 4032w" width="4032"&gt;&lt;/p&gt;
&lt;h2 id="make-your-own"&gt;Make Your Own
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="mtg_token_dry_erase_front.pdf" &gt;Token side PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="mtg_token_dry_erase_back.pdf" &gt;Counter side PDF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I like to make my tokens double sided. If you want to do it this way, make sure that the paper aligns correctly in your printer, otherwise you can end up with parts of the card that get cut. If your printer can do double sided print jobs then this may not be an issue.&lt;/li&gt;
&lt;li&gt;MAKE SURE YOU PRINT AT 100% size! Otherwise the tokens will be smaller than a standard magic card&lt;/li&gt;
&lt;li&gt;Use 8.5in by 11in paper. A4 will probably work as well, just make sure it&amp;rsquo;s scaled correctly.&lt;/li&gt;
&lt;li&gt;I like to use card stock instead of regular printer paper. It makes the cards feel nice and hefty&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;ve printed out the tokens you can either laminate them and then cut them or cut them and put packing tape on the front.&lt;/p&gt;
&lt;h2 id="remix-the-design"&gt;Remix the Design
&lt;/h2&gt;&lt;p&gt;The original SVGs for the cards &lt;a class="link" href="tokens.svg" &gt;are available here&lt;/a&gt;. You can use any vector editor such as &lt;a class="link" href="https://www.inkscape.org/" target="_blank" rel="noopener"
 &gt;Inkscape&lt;/a&gt; or Adobe Illustrator. The designs are licensed under the &lt;a class="link" href="https://mit-license.org/" target="_blank" rel="noopener"
 &gt;MIT open source license&lt;/a&gt;, so feel free to use, modify and re-distribute them!&lt;/p&gt;</description></item><item><title>Digital Carrot</title><link>https://www.davidsobsessions.com/p/digital-carrot/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate><guid>https://www.davidsobsessions.com/p/digital-carrot/</guid><description>&lt;img src="https://www.davidsobsessions.com/p/digital-carrot/logo-full.png" alt="Featured image of post Digital Carrot" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;I wanted to get in shape before my honeymoon back in 2025 so that I would look good in pictures and be able to handle all of the walking my wife and I were planning. I created a Python script that read how many steps I took each day from my Garmin watch and then blocked youtube until I hit 10,000 steps. This was wildly successful, helping me lose 20lb as well as get some of my focus back! I decided to that this was a product worth sharing with the world, so I created Digital Carrot.&lt;/p&gt;
&lt;p&gt;Digital Carrot is a focus app, app blocker and productivity tool. It motivates you to achieve your goals by blocking apps, websites and video games until you achieve whatever goals you set for yourself. Goals are all set and checked pragmatically. If you set a goal to walk a certain number of steps, the app will check how many steps you actually walked in Apple or Google health.&lt;/p&gt;
&lt;p&gt;For example you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Block Instagram until you walk 10,000 steps&lt;/li&gt;
&lt;li&gt;Block League of Legends until the heat death of the universe because LoL is consuming your soul and you&amp;rsquo;re better off without it&lt;/li&gt;
&lt;li&gt;Allow yourself 30 minutes a day to browse Reddit&lt;/li&gt;
&lt;li&gt;Block TikTok until you spend 60 minutes at the gym&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Goal overview" class="gallery-image" data-flex-basis="150px" data-flex-grow="62" height="1880" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/home.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/home_hu_967b53cbe9e87196.png 800w, https://www.davidsobsessions.com/p/digital-carrot/home.png 1179w" width="1179"&gt; &lt;img alt="Block social media until you walk 6000 steps" class="gallery-image" data-flex-basis="220px" data-flex-grow="92" height="1281" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/step_goal.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/step_goal_hu_b5b863b9e646cf59.png 800w, https://www.davidsobsessions.com/p/digital-carrot/step_goal.png 1179w" width="1179"&gt; &lt;img alt="Block games until you finish your todo list" class="gallery-image" data-flex-basis="187px" data-flex-grow="78" height="1506" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/todo_list.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/todo_list_hu_94cb9283756523bc.png 800w, https://www.davidsobsessions.com/p/digital-carrot/todo_list.png 1179w" width="1179"&gt;&lt;/p&gt;
&lt;p&gt;Everyone has their own set of goals that they want to achieve, so the app is designed from the ground up to be as customizable as possible. It features a plugin system that allows the app to be extended to fetch data for creating goals from anywhere. Goals are then defined pragmatically using a very simple scripting system. You can create goals using quick start templates or define your own.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Quickstart Goal to Climb Stairs" class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="535" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/qs_stairs.png" width="750"&gt; &lt;img alt="Custom goal to walk 500 steps every hour" class="gallery-image" data-flex-basis="272px" data-flex-grow="113" height="1038" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/custom_goal.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/custom_goal_hu_ae5949f379edebd8.png 800w, https://www.davidsobsessions.com/p/digital-carrot/custom_goal.png 1179w" width="1179"&gt;&lt;/p&gt;
&lt;h2 id="features"&gt;Features
&lt;/h2&gt;&lt;h3 id="pc-mobile-and-sync"&gt;PC, Mobile and Sync
&lt;/h3&gt;&lt;p&gt;Digital Carrot is more than just a mobile app!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s available on Windows and Mac as well as Android and iOS.&lt;/p&gt;
&lt;p&gt;Having a PC version is personally very important to me because I&amp;rsquo;m what the kids refer to as an &lt;a class="link" href="https://www.urbandictionary.com/define.php?term=Unc." target="_blank" rel="noopener"
 &gt;&amp;ldquo;unc&amp;rdquo;&lt;/a&gt; who prefers to watch YouTube on his laptop.&lt;/p&gt;
&lt;p&gt;The app has an optional paid feature to sync your goals and blocked items across all your devices. Sync is fully end to end encrypted. I ended up developing my own sync system rather than relying on iCloud or Dropbox for the following reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sync has to be FAST. Some data (such as Apple Watch information) is only available on your phone. When you complete your step goal, you DESERVE to be rewarded right away on your computer. You can&amp;rsquo;t wait around for the iCloud gremlins to wake up when there&amp;rsquo;s brain rot to be had!&lt;/li&gt;
&lt;li&gt;Sync has to support all devices. I have a gaming PC, MacBook and iPhone. Services like iCloud won&amp;rsquo;t sync to Windows.&lt;/li&gt;
&lt;li&gt;Sync MUST be PRIVATE. iCloud has good encryption policies, but the only way to guarantee security is to do it myself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="480px" data-flex-grow="200" height="400" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/thanos.jpg" width="800"&gt;&lt;/p&gt;
&lt;p&gt;Plus building a high performance, end to end encrypted sync was a lot of fun!&lt;/p&gt;
&lt;h3 id="commitment-mode---keep-yourself-from-cheating"&gt;Commitment Mode - Keep yourself from cheating
&lt;/h3&gt;&lt;p&gt;Commitment mode allows you to lock down your configuration with a challenge. Right now this includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entering a long string of random text&lt;/li&gt;
&lt;li&gt;Putting in a password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As with everything else in the app, unlock challenges are configurable via plugins, so these can be customized to whatever you want!&lt;/p&gt;
&lt;p&gt;The app also features uninstall prevention to keep you from cheating by just uninstalling the app.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Uninstall prevention" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="563" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/uninstall.png" width="750"&gt; &lt;img alt="Unlock challenge" class="gallery-image" data-flex-basis="338px" data-flex-grow="141" height="836" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/random_text.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/random_text_hu_d283db33f8eb77e2.png 800w, https://www.davidsobsessions.com/p/digital-carrot/random_text.png 1179w" width="1179"&gt;&lt;/p&gt;
&lt;h3 id="passes---take-a-break-when-you-need-one"&gt;Passes - Take a break when you need one
&lt;/h3&gt;&lt;p&gt;One issue I ran into from the beginning was that there are just some days that I can&amp;rsquo;t accomplish my goals. This could be because I got sick, was traveling or just wanted some extra time to play Abiotic Factor with my buddies. Getting sick was especially problematic, because I would end up disabling my website blocker and then never re-enable it.&lt;/p&gt;
&lt;p&gt;The fix here is passes. Passes can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Awarded on a monthly basis&lt;/li&gt;
&lt;li&gt;Earned by completing a goal on a rest day&lt;/li&gt;
&lt;li&gt;Earned by completing 2x your goal (such as by walking 20,000 steps on a 10,000 step goal)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can spend a pass to skip your goal for a day if you need to.&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="376px" data-flex-grow="156" height="752" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/passes.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/passes_hu_353b931166bbde8.png 800w, https://www.davidsobsessions.com/p/digital-carrot/passes.png 1179w" width="1179"&gt;&lt;/p&gt;
&lt;p&gt;Passes will be able to be configured pragmatically in an upcoming update! This means you&amp;rsquo;ll be able to do things such give yourself a pass if it&amp;rsquo;s raining or if the price of Bitcoin goes to the moon.&lt;/p&gt;
&lt;h3 id="rules---configure-how-and-when-your-distractions-are-blocked"&gt;Rules - Configure how and when your distractions are blocked
&lt;/h3&gt;&lt;p&gt;Rules let you define conditions when your blocked items are either blocked or unblocked. You can use a rule to always block everything during work hours or to unblock a block list for 30 minutes each day.&lt;/p&gt;
&lt;p&gt;Rules are also customize-able. If you wanted to, you could create a rule that unblocks Twitch when your favorite streamer is live!&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="419px" data-flex-grow="174" height="675" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.davidsobsessions.com/p/digital-carrot/rules.png" srcset="https://www.davidsobsessions.com/p/digital-carrot/rules_hu_6976a0bbb9d08837.png 800w, https://www.davidsobsessions.com/p/digital-carrot/rules.png 1179w" width="1179"&gt;&lt;/p&gt;
&lt;h3 id="plugins---create-goals-from-anything"&gt;Plugins - Create goals from anything
&lt;/h3&gt;&lt;p&gt;Plugins allow you to bring any information you want into the app. If you&amp;rsquo;d like to contribute a plugin there&amp;rsquo;s &lt;a class="link" href="https://www.digitalcarrot.app/docs/developers/" target="_blank" rel="noopener"
 &gt;documentation for it here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="download-the-app"&gt;Download the App
&lt;/h2&gt;&lt;p&gt;Get the app at &lt;a class="link" href="https://www.digitalcarrot.app/" target="_blank" rel="noopener"
 &gt;www.digitalcarrot.app&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="pricing"&gt;Pricing
&lt;/h2&gt;&lt;p&gt;The app is 100% free on PC (Windows and Mac).&lt;/p&gt;
&lt;p&gt;The mobile version is freemium with some features locked behind a paywall. You can unlock all the features on mobile for a $30 one time payment.&lt;/p&gt;
&lt;p&gt;Sync is available with a $60/yr or $8/mo subscription.&lt;/p&gt;
&lt;p&gt;The app is priced this way for the following reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I have to pay a developer fee to distribute to Android and iOS, which is offset by the freemium model&lt;/li&gt;
&lt;li&gt;The desktop version is required for people to develop plugins and I want anyone to be able to develop plugins without having to buy the app&lt;/li&gt;
&lt;li&gt;Sync is fairly expensive to maintain and requires me to constantly monitor the sync server&lt;/li&gt;
&lt;li&gt;I refuse to put ads in the app or to sell user data. Charging a small fee for the app allows me to keep maintaining it while also respecting my user&amp;rsquo;s time and privacy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really appreciate everyone who chooses to pay for the app! It&amp;rsquo;s built by one person, and my dream is to be able to make a living supporting the app.&lt;/p&gt;</description></item></channel></rss>