June 2007 and July 2007 usage statistics

I haven’t updated the usage stats in quite awhile, so I’m playing catch up here! To summarize, overall Paint.NET is up by about 8.7% for the last few months, and the percentage of Vista users has increased by a surprising 25%. The 64-bit percentage hasn’t really budged. The various languages moved around a little, primarily due to a bug with the server configuration that was not allowing Polish users to update at all (the server was trying to treat any *.pl* file as a Perl script). This bug was fixed in mid-May.

Here are the raw numbers, where percentages indicate the percentage for that row of the total Paint.NET user base. The “total hits” represents the total downloads for all the update manifest files. These files have a filename that contains the OS version, “bitness” (x86 or x64), and the language. By default, Paint.NET will download an update manifest up to once every five days. It only downloads the manifest when the program is started, so if you leave Paint.NET open for two weeks straight (for example) it will only download a manifest once.

Please note that the numbers for languages in “red” do not indicate that Paint.NET was displayed in that. It only indicates what Paint.NET detected as the default or preferable locale for that system. In other words, these statistics do NOT distinguish between (for example) a Russian user who is seeing Paint.NET in English, and a Russian user who downloaded a Russian language pack and is now seeing Paint.NET in Russian.

Also, please note that these are stats for the Paint.NET application, not the website.

 

May

June

July

Total Hits

943,360

967,978

1,025,580

Hits Per Day

30,431

32,266

33,083

       

32-bit

98.87%

98.89%

98.83%

64-bit

1.13%

1.11%

1.17%

       

Windows XP

89.05%

87.95%

86.53%

Windows 2003

0.76%

0.71%

0.68%

Windows Vista

10.19%

11.33%

12.79%

       

English

46.49%

44.57%

46.39%

German

17.25%

19.33%

18.37%

French

9.35%

9.09%

8.23%

Portuguese

5.40%

5.34%

6.03%

Spanish

4.11%

4.09%

4.06%

Japanese

2.41%

2.49%

2.40%

Italian

2.27%

2.11%

2.09%

Netherlands

2.00%

1.89%

1.71%

Russian

1.65%

1.61%

1.45%

Chinese (Simplified)

1.31%

1.27%

1.30%

Polish

1.26%

1.96%

1.87%

Chinese (Traditional)

0.98%

0.92%

0.92%

Turkey

0.84%

0.78%

0.69%

Korean

0.79%

0.72%

0.68%

The rest

3.88%

3.84%

3.80%

Have translations

87.12%

86.90%

87.46%

Don’t have tr
anslation

12.88%

13.10%

12.54%

 

The follow table shows how the numbers have changed over the last few months. First, percentage increase (or decrease if negative) for June compared to May, and then for June compared to July, and finally for July compared to May (two month span):

 

May->June

June -> July

May -> July

Total Hits

2.61%

5.95%

8.72%

Hits Per Day

6.03%

2.53%

8.72%

       

32-bit

0.02%

-0.06%

-0.04%

64-bit

-1.76%

5.42%

3.57%

       

Windows XP

-1.23%

-1.62%

-2.83%

Windows 2003

-6.32%

-5.11%

-11.10%

Windows Vista

11.23%

12.89%

25.56%

       

English

-4.14%

4.10%

-0.21%

German

12.05%

-4.95%

6.51%

French

-2.77%

-9.50%

-12.01%

Portuguese

-1.16%

12.94%

11.63%

Spanish

-0.43%

-0.90%

-1.33%

Japanese

3.32%

-3.67%

-0.47%

Italian

-7.25%

-0.64%

-7.85%

Netherlands

-5.61%

-9.19%

-14.28%

Russian

-2.13%

-9.98%

-11.90%

Chinese (Simplified)

-3.08%

2.35%

-0.80%

Polish

55.36%

-4.33%

48.63%

Chinese (Traditional)

-6.41%

-0.12%

-6.52%

Turkey

-6.90%

-11.64%

-17.74%

Korean

-8.45%

-5.50%

-13.48%

The rest

-1.13%

-0.93%

-2.05%

Have translations

-0.25%

0.65%

0.39%

Don’t have translation

1.71%

-4.28%

-2.64%

 

dotPDN LLC and Paint.NET now have a mailing address

One request I get on occasion is if I have a way for Paint.NET to receive donations without having to use PayPal. Not wanting to give out my home address, I have always had to apologetically say “no.” But, finally there was a PO box that was available at the local post office, and now the Paint.NET Donate page has been updated with the mailing address:

It will also be interesting to see what affect this has on donation revenue, if any.

Paint.NET v3.10 – Final release is now available!

Well, it’s finally here! You can get it from the website, http://www.getpaint.net/ , or via Paint.NET’s built-in updater (Help -> Check for Updates). This release adds two new effects originally written by David Issel (“BoltBait”), support for the DDS file type originally written by Dean Ashton, as well as numerous small bug fixes and some visual fit and finish.

Change log:

  • New: Soften Portrait effect, by David Issel, http://www.BoltBait.com .
  • New: Ink Sketch effect, by David Issel, http://www.BoltBait.com .
  • New: DirectDraw Surface (DDS) file format support, by Dean Ashton, http://www.dmashton.co.uk/ . Improved from the original source code by optimizing the DXT compression library (“Squish”) to take advantage of multiple cores / processors.
  • New: “Paint.NET Search”, available from the Help menu (shortcut key is Ctrl+E), allows you to search for Paint.NET help, forum posts, tutorials, plugins, and other related material: http://searchpaint.net (Note: This feature is only available in English.)
  • Improved: Visual fit-and-finish for the Layers window.
  • Improved: Visual fit-and-finish for the close / ‘X’ button on image thumbnails.
  • Improved: Small (about 5-10%) performance improvements for some effects such as Oil Painting, Frosted Glass, and Gaussian Blur.
  • Improved: Increased max brush size to 500, as per forum members request.
  • Improved: Expanded list of available font sizes up through 288.
  • Changed: The keyboard shortcut key for the Color Picker is now ‘k’. This makes it so that the toolbar option, “After click: Switch to previous tool”, is not useless for those using the keyboard shortcuts.
  • Fixed: In some cases, undoing an action that removed a layer would result in the un-removed layer not showing up until you resized the Layers window (“ghost layers”).
  • Fixed: Pressing F1 from the main window no longer launches the online help in two browser tabs.
  • Fixed: Adding a new layer now adds it above the currently active layer, instead of at the very top of the layer list.
  • Fixed: Merge Down now activates the merged layer instead of the one above it.
  • Fixed: In Vista, clicking on a URL link from the installer will no longer launch the web browser with inherited, elevated privileges.
  • Fixed: Pressing Ctrl+[ no longer cancels out of drawing a line/curve, but instead decreases the brush size by 5 as expected.
  • Fixed: Ctrl+clicking on the brush size +/- buttons now changes the brush size in increments of 5.
  • Fixed: Save Configuration dialog would “creep downward” from its last position every time it was opened again.
  • Fixed: TGA codec now saves the * of alpha bits to the image descriptor byte. This was causing some other applications to load TGA files saved with Paint.NET as solid black images.
  • Fixed: Clicking the ‘X’ to close the Layer Properties dialog was not reverting changes made to the layer while the dialog was open.
  • Fixed: Installation will not proceed unless Paint.NET is closed, and will also not allow Paint.NET to be opened until installation is completed. This helps to ensure a fully coherent and complete installation or update.
  • Fixed: If a file failed to open, and there were no open images, and the user pressed either the Zoom In or Zoom Out toolbar buttons, then Paint.NET would crash.
  • Fixed: In Vista, it was possible to crash the Save As dialog by typing a filename that was too long.
  • Fixed: In Vista, it was possible to crash the updater if you let the UAC prompt time-out.
  • Fixed: It was possible to crash Paint.NET on some systems by clicking on a tool in the Tools window while the “Save As” dialog was open.

Enjoy!

Aunt asks, “Have you ever heard of paint dot net?”

I was recently talking to my friend Jake online, when he mentioned this:

So my 62-year-old aunt calls me up about two hours ago: “Hey, Jake, have you ever heard of paint dot net [sic]? Is that a good program? I’ve got a bunch of pictures from polo and I need something to work with them with.”

Apparently his aunt loves Paint.NET 🙂

Elusive Bugs: Crash when clicking zoom buttons after a file failed to open

I actually found this by accident the other day. I was toying around with the latest build of Paint.NET, fresh out of the compiler’s oven, and I noticed some weird behavior. I had pre-ordered BioShock on Steam about 10 seconds after I read it was available on there (Tuesday can’t come fast enough!), and was pawing through the files that had been downloaded on my system. There was a bitmap and a PNG, and so of course I had to check them out!

After right clicking the image and choosing Edit, Paint.NET started up and gave an error saying it couldn’t open the image. After a few seconds of wondering why, I realized it was simply because the files were still in encrypted form. Steam is very careful about their release dates! (and rightfully so, of course).

But, what I noticed was that the tool windows and the toolbar were still interactive, even though there were no images open. They’re supposed to be disabled! This is a behavior glitch, of course, but if you can’t crash the app or get it into a bad state then it’s a bug I’m willing to punt until the next release (or just “won’t-fix” forever). So I started clicking on everything in the toolbars and tool windows, half expecting it to crash or worse. Everything was working great though, which I was happily surprised by.

Oops, except that when I clicked on either the Zoom In or Zoom Out buttons, it did crash 😦

Exception details:
System.NullReferenceException: Object reference not set to an instance of an object.
at PaintDotNet.AppWorkspace.ViewConfigStrip_ZoomIn(Object sender, EventArgs e)
at PaintDotNet.ViewConfigStrip.OnZoomIn()
at PaintDotNet.ViewConfigStrip.OnItemClicked(ToolStripItemClickedEventArgs e)

Darn it! Well, the fix was easy enough, all I had to do was check to make sure that ActiveDocumentWorkspace (an internal property of Paint.NET’s AppWorkspace class) property was non-null before doing anything with it.

But wait, there’s more! I’ve actually been receiving e-mails with this specific crash for months! I never knew how to reproduce the crash, and therefore had no way to fix it.

This bug is reproducible in Paint.NET v3.0 through v3.10 Beta 2. It is fixed for the finalized v3.10 release.

Paint.NET v3.10 Beta 2 is now available!

There were enough code changes and additional fixes to warrant a second beta, so here it is! Anyway, get it in the usual places: (1) from the website, http://www.getpaint.net, or (2) via the built-in updater. Make sure that “Also check for pre-release (Beta) versions” is enabled.

Changes:

  • Changed: Increased max brush size to 500, as per forum members request
  • Fixed: Some layout issues with the Save Configuration dialog and the DDS configuration control
  • Fixed: In some cases, undoing an action that removed a layer would result in the un-removed layer not showing up until you resized the Layers window (“ghost layers”)
  • Fixed: Pressing F1 from the main window would launch the online help in two browser tabs
  • Fixed: Adding a new layer now adds it above the currently active layer instead of at the very top of the layer list
  • Fixed: Merge Down now activates the merged layer instead of the one above it
  • Fixed: Put the ‘x’ close button back in the Layer Properties window (managed to fix the bug w/o necessitating removal of the ‘x’)
  • Fixed: In Vista, clicking on a URL link from the installer will no longer launch the web browser with inherited, elevated privileges

Enjoy!

So many Freeware Tips to write about …

After writing the first two articles in my “Making Money With Freeware” series, I’ve come to the conclusion that there are several cross-cutting topics that deserve separate treatment. Because, as you might expect and as an example, the first tip one should heed towards making money with freeware is to strive to have popular freeware application. Having a popular freeware project quite often also depends on it being a high-quality freeware project. And having a popular or high-quality freeware program does not by itself make you money, and I don’t want to talk about popularity or quality only while under the justification of monetization.

To that end, I think I’ll rename the series to “Successful Freeware Project Tips”, and then at the beginning of each article I’ll notarize which bucket(s) the tips go into.

In conclusion, you should be looking forward to the new Tohuvabohu album by KMFDM, set to be released later this month. They’ve got a few preview tracks on their MySpace page.

(Actually, that’s completely unrelated. I’m just a big fan of KMFDM. QED.)

Paint.NET begets dotPDN LLC

I recently created an LLC for Paint.NET. I named it “dotPDN”, which is what you get if you say out loud the file extension for Paint.NET’s native file format, “.PDN”. After some quick iterating with a friend and some people on the forum, I even have a nice logo made completely in Paint.NET:

The “corporate website” (if you can call it that J) is at http://www.dotpdn.com. The text on the site, “our current projects include…” may seem to imply that I have other projects in the works. This isn’t the case, although I may resuscitate ListXP in order to have more than 1 project in that list J Which might be painful seeing as how the code sort of fell apart the last time I tried to compile it in Visual Studio 2005 … dang, I could really use that utility again in x64 land. Right click, List!

Some people might see this “dotPDN LLC” addition and think, “Oh my gosh! Did Paint.NET get bought out!? What’s going to happen?! Is it going to cost money now! Onoz!” Well, Paint.NET was not “bought out”, and I did not “sell out” to anyone. dotPDN LLC is my own Limited Liability Company and there will be no changes to how Paint.NET is distributed or developed. I’m still the one doing the coding, and I’m still the one calling the shots. The purpose of the LLC is mostly to serve as a legal shield for me: if someone wants to “sue Paint.NET” then they have to target the LLC and they can’t go after my personal assets (like my liquor!). I think it also has some tax benefits, but I’m going to let QuickBooks help me figure that part out.

Next up I need to set up various e-mail accounts, get a PO Box, and a new code signing certificate. Hopefully the next Paint.NET update you install will say that it’s digitally signed by “dotPDN LLC” instead of “Eric Brewster” J Total cost to set up the LLC was less than $1,000 USD, which includes going to http://www.mycorporation.com and checking the boxes to have them basically do all of the grunt work for filing and paperwork. I also had to buy a bunch of domain names for “dotpdn” and “dotpdnllc”.

Making Money With Freeware, Tip #2: Put Help Content Online

With Paint.NET v3.07, there was a subtle change in the release notes:

  • Changed: The help file / documentation is now hosted online. This has reduced the download size by more than 3 MB, and will also allow us to provide translations without ballooning the size of the download (each language would have added between 2 and 4MB).

This was firstly possible because the Paint.NET help content is just a collection of HTML pages that load in your browser. So I guess my first recommendation is to do the same: write your help content with a copy of your favorite web page editor. I use FrontPage 2003. Yeah, I know, I’m lame J But heck, I also use CVS, which means I’m “stupid and ugly” according to Linus Torvalds! (I’m not defending CVS. I just happen to use it.)

This change was made for many reasons, not all of which were necessarily listed in the change log, but all of which I see as advantageous:

  • Smaller Download Size. It dropped from 4.5 MB down to 1.5 MB. That’s an enormous savings.
  • Easy to Correct. If there is a typo or error, I can fix it and just upload the new version of the page.
  • Easy to Amend. If I want to add a new topic, I can now just write it up and click “upload”.
  • Localization. This ties in to the three previous ones, and I’ll discuss it below.
  • Statistics. I can now get usage data on the help content itself.
  • Search. Since it’s just a web site, it’s now easy to add a little search box on there.
  • Advertising. Now I can place Google AdSense or other things on the pages.

There is only one negative that I could think of:

  • Offline Access. It isn’t easy to access the help content anymore if you aren’t connected to the Internet. But you can mitigate this by offering an optional download for the small number of people who care about this. And also for anyone volunteering to do localization.

Almost all of these can affect your ability to make money from your freeware project.

Smaller Download Size

I’m going to publish a completely separate article on this because what I was typing got really long and I want to keep this post focused. Stay tuned!

Easy to Correct, Easy to Amend

Sometimes I get an e-mail from someone telling me about a typo on the website or in the help content. It used to be I’d have to file a bug in my Bugzilla database to make sure it got fixed before release. Now I just fix it, upload it, and I’m done. Sometimes I also get the itch to update or freshen pages (like I did with the Features page on the main website recently). This has less to do with making money and is more about simply being agile with your product.

Localization

Before, if I had wanted to publish the help file in all of the other 7 languages that Paint.NET is released in, it would have ballooned the download size to about 22 MB (at an estimated 2.5 MB per additional language). Most of this increase comes from screenshots which have text and must be done separately for each language. Most users only care about 1 of those languages so this ends up being an incredible waste of bandwidth. And on that note, most users don’t use the help content at all and so even downloading 1 language’s worth of it is a waste for them.

I can now also publish extra languages on a schedule independent of the main Paint.NET release, which relieves a lot of potential scheduling hassle. This is also directly related to having a smaller download size which, again, I will talk about later. And if you put advertising on your help pages then a user is more likely to see an ad in their preferred languages and thus much more likely to click on it.

Statistics

I now know how many people are reading the help file. I know which pages are popular. I know how many pages are read during each visit. Having good statistics is never a bad thing. Just sign up for Google Analytics and put the code at the bottom of your pages, although make sure it is tracked separately from your main website. Right now the Paint.NET help content is getting about 1,700 visitors per day, which is something I didn’t know before!

Search

There are a few ways to add search to your help content if it’s offline. One way is to use the CHM format, but the tools and utilities I had for managing this were excruciatingly difficult and painful to use. I absolutely hated it, so for version 2.5 I switched to normal HTML. Also, for cross-platform enthusiasts/purists, CHM either restricts you to Windows or forces you to find a different solution for your other target platforms. It just adds to the amount of time you have to spend managing your help content, and reduces time available for other things like drinking beer. Bleh to that.

Another way to get search is to write your own help system complete with original UI, indexing, and searching code (and that’s in addition to writing the content itself!). It’s definitely a challenging and fun direction to go in and you’ll learn a lot, but it’s also a liability in traditional software development terms. More code means more churn means more bugs, and which means less time to focus on the core of your project. Are you in the business of developing indexing and search algorithms? I doubt it. I prefer to let the
big
guns handle that stuff, and focus on what I do and enjoy best.

It’s easy to use something like Google Custom Search to add a search box if your help content is just a collection of HTML files that are hosted online. I only recently added this to the Paint.NET help file and now I really wish I had done it sooner. It isn’t a big earner in absolute numbers, but it’s always good to have another passive income stream – and those nickels and dimes really add up. (Small tip: Don’t look at your daily revenue numbers for inspiration. Multiply them by 365 and consider how they have affected your yearly income! J)

Advertising

Since putting the help content online, I have placed Google AdSense on the pages. I’m also considering using something like Kontera for in-text advertising links. You might think that the added advertising makes the help file ugly or less attractive, and you’d be right. But you need to ask yourself what the best release model is for yourself and your users:

  • Freeware. In this choice you give the software away for free. No ifs, ands, or buts. This is how Paint.NET was for its first 2 years. You won’t make any money at all doing it this way. I sure didn’t. All hosting costs come out of your pocket.
  • Bundling / Spyware / Adware. There’s also a lot of money in bundling stuff that isn’t related to your program. Irfanview, an otherwise highly rated program, optionally installs the Google Toolbar. Lots of other free programs try to install toolbars or set your browser’s homepage. I personally feel that is a dishonest way for the “bundlers” to get their software on people’s machines. This is actually a lot I could talk about on this subject in the areas of business, morals, ethics, etc. and I am planning on dedicating a blog post to it.
  • Shareware. Publishing your software this way is good and legitimate business, and might even be the right thing for your software project (it works for Patrick’s
    Bingo Card Software). You can make a lot of money with this strategy if your download and conversion numbers are high enough. But, of course people have to pay for the software which means you’ll have fewer users. Going in this direction also means you have to manage a business. You’ll have to worry about things like customer service (“I want a refund!”), buying advertising with AdWords or AdCenter, maybe hiring employees, etc. You also lose some potential for ubuiqity, which is important for some types of software (web browsers and image editors, for sure). I currently estimate that Paint.NET has 1 million active users. I regularly have people that work down the hall from me say things like, “Oh, you wrote Paint.NET? I had no idea, cool!” Do you think it would have such ubiquity if it were paid software? Not with my budget (time or money), that’s for sure.
  • Freeware, but with advertising outside of the program (website, online help file). NOW we’re talking! I personally believe that this is the absolute best user experience possible. Users get software for free and you get money so you can afford to manage its continued development. You don’t have to manage a business. If you want, you can take a vacation from the project but still be making money on it. People are used to seeing ads on the Internet. You won’t get any hate mail — I sure haven’t. You should also include a few smartly placed “Please Donate” buttons in the software itself.

I’ll even tell you how successful AdSense has been on the help file, even though I earlier said I wouldn’t publish any comprehensive data. Since Paint.NET v3.07 was released, I’ve made over $1,000 just from the help file. It’s been almost three months since I made this move, and I trust that you can do the math on that.

Conclusion

Putting the help content for your freeware project has almost no negatives. It’s a no brainer. Your download size will decrease, your download counts will go up, and you’ll have extra money in your pocket. Almost every software project is going to be different, so please don’t take this information as canon. This is what works for me, taking into account the direction I want to take Paint.NET and the way I want to spend both my personal and professional time.

Oh, and to keep the bandwidth use in check for your online help content, I recommend using PNGOUT. I’ve seen PNG’s drop anywhere from 5% to 50% in size using this thing! You can purchase a good front-end for it, PNGOUTWin, from Ardfry Imaging (they own PNGOUT). I personally use PNGGauntlet because it’s free, but it doesn’t run jobs in parallel so it runs a lot slower on my Core 2 Quad. Alternately you can use JPEG, but then all your screenshots look like crap.