Remote Work

A Day in the Life of a Toggl Track Frontend Developer

Illustration of someone putting a puzzle piece together

I’ve recently found out pretty much all our frontend developers think working for Toggl Track is even better than what they expected when they applied for the job. Huh.

Of course, as one of the earliest members of the frontend team, I’m glad to know we’ve been consistently exceeding expectations. But this information made me realize we’re most likely failing to give a clear picture of what our jobs truly entail.

My first attempt to clarify this will be taking you on a tour of a day in my life: welcome to a regular workday as a frontend developer at Toggl Track.

9:00 AM My phone alarm goes off. It’s Monday. Despite going to bed a little late yesterday (thanks, Netflix) I wanted to start earlier today. So I wake up — success! And then I tap the snooze button and go back to sleep.

9:09 AM The alarm wakes me up, I snooze it again. Did you know Apple’s default nine minutes snooze interval on the iPhone comes as a homage to old clocks?

9:18 AM: The snoozed alarm strikes again and this time I give up. I get up and do my clothes-changing and teeth-brushing morning ritual. Protip: if you avoid looking at the mirror you can skip combing your hair.

9:25 AM: Before heading out I decide to take a quick look at the Slack notifications on my phone: nothing seems too urgent. I mark everything as unread again and leave them for later. Food first, work later.

9:27 AM: I hit play on the latest episode of my favorite podcast and leave my apartment in Lisbon. I’m not going to Toggl Track’s office though. We don’t even have an office in Lisbon (we’re actually based in Tallinn). We are a remote-first company, so employees can choose to work from anywhere they want.

9:38 AM: There’s a nice French bakery right next to the coworking space where I’ve been working. Lisbon has become a fun cultural mess these days; I order some breakfast to go in Portuguese, the guy confirms it in French, says something to the baker in what I believe to be Hindi, and finally tells me the price in English. The baker hands me the bag and says “obrigado”.

9:42 AM: I arrive at my destination. The coworking space is still pretty empty, confirming my suspicions: only the truly mad among us will choose to wake up before 8 AM if given a flexible schedule.

9:44 AM: I sit in the kitchen, open my laptop, make some black tea and eat my croissant while I plan my day. We’ll have our weekly meeting later today, so I need to prepare a list of what I achieved last week. This also reminds me I need to catch up with last Thursday’s Kitchen Talk. Kitchen talks are a live video “meeting” where different groups of people talk every week about a variety of topics. Fortunately the video streaming is automatically saved so we can watch it later.

9:56 AM: Some people enter the kitchen and the table suddenly becomes too small. I leave and find a seat in a shared desk. I continue my planning: the late-timezone frontend folks in the Americas reviewed my pull requests after I stopped working last Friday: only one was merged, the other two need changes. I want to repay the favor so I decide to spend some time on code review (plus, we have an obscene number of open pull requests). This is all I can think of, so I compile a to-do list for today on Workflowy:


10:04 AM: Time to take care of the Slack notifications. When I first checked there were only four messages: one from Veljko (one of our amazing support agents), two from Olivia (our user acquisition expert), one from Filip (a fellow frontend dev). There’s now a fifth one from Geekbot, a service we use for asynchronous daily standup updates.

10:06 AM: I start with Geekbot. It’s AI doesn’t seem advanced enough yet to come up with new questions by itself, so I can quickly get that out of the way. It is eager to know what I did last Friday. I tell my robotic friend: I had a 1:1 meeting, sent a bugfix for the time entry autocomplete component, and added a new landing page to our public web. It replies by asking me what I’m gonna do today. I paste the to-do list I wrote earlier. Geekbot posts my status update to a Slack channel so the rest of the team can read it.


Sometimes Geekbot is a little too insistent

10:09 AM: Veljko came with a bug report sent by a user. It seems to be a regression that sneakily escaped our automated tests. The timer page visualization chart selector wasn’t working anymore. I find the original issue on Github and reopen it. It is kind of an embarrassing bug so I mark it as a high priority. If nobody picks it up in the next hours I’ll do it myself. I set a reminder on Slack for a few hours later.

10:12 AM: I read Olivia’s message. It was about some commits she pushed 10 days ago to wrap up a new sales-related landing page she’s been developing with a design agency. It seems nobody had the time to review it yet so I apologize a hundred times and add it to my to-do list.

10:14 AM: Finally, I get to Filip’s message. He said he pushed a new branch configuring Docusaurus to generate our internal documentation and suggested we could migrate to something more advanced later if needed. This is because I was fiddling with Gatsby the other day and asked him for help because I couldn’t make it work with our monorepo. I say I’ll take a look. My to-do list now looks like this:


10:17 AM: Nuno, a Toggl Track frontend dev who also lives in Lisbon, arrives at the coworking space. He’s test driving the place for a month. We go to the kitchen to grab some espresso and we chat a little bit, mostly about his idea of introducing Storybooks to our workflow as a way to improve the quality of our components. He pitched it to the frontend team last week and everybody was thrilled, so he started implementing it right away.

10:28 AM: I go back to the computer to chat a little bit on Slack while the caffeine doesn’t kick in. A link I posted previously on #movies-books about an upcoming tech-related TV series sparked a discussion about the movie Annihilation, by the same director. I check #chitchat and add reaction emojis to some neat photos the support team posted there — they’re currently doing a meetup in Croatia. This reminds me I’m running out of Schengen days so I ask in #traveling if somebody is planning to hang out somewhere outside Schengen after the company meeting in Tallinn.

10:36 AM: I open Toggl Track’s Summary Report to see what I did last week and write down a list of my past week’s achievements for the weekly meeting. Apart from the new landing page, it consists mostly of bugfixes in our webapp and some tooling improvements. Fun fact: time tracking is not mandatory at Toggl Track.


10:43 AM: The next item on my to-do list is “Code review”. I start with a pull request sent by Shantanu as part of our reports rewrite. He assigned Jake as a reviewer. Jake is the other dev working with him on this project, but he is attending JSConf this week so I can help to speed up things in the meantime. I test the pull request in my computer and confirm it does what it says it does: fixes a long description overflowing the pie chart. The code looks fine, all the tests are passing, but there’s a Danger failed check: he forgot to reference the issue from the commit. I add a comment about it.


11:00 AM: The next pull request I pick fixes a bug in the “Reactivate subscription” button. It was broken for some users because of a state-related edge case. It takes a while to reproduce the problem but I confirm the fix works well and everything else seems fine. The branch can’t be merged because it has conflicts, but I’m feeling generous today so I rebase it myself, test again and merge.

11:33 AM: I decide to check Olivia’s pull request. Apart from a minor HTML metadata problem, all is well. She has been waiting for a long time so I fix it myself and merge it. I tell our Slack bot Marvin to deploy the changes to production, and it acknowledges the command with a random depressive message (because, yes, Marvin is totally not a reference).

07 Marvin 702x87

One of the many times Marvin shared its feelings and was completely ignored

11:35 AM: Oops. I notice it is almost lunchtime. The problem is: we have a rule of only doing production deploys when somebody can be around for two hours to do a rollback in case something breaks. I ask in the frontend channel if somebody can keep an eye on it and Henrique promptly says he can.

11:58 AM: I ask Nuno if he wants to grab some tacos for lunch at (according to him) the best restaurant in Lisbon. He says he’d rather go Thursday when their lunch menu has tacos al pastor. We go to our default lunch spot, a nice noodle soup place across the street.

12:45 PM: We come back from lunch and sit on the rooftop to drink coffee and chat for a while.

1:12 PM: My phone buzzes; it’s Slackbot reminding me of Veljko’s message. I sit at the computer again and check the issue I created. Not only it was picked up by someone else on the team, but it has a pull request with a fix already! I confirm the fix indeed solves the problem and merge it.

1:21 PM: I start a production deploy and tell Veljko the bugfix is going to production. He replies with a confetti emoji, a raised hands emoji, and a champagne emoji. I don’t speak hieroglyph, but guess this means he’s happy with the news. I update my to-do list:


1:23 PM: All those completed items on my to-do list make me feel productive so I give myself a free pass to procrastinate a little bit. I use my free time in the worst possible way: scrolling down my Facebook feed.

1:37 PM: I start fixing my two open pull requests. We agreed all colors should be externalized in variables and I left some colors behind in one of them. I quickly refactor it, update the remote branch, and merge it myself. I also open a new issue suggesting an automated check for colors without variables.

1:46 PM: The other pull request was an attempt to improve our offline mode synchronization but it actually made it worse: entries deleted when offline wouldn’t be deleted from the server. This keeps me busy for a while.

2:30 PM: Meeting time. The frontend team is now trying Zoom for video chat. Each person talks about what was accomplished during the previous week. During my turn, I briefly speak about my struggles with the offline mode problem and Jaan gives me a suggestion on how to fix it. Luiz says he has to go to the bank today and will compensate later. We’re super flexible about work schedule, so nobody is even keeping track — it’s more like an honor system.

2:57 PM: The meeting is over. I try to do what Jaan said to fix the offline mode problem. It works! I test it a little bit more, push a new commit to the remote branch and put it up for review again.

3:14 PM: My brain is getting tired. I find myself mindlessly scrolling Facebook again. The content itself punishes me for the procrastination.

3:19 PM: I check my to-do list again. There are only two tasks now: “Check Docusaurus branch” and “Watch missed Kitchen Talk”. I go for the Kitchen Talk. It’s not as fun as watching it live, but at least I can play it at double speed. Two new hires introduce themselves and the Traffic team speaks a little bit about their plans. The 2x-speed chipmunk voice takes away some of their credibility though.

3:39 PM: After watching the Kitchen Talk I finally check the Docusaurus branch by running it locally. It doesn’t seem very flexible but it does the job. I message Filip telling him I like it. Farewell, to-do list!


3:45 PM: I search for a new Github issue to work on. There’s one from the product team asking us to restyle our calendar and date pop-downs so it matches the new designs. I assign myself to it and start working. The previous pop-down code was written with CSS Modules but we’re migrating everything to Emotion, so there’s a lot of refactoring ahead.

4:20 PM: Tea time. No, seriously. This is not a euphemism. I literally stop to drink tea. The time was just a coincidence.

4:28 PM: I continue working on the restyle issue. I changed too much stuff at once and everything looks broken beyond any reason right now.

4:35 PM: I’m hungry and my productivity is getting low. I decide to go home and continue there, after eating something.

4:40 PM: On the way back home, I admit to myself this is it for today. I open Slack on the phone and tell the team I’m signing off for the day.


Even though this could be a perfectly possible work day, I feel obliged to say this story was stitched up from real events that happened on different days. We are really proud of our work culture and my goal with this article was to illustrate how it reflects on our daily work.

Pssst! We’re looking for team players who are eager to learn and do great things! Do you think you’d be a good fit for our culture? Would you like to be part of our frontend team and help us to make the best time tracker in the world even better? Wait not more: apply to our frontend developer job!

Not a frontend developer? Check our other open job positions!

September 5, 2018