<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>I7T5</title><description>hello, friend :)</description><link>https://i7t5.com/</link><atom:link href="https://i7t5.com/feed" rel="self" type="application/rss+xml"/><docs>https://www.rssboard.org/rss-specification</docs><lastBuildDate>Sun, 12 Jul 2026 12:20:29 GMT</lastBuildDate><ttl>60</ttl><language>en-us</language><item><title>Free Utilities for Friends</title><link>https://i7t5.com/posts/2022-11-01-free-utilities-for-friends/</link><guid isPermaLink="true">https://i7t5.com/posts/2022-11-01-free-utilities-for-friends/</guid><description>My very first post...(i.e. it&apos;s not the greatest)</description><pubDate>Tue, 01 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;message&quot;&gt;
  New month, new post lol
&lt;/div&gt;
&lt;p&gt;It’s been quite a while since I first thought to write app / service recommendations for my friends. There’s obviously no &lt;em&gt;need&lt;/em&gt; to write about such things as everyone can read LifeWire or watch YouTube videos whatsoever. The thing is my friends aren’t as tech-savvy as I am. Who knows if by writing this I could save them some time in the future? &lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;If you, my friend or whoever may be reading this (perhaps a future friend) would like to save the reading time, scroll down bottom to see &lt;a href=&quot;#links-and-summaries&quot;&gt;links and summaries&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;websites&quot;&gt;Websites&lt;/h2&gt;
&lt;h3 id=&quot;convertio&quot;&gt;&lt;a href=&quot;https://convertio.co/&quot;&gt;Convertio&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Drag and drop any file and convert it into any format with Convertio. Convertio is a modern file converter. It supports “more than 25600 different conversions between more than 300 different file formats,” including images, documents, audio, videos, and more. Upload files via drag-n-drop or from Dropbox or Google Drive.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Today Convertio is ranked among the 1000 most visited sites in the world&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Personally I’ve never used the video feature, but for other formats it did its job well, and fast. The team aim to do all their conversions in under 1-2 minutes.&lt;/p&gt;
&lt;h3 id=&quot;9xbuddy&quot;&gt;&lt;a href=&quot;https://9xbuddy.com/&quot;&gt;9xBuddy&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Have you ever wanted to download Youtube videos? To me, 9xBuddy is the best designed downloader. It supports downloading audio, video in different definitions, subtitles (including auto-generated), and more. Lots of thanks to &lt;a href=&quot;https://123sudo.com/&quot;&gt;123SUDO&lt;/a&gt;. Sadly it doesn’t support bulk download playlist. Maybe &lt;a href=&quot;https://ddownr.com&quot;&gt;ddownr.com&lt;/a&gt; supports playlists better, but I’ve never tried it out.&lt;/p&gt;
&lt;h3 id=&quot;123apps&quot;&gt;&lt;a href=&quot;https://123apps.com&quot;&gt;123apps&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;123Apps offers ad-free video, audio, pdf tools and more with a pleasant interface. It supports Chinese.&lt;/p&gt;
&lt;p&gt;(I don’t want to write more, check them out yourself)&lt;/p&gt;
&lt;h2 id=&quot;applications&quot;&gt;Applications&lt;/h2&gt;
&lt;h3 id=&quot;adguard-browser-extension&quot;&gt;&lt;a href=&quot;https://adguard.com/en/adguard-browser-extension/overview.html&quot;&gt;AdGuard Browser Extension&lt;/a&gt;&lt;/h3&gt;
&lt;img class=&quot;float&quot; src=&quot;https://camo.githubusercontent.com/7bea478a3c3f8ec57a137113cf41f252bb7830fea08a95dfeefbc8539c468115/68747470733a2f2f63646e2e616467756172642e636f6d2f7075626c69632f416467756172642f436f6d6d6f6e2f616467756172645f657874656e73696f6e5f345f73657474696e67732e706e67&quot; title=&quot;AdGuard Screenshot&quot;&gt;
&lt;p&gt;AdGuard is a fast and lightweight ad blocking browser extension that effectively blocks all types of ads and trackers. You can find the corresponding version at your browser’s store or at their &lt;a href=&quot;https://adguard.com/en/adguard-browser-extension/overview.html&quot;&gt;website&lt;/a&gt; or on &lt;a href=&quot;https://github.com/AdguardTeam/AdguardBrowserExtension&quot;&gt;Github&lt;/a&gt;. While AdGuard offers paid desktop apps supporting advanced ad-blocking, their browser extensions are free, and even better, &lt;strong&gt;open sourced&lt;/strong&gt; (everyone can see their source code), so you don’t have to worry about privacy. AdGuard says it this way:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;AdGuard does not collect any information about you, and does not participate in any acceptable ads program. The only source of income we have is selling premium versions of our software, and we intend to keep it that way.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In the beginning I was just giving AdGuard a try, because, why not? It’s free and open source (what kept me away from ad blockers was privacy). Using it wasn’t much of a big change, until one day I for some reason turn it off, and found the internet a whole lot messier…Ad blockers are the sort of things you don’t exactly need, but once you had them you are stuck to them, I suppose.&lt;/p&gt;
&lt;h3 id=&quot;motrix&quot;&gt;&lt;a href=&quot;https://motrix.app/&quot;&gt;Motrix&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In China we have a rather popular downloader app called Xunlei. I used to cope with it, but was soon tired of the unpleasant ads. After a few searches made on Google, I found &lt;a href=&quot;https://www.freedownloadmanager.org&quot;&gt;FreeDownloadManager&lt;/a&gt; (FDM), which is what I’m currently using because I like its UI (user interface) better than Motrix. Unfortunately, FDM is closed sourced, and their website doesn’t seem too trustworthy. Motrix would be the better option for people who aren’t pedantic about UI.&lt;/p&gt;
&lt;img class=&quot;float&quot; src=&quot;https://www.freedownloadmanager.org/public/img/v2/scr_mac.svg&quot; title=&quot;FDM UI&quot;&gt;
&lt;p&gt;&lt;img src=&quot;https://camo.githubusercontent.com/cf5cde786381eb3ca6298e71e262bc86ede41201d44a39f30a5fd233a6b90bff/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032302f706e672f3132393134372f313538393738323233383530312d65376233393136362d646135382d343135322d616533342d3635613036316361666134382e706e67&quot; alt=&quot;Motrix UI&quot;&gt;
&lt;small class=&quot;secondary&quot;&gt;Which one do you like better?&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Motrix is a full-featured download manager that supports downloading HTTP, FTP, BitTorrent, Magnet, etc. In other words, it supports most of the links you would need it to recognize and is as fast as Xunlei.&lt;/p&gt;
&lt;p&gt;To me the only downside to this Motrix is its using Electron, which means it uses more memory than it needs. But most users won’t mind this as long as their computers can take it.&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;message&quot;&gt;
The following apps are for macOS only
&lt;/div&gt;
&lt;h3 id=&quot;maccy&quot;&gt;&lt;a href=&quot;https://maccy.app/&quot;&gt;Maccy&lt;/a&gt;&lt;/h3&gt;
&lt;img class=&quot;float&quot; title=&quot;Maccy Screenshot&quot; src=&quot;https://maccy.app/img/maccy/Instructions.png&quot;&gt;
Maccy is a lightweight clipboard manager for macOS. It keeps the history of what you copy and lets you quickly navigate, search, and use previous clipboard contents. It is...
-   Lightweight and fast
-   Keyboard-first
-   Secure and private
-   Native UI
-   Open source and free
&lt;h3 id=&quot;owlocr&quot;&gt;&lt;a href=&quot;https://owlocr.com&quot;&gt;OwlOCR&lt;/a&gt;&lt;/h3&gt;
&lt;img title=&quot;OwlOCR MenuBar menu&quot; src=&quot;https://owlocr.com/newmenu.png&quot; width=&quot;300&quot; height=&quot;auto&quot;&gt;
OwlOCR grabs any text on your screen and converts images or scans to searchable PDFs. You can access it via Finder Extensions. It&apos;s very easy to use:
1. Copy text: Press &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;F1&lt;/kbd&gt; or your customized keyboard shortcut (I use &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;2&lt;/kbd&gt;), or select screen capture from the menubar as shown above
2. Select area on screen
3. Paste text &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;V&lt;/kbd&gt;
&lt;p&gt;Even better, inputs can be exported to searchable PDFs.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drag and drop the non-searchable files into OwlOCR - or take screenshots / iOS scans.&lt;/li&gt;
&lt;li&gt;Run text recognition and export.&lt;/li&gt;
&lt;li&gt;Exported PDF includes invisible text layers that can be searched by most PDF readers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And there’s also an window interface to it, though I prefer keyboard and have never used it myself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://owlocr.com/openletter.png&quot; alt=&quot;OwlOCR Window Screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;See OwlOCR in action&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/WmxWbn52-M8&quot; title=&quot;OwlOCR - capture any text on Mac screenshots, images or PDFs. Privacy protected, easy to use, fast.&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;tencent-lemon-cleaner&quot;&gt;&lt;a href=&quot;https://lemon.qq.com/&quot;&gt;Tencent Lemon Cleaner&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/Tencent/lemon-cleaner/raw/master/Resource/lemon_app.png&quot; alt=&quot;Tencent Lemon Cleaner Screenshot&quot;&gt;
Tencent Lemon Cleaner is a modern and open source mac cleaner. It helps you…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find and remove large files&lt;/li&gt;
&lt;li&gt;Find and remove duplicates&lt;/li&gt;
&lt;li&gt;Find similar photos&lt;/li&gt;
&lt;li&gt;More thoroughly uninstall applications&lt;/li&gt;
&lt;li&gt;and more…
It’s a nice Tencent app…Frees you lots of space when you find your computer close to full.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;velja&quot;&gt;&lt;a href=&quot;https://sindresorhus.com/velja&quot;&gt;Velja&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/max/1400/1*j394HRc3AYt1WBnfpCjdOg.png&quot; alt=&quot;Velja Screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;With Velja, you can switch between default browsers. Velja opens links in a specific browser or a matching native app. For example, when you click on Zoom links Velja will automatically direct you to the Zoom app on your desktop, instead opening the link in your browser. Actually that is the only reason I use Velja…But it’s so lightweight and the paw icon looks so nice I don’t I see why I shouldn’t have it.&lt;/p&gt;
&lt;p&gt;Plus, I want to support the cool &lt;a href=&quot;https://sindresorhus.com/&quot;&gt;developer&lt;/a&gt; behind Velja. I enjoy his &lt;a href=&quot;https://sindresorhus.com/system-color-picker&quot;&gt;System Color Picker&lt;/a&gt; most, but I don’t think most people will find the app as useful as I do.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I actually have a rather long list of apps, but these are the ones &lt;del&gt;I can’t live without&lt;/del&gt; I found most helpful and easy to pick up.&lt;/p&gt;
&lt;h2 id=&quot;complete-list-of-apps&quot;&gt;Complete list of apps&lt;/h2&gt;
&lt;p&gt;In case someone’s curious about my complete list of apps, here it is (mostly for macOS):&lt;/p&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Name&lt;/th&gt;
        &lt;th&gt;Description&lt;/th&gt;
        &lt;th&gt;Tags&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://9xbuddy.com&quot;&gt;9xBuddy&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Online Video Downloading Website (subtitles, audio, video)&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://adguard.com/en/adguard-browser-extension/overview.html&quot;&gt;AdGuard Browser Extension&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;ad blocker (Safari version: OS)&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://www.alfredapp.com&quot;&gt;Alfred&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Enhanced Spotlight; alt: &lt;a href=&quot;https://www.raycast.com&quot;&gt;Raycast&lt;/a&gt;(memory-consuming)&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://apps.apple.com/us/app/amphetamine/id937984704?mt=12&quot;&gt;Amphetamine&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Prevents your Mac from sleeping&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://batterybuddy.app&quot;&gt;Battery Buddy&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;cute battery on your menu bar&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://convertio.co&quot;&gt;Convertio&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;file converter&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://itunes.apple.com/app/coteditor/id1024640650?ls=1&quot;&gt;CotEditor&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Mac Text Editor&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://www.freedownloadmanager.org&quot;&gt;Free Download Manager&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Download quicker!!!; alt: &lt;a href=&quot;https://motrix.app&quot;&gt;Motrix&lt;/a&gt; (OS)&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://apps.apple.com/us/app/hidden-bar/id1452453066?mt=12&quot;&gt;Hidden Bar&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Hides part of your menu bar&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://iina.io&quot;&gt;IINA&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Renowned Mac Media Player&lt;/td&gt;
        &lt;td&gt;OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://www.mowglii.com/itsycal/&quot;&gt;Itsycal&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Menubar Calendar&lt;/td&gt;
        &lt;td&gt;OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://maccy.app&quot;&gt;Maccy&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Clipboard Manager (Free at website, choose to pay $0)&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Markdown&lt;/td&gt;
        &lt;td&gt;Language for writing&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://obsidian.md&quot;&gt;Obsidian&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Knowledge-base; Markdown editor&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://apps.apple.com/us/app/id1499181666&quot;&gt;OwlOCR&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;OCR; alt: &lt;a href=&quot;https://apps.apple.com/us/app/trex-easy-ocr/id1554515538&quot;&gt;Trex&lt;/a&gt; (not as good)&lt;/td&gt;
        &lt;td&gt;AS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://marco.org/apps&quot;&gt;Quitter&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Auto quit Mac apps&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://itunes.apple.com/cz/app/standup/id1439378680?mt=12&quot;&gt;StandUp&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Menubar stand up reminder&lt;/td&gt;
        &lt;td&gt;AS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://lemon.qq.com&quot;&gt;Tencent Lemon Cleaner&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Open-source Mac cleaner&lt;/td&gt;
        &lt;td&gt;AS version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://rectangleapp.com&quot;&gt;Rectangle&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Split Mac windows&lt;/td&gt;
        &lt;td&gt;OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://kyome.io/runcat/index.html?lang=en&quot;&gt;Runcat&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Cute&lt;/td&gt;
        &lt;td&gt;AS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;a href=&quot;https://sindresorhus.com/velja&quot;&gt;Velja&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Mac Browser Switcher; alt: &lt;a href=&quot;https://apps.apple.com/uz/app/i-picker-open-with-browsers/id1556461417?mt=12&quot;&gt;i-Picker&lt;/a&gt; (AS)&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;XMind&lt;/td&gt;
        &lt;td&gt;Mindmap; alt: &lt;a href=&quot;https://www.mindnode.com&quot;&gt;Mindnode&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;AS; OS&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;!-- TODO: fix md rendering here --&gt;
&lt;ul&gt;
&lt;li&gt;AS: download from App Store&lt;/li&gt;
&lt;li&gt;OS: Open Source&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;links-and-summaries&quot;&gt;Links &amp;#x26; Summaries&lt;/h2&gt;
&lt;h4 class=&quot;no_toc&quot;&gt;Websites&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://convertio.co/&quot;&gt;Convertio&lt;/a&gt;: Convert any file to any format&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://9xbuddy.com/&quot;&gt;9xBuddy&lt;/a&gt;: Enjoy Youtube videos offline&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://123apps.com&quot;&gt;123apps&lt;/a&gt;: All-in-one PDF, audio, and video toolkit&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 class=&quot;no_toc&quot;&gt;Applications&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adguard.com/en/adguard-browser-extension/overview.html&quot;&gt;AdGuard Browser Extension&lt;/a&gt;: ad-block browser extension for Mac &amp;#x26; Windows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://motrix.app/&quot;&gt;Motrix&lt;/a&gt;: Open source downloader for Mac &amp;#x26; Windows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/id1499181666&quot;&gt;OwlOCR&lt;/a&gt;: Recognize and extract text from your Mac’s screen and PDF files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lemon.qq.com/&quot;&gt;Tencent Lemon Cleaner&lt;/a&gt;: Open source Mac cleaner&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/app/id1607635845&quot;&gt;Velja&lt;/a&gt;: Mac browser picker that opens links in a specific browser or a matching native app&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;post-references&quot;&gt;
  &lt;h6 class=&quot;no_toc&quot;&gt;References&lt;/h6&gt;
  &lt;ul&gt;
    &lt;li&gt;convertio.co&lt;/li&gt;
    &lt;li&gt;9xbuddy.com&lt;/li&gt;
    &lt;li&gt;https://adguard.com/en/adguard-browser-extension/overview.html&lt;/li&gt;
    &lt;li&gt;https://github.com/AdguardTeam/AdguardBrowserExtension&lt;/li&gt;
    &lt;li&gt;https://motrix.app/&lt;/li&gt;
    &lt;li&gt;https://maccy.app/&lt;/li&gt;
    &lt;li&gt;https://owlocr.com&lt;/li&gt;
    &lt;li&gt;https://lemon.qq.com/&lt;/li&gt;
    &lt;li&gt;https://sindresorhus.com/velja&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;</content:encoded></item><item><title>Remade website with Astro</title><link>https://i7t5.com/posts/2024-12-20/</link><guid isPermaLink="true">https://i7t5.com/posts/2024-12-20/</guid><description>Release 1.0</description><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Credits to &lt;a href=&quot;https://nelson.co&quot;&gt;Gavin Nelson&lt;/a&gt; for the design philosophy.&lt;/p&gt;</content:encoded></item><item><title>The Mathematical vs. the Intuitive Mind</title><link>https://i7t5.com/posts/2025-03-05/</link><guid isPermaLink="true">https://i7t5.com/posts/2025-03-05/</guid><description>Pensées 1.1</description><pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;TBD&lt;/p&gt;&lt;/blockquote&gt;</content:encoded></item><item><title>On a quest for the best RA duty route</title><link>https://i7t5.com/posts/2026-01-16-duty-route/</link><guid isPermaLink="true">https://i7t5.com/posts/2026-01-16-duty-route/</guid><description>We are rural postmen...</description><pubDate>Fri, 16 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-story&quot;&gt;the story&lt;/h2&gt;
&lt;p&gt;An anonymous resident assistant (RA) is trying to find the most efficient route to visit all the resident halls in her building starting from her own room and returning to it at the end of her rounds.
After the taking Theory of Algorithms, she realized that this sounds strangely similar to the Traveling Salesman Problem, which means, this is an algorithms problem.&lt;/p&gt;
&lt;details class=&quot;callout&quot; data-callout=&quot;question&quot; data-collapsible=&quot;true&quot;&gt;&lt;summary class=&quot;callout-title&quot;&gt;&lt;div class=&quot;callout-title-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12.01&quot; y2=&quot;17&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;callout-title-text&quot;&gt;What is the Traveling Salesman Problem?&lt;/div&gt;&lt;div class=&quot;callout-fold-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;m6 9 6 6 6-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;The Traveling Salesman Problem is a classic problem in computer science and mathematics. It involves finding the shortest possible route that visits a set of cities (aka nodes, or vertices) exactly once and returns to the original city. It is related to the &lt;a href=&quot;https://www.britannica.com/science/Konigsberg-bridge-problem&quot;&gt;Konigsberg Bridge Problem&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Upon further investigation, she found that this problem is called the Rural Postman Problem (RPP), which is a variation of the Traveling Salesman Problem in that we’re concerned with find the shortest route that visits a subset of edges &lt;del&gt;vertices&lt;/del&gt; in a graph. (Definition for the RPP to come later.) In her case, the edges are the hallways connecting the resident halls, and the vertices are the exits/stairwells/connectors between halls.&lt;/p&gt;
&lt;h2 id=&quot;the-setup&quot;&gt;the setup&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Definitions&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Vertices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Let each exit/stairwell/connector be a vertex. We will refer to these collectively as “exits” for simplicity.&lt;/li&gt;
&lt;li&gt;Every exit will be represented by the smallest room number adjacent (including diagonally) to the exit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Edges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(Also for simplicity) Let the number of rooms between two exits be the weight or cost of the edge connecting the two vertices, so we don’t have to worry about actual distances.&lt;/li&gt;
&lt;li&gt;The weight of one floor of stairs is to be determined, but for now we can assume it’s equivalent to 5 rooms.*&lt;/li&gt;
&lt;li&gt;We are considering A/B suites as two rooms for the purpose of counting distance, no matter if they are single, double, or triple occupancy.&lt;/li&gt;
&lt;li&gt;We are not double counting even-numbered and odd-numbered rooms since they are on opposite sides of the hall.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Objective&lt;/strong&gt;:
The RA wants to minimize the total number of rooms she has to walk through to visit all halls, and, hopefully, end up back at her own room. (If the RA didn’t care if she had to end up back at her own room, this would probably be an easier problem.)&lt;/p&gt;
&lt;h2 id=&quot;the-journey&quot;&gt;the journey&lt;/h2&gt;
&lt;h3 id=&quot;first-throughts-preprocessing&quot;&gt;First throughts: Preprocessing&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-01-16/sw_full.svg&quot; alt=&quot;South-West Building Layout&quot;&gt;&lt;/p&gt;
&lt;p&gt;*Assuming each floor is equivalent to 5 rooms. The distance between South Laundry and 201 is 10, or more accurately, two floors.&lt;/p&gt;
&lt;p&gt;The graph represents the South-West building layout with vertices as exits, stairwells, or corners and edges weighted by the number of rooms between exits. Notice the vertices are ordered left to right according to west to south, and each layer represents a floor of the building.&lt;/p&gt;
&lt;p&gt;Since West Lobby, 022, 025, Old MAP, 117, 120, and 325 are singularly connected to the rest of the graph, we can ignore them for the purposes of the RPP. But I will add the extra distance for doubling back on them to the final sum as a constant anyways, just for precision/fun.&lt;/p&gt;
&lt;p&gt;Now the graph looks like this:
&lt;img src=&quot;/assets/blog/2026-01-16/sw_no-singular.svg&quot; alt=&quot;Simplified South-West Building Layout&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;if-the-ra-doesnt-need-to-return-to-her-room&quot;&gt;If the RA doesn’t need to return to her room…&lt;/h3&gt;
&lt;p&gt;This is probably an easier problem than the RPP, but it is not the problem I want to deal with right now…&lt;/p&gt;
&lt;h3 id=&quot;if-the-ra-needs-to-return-to-her-room&quot;&gt;If the RA needs to return to her room…&lt;/h3&gt;
&lt;p&gt;Then this would be exactly the undirected RPP with a fixed starting point.&lt;/p&gt;
&lt;details class=&quot;callout&quot; data-callout=&quot;question&quot; data-collapsible=&quot;true&quot;&gt;&lt;summary class=&quot;callout-title&quot;&gt;&lt;div class=&quot;callout-title-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12.01&quot; y2=&quot;17&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;callout-title-text&quot;&gt;What exactly is the Rural Postman Problem?&lt;/div&gt;&lt;div class=&quot;callout-fold-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;m6 9 6 6 6-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;Given a graph &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;G = (V, E)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;G&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.22222em;&quot;&gt;V&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; and &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;mo&gt;⊆&lt;/mo&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;E&apos;\subseteq E&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8879em;vertical-align:-0.136em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;⊆&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;E&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; a subset of the edges of the graph (and no particular starting point), find the shortest closed path (cycle) that traverses every edge in that &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;E&apos;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; at least once and return to the starting point.
This is a general version of the better known &lt;a href=&quot;https://en.wikipedia.org/wiki/Chinese_postman_problem&quot;&gt;Chinese Postman Problem&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;Several algorithms exist to solve the RPP. &lt;a href=&quot;https://www.researchgate.net/publication/239385320_An_algorithm_for_the_Rural_Postman_Problem&quot;&gt;Christofides et al. (1981)&lt;/a&gt; proposed one of the first&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; exact algorithms to solve the RPP without approximation using a technique called branch and bound. More recently, &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0022000016300411&quot;&gt;Gutin, Wahlström, and Yeo (2017)&lt;/a&gt; proposed an exact algorithms that runs in &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(2^k)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0991em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8491em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; time, where &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; is the number of weakly connected components in the subgraph of &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; induced by &lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;E&lt;/mi&gt;&lt;mo mathvariant=&quot;normal&quot; lspace=&quot;0em&quot; rspace=&quot;0em&quot;&gt;′&lt;/mo&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;E&apos;&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;′&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; (whatever that means) based on &lt;a href=&quot;https://www.google.com/search?q=eulerian%20extensions&quot;&gt;Eulerian extensions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While Christofides et al.’s algorithm does not make any sense for me, Gutin, Walstrom, and Yeo’s algorithms actually looks approachable and interesting. (Eulerian extensions seem intuitive enough.) However, with school starting again I don’t have the time to implement them 😭. But I did get to find a couple solutions better than the one I used just from the graphs already:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-01-16/sw_sol1.jpg&quot; alt=&quot;Solution 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-01-16/sw_sol2.jpg&quot; alt=&quot;Solution 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;I suppose we can call these solutions “greedy” since we are minimizing extra stairs, after taking all the stairs that we need to walk into account. If not, they;re at least heuristic. We always try to use the fanciest terminologies :) (jk)&lt;/p&gt;
&lt;p&gt;That’s all my findings for now.&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Don’t quote me on this. There might be earlier algorithms, but this is the first one I found in my quick search, and I don’t have access to big journals etc. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Introducing nbdiff</title><link>https://i7t5.com/posts/2026-02-11-nbdiff/</link><guid isPermaLink="true">https://i7t5.com/posts/2026-02-11-nbdiff/</guid><description>A tool for comparing Mathematica notebooks that might be useful for TAs/graders.</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-story&quot;&gt;the story&lt;/h2&gt;
&lt;p&gt;A class got cancelled. I got an extra hour at the math suite. It so happened that one of my math professors decided that he should ask me if I wanted to grade Mathematica assignments for him during that one hour. I said yes, even though I do not enjoy repetitive work.&lt;/p&gt;
&lt;p&gt;As a CS student, I naturally considered writing code to automate the process, but I can’t tell the professor to rewrite his notebooks so that they’re consistently structured…So I took a step back, and developed, i.e., asked Claude Code to develop, this app that will at least save some eye strain.&lt;/p&gt;
&lt;h2 id=&quot;the-product&quot;&gt;the product&lt;/h2&gt;
&lt;p&gt;From&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-02-11/nodiff.png&quot; alt=&quot;Two Mathematica notebooks side-by-side&quot;&gt;&lt;/p&gt;
&lt;p&gt;To&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-02-11/nbdiff.png&quot; alt=&quot;A screenshot of an nbdiff window, with inputs all processed&quot;&gt;&lt;/p&gt;
&lt;p&gt;(Sorry the images don’t really show the difference…)&lt;/p&gt;
&lt;p&gt;But really the app is just a git diff on the input fields of Mathematica notebooks.
It is built using Tauri (React frontend) with a Python sidecar for running the input extraction script, which is dependent on the Python library &lt;code&gt;wolframclient&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To use the app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drag and drop the solution notebook onto the left panel&lt;/li&gt;
&lt;li&gt;Drag the student solutions onto the right panel.
&lt;ul&gt;
&lt;li&gt;Student solutions can be a single &lt;code&gt;.nb&lt;/code&gt; file or a folder with notebooks anywhere inside.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;View their difference.
&lt;ul&gt;
&lt;li&gt;If you dropped a folder, navigate between student solutions using either the buttons or your arrow keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-02-11/feature_folder.mp4&quot; alt=&quot;How the app works&quot;&gt;&lt;/p&gt;
&lt;p&gt;That’s it 🤷‍♀️&lt;/p&gt;
&lt;h2 id=&quot;back-to-the-story&quot;&gt;back to the story&lt;/h2&gt;
&lt;p&gt;Personally I found the highlighting to be very helpful for grading, especially when it comes to comparing equations like
&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;lim&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/munder&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mtext&gt;  &lt;/mtext&gt;&lt;mtext&gt;vs.&lt;/mtext&gt;&lt;mtext&gt;  &lt;/mtext&gt;&lt;munder&gt;&lt;mrow&gt;&lt;mi&gt;lim&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/munder&gt;&lt;mfrac&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\lim\limits_{x\to -3}\frac{1}{x-3}\;\text{vs.}\;\lim\limits_{x\to 3}\frac{1}{x-3}.&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.6205em;vertical-align:-0.7754em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6944em;&quot;&gt;&lt;span style=&quot;top:-2.3829em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;→&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;lim&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7754em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8451em;&quot;&gt;&lt;span style=&quot;top:-2.655em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4033em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;vs.&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop op-limits&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6944em;&quot;&gt;&lt;span style=&quot;top:-2.3829em;margin-left:0em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;→&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;mop&quot;&gt;lim&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7171em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8451em;&quot;&gt;&lt;span style=&quot;top:-2.655em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4033em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
Also, if a students gets it all right, you can immediately see there are no highlights and give them an 💯, which is quite satisfying.&lt;/p&gt;
&lt;p&gt;Now, when I grade Mathematica notebooks, I put nbdiff on my monitor, and I have the solution file along side the actual student submission notebook on my laptop. With each student submission, I look at nbdiff, locate the mistakes, and grade/comment in the actual notebook based on the solution file. I definitely do less scrolling and squinting…&lt;/p&gt;
&lt;p&gt;But I can also see the app being even more helpful.
Problem is I don’t see specifically how I can make it more helpful (at least, not without forcing the professor to structure his Mathematica notebooks a certain way).
I thought about automatic grading scripts, but then again, that will very likely require the professor to structure his notebooks a certain way…If you have any ideas, shoot me an email at &lt;a href=&quot;mailto:hello@i7t5.com&quot;&gt;hello@i7t5.com&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;(Or create a fork on &lt;a href=&quot;https://github.com/I7T5/nbdiff&quot;&gt;GitHub&lt;/a&gt; 🤷‍♀️)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-02-11/icon_32x32.png&quot; alt=&quot;Small nbdiff Icon&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title>Noteworthy RSS feeds</title><link>https://i7t5.com/posts/2026-03-07-rss-feeds/</link><guid isPermaLink="true">https://i7t5.com/posts/2026-03-07-rss-feeds/</guid><description>If only NetNewsWire could disable notification badges for certain feeds...</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Technology&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Feed URL&lt;/th&gt;&lt;th&gt;Category&lt;/th&gt;&lt;th&gt;Publish Frequency&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://singularityhub.com/&quot;&gt;Singularity Hub&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://singularityhub.com/feed/&quot;&gt;rss&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Tech&lt;/td&gt;&lt;td&gt;Daily&lt;/td&gt;&lt;td&gt;At forefront of technology&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Michael Tsai 4/day&lt;/p&gt;
&lt;p&gt;Cool websites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://utopia.fyi&quot;&gt;Utopia&lt;/a&gt;: Fluid responsive design (no more breakpoints for CSS)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Newsletters&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TLDR Tech&lt;/li&gt;
&lt;li&gt;Math with Bad Drawings&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>So long, friends... / To the newly-grads</title><link>https://i7t5.com/posts/2026-05-16-to-the-grads/</link><guid isPermaLink="true">https://i7t5.com/posts/2026-05-16-to-the-grads/</guid><description>‼️SENTIMENTALITY ALERT‼️ I hope no one reads this...</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Many of my dearest friends from college graduated not this but the last Saturday. Since then, I’ve had the priviledge to attend two very beautiful weddings (both sort-of in town) and one in which I got to be the maid of honor. But from here on after the graduates will all officially leave the little town in which our college sits and go on to live each of their incredible lives.&lt;/p&gt;
&lt;p&gt;To the my friends the graduates: You all have made such an impact in my life. Although with most of you I have not had many deep, extraordinary conversations about faith, life, or the future, I nonetheless learned a lot about these subject matters from how you faithfully live your ordinary lives.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; From Friday lunches to Sunday rides. From painting for the first time in at least 3 years to night-walking for 2h+.  From learning and playing pickleball to doing math past midnight in the student union, us math majors/minors being the only ones there. Eating, walking, chatting, reflecting, or yelling in both excitement and despair…In all that you were doing when we were together I can clearly tell that you were, at the same time, trying to love me.&lt;/p&gt;
&lt;p&gt;In most cases, you did that very well. I felt deeply “seen and known”&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; by each and every one of you, and through each and every one of you I have multiple times been reminded of God’s love for me, and therefore us. Thank you all so much for everything.&lt;/p&gt;
&lt;p&gt;May our Father in heaven, in whom we are united as one, be with you whereever you go, whatever you do. May he bless the path you will take and the work of your hands, and may he reveal to you and impress you with the abundance of his blessings for you continually.&lt;/p&gt;
&lt;p&gt;I love you all. [hug]&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I referenced an idea from our &lt;a href=&quot;https://vimeo.com/1190639728&quot;&gt;student speaker speech&lt;/a&gt; this past commencement! &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;As (another) one of my beloved mentor figures / friends likes to say. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Introducing Edmund</title><link>https://i7t5.com/posts/2026-06-26-edmund/</link><guid isPermaLink="true">https://i7t5.com/posts/2026-06-26-edmund/</guid><description>A native, lightweight Markdown editor with live preview made for macOS</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-06-26/demo-slide-v0.1.png&quot; alt=&quot;Edmund logo, summary, and demo file window&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-story&quot;&gt;the story&lt;/h2&gt;
&lt;p&gt;I’ve been using &lt;a href=&quot;https://obsidian.md&quot;&gt;Obsidian&lt;/a&gt; since before &lt;a href=&quot;https://www.theverge.com/decoder-podcast-with-nilay-patel/760522/obsidian-ceo-steph-ango-kepano-productivity-software-notes-app&quot;&gt;Steph Ango became CEO&lt;/a&gt;.
But I was never a power user with a super customized screen and more than two dozen extensions.
I stuck to the Minimal theme, hid all the controls with Hider, added Typewriter Scroll, and (other than the dozen extensions disabled) that’s it. It kept my vault looking sleek and launching fast.
And I almost never used Wikilinks and graph view 🤷‍♀️&lt;/p&gt;
&lt;p&gt;Because all I wanted was a native-feeling Markdown editor with live preview, and that for free. (Sorry, Typora.)&lt;/p&gt;
&lt;h2 id=&quot;the-why&quot;&gt;the why&lt;/h2&gt;
&lt;div class=&quot;callout&quot; data-callout=&quot;question&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;callout-title&quot;&gt;&lt;div class=&quot;callout-title-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12.01&quot; y2=&quot;17&quot;&gt;&lt;/line&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;callout-title-text&quot;&gt;Question&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;But why create another app when there’s already &lt;a href=&quot;https://github.com/mundimark/awesome-markdown-editors&quot;&gt;so many great Markdown editors&lt;/a&gt; out there? (And Obsidian, too?)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I guess the reason is, none of them is perfect enough…First of all, Obsidian is dependent on vaults, but I would rather not be bound to a particular vault (at least for some files) and be free to edit my Markdown files wherever. Second, I am spoiled by &lt;a href=&quot;https://coteditor.com&quot;&gt;CotEditor&lt;/a&gt; which, in my opinion, is the perfect text editor. And I wanted to build a Markdown editor that is also, in my opinion, perfect.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Ultimately, it comes down to taste…
– Steve Jobs&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In particular, a perfect Markdown editor should (at least)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have inline live preview,&lt;/li&gt;
&lt;li&gt;Be easy to use yet powerful, and&lt;/li&gt;
&lt;li&gt;Feel like an macOS application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://typora.io&quot;&gt;Typora&lt;/a&gt; comes really close. I even tagged my repo with “typora” since I basically modelled Edmund after it.
I’ve used the trial, and multiple times, too 🫣.
However, it does not feel like a native macOS application to me personally.
From the blocky icons on the toolbar to the lengthy app menus to the Snow-Leopard-looking settings.
To be honest, I am very picky when it comes to UI…The built in Newsprint theme looks really good, not to mention the transitions and the app’s stability in general. If only Typora could just fix those tiny details…&lt;/p&gt;
&lt;p&gt;But even then, it still won’t be native. (I’m too deep down the Apple rabbit hole…)&lt;/p&gt;
&lt;h2 id=&quot;the-product&quot;&gt;the product&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-06-26/demo-video-v0.1.mp4&quot; alt=&quot;Edmund logo, summary, and demo file window&quot;&gt;
(Yes I’m reusing the image 😬)&lt;/p&gt;
&lt;p&gt;Introducing Edmund, a native, lightweight Markdown editor with live preview made for macOS.
Some of its best features include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live preview inline&lt;/li&gt;
&lt;li&gt;100% Swift core&lt;/li&gt;
&lt;li&gt;Keyboard-first&lt;/li&gt;
&lt;li&gt;Compatible with GFM and Obsidian syntax&lt;/li&gt;
&lt;li&gt;Extension and more to come&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The GitHub repo &lt;a href=&quot;https://github.com/I7T5/Edmund&quot;&gt;Readme&lt;/a&gt; already describes the app’s features in abundant detail. Here’s a video demo so you can see it, too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-06-26/demo-slide-v0.1.png&quot; alt=&quot;Edmund demo video&quot;&gt;&lt;/p&gt;
&lt;p&gt;As of now, the app is still in beta with a lot of active development.
But I do have a &lt;a href=&quot;https://github.com/I7T5/Edmund/blob/main/docs/ROADMAP.md&quot;&gt;roadmap&lt;/a&gt; if you’re interested in where the app will be heading.&lt;/p&gt;
&lt;p&gt;In the grand scheme of things (in the tiny world of software, that is), I hope to do my best to ensure Edmund sticks close to &lt;a href=&quot;https://github.com/coteditor/CotEditor#design-philosophy&quot;&gt;CotEditor’s philosophy&lt;/a&gt; (minus the text-editor-specific part), since that’s mostly why I decided to make the app.
Along the way I also found &lt;a href=&quot;https://github.com/MarkEdit-app/MarkEdit&quot;&gt;MarkEdit&lt;/a&gt;, whose philosophy I have also somewhat picked up on.
On top of that, I also want Edmund to feel just a tiny bit humanitarian, classy, or, &lt;em&gt;warm&lt;/em&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, which is why I call it Edmund. We’ll see how that happens, if ever.
Time and the open-source community will let me know.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I hope that I’m not the only Edmund user in the world…And I won’t know because we don’t have diagnostics :D&lt;/p&gt;
&lt;p&gt;So PLEASE do let me know if you have any feedback, complaints, request, or whatsoever!
Shoot me an email at &lt;a href=&quot;mailto:hello@i7t5.com&quot;&gt;hello@i7t5.com&lt;/a&gt; anytime :)&lt;/p&gt;
&lt;p&gt;Thanks for listening. Until next time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/blog/2026-06-26/edmd_32x32.png&quot; alt=&quot;Tiny Edmund (edmd) icon&quot;&gt;&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;This somehow reminded me of how my Calculus II professor once said, “I like ‘Squeeze Theorem’ better than ‘Sandwich Theorem.’ ‘Sandwich’ reminds you of food, but ‘squeeze’ is like a hug.” &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item></channel></rss>