Pomodoro timer that acknowledges the inexorable, infinite passage of time

Overview

Pomodouroboros

Most pomodoro trackers assume you're going to start them. But time and tide wait for no one - the great pomodoro of the cosmos is cold and dark, and it goes on forever.

For people with ADHD or other executive function disorders, time blindness is common; the inability to notice that time is passing or initiate tasks at an appropriate time. It's easy to let half the day slip by before starting your first pomodoro.

Pomodouroboros's goal is to:

  1. stay constantly in your visual field so that you will ABSOLUTELY not forget to set some goals
  2. remind you that death stalks your every step, and the pomodoros are happening whether you're making use of them or not
Comments
  • codesigning and notarization

    codesigning and notarization

    Build a quick shell script to build & notarize the app so that non-developers can download it normally.

    You can find some instructions on this guy's blog

    Follow-up:

    • [ ] #21
    opened by glyph 4
  • better icon

    better icon

    I am pretty happy with the general vibe of the little tomato snek boi but I threw it together in about 3 minutes in Affinity Designer, someone with more of an æsthetic sensibility could probably kick it up a half a dozen notches easily

    opened by glyph 3
  • ibtool not found

    ibtool not found

    The installation instructions I guess need a little more detail:

    % ./runme
    + mypy ./src
    Success: no issues found in 8 source files
    + rm -fr ./dist
    + python setup.py py2app --alias
    /usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/installer.py:27: SetuptoolsDeprecationWarning: setuptools.installer is deprecated. Requirements should be satisfied by a PEP 517 installer.
      warnings.warn(
    running py2app
    running build_py
    creating build
    creating build/bdist.macosx-10.15-x86_64
    creating build/bdist.macosx-10.15-x86_64/lib
    creating build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/test_model.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/notifs.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/quickapp.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/__init__.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/pommodel.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/cli.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/storage.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    copying src/pomodouroboros/mac_gui.py -> build/bdist.macosx-10.15-x86_64/lib/pomodouroboros
    creating /System/Volumes/Data/root/src/Pomodouroboros/build/bdist.macosx-10.15-x86_64/python3.10-standalone
    creating /System/Volumes/Data/root/src/Pomodouroboros/build/bdist.macosx-10.15-x86_64/python3.10-standalone/app
    creating /System/Volumes/Data/root/src/Pomodouroboros/build/bdist.macosx-10.15-x86_64/python3.10-standalone/app/collect
    creating /System/Volumes/Data/root/src/Pomodouroboros/build/bdist.macosx-10.15-x86_64/python3.10-standalone/app/temp
    creating /System/Volumes/Data/root/src/Pomodouroboros/dist
    creating build/bdist.macosx-10.15-x86_64/python3.10-standalone/app/lib-dynload
    creating build/bdist.macosx-10.15-x86_64/python3.10-standalone/app/Frameworks
    Add paths for VENV /usr/local/pyenv/pyenv/versions False
    *** creating application bundle: Pomodouroboros ***
    Copy '/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/apptemplate/prebuilt/main-x86_64' -> '/System/Volumes/Data/root/src/Pomodouroboros/dist/Pomodouroboros.app/Contents/MacOS/Pomodouroboros'
    compile IBFiles/GoalListWindow.xib -> /System/Volumes/Data/root/src/Pomodouroboros/dist/Pomodouroboros.app/Contents/Resources/GoalListWindow.nib
    xcrun: error: unable to find utility "ibtool", not a developer tool or in PATH
    Traceback (most recent call last):
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 42, in _get_ibtool
        gTool = check_output(["/usr/bin/xcrun", "-find", "ibtool"])[:-1]
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/util.py", line 718, in check_output
        raise subprocess.CalledProcessError(xit, command_line)
    subprocess.CalledProcessError: Command '['/usr/bin/xcrun', '-find', 'ibtool']' returned non-zero exit status 72.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 2275, in build_alias_executable
        copy_resource(src, dest, dry_run=self.dry_run, symlink=1)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/util.py", line 132, in copy_resource
        converter(source, destination, dry_run=dry_run)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 62, in convert_xib
        _run_nibtool(source, destination)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 26, in _run_nibtool
        xit = subprocess.call([_get_ibtool(), "--compile", destination, source])
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 44, in _get_ibtool
        raise IOError("Tool 'ibtool' not found")
    OSError: Tool 'ibtool' not found
    error: Tool 'ibtool' not found
    Traceback (most recent call last):
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 2275, in build_alias_executable
        copy_resource(src, dest, dry_run=self.dry_run, symlink=1)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/util.py", line 132, in copy_resource
        converter(source, destination, dry_run=dry_run)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 62, in convert_xib
        _run_nibtool(source, destination)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 31, in _run_nibtool
        raise RuntimeError("ibtool failed (%r -> %r)" % (source, destination))
    RuntimeError: ibtool failed ('IBFiles/GoalListWindow.xib' -> '/System/Volumes/Data/root/src/Pomodouroboros/dist/Pomodouroboros.app/Contents/Resources/GoalListWindow.nib')
    Traceback (most recent call last):
      File "/System/Volumes/Data/root/src/Pomodouroboros/setup.py", line 22, in <module>
        setup(
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/__init__.py", line 87, in setup
        return distutils.core.setup(**attrs)
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 148, in setup
        return run_commands(dist)
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 163, in run_commands
        dist.run_commands()
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 967, in run_commands
        self.run_command(cmd)
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/dist.py", line 1214, in run_command
        super().run_command(command)
      File "/usr/local/virtualenvs/tmp-6d1a0d409417d94/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 986, in run_command
        cmd_obj.run()
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 964, in run
        self._run()
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 1192, in _run
        self.run_alias()
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 1095, in run_alias
        dst = self.build_alias_executable(target, target.script, extra_scripts)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/build_app.py", line 2275, in build_alias_executable
        copy_resource(src, dest, dry_run=self.dry_run, symlink=1)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/util.py", line 132, in copy_resource
        converter(source, destination, dry_run=dry_run)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 62, in convert_xib
        _run_nibtool(source, destination)
      File "/System/Volumes/Data/root/src/Pomodouroboros/.eggs/py2app-0.28-py3.10.egg/py2app/converters/nibfile.py", line 31, in _run_nibtool
        raise RuntimeError("ibtool failed (%r -> %r)" % (source, destination))
    RuntimeError: ibtool failed ('IBFiles/GoalListWindow.xib' -> '/System/Volumes/Data/root/src/Pomodouroboros/dist/Pomodouroboros.app/Contents/Resources/GoalListWindow.nib')
    
    opened by nedbat 2
  • intent-review improvements

    intent-review improvements

    reviewing poms should be a lot smoother

    • [x] reviewing an intent should present the text of the intent so you know what you're evaluating, in case you've gotten slightly distracted at the end of the pom

    • [x] to help with estimation, intents should really ask 2 questions:

      1. were you focused on the task, and
      2. did you complete the task (complete kind of implies focus, so only 3 options; we can do this as buttons rather than checkboxes probably)

      if you were focused it's a win, but if you didn't complete it, the next pom should give you the option to continue

    • [ ] there should be a prompt to review, towards the end (in mac UI, with user notification actions for marking success/fail)

    opened by glyph 2
  • be more CPU-efficient, particularly when not running

    be more CPU-efficient, particularly when not running

    When running, it seems like burning 10% CPU or so, even on a high end system, to keep the animation running with reasonable fluidity is just non-negotiable (Facilitimer, which displays a similar progress progress bar, uses similar CPU).

    But when the bar is not displayed, we can know in advance what the next interesting inflection point in our schedule is, and just fully go to sleep and not schedule anything until that point.

    opened by glyph 1
  • Minimize pyobjc dependencies

    Minimize pyobjc dependencies

    I only need a few frameworks, it shouldn't pull in the universe.

    (Specifically this refers to depending directly on pyobjc-framework-* and pyobjc-core rather than pyobjc in requirements.txt)

    opened by glyph 1
  • Add mypy.ini

    Add mypy.ini

    This config enables some hardening that already passes fine on 0.910, while leaving out some other nice things to enable later.

    Most importantly, it silences errors about pyobjc imports not containing type hints.

    opened by ambv 0
  • redesign the app with a new core conceit

    redesign the app with a new core conceit

    So, this app has thus far been a prototype, and one of the nice things about prototypes is that they let you learn stuff and get feedback!

    Unfortunately sometimes the learning takes you back to the drawing board 😬

    What I've learned from this particularly prototype is that having a real-time timer running is good, but it creates a few unhelpful incentives, initially touched upon in #17 (thanks @nceder!) .

    1. If I return to the keyboard at 10:36, there's a feeling that I've "missed" the current block and I should just sit around and wait for the new one. This is bad because the goal of this app should be to maximize intentional time, and always be helping you to get started (if it's time to get started!). There's no incentive to get back to work when you've missed a given pomodoro.
    2. The big ❌s in the UI provoke a real feeling of negativity and futility if the first half (or more) of the day has been disrupted. The message should always be "Get the highest score you can". By the time the time has already elapsed, persistent visual punishments are counterproductive.
    3. The nature of attention-momentum is such that I probably start the day too scattered to finish a 30 minute pom and by the time I'm in the groove I am interrupted by needing to re-set every 30 minutes. Focus streaks should gradually scale up in length until encouraging you to take a break.

    So the new design for the app I'm considering is something more like this:

    1. Whenever you're at the computer and have not set an intention during an intentional time, there should be an obnoxious (i.e. larger than a notification) but not time-bounded HUD element telling you that you should set an intention.

    2. This should come along with a "snooze" button, so you can say "remind me to set an intention in…".

    3. 🍅 / 🥫 as a "winning / losing" distinction is bad. There should be a challenge, but it should be relative, not absolute. Things can get better or things can get worse, there is no point beyond which you should feel hopeless and give up. There is a point where maybe you should take a break. Some thoughts for things that you might want to keep a running tally of how close you are to beating:

      1. your score from yesterday?
      2. your average score for the (week / month / year / all time) so far?
      3. your best score for the (week / month / year / all time)?
      4. the best leaderboard score from your friends for today? (when leaderboards get added)

      It might be better to model these as achievements, and you get a new one every time you beat one of these, rather than a single status for the day.

    4. there should be a concept of something like WoW's "rested XP" which gives you a bonus for starting that gets slightly larger the longer you've been between intentional periods. Sort of like Rested XP,  it shouldn't be as many points as you would have gotten for crushing it, but it should be increasingly motivating to get started knowing you're going to get a big bonus to your number. (*(Unlike rested XP, this number should consolidate down every day, so that you get a bigger bonus for actually getting your daily bonus for doing at least one focused period every day)

    5. There should be a "streak" counter where you start with a 10 minute interval and at the end of it you have the option to double, in an exponential progression; my first guess would be powers-of-2: 10 minutes, 20 minutes, 40 minutes, 80 minutes (with increasing breaks as well). There should be some encouragement to take breaks, so after hitting the max (perhaps after 2 80 minute periods back to back?) you get a big bonus for stopping. There should be a progressively higher points-per-second value for longer streaks, but of course the points disappear if you don't stay focused.

    6. Sometimes you finish a task early and want to set a new intention. You should be able to declare victory early and continue on to a longer streak, although with a focus-bonus pro-ration for how long you were focused. So for example if you declare victory at 5 minutes out of a 10 minute streak, perhaps the next one is 15 minutes instead of 20.

    7. There should be some calendar integration or some way to say "I could not continue that streak" to provide a small bonus for stopping on purpose, to relieve the pressure to continue working and miss meetings or some other perverse incentive.

    8. Intention-setting should have a more generous timeout, 4 minutes is not enough. I'd say the grace period at the end of the streak should be 15 minutes.

    9. Planning is good, but rigid estimation is bad. To replace the setting-intentions-in-the-list-view workflow where precise goals are assigned to precise time periods, there should be an advance-planning queue, where you plug in a bunch of potential things to focus on (this might be a good place to plug in integration with task trackers, like for example pulling in those options from a particular view in OmniFocus). At the start of each pom you can select an intention from your preregistered list.

    10. You can't always break down tasks into such small granularity that you can actually complete them. Task estimation should be gamified as follows: there are 2 questions about intentionality. "What do you want to focus on" (free text) and "do you think you'll finish it" (checkbox). If you don't check the checkbox, your success multiplier is 1.0. If you do check it, then if you successfully call your shot and finish it, you get a 1.12 multiplier and if you don't finish you get 0.9. So if you get better at estimating and finishing your intentions on time, that's a bonus, and the bonus for estimating correctly is bigger than the penalty for not doing so, but the main goal is to get focused not to get great at estimating.

    11. Evaluation needs to be much more lenient and editable. I'm constantly making mistakes with evaluations just by hitting the wrong key in the NSAlert. My thought here is that there's a bonus bump for evaluating within a certain time window past the end of a pom (and then not changing it) but you can go back and edit your evaluations freely within that period, and then you can edit them again at the end of the day with the only penalty being losing that small bonus for each thing that you had previously evaluted. Relative scale here being something like: 5 points for evaluating each pom within the day, 1 bonus point for evaluating each pom within an hour of completing it, bonus lost if you edit after that hour.

    All the "points" above are just ideas about estimates of relative proportions within the individual feature, and scalarizing them all against each other is an exercise for the future.

    Also cc @rockstar, thank you for the feedback.

    opened by glyph 1
  • add a MainMenu.xib and use `NSApplication.setActivationPolicy_` to give the app a menubar when it's in the foreground

    add a MainMenu.xib and use `NSApplication.setActivationPolicy_` to give the app a menubar when it's in the foreground

    Continuing to run in the background as a menu item and continuously presenting a progress bar is important to stay in the user's visual field, but the "list Pomodoros" window really makes me expect that the app participates in ⌘-Tab, and I suspect more detailed windows might be showing up in the near future. This would also make handling text-editing shortcuts a bit more straightforward, c.f. the comments on https://stackoverflow.com/q/72237870/13564

    opened by glyph 0
  • add the ability for the user to customize their day

    add the ability for the user to customize their day

    There are roughly two options here:

    • [ ] add a "Preferences" window that can allow for the selection of start of day, end of day, length of pom, length of break, etc
    • [ ] add the ability for the user to write a little Python plugin file that runs a function which constructs a Day object for a given datetime.date
    opened by glyph 1
Releases(0.0.1)
Owner
Glyph
Founder of the Twisted project. Software engineer at PIlot.com. Aspiring digital flâneur.
Glyph
Unofficial PyTorch Implementation of Multi-Singer

Multi-Singer Unofficial PyTorch Implementation of Multi-Singer: Fast Multi-Singer Singing Voice Vocoder With A Large-Scale Corpus. Requirements See re

SunMail-hub 123 Dec 28, 2022
U-2-Net: U Square Net - Modified for paired image training of style transfer

U2-Net: U Square Net Modified for paired image training of style transfer This is an unofficial repo making use of the code which was made available b

Doron Adler 43 Oct 03, 2022
A Simplied Framework of GAN Inversion

Framework of GAN Inversion Introcuction You can implement your own inversion idea using our repo. We offer a full range of tuning settings (in hparams

Kangneng Zhou 13 Sep 27, 2022
Visyerres sgdf woob - Modules Woob pour l'intranet et autres sites Scouts et Guides de France

Vis'Yerres SGDF - Modules Woob Vous avez le sentiment que l'intranet des Scouts

Thomas Touhey (pas un pseudonyme) 3 Dec 24, 2022
Face Transformer for Recognition

Face-Transformer This is the code of Face Transformer for Recognition (https://arxiv.org/abs/2103.14803v2). Recently there has been great interests of

Zhong Yaoyao 153 Nov 30, 2022
✨风纪委员会自动投票脚本,利用Github Action帮你进行裁决操作(为了让其他风纪委员有案件可判,本程序从中午12点才开始运行,有需要请自己修改运行时间)

风纪委员会自动投票 本脚本通过使用Github Action来实现B站风纪委员的自动投票功能,喜欢请给我点个STAR吧! 如果你不是风纪委员,在符合风纪委员申请条件的情况下,本脚本会自动帮你申请 投票时间是早上八点,如果有需要请自行修改.github/workflows/Judge.yml中的时间,

Pesy Wu 25 Feb 17, 2021
Robotic Process Automation in Windows and Linux by using Driagrams.net BPMN diagrams.

BPMN_RPA Robotic Process Automation in Windows and Linux by using BPMN diagrams. With this Framework you can draw Business Process Model Notation base

23 Dec 14, 2022
QuickAI is a Python library that makes it extremely easy to experiment with state-of-the-art Machine Learning models.

QuickAI is a Python library that makes it extremely easy to experiment with state-of-the-art Machine Learning models.

152 Jan 02, 2023
Code for Phase diagram of Stochastic Gradient Descent in high-dimensional two-layer neural networks

Phase diagram of Stochastic Gradient Descent in high-dimensional two-layer neural networks Under construction. Description Code for Phase diagram of S

Rodrigo Veiga 3 Nov 24, 2022
[ WSDM '22 ] On Sampling Collaborative Filtering Datasets

On Sampling Collaborative Filtering Datasets This repository contains the implementation of many popular sampling strategies, along with various expli

Noveen Sachdeva 17 Dec 08, 2022
PyTorch 1.0 inference in C++ on Windows10 platforms

Serving PyTorch Models in C++ on Windows10 platforms How to use Prepare Data examples/data/train/ - 0 - 1 . . . - n examples/data/test/

Henson 88 Oct 15, 2022
Stochastic Downsampling for Cost-Adjustable Inference and Improved Regularization in Convolutional Networks

Stochastic Downsampling for Cost-Adjustable Inference and Improved Regularization in Convolutional Networks (SDPoint) This repository contains the cod

Jason Kuen 17 Jul 04, 2022
ICON: Implicit Clothed humans Obtained from Normals (CVPR 2022)

ICON: Implicit Clothed humans Obtained from Normals Yuliang Xiu · Jinlong Yang · Dimitrios Tzionas · Michael J. Black CVPR 2022 News 🚩 [2022/04/26] H

Yuliang Xiu 1.1k Jan 04, 2023
Sequential GCN for Active Learning

Sequential GCN for Active Learning Please cite if using the code: Link to paper. Requirements: python 3.6+ torch 1.0+ pip libraries: tqdm, sklearn, sc

45 Dec 26, 2022
Learning from Synthetic Shadows for Shadow Detection and Removal [Inoue+, IEEE TCSVT 2020].

Learning from Synthetic Shadows for Shadow Detection and Removal (IEEE TCSVT 2020) Overview This repo is for the paper "Learning from Synthetic Shadow

Naoto Inoue 67 Dec 28, 2022
When are Iterative GPs Numerically Accurate?

When are Iterative GPs Numerically Accurate? This is a code repository for the paper "When are Iterative GPs Numerically Accurate?" by Wesley Maddox,

Wesley Maddox 1 Jan 06, 2022
Code for the paper titled "Prabhupadavani: A Code-mixed Speech Translation Data for 25 languages"

Prabhupadavani: A Code-mixed Speech Translation Data for 25 languages Code for the paper titled "Prabhupadavani: A Code-mixed Speech Translation Data

Ayush Daksh 12 Dec 01, 2022
Official Pytorch implementation of Online Continual Learning on Class Incremental Blurry Task Configuration with Anytime Inference (ICLR 2022)

The Official Implementation of CLIB (Continual Learning for i-Blurry) Online Continual Learning on Class Incremental Blurry Task Configuration with An

NAVER AI 34 Oct 26, 2022
Multi Agent Reinforcement Learning for ROS in 2D Simulation Environments

IROS21 information To test the code and reproduce the experiments, follow the installation steps in Installation.md. Afterwards, follow the steps in E

11 Oct 29, 2022
基于PaddleClas实现垃圾分类,并转换为inference格式用PaddleHub服务端部署

百度网盘链接及提取码: 链接:https://pan.baidu.com/s/1HKpgakNx1hNlOuZJuW6T1w 提取码:wylx 一个垃圾分类项目带你玩转飞桨多个产品(1) 基于PaddleClas实现垃圾分类,导出inference模型并利用PaddleHub Serving进行服务

thomas-yanxin 22 Jul 12, 2022