December 30, 2002


Two main changes in the today's build, both long-awaited. The first one is custom serialization: you will no longer lose all your saved data when you install a new Syndirella build in which I decided to add a new persistent field to some class. To make it precise, you will lose your data one last time when you install the today's build, but after that, all versions will be able to load the data saved by any previous version.

The second one is the support for updated items. Previously, if a blog didn't have item GUIDs, any changes in the item title or description caused Syndirella to show a new item in the item list. Now, if one of the news item fields (item, link, description) changes and the other two remain the same, Syndirella considers the item updated and highlights it with light blue. (For blogs that have GUIDs, any changes in an item with the same GUID cause it to be shown as updated.) If a feed has updated items but no unread items, it is also highlighted with light blue. Updated items are also supported for scraped feeds.

And the best thing is that the release of the initial public version is so very close now... There are only two must-have features remaining that need to be implemented before the release: automatically updating feeds and a limit on the maximum number of news items stored for each feed (by date or by count). When these are done, I'll release version 0.9 and try to spread the word of it all over the blogosphere. Hopefully I'll get at least some feedback; that will make the base of a stable 1.0 release, with no major new features.

Posted by yole at 10:23 AM | Comments (0)

December 27, 2002


The main news in the latest version is the support for minimizing to tray. Syndirella has a new (ahem) icon (programmer's art at its worst), and when Syndirella is minimized, the icon is animated if there are any unread news. The tooltip of the icon displays the number of updated feeds and the titles of some of them (the tooltip is limited to 64 characters, so there's not much I could cram in there).

Some of the other fixes:

  • The "Add Web feed" dialog correctly displays lines separated with only CR characters;

  • The local link parser is more tolerant and also processes links where attribute values are not enclosed in quotes;

  • To make it possible to work with Web forms in Syndirella, the shortcut for the Back button has been moved to the standard Alt+Left Arrow;

  • The F5 and Ctrl-F5 shortcuts are also handled when the IE window has focus;

  • Web feeds now also support ETags.

Posted by yole at 10:43 AM | Comments (0)

December 23, 2002


Some more weekend hacking done - not a full day this time, but still quite a lot. Probably I should've found something more interesting for the weekend than sitting at home in front of my computer, but it's too late to change that. :-) At least the weekend was sufficently productive, and I'm well rested from my day job. The idea of taking a couple of days of vacation during the next week doesn't look so exciting any more. :-)

OK, on to Syndirella news. The main change is one that should have been made a long time ago - now you can use Syndirella on computers that have only the .NET Framework and not Visual Studio.NET installed. Previously, Syndirella required MSHTML.dll, a primary interop assembly installed with VS.NET. This assembly is a 8 Meg file, so I was obviously quite reluctant to redistribute it. And today, thanks to an excellent FAQ entry from George Shepherd's WinForms FAQ, I've found a way to access the IHTMLDocument2 interface of the WebBrowser control without requiring any external assemblies.

Other changes:

  • Possiblity to export the settings of a Web feed to an XML file and to import the settings back later.

  • searches are done with asynchronous XML-RPC calls, so the UI is not blocked while the search is being conducted.

  • The "Add Web feed" dialog now handles HTTP errors.

  • The back/forward navigation code doesn't get confused anymore by pages that contain frames or iframes.

  • Changing the settings of a Web feed now invalidates the feed and causes all the entries to be downloaded anew.

  • Line breaks in news item titles are now converted to spaces.

  • Syndirella is now more tolerant to RSS feed encodings. If the XML encoding is not specified explicitly and an attempt to parse the feed as UTF-8 fails, the parse is retried with the ANSI codepage.

  • The usual assortment of fixes and UI improvements.

The build can be found at the usual location.

Posted by yole at 12:52 AM | Comments (0)

December 21, 2002

A whole day of hacking

Phew... I need to stop working on Syndirella for today, or the change list will get totally out of hand. :-)

So, the news for today are:

  • Toolbar in the main window, with buttons for the most common actions.

  • The keyboard shortcuts are now the way I originally wanted them to be. Space moves to the next unread item, Backspace goes back, Alt-Ins inserts a Web feed.

  • Collapsible splitters. Now it is possible to hide the feed list and item list, and these lists are hidden automatically when you jump to an external location from the news item text.

  • HTTP requests produced by Syndirella now have a correct User-Agent.

  • The preview list has been moved from the "Add Web feed" dialog to a separate dialog, to reduce clutter.

  • It is now possible to extract item dates from Web feeds. The feature is still incomplete: for example, if the dates use text names of months, only English names will be understood. In the future, it will be possible to select the language for date parsing. Also I'm planning to add support for sites which do not specify the full date and time for each item, but instead have a sequence of day sections and specify only the time for individual items.

  • Feed Properties dialog. For RSS feeds, this allows to rename the feed after it was created. It is also possible to see the feed description and to e-mail the feed editor (if the e-mail address is specified in the feed). For Web feeds, all feed settings except for the page URL can be edited. If you want to change the URL of an RSS or Web feed, delete the feed and create a new one with the changed location.

  • Syndirella now remembers which feed you had selected after you exit it and start it again.

  • Local links correction. If a feed contains relative hyperlinks or links to images, Syndirella now transforms them to absolute links, so that they will be processed correctly when displayed in the aggregator window.

  • The title of the Syndirella window now shows the name of the current feed or the title of an external page currently being viewed.

  • "Update current feed" (Ctrl-F5) now ignores the remembered ETag value and always retrieves the document from the server.

  • Assorted fixes and improvements in the UI and RSS parsing code.

The new build can be downloaded here.

Posted by yole at 11:04 PM | Comments (0)

December 15, 2002


The new build can be downloaded here.

Now that the RSS reader has reached a usable state, I have turned my attention to the Web scraping functionality. The most important new feature is support for HTML encodings. Syndirella tries to determine the encoding of a Web page by looking at the Content-Encoding HTTP header, and, failing that, at the directive inside the page.

Besides that, Syndirella now has an almost complete RSS autodiscovery implementation (including the search of and several usability enhancements and bug fixes. One feature worth highlighting is that you can now jump between unread items in all feeds by pressing the F2 key or selecting "View / Next unread item" from the menu.

Posted by yole at 10:22 AM | Comments (0)

December 13, 2002

Another piece of the puzzle the XML-RPC implementation for .NET by Charles Cook. My current goal is to be able to discover automatically the feeds for all sites which I regularly read (and which do have feeds). And neither nor Joel on Software have feeds which can be discovered by links. So I need to fall back to the last option in Mark Pilgrim's autodiscovery scenario - search And this requires XML-RPC.

Posted by yole at 12:36 AM | Comments (0)

December 12, 2002

More progress

Another minor improvement for quite a lot of effort: I'm now able to use the fourth button of my mouse to go back through the links and then to the news item containing the original link. I don't know why the WebBrowser control doesn't handle the fourth button by default and doesn't provide any standard event handler to let me handle it by myself. Thus, to intercept the message, I needed to subclass the WebBrowser window and handle the WM_APPCOMMAND message there.

It is, by the way, surprisingly easy to subclass a window in WinForms. Just create a subclass of NativeWindow, override WndProc in it and call AssignHandle with the handle to existing browser window. (Another trick learned from the SortedListView source.)

Posted by yole at 04:21 PM | Comments (31)

Syndirella Progress

I was pleasantly surprised by the quantity and quality of .NET resources available on The most pleasant surprise was, of course, the control that solved one of the most annoying listview problems I was having - flickering of the entire ListView when a single news item became read. So, with a lot of thanks to Carlos H. Perez, I'm now using his control in my project.

(Of course, the solution didn't work out of the box - his control didn't support the UseItemStyleForSubItems property allowing to use the same font for all subitems of a list view item. However, the full source code being available, it took just about 10 lines of code to add the support).

Another control demonstrates the solution to another problem - making the last ListView column fill the entire width of the list. However, the exact implementation proposed looks suboptimal, and I have to see whether I could do better than that.

Posted by yole at 01:06 PM | Comments (21)

December 09, 2002


The main new feature of the latest Syndirella build is the "Add RSS feed" dialog, with the possibility to discover RSS feeds automatically and with proper checking. The RSS autodiscovery code is again based on Aggie. Later I plan to implement a full range of the RSS discovery methods supported by Mark Pilgrim's ultra-liberal RSS locator.

Besides that, Syndirella now supports ETags for reducing the HTTP bandwidth usage and contains some other fixes. I did find a workaround for the problem with # characters in links: doing a "Refresh" command programmatically seems to do the trick.

The build can be downloaded here.

Posted by yole at 10:29 AM | Comments (23)


This site now has a proper RSS 2.0 feed, of course, perfeclty readable by Syndirella. Thanks to Mark Pilgrim for the template.

Posted by yole at 12:08 AM | Comments (0)

December 08, 2002

Outlook 11

Outlook 11 (via

The innovations in the UI look very interesting indeed. I'm currently using The Bat!, which is an excellent mail client with a lot of features for power users (although with no support for HTML email editing). The main thing I hate about the current Outlook versions is the way it does quoting when replying to emails. I have a long-time FidoNet background, and I'm used to quoting with proper initials of the person you're replying to, word wrapping and replying. The Bat! gets this perfectly right. Outlook fails miserably - it can be made to stick a ">" character before each line of the message you're replying to, but no more than that. And I wasn't able to find a single add-in to implement proper quoting in Outlook.

However, Outlook 11 does implement a feature that I have long wanted to see, and that is not present in The Bat! - namely, search folders. The possibility to see the same message in multiple folders (selected by project, followup status and so on) will make it much easier to organize emails properly, especially in the cases when one email contains parts of threads related to different projects.

The way Outlook displays messages is also quite nice, although I have yet to see how it will scale to reading several large-traffic mailing lists in the same time.

Posted by yole at 11:33 PM | Comments (1)

December 06, 2002

Initial Syndirella feedback

Some notes from the review of Syndirella by a friend of mine:

  • It turns out that Microsoft.mshtml.dll required by Syndirella is not included in the .NET Framework redistributable. Since it's a 7M DLL, adding it to Syndirella causes quite a lot of bloat. I'll need either to generate it dynamically from the type library of mshtml.dll or build a stripped-down version containing only the interfaces that I use.

  • Feed URLs require the http:// prefix. Should not be needed.

  • Web scraping assumes that the site uses the UTF-8 codepage. Proper codepage processing is required.

  • Feed names in the feed list do not fill the entire list width.

  • Looks like the "(updating)" indicator in the feed list is never removed after the update is done.

Posted by yole at 01:00 PM | Comments (0)

New build

The big news for the today's build is the possibility to export the current feed list to OPML. Now I can avoid losing my subscription information every time I add a field to some class and the serialization version changes. (Of course, by release time, the versioning problem will have a proper solution - you won't lose your blogroll on every upgrade.)

Besides that, I've fixed the RSS parser broken by the previous build, removing feeds from subscription works properly now, the feed list has a popup menu with an assortment of keyboard shortcuts, and a new menu item to view the RSS source has been added. The problem with # characters in links is still there.

Posted by yole at 09:50 AM | Comments (0)

Looks like I'm having a steady supply of stupid problems - at least one per day comes up. This time, the hosted WebBrowser won't react to clicking on hyperlinks containing the hash character (#) in the URL - unless you right-click it and select Refresh from the popup menu, that is.

I understand that hosting a WebBrowser in a WinForms application is not the most common thing folks do, but still - problems like that do not look like inherent complexity.

Posted by yole at 12:51 AM | Comments (0)

December 05, 2002

And the latest build is...

here (115K .ZIP).

Posted by yole at 10:52 AM | Comments (0)

New Syndirella features

Features implemented this evening:

  • Main menu. Features currently accessible from buttons in the main window will be moved there. (A toolbar for common operations will probably be created later.)
  • Basic support for OPML import (tested only with Radio and Aggie for now). Both Radio and Amphetadesk formats should be supported.
  • Menu item to open the home page of a feed in a new window.
  • Menu item to mark all the news items in the current feed as read.
  • Menu item to remove the subscription to a feed.
  • Fixed an RSS parsing problem where the title of the <textinput> element was shown as the title of the feed itself.
  • Links of RSS items are now shown in the HTML view below the description/content part.

To give credit where credit is due: The OPML import code is based on the code from Aggie by Joe Gregorio, which also contains a fine description of differences between the Radio and Amphetadesk varieties of OPML.

Posted by yole at 12:49 AM | Comments (0)

Silly me...

Just spent more than half an hour trying to figure out why, oh, why Syndirella doesn't load correctly feeds imported from OPML files. I almost decided to implement all the serialization code manually, but stopped because I didn't really want to figure out how to serialize arrays containing objects of different types.

As usual, the problem turned out to be completely trivial. When importing the OPML file, I changed to a different directory, and syndirella.dat got saved in that directory. Obviously, when Syndirella was next started, it loaded its settings from the current directory.

So, from now on, Syndirella will store its data file in a fixed location under the user's profile directory, and hopefully such problems will never arise. :-)

Posted by yole at 12:19 AM | Comments (0)

December 04, 2002

Build 20021204

The latest version of Syndirella can be downloaded here. This morning, I've been working on various UI cleanups and fixes, so the UI should now be consistent and show what it should. :-)

The project was started last Friday, and since that time, I've implemented support for RSS reading and an initial implementation of Web page scraping. All RSS versions should be supported, from 0.91 to 2.0, but I didn't do much compatibility testing on feeds generated by different programs. The UI is still very much in prototype stage and is going to change.

Posted by yole at 10:30 AM | Comments (26)

Introducing Syndirella

The main reason why this weblog was created is to track the development of my latest project, Syndirella.

Syndirella is going to become a desktop information aggregator for Windows, running under the .NET Framework. Initially, it will be a rather traditional-looking desktop news aggregator, mostly resembling FeedReader or NewzCrawler. Its distinguishing feature will be support for Web page scraping, meaning that you will be able to configure a set of expressions to extract news items from any regular Web page that does not have an RSS feed. It is also likely that Syndirella will allow to export the results of scraping to a regular RSS 2.0 feed.

I'm also striving to support all the latest trends in blogging community - RSS autodiscovery, support for importing/exporting subscription lists as OPML, support for browsing blog archives and so on.

The ideas for later versions of Syndirella are more ambitious. First, it should support a much wider array of information sources (feeds). Obvious candidates are NNTP newsgroups, POP3 and IMAP mailboxes. However, things like bug-tracking databases can also be quite conveniently monitored with Syndirella.

Keeping track of such a large information flow will also require advanced information management features. The features I'm currently thinking of implementing are full-text search, filtering and threading. Threading means the ability to effiiently track conversations in the part of the blogosphere that you are monitoring. Essentially, when the author of a blog you're reading links to a post in another blog you're reading, Syndirella should be able to tie these posts together, showing them in a thread like it's commonly done in mail or news readers.

I should immediately warn of a common problem of mine: I'm always very eager to try out ideas and start new projects, and just as eager to drop them (permanently or temporarily) and move on to other things. So far, the development of Syndirella has been proceeding pretty rapidly, and the scope of the initial version is not too big, so I at least hope to bring it to a successful 1.0 release. But no guarantees are given.

Syndirella is free to use for everyone and released with full source code. For now, the license is "look but don't touch" - if you want to do anything with the code, you should contact me by e-mail and ask for a permission. When it gets closer to version 1.0, I'll settle either on GPL or on a BSDish license.

Syndirella is written in C# and tries to use the relevant features of .NET Framework as much as possible. It already makes use of Windows Forms, serialization, asynchronous HTTP support, the XML parser and the regular expression library.

Posted by yole at 12:47 AM | Comments (0)