This is just a list of some concepts for the site that might be of interest to anyone making changes in the future:


*) Style
I was a little worried about the style of the site... especially the color choices.  I felt that the color choices were not quite right to project the proper image for a serious compiler project.

*) Menu...
the menu is on the left now, but I also had a design where the menu was across the top....  If the page eventually gets integrated with the style/layout of the rest of the llvm.org site and ends up adding a lot of LLVM menus, then it might be necessary to go back to the top menu or figure out some other unique way of handling the side menu.

*) Features page
The features page was inspired by the features tour of the BeOS website from years back.  However, it may be necessary (and better for the image of Clang) to actually tone down the statements made on the features page so that they do not sound so glossed over and promotional... instead maybe aim a little more for the compiler developer audience who is very technically minded, by making things a little more raw and technical (and being completely honest about strengths and weaknesses instead of over-hyping so many points like I, unfortunately, ended up doing).

*) Status page -- it just needs to be filled out... :) basically the idea was to updated every so often with the status of things and maybe make a little note of what changed as the bottom, along with the date.  [Maybe an update every LLVM release, which is every 3 months?]

*) Getting involved
The "available tasks" section is hidden at the bottom... after the long examples section.  I'm not sure how to better do things there, but just noting a possible issue.