Work & Projects

  |  Thor Galle
Dash is a browser extension that adds a "new tab" dashboard with widgets driven by personal data from various sources. 

This project originally started as a design exploration in time management in October 2018. When trying to learn a new skill, or reach certain outcomes in a project, consistency is key. _"Practice a little every day"_, _"Write a little every day"_. But reaching consitency is difficult, it relies on balance. Time is scarce. Overspending it on one project takes it away from other projects, a situation I often found myself in (and I still do).

What if you could, ahead of time, plan **timeboxes** for all the projects you wanted to work on in a week, or in a month? And crucially, what if you could also nudge yourself into respecting those timeboxes by geting frequent and instant feedback on your overall progress?

At the outbreak of COVID-19, and while procrastinating on my thesis work, I experienced a surge in interest to work on this again, and I started implementing a proof-of-concept. Iterating on the above idea, I first built the **"Time Goals"** widget. Later, I built two more related widgets: a "streaks" widget, and an (audio)book-specific time goals widget.

## The Time Goals Widget

 The Time Goals widget consisted of two parts:
- Live time tracking data for my projects, which came from two sources; the [Toggl Track API](https://developers.track.toggl.com/) for my personal projects at the time, and the [Harvest API](https://help.getharvest.com/api-v2/) for my Columbia Road work projects at the time.
- Time goals, which I set in the dashboard, for projects I wanted to commit to at the time. For example, "I want to learn Swedish for 6 hours per week" would be a goal.

The widget then showed my progress towards the goal of each project in a progress bar, dividing the time goal equally over each weekday. With colors, it visually represented how much I was on- or off-balance:
- <span style="color: blue;">Blue</span> meant: completed according to schedule
-  <span style="color: red;">Red</span> meant: overdue, should have been done.
-  <span style="color: gold;">Yellow</span> meant: to be done today.
-  <span style="color: green;">Green</span> meant I "overshot" the goal, or did more than planned given this distribution (can be a bad thing!).

I used this for about two months, and I felt it did help me to achieve a better balance. A new tab page is one you see often, so I would get reminded of my undershooting and overshooting all the time, which would steer my behavior.

I wanted to take this step further, according to my original designs: what if you didn't just set a fixed number of hours as a project goal for a week/month, but would also integrate it with your digital calendar?

Then the tool would help you in more ways:
- When planning, you could add, rescale and reshuffle calendar events for each project, until each project reached the desired quota of time: _"Is your calendar sound? Does it match your intentions?"_
- Your expectations for a day would be more fine-tuned: the dashboard wouldn't nudge you to work on a project on Tuesday or Wednesday if you wanted to complete it all Thursday.
- When your calendar changed, as it often does, you would see the impact it had on your overall distribution of time for a week/month, and you'd be better informed to make resulting changes.

But while getting somewhere, I had not finished this part of the implementation. Along the way though, I saw more opportunities for this Dashboard that I did try out.

## The "Streaks" Widget

Not everying ought to take a distinguishable number of hours in a weekly plan. A habit can be a small thing, like practicing on Duolingo for a few minutes each day. For these types of commitments, I added a "streaks" widget.

I picked two external services that I wanted to use daily at the time. Both had a "streaks" concept of their own.
- First, there was Vocabulary.com, the object of my [Vocabulary.com Enhancer tools](/projects/vocabulary-com-tools/). The entry would also link to my last-practiced list, so I could directly jump into the next session. 
- Next, there was Readup.com (for which I didn't work yet at the time). Similarly, it showed my last Starred article.

Neither of these had a public API, however. This sparked some creative web engineering to retrieve arbitrary authenticated web app HTML from these srouces. I used a web extension to proxy privileged requests with my cookies/credentials to my "new tab" page, which inconveniently was a regular web page. It needed to be a regular web page, because I relied on the Service Worker's Cache API to cache requests for quick loads, and that was not supported in extension pages at the time.

## The book widget

The last widget I added was the book widget. I didn't only want to track time spent on my computer, but also time spent learning otherwise: through books, or audiobooks, and bring it fairly into consideration along with the rest.

Using the same proxy extension, I could parse my progress on audiobooks with Audible's web app  (see [this post](/articles/regex-puzzle-either-and/) on a regex challenge therein). I could then set a time goal to finish my book by a certain date. I also worked on fetching progress from Kindle's web app, but if I remember correctly, couldn't sufficiently reverse-engineer the web app to extract my progress.

## Conclusion & legacy

I used a development build of this project for some months as my daily-driver new tab, and enjoyed it! I thought it did help me. However, I got stability problems with some widgets. For scraped "APIs", it counts that if the HTML changes, the app likely breaks, which lead to annoying errors on my new tab. Other work encroached: I submitted my thesis, I became a full-time employee at Columbia Road, and I didn't feel like spending time to maintain and upgrade it to keep it working. Who knows, maybe this will change some day. But not today.

A big year later though, just after my professional stint at Readup ended, I got excited when I learned about Potential. Their idea of a habit _forming_ app aligned well with what I had dreamed of here. When I introduced myself to [CEO Welf](https://www.welf.co/), I presented this project too. I like to think that that helped me get hired, when I eventually also applied totheir open Software Engineer role.

Dash

Dash is a browser extension that adds a “new tab” dashboard with widgets driven by personal data from various sources.

This project originally started as a design exploration in time management in October 2018. When trying to learn a new skill, or reach certain outcomes in a project, consistency is key. “Practice a little every day”, “Write a little every day”. But reaching consitency is difficult, it relies on balance. Time is scarce. Overspending it on one project takes it away from other projects, a situation I often found myself in (and I still do).

What if you could, ahead of time, plan timeboxes for all the projects you wanted to work on in a week, or in a month? And crucially, what if you could also nudge yourself into respecting those timeboxes by geting frequent and instant feedback on your overall progress?

At the outbreak of COVID-19, and while procrastinating on my thesis work, I experienced a surge in interest to work on this again, and I started implementing a proof-of-concept. Iterating on the above idea, I first built the “Time Goals” widget. Later, I built two more related widgets: a “streaks” widget, and an (audio)book-specific time goals widget.

The Time Goals Widget

The Time Goals widget consisted of two parts:

  • Live time tracking data for my projects, which came from two sources; the Toggl Track API for my personal projects at the time, and the Harvest API for my Columbia Road work projects at the time.
  • Time goals, which I set in the dashboard, for projects I wanted to commit to at the time. For example, “I want to learn Swedish for 6 hours per week” would be a goal.

The widget then showed my progress towards the goal of each project in a progress bar, dividing the time goal equally over each weekday. With colors, it visually represented how much I was on- or off-balance:

  • Blue meant: completed according to schedule
  • Red meant: overdue, should have been done.
  • Yellow meant: to be done today.
  • Green meant I “overshot” the goal, or did more than planned given this distribution (can be a bad thing!).

I used this for about two months, and I felt it did help me to achieve a better balance. A new tab page is one you see often, so I would get reminded of my undershooting and overshooting all the time, which would steer my behavior.

I wanted to take this step further, according to my original designs: what if you didn’t just set a fixed number of hours as a project goal for a week/month, but would also integrate it with your digital calendar?

Then the tool would help you in more ways:

  • When planning, you could add, rescale and reshuffle calendar events for each project, until each project reached the desired quota of time: “Is your calendar sound? Does it match your intentions?”
  • Your expectations for a day would be more fine-tuned: the dashboard wouldn’t nudge you to work on a project on Tuesday or Wednesday if you wanted to complete it all Thursday.
  • When your calendar changed, as it often does, you would see the impact it had on your overall distribution of time for a week/month, and you’d be better informed to make resulting changes.

But while getting somewhere, I had not finished this part of the implementation. Along the way though, I saw more opportunities for this Dashboard that I did try out.

The “Streaks” Widget

Not everying ought to take a distinguishable number of hours in a weekly plan. A habit can be a small thing, like practicing on Duolingo for a few minutes each day. For these types of commitments, I added a “streaks” widget.

I picked two external services that I wanted to use daily at the time. Both had a “streaks” concept of their own.

  • First, there was Vocabulary.com, the object of my Vocabulary.com Enhancer tools. The entry would also link to my last-practiced list, so I could directly jump into the next session.
  • Next, there was Readup.com (for which I didn’t work yet at the time). Similarly, it showed my last Starred article.

Neither of these had a public API, however. This sparked some creative web engineering to retrieve arbitrary authenticated web app HTML from these srouces. I used a web extension to proxy privileged requests with my cookies/credentials to my “new tab” page, which inconveniently was a regular web page. It needed to be a regular web page, because I relied on the Service Worker’s Cache API to cache requests for quick loads, and that was not supported in extension pages at the time.

The book widget

The last widget I added was the book widget. I didn’t only want to track time spent on my computer, but also time spent learning otherwise: through books, or audiobooks, and bring it fairly into consideration along with the rest.

Using the same proxy extension, I could parse my progress on audiobooks with Audible’s web app (see this post on a regex challenge therein). I could then set a time goal to finish my book by a certain date. I also worked on fetching progress from Kindle’s web app, but if I remember correctly, couldn’t sufficiently reverse-engineer the web app to extract my progress.

Conclusion & legacy

I used a development build of this project for some months as my daily-driver new tab, and enjoyed it! I thought it did help me. However, I got stability problems with some widgets. For scraped “APIs”, it counts that if the HTML changes, the app likely breaks, which lead to annoying errors on my new tab. Other work encroached: I submitted my thesis, I became a full-time employee at Columbia Road, and I didn’t feel like spending time to maintain and upgrade it to keep it working. Who knows, maybe this will change some day. But not today.

A big year later though, just after my professional stint at Readup ended, I got excited when I learned about Potential. Their idea of a habit forming app aligned well with what I had dreamed of here. When I introduced myself to CEO Welf, I presented this project too. I like to think that that helped me get hired, when I eventually also applied totheir open Software Engineer role.

Factsheet

StatusUnfinished
Involvement March 2020 → July 2020 — 4 months
Licensed CC-BY-NC-ND 4.0 · 2024 · Contact