Gus has a terrific post on his blog about what he calls “the wilderness” – a period of time between major software releases “where I’m pretty lost, and I don’t know what to do.” His working theory on the matter is that it’s basically a forced period of rest put upon you by an overworked brain. How do you get past it? The same way you walk out of any wilderness – “One foot in front of the other…You can walk for miles and maybe months in the wilderness. Just keep on going.”
I take comfort in knowing that I’m not the only one who experiences periods of low energy slogging through work like this. Unlike Gus, however, I don’t blame it on a stressed or over tired mind. For me, as someone who suffers from depression, I know that these periods aren’t just a symptom of working too hard, but that they’re actually just one part of a cycle between times of depression and times of whatever the opposite of depression happens to be.
I’ve been tracking my mental health through copious notes and journaling for three years as a way to better understand what triggers my depression, how long it lasts, and what I can do to work my way out of it. The biggest lesson I’ve learned is that these periods always have an end. They’ll pass. If you have faith that that’s true, then it becomes easier to listen to your mind and not try and force things when the timing and mood isn’t right. In the same way that I take advantage of my mentally high states and code like a crazy person, I know to divert my focus to other more doable tasks when I’m at a low point. Rather than coding, I’ll update my FAQ articles, record screencasts, or do a deep dive into my marketing analytics safe with the knowledge that I’ll come through to the other side and return to coding in a better state of mind.
Gus equates escaping these periods with putting one foot in front of the other and continuing to walk until you find your way out. For me, I see it more as riding waves on a boat. There’s going to be low points just as there are high ones. The key is to keep sailing.
For years I’ve used on-hold “waiting” contexts named after coworkers and family members to denote tasks that I’ve assigned to other people and am waiting on them to finish. But a few weeks ago I had a realization that there are two other types of relationships between tasks and people that I haven’t been tracking. And with a few quick modifications to how I title my tasks, it’s possible to track them in OmniFocus.
Let me explain.
There are three types of relationships between tasks and people:
A task can be assigned to another person by you.
A task can be assigned to both you and another person.
A task can be assigned to you by another person.
Number one, tasks assigned to another person, can be handled as mentioned above by giving the task a context corresponding to the name of the person it’s assigned to. So, if I’m waiting on Jeff to complete a design document, I’d give that task an on-hold context of “Jeff”. This lets me quickly filter tasks that Jeff owes me whenever I run into him. Great. I’ve been doing this for years.
But it would also be super useful to track tasks that are shared between you and someone else. How can you do this with OmniFocus?
The best solution I’ve found is to add the other person’s initials to the task title surrounded by parentheses. For example, a task that I’m working on with Mike Davis would be titled “Review design specs (MD)”. Then, much like focusing on a context assigned to a person, it’s easy to view all of the tasks you’re doing with someone else. Just perform a search for their initials inside the parentheses like “(MD)”. You can even perform a search and save it as a custom perspective for people you frequently need to review. And don’t forget the parentheses – they’re important. It prevents your search from finding task titles with words that contain the initials you typed.
Taking the initials trick a step further, I add initials inside square brackets for tasks that I owe someone else. For example, instead of creating a task titled “Complete TPS report for Jack Posey”, I title it “Complete TPS report [JP]”. Again, this lets me perform a search for anything I owe Jack.
You could go even further and use additional sentinel characters to define other relationships between tasks and people. For example, you could use curly braces { } or angle brackets < >. I don’t use those myself, but it’s nice knowing they’re available if there’s another relationship type you frequently need to assign.
I’ve always gone with portability and sleekness over outright power and versatility. I bought an 11″ MacBook Air the day they came out. I switched to an iPad Mini from the bulky third generation iPad. I walk around with a slim wallet. I keep my iPhone naked in my pocket – no case.
So I was hesitant but very curious about the iPhone 6 Plus. I’ve always scoffed at Android users with huge phones – mainly because I never saw the benefit. Very few Android apps adapt themselves to take advantage of the extra screen real estate. Most users spend all day with stretched and scaled up apps that could just as easily run on a smaller screen device. But with Apple’s recent advancements in AutoLayout, size classes, and their keynote demo, I love the idea of the additional UI elements a larger screen iPhone could provide.
That said, it goes against my very nature not to get the most portable device I can afford.
But after spending a day with a Samsung Note III in my pocket as a size comparison, I came to a realization I hope comes true.
The 6 Plus may be a huge phone, but it might just allow me to give up my iPad (which I don’t use very often) and consolidate down to only one iDevice.
In that sense, going with the Plus actually is the smaller option.
I’m probably not going to say anything new. But I wanted to put down on paper my system for staying on top of email since I so often see people with overflowing inboxes. And I’m not trying to specifically call out anyone I’ve worked with in the past with an unmanaged inbox. I’ve known plenty of very productive people who can’t stay on top of their email. This is just my solution for taming the crazy.
Every morning when I wake up, I typically have 20 – 30 new emails across my three inboxes. (Personal, Freelance, and Work.) Usually, while standing in the kitchen drinking coffee, I’ll open my iPhone email client of choice (Dispatch – it’s truly amazing) and switch to the combined “All Inboxes” view. Then…
I read the subject of every email. If I don’t know what the email is from the subject, I’ll tap and read the body.
Every email is read. Without fail. Nothing is skipped.
For every email, before I move on to the next one, I do one of four things with it:
Delete it
Send it to spam
Archive it
Leave it in my inbox in an unread state
Those first three actions should be mostly self-explanatory.
If it’s trash, I delete it.
If it’s unwanted, I mark it as spam. I know some people will just delete spam emails, but that does yourself a disservice. At least with Gmail, by marking a message as spam, Gmail will learn to mark future similar emails automatically as spam – leaving you with one less email to triage.
If it’s a legitimate email that does not require a reply, I archive it. Gmail has blessed us with practically infinite email storage. You never know when you might need to refer to an old email, not matter how mundane, and it’s absolutely no bother to archive an email just in case you may one day need it.
With those three options out of the way, that only leaves emails in your inbox that require a response or an action on your part. If an email requires an action, I send it to OmniFocus and then (you guessed it) archive the email.
If the message requires a reply, I leave it in my inbox until later in the day when I have time to reply. And immediately after reply, I archive it.
Throughout the day I’ll get new email. I feel no need to check it immediately. When the time is right, I repeat the above process on any new emails.
And during the day when I have time to reply to email, I know every message left in my inbox needs a reply without having to reassess them or make any decisions. Just open an email, reply, and archive.
I follow this routine ruthlessly. The result is a completely manageable and under-control email experience. No emails ever get lost in the shuffle or forgotten. Everyone who needs a reply from me, will get one. And any email that requires an action will be acknowledged.
When I started selling my first Mac app in 2007, there was no App Store. I don’t even think “app” was a word. And there certainly wasn’t any ready-made infrastructure for selling software online that you could simply plug into. That meant, like every other independent developer, I had to piece together my own solution for accepting payments, hosting downloads, activating license codes, and delivering app updates.
August 2014 was the seventh anniversary of my first product release, so I thought I’d take some time and describe what my current setup looks like and all the tools and services I’m using to keep my business humming along.
Shine – My Indie Control Panel
Shine still powers the core of my business. It’s the controller that connects all of my other web services together. You can read a more detailed description of the software here. But, in general, here’s a list of all the functions it handles…
Order processing
Validating upgrade eligibility
Manual order creation
Order history and lookup
Generating invoices and receipts
Generating coupons
Basic sales and business stats and charts
Generating serial numbers
Software activations
Collecting and storing user submitted feedback and support requests
Searching for, displaying, and archiving mentions of my company and products on social media
Coordinating new app version releases, which means accepting a zip file of the app, storing it in Amazon S3, and pushing the new update to users via Sparkle
Generating publicly viewable changelogs
Sending transactional emails
and many other little, but essential, tasks
I literally couldn’t run my business without Shine. Well, I couldn’t in 2007. Services like GumRoad, FastSpring, and Stripe could handle for me much of what Shine does. But I’m so invested in the software it’s hard to move on at this point. Also, I love the ability to control the code which means I can dictate features and business logic exactly as I see fit.
Payment Processing
I originally used PayPal to accept accept orders. Their IPN API would ping Shine whenever a new order came through, and Shine would generate a license code and email the customer. In 2009 I switched to FastSpring. You can read about my experience making the change from PayPal to FastSpring. tl;dr FastSpring is way better. They take over as the seller of record and handle all aspects of order processing. When an order comes through, FastSpring sends the order information to Shine for safe-keeping, and Shine returns a license code. FastSpring also handles emailing the customer a receipt and their license information. They’re also where I go whenever I need to process a refund. Twice monthly they deposit my sales into my bank account minus their commission.
For six months in 2013 I switched away from FastSpring and handled the entire order flow in-house on my website using Stripe. I really liked owning the entire solution – and especially liked Stripe’s much, much lower transaction fees. It also enabled me to use Stripe’s Objective-C API to build a store directly into my apps, so customers could enter their payment information without ever have to open a web page. Unfortunately, I saw a decrease in conversions. I also wasn’t able to calculate VAT and sales tax on my own, so I switched back to FastSpring.
For the last month I switched over to using Drip for sending out my VirtualHostX welcome emails, and they were great. But better analytics, better email template designs, and higher conversion rates led me back to MailChimp.
Sending Transactional Emails
MailChimp is great for sending email blasts, but for transactional emails I use Postmark. Their pricing is affordable and their API is super simple to work with. Whenever an order comes through to Shine, I use Postmark to send out the customer’s order receipt and license information. They do a very good job of managing their outbound email servers’ reputations, so I’ve never had any problems with the emails I send getting flagged as spam.
While I’m 100% satisfied so far with Postmark, I am looking into switching to RackSpace’s Mailgun service so I can send delayed emails. I’d like to automatically send a followup email to customers asking if they have any questions a week after purchase, but I’d prefer not to handle the queueing logic myself. Mailgun’s API has a simple, optional parameter when sending email that allows you to specify a future date when the email will be sent. That’s very appealing to me. I’ll post my results if and when I make the switch.
Web Hosting
All of my servers are hosted at Linode. That includes my primary web server, which hosts all of my domains and the Shine web app, plus the proxy servers which handle VirtualHostX‘s Lift Off service.
I originally started out on SliceHost, and then migrated to RackSpace when they acquired Slice. RackSpace was great, although very expensive compared to AWS. Still, they treated me wonderfully (including a dedicated account manager), so I stuck around. Eventually though, I had to move away after years of them never getting around to supporting two-factor authentication. I just had so much of my livelihood hosted on RackSpace, I couldn’t afford the danger of getting compromised, even using a strong password. (So, if you’re reading this RackSpace, 2FA is the primary reason I left – and, yes, I’m aware of your 2FA beta program, but that came too late.) I’m now on Linode and very happy. Their all SSD machines build my Jekyll site in two seconds, compared to the 14 it took RackSpace’s spinning disks.
Source Code Hosting
I was a very happy paying GitHub customer since 2008, but switched to GitLab in 2013. The short reason for the switch is my GitHub monthly cost ballooned to $50. So, I spun up a $20/month DigitalOcean box, installed GitLab, and now host all of the private repositories I want. You can read a detailed account of why and how I switched from GitHub to GitLab.
My Website
As I noted above, my website is hosted on a Linode instance. It used to run on WordPress, but I found it much simpler to maintain by switching to Jekyll. Another huge consideration was the speed of serving static HTML files with Jekyll versus database backed WordPress pages. Here’s a Pingdom chart showing my site’s average response time before and after switching to Jekyll.
Content Delivery Network
All of my static website files and app downloads are stored in Amazon S3. My website serves those files over MaxCDN‘s content delivery network using my S3 bucket as a pull zone. Their bandwidth runs me about $100 a year and it’s lightning fast. I could use Amazon’s CloudFront as my CDN, but I find MaxCDN’s control panel for occasionally purging the cache much simpler to use.
Phone Support
I use Grasshopper for my phone support. It costs about $20/month for my own, dedicated 1-800 number. In practice, I rarely do phone support and let most of the incoming calls go to voicemail, but I’ve heard nothing but positive comments from customers who appreciate that there really is a dedicated toll-free number they can call if needed. It makes them feel like there’s a reputable company behind my software. (There is!) Even if you never answer the phone, I highly recommend getting at least a voicemail box where customers can get in touch.
Crash Reporting
All of my Mac and iPhone apps use the HockeyApp SDK for crash reporting. I’ve found their crash symbolication service to be top-notch. Because I already have my own infrastructure setup with Shine, I don’t need a lot of their other services, but the $10/month I pay for crash reporting is completely worth it.
Email Hosting
I use Gmail for all of my company email. You can’t beat their price, search capabilities, and keyboard shortcuts. But, as a backup precaution, I’ve had all of my personal and company email forwarding into two FastMail accounts for the past few years so I can immediately switch providers if it should come to that.
Domain Names
I moved all of my domain names from GoDaddy to I Want My Name four years ago. I knew I wanted off GoDaddy, and at the time, IWMN was the only reputable registrar I could find offering .io domain names.
All of their features and support are great. My only complaint is their dashboard is sloooooow – on the order of 5-7 seconds between page reloads.
SMS Messages
My Mac app Minion has a need to send text messages to users. Twilio was my first choice and they’ve served me well. Their API was a little confusing at first, but now that I’ve got it up and running it’s been rock solid. Their pricing is on par with every other provider I’ve looked into.
Personal Assistants
I recently started using the FancyHands virtual assistant service to offload some of the more mundane tasks of running my business. I’ll have them do research, book and cancel hotels, and whatever other small tasks I don’t want to deal with myself. I’m still testing the waters, but I hope they can become an integrated part of my workflow.
So, that’s it. Off the top of my head, those are all the major services and tools I use to run my indie software business. As I’ve grown up as a business person these last seven years, I’ve learned to delegate and pay money for services that can do a job well instead of trying to handle everything in-house myself.