Welcome Fantasticolleague, Keith Thompson

"I tend to think of myself as a one-man wolf pack. But when my sister brought Doug home, I knew he was one of my own. And my wolf pack... it grew by one."

-- Alan Garner, The Hangover

The wolfpack just grew by one...

 

I would love to introduce a great new addition to Brilliant Fantastic, Keith Thompson.

With-gunnars

Keith is currently working on a Computer Science degree at the University of Toledo. While he is waiting to be challenged there, he is writing code in his spare time. He is very passionate about software and his craft and a lover of all things Python.

I really can't wait to start working with Keith. We share the passion. I know we will make great things down the road and pick up happy customers along the way. I only want to hire the best and brightest, and Keith definately fits the bill. Keep an eye out for some cool things coming soon.

Welcome Keith.

Announcing Seed ~ Toledo's First Coworking Community

Seed

Toledo, Ohio has a wealth of smart and creative people working within it's city. I know because I have been working and talking with a lot of them for several years. We wanted the ability to work together on a more regular basis and rid ourselves of having to do that within the confines of a coffee shop or a bakery.

Today, I am happy to announce that after two years of searching and hard work, the creative community of Toledo will have a place to work together. Today we are announcing Seed, Toledo's first coworking community.

Logo

I have been working with partners Gene Powell and Don Miller for the past year to create a coworking community space for Toledo. Our search has ended and work has begun on our downtown Toledo space in the St. Clair Village. It is scheduled to open in the Spring of this year.

If you are interested in joining the community, please sign up for our newsletter at http://seedcoworking.com and follow us on Twitter at @seedcowork. We will be sharing a lot of information and asking for the community's help and opinions. If you would like, please help us spread the word by sharing the link to the website or the Twitter profile.

Over the next few weeks we will be launching our Kickstarter campaign. We need some help for the furnishings and we would love to fund this through our community.

We are so excited for this opportunity for Toledo and it's creative community.

See you soon.

F.A.Q.

  • What is coworking?

Coworking is about a community of like-minded creative professionals who want a different kind of place to work. A place free of cubicles and bureaucracy. A place where you can go and get inspired with fellow members. You can find more information at http://wiki.coworking.info.

  • Is this just renting office space?

Seed is just a place where creative people work. It is not about the space. It is about the community. Yes, you have a membership but the value comes from the members within the space. Renting office space is just about the space.

  • How do I join?

Sign up for the newsletter here. We will be announcing those plans soon. If you want to get in early, you will also want to keep a look out for the Kickstarter campaign.

  • Who is behind this?

The founding members are three independent business owners from NW Ohio: Gene Powell (@gpowelldesign) of Spoke, Don Miller (@donmiller) of JADR Consulting, and myself (@jwright). All supporting members will have a vote and a voice for where Seed goes in the future.

  • When will this open?

We are opening in the Spring. An exact date will be announced once we get closer to finishing construction on the space. Join the newsletter to get a jump on that announcement.

  • How much will a membership cost?

We are still working on exact figures but we assure you that this will be very, very affordable. There will be multiple plans based on your needs and budget. Stay tuned for the announcement of the membership levels.

  • Is this only for full time members?

No. There will be different levels of membership so that they will fit your needs and budgets.

  • Is there parking available?

Yes. We realize that downtown parking can be a deterrent for some but we have some parking available already and we will be working on freeing some more up shortly.

  • What is Kickstarter?

Kickstarter is a platform that helps you fund projects that inspire you through micro-payments. We are in the process of creating our campaign and we will share this soon.

Launch: The Morale API (and a bonus)

We have been working hard and we can finally announce that the Morale API is baked and ready!

With the Morale API, you can interact with your account over a RESTful API. The API allows interactions with your accounts, projects, and of course, tickets.

Enabling the API

In order to start using the API or allow 3rd party applications to use your account data, you must enable your API key within your profile. This will enable API access to all your accounts under your profile's email address and you only need to do this once.

To enable your API, browse to your profile page and click on "Generate API key" and click "Update my profile".

Api_screenshot

Getting Started

The API documentation is now live at http://teammorale.com/docs/api. You can get a deeper dive into the API there.

All API calls, except for account resources, are in this format:

https://<subdomain>.teammorale.com/api/v1/

All calls use basic authentication with the username being your account subdomain and the password being your API key.

Please keep your API key closely guarded just like your password as it grants programatic access to your account. If your API key is compromised, you do have the ability to regenerate a new API key from your profile page.

Here is a list of actions you can perform using the API today. We will be adding to this in the future as we add additional features to Morale.

  • Retrieve your API key using your account email address and password
  • Retrieve a list of accounts that a particular email address has access to
  • Retrieve a list of projects for a particular account
  • Get the details of a particular project
  • Create a new project
  • Update an existing project
  • Delete a project
  • Retrieve a list of tickets for a particular project
  • Get the details for a particular ticket
  • Create, update, archive, and delete tickets just like you can within the command textbox from the web application

Have at it

We are excited to see what our customers create from this API. Mobile apps? Web apps? Client apps? Integration into existing apps? Please let us know what you are creating and we will place you front and center on our site for more exposure.

We are going to continue to work on enhancements to the API. Keep in touch on this blog to see when we launch new features.

One more thing...

Well we couldn't build this great API without building anything with it. We had a dream that because of the simplicity of Morale that we could interact with Morale from the command line. So, that is what we built. A command line interface into Morale.

To get started 

The Morale CLI is implemented as a Ruby Gem. You must have Ruby installed and this gem will work on any platform.

gem install morale

The gem source can be found at https://github.com/brilliantfantastic/morale-client

Have more fun

Now, with the Morale gem, you can use a lot of different commands from the command line interface.

You can find out what is available by using:

morale help

Here are some other things you can do:

  • morale login #=> will ask you for your email address, password, and account to use
  • morale accounts #=> will show a list of accounts you have available
  • morale projects #=> will show a list of projects available under your currently selected account
  • morale projects --change #=> will allow you to change your current project
  • morale tickets #=> will show your current active tickets for your current project
  • morale "..." #=> will create a ticket just like you can at the command line in the application*

* = The "#" sign is considered a comment character within the CLI. When you need to use that character, you can escape it with \# or put your command in quotes (e.g. morale "#6: Update the copy on the sign in page"

I hope you have fun and enjoy. We are always looking for feedback so please let us know if you have any questions or suggestions with an email to support AT teammorale DOT com.

How to create Moo MiniCard coupons with unique coupon codes

Final

 

I wanted to create some coupons for Morale so that I could pass them out at conferences and use them as business cards for the product. The coupons needed to contain the same site branding for Morale as that is important to me. More importantly, the coupons needed to be of high quality, as that is a very important aspect of the brand.

Enter moo.com.

Business-cards-with-photo-fullsize

A few years ago I created coupons for my clothing company Made from Dolly (it has since been taken down but will be back next year, with a vengence). I used Moo for the coupons back then but I had to ghetto-ize them. In order to create unique cards for each coupon code, I used a clear label and a label maker to add the coupon code to the card. This cheapened the card up a lot and I didn't want that look for the Morale coupons.

Photo

I noticed that Moo now allows for up to 100 unique designs in a single order. They call it Printfinity (http://www.youtube.com/watch?v=q5biwW_DJHk). You can get very creative with that. For this first pass of my Morale coupons, the change was just going to be subtle. A different coupon code and a different description for 100 different coupon codes.

 

I. Designing the Coupon

 

The first step of the process was to design the coupon in Photoshop. I wanted to design the front as the same for all the coupons and design the back with some random coupon codes and descriptions. I could then go back and replace the coupon code and description with Variables in Photoshop. More on that later.

The dimensions I used to design the coupon were as follows. You can find these dimensions at the moo site here.

Screen_shot_2011-10-05_at_5

These dimensions will give you a high definition version of the small coupon. It does not however, give you the "safe areas" such as the gutter. You need these so that you do not put design elements that matter within these the gutters.

In order to get these safe areas on your design, I downloaded the PSD template from moo.com and added this as a layer within my design. I set the opacity to 45% so that I could ensure that no design elements ran into the non-safe areas. You can then just hide this layer when you are ready to create the images for upload.

moo.com Template

Minicard_template_us

Template as a layer (with 45% opacity) in the coupon

Templatelayer_

Here is the final PSD version for the coupons.

Front

Screen_shot_2011-10-05_at_5
Back

Screen_shot_2011-10-05_at_5

 

PROTIP! Ensure that any data that needs to have data filled in (your coupon code text and the coupon description in this case) are within seperate layers respectively in your PSD file.

 

||. Creating the coupon codes

 

The next step is that we need to provide Photoshop with a list of available coupons as well as create those coupon codes in our payment processor (Chargify in this case). In order to do this I created a small Ruby CLI program. The code is ugly but I wrote it to provide a proof of concept. I plan on creating coupon gem that has the ability to plug into a number of different payment processors and create a number of different coupon schemes.

Basically, the code does the following:

  1. Randomly create a coupon code of X number of characters
  2. Randomly generate a % off from a single month of service
  3. Write the description and the code to a flat file for storage
  4. Create the coupon on the payment processor (Chargify in our case)
  5. Repeat for X number of times (100 in our case)

PROTIP! Remember to keep away from "confusing" characters so that users do not have to fight to figure out what the character is. I stayed away from zeros, o's, 1's, l's and i's.

 

|||. Generate coupon images

 

The next step is to loop through the coupon code file we generated above and plug in the coupon codes and the coupon descriptions to our PSD file. After we do that, we need to create a PNG image from the result.

Example of the data that PhotoShop needs

Screen_shot_2011-10-05_at_5

This was the most time consuming piece of the process. It took roughly 40 minutes to generate 100 unique images with unique coupon codes. The next time I do this, I will look into automating this portion.

In order to plug the codes and descriptions in, here are the steps that you have to follow:

  1. Ensure that your coupon code is in a seperate layer in your image
  2. Ensure that your coupon description is in a seperate layer in your image
  3. Go to the Image -> Variables -> Define
  4. Select the coupon code layer from the drop down
  5. Check the "Text Replacement" checkbox
  6. Put in the column name (in this case coupon_code) in the "Name" box under "Text Replacement"
  7. Select the coupon description layer from the drop down
  8. Check the "Text Replacement" checkbox
  9. Put in the column name (in this case description) in the "Name" box under "Text Replacement"

Example of what the Variable Define screen should look like

Screen_shot_2011-10-05_at_6

Now it is time to upload the actual data so that it replaces the layer text. Here are the steps to follow:

  1. Go to the Image -> Variables -> Data Sets
  2. Click the Import File...
  3. Click Select File....
  4. Browse to where the txt file is that you created from the program above
  5. Ensure "Use First Column for Data Set Names" is checked
  6. Click OK
  7. Click OK

Now the tedious part. You have to go through each data row from your file and apply that to your image. Here are the steps that I took:

  1. Go to Image -> Variables -> Data Sets
  2. Select the coupon code from the Data Set drop down
  3. Click Apply
  4. Click OK
  5. Export the Image as a jpg. (File -> Save for Web & Devices...)
  6. Go to Image -> Variables -> Data Sets
  7. Delete the Data Set by clicking on the trash can (This will not delete it from the source file)
  8. Repeat from step 1 until you have 100 seperate images in a folder

PROTIP! Put all your coupon code jpg files in the same directory for easy upload to moo.com.

I tried to create a PSD script or somehow automate the process above but I could not do it. If you are more efficent in PhotoShop and you can do this, please share.

 

IV. Create the order at moo.com

 

Since all of the output PNG images from the step above are in a single folder, you can upload them all at once to your new moo order.

 

Here is are the steps I took to create the moo.com order.

  1. Browse to http://us.moo.com/products/minicards.html
  2. Click Make MiniCards
  3. Click Upload my own file
  4. Click Upload my file(s)
  5. Select all the seperate images that contain unique coupon codes which you tediously created above.
  6. After they are all uploaded, click Next Step
  7. Review the safe areas
  8. Click Next Step
  9. Click Upload a Complete Design
  10. Click Upload a New File
  11. Select the front jpg image that will go on the front of all your coupons
  12. Review the safe area
  13. Click Next Step
  14. Check all the boxes and review
  15. Click Next Step
  16. Select the number of cards you want (You can select more then 100 if you want duplicate coupons)
  17. Click Add to Cart

 

V. Finished product

Img_2535

The finished product looked very good and it was very high quality in my opinion. The only issue, and it was completely my fault, is the font that I used was too small and I should of bumped it up a bit. It is still readable but too small.

 

I hope this helped out anyone looking to make some coupons for their product.

 

-------------------------------------------------------------------------------------------------------------------
Track what needs to be done with the simplicity of a sentence. Try Morale now. http://teammorale.com

 

Here's to the crazy ones.

Influencer

Today was a very sad day for me. And many others, I assume. Steve Jobs was a huge influence on me. He's an influence on how I run my business and how I create things. He helped shape how I live my life. He inspired me.

I just wanted to say thank you Steve. Even though you are gone from this world, you will continue to shape me through your legacy.

The Cost of Running a Product built on Open Source

Morale was built on top of open source software. That is, it was built on Linux servers using Ruby and Rails. It should of been free or close to free, right?

Here I document my costs for building and maintaining a software as a service application that was built on top of an open source platform.

Hosting Costs

Morale is hosted on Heroku. I fucking love Heroku. The Git interface into deployment and the command line tools has made me want to make a love child with this tool on more then one occasion.

While Heroku itself is free, there are a few add-ons that I use which I pay extra for. Here is what I use:

1 Worker Dyno - $35/mo.
Basic Release Management - FREE
Campfire Hook - FREE
Cron Daily - FREE
Custom Domains - FREE
Custom Domains + Wildcard - $5/mo
Expanded Logging - FREE
Hostname SSL - $20/mo
PG Backups Basic - FREE
Shared Database - FREE
StillAlive Basic - FREE

Monthly Cost - $60 (production)

Guess what you need though? You need both a staging and production environment. These are identical environments and so the cost is almost double for hosting. The only thing that is different with the staging environment is that I don't use SSL certificates on my staging environment so I save $20/mo. I could probably get away from using 1 Worker Dyno as I use that to process Delayed Job background tasks. Something that is not really necessary on staging all the time.

Monthly Cost - $40 (staging)

Speaking of SSL certificates, you need them on your production application if you have your customers send any sensitive data across the wire. Yes. Passwords are sensitive data. I needed a wildcard SSL certificate as Morale uses subdomains for accounts.

Yearly Cost - $100

Along with the SSL certificates, I used DNSimple to register the domain. Yes, GoDaddy is cheaper but the amount of anger it causes me when I use that site is worth the extra money in my opinion.

Monthly Cost - $3
Yearly Cost - $28 - ($14 * 2 domains (staging + production))

Morale uses Amazon S3 storage for the user profile thumbnails. This is a service that gets more expensive with the more data you use. This is extremely cheap for me right now as we don't save any files that are large in size. Our average monthly cost is something like $0.13. I told you it was cheap.

Monthly Cost - $0.15

Payment Processing

Morale is a software as a service where the users get automatically billed at the end of their monthly billing cycle. I didn't want to build this myself. I have used PayPal in the past which was reliable but I don't like their API and they are lacking in a few areas.

I checked out several services and settled on using Chargify for the monthly reoccuring billing and I use Authorize.Net as the payment processor and gateway. Chargify has a great API and it allows you to switch from different gateways without changing your API interaction.

Monthly Cost - $99 (Chargify)
Monthly Cost - $20 (Gateway Fee)
Monthly Cost - $20 (Authorize.Net CIM Fee)

Chargify is very much on the expensive side and a lot of the payment gateways have API access into their reoccuring billing systems now. I will likely switch Chargify & Authorize.NET for Braintree in the near future. This will save me $115/mo and I like Braintree's API and feature set. That is a lot of coke I could be doing.

Source Code Control 

I host my code on GitHub in a private repository and so that costs a little premium on GitHub. Well worth it.

Monthly Cost - $12

Support System

After looking around and checking out a number of support applications, I chose ZenDesk. I think the ease of use from a customer perspective is the best if your customers need to enter support tickets. I love the email integration as well. I could skip out on this and just build it myself. I may very well do that in the near future.

Monthly Cost - $29

Analytics Tracking

Ok. I know there is Google Analytics. And I know it is free. So why do I spend money on a service that does almost everything Google Analytics does? Simple. I dont enjoy enimas. The interface of Gauges is super simple and very fun to use. Watching the numbers and how people got to your site is like crack to me. It is also very important. It allows you to see if anyone has written anything about your application so you can comment on it, etc.

Monthly Cost - $6

Communication

I use Campaign Monitor to send out communication emails for anyone who has signed up for the newsletter through the site. I have mostly been using for beta user communication but I will be using it to promote new features and get user feedback in the near future.

Monthly Cost - $7

Another tool that I have been trying out is called Intercom. It is a very neat idea. Through some simple Javascript that you add to your application, you can communicate to your users through this application. It's like a CRM for the users of your application.

Monthly Cost - FREE (for Beta period)

Total Costs

Monthly Costs - $306.82

As you can see, it costs a lot to have a well run web applicaiton up and running. The current pricing of Morale means that I would need paying customers to cover that in order to break even.

Let's say that I use the breakdown of 80% of users will use the free plan, 10% will use the next tier ($9), 8% of users will use the next tier ($14), and 2% will use the top tiered plan ($24). I will need around 120 paying customers to break even. That will take a while, trust me.

Hopefully it's worth every penny.

-------------------------------------------------------------------------------------------------------------------
Track what needs to be done with the simplicity of a sentence. Try Morale now. http://teammorale.com

Morale has launched!

You are heads down writing code. Everything is flowing well.

Shit.

You found a bug. You found some code that needs to be refactored.

But you are in a zone. You don't want to fill out a huge form with the ticket details. You just want to get it out of your head so you remember it later. You pop over to your simple text editor to add your task and bug.

Wouldn't it be nice if that simple list of tasks and bugs were on the web?

Enter Morale.

Create tickets with the simplicity of a sentence

You can say a lot in a sentence. We are doing it everyday with Twitter and text messages. Morale can use natural language to create simple but powerful tickets for you to follow up on later.

Here are some examples:

"Refactor authorization in the SessionsController.New method priority: 6 assign: Timmy"

"bug: Email address is not remembered on a post back"

"bug: Date edits should not contain the time due: Monday"

"Query for order retrieval is way too slow priority: 1"

Share with your team

If you are working on a project with a team of people you can invite them to your project in Morale. No more posting emails back and forth or sending them an instant message to assign them a task or bug.

Team members can help capture tickets or stake holders can just view the list of what is left to do and what has been done. It's up to you.

Just enough

Morale is a single text box that allows you to enter your ticket. There are no forms to fill out. There is no need to move from your keyboard to your mouse or trackpad. It is designed to be fast and get out of your way so you can get back to coding.

There is a 30 day trial. No credit card required to sign up. Check out Morale so you can spend more time writing code and less time babysitting it.

CSLA: Declaring Properties

I have introduced CSLA and explained why I love it in this post. That was the first article explaining the how. In this article, we will add some properties to our class and explain what the "magic" is behind the CSLA code.

Review

So far we have 2 "blank" CSLA classes. One for our Blog and one for our Post. Let's take a look at our Blog class here.

Adding Functionality

The beautiful thing with CSLA is that it already has the plumbing necessary for business objects so we can jump right into our business objects and our business logic. For our Blog class, I think we are going to need the following things (I don't like saying "I think we need". I am a huge fan of BDD but for brevity sake,  I won't go through BDD here but I will talk about it when I talk about testing).

  1. Add a tagline property for the blog.
  2. Add a CreatedAt property which is a read only property for a date/time.
  3. An id property that represents the id from the database. This is obviously read only.

Let's start by adding the tagline property. Let's start by adding it just as you would in any other class.

Now, CSLA needs to know a little more information about this property. There are 2 additional things that CSLA needs to check when reading and writing properties. 

Whoa, that's a lot of typing. Let's see what is going on in this code. In the property getter, we check the authorization rules to see if the currently logged in user has access to read this property before we return it's value. In the property setter, we check the authorization rules to see if the user has access to write the property. We then check if the values are different, if they are are, we set the value and notify the object that the property has changed. This does several things. It first marks the object as dirty, then it checks the validation rules for that property, and it then fires off any databinding that it needs to do. All of these things are done within the PropertyHasChanged() method.

This is very maintainable either. Having the "magic string" of Tagline being passed into the CanReadProperty(), CanWriteProperty(), and PropertyHasChanged() methods is a maintenance nightmare when you have to change the name of the property.

Before CSLA 3, this is what you needed to do when you declared properties. Now, CSLA uses the "Windows Workflow" concept of registering properties with the classes in order for the object to be able to track the status of those properties throughout the lifetime of the object.

Registering Properties

In order for CSLA to know about a property and be able to track it's metadata you need to register that property with the object. You can do this with the RegisterProperty() method that is attached to the CSLA base classes.

This will create a PropertyInfo object that the CSLA object will use for validation, status tracking, and authorization. Now that we have registered the property with the object and we have the PropertyInfo object, we can call the necessary methods for getting and setting the properties. Our object with the PropertyInfo now looks like this.

So what does the GetProperty() and SetProperty() methods do? They perform all the operations that were required manually above. The GetProperty() method will see if the user has access and throw an exception if they do not. The SetProperty() will check user access and then check the values to see if they are different. If they are, it will change the value and mark the object as dirty by calling PropertyHasChanged().

Here is what the object now has for it's properties.

You can download the full project as to what we have so far here. This includes new objects for Author, Comment, and CommentCollection along with all of their properties.

We will look at how you create CSLA objects using the factory pattern next.

Morale : The Big Rewrite....Again

Logo

If you have been following Morale since the beginning, you will know that I have been working on some version of it for about 4 years and I haven't released it.

This is horrible.

Part of me thinks that it is because I am scared to release something I created that people may actually use. Maybe I am afraid of the criticism that will almost inevitably follow. Part of me thinks that it is because I enjoy having a side project and I don't want to ever screw that up by releasing it and supporting it.

A little history.

Morale was originally written in ASP.NET Web Forms with the ASP.NET javascript library engine. Boy am I glad I did not release this version. I was using way to much ajax and trying too hard to make the application "fancy" and experiment with Javascript that I lost track of the real reason I wanted and needed Morale.

The second version of Morale, which I started in June of 2009, rewrote the user interface layer in ASP.NET MVC. MVC was new and I wanted to start a project using it. I loved the framework and the architecture. I loved the idea of not hiding the real web with layers of abstraction to make it less web like. I also replaced the javascript library. Instead of using the ASP.NET javascript libraries, I started using jQuery.

I was almost done with it. I had a little more polish to add and button up some of the permissions logic and the billing logic but I was close. Probably a weeks worth of work to be done.

There were two problems.

I was not working on the application. It was taking me months to do an 8 hour feature. I was struggling finding the energy to work on it. I was finding it boring and tedious.  Was it because of the reasons mentioned above? I don't think it was. I think the problem was that I was sick of the tools and the tool set. Since ASP.NET MVC came out, I have worked on several large applications using it. I was doing it for 10 - 12 hours a day as it was. Additionally, I have been using .NET since it's inception. Ten years now. That is a long time to stay with a single platform and technology. It was becoming stale. Don't get me wrong, I still love and use .NET but I was becoming bored with it.

The second problem was more of a fundamental one. I was not using it. I was only using it to dogfood Morale. I was not using it on client projects. I was not pushing clients to use it. It was not solving the problems I originally wrote it for. Some of the killer features were afterthoughts and not well conceived.

Enter Ruby.

Oh god, here is another convert to Ruby story. Here I am to tell you how awesome Ruby is and how shitty .NET is. Well, I am only going to tell you how awesome Ruby is. I can't help it. I love it and it has changed not only how I develop in Ruby but also in .NET. I don't hate .NET at all. I still think it is a great language. I am just excited and refreshed for a new language and a new toolset.

I have been hacking around in Ruby for a while but I have never built a production application with it. I had an idea for an application which I started with another developer. We were going to write it and chronicle the whole process in a video podcast as well. That developer had triplets (yes, triplets) and I wanted to focus on Morale and getting that done before pursuing another project. So I thought, hell, why not rewrite Morale in Ruby. This would be a big undertaking as I would not have to rewrite all of the business logic and not just the interface layer like before when I switched to ASP.NET MVC.

I determined that was ok as I could concentrate on implementing the features I thought were most important. I can start from scratch and turn it into the product I always wanted it to be.

How has it been going?

Well, I got to say I am addicted. Every little chance I get I am hacking on this project. Ten minutes here, an hour there. I love using BDD and Cucumber. It is such bliss. I love Rails. I love gems. I am seriously in heaven.

I picked three of the most important features to release and I am going to release those (more of these later). My hope is to release it in time for Codemash. That's only 2 months of work. It took me 4 years to get here but it is going to be good. I can't wait to get it to a point where I can use it. I am just concentrating on the behavior right now with Cucumber. I have a designer in the wings waiting to implement my vision on the look and feel.

I am having fun again.

What do you think about activity streams?

I have been thinking a lot about activity streams lately. A lot of issue tracking / software management applications use them. I find some of them useful and I don't even notice others. I get some benefit from them but they usually do not tell me the whole story. It's kind of like getting cc'd in the middle of an email stream. You have to find your way through the mess and catch up. I want to eliminate that feeling with the work I am doing on Morale.

Here are some activity streams from other systems.

From Github:

Github_stream

From Unfuddle:

Unfuddle_stream
From Basecamp:

Basecamp_stream
From Lighthouse:

Lighthouse
From Sifter:

Sifter
From Splendid Bacon:

Splendid_bacon

I would love your comments on what you like and dislike about these. What do you find useful and what do you ignore? How do you like these organized? Any information you can provide here in the comments would be fantastic.

Thanks for your time.