+Project of the mini-blog serivice (tornado-based).
+
+1. All the blog entries and tapes are stored as plain html files and
+served via StaticFileHandler (or even frontend httpd such as nginx).
+
+2. Comments from any OpenID authenticatied user is allowed (unless this
+user or corresponding openid-provider is banned).
+
+Comments are stored within POST page.
+
+3. Post and editing is allowed for openid-authenticated blog owner. OpenID provider
+with support for email and avatar should be incorporated.
+
+4. There can be more than one blog on the same physical instance of
+application. Blogs can be distinguihed by URI prefix and hostname.
+All blogs on the same physical instance share cache of authenticated
+users, including their avatars.
+
+5. There should be support for rotatable tape of recent posts.
+
+6. Post could have multiple tags. Each tag has a page with list of
+recent (rotatable) posts with same tags. When post is edited and list of
+tags is changed, post is removed from the tapes which are no longer
+relevant
+
+7. There can be cuts in the post. Cut is implemented as block with
+display:none and javascript to hide/unhide.
+
+8. Comment submit form is included into post (and possbile tape) pages
+and open clicking "Reply" link using javascript.
+
+9. All templates (for post, comment etc) are pure html files where
+elements to be edited upon posting are marked with special classes.
+
+10. There should be an installer which genrates secret for tornado
+securie cookie and provides default configuration for apache and nginx
+frontends.
+
+11. There should be no client-server database. If there is
+persistent state which
+cannot be represented as publically available files (hmtl. images) on
+the filesystem (such as cached user session) they should be iplemented
+as persistent dictionary using shelve standard module.
+
+12. There should be commenter preferences URL, which would allow user to
+specify e-mail address and avatar.
+
+URL specification
+
+${prefix}/index.html - main tape of recent posts
+${prefix}/prevNNNN.html - rotated parts of recent posts tape
+${prefix}/tag/index.html list of tags.
+${prefix}/tag/tagname.html list of recent posts with given tag
+${prefix}/nnnn/nn/index.html list of posts, posted during year nnnn,
+month nn
+${prefix}/nnnn/nn/user-specified-name.html - individual post with
+discusson\
+${prefix}/avatars - cached user avatars
+${prefix}/login - login page handled by tornado.auth.OpenIDMixin
+${prefix}/post - page to create new post
+${prefix}/edit/nnnn/nn/user-specified-name.html - page to edit/delete existing post
+${prefix}/comment/nnnn/nnn/user-specified-name.html?id=comment-id - page
+to add comment
+${prefix}/ban?user=email - url to ban openid-user
+${prefix}/ban?site=hostname - url to ban entire openid provider.
+${prefix}/templates - static templates for all pages are stored.
+${prefix}/friend?add=identity-url - add an RSS feed from your friend
+blog to the friend tape
+${prefix}/friend?del=identity-url - remove RSS feed from friend tape
+Template classes and editing.
+${prefix}/user/identity-url - allows to specify identity avatar.
+
+Prefix is not contained into distributive templates. It is added there
+when new page created from the template
+
+Post information is stored into the following html elements
+
+1. title and h1.title - title of the post
+2. .date - date of the posting
+3. .tags .tag a - url and names of tag. If there is more than one tag
+block with class .tag is replicated neccessary number of times.
+4. .body (should be block element) - body of post
+5. img.authorpic - choosen author userpic if several are possible.
+
+post information in the tape (recent post, calendar and tag) page
+
+1. .posts .post h1.title or .posts .post h1 a.title title of the post
+ In second case href attribute is replaced by post url
+ .post .post a.postlink - href is replaced by post url
+2. .date - date
+ .posts .post a.date href replaced with link to the month directory
+3.
+4.
+5. -as above
+
+
+Comment information
+
+.comment block can have nested .comments list. IF so, comments which are
+responses to this commend are added to the comments list of this comment
+block.
+
+Otherwise if there is an element in the .comment block with class .level and directly
+specified width: style, or the .comment block itself has inline
+margin-left property, this style value would be multiplied accorde
+comment is inserted just before next comment of same level as parent.
+
+If neither criteria met, comment is insertied at the end of discussion.
+
+.comment a.parent@href set to the #id where id is value of id attribute
+of parent comment.
+
+.comment .author set to display name of author
+.comment a.author@href set to identity url of author
+.comment img.avatar@src set to the url of locally cached author's avatar
+.comment .text set to the text of comment
+.comment a.reply@href set to the link to the commenting URL
+.comment a.edit@href set to the link of comment editing/deleting URL.
+
+
+
+Friends tape - RSS aggregator based on cron job.