Automate Obsidian Notes to Speech
Build a Tasker automation that reads your Obsidian daily note aloud each evening.
Introduction
30 Second Summary
You write in your journal every day, but when was the last time you actually went back and read what you wrote? Hearing your own words spoken back to you turns forgotten notes into a daily reflection habit.
In this project, you will build an Android automation that reads your daily journal note aloud every evening using your phone's built-in speech engine.
What You'll Build
A fully automated "daily note reader" on your Android phone that finds today's Obsidian note, strips the markdown formatting, and speaks the clean text aloud using Tasker and Google TTS.
By the end of this project, you'll have:
- A Tasker Task called "Read Daily Note" that reads your Obsidian file, cleans the markdown, and speaks it aloud.
- A Time Profile that triggers the task automatically every evening at your chosen time.
- A persistent notification with a "Read Now" button for on-demand playback whenever you want.
- Secret Mission: Add a smart spoken introduction with a word count and section-by-section navigation.
Are there any prerequisites?
You need an Android phone with Tasker installed and Obsidian set up with a vault stored on your device's shared storage (not app-private storage). This guide walks you through all the configuration from scratch.
Configure Tasker and Grant Permissions
Before Tasker can read your Obsidian notes or fire automations on a schedule, it needs two things from Android: permission to access your files and freedom to run in the background.
Android restricts both of these by default. In this step, you'll unlock the full Tasker interface and grant the permissions it needs to reliably read your daily notes and trigger on time.
In this step, get ready to:
- Disable Beginner Mode to expose all Tasker features.
- Grant storage permission so Tasker can read your Obsidian vault.
- Disable battery optimization so Tasker stays alive in the background.
Disable Beginner Mode (#edit to have user skip this part if already checked the correct box during inital tasker setup, be sure to grab screenshot of this when restarting this proj on my other android devices)
Tasker hides some features behind a Beginner Mode setting. With it enabled, the Variables tab is invisible and certain action options are hidden. You need these for your automation.
- In Tasker, tap the three-dot menu in the top right corner.
- Tap Preferences.
- Tap the UI tab.
- Uncheck Beginner Mode.
- Tap the back arrow to return to the main screen.
You should now see four tabs at the top of the main screen: Profiles, Tasks, Scenes, and Variables.
Why disable Beginner Mode?
Tasker's main screen has four building blocks: Profiles, Tasks, Scenes, and Variables. Beginner Mode hides the Variables tab, but you need variables to pass data (like your note content) between actions.
Disabling it also ensures all action configuration arrows are visible when you build your task later.
🙋♀️ Don't see the Variables tab?
Make sure you unchecked Beginner Mode under the UI tab specifically, not the Misc or Monitor tab. Close and reopen Tasker if the tabs don't update immediately.
help me find Beginner Mode in Tasker Preferences
Grant storage permission
Tasker needs the "All files" storage permission to read your Obsidian vault at /storage/emulated/0/Documents/. Without this, Tasker cannot open your daily note files.
- Open your phone's Settings app.
- Tap Apps.
- Find and tap Tasker in the app list.
- Tap Permissions.
- Tap Files and media.
- Select Allow management of all files.
Why does Tasker need all-files access?
Your Obsidian vault lives on shared device storage. The standard "media only" permission would let Tasker see photos and videos, but not .md text files. The "All files" permission gives Tasker the ability to read any file type, including your daily notes.
🙋♀️ Don't see "Files and media" under Permissions?
On some Android versions, this is labeled Storage instead of Files and media. Look for whichever storage-related permission is listed. The key is selecting the option that grants management of all files.
help me grant Tasker storage permission on my phone
Disable battery optimization for Tasker
Android aggressively kills background apps to save battery. If Tasker gets killed, your evening time trigger will never fire. Setting Tasker to "Unrestricted" tells Android to leave it running.
- Go back to Settings > Apps > Tasker.
- Tap Battery.
- Set the battery usage to Unrestricted.
Why is this so important?
Tasker's official documentation warns that profiles with Time contexts may not activate at the expected time if Android kills Tasker. Disabling battery optimization is the single most important step for reliable time-based triggers.
Many phone manufacturers (Samsung, Xiaomi, OnePlus, Huawei) add extra restrictions on top of stock Android. Visit dontkillmyapp.com and find your phone brand for any additional steps specific to your device.
🙋♀️ Don't see "Unrestricted" as an option?
Some phone brands label this differently. Look for Don't optimize, No restrictions, or Not optimized. The goal is to prevent your phone from restricting Tasker's background activity.
help me disable battery optimization for Tasker on my specific phone
Your Tasker setup is now complete. Beginner Mode is off, storage access is granted, and battery optimization is disabled. Next up, you'll build the actual task that reads your daily note aloud.
Build the "Read Daily Note" Task
Your permissions are locked in. Now it's time to build the actual automation that finds and reads today's note.
In Tasker, a Task is a sequence of actions that run from top to bottom. You'll create a Task with two actions: one to figure out today's date, and one to read the matching Obsidian file into memory.
In this step, get ready to:
- Create a new Task called "Read Daily Note".
- Add a date-formatting action that generates today's date as a filename.
- Add a file-reading action that loads your daily note into a variable.
Create the "Read Daily Note" task
Every automation in Tasker starts with a Task. Think of it as a container for the actions you want to run in sequence.
- Tap the Tasks tab at the top of the Tasker main screen.
- Tap the + button at the bottom of the screen to create a new task.
- Type Read Daily Note as the task name.
- Tap the checkmark to confirm.
You should now see the Task Edit screen. It's empty because you haven't added any actions yet.
What is the Task Edit screen?
This is where you build your automation step by step. Each action you add appears as a numbered row. Actions run from top to bottom when the task is triggered.
🙋♀️ Don't see the Tasks tab?
If you only see Profiles and Tasks tabs (no Variables tab), Beginner Mode might still be enabled. Tap the three-dot menu at the top right, go to Preferences > UI tab, and uncheck Beginner Mode.
help me find the Tasks tab in Tasker
Add a Parse/Format DateTime action to get today's date
Obsidian names daily notes using the format YYYY-MM-DD.md (for example, 2026-06-10.md). You need an action that generates today's date in that exact format so Tasker knows which file to open.
- Tap the + button at the bottom of the Task Edit screen to add an action.
- In the search field at the top, type Parse / Format Date Time.
- Tap Parse / Format Date Time to select it.
- Set Input Type to Now. This tells the action to use the current date and time.
- Tap the + icon next to Output Format and enter yyyy-MM-dd.
- Tap the back arrow to save the action.
Back on the Task Edit screen, you should see Action 1 listed as the Parse/Format DateTime action.
What does this action do?
This action creates a variable called %formatted_date that holds today's date in the format yyyy-MM-dd (for example, 2026-06-10).
The format pattern uses Java date conventions: lowercase yyyy for the four-digit year, uppercase MM for the two-digit month, and lowercase dd for the two-digit day.
💡 Why not use Tasker's built-in %DATE variable?
Tasker has a built-in %DATE variable, but its format depends on your phone's locale settings. It might produce 06-10-2026 or 10/06/2026 depending on your region.
Parse/Format DateTime guarantees the exact yyyy-MM-dd output that matches Obsidian's daily note filenames, regardless of locale.
🙋♀️ Can't find Parse / Format Date Time?
Make sure you include the spaces around the slash when searching. The action name has spaces: Parse / Format Date Time. If the search still returns nothing, try typing just Date Time and look through the results.
help me find the Parse / Format Date Time action in Tasker
Add a Read File action to load the daily note
Now that Tasker knows today's date, you'll use it to open the matching Obsidian note file and store its contents in a variable.
- Tap the + button to add another action.
- Search for Read File and select it.
- In the File field, enter the following path:
/storage/emulated/0/Documents/%formatted_date.md
- In the To Var field, enter %note_content.
- Tap the back arrow to save the action.
Your Task Edit screen should now show two actions listed in order: Parse/Format DateTime at position 1 and Read File at position 2.
What does this action do?
The Read File action opens the text file at the path you specified and stores its entire contents in the variable %note_content.
Notice how the path uses %formatted_date from the previous action. When the task runs, Tasker replaces that variable with today's actual date. So on June 10, 2026, the path becomes /storage/emulated/0/Documents/2026-06-10.md.
💡 What is a variable in Tasker?
A variable is a named container that holds a value. In Tasker, local variables start with % and use all lowercase letters (like %formatted_date or %note_content).
Each action can read from variables set by earlier actions and write new values into its own variables. This is how actions pass data down the chain.
🙋♀️ Not sure you typed the path correctly?
Double-check that the path starts with a forward slash and uses %formatted_date (all lowercase, no spaces). The file extension must be .md with no extra characters after it.
Also confirm your Obsidian vault is stored at /storage/emulated/0/Documents/. If your vault lives in a different folder, adjust the path to match.
help me verify my Read File path is correct
✔️ Awesome, I've got everything!
Great. Make sure both actions appear in order on your Task Edit screen before moving on.
ⓧ I'd like to double check the full task
Your "Read Daily Note" task should have exactly two actions in this order:
- Action 1: Parse/Format DateTime with Input Type set to Now and Output Format set to yyyy-MM-dd. The output variable is %formatted_date.
- Action 2: Read File with the File field set to /storage/emulated/0/Documents/%formatted_date.md and To Var set to %note_content.
If an action is in the wrong position, long-press it and drag it to reorder.
Your task now knows how to find today's note and load its contents. Next, you'll add JavaScript to strip the markdown formatting and a Say action to read the cleaned text aloud.
Strip Markdown and Speak the Note
Your task can now read today's daily note file into memory. But raw markdown text is full of formatting symbols like ##, **, and [[links]] that sound robotic and confusing when spoken aloud.
In this step, you will add a JavaScript snippet that strips all markdown formatting down to clean, readable text. Then you will make Tasker speak the cleaned text using your phone's built-in text-to-speech engine.
In this step, get ready to:
- Add a JavaScriptlet that strips markdown formatting from your note.
- Add conditional logic to handle days when no note exists.
- Add a Say action and test the full task by tapping Play.
Add a JavaScriptlet to strip markdown formatting
Tasker's JavaScriptlet action lets you run JavaScript code directly inside a task. You will use regular expressions to find and remove every type of markdown syntax while keeping the readable text intact.
- In the Read Daily Note task editor, tap + to add a new action.
- Search for JavaScriptlet and select it.
- In the Code field, enter the following JavaScript:
var text = note_content;
// Remove headings (# ## ### etc) but keep the text
text = text.replace(/^#{1,6}\s+/gm, '');
// Remove bold and italic markers
text = text.replace(/\*\*\*(.*?)\*\*\*/g, '$1');
text = text.replace(/\*\*(.*?)\*\*/g, '$1');
text = text.replace(/\*(.*?)\*/g, '$1');
text = text.replace(/___(.*?)___/g, '$1');
text = text.replace(/__(.*?)__/g, '$1');
text = text.replace(/_(.*?)_/g, '$1');
// Remove links but keep display text
text = text.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
// Remove images but keep alt text
text = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
// Remove inline code backticks
text = text.replace(/`([^`]+)`/g, '$1');
// Remove code blocks
text = text.replace(/```[\s\S]*?```/g, '');
// Remove blockquote markers
text = text.replace(/^\s*>\s?/gm, '');
// Remove bullet and numbered list markers
text = text.replace(/^\s*[-*+]\s+/gm, '');
text = text.replace(/^\s*\d+\.\s+/gm, '');
// Remove horizontal rules
text = text.replace(/^[-*_]{3,}\s*$/gm, '');
// Remove Obsidian wiki-links [[link]] or [[link|display]]
text = text.replace(/\[\[([^|\]]+\|)?([^\]]+)\]\]/g, '$2');
// Remove tags (#tag)
text = text.replace(/(?:^|\s)#([a-zA-Z]\w*)/g, ' $1');
// Collapse multiple newlines into pauses
text = text.replace(/\n{3,}/g, '\n\n');
// Trim
text = text.trim();
var clean_text = text;
- Tap the back arrow to save the action.
What does this code do?
The script reads the note_content variable (automatically available from your Read File action) and runs a series of regex replacements to strip out markdown syntax.
- Headings (#, ##, etc.), bold/italic markers, and link syntax are removed while the readable text is preserved.
- Obsidian-specific wiki-links ([[link]] and [[link|display]]) and tags (#tagname) are handled too.
- The final var clean_text = text line creates the %clean_text variable that subsequent actions can use.
💡 How do JavaScriptlet variables work in Tasker?
Local Tasker variables (all lowercase, like %note_content) are directly accessible in JavaScript without the % sign. New variables declared with the var keyword become available to all actions that follow in the task.
- Confirm the JavaScriptlet now appears as Action 3 in your task list.
Don't see the JavaScriptlet action?
Make sure you tapped the back arrow (not the home button) to save. If the action appears but shows an error icon, double-check that the code was pasted completely with no missing lines.
help me figure out why my JavaScriptlet action is missing or showing an error
Add an If condition for missing notes
Some days you might not write a daily note. Without a safety check, Tasker would try to speak an empty variable and produce silence or an error.
- Tap + to add a new action.
- Search for If and select it.
- In the Condition field, tap the first text box and enter %note_content.
- Set the operator to ~ (Matches).
- In the second text box (the pattern), enter +.
- Tap the back arrow to save.
What does this condition mean?
The pattern ~ means "matches" and + means "one or more characters." Together, %note_content ~ + checks that the variable is not empty. The Say action will only run if there is actual content to speak.
- Confirm the If action now appears as Action 4 in your task list.
Add a Say action and test the task
The Say action uses your phone's built-in text-to-speech engine (Google TTS on most Android devices) to read text aloud. You will add this inside the If block so it only fires when a note exists.
- Tap + to add a new action.
- Search for Say and select it.
- In the Text field, enter %clean_text.
- Leave Engine:Voice as default:default.
- Set Stream to Media.
- Tap the back arrow to save.
Why use the Media stream?
Setting Stream to Media means the speech plays through the same audio channel as music and podcasts. This lets you control the volume with your normal media volume buttons.
Now add the Else branch to handle days without a note.
- Tap + to add a new action after the Say action.
- Search for Else and select it.
- Tap + to add another action after the Else.
- Search for Flash and select it.
- In the Text field, enter No daily note found for today.
- Tap the back arrow to save.
What does Flash do?
Flash displays a brief popup message on screen (a toast notification) without interrupting what you are doing. It lets you know the task ran but found nothing to read.
Time to test the full task.
- Make sure today's daily note exists in your Obsidian vault (a file named with today's date in YYYY-MM-DD.md format inside /storage/emulated/0/Documents/).
- Tap the Play button at the bottom of the Task Edit screen.
- You should hear your daily note read aloud in natural-sounding speech, with no markdown symbols.
Not hearing anything?
- Check that your media volume is turned up (use the physical volume buttons).
- Confirm a daily note file exists for today's date. Open your file manager and navigate to /storage/emulated/0/Documents/ to verify.
- If you hear the Flash message instead of speech, your note file is either missing or in a different folder than expected.
help me troubleshoot why my Tasker Say action is not producing audio
✔️ Awesome, I've got everything!
Great. Make sure you have saved the task by tapping the back arrow from the Task Edit screen.
ⓧ I'd like to double check the full code
Here is the complete JavaScriptlet code that should be in Action 3:
var text = note_content;
// Remove headings (# ## ### etc) but keep the text
text = text.replace(/^#{1,6}\s+/gm, '');
// Remove bold and italic markers
text = text.replace(/\*\*\*(.*?)\*\*\*/g, '$1');
text = text.replace(/\*\*(.*?)\*\*/g, '$1');
text = text.replace(/\*(.*?)\*/g, '$1');
text = text.replace(/___(.*?)___/g, '$1');
text = text.replace(/__(.*?)__/g, '$1');
text = text.replace(/_(.*?)_/g, '$1');
// Remove links but keep display text
text = text.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
// Remove images but keep alt text
text = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
// Remove inline code backticks
text = text.replace(/`([^`]+)`/g, '$1');
// Remove code blocks
text = text.replace(/```[\s\S]*?```/g, '');
// Remove blockquote markers
text = text.replace(/^\s*>\s?/gm, '');
// Remove bullet and numbered list markers
text = text.replace(/^\s*[-*+]\s+/gm, '');
text = text.replace(/^\s*\d+\.\s+/gm, '');
// Remove horizontal rules
text = text.replace(/^[-*_]{3,}\s*$/gm, '');
// Remove Obsidian wiki-links [[link]] or [[link|display]]
text = text.replace(/\[\[([^|\]]+\|)?([^\]]+)\]\]/g, '$2');
// Remove tags (#tag)
text = text.replace(/(?:^|\s)#([a-zA-Z]\w*)/g, ' $1');
// Collapse multiple newlines into pauses
text = text.replace(/\n{3,}/g, '\n\n');
// Trim
text = text.trim();
var clean_text = text;
Your full task action list should now read:
- Action 1: Parse/Format DateTime (Input Type: Now, Output Format: yyyy-MM-dd).
- Action 2: Read File (File: /storage/emulated/0/Documents/%formatted_date.md, To Var: %note_content).
- Action 3: JavaScriptlet (code above).
- Action 4: If (%note_content ~ +).
- Action 5: Say (Text: %clean_text, Engine:Voice: default:default, Stream: Media).
- Else: Flash (Text: No daily note found for today.).
Your task now reads, cleans, and speaks your daily note. Next up, you will create a Time Profile that triggers this task automatically every evening without you lifting a finger.
Set Up the Automatic Evening Trigger
Your "Read Daily Note" task is fully built. It can read today's note, strip the markdown, and speak the clean text aloud. The only problem is you have to press Play manually every time you want to hear it.
Tasker's real power comes from Profiles, which connect a trigger condition (like a time of day) to a task. In this step, you'll create a Time Profile that automatically fires your task every evening at a time you choose.
In this step, get ready to:
- Create a Time Profile set to your chosen evening time.
- Link the profile to your "Read Daily Note" task.
- Verify the profile is enabled and ready to trigger.
Create a Time Profile
A Time Context in Tasker specifies when a profile should become active. You can set it as a time range or as a single instant. For a daily evening trigger, you want an instant event that fires once at a specific time.
- Tap the Profiles tab at the top of the Tasker main screen.
- Tap the + button at the bottom to create a new profile.
- Select Time from the context type list.
- Set the From time to your desired evening time (for example, 21:00).
- Set the To time to the exact same value (for example, 21:00).
- Tap the back arrow to save the Time Context.
Why set From and To to the same time?
When From and To are set to the same value, Tasker treats the context as an instant event. It activates for only a fraction of a second, just long enough to fire your linked task once.
If you set different From and To values (like 21:00 to 22:00), Tasker would treat it as a time range and run the task when the range begins, then try to restore settings when it ends. An instant event skips that restoration behaviour entirely.
Link the task to your profile
After you save the Time Context, Tasker immediately asks you to choose a task to link to this profile.
- In the task selection list that appears, tap Read Daily Note.
Your profile now shows the time on the left side and the linked task name on the right side. This is the standard Tasker profile layout: contexts on the left, tasks on the right.
Verify the profile is enabled
- Check that the profile has a green toggle (or switch) on the right side, set to on.
- If the toggle is off (greyed out), tap it once to enable the profile.
Test it right now
If you want to confirm the trigger works immediately, temporarily change both the From and To times to 1-2 minutes from now. Wait for it to fire, then change the times back to your desired evening time.
🙋♀️ Profile didn't trigger at the test time?
Android may be killing Tasker in the background. Confirm that battery optimization is set to Unrestricted for Tasker (you set this in Step 1). Also visit dontkillmyapp.com for any device-specific steps your phone brand requires.
Make sure From and To are set to exactly the same time. If they differ even by one minute, Tasker treats it as a range instead of an instant trigger.
help me troubleshoot why my Tasker Time Profile is not triggering at the expected time
Your evening automation is live. Every day at your chosen time, Tasker will automatically read your Obsidian daily note aloud. Next up, you'll add a manual "Read Now" button so you can hear your note anytime on demand.
Add a Manual "Read Now" Notification Button
Your evening trigger is active. Every night at your chosen time, Tasker will read your daily note aloud without you lifting a finger.
But what about hearing your note at other times during the day? In this step, you will create a persistent notification with an action button that triggers your "Read Daily Note" task on demand. You will also set it to reappear automatically after your phone restarts.
In this step, get ready to:
- Create a "Show Read Button" task with a permanent notification.
- Link the notification to fire on device boot.
- Test the notification action button to hear your note on demand.
Create the notification task
A persistent notification stays in your notification shade even after you swipe it. This gives you a permanent "Read Now" button you can tap anytime.
- Tap the Tasks tab at the top of Tasker.
- Tap the + button to create a new task.
- Name it Show Read Button and tap the checkmark to confirm.
- You are now in the Task Edit screen. Tap + to add a new action.
- Search for Notify and select it from the results.
- In the Title field, enter Daily Note Reader.
- In the Text field, enter Tap to hear today's note.
- Check the Permanent checkbox. This prevents the notification from being dismissed when swiped.
- Scroll down to the Actions section. Tap + on the first action slot.
- Select your Read Daily Note task from the list.
- Tap the back arrow to save the Notify action.
What does the Actions section do?
The Actions section on a Notify action lets you attach up to 3 task buttons directly to the notification. When someone taps an action button, it triggers the linked task independently. This means your "Read Daily Note" task runs on its own when you tap the button, without interfering with the "Show Read Button" task.
🙋♀️ Don't see the Actions section?
Make sure Beginner Mode is disabled. Some fields are hidden when Beginner Mode is on. Go to the three-dot menu, then Preferences, then the UI tab, and confirm Beginner Mode is unchecked.
help me find the Actions section in Tasker's Notify action
Trigger the notification on boot
Permanent notifications disappear when your phone restarts. To bring it back automatically, you will create a profile that runs your notification task every time the device boots up.
- Tap the Profiles tab at the top of Tasker.
- Tap + to create a new profile.
- Select Event.
- Select System.
- Select Device Boot.
- Tap the back arrow to confirm the event selection.
- Tasker prompts you to select a task. Choose Show Read Button from the list.
Your Profiles tab now shows a Device Boot event on the left linked to "Show Read Button" on the right.
Why link to boot?
Android clears all notifications when the phone restarts. Without this profile, you would have to manually open Tasker and run the task again every time your phone reboots. The Device Boot event handles this automatically so your "Read Now" button is always available.
Run it once and test the button
The boot profile handles future restarts, but you need to run the task once now to create the notification for the first time.
- Tap the Tasks tab.
- Select Show Read Button from the task list.
- Tap the Play button at the bottom of the Task Edit screen.
Pull down your notification shade. You should see a persistent notification titled "Daily Note Reader" with the text "Tap to hear today's note."
- Expand the notification by swiping down on it.
- Tap the action button to trigger your "Read Daily Note" task.
If you have a daily note for today, you should hear your phone read it aloud. If not, you will see a flash message saying "No daily note found for today."
Notification not appearing?
Check that you tapped the Play button (triangle icon at the bottom), not the back arrow. The Play button actually runs the task.
On Android 8 and above, Tasker may need a Notification Category configured. If the notification still does not appear, check Tasker's notification channel settings in your phone's notification management.
help me troubleshoot why my Tasker notification is not showing up
Secret mission
Smart Introduction and Section Navigation
Want your daily note reader to feel more polished? In this extension, you will add a spoken introduction that announces the date and word count before reading. Then you will implement section-by-section navigation that pauses between headings, making longer notes easier to follow.
Clean Up Your Resources
Clean Up Your Resources
Decide whether to keep your resources running, pause them to come back later, or delete them entirely.
This project runs entirely on your Android phone with no cloud services or paid APIs. There are no ongoing costs.
Resources you used:
- Tasker Task: "Read Daily Note" (reads, cleans, and speaks your daily note).
- Tasker Task: "Show Read Button" (creates the persistent notification).
- Tasker Profile: Evening Time Trigger (fires your task at 21:00).
- Tasker Profile: Device Boot (restores the notification after restart).
- Persistent notification with "Read Now" action button.
Keep everything running
No action needed. Choose this if you want your daily note read aloud every evening and you like having the notification button for on-demand playback.
- Your evening Time Profile will continue triggering at 21:00 each night.
- The persistent notification will reappear after every phone restart.
- Tasker uses minimal battery when idle between triggers.
Pause - I'll come back to this later
Disable the profiles so they stop triggering, but keep everything intact for easy reactivation later.
- Open Tasker and tap the Profiles tab.
- Tap the green toggle next to your Evening Time Trigger profile to disable it. The toggle turns grey when disabled.
- Tap the green toggle next to your Device Boot profile to disable it.
- Swipe away the persistent notification from your notification shade. It will not reappear until you re-enable the Device Boot profile and restart your phone (or manually run the Show Read Button task).
- To resume later, tap the grey toggles back to green on both profiles.
Delete - I don't want to use this again
Remove all Tasker profiles, tasks, and the notification you created in this project.
- Open Tasker and tap the Profiles tab.
- Long-press the Evening Time Trigger profile, then tap the trash icon to delete it.
- Long-press the Device Boot profile, then tap the trash icon to delete it.
- Tap the Tasks tab.
- Long-press the "Read Daily Note" task, then tap the trash icon to delete it.
- Long-press the "Show Read Button" task, then tap the trash icon to delete it.
- Swipe away the persistent notification from your notification shade. With the tasks and profiles deleted, it will not return.
- Optionally, revert your Tasker permissions: go to Android Settings > Apps > Tasker > Permissions > Files and media and change back to Allow access to media only.
Nice Work!
Nice Work!
You just built a fully automated daily note reader on your Android phone from scratch. Every evening, your phone now reads your Obsidian journal back to you without lifting a finger.
You learned how to:
- Built a complete Tasker Task that reads a file from your Obsidian vault, processes markdown with a JavaScriptlet, and speaks the cleaned text aloud using Google TTS.
- Set up a Time Profile that triggers your task automatically every evening at your chosen time.
- Added a persistent notification with an action button so you can hear your daily note read back on demand.
- Secret Mission: Added a smart spoken introduction announcing the date and word count, plus section-by-section navigation that pauses between headings.
Ready to quiz yourself?