Thursday, May 27, 2010

Windows Live Writer Portable upgrade

Windows Live Writer Logo I was prompted today to upgrade my portable install of Windows Live Writer. In case you have not heard about it, WLW is one of the few Windows applications that have no equivalent in the Linux world, causing many to keep Windows virtual machine or windows partition just so they can use it. This being the best blogging editor there is, I thought it's a good idea to share this experience (and much more) with you.
After a bit of digging, I’ve learned that there are no new features, meaning that this is most likely a bug-fixing release. The next version is scheduled for the 3rd quarter of this year (2010, if you just woke up from a coma).
WLW is the editor of choice for part time bloggers such as myself as well as most professional bloggers. I can guarantee you that if you install it and use it for 3-4 blog posts, you will not want to go back to ScribeFire or whatever you were using prior. Among many improvements, it allows for plugins. The ones I am using are Smiley and Dynamic Template. I also have Event installed, but never used it.

1. Portability

Windows Live Writer is portable by itself. Unfortunately, most people are unaware of this feature, as it is not documented. Searching for it, you can find something to download and instructions to use the “portable code”, but it doesn’t work. It will corrupt your data and waste your time.
I use WLW portable in my Liberkey, following Christoph De Baene’s instructions. Here’s what I did on Windows XP:
  1. If open, close WLW.
  2. Find WLW program directory (e.g., C:\Program Files\Windows Live Writer).
  3. Create a Directory called UserData
  4. Restart WLW and it will create all the necessary directories for you.
  5. Copy your existing Drafts and blog Posts from MyDocuments\My Weblog Posts to the appropriate directories.
  6. Copy or Sync the WLW folder to your USB key or any other location.
Things are a bit more difficult under Vista or Windows 7 as these OSs are more finicky when it comes to writing to the Program Files folder – but there are ways around that. You could, for instance, copy the WLW folder to a writeable directory and work your magic there.
The portable program will work just fine on any other Windows computer with .NET installed (most of them, these days). Some plugins – most notably Dynamic Template – scatter their files in several locations, making it difficult to take it with you. Incidentally, DT concentrates most of the editor’s power, so that’s a major letdown. Also, the passwords are no longer saved, so you will have to enter them every time, for every blog, even for those under the same account.
Portability should not be an issue for me if Blogger had a normal editor. Unfortunately, their (online) editor is more like a “proof of concept” than “production environment quality”.
To upgrade to the latest version, I renamed my old WLW directory –> WLW.old, then I copied the installed program from Program Files to Liberkey\MyApps, renamed it WLW, copied / moved UserData from WLW.old to WLW.

2. Plugins

WLW pluginsOne of the secrets of WLW success is the API and plugin architecture. There are two plugins I could not blog without: Rahul’s Smileys and Joe Cheng’s DT.


It allows you to insert a Yahoo or MSN smiley. You can add your own or Google Gmail smileys, if you know their URL. Unfortunately, the plugin does not make the substitutions automatically. You could, however, have your blog make such substitutions for you and anyone who comments. For instance:
Smiley Yahoo MSN
:) Happy Smile
:D Big Grin Open-mouthed

Dynamic Template

This amazing plugin allows you to essentially make your own plugin. You can introduce code with ease based on text selection or variables you can input. These are my “templates”:


var: description Text(Multi-line) Enter your description body: <span id="description"><%= description %></span><!-- more --><p>Sources / More info:</p>


var: abbr Text Abbreviation (e.g., USA) full Text Long Form (e.g., United States of America) body: <abbr title="<%= full %>" style="border-bottom: 1px dotted navy"><%= abbr %></abbr>

Amazon – wiki –gb

var: fname & lname (Text) – author’s first & last name
body: (<a title="<%= fname %> <%= lname %> @ Amazon" href=";<%= fname %>%2520<%= lname %>%26url%3Dsearch-alias%253Dstripbooks&amp;tag=zamolxis-20&amp;linkCode=ur2&amp;camp=15121&amp;creative=390961" target="_blank">amazon</a>, <a href="<%= fname %>_<%= lname %>" target="_blank">wikipedia</a>, <a href="<%= fname %>%20<%= lname %>" target="_blank">google-books</a>)


var: ASIN Text Enter ASIN Title Text Enter Title <a title="<%= Title %>" href="<%= ASIN %>/conscons-20" target="_blank" rel="nofollow"><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="<%= ASIN %>.01.MZZZZZZZ.jpg" border="0"><%= Title %></a> (<a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.CA</a>, <a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.UK</a>, <a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.FR</a>, <a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.DE</a>, <a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.JP</a>, <a rel="nofollow" title="<%= Title %>" target="_blank" href="<%= ASIN %>/conscons-20">.cn</a>)

Amazon – DVD

body: <a target="_blank" title="Find <%= _selection %> on Amazon!" href="<%= _selection %>%26url%3Dsearch-alias%253Ddvd&tag=bestplus-20&linkCode=ur2&camp=15121&creative=390961"><%= _selection %></a><img src="" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


var: anchortag Text Enter anchor name body: <a name="<%= anchortag %>"></a>


body: <span id="description"><%= _selection %></span><!-- more --><p>Sources:</p>


var: daheight Integer Height (50, 100, 200) dawidth Integer Width (420, 600) body: <div style="width:<%= dawidth %>px;height:<%= daheight %>px;overflow:auto; border-width:2px;border-color:000000;border-style:solid;"><%= _selection %></div>

Embed gDoc

var: hght Integer Enter height (500) wdth Integer Enter width (500) docurl Text Enter URL of Google Document body: <iframe height="<%= hght %>" marginheight="0" src="<%= docurl %>" frameborder="0" width="<%= wdth %>" name="docomentu" marginwidth="0">Loading...</iframe>

Embed gview ppt pdf

var: hght Integer Enter height (500) wdth Integer Enter width (500) docurl Text Enter URL (pdf or ppt) body: <iframe src="<%= docurl %>&embedded=true" style="width:<%= wdth %>px; height:<%= hght %>px;" frameborder="0">Loading...</iframe>


var: IDCarte Text Unique GoogleBook ID body: <script type="text/javascript" src=""></script> <script type="text/javascript"> GBS_insertEmbeddedViewer('<%= IDCarte %>',600,500); </script>

iFrame linkies

var: link1 - text name1 - text link2 - text name2 - text targetname - text sqsize - integer (500, usually) body: <p>[<a href="<%= link1 %>" target="<%= targetname %>"><%= name1 %></a>] [<a href="<%= link2 %>" target="<%= targetname %>"><%= name2 %></a>]</p><iframe height="<%= sqsize %>" src="<%= link1 %>" frameborder="0" width="<%= sqsize %>" name="<%= targetname %>" scrolling="yes" align="center"></iframe>


<%= HtmlDecode(_selection) %>


var: listaclipuri Text Playlist Unique String body: <p align="center">.<!--object height="481" width="600"><param name="movie" value="<%= listaclipuri %>&amp;hl=en"></param><embed src="<%= listaclipuri %>&amp;hl=en" type="application/x-shockwave-flash" height="481" width="600"></embed></object--></p> <a href="<%= listaclipuri %>" target="_blank" title="Lista clipuri iutub">yt</a>


var: text Text What to say times integer How many times body: <% for (int i = 0; i < times; i++) { %> <%= text %> <% } %>

Tag It

var: text dablog enter the short blog name <a href="http://www.%= dablog %/search/label/%= _selection %?max-results=100" rel="tag" title="Find other articles containing %= _selection % on %= dablog %!">%= _selection %</a>

Timestamp AMPM

<b><%= DateTime.Now.ToString("hh:mmtt") %> - </b>

Timestamp hh-mm-ss

<% string currentTime = DateTime.Now.ToString("HH:mm:ss"); %> <b><%= currentTime.ToUpper() %></b>
They can be found in the %user%\Application Data\WLWTemplates – by user, on Windows XP I mean C:\Documents and Settings\USERNAME and on later versions C:\Users\USERNAME; mine are on

Moar plugins!

There are numerous other plugins. I’m listing some of the most popular, with my thoughts on each.
  • Sharper Photo makes image editing, pasting and renaming a snap. Highly recommended!
  • Flickr upload, Instant ImageShack and SmugMug allow you to upload your photos to your favourite photo service.
  • You can add buttons such as Digg This!, Twittermeme, Facebook Like, Buzz This!, delicious, etc. I do not use them, as I prefer a multi-button such as ShareThis!.
  • will allow you to embed a file from your storage. Other plugins promise to automate file uploads for Wordpress users, but according to user comments it is not working.
  • A number of plugins promise to beautify your Code snippets, but this is, in my view, better addressed through your blog CSS.
  • A few plugins are just useless from the get-go, at least to me: the Ink plugin would work only on my Tablet; even then, I’m better off just using Journal or Note, then copying and pasting the text.
  • Polaroid seems to duplicate default functionality, while image search plugins do not allow you to specify CC-only.
You can find the links to those I consider relevant in Sources, below. Also, links explaining how to get the spell checking done in other languages, such as Portuguese (pt) or Romanian (ro).

Make your own plugin!

To create plugins for WLW, you will need to download and install Visual Studio Express (free) or any other development environment that supports creating .NET assemblies (cf Bucknall). You might also want to read Julian M Bucknall’s article (linked below) and download & install the WLW SDK. If you have programmed with .NET or if you have any Windows programming experience, it shouldn’t be hard. Personally, I wish one could write plugins in Python Batting Eyelashes

3. Wishlist

As powerful and amazing WLW is, it can still be improved. Here’s what I’d like to see in the upcoming version:

a) Search / Replace

Even the most basic editors have this feature. I should be able to search and replace across all my Drafts or published documents. As a bonus, there should be a way to change even published articles – but that is probably more difficult to implement across the many blog platforms WLW supports.
Not long ago, when Blogger finally introduced the <!-- more --> feature I tried to retroactively change my blog posts but to no avail. Moreover, anticipating a possible move to Wordpress, I had been using the separator in my blog posts but without the spaces, causing Blogger to ignore it. The change that I needed to make was thus very simple, but it became agonizingly difficult. I downloaded a backup, made the changes in the .xml file, restored my blog and that did not work either. I tried many other ways and I eventually got it to work, but I wish I could have done it simply, from WLW.

b) better Blogger support (pages, more)

Blogger has recently introduced static pages and <more> but this has to be yet supported by WLW. I’m quite sure they will introduce support in the upcoming version, but I’ll mention it just in case.
For various reasons, I prefer to format my posts in a specific manner (see 2start macro). I wish there was a way to start with a preformatted template – this cannot be done presently through the htm / css from the respective directory.

c) DT: one-click, conditional statements, portable

I would like to see the Dynamic Template plugin become part of the main program and extended with the use of conditional statements (if, then), looping (for .. to .. step) and even, if possible, lookups to external sites / APIs. Yes, I know I’m pushing it with the last one, but wouldn’t that be awesome, if done without increasing the memory footprint?
Even if such look-ups are not implemented, I would like to see the ability to use DT templates with only one click – it takes at least 2 right now. I am using some of the above macros much more often than any other feature, and the quicker I can access it, the less time I waste.
As great as DT is, it should be portable as well and stop spreading its love all over the USER’s Users folder.

d) one click posting to two blogs

I might want to keep a backup of my blog on another service, but right now this is rather difficult. I wish there was a way I could post to two blogs at once. I do not think more than 2 is necessary, as that is probably something only spammers would use.

e) Images: better handling + image watermarks + filenames

One of the annoying “features” of WLW causes it to duplicate image uploads whenever you check link to “Source Picture” and even if you don’t. With PicasaWeb, ImageShack, Flickr and other image hosts you don’t have to make two different uploads to get different resolutions – you can specify the resolution in the image URL. I wish WLW would become aware of it and stop doubling every photo upload, as that makes photo and space management more difficult.
An excellent feature is the ability to add text watermarks; it would be even more amazing if you could add not just textual watermarks, but also image watermarks.
You can also use images just by pasting them into the editor, but in that case, you cannot change the image filename from the default image[x].png. I wish WLW would let me change the filename or the type (jpg), just like Scott’s or Sharper Photo plugin allows me to do. Even better, wouldn’t it be great if you could also set the JPG image quality?

f) customizing the interface

Many bloggers, for better or for worse, use various features currently buried in menus more often than the ones found on the toolbar. It would be great if one could easily place whichever features they wish on the toolbar, such as text colour. Such buttons could also launch your most often used DT macro, for instance.
Another customization that will surely please many power users is the ability to assign keystrokes to plugin actions. In particular, I wish I could insert Dynamic Template code with a specific keystroke.
Here’s a list of the existing shortcuts, for those who don’t know:
New Post    Ctrl + N New Page    Ctrl + G Open    Ctrl + O Save Drafts Locally    Ctrl + S Publish    Ctrl + Shift + P Print    Ctrl + P Insert Link    Ctrl + K Insert Image    Ctrl + L Check Spelling    F7 Normal View    Ctrl + F11 Web Layout View    F11 Web Preview    F12 HTML Code    Shift + F11 View Post Properties    F2 Toggle View of WLW Sidebar Options    F9

g) auto-replace & auto-linking segregation for different blogs

It is possible to establish a link glossary, which is a great feature, except that it’s global-only. I wish I could set the same word to be auto-linked to something in one blog and something else in another. Some other words should be auto-linked globally. Ideally, one could choose whether a glossary entry is global or to what blog(s) it applies.
Scott has identified a registry entry which governs the AutoReplace feature in WLW and made a plugin, but it’s no longer available. It would be great if one could (re)define the AutoCorrect entries and

h) better tag handling (import)

The ability to customize tags – and the fact that they stay with each blog – is magnificent. However, currently, if you edit on older post, the tags are not editable because the ID string WLW uses differs between installs. I wish WLW would identify and recognize code more intelligently, without those ugly ID strings. That way, I could edit tags based on WLW recognition or based on me telling it somehow that “this is an editable tag”.

i) trackbacks / pings

Wordpress and other blogging platforms provide their own trackbacks / pings. Blogger, most notably, does not. I wish there was a way for WLW to automatically ping the blogs one quotes. There is a way to specify “pinging services”, but that’s not it. Furthermore, those pings (as allowed by Blogger) are usually counterproductive, as they may get your domain blacklisted, especially if you tend to re-edit your article several times immediately after publishing.
The only way Blogger users can get trackbacks to work is to install a Python script and run it with cron. That’s not the Microsoft way, or is it? NerdThinking

j) old articles 500 limit + sort

Most blogs are well over 500 articles long, which means that older blog posts can no longer be edited in WLW. It would be useful if there were alternative ways to edit articles, such as entering their URL or clicking a bookmarklet in the browser.
When you have many drafts – and even with the 500-limited published articles – it can be difficult to find what you are looking for, especially since a Search across articles is missing (point a). As such, being able to sort them by other criteria in the Open File.. dialog box would be very useful.

m) nice 2 have (but not so important)

There are a few other features which would be great, but I’m not holding my breath for – i.e., I wish they were there but don’t expect them to become available any time soon.
1) comment moderation (Blogger, Disqus & IntenseDebate)
2) online editor, like Office Live
3) multiplatform availability, especially linux (mono or wine) – not gonna happen, I know Puppy dog eyes

4. Closing Thoughts

I had a chance to “test” Microsoft’s tech support a while back when WLW just stopped working on my Windows Tablet PC. Though they did not solve my problem (SRX1113083141ID), I was surprised at the level of support offered for a free product. My problem was escalated and even though each TSR asked me to perform the same troubleshooting steps that did not make much sense, there was a clear and obvious desire to help and much better service than I got from either Apple or Google, ever.
When deciding what features to incorporate, the WLW Dream-Winning-Team should perhaps remember the thoughts of a leader who tends to fare slightly better than Gates in debates and / or public opinion:
You can't just ask customers what they want and then try to give that to them. By the time you get it built, they'll want something new.
It's really hard to design products by focus groups. A lot of times, people don't know what they want until you show it to them.
Let us also not forget the teachings of Howard Moscowitz as told by Malcolm Gladwell at TED (I added the videoclip first in the list below). In essence, rather than trying to make the Perfect WLW, you could aim for one that is Simple, with a default interface / feature set that will satisfy most new users, and an Advanced version, with a feature set that will respond to the demands of the more sophisticated user. Let us not forget that some of the more advanced features are not likely to be requested but will most certainly be embraced if available.
It is hard for me to understand why isn’t Google in their Blogger editor providing the features that Microsoft has long ago implemented in WLW, especially since they are offering 2-3 (!) versions of it. Sure, a script editor is almost impossible to offer online, but others, such as the use of paragraph marks (<p> </p>) instead of breaks (<br/>) are necessary. It might be that they are following what the beginning bloggers want, yet they could easily satisfy both camps. Considering the excellent job that Microsoft has done with Office Online, I would not be surprised to see WLW offered online as well, replacing the Blogger online editor for almost any Blogspot user.
Sources / More info: wlw-forum, wlw-twitter, smiley-rahulso, dt-joecheng, wlw-home, Version 14.0.8050.1202, line-gap, next-wlw, wlw-new-ver, wlw-dict, dict-pt, dict-ro, box-ro, plugin-scott-blogger-jump, plugin-scott-auto-replace, VS-express, wlw-sdk, bucknall-wlw, de-baene, plugin-scott-clipboard-capture, plugin-sharper-photo, plugin-imageshack, plugin-smugmug, plugin-flickr,, plugin-amazon-linker, plugin-tag-gen, yt-wlw


  1. Portability - thanks for letting me know about this special feature. I'm not aware of it. Now, I have the reason to use Windows Live Writer...again :)

  2. Sure thing, Eric.. It never ceases to amaze me why so many people hurt themselves with that silly "Portable WLW" program :)

  3. I found your TAG IT template fascinating, but I can't make it work - to see what it does... What exactly does it do?

    Until next time,

  4. If I want to promote any word in my text to "tag status", I select it and "tag it".

  5. terima kasih gan


Thank you for commenting and rest assured that any and all comments are welcome, whether positive or negative, constructive or distructive. Unfortunately, if you comment in this view I might not know about - please use the regular (Desktop) view.
I am using Disqus for commenting, but Blogger is not showing it so your comments may end up not being displayed - tell Google about it!