Disposeamail.com Re-launch: The Spam Never Stops

Over the holidays, I spent about 20 hours spread out over a few days to build and launch the new Disposeamail.com. Go check out how an inbox looks (in this case, asdf@disposeamail.com).

But wait. Why would I launch a new project when I just recently committed to concentrating on a single project? Because I wanted to learn and experiment with a few things that will ultimately help me with my main project. Namely: New methods of Node.js scaling and deployment, and experimenting with some new JavaScript features and build systems. I have already learned a lot on those two fronts just making and deploying Disposeamail that will get integrated back into ChurchMint and other projects over the next few weeks. Continue reading

Selling My Passive Income Stream: JSCompress.com

I recently sold JSCompress.com – a website that I created, and have owned and operated since 2008. Over the years, it has gained a lot of traction and popularity, and is heavily trafficked – the most heavily and consistently trafficked website I have ever owned (about 3,500 uniques per weekday). It was a really tough decision selling the website, but in the end – it was the right time to do it.

Continue reading

Countism

Countism App Icon

Countism is a mobile app idea that I have been working on and thinking about for a long time. Even though I have been thinking of the idea for a while and even did some initial work, I did not plan to actually build and release the app – that was always a question that was up in air. My initial work was really just experimental to see if it was something I could build easily enough to make it worth the effort, and to see if my idea would be viable in app form.

Continue reading

SoundingBoard

I just re-launched SoundingBoard as a new blog to help non-technical people learn how to evaluate their app ideas.

During my time running Brightbit (a web development studio), I met with a lot of people about their app ideas. Some were bad and crazy, but most of the ideas I heard were good ideas that just lacked the critical thinking steps necessary to determine basic viability or technical feasibility. Continue reading

Pulling My Apps From The App Store: Lessons Learned

itunesconnect-unpublished-apps

Last night, I decided to pull my two iOS and Android apps SEMTab SEO Pro and my very first app, AutoRidge Lite from the App Store and Google Play. It was a difficult decision to make, because they were my first two apps, and I now have no published mobile apps to show potential freelance clients when they ask for app examples. This does limit my options, but now is a great time to make this move since I just started a full-time long-term contract and won’t be actively looking for extra work right now.

Showcasing Quality

With the recent shutdown of my company, I feel like I’m writing a new chapter in my life. Having any app in the app store just to say I have one is no longer enough. The bar is higher now. I want a high-quality, well-rated app that people genuinely like and want to use. I want something I can really be proud of. It doesn’t have to be complicated or difficult, or even do anything fancy. It just has to look good, and do one thing well — and not crash randomly. Difficult task, I know.

What A Bad App Looks Like

To provide an example of the kind of results a bad quality app will give you, look no further than my own app – my only paid app – one I just pulled from the stores – SEMTab SEO Pro. This app was ill-conceived and hastily crafted. The UI wasn’t thought out very well, and neither was the stability of the source data. The code I used to fetch Google’s PR ranking was frequently wrong (I apparently used the wrong black magic incantation to summon the accurate result), and link counts from Facebook and Twitter were different than what were reported by other (more accurate) tools and by the platforms themselves (turns out the API I used was way outdated).

Ratings

On Google Play, SEMTab had an abysmal rating of 1.6. This is primarily due to the app crashing or just plain not working on a few Android devices that I was not able to test on, or were not actually supported (like the “Rubbish” review you see for it not working on the Galaxy Tab – one of the first Android tablets that liked to pretend it could run normal Android apps just fine).

semtab-googleplay-ratings

On the App Store, the app was a lot more stable, but still got a bad rating for its terrible accuracy.

semtab-appstore-ratings

Revenue

The app was $1.99, and was on sale for $0.99 for an extended period of time to try and boost sales. Obviously, this strategy doesn’t work if your app sucks and has a bunch of bad ratings.

Google Play Revenue

semtab-googleplay-revenue

App Store Revenue

itunesconnect-proceeds-2009-2014

A whopping $127.19 from Google and $83.01 from Apple, for a grand total of $210.20. In 4 years. Ouch. Totally not worth the (admittedly small) effort I put into it.

Why I Pulled SEMTab SEO Pro

The reasons here are prety obvious, right? At this point, the ratings and performance of this app are so bad that I don’t even want it in my portfolio. I didn’t even want people to know I made this app, and was a bit embarrased to mention it whenever the “what apps have you made?” question came up, fearful people would see the terrible rating read all the horrible reviews. Good riddance. (And if you’re wondering why I am publicly sharing all this now, it’s for accountability – I never want to make an app this bad again.)

What a Mediocre App Looks Like

I am definitely more proud (or, at least, not embarrased) by my first app – Autoridge. I was a lot more torn about taking down Autoridge than I was about SEMTab. The reviews of Autoridge basically boil down to this:

  • The people who used the app and found relevant data for their vehicle’s year/make/model loved it. It provided huge value for them.
  • The people who could not find their specific vehicle’s year/make/model, or didn’t find any (or very few) relevant parts for their vehicle mostly trashed it as incomplete, inaccurate or unreliable.

Poor Early Titanium Android Support

And as in the case of SEMTab, there were also quite a few Android users that the app didn’t work for at all (freezing or crashing). I mostly attribute this to the very poor early Appcelerator Titanium Android support. Both these apps were developed and released at least 3 years ago on Titanium versions 1.5.x – 1.7.x, and a lot has changed for the better since those dark ages with Titanium (we have have an MVC framework called Alloy, and Titanium is at 3.2.x). From my experience with Alloy, I am positive that updated versions of these apps would elimate all the problems on Android.

That said, it’s pretty disharenting when you develop an Android app with an intermediate platform like Titanium, test it locally with your own Android device and emulator working perfectly, and then release it to a tsunami of 1-star reviews and reports of random freezes and crashes on various Android devices that you can’t do anything to fix.

Ratings

On Google Play, Autoridge Lite had a very average rating of 3.1. I am actually suprised it was this high with the number of ratings reporting freezes and crashes, but like I said, the number of people who it did work for generally loved it. You can see this wide rating distribution reflected in the data. This saddens me a bit, because the rating could have easily been 4+ in Google Play if it worked consistently across all Android devices.

autoridge-googleplay-ratings

The App Store rating was pretty much the same story, with all the negative reviews questioning data completeness and accuracy:

autoridge-appstore-ratingstars

Distribution

The uptake of Autoridge Lite surprised me from the start. It definitely seems like something people were ready to embrace if the data was more accurate, complete, and up-to-date. I think overall, people really like the idea of using an app instead of flipping through a greasy old parts book at the auto part store.

App Store Distribution Units

itunesconnect-units-2009-2014

Google Play Installs

autoridge-googleplay-unitsautoridge-googleplay-activeinstalls

According to Google, there are still 1,584 devices with Autoridge Lite installed. Definitely far better than SEMTab SEO Pro that had only 12 active installs. A lot of people still like this app.

Why I Pulled Autoridge Lite

The decision to pull Autoridge from the App Store and Google Play was much harder than with SEMTab, but ultimately, it came down to an issue of time, energy, and focus:

  • Autoridge Lite has a webservice backend that I also built and maintain, and this costs time and money.
  • The vehicle data has a low degree of accuracy with no automatic error correction, and would take a significant re-investment of time and energy to correct. I would have to research new sources of auto part information and build web scrapers/parsers for each of them, as well as implement better processes for checking for updates and invalidating bad data.
  • I want to completely re-code the app, and have wanted to for a while. So doing this plus all the webservice updates too would probably take longer than the original 2 weeks the entire project took initially. And since I can’t update the app only without fixing the data accuracy issue, I have to consider the whole picture.

In short – it would take too long to re-build the right way, and I don’t currently see it as worth the effort considering I haven’t made any money from it (and don’t see any path to make significant money from it ever as a one-man show).

Conclusion

Although this choice was tough, and arguably should have happened a long time ago, I am happy to be doing it now. The first step towards finding something that works is identifying and eliminating the stuff that doesn’t. The worst thing that can happen is to split your time, energy, and focus across so many projects that you do them all badly. This is exactly what I feel I have done. I want to be able to focus on my next project, I want it to be high-quality, and I want it to have a clear revenue path. This whole “making money with software” path is not an easy one, so I want to give myself the best chance possible by concentrating on the next big thing, and making a better product than I’ve ever made before. That’s what this move is all about.

Valitron: The Simple Validation Library That Doesn’t Suck

Valitron is a simple, minimal and elegant stand-alone PHP validation library with NO dependencies. Valitron uses simple, straightforward validation methods with a focus on readable and concise syntax.

Why Another Validation Library?

Valitron was created out of frustration with other validation libraries that have dependencies on large components from other frameworks unrelated to validation like Illuminate Validation (laravel 4) requiring  Symfony HttpFoundation, pulling in a ton of extra files that aren’t needed for basic validation. It also has purposefully simple syntax used to run all validations in one call instead of individually validating each value by instantiating new classes and validating values one at a time like Respect Validation requires you to do. Valitron also has a focus on being concise – validation rules are just a single line per rule, and can include multiple fields in an array. This is handy, because in most use cases, a single validation rule – like “required” will be applied to many fields, so it doesn’t make sense to start with the field first like Fuel Validation does.

In short, Valitron is everything you’ve been looking for in a validation library but haven’t been able to find until now: simple pragmatic syntax, lightweight code that makes sense, extensibility for custom callbacks and validations, good test coverage, and no dependencies.

Usage Example

Valitron is made to setup all your validation rules on the fields you need, and then run all the validations in one call. This is better than validating the fields one-by-one, because that approach causes a lot of “if” statements and branching logic that doesn’t make the resulting code any better than doing the validations by hand (which obviously sucks).

<?php
$v = new Valitron\Validator($_POST);
// Input array
$v->rule('required', ['name', 'email', 'date_start']);
$v->rule('email', 'email'); // Email uses filter_var
$v->rule('dateAfter', 'date_start', new \DateTime()); // After today
if($v->validate()) {
     echo "Yay! We're all good!";
     print_r($v->data());
} else {
     // Errors
     print_r($v->errors());
}

More usage examples and documentation can be found on the Valitron GitHub Page. Valitron is on Packagist, and can be installed via Composer.

Introducing Bullet: The Functional PHP Micro-Framework

Bullet is a new PHP micro-framework with a unique functional approach to URL routing that allows for more flexibility and requires less verbosity than the more typical full route+callback approach found in other micro-frameworks.

The Problem with Independent Scope

The main problem with most micro-frameworks and even full-stack MVC frameworks that leads to code duplication is that the callback or method executed to perform the action and respond to the URL route lives fully within its own scope. This means that you are forced to repeat a lot of setup code across URL route handlers that load the same resource, authorize it, etc.

Some typical micro-framework code might look like this:

<?php
// View single post
$app->get('/posts/:id', function($id) {
     $post = Post::find($id);
     check_user_acl_for($post);
     // ...
});

// Delete post
$app->delete('/posts/:id', function($id) {
     $post = Post::find($id);
     check_user_acl_for($post);
     $post->delete();
     // ...
});

// Edit post
$app->get('/posts/:id/edit', function($id) {
     $post = Post::find($id);
     check_user_acl_for($post);
     // ...
});

You may be able to move the ACL check to a middleware layer or “before” hook if the framework supports it, but there is always a certain amount of duplicate code you will either never be able to get rid of, or have to jump through hoops to get rid of (like adding more abstraction or re-checking the current URL, etc).

The Benefits of Shared Scope

Bullet uses a unique nested callback style that splits the URL by directory separator and only handles a single part of the URL at a time with it’s own callback. At first blush, this approach might seem like more work, but the key to how Bullet works is that nested closures – by definition – can use variables defined in the scope of their parent. This leads to some pretty powerful and profund capabilities that can only be done using the same nested closure style that Bullet uses.

Continue reading