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 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 consistency is difficult, it relies on balance. Overspending time 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 **time boxes** 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 time boxes by getting 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, re-scale 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 everything 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 sources. 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 audio books, and bring it fairly into consideration along with the rest.

Using the same proxy extension, I could parse my progress on audio books 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! It helped me. However, after some time, I got stability problems with some widgets. Building unofficial APIs for personal data through web scraping does not guarantee stability, as HTML structures might change at any point. Other work encroached; I submitted my thesis, became a full-time employee at [Columbia Road](/work/#Columbia-Road), and _Dash_ faded out of focus.

I've re-pondered this concept sporadically ever since, so I might revisit it at some point.

### Potential

About a year after shelving this project, I learned about [Potential](https://potential.app), a humane tech start-up building a habit _forming_ app aligned well with what I had dreamed of for Dash. I tried out the app, and quickly started enjoying it. Potential also had a (much better designed) widget with automatically-updating streak counts, such as for Duolingo. I contacted their CEO, to present _Dash_ as a reference for a possible expansion of Potential into the web browser. Some discussion ensued.

Not much later, Potential opened a role for a Software Engineer. I got the job! (at least, for a few fun months, until it got cancelled by [some complicated times](https://welf.substack.com/p/its-over-were-so-back-potential-2024))

Dash

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

This project 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 consistency is difficult, it relies on balance. Overspending time 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 time boxes 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 time boxes by getting 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, re-scale 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 everything 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 sources. 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 audio books, and bring it fairly into consideration along with the rest.

Using the same proxy extension, I could parse my progress on audio books 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! It helped me. However, after some time, I got stability problems with some widgets. Building unofficial APIs for personal data through web scraping does not guarantee stability, as HTML structures might change at any point. Other work encroached; I submitted my thesis, became a full-time employee at Columbia Road, and Dash faded out of focus.

I’ve re-pondered this concept sporadically ever since, so I might revisit it at some point.

Potential

About a year after shelving this project, I learned about Potential, a humane tech start-up building a habit forming app aligned well with what I had dreamed of for Dash. I tried out the app, and quickly started enjoying it. Potential also had a (much better designed) widget with automatically-updating streak counts, such as for Duolingo. I contacted their CEO, to present Dash as a reference for a possible expansion of Potential into the web browser. Some discussion ensued.

Not much later, Potential opened a role for a Software Engineer. I got the job! (at least, for a few fun months, until it got cancelled by some complicated times)

Factsheet

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