Obsidian Plugin for Beeminder

Creating this thread to document my journey as I attempt to create a new Obsidian Plugin that connects with the beeminder API.

I searched through Obsidian’s community plugins, and was shocked to find that there was only 1 related to beeminder, the “Beeminder Word Count” plugin, which allows you to specifically send the word count of your current Obsidian note to 1 beeminder goal. Clearly there is a desire for Beeminder plugins in Obsidian, as this plugin has over 4000 downloads despite last update being 3 years ago !

I find this functionality limited for my personal desires.

I personally desire a feature set of:

  • adding up all completed or uncompleted tasks in current note and sending to a beeminder
  • adding up all completed or uncompleted tasks in specific note and sending to a beeminder (can be executed no matter which note you currently have opened)
  • automated polling beeminder updates
  • ability to add data to multiple beeminders (the current obsidian plugin only allows for one)
  • grabbing specific dataview values and being able to do some logic/math related to them, in order to send that data to a beeminder

If someone already knows an obsidian plugin that is working to these features, let me know !

And also for the Obsidian-users out there, please let me know if there are any features you would want in an Obsidian to beeminder plugin.

I’ll be prioritizing the features that can benefit my workflows/life, but will definitely consider to implement any suggestions…

9 Likes

Counting tasks of a specific completion state in a specific note is exactly what I want! :open_mouth:

2 Likes

Made a beeminder to track contributions to this thread:

Edit: I think I made this goal private by accident. It should show up now.

3 Likes

Update:

Today I…

  1. created the github repo for the plugin:
    GitHub - napkindev/beeminder-obsidian-plugin

  2. cloned the repo into my testing Obsidian vault

  3. opened the repo in vscode and built the main.ts file into a main.js

  4. created a “hello world” test plugin and got it working to output to the obsidian dev console

IMG_8106

1 Like

Update:

3 Weeks and 3 Derails in a Row…

Well, this is exactly what beeminder is for, and why I created an RSS beeminder to monitor my contributions to this project.

This project has unregretfully been of low priority for me. I simply have other more important things going on. Like, the fact that I run a cashflowing business that I’m in the process of scaling ! And had to hire + onboard a few people haha.

But, again, that’s exactly why I’m happy I did this experiment, of beeminding a project like this, something that otherwise I would’ve had a great idea for, and then slowly forgot about and taken minimal action.

Each of the 3 derails has kept this project in my peripheral focus… the first $5 was not enough to motivate me. The second $10 was not enough to motivate me. The 3rd $30 stung me, and I did try to make an update last week but I only remembered about the beeminder being due that day with 20-30 minutes to go. I actually did reorient myself with the project and the obsidian plugin code that day, but I deemed I didn’t make enough progress to be worthy of not derailing. I didn’t want to cheat and post a fake update here… and honestly this shows the benefit of having a public beeminder like this. If I cheated I would have known that it was a public embarassment ! Even with my anon profile here, I’d still like to build a reputation of someone who delivers on what they promise.

So, that $30 derail was enough to make my brain a little more conscious of the fact that I had this plugin deadline coming up.

In terms of actual updates, I made some small progress by creating a simple code to count the number of completed tasks in a note, and include that metric in the status bar. This code does real-time updating based on your edits to the file !

image

This gets me a small step closer towards the plugin I want… because now I’m adding up the completed tasks in the note.

I now have a few logical next steps for the plugin:

  1. push the completed tasks data to a test beeminder (using internal variables for the beeminder username, slug, and API key)
  2. create a plugin entry form to insert your username, slug, API key
  3. add the logic to pull from the form to push to the test beeminder

Honestly, after these 3 steps I’ll have a core functionality of what I’m going for, and I’ll see if I can get the plugin uploaded to obsidian’s community plugins :slight_smile:

If you’d like to see this project move up my priority list, I’ve set up a Ko-fi page just for this. Your support through donations will directly influence how much time I dedicate to it, helping me prioritize this project over others:

https://ko-fi.com/napkindev

4 Likes

Small update.

I created the form for users to enter their Beeminder goal, api key, and username.

1 Like

Quick update. I’m only working on this a bit at a time since I’ve got other priorities :sweat_smile:

I added to the settings form a space to specify the file you want to track for your beeminder goal:

I also set up a test goal on beeminder. You can find it at: obsidiantest1 – napkin – beeminder

Finally, I added the listening function for my obsidian plugin to update to beeminder whenever the specified file path is edited. And then, if and only if the new value of completed tasks in the file is different than the current beeminder goal value, then it pushes an update via the beeminder API.


The initial test was successful as I marked a 3rd task as completed and a value of 3 was posted to beeminder chart.

So, may be a fairly usable implementation… if anyone wants access please respond on this thread or dm me, since then I know to rush publishing it to the official obsidian community plugins, since I still have to learn how to do that whole rodeo lol.

I’ve now achieved all 3 next steps that I indicated on Aug 16th.

Next steps from here would be:

  1. more testing… try to create bugs with edge cases
  2. more advanced form entry. I’ve seen other obsidian plugins that have a plus button to create multiple iterations/workflows. I’d like to do the same. I think user should just enter their username and api key once, and then they can add to track different files and have them update to different goals
  3. allow multiple files to push total completed tasks to same goal ? (let me know if you’d want this… I could see a use case for tracking total tasks completed across projects or daily notes)
  4. allow functionality for tracking uncompleted tasks ?
  5. create simple loom screen recordings to show how best to use the plugin with specific goal types (do more vs whittle down etc)
  6. add other data options like word count of note, and possibly other ideas…

I guess I have achieved some of my initial roadmap though… so that’s cool ! Wasn’t that hard either tbh, wish I was more sucked into this project but ill keep progressing it dutifully due to the weekly beeminder holding my attention. no more derails please :man_bowing:t2:

1 Like

Quick update:

I implemented the function of multiple goals today. I still need to add a drop down for what metric the goals will count (completed tasks, uncompleted tasks, word count).

I also should probably add a manual hotkey for submitting the beeminder data point, and possibly polling frequency options. I do think making the beeminder data point on EVERY file change is going to be an issue for things like word count. So maybe give the user option for polling time frequency as well as will it update automatically or manual.

In other news, I need to make sure the data is correct for a beeminder goal… I think the issue here is that I set it as a “do more” goal when it really should have been an odometer !

I guess the completed tasks is really meant for odometer goal types, and uncompleted tasks would be a whittle down goal type (this is what I currently use for tackling my backlog of tasks !)

So, I think those are the only 2 goal types that my plugin in meant for… I should probably make a quick write up on why those 2 goal types are the ones to choose, and to use other goal types at your own risk.

Please, beekeepers, chime in if you can think of how this would work on goal types other than odometer and whittle down ?

Lastly, based on this write up one of my near term goals should be to start using this plugin on my main vault and replacing the backlog beeminders that I currently use a python script to update. No point in doing this plugin if it’s not scratching my own itch !

1 Like

Fleshed out most of the basic functionality

There is now a toggle for if you want auto-submission or manual with hotkeys as well for manual.

2 Likes

Really cool work on this!
Happy to test it out if you want someone to try it out (not technically skilled so probably can’t help much with resolving bugs or any of the suggestions I say below)
Might be a bit late in the game for requests but would be cool if the addon allowed for do more goal on beeminder so each checking of a box was seen as a value point and that it sends the content of the checkbox too (in your screenshot earlier it would send “test”, “testagain” and “asdf” as individual entries onto a beeminder goal)
Maybe have a hashtag change which goal it allocates to? eg
:white_check_mark: test

(sends point and content to obsidiancheckbox goal)

:white_check_mark: Here is a review of the day #journal

(sends point and content to obsidiancheckbox goal and obsidianJournal goal)

Another thing would be if the looking at the whole obsidian vault or a section rather than just a single note eg Diary or work sections of obsidian.
Also if its a single note perhaps a way to allow for that single note to be the daily note?

One final suggestion would be being able to beemind parts of obsidian pages eg if a meeting notes is created then the actions section of the page must be filled in with at least 500 words. Or if a daily page then it must have so many words in today’s reflection section of the daily note page.
Keep up the good work! :slight_smile:

1 Like

I updated the description:

I also registered www.backofthenapkinlabs.com :slight_smile: to be updated later lol. For now I should forward it to this thread lmao.

I need to fix up my ko.fi as it’s having stripe integration issues…

I have submitted the first release to github:

You can manually install my plugin to your obsidian by doing the steps in this short 3min video I found:

That’s all for now…

Next steps are to manually install the plugin on my main vault, and begin to use the plugin on some of my “live” goals, that I was using a bash script before. This will allow me as the first main user to sus out any bugs and become confident it is production ready :slight_smile:

1 Like

Definitely not late in the game for requests !

I’m still updating and planning to maintain the plugin for a long time as I currently use obsidian as the data source for multiple of my beeminders (and possibly will add more in the future…)

Regarding your ideas…

  1. Each checking of box counts as data point and sends the task data

It might be doable. Thus would work with a Do More goal (rather than odometer/whittle down as I was using it)

The only issue I see is that checking off numerous boxes back to back might cause some errors… that’s an edge case I would have to plan for, especially if the polling interval is infrequent.

Let me ask you this, if you had set a 30 min polling interval and you check 6 boxes in that 30 min window… what would you want to happen ?

I could just allow the user to specify in settings what goal type they have (do more vs odometer). This way I could modify the logic so it sends either a +1 (for do more) or a 26->27 (for odometer). This is easy enough, and a feature that would make the plugin more accessible to different goal types, so I can probably go ahead and implement this as a starting point !

The hashtags idea is interesting… it does seem like an additional layer of complexity. I’d like it if you explained why you wanted it for your use case… so I can understand the context more. You’re thinking of it for habit tracking ? I think I can implement this…

  1. Looking at whole obsidian vault or a section.

I could implement this. Doing whole vault is super easy. Doing just a section would be either through folders or properties ? or tagged notes. Not sure the common practices for tagging notes other than the dataview "tags:: " field, and then properties (which are fairly new)

I think in the short term I could add “Whole Vault” and also all tasks in a specific folder… that’s fine ! And I see the value in it, so I’ll add that to my to-do list.

  1. yes implementing something for daily notes could be interesting… I think I can add something specifically for daily notes, as that is something I think I wanted from this at one point, but then lost track of it ! haha. I see how it would be useful though for different workflows.

I also need not forget my initial goal of adding a dataview field option as well… especially with manual polling hotkeys this could be powerful. I think I need to write a better user-guide as I expand these functions, to warn people when to not use automated polling (or just disable it altogether for certain configs ?)

Anyways, I appreciate your suggestions, and it’s good to hear some different angles on what to make here, since I can keep updating it and making it better + more universally useful, since Obsidian offers so many different options for tracking data.

1 Like

Let me ask you this, if you had set a 30 min polling interval and you check 6 boxes in that 30 min window… what would you want to happen ?

I think my preference would be it would add those 6 checked boxes individually (+1 times 6) to the beeminder goal after the 30 minute window lapses rather than in one go (+6).

I’d like it if you explained why you wanted it for your use case… so I can understand the context more. You’re thinking of it for habit tracking ? I think I can implement this…

You hit the nail on the head there. It would be for habit tracking whether that was exercise or working on chores or dealing with subtasks of a scary project.

Doing just a section would be either through folders or properties ? or tagged notes.

For me it would be based on folder so your suggestion of whole vault or specific folder sounds good to me

I have just installed the plugin and will test it out and let you know of any progress :slight_smile:

1 Like

OK just been testing it out and looks like it loads quickly as a plugin in 38ms so that is really good.

seems to be sending the value of ticked boxes from the specified page which is good (value of 14). Though as I am on free I don’t have access to odometer so accidently sending 14 to a dummy goal every minute :joy:

Update: unticking boxes has reduced the value from 14 to 11 so that works correctly. :slight_smile:

1 Like

Update:

I manually installed installed the plugin for my main vault and now have linked it to an existing “production environment” goal that I use to track my big (yet dwindling!) backlog started at the beginning of 2024.

You can find that goal here:

https://www.beeminder.com/napkin/backlog

I have just deleted the previous cronjob I had to run a python script to update the data for that goal… since this is a “live” goal, I will be watching the results with a hawk’s eye (let’s hope I don’t get a false charge, since that goal is in no excuses mode lol).

5 minutes later:

Welp, no excuses mode was not a good idea lol. I didn’t get charged though, so I’ll consider myself lucky. Looks like my “uncompleted tasks” data is actually marking completed tasks instead. I assume there will be more bugs like this so I’ll go and create a fresh beeminder to test on in the meantime… and reactivate that cronjob :rofl:

BTW let me know any name ideas for the plugin… currently thinking to just call it “beeminder” as “beeminder-obsidian-plugin” seems redundantly verbose !

“Beesidian” is the best I’ve thought of so far. I don’t love it but it beats both “beeminder” and “beeminder-obsidian-plugin”.

Hmm, GPT-o1 just thought of “honeystone”. Could that work?

1 Like

I like beesidian. Still, I think for SEO purposes “Beeminder” is best so that when people search for beeminder in the community plugins they would find it easily… or the title just has to have beeminder in it. Maybe “Beeminder Datapoints” or “Beeminder Integration”

1 Like

Update:

I have squashed those pesky bugs regarding “uncompletedtasks” datapoints.

The plugin is in my main vault and testing it on some real goals. Currently just testing it on Whittle Down goals using “uncompleted tasks” as that is what I mainly wanted this plugin to do for my own selfish use case. I made a few iterative updates to handle edgecase bugs, and now it is working great on two of my beeminder goals, backlog and meditationcapture !

This is exciting since I’ve been able to turn off the cronjobs for those beeminder goals and plan on making more beeminder goals to whittle down the backlogs of tasks I still have from Aug and Sept !

Next on the to-do list:

  1. Test it out for “completed task” datapoints
  2. Test it out for “word count” datapoints
  3. After 1 & 2 completed, clean up the debug logging and submit to obsidian’s community plugins
  4. Start exploring the add the features that @bizzle requested :slight_smile:

It would be helpful if I could figure out some legit habits/goals to test out 1 & 2 on lol

You can find the latest github release here: Release v1.0.6: updated beeminder datapoint commenting to have more useful data inclu… · napkindev/beeminder-obsidian-plugin · GitHub

All you have to do is go to the plugins folder in your obsidian vault, create a new folder for my plugin and then copy in the main.js, manifest.json, and styles.css files.

Sidenote: it’s crazy I started this project in June ! Time flies. Glad that it’s wrapping up…

1 Like

Update:

Did more bugfixing, finding an odd bug when multiple goals are set to the same automated polling frequency (which should be a common situation).

There must be some best practices in terms of setting time delays when requesting APIs ?

Going to have to learn about that. For now I set a time delay of 10 seconds between API requests and everything is working great now !

I also added a dynamic hotkey name changing so if you manually submit for your goals via the command palette, it’s quick and easy to see which goal you are submitting for !

Things are working great for uncompletedtasks goals. Still need to create some temp beeminders to test completedtasks and wordcount.

I also started development on a new method to track daily notes. the main logic with this is that it creates a new datapoint for today if a datapoint doesn’t already exist for today’s date, and then once that datapoint is created, it will continually update that datapoint. In theory this should work, and my initial testing is promising, although I did encounter a few bugs already so I will have to fix it up this week…

I really just need to test completedtasks and word count though, because if those are both working I can submit this version to obsidian community plugins and then work on adding the daily note feature later, since this core feature set is useful as is !

1 Like

Update:

continued testing the daily note functionality and still running into some glitches/edge cases.

Didn’t work on this too much this week as been busy with other things. I also created another obsidian plugin yesterday ! haha