“We are what we repeatedly do every day. Excellence, then, is not an act, but a habit.” — Will Durant
This repo holds a letter to my present self from Better Me, a reminder for myself to never lose sight of the person I am becoming (and unbecoming). The principles and philosophies in the letter are not just words and sentences; they represent the values I believe and strive to live by every single day. These timeless insights and wisdom have been instrumental in shaping my mindset and approach to life. They are the navigation compass that guides me through life's challenges, helping me stay on course toward the true north in this fast-paced world. They also serve as an operating manual whenever I find myself feeling lost.
I built the following tools to provide different ways that integrate the letter into your daily routine, whether you're commuting, working out, or taking a moment to reflect.
Inspired by Marcus Aurelius, the shortcut will play the entire script as speech, acting like a personal life coach in your pocket.
- Click on the Shortcut download link.
- Tap on Add Shortcut to add it to your library.
- Run the shortcut manually or via Siri for hands-free access.
Instead of listening to the letter, you can also get a scheduled notification with a random excerpt from the letter at predefined times throughout the day.
- Download the shortcut.
- Launch the Shortcuts app on your iPhone.
- Navigate to the Automation tab at the bottom of the screen.
- Tap the
+
button in the top-right corner, and choose Time of Day to set a specific time and frequency (e.g., Daily, Weekly).- Alternatively, choose Alarm, Wake Up, or other triggers based on your needs/preference.
- After selecting the trigger, tap Next to proceed to the actions screen.
- Search for the Shortcut name and select it to run at the scheduled time.
It is also possible to display a random paragraph from the letter on your Home Screen. Every time you glance at your phone, you'll have a gentle reminder to center your thoughts and actions.
-
Copy the following JavaScript code into the Scriptable app by creating a new script (give it a name).
let widget = new ListWidget(); widget.backgroundColor = new Color("#000000"); widget.useDefaultPadding(); let fileContent = await new Request("https://raw.githubusercontent.com/huaminghuangtw/Dear-Today-Me/main/Dear-Today-Me.md").loadString(); let allParagraphs = fileContent.split("\n\n"); // Skip salutation and closing lines let selectedParagraphs = allParagraphs.slice(1, allParagraphs.length - 2); let randomParagraph = getRandomItem(selectedParagraphs); let plainTextFromMarkdown = convertMarkdownToPlainText(randomParagraph); let text = widget.addText(plainTextFromMarkdown); text.centerAlignText(); text.textColor = new Color("#ffffff"); // http://iosfonts.com text.font = new Font("IowanOldStyle-BoldItalic", 16); text.minimumScaleFactor = 0.1; text.textOpacity = 1; config.runsInWidget ? Script.setWidget(widget) : widget.presentMedium(); Script.complete(); // ================ // Helper funcitons // ================ function getRandomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; }; function convertMarkdownToPlainText(markdown) { // Convert headings (e.g., "# Heading" to "Heading") markdown = markdown.replace(/(^|\n)#+\s*(.+)/g, '$2'); // Convert links [text](url) to "text" markdown = markdown.replace(/\[([^\]]+)\]\([^\)]+\)/g, '$1'); // Remove bold (**text** or __text__) markdown = markdown.replace(/(\*\*|__)(.*?)\1/g, '$2'); // Remove italic (*text* or _text_) markdown = markdown.replace(/(\*|_)(.*?)\1/g, '$2'); // Remove inline code `code` markdown = markdown.replace(/`([^`]+)`/g, '$1'); // Remove code blocks ```code``` markdown = markdown.replace(/```[^`]*```/g, ''); return markdown.trim(); };
-
Save the script, then go to Home Screen, long press and add a Scriptable widget with your preferred size (small, medium, large).
-
Tap on the widget and select the script that you've just created.
Tip
Check out my other repository for customizable notifications and widgets created with Scriptable!
If you are using Obsidian, this option allows for showing a random paragraph of the letter in a callout using the Dataview plugin.
-
Make sure you have installed the Dataview plugin in Obsidian.
-
Copy the following DataviewJS code block into the e.g.
Homepage.md
in your Obsidian vault.let fileContent = await fetch("https://raw.githubusercontent.com/huaminghuangtw/Dear-Today-Me/main/Dear-Today-Me.md").then(res => res.text()); let allParagraphs = fileContent.split("\n\n"); // Skip salutation and closing lines let selectedParagraphs = allParagraphs.slice(1, allParagraphs.length - 2); let randomParagraph = getRandomItem(selectedParagraphs); let callout = ` > [!QUOTE] >> _${randomParagraph}_ `; dv.paragraph(callout); // Helper function function getRandomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; };
- If you need any help with the setup process, feel free to contact me! I will try my best to answer all your questions and look forward to any ideas, suggestions, or feedback that can help improve this project.
- I believe in the power of learning (and building) in public. If you have additional life advice (with source link) that you think could fit into the letter, feel free to contribute by creating a pull request or opening an issue to share your additions!