a really extra way to send myself reminders
14.09.2023 3 min readSo, since yesterday, I’ve taken a break from learning / reading / writing rust
code. I really want to like rust
… and actually, I do. I just find that the amount of upfront investment is tremendous - and maybe not worthwhile for personal projects (I never tend to get that far with those, anyway). Mostly, I find myself struggling with the type system, and return types. It’s not that much of an issue with self-contained code, but when dependencies are involved and each function requires some dependency-specific return type, I find myself at a loss on how to make the compiler happy. Saying that I’m out of my depth would be an understatement.
Anyway.
I’m still in “learning mode”, so I went back to go
. I don’t dislike it as much anymore. The syntax is mostly fine. I’m not happy about the lack of functional methods, though. But development speed is so quick compared to rust
. I wrote a small API that interfaces with a Pocketbase collection, which hardly took any time - and didn’t manage to get an equivalent working in rust
, at all. And then I had an idea to implement something I’ve been thinking about for awhile. Namely, a way to send myself reminders for uncompleted tasks in Obsidian.
Bit by bit, I’ve been trying to move away from Google’s services, and I’ve been mostly successful (email is hard, and I may not ever make that happen). The one thing I find myself missing is Google Task’s push notifications. I love using Obsidian, but the mobile app doesn’t have push notification support - and that’s kind of important for time-bound tasks. I wrote something in go
to do just that (which may or may not be that most extra thing ever). Here’s what goes down:
- Traverse my Obsidian vault with
WalkDir
- If I find a file and not a directory, read the file’s contents and look for a regex match.
// snip
dtRegx, e := regexp.Compile(`(.*)\(@(\d+-\d+-\d+)\s(\d+:\d+)\)`)
// snip
taskRegx, err := regexp.Compile(`(-\s\[(\s)\])\s(.*)`)
The above regex should allow me to get any lines with a datetime in this format @(2023-09-14 09:55)
(it’s the format that Obsidian reminders format uses), then I’ll further search for unchecked tasks.
I have to then extract the match to the parts that are relevant to me: due time and task description.
Because I need a way to keep track of whether I’ve notified myself about a certain task, I need to persist data somewhere. For this, I’m using Pocketbase (again). I have the following fields: task
(string), notified_day
and notified_hour
(bool).
- Check whether the task exists in Pocketbase. If it doesn’t exist, create one.
- Parse the time from the regex match and compare it to the time Now. If the task is close to being due (24 hours or 1 hour), send a push notification to a ntfy web server.
- Mark it as notified in the relevant field
- Sleep for 5 minutes, and run forever
- Build the
go
binary and run it as a background service
So… yeah. It’s extra, but it works. I’m pretty sure there are better ways of doing this - I just don’t know what they are yet. That said… I probably won’t use Obsidian tasks all that much, even with this, but it was a nice little project to learn a bit more go
.