This Week's Sponsor:

Winterfest 2024

The Festival of Artisanal Software


A Week in the Life of Indie Developers

We’re always trying to think of new and interesting stories to publish on MacStories, and often times they’re articles that are a complete experiment that we honestly don’t know how they’ll turn out – this is one of those articles.

Earlier this year I published an article that was essentially just a list of indie iOS/Mac developers and we got a great reaction to it (and we promise an update is coming). Inspired by the developers featured in that article, I asked a handful of them to write a journal of what they do in a week of development, and for some crazy reason, they agreed to contribute. Those generous developers are (in no particular order) Oisin and Padraig from Supertop, David Smith, Philip Simpson from Shifty Jelly, Greg Pierce from Agile Tortoise, and Junjie from Clean Shaven Apps.

I asked each of the developers to keep track of the work they did in the week of Sunday 22 February to Saturday 28 February. But I wasn’t specific in the format, other than to say I wanted something along the lines of a journal crossed with a time sheet. That was partly because I really didn’t know what would work well, but also because I wanted to be flexible and let the developers just write what they thought was appropriate. I had no idea what to expect, and was a bit nervous that the whole thing might fall apart because I hadn’t been specific enough about what I was looking for.

Fortunately, the result is fascinating, I found myself not only entertained but educated as I read through each of their journals. You’ll find that each journal is quite vastly different, not just in their writing style but also how they work as an indie developer. I know it’s a long read (certainly longer than I had anticipated), but stick with it – there are some great surprises throughout.

The Supertop Team

Supertop is a two-man operation with Oisin (@prendio2) in Chiang Mai, Thailand, and Padraig (@padraig) in Vancouver, Canada. They make the Castro (an iPhone podcast client), Unread (an RSS app for iOS), Tokens (developer-focused app for tracking promo codes) and most recently Top Hat (developer-focused menu bar utility for App Store sales figures).

Monday, 23 February

Oisin

  • Sleep until about 9.
  • Was planning to do Castro 2 all day but had some inspiration during the night for a Supertop blog redesign. We’d been meaning to switch from the default Tumblr theme and I’m psyched by the ideas so after running it by Padraig on Slack and doing support email for an hour I spend most of the day at my coworking space working on the blog.
  • There’s more on my list I want to get to but it doesn’t happen.
  • Go home at 5 because I’ve to collect some things on the way.
  • Work from there until 7 when I’ve a barber appointment then spend the evening with a friend.

Padraig

Morning

  • Oisin has already finished his workday. I’ve opened up Slack and caught up with Oisin’s messages during the night and made a to-do list for myself for the day.
  • Today is going to be all about maintenance and catching up.
  • We just released Castro 1.2.3 and although our crash count is way down (hooray!), some users have reported a bug that I need to look into.
  • Oisin has responded to half of the emails in our support queue that built up last week as we finished Top Hat. I’m going to try to get through another batch too.
  • There are also a couple of bugs with Top Hat that I need to look at.

Later

  • Spent 3 hours trying to track down the Castro bug. No luck.
  • But I did fix another random crash I found along the way.
  • Got the support queue down to 20 messages. Will finish it off tomorrow.
  • 2:30pm: Late lunch time! (Tomato soup, a bagel and a boiled egg… and about 20 minutes of Alto’s Adventure)
  • 3:15pm: Make a cup of tea and review the blog design Oisin worked on earlier
  • 3:30pm: Get a response to an iWork RADAR I filed over the weekend asking for more information. Deal with that for 10 minutes.
  • 3:42pm: Looking into some of the issues that were reported with Top Hat over the weekend. If I get a few fixed, I’ll release 1.0.2 today.
  • 6:30pm: Got a bunch of bugs fixed but now BitBucket is down. I actually really like BitBucket and they’re almost never down.
  • 7.30pm: Dinner
  • 8.30pm: Come back to finish up the last few Top Hat bugs and get 1.0.2 released. I don’t have to wait for review — glorious.
  • 10:45pm: Stop working. Watch a quick episode of Parks and Rec with Emily and then go to sleep.

Tuesday, 24 February

Oisin

  • 9:30am: Wake up late. Catch up on what Padraig’s been posting on Slack overnight. Chat with him about the blog and Top Hat on Slack for a while from bed.
  • 11am: Get to coworking space, stuff my face with pastries and Coca-Cola. Try out Top Hat 1.0.2, spitball some feature ideas on Slack. Do support for a while.
  • 12pm: Chat with Padraig on FaceTime (after a number of failed attempts) for an hour. Agenda:
  • Launching redesigned blog
    • Blog post about Inquisitive
  • Releasing Top Hat 1.0.2 and what should/shouldn’t we do with it in future updates
    • Castro 1 bug fixes
  • Castro 2 development plans for the rest of the week
  • A couple of planned blog posts
  • 1pm: Fixed a tiny bug in Top Hat I noticed when switching accounts. Ended up tinkering with Top Hat a bit more on some minor adjustments. Am I procrastinating? Time for lunch.
  • 4:30pm: The new blog is live. Spend half an hour adjusting supertop.co layout and style.
  • 5pm: Write draft blog post. I’m not good at doing this fast.
  • 6:30pm: A friend comes by my office and we chat for an hour
  • 7:30pm: More time on blog post.
  • 9:30pm: Go for a couple of beers with a guy from the office. Chat with a 60 year old East German who calls himself “The Last Communist” and tells me I am the reason the American administration can walk all over its citizens. I am Irish.
  • 11:30pm Back at the office. I send Padraig my latest draft and we go through it together for a while before publishing the post.
  • 1am: I go home.

Padraig

  • 7:50am: Wake up and I actually get up. Grab two coffees at Starbucks and have breakfast with Emily.
  • 8:30–10:00am: Review Oisin’s latest blog post and chat through some edits.
  • 10:30am: Emily and I have a meeting with the midwife — our daughter is due to arrive next Monday!
  • 11:30am: picked up lunch at East is East
  • 12:12pm: Back at work. I waste about 10 minutes looking at Twitter and Google Analytics. I decide to catch up on Tentacles, the brand new podcast feed aggregation server we’ve been working on.
  • 12:51pm: After 30 minutes of failing to get Vagrant up and running I decide to switch to a different task until our server contractor is online to help. Going to try and chase down that Castro 1 bug again.
  • 1:50pm: This bug is crazy. Can’t see any way it could be happening, and I’m beginning to think that it was an issue that was caused during a previous beta and didn’t manifest until now. No non-beta testing users have mentioned it. Moving along!
  • 2:00pm: Messed around on Twitter for 10 more minutes. Going to have a cup of tea and try to re-focus.
  • 2:36pm: Wrote an email to my parents back in Ireland letting them know how we’re doing over here (in Vancouver, BC).
  • 5:55pm: Did a couple of hours work on the new Castro 2 downloader. Took 20 minutes out to install a car seat for the baby. Going to keep going on the downloader for another while and finish for the evening.
  • 6:30pm: Quick catch up with Oisin on Slack and then clock out for the evening.

Wednesday, 25 February

Oisin

  • I’m exhausted. Catch up with Padraig on Slack from home but the morning is mostly a write off.
  • 1pm: Get to office after lunch and work on Castro 2 UI for the afternoon. UI work is always slow but the particular feature I’m working on also calls for some data queries which I’m having trouble concentrating on.
  • 6pm: Go home for a change of scene, keep working on Castro 2 for a few hours.
  • 9pm: Padraig messages on Slack to say their baby was born. I pour a scotch. A friend comes over for a few hours.
  • 12am: I decide to do some more work on Castro 2. The UI stuff from earlier is finally falling into place.
  • 3am: Sleep

Editor’s Note: Congratulations to Padraig and his wife Emily on the birth of their baby! Naturally, Padraig took the rest of the week off to be with the newly born baby.

Thursday, 26 February

Oisin

  • I don’t expect to hear from Padraig for a while, at least not about work stuff. There’s plenty to do that we’ve already planned and discussed in advance so all is good.
  • 12pm: Work on Castro 2 from coffee shop for the first couple of hours of the day. Refactor our artwork manager and add placeholder icons for loading artwork.
  • 2pm: Get to coworking space. Experiment with artwork treatment for night mode in Castro 2. Then work on refactoring some view controllers that were put in place as scaffolding earlier.
  • 6pm: Go to park to enjoy a little of the outside world as the sun sets. Dinner.
  • 8pm: Head back to the office.
  • 9pm: Acknowledge I’m not going to finish this tonight. Do support for an hour instead until I clear out our inbox and can call a satisfying end to the day.
  • 10pm: Home

Friday, 27 February

Oisin

  • Spend the morning in a coffee shop doing some prep for my Úll presentation
  • 12pm: Get to office. Clear support back to 0 again. Set up Slack integration in Help Scout to make discussing particular tickets easier. Get distracted playing Alto’s Adventure for too long!
  • 2pm: Back to Castro 2. The stuff I’m working on will form the main navigation hierarchy. We’re really excited about it, which helps get me through some of the more testing parts of implementing it.
  • 6pm: Meet a friend in a café, but I still have some stuff to finish so work from there for another couple of hours as we enjoy some cake, ice-cream, and a beer.
  • 8pm: Cycle with Critical Mass Chiang Mai

Saturday, 28 February

Oisin

  • Day off. Sleep late. Eat breakfast out. Cycle around Chiang Mai, explore an abandoned building. Go for a massage with a friend, then dinner at Burmese restaurant.

David Smith

Based in the US state of Virginia, David Smith (@_DavidSmith) is the developer of serveral iOS applications including Pedometer++, Emoji++, Feed Wrangler and Check the Weather.

David’s Introduction

My usual work week is roughly 9:15am–5pm Monday through Friday. While I will very occasionally do proper work over the weekend more typically I only work on those days when something unusual has occurred (server outage, external deadline, …). I work from the basement of my house in the utility room. I sit on a Herman Miller Embody chair at an old plastic folding table. I work at a Retina iMac, type on a Microsoft Sculpt Keyboard, mouse with a Razer DeathAdder.

For the week tracked I was at my computer working for 32 hours (according to RescueTime). Around 60% of that time was spent on heads down Software Development.

I’m almost always listening to music during my day. This is super cheesy, peppy pop music when I’m coding or orchestral music if I’m writing.

Monday, 23 February

  • 9:30 - 10:30: Process weekend email, sign a conference speaking agreement.
  • 10:45 - 11:00: Work with a designer about an upcoming project
  • 11:00 - 11:15: Do my weekly sales update where I check on last week’s income/sales
  • 11:15 - 11:30: Do my weekly server checks making sure all my servers are happy
  • 11:30 - 12:00: Fix a bug in my podcast sync system
  • 12:00 - 3:30: Work on a new shared Audio Engine for Audiobooks and PodWrangler.
  • 3:30 - 4:30: Talk with my support person about issues he couldn’t resolve on his own.

Tuesday, 24 February

Wednesday, 25 February

  • 9:15 - 12:00: Work on unannounced Watch project , including designing its icon.
  • 12:00 - 1:00: Wallowed around a bit trying to decide what to do next.
  • 1:00 - 2:00: Work on Pedometer++ Watch app.
  • 2:00 - 2:40: Re-watch all the Apple Watch event videos for inspiration.
  • 2:40 - 3:15: Email
  • 3:15 - 4:00: Work with a designer about an upcoming project
  • 4:30 - 5:00: Have a random idea and pursue it for a while

Thursday, 26 February

  • 9:15 - 11:15: Continue to pursue random, crazy idea. Ultimately shelving it.
  • 11:15 - 12:00: Talk with my support person about issues he couldn’t resolve on his own.
  • 12:00 - 1:00: Freak out about announcement of Spring Forward media event
  • 1:00 - 3:00: Work on unannounced Watch project
  • 3:00 - 4:30: Work on Feed Wrangler Watch app
  • 4:30 - 5:00: Email

Friday, 27 February

  • 11:00 - 12:30: Email
  • 12:30 - 1:45: Plan, record and edit Developing Perspective #212
  • 1:45 - 2:30: Fix a layout bug on my website
  • 2:30 - 3:15: Write up my diary for this week.
  • 3:15: Finish for the week.

Philip Simpson, Shifty Jelly

Philip Simspon (@geekygecko) is the server and Android developer at Shifty Jelly. Located in Adelaide, Australia, Shifty Jelly is most well known for its podcast client Pocket Casts, but it also develops Pocket Weather Australia.

Sunday, 22 February

Introduction

At Shifty Jelly we have a few different projects on the go at once but the one I am focusing on currently is updating Pocket Casts for the new Lollipop version of Android. Once we had a list of all the features we wanted in the new version we made up a deadline and it just so happens it is at the end of this week. Even though we set the date it still adds a bit of motivating pressure to meet it. Lollipop was announced June last year and we have been working full time on it since November and can’t wait to show everyone.

00:00 - 05:00: Our baby had me getting up at 5 this morning so the earlier part of today was a haze. My wife headed off for work at 6:30am, she does shift work so I don’t have the kids every weekend by myself. It does mean that today I won’t get any chances to geek out to work on Pocket Casts until tonight when they are both sleeping.

10:00 - 15:00:The kids gave me 15 minutes to have a sit down to think about the week coming up. As there is only a week left we will need to get a final todo list of everything that is essential for this version. The todo list on the whiteboard at work has more on it than we have time left so some of the tasks will need to be pushed into the next version.

15:00 - 16:30: I managed to get both kids asleep at the same time and sneak in a bit of coding while my place wasn’t like a zoo. For some time now the Pocket Casts episode lists have loaded slowly and it has annoyed me enough that I am going to investigate how we can improve it. The brilliant phrase of dogfooding, is how our apps often get improved.

16:30 - 21:30 Family time

21:30 - 22:30: Time to carry on coding the same bug.

Monday, 23 February

23:00 - 07:00: Sleep

07:00 - 09:00: Family time, get ready for work and get to the office.

09:00 - 10:00: Going through personal work emails, team Slack messages and getting the important coffee to get my brain functioning. We have hired a full time support person so when we are coming close to a deadline we are able to fully focus on getting the job done. A few years ago Russell and I would have both spent half the day going through the support requests, instead now we just get given a high level view of the bugs and feature requests.

10:00 - 11:00: Weekly team meeting to discuss what is in our todo list for the release of Pocket Casts on the 2nd March. The whiteboard now has lots of tasks to do by then, too many tasks, DON’T PANIC! We now actually need to release by that date due to another commitment so our stress level have gone up a little. I have to remind myself to chill out and that working for ourselves is meant to be fun. The team negotiated on the features we were going to ship, the list is longer than I would have liked but everyone in the team is helping so it should be possible to get it all done.
This week will be a coding week to finish the features. Next week will just be testing, bug fixing and working on the marketing materials such as the website.

11:00 - 12:00: Coding and working on one of the trickier problems.

12:00 - 12:45: Feeding time as the fire alarm in the building went off.

12:45 - 13:30: Got back to the office but another fire alarm went off, are they trying to make me more stressed!

13:30 - 15:00: Back to coding, I was going to continue with the problem from earlier but the team started suggesting small ideas to improve the app. As each change wouldn’t take very long to implement I switched to changing the app straight away. It is really taking shape now and polishing the app is a really enjoyable stage of app development.

15:00 - 15:30: Interviewing a possible developer to join the team. As our team is small it is so important to find someone who is a good fit, we have about 6 people to interview before we make a decision who to hire.

15:30 - 17:00: More coding.

17:00 - 18:30: Travel time getting home and seeing family.

18:30 - 21:00: Kickboxing training.

21:00 - 22:00: Russell and I discussed our move to a new office space.

22:00 - 00:30: Some late night coding. Despite being tired from the day it is the best time to work as there are no distractions that working in an office brings and the family is sleeping.

Tuesday, 24 February

00:30 - 07:00: Sleep

07:00 - 09:00: Family time, get ready for work and get to the office.

09:00 - 9:30: Researching alternative office space.

09:30 - 12:00: Continued coding Pocket Casts. Little discussions happen throughout the day. One was that Russell didn’t agree with one of recent changes we made to the interface. We all got involved, said our opinions and came to a conclusion that we were all happy with. I really feel that having a team where everyone can make suggestions without people getting defensive or angry is brilliant. It makes the progress enjoyable and allows you to create amazing apps.

12:00 - 14:00: Lunch meeting with an old company.

14:00 - 14:15: We continued planning for the future discussing possible office spaces. Now we have decided on a budget and the size of the space we just need to continue the search. Monica is doing all the leg work looking for suitable offices and we are going on the visits. As we are a small team it seems best we all get involved in helping choose our future space.

14:15 - 17:00: Working on Pocket Casts code, focusing on the performance and animation between pages. During this Russell announced we had reached a milestone we had been waiting for and reminded me that I said I would fall of my chair if it happened. So went for a dramatic fall on the floor and promptly ordered a mini beer keg to help us celebrate on Friday.

17:00 - 21:00: Travel home and family time.

21:00 - 00:00: So many things to fix and the todo list isn’t getting any shorter. The team is giving suggestions and reporting bugs quicker that I can fix them! Don’t panic! I just have to work through them one at a time and focus on not getting distracted.

Wednesday, 25 February

00:00 - 07:15: Sleep

07:15 - 08:45: Family time

08:45 - 09:15: Travel time

9:15 - 12:00: This morning I was talking with our designer as soon as I walk through the door about solutions in the app to problems I was considering last night. Monica reported to me that a podcast is having parsing issues so I looked into the problem and released a solution to the Pocket Casts server.

12:00 - 13:00: Beach volleyball and lunch

13:00 - 17:00: Coding on Pocket Casts Android. It has been hard to work through the larger features that need to get finished so we have come up with a separate list of bugs and tweaks. After the large features are finished I will come back to this list. This means that I have finally been able to mark off some of the bigger tasks on the whiteboard.

17:00 - 17:30: Chatting with a local developer about joining the team.

17:30 - 19:00: Dinner and family time

19:00 - 23:30: Russell and I are both working from home on a new feature for the big release. It is a bit late to be working on new features but we thought it was important enough to make time for it.

23:30 - 00:30: Chilling out before going to bed as there isn’t much chance of me sleeping with so much going on in my head.

Thursday, 26 February

00:30 - 7:30: Sleeping

07:30 - 10:30: Family time and school visit.

10:30 - 12:00: Woke up this morning to screenshots on Reddit of our new app before we have released it. Made me a bit angry / sad as we wanted to keep it a secret until we were ready. Anyway we have lots to do before it actually gets released so I continued to concentrate on some more coding.

12:00 12:45: Lunch at a food truck.

12:45 - 14:30: More coding.

14:30 - 15:30: Visited another office space. We all came to the conclusion that is wasn’t suitable so we are going to have to keep looking.

15:30 - 16:00: Interviewed the last developer we have on our list so now we have to decide who will be the best fit. We didn’t specify the job role in detail when we listed it so we got a wide variety of applicants, some fresh out of University and others with years of experience.

16:00 - 18:00: More coding.

18:00 - 20:00: Travelled home, dinner and spent time with the family.

20:00 - 00:00: Talking with Russell about the a new developer. More coding.

Friday, 27 February

00:00 - 07:00: Sleeping

07:00 - 09:00: Family time

09:00 - 09:30: Travel time

09:30 - 10:00: Checking my emails.

10:00 - 10:30: The team are all looking at one of the new ideas we added to the app. It needs some tweaking but it was definitely worth putting in. I am going to start with fixing new bugs found this morning before working on changes already on the whiteboard todo list.

10:30 - 11:00: We stopped to have a chat to choose which of the developers we interviewed would be suitable. Luckily we agreed and are all excited to have another addition to the team.

12:00 - 18:00: On Friday’s the Shifty Jelly team get together for lunch, because of the deadline we decided to not eat out and get takeaway instead. This turned into a let’s rearrange the whole office for the new employee a trial on Monday. We started with just turning a few desks and then started trying several layouts and drawing out the floor plan on a computer. Despite it being so close to the deadline it was good as this release has been going since November and I am starting to feel burnt out. It went from me feeling tired to having a headache, my body is telling me to relax for a bit.

18:00 - 22:30: Went home and had some food. Spent time with the family and a friend came over for a beer.

22:30 - 00:30: Did a small bit of coding to finish of one of my whiteboard tasks and spoke to Russell about the new employee and general work things.

Saturday, 28 February

07:00 - 13:00: Family time.

13:00 - 15:30: Came to work to sort out my new desk position after we rearranged on Friday. Took out the rubbish and vacuumed the office. Running a small business means you need to become a jack of all trades, even doing the cleaning if it needs!

15:30 - 23:30: Family time. It seemed like a good time to unwind and spend some quality time with my kids.

Greg Pierce, Agile Tortoise

Greg Pierce (@agiletortoise) is an indie iOS developer based in Texas, United States. He is most well known for the development of Drafts, but he also develops Tally, Terminology and Phraseology.

Editor’s Note: Unfortunately Greg’s week didn’t quite go to plan due to unanticipated events, and it wasn’t really reflective of an ordinary week. Graciously, Greg has been instead provided some more general insight into how he does work during a normal week.

Unlike a lot of indies, I work a more or less typical Monday-Friday work week. I get up during the week, take my kids to school, then come home and start work in my home office, usually around 8am.

I tend to start the day with an hour to two hours of general communication tasks. This includes catching up on email and responding to support requests, but also putting together and tweeting out app tips for my apps, writing up blog posts, etc.

How long I actually do this depends, as it can often lead down rabbit holes. For example, a support request might lead me into the code to investigate, and I end up spending 30 minutes fixing a bug on the spot.

What I do the rest of the day tends to go in cycles depending on where I am in a release cycle. I will have a day or two a week where I do nothing the rest of my work day but write code. Coding tasks tend to be most efficient when you carve off large blocks off time to complete them, rather than jumping back and forth between tasks.

If I’m in active development of a new app or major new version, coding tasks might take up most of the week. That will shift to primarily marketing related tasks closer to a release, including preparing website, blogs posts, media assets like screenshots, communicating with press contacts, etc.

Other days, I tend to be a bit scattered addressing all the miscellaneous tasks that come with running business. I try to work at least once a week on producing documentation, either for new features or existing ones that are not well documented.

Most days I take a good lunch break and eat with my wife. It’s a nice benefit of working from home. Lately, I’ve been trying harder to break up my routine by going to the gym a couple times a week and making a point of working outside the house – usually at the local library – once a week.

I tend to wrap up my work day between 4:30–5pm, after the kids are home from school. I do not typically “work” in the evenings or weekend, at least in a formal way. Obviously work spill over in ways. I will reply to work-related tweets, answer quick support requests, etc., from the iPad – but I don’t go sit at my desk. And, yes, I will think about apps, product ideas in ways that are “work” – but when you think of how to surpass a design roadblock while you are cooking dinner, it’s hard to qualify it as work.

Junjie

Junjie (@jjlin) lives in Singapore and is the developer of Due, as well as Dispatch and Clips which are developed by Clean Shaven Apps, a collaboration between Junjie and Hon Cheng.

Sunday, 22 February

Today marks day four of Chinese New Year, a 15-day long festival that is equivalent in scale to how Christmas is celebrated in US. Officially, only Thursday and Friday are designated public holidays here. In practice, businesses shut down for up to a week (or more) as the Chinese take a break, feast and visit family and friends.

It has been a slow week so far, and it certainly looks like it will continue to be with various errands and medical appointments in the coming week.

Top on the agenda today is preparing my apartment for an upcoming upgrading project. Like 82% of Singaporeans, my wife and I stay in a HDB flat. The government has committed to upgrade flats that are about 30-years-old, replacing waste pipes and upgrading toilets, among other things.

Because of the upgrading, a lot of construction work has been going on in our area since a month ago. The hacking and drilling that was going on in our neighbours’ apartments drove us crazy, and we escaped by moving in with my parents’ at their new condominium since late January.

Our apartment will be undergoing the 10-day upgrading next week, and we need to put up some protection on our existing furniture to prepare for upcoming nightmare.

  • 12pm: Picked up my sisters-in-law to help out at our house.
  • 4pm: Finished preparing the house for upgrading project. Sent my sisters-in-law back.
  • 9:45pm: Finally back to my computer. I was going to do some work, but I decided to open the pile of letters on my desk instead. I found a letter from the taxman. Apparently we’d forgotten to file taxes for Clean Shaven Apps last year, and we’ve been given an extension to file them to avoid prosecution. Needless to say, I immediately did it with the help of my dad, who, being an accountant for decades, knew more about taxes than I do.
  • 11:30pm: It turns out I may have filed the taxes wrongly. There doesn’t seem to be any way for me to amend it, so I sent them an email asking for help.

Monday, 23 February

It’s Monday today, but I’m not having any blues. In fact, ever since I became a full-time developer, I no longer keep track of the day of the week. But today, I’m excited about what’s going to happen later.

  • 11:00am: Today marks 20 weeks and three days of my wife’s pregnancy. Sharon and I are first-time parents, and everything is new to us.
  • We’re at a hospital for a detailed ultrasound scan. I think this is supposed to determine if our baby is growing normally.
  • One of the perks as an indie developer working out of my house is that I get to accompany Sharon to all her obstetrician appointments.
  • While this is not the first time we’ve been to an ultrasound for our baby, this is the first time I saw our baby moving about actively. It makes the pregnancy—which has been rather abstract for me thus far—a lot more real.
  • 2:00pm: We followed up with our obstetrician with the scan results. Baby is healthy, she says, but slightly larger than average. Sharon attributed the growth to the pineapple tarts she has been eating over Chinese New Year. We discussed our delivery options, and decided we should check out the nearby hospital to see if we should deliver there.
  • I got a call from the taxman during the consultation about the email I sent last night. She told me that I’d need to send in my full set of accounts, along with some other forms to amend the mistake. More non-development work tonight.
  • 3:00pm: We checked out the nearby hospital to see if we want to deliver our baby there. It smelt weird compared with the last one we checked out. Probably skipping this hospital.
  • 5:00pm: Somehow, we managed to squeeze in a last-minute appointment at the chiropractor for Sharon’s aching back. That’s three medical appointments in a day.
  • 6:00pm: We took our sisters-in-law for dinner at a vegan Japanese restaurant to thank them for the hard work yesterday.
  • 7:00pm: Finally back home in front of my computer. Time to prepare those accounts and tax computation. The taxman provided some templates on their website, but it’s such a complex spreadsheet that Numbers is having trouble displaying is correctly.
  • Seems like I’d need to install Microsoft Excel. I have not had to install Office since I got my first Mac in 2007. From what I understood, Office 365 is the latest version available, and is now subscription-based. There’s a one-month free trial, so I’m going ahead with that.
  • It turns out that Office 365 is just the subscription, and what I’ve downloaded is basically Office for Mac 2011. Wow. And no thanks for installing the icons in my dock.
  • 8:00pm: I finished preparing the accounts. I’m heading for a swim followed by a steam bath. I’ve been making good use of the facilities at my folks’ condominium since I moved here, but I haven’t been swimming since Chinese New Year started.
  • 10:00pm: Sharon is hungry. I’m heating up the leftover fried rice we ordered from the Japanese restaurant and frying an egg for her.
  • 10:30pm: I’m finally starting real, development work. I wonder if I’m giving the wrong impression to MacStories readers about indie developers.
  • I’ve been working on the Apple Watch update for Due for a while now. So far, the Watch app can read all reminders and display them in a list. None of the actions (Mark Done, Delete, Reschedule, Change Auto Snooze) work yet.
  • Before moving forward, I need to decide where the modification and saving action should take place—in the Watch extension, or in the app itself. Ideally, the action should take place entirely on the Watch extension. But for technical reasons beyond the scope of this journal, I need to involve the app in the process. I decided that the bulk of the action should take place in the app.
  • I start working on a mechanism for the app to respond back to the watch extension on whether the actions have succeeded or failed.
  • 12:05am: The communication mechanism is completed. Turning in after a long day.

Tuesday, 24 February

  • 9:15am: Woke up late today. My alarm is usually set for anywhere between 7:50am to 8:30am, depending on what time I sleep. I usually shoot for at least 7 hours.
  • 12:00pm: Time to pick up where I left off last night after my morning routine, which includes washing up, walking the dog, making brunch, and making my fussy coffee.
  • 2:00pm: I’ve been working on making ‘Mark Done’ work on the Watch, but I’ve not made my first commit yet. I’ve been fighting a WatchKit bug in the 8.2 beta 5 SDK where reloading the table view ends up populating it with incorrect cells. Time for lunch.
  • 3:00pm: Lunch was basically reheated doggy packs from yesterday, and steaming some frozen food. I’ve a dinner appointment at 6pm, and it didn’t make sense to spend an hour to travel out for lunch, only to have dinner three hours later.
  • After lunch, I caught up on some articles about the budget that was announced by the finance minister yesterday. Interestingly, I’ve been getting my news from links posted by friends on Facebook these days instead of reading papers directly.
  • 4:00pm: I refactored some of the code that was used to handle notification actions in Due. I intend to make use of the same set of code to handle requests from the Watch extension to act on reminders.
  • I discovered that 8.3 beta resolves the table view problem I had been fighting with. However, it introduces a strange problem where my taps are delivered half a screen higher than they should be, making testing a nightmare. Well, I’m sticking with 8.3 for now, since I could at least see what’s happening.
  • 5:50pm: Finally, I can mark a reminder complete from the Watch. Time for my dinner appointment.
  • 8:30pm: After dinner, I spent some time chatting with Sharon. We catch up on Big Bang Theory and Suits on Apple TV, two of the shows that we both like and watch together.
  • 11:15pm: I’m back to work. Next on the agenda before I hit the sack—Deleting reminders from the Watch app.
  • 11:40pm: Delete is done.

Wednesday, 25 February

  • 9:00am: Woke up later than I had planned for (again). Started the day with technical support duty for mum. She was concerned that she could be streaming videos over cellular data on her iPad. I disabled Cellular data access for the app she was using. That’s one of my favourite feature added to iOS.
  • 9:55am: Since there were no more doggy packs leftover for a quick breakfast, I decided to cycle to a nearby temple for breakfast. There are only two places within 10-minute ride away that sell vegetarian food. The temple happens to sell Chinese-style dry noodles, and I love dry noodles
  • 11:00am: Today’s agenda is to allow user to change the auto snooze for a reminder from the Watch itself. It involves presenting a list of seven auto snooze options for the user to pick one from.
  • WatchKit does not come with any radio-style controls or action sheet. So I’d need to roll my own design for users to choose the auto snooze setting. I referred to the Sketch file that Hon Cheng (@honcheng) had helped designed back in December last year, and started tweaking from there.
  • 2:15pm: The custom interface to pick an auto snooze setting, and the functionality to do so, is complete.
  • I’m heading out to run some errands with Sharon, and to borrow some books from the library for an upcoming trip to Taiwan. Sharon and I decided to take a babymoon to Taiwan at the end of March. We think this is going to be one of the last trips we can make for quite some time.
  • 8:00pm: Started tweaking the auto snooze interface that was completed earlier this afternoon. Since things are happening asynchronously, a user can actually tap an option multiple times before the action is committed. Added something to prevent that from happening, and to update the interface immediately to reflect the change in auto snooze.
  • 9:00pm: Tweaking the appearance for reminder detail view; it was looking too bland.
  • 9:30pm: Optimizing the performance of the Watch app.
  • 11:00pm: Tweaking the appearance of the auto snooze page. I decided to drop the title of the reminder from the top of the auto snooze page. It’s probably not necessary to show that in every screen, and the user probably knows what reminder he/she is dealing with at this point.
  • 11:45pm: Tweaking the reminder detail view again. Basically porting over the work I’ve done on the auto snooze page to prevent multiple taps in quick succession from attempting to trigger the same action more than once.
  • 12:00am: Time to hit the sack.

Thursday, 26 February

Thursdays are what Hon Cheng (@honcheng) and I call ‘CSA Day’ (Clean Shaven Apps Day). Clean Shaven Apps is a company that we started in 2012 to work on apps together. Dispatch was our first collaboration.

Once a week, he’d come over to my place for breakfast, and then we’ll have a face-to-face discussion about what needs to be done for CSA apps (Dispatch, Clips), and then we’ll work on them together.

It’s not the only day we work on CSA products, but a day where we can have some face time doing so.

For a while though, Hon Cheng has been holding the fort at CSA while I finished up Due’s long overdue 2.0 update, and now, Due’s Watch update. I owe this dude a lot of beer.

  • 8:00am: We usually meet for breakfast at 9:30, so I wake up earlier to walk the dog.
  • 9:00am: I am early, and I am reading the Lonely Planet book on Taiwan that Sharon and I had borrowed from the library yesterday while waiting for Hon Cheng. Taiwan looks like a beautiful place. A pity we won’t be able to hike this time round.
  • 9:30am: Breakfast is McDonald’s. I order the only thing vegetarian on the menu—hotcakes. We catch up on what’s going on with each other’s lives. He reminded me there’s some [redacted marketing work] that needs to be completed urgently. I suggest we pack lunch from the food court nearby since I’m too lazy to head out for lunch later.
  • 10:30am: We start work. I’m looking for royalty-free stock icons to use inside an upcoming app that we’ve been working on—Timers. It was the working title, but I think it’s good enough for the app itself.
  • 11:30am: I’m back to Due Watch. And I’m back to tweaking the auto snooze page again. I found it disturbing when the currently selected auto snooze option is not visible upon entering the auto snooze setting page.
  • This happens when the currently selected auto snooze value is the 5th–7th option (the 42mm display is only large enough to show the first four buttons before the user needs to scroll). I decide that the picker should always scroll to show the currently selected auto snooze value each time it is shown.
  • The tradeoff here is that if the user is trying to turn off auto snooze (the first option), he’ll need to scroll up before he can access that button. I think the tradeoff in speed is worth it for the clarity.
  • 12:10pm: Time to work on ‘Reschedule’. I’d like the Watch to be able to make use of the ‘Quick Access Times’ that have already been configured in the iOS app to quickly reschedule reminders to these preset timings.
  • To do so, I need to figure out the best way to migrate the Quick Access Times settings to the shared App Group container so that the Watch extension can access it as well.
  • I start working on a new class that handles settings that are meant to be shared between the iOS app and its extensions. It should also migrate existing settings (if any) from the iOS app to the shared container. This is going to take a while.
  • 2:00pm: I’m hungry. I start heating up the lunch that we packed earlier. We have lunch, and chat about various things, mostly unrelated to app development.
  • 3:00pm: We resume work again. I pick up where I left off with the migration of ‘Quick Access Times’.
  • 5:05pm: Finally, the migration work is complete. Hon Cheng and I are calling it a day and going for a swim.
  • 6:30pm: We head for dinner at a vegetarian restaurant nearby.
  • 9:30pm: I’m back to my computer for more work. Since the tedious part of the ‘Reschedule’ functionality has been done, I want to work on the actual rescheduling functionality.
  • Wife comes in to the room, looks at me disapprovingly, and says, “Next time our kid is going to say, ‘Daddy, why do you sit in front of your computer the moment you finish dinner?’”.
  • That’s something I worry about. I don’t think I’d like my kid to be exposed to screens too early. But since I work from home, my job basically involves sitting in front of the computer typing away.
  • 10:45pm: I finished up the interface for rescheduling reminders. Hon Cheng reminds me that we should finish up the [redacted marketing work]. Crap, I hate marketing work. Time to work on them.
  • 12:10am: Halfway done for [redacted marketing work]. I’m really sleepy by now. Hon Cheng reckons he only needs it by tomorrow noon. I take that as a cue I can hit the sack and continue tomorrow.

Friday, 27 February

  • 8:45am: Scanned through Twitter feed on my iPhone. Checked out the Apple Watch fashion spread—they look really good.
  • I’m still on the fence about getting the Watch. Hon Cheng has been using the Pebble for a while, and each time a notification comes in (which is very often) and he looks down at his Pebble, I feel like he needs to go somewhere.
  • Recently, Tim Cook told the Telegraph it is “less rude and less intrusive” to be glancing at your wrist instead of your phone. I’m not sure I agree. I don’t fancy subjecting my family and friends to that. But I may need to buy one anyway to test Due on the Watch.
  • Scanned through my Facebook feed. I’m basically doing everything apart from getting out of bed.
  • 9:40am: Sharon made breakfast today—yoghurt topped with granola and strawberries. Preparing my own food, or going out for food, is time consuming. It’s nice not to spend too much time on them whenever possible. Especially during those crunch time when you really need to spend every waking moment possible on work.
  • 10:00am: I start work. Or rather, I resume the [redacted marketing work] that I need to finish by noon.
  • 1:00pm: So in the last 3 hours, I finished the [redacted marketing work], prepared the Watch app icons for Due, accepted a meeting with a startup based in Singapore next week, paid my credit card bills (because Due was bugging me to), helped look at payment gateway options and for a corporate lawyer for Phocus. I co-founded Phocus in 2009 to teach photography in Singapore. I used to teach photography myself, but have stopped for a few years now to concentrate on making apps. These days, my role with Phocus is mainly just advisory. My partner, Nanda, and Sharon runs the show.
  • I start working on the Watch app again. I want to finish up on the ‘Reschedule’ function.
  • 2:20pm: Rescheduling with ‘Quick Access Times’ is completed. I’m feeling accomplished. Time for some Alto’s Adventure.
  • 2:30pm: I finished level 4 and 5 of Alto’s Adventure. I got distracted by some article on development on Medium. And the articles that it linked to.
  • 3:00pm: I’m back to finish up on rescheduling. Besides rescheduling with the nine ‘Quick Access Times’, I’m going to allow users to dictate the date and time and parse it. I also need to plan for what happens when I can’t parse what has dictated, or when I can’t fully parse what is fully dictated.
  • I’m thinking if I can’t parse any dates out of what has been dictated, I show an alert view telling the user so and offer a suggestion about what Due can parse.
  • If however I can only partially parse what has been dictated, I think I should play safe and prompt the user to confirm that that is what he wants to reschedule the reminder to.
  • Again, WatchKit offers no alert view nor action sheet for me to accomplish the above. So I’m going to roll my own.
  • 4:00pm: The custom alert and action sheet view is complete. I’m feeling accomplished again. Time for more Alto’s Adventure.
  • 5:00pm: Oops, 25 back flips took a while. Time for a swim and steam bath.
  • 6:00pm: Back from swim and the steam bath. I read up more about Taiwan during dinner.
  • 7:00pm: Back to computer, trying to finish up on date parsing.
  • 9:00pm: Rescheduling is officially completed.
  • Due Watch can make use of Quick Access Times to reschedule, as well as allow user to dictate a date and time to reschedule the reminder to. Since the simulator doesn’t support dictation, I had to find other means to test the parsing capability. I’m feeling accomplished (for the third time today).
  • I’m going to take a break by walking the dog, having supper, and watching the new episode of Suits this week.
  • 12:30am: I ended up watching the pilot of The Strain as well.

Saturday, 28 February

  • 10:40am: Watching all the shows till late sure messed up my body clock.
  • Nobody’s home. I need to fix breakfast in the most painless manner so I can get cracking soon. I’m going to heat up some frozen buns and glutinous rice for breakfast (brunch?).
  • Over breakfast, I researched more about the possibility of self-driving in Taiwan. From what I gather, it sounds like a really bad idea.
  • 11:30am: I tested the latest design and build of Timers app, and sent Hon Cheng some feedback and a bug report.
  • I use Timers app every morning to make my fussy coffee with AeroPress. It’s really good with chaining multiple timers together. I use it to bloom the coffee for 25 seconds, brew the coffee for 20 seconds as I pour in the hot water, before pressing it for 75 seconds (it’s Shuichi Sasaki’s winning recipe at the 2015 World AeroPress Championships).
  • 12:30pm: I see a pile of letters on my desk again. I decide to open them, scan them, and file them electronically. Every now and then, I scan important letters, bank and credit card statements, insurance statements, receipts and ultrasound scans from our obstetrician, sort and save them into folders that I’ve created in Dropbox.
  • Additionally, I’ve created a Photo Stream for our baby, and I put in the ultrasound scans, and anything related to him into the shared photo stream with my wife. It’s still not easy to do so, but at least the new Photos.app on 10.10.3 is allowing me to directly upload photo from my Mac to a shared photo stream.
  • 1:30pm: I’m starting work on Due Watch again. Reminders section is looking mostly done. I want to finish that soon and move on to the timers section.
  • I’m still not happy with the ‘New Reminder’ button. Currently it’s a button located at the top of the list that says “Remind me to…”. I want to experiment if it’ll look better with an icon on the left.
  • 2:10pm: Hon Cheng and I discuss on Slack about Timers app. He just put in the new animations and it’s looking really sleek. We think we should start beta testing soon.
  • 3:30pm: The icon idea for the ‘New Reminder’ idea sucked. I think I’m going with just a ‘+’ glyph instead. I experiment with various tint color and sizes for the button.
  • I wonder if the button is too small to tap on. I tried to figure out a way to simulate the watch app. I found out that duet display lets me interact with the simulator with my finger. Perfect. I couldn’t get the simulator window to size down on my non-retina iPad mini. I later found out I could only change the resolution on retina devices with duet display.
  • I managed to find a resolution that displays the Watch app simulator window at 40mm height when using my iPhone 6 Plus as the external display. It’s not 42mm, but it’s good enough for me.
  • Turns out that the button sizes are just right. I could access the interface easily. I hope this is indicative of the usability on the actual Watch.
  • I’m really, really famished at this point. I forgot all about lunch. I’m too lazy to head out for lunch. I decide to cook some rice. Every meal time, it’s a decision between whether cooking and washing up is more of a chore, or whether the travelling to eat out is more of a chore.
  • 4:30pm: Sharon came back home and finished cooking the rest of the lunch I was trying to prepare. She’s obviously much better in the kitchen than I am.
  • Somehow the hunger must have gotten to me. I’m having a headache, and I’m going to take a nap.
  • 7:00pm: That was an extended nap. But thankfully the headache’s gone. I’m back at my computer, and I think I’m going to leave the reminders for now and start working on the timers section. I start working on laying out the timer cell in interface builder.
  • 8:00pm: It wasn’t long before Sharon complains she’s hungry (although I was feeling rather full from the very late lunch). We head out for dinner at our favourite new haunt—a vegetarian Indian restaurant.
  • 9:00pm: We went to grab some groceries to prepare some food for the potluck Chinese New Year gathering tomorrow evening.

Access Extra Content and Perks

Founded in 2015, Club MacStories has delivered exclusive content every week for nearly a decade.

What started with weekly and monthly email newsletters has blossomed into a family of memberships designed every MacStories fan.

Learn more here and from our Club FAQs.

Club MacStories: Weekly and monthly newsletters via email and the web that are brimming with apps, tips, automation workflows, longform writing, early access to the MacStories Unwind podcast, periodic giveaways, and more;

Club MacStories+: Everything that Club MacStories offers, plus an active Discord community, advanced search and custom RSS features for exploring the Club’s entire back catalog, bonus columns, and dozens of app discounts;

Club Premier: All of the above and AppStories+, an extended version of our flagship podcast that’s delivered early, ad-free, and in high-bitrate audio.