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.