How can I beemind pomodoros automatically?

I beemind pomodoros. Presently I use GNOME Pomodoro to time the pomodoros and manually enter the number completed in Beeminder. I would like to automate the entry in Beeminder. Does Beeminder integrate with an application that times pomodoros, so that for each pomodoro I complete in the timing application Beeminder is automatically updated? I need an application that runs on Ubuntu (or the web), not Android or iOS.

2 Likes

Would Toggl Track work? There is definitely a web version, and there was once a Linux version but I think it’s deprecated (not supported) now. There is a Pomodoro mode for Toggl Track, which might work for you, depending on your exact requirements. And of course there is a Beeminder integration for Toggl, that can capture all this automatically.

3 Likes

Toggl Track seems a bit like overkill. Is there anything simpler?

What is the easiest way to integrate a timer (not necessarily for pomodoros) with Beeminder? I want a simple way to beemind the total number of minutes I spend on a project.

Beeminder has a straightforward API, so if you’re happy with coding you could wizz that up in a few minutes. Actually, I just asked Google’s Gemini to do it for me, and here’s what it wrote:

from datetime import timedelta
import time
from playsound import playsound  # for playing sound at the end
import requests  # for sending data to Beeminder

# Beeminder credentials (replace with your details)
BEEMINDER_USERNAME = "your_beeminder_username"
BEEMINDER_GOAL = "your_pomodoro_goal"
BEEMINDER_API_KEY = "your_beeminder_api_key"

# Pomodoro work and break durations (in minutes)
WORK_DURATION = 25
BREAK_DURATION = 5

def countdown(duration):
  """Counts down from the provided duration in minutes, printing to console and playing a sound at the end"""
  for remaining in range(duration, 0, -1):
    print(f"Time remaining: {remaining} minutes")
    time.sleep(60)
    # Optional: Add sleep here to slow down the counter (currently updates every 60 seconds)
  playsound("終了音.wav")  # Replace with your preferred sound file

def send_to_beeminder(value):
  """Sends a datapoint to the Beeminder goal using the Beeminder API"""
  url = f"https://www.beeminder.com/api/v1/users/{BEEMINDER_USERNAME}/goals/{BEEMINDER_GOAL}/datapoints.json"
  headers = {"Authorization": f"Bearer {BEEMINDER_API_KEY}"}
  data = {"value": value}
  response = requests.post(url, headers=headers, json=data)
  if response.status_code == 200:
    print("Datapoint sent to Beeminder successfully!")
  else:
    print(f"Error sending datapoint: {response.status_code}")

while True:
  # Pomodoro work interval
  countdown(WORK_DURATION)
  print("Pomodoro complete! Take a break.")

  # Optional break timer (comment out if not desired)
  # countdown(BREAK_DURATION)

  # Send datapoint (1 for completing a pomodoro) to Beeminder
  send_to_beeminder(1)

  # Continue looping for multiple pomodoro cycles
  answer = input("Enter 'q' to quit or press any key to continue: ")
  if answer.lower() == 'q':
    break

print("Pomodoro timer stopped.")

It then says:

So you may need to debug that, but it looks pretty straightforward.

2 Likes

For that, the easiest probably is Toggl Track. That’s exactly what it’s for - you click to start your work, and click to stop, and then Beeminder will pick up the total number of minutes every so often (at least once a day, and more often if you’re close to derailing).

2 Likes

I know the Android Beeminder app has a built in timer!

2 Likes