Database: MySQL. I prefer using the InnoDB storage engine, but we can also use MyISAM. We will not use foreign keys in the database. We should build the database tables to be able to handle many users, such as hundreds of millions of users.
Frameworks: Not sure yet, but maybe we will use the PHP Yii framework, and Javascript jQuery.
This project is a social network website, an alternative to Facebook. Registration will be open to any person without limitation (all ages from 0 to 2000 will be accepted). People will be able to connect to their family relatives and friends, send messages, create pages, groups and causes, write on the walls of their friends and relatives (pages, groups and causes will have a wall too), create photo albums and share with their friends, like pages or join groups and causes, tag photos, and each time a user likes a page or joins a group or cause or adds new photos or tags a photo, a message/notification will be sent to the friends and relatives involved. People will also be able to create pages for pets, such as dogs and cats.
When a person will register or create a page, the first thing the website will ask is to upload pictures. If a user didn't upload a picture to his profile, this message will show every time he logs into the website. Every person will have a username and a URL such as www.speedy.net/urievenchen (his username), also subcategories such as www.speedy.net/urievenchen/wall , www.speedy.net/urievenchen/info , www.speedy.net/urievenchen/photos , www.speedy.net/urievenchen/friends , www.speedy.net/urievenchen/pages etc. A page (groups and causes and pets will be sort of pages) created by user urievenchen will either be located at www.speedy.net/urievenchen/pagename , or www.speedy.net/pagename - whatever the user prefers. Users will have a limit of up to 10 pages (or groups etc.) under www.speedy.net/pagename , and unlimited pages under www.speedy.net/urievenchen/pagename . photo albums will be uploaded to www.speedy.net/urievenchen/albumname . In the future we will let users upload videos and music, provided that it is legal to share these files with their friends.
The limit on the number of friends and relatives will be 800. If people will have 800 friends, they will not be able to add new friends, unless they remove friends.
In the future we may provide web mail. The user's email address will be username@speedy.net , for example urievenchen@speedy.net . The web mail should have most features of Gmail, such as unlimited labels, search etc.
Character encoding for the whole website and database will be unicode (UTF-8). Language will be English, but project will be built to support more languages in the future, including right-to-left languages such as Hebrew and Arabic. And of course French, Spanish, Portugese, Italian, German, Chinese and Japanese.
When registering a new person, the user will have to enter First Name, Last Name, Email, Password, Sex / Gender, Date of birth and select a new username (default username will be first name + last name). Usernames with dots, dashes and underlines (".","-","_") will ignore the dots, dashes and underlines (uri.even.chen will be same as urievenchen). Password will not be saved, only md5 hash of it to prevent cracking. If a user forgets his password, a new password will be generated (after a user confirm by email).
Login will be with username or email, and password. Usernames will be alphanumeric, always starting with a letter (not a digit). The username should be between 6-20 characters. Usernames should always be lowercase. Uppercase usernames will be converted to lowercase. URLs will be lowercase too, all uppercase letters will be converted to lowercase. Usernames must contain at least 4 letters , and if they contain numbers - the numbers must be after the letters. After the numbers there should not be any letter. For example come2us will not be a valid username. star2000 will be a valid username. A user will not be able to change usernames of his user of pages. In the future we might allow changing it once (or once a year).
Email addresses will also be lowercase. Passwords will be case sensitive. Passwords should also be between 6-20 characters. Any character will be accepted.
I want to use Javascript and maybe AJAX, similar to what they are doing on facebook. Also, when people create albums and upload pictures, we should use Javascript and have a good user interface for uploading pictures. We should also have features such as tagging pictures, rotating them, sharing pictures with friends, comments on pictures, liking pictures etc.
People will be able to edit their profile, very similar to profiles on facebook. With work, education, interests, movies, music, books etc. We should create pages for schools, companies, books, music, movies etc. And either let people edit these pages, or maybe take some information from Wikipedia.
Every user will have a username, and also pages, groups and causes will optionally have a username. A single user will be able to create up to 10 usernames (including pages etc.). We will limit the number of usernames up to 5 per person, for people registered less than a year. Only after a year they will be able to create up to 10 usernames.
When users create an account, a confirmation message will be sent to their email, asking them to click on a link. Only after they click on the link, their account will be activated. Otherwise the account will not be created.
Users will be able to add a security question and answer, used if their account is compromised or if they need to set a new password.
All PHP pages should be created as index.php in directories, for example www.speedy.net/friends and not www.speedy.net/friends.php . We will always prefer short URLs so users will be able to remember them.
The user's profile URL will be public by default, and at least the name and picture will always be public. I think maybe everything will be public - the user's albums, pages, likes, music, books, movies and interests should all be public. Each user will get a URL, such as www.speedy.net/urievenchen , which he will be able to share with his friends. This URL should appear on the search results of search engines such as Google, when searching for the person's name.
People will be able to set the default homepage language (default will be English), and additional languages. For example, www.speedy.net/urievenchen/hebrew will be the user's homepage in Hebrew, and www.speedy.net/urievenchen/english will be the homepage in English. The user's name will be saved in the database with it's language, so a user will be able to set different spellings in different languages.
Some words will be reserved, so users will not be able to select them as usernames. For example, all languages (such as english), root, webmaster etc. We will reserve the right to decide that a specific username is invalid, in this case we will set the username to the user's email address (without dots and @) and let him choose a new username. We should build a management system to manage users. All our communication by email with users will be from email addresses at the domain speedy.net (we will use our username at speedy.net). We will reserve all usernames on this domain to let people use their username at speedy.net as their email addresses in the future.
The website should be tested and work with the most popular browsers - Internet Explorer, Google Chrome and Firefox. We will not spend time to check more browsers, at least in the alpha version - to speed development time. It's possible later that we find time to make the website compatible for all browsers.
All words in the URL will be stripped from dots, dashes and underlines, so www.speedy.net/uri_even_chen and www.speedy.net/uri.even.chen and www.speedy.net/uri-even-chen will all be the same. We will try not to use "?=" notation but use the "/" notation instead. More slashes will not change anything, and a backslash should be treated as a regular slash. For example www.speedy.net\urievenchen and www.speedy.net///urievenchen/// will all work.
A user will be able to set aliases, for example if my name in spanish is Uri Even-Jen, then I will be able to select urievenjen as an additional username, which will be identical to urievenchen and its default language can be spanish. The limit of up to 5 or 10 usernames per person will remain here.
I noticed that on Linked In there is no need to write the email and password twice when joining the network. I think we don't need to force the user to write them twice. Email addresses will be validated, and if a user forgets his password, he will receive an email letting him select a new password.
Variable names and database table names and field names and cookie names will all be lowercase, only alphanumeric (starting with a letter) without underlines. For example "username" and not "userName" or "UserName". "password" and not "PassWord" etc. The username and md5 of the password will be saved in a cookie (not the password itself).
All the code we write should be documented, using // (for one line) or /* */ (for multiple line) comments. For example of a well documented code, see my Chess Queens project .
I prefer groups in the style of facebook. Groups, causes and pages will be almost identical - people will be able to open discussions, upload photos and write on the wall etc. Groups and causes people will *join*, pages people will *like*. this will be almost the only difference between groups, causes and pages. maybe there will be minor differences too, but the main idea is the same.
I don't think we will run each component on a separate server. I prefer all the database and website to be on the same server.
We might want to limit the number of messages sent by each user, to prevent spam. I think we can limit contact to non-friends to messages or friend requests to up to 50 people per day (not including replying to messages). Messages to friends should not be limited, unless this feature is abused.
Although facebook is a very good website and hard to compete with, I still think there is room for competition. Facebook is a monopoly, and I think it's better to have more than one company in social networking. Currently Google controls search, facebook controls social networking and Microsoft controls operating systems and office software. I think there is always room for more companies. This is not an exercise in programming, I really want to create a new social network. I think the domain speedy.net is a good domain name, and if the network succeeds I also want to create web mail and other online services, such as automatic music composition, an online payment system (such as PayPal) and more. They will all be created using the Speedy keyword. so it is not an exercise in programming, but we will gain experience from working on this website.
We should have more features and a better user interface. we should be better. one of the reasons I want people to use our website is because we will allow creating short URLs, for example www.speedy.net/pagename and not the long URLs created by facebook. we should make an intuitive user interface for creating a page, group or cause; uploading photo albums to pages or groups or causes and sending messages to friends. people will want to reserve usernames and for this reason they will register to speedy.net . we don't want all the good usernames to be taken, we should reserve usernames for future users. I think reserving a username can be one of the main reasons to join while the website is young. I really don't understand how facebook succeeds when most of the users and pages don't have usernames at all.
Another feature I want to implement is creating public user pages, for example if you enter a person's page such as www.speedy.net/urievenchen , you will see all the public information about this person. I checked facebook and when you enter www.facebook.com/urievenchen (my facebook page), if you're not logged in, you see a very ugly page with no information. I want to enable all the user information on the public page, such as albums, pages and wall, music and interests. only private information (such as the list of friends) should not be public. users will be able to select what's private and what's public, but I think most users don't change the default settings. I think the default settings should be: wall will be public. photo albums will be public. list of relatives will be public. email address will be public. List of relatives will be public. Date of birth will be private or visible only to friends (according to user's selection). List of friends will be visible only to friends, not public. I hate it when facebook makes my list of friends public.
There will be an option to make any of the above private. However, this will not be recommended by us. Maybe during the alpha version we will not allow it at all - everything will be public (except date of birth and the list of friends).
We might want to store the pictures (photo albums) on another server, it's possible there will be millions of pictures with lots of disk space (maybe even hundreds of millions or billions). I noticed facebook store the pictures on a different domain . But the main website: I want everything to work from the main domain, www.speedy.net . It should work also without the www, but will redirect users to the www domain (any sub domain name should redirect to www.speedy.net, for example 1.speedy.net). Users should not see a URL which is not www.speedy.net, this is confusing. But images on the page can be stored on a different domain (such as photos.speedy.net ). Also videos can be stored on videos.speedy.net .
I'm not sure if it's good to let users upload videos - they take a lot of disk space, and it might be expensive. I'm also not sure how important it is to the users. We should start with everything else and implement videos only after everything else is working (including messages, chat, pages, groups, causes and likes). Lets start with limiting users to upload up to 10 video files. They will have to remove files if they want to upload more files. We should also limit the file size and length of a video. I don't know what limit to set.
Privacy is important, we should deal with privacy and let users protect their privacy. A wall is public, it should not be treated as private. You can send private messages instead. I think we will need a wall for each user, page and group (or cause). The wall will be public. I don't think a wall should be private. But we should allow some privacy, for example we should let users set privacy for each album and video - friends only or public (two options). I don't like the "friends of friends" option on facebook. Also date of birth, contact details (such as phone, email, skype) - they will be visible to friends only or public (default should be private). Interests, music, books, movies and likes - default will be public. groups and causes - public.
Another thing I want our website to be better than facebook: our website will be open for everyone. No age limit, no policy of disabling accounts of convicted people or for any other reason. We will do our best not to disable accounts of users. The site should be open to everyone, but we should allow users to block other users or report other users or pages.
Our database should be backed up at least once a day, and backup will be sent to an external server. At least the list of users and pages (and groups and causes) should be backed up.
I hope we will be able to upload an alpha version within 3 months. A beta version we will upload only when most of the features are working, after testing the alpha version for at least a few months.
Best Regards,
Uri Even-Chen
Mobile Phone: +972-50-9007559
E-mail: uri@speedy.net
Website: http://www.speedy.net/
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi,
Here are the System Requirements Specification for Speedy Net.
This website will operate on http://www.speedy.net/ .
Programming language: PHP & Javascript.
Database: MySQL. I prefer using the InnoDB storage engine, but we can also use MyISAM. We will not use foreign keys in the database. We should build the database tables to be able to handle many users, such as hundreds of millions of users.
Frameworks: Not sure yet, but maybe we will use the PHP Yii framework, and Javascript jQuery.
This project is a social network website, an alternative to Facebook. Registration will be open to any person without limitation (all ages from 0 to 2000 will be accepted). People will be able to connect to their family relatives and friends, send messages, create pages, groups and causes, write on the walls of their friends and relatives (pages, groups and causes will have a wall too), create photo albums and share with their friends, like pages or join groups and causes, tag photos, and each time a user likes a page or joins a group or cause or adds new photos or tags a photo, a message/notification will be sent to the friends and relatives involved. People will also be able to create pages for pets, such as dogs and cats.
When a person will register or create a page, the first thing the website will ask is to upload pictures. If a user didn't upload a picture to his profile, this message will show every time he logs into the website. Every person will have a username and a URL such as www.speedy.net/urievenchen (his username), also subcategories such as www.speedy.net/urievenchen/wall , www.speedy.net/urievenchen/info , www.speedy.net/urievenchen/photos , www.speedy.net/urievenchen/friends , www.speedy.net/urievenchen/pages etc. A page (groups and causes and pets will be sort of pages) created by user urievenchen will either be located at www.speedy.net/urievenchen/pagename , or www.speedy.net/pagename - whatever the user prefers. Users will have a limit of up to 10 pages (or groups etc.) under www.speedy.net/pagename , and unlimited pages under www.speedy.net/urievenchen/pagename . photo albums will be uploaded to www.speedy.net/urievenchen/albumname . In the future we will let users upload videos and music, provided that it is legal to share these files with their friends.
The limit on the number of friends and relatives will be 800. If people will have 800 friends, they will not be able to add new friends, unless they remove friends.
In the future we may provide web mail. The user's email address will be username@speedy.net , for example urievenchen@speedy.net . The web mail should have most features of Gmail, such as unlimited labels, search etc.
Character encoding for the whole website and database will be unicode (UTF-8). Language will be English, but project will be built to support more languages in the future, including right-to-left languages such as Hebrew and Arabic. And of course French, Spanish, Portugese, Italian, German, Chinese and Japanese.
When registering a new person, the user will have to enter First Name, Last Name, Email, Password, Sex / Gender, Date of birth and select a new username (default username will be first name + last name). Usernames with dots, dashes and underlines (".","-","_") will ignore the dots, dashes and underlines (uri.even.chen will be same as urievenchen). Password will not be saved, only md5 hash of it to prevent cracking. If a user forgets his password, a new password will be generated (after a user confirm by email).
Login will be with username or email, and password. Usernames will be alphanumeric, always starting with a letter (not a digit). The username should be between 6-20 characters. Usernames should always be lowercase. Uppercase usernames will be converted to lowercase. URLs will be lowercase too, all uppercase letters will be converted to lowercase. Usernames must contain at least 4 letters , and if they contain numbers - the numbers must be after the letters. After the numbers there should not be any letter. For example come2us will not be a valid username. star2000 will be a valid username. A user will not be able to change usernames of his user of pages. In the future we might allow changing it once (or once a year).
Email addresses will also be lowercase. Passwords will be case sensitive. Passwords should also be between 6-20 characters. Any character will be accepted.
I want to use Javascript and maybe AJAX, similar to what they are doing on facebook. Also, when people create albums and upload pictures, we should use Javascript and have a good user interface for uploading pictures. We should also have features such as tagging pictures, rotating them, sharing pictures with friends, comments on pictures, liking pictures etc.
People will be able to edit their profile, very similar to profiles on facebook. With work, education, interests, movies, music, books etc. We should create pages for schools, companies, books, music, movies etc. And either let people edit these pages, or maybe take some information from Wikipedia.
Every user will have a username, and also pages, groups and causes will optionally have a username. A single user will be able to create up to 10 usernames (including pages etc.). We will limit the number of usernames up to 5 per person, for people registered less than a year. Only after a year they will be able to create up to 10 usernames.
When users create an account, a confirmation message will be sent to their email, asking them to click on a link. Only after they click on the link, their account will be activated. Otherwise the account will not be created.
Users will be able to add a security question and answer, used if their account is compromised or if they need to set a new password.
All PHP pages should be created as index.php in directories, for example www.speedy.net/friends and not www.speedy.net/friends.php . We will always prefer short URLs so users will be able to remember them.
The user's profile URL will be public by default, and at least the name and picture will always be public. I think maybe everything will be public - the user's albums, pages, likes, music, books, movies and interests should all be public. Each user will get a URL, such as www.speedy.net/urievenchen , which he will be able to share with his friends. This URL should appear on the search results of search engines such as Google, when searching for the person's name.
People will be able to set the default homepage language (default will be English), and additional languages. For example, www.speedy.net/urievenchen/hebrew will be the user's homepage in Hebrew, and www.speedy.net/urievenchen/english will be the homepage in English. The user's name will be saved in the database with it's language, so a user will be able to set different spellings in different languages.
Some words will be reserved, so users will not be able to select them as usernames. For example, all languages (such as english), root, webmaster etc. We will reserve the right to decide that a specific username is invalid, in this case we will set the username to the user's email address (without dots and @) and let him choose a new username. We should build a management system to manage users. All our communication by email with users will be from email addresses at the domain speedy.net (we will use our username at speedy.net). We will reserve all usernames on this domain to let people use their username at speedy.net as their email addresses in the future.
The website should be tested and work with the most popular browsers - Internet Explorer, Google Chrome and Firefox. We will not spend time to check more browsers, at least in the alpha version - to speed development time. It's possible later that we find time to make the website compatible for all browsers.
All words in the URL will be stripped from dots, dashes and underlines, so www.speedy.net/uri_even_chen and www.speedy.net/uri.even.chen and www.speedy.net/uri-even-chen will all be the same. We will try not to use "?=" notation but use the "/" notation instead. More slashes will not change anything, and a backslash should be treated as a regular slash. For example www.speedy.net\urievenchen and www.speedy.net///urievenchen/// will all work.
A user will be able to set aliases, for example if my name in spanish is Uri Even-Jen, then I will be able to select urievenjen as an additional username, which will be identical to urievenchen and its default language can be spanish. The limit of up to 5 or 10 usernames per person will remain here.
I noticed that on Linked In there is no need to write the email and password twice when joining the network. I think we don't need to force the user to write them twice. Email addresses will be validated, and if a user forgets his password, he will receive an email letting him select a new password.
Variable names and database table names and field names and cookie names will all be lowercase, only alphanumeric (starting with a letter) without underlines. For example "username" and not "userName" or "UserName". "password" and not "PassWord" etc. The username and md5 of the password will be saved in a cookie (not the password itself).
All the code we write should be documented, using // (for one line) or /* */ (for multiple line) comments. For example of a well documented code, see my Chess Queens project .
I prefer groups in the style of facebook. Groups, causes and pages will be almost identical - people will be able to open discussions, upload photos and write on the wall etc. Groups and causes people will *join*, pages people will *like*. this will be almost the only difference between groups, causes and pages. maybe there will be minor differences too, but the main idea is the same.
I don't think we will run each component on a separate server. I prefer all the database and website to be on the same server.
We might want to limit the number of messages sent by each user, to prevent spam. I think we can limit contact to non-friends to messages or friend requests to up to 50 people per day (not including replying to messages). Messages to friends should not be limited, unless this feature is abused.
Although facebook is a very good website and hard to compete with, I still think there is room for competition. Facebook is a monopoly, and I think it's better to have more than one company in social networking. Currently Google controls search, facebook controls social networking and Microsoft controls operating systems and office software. I think there is always room for more companies. This is not an exercise in programming, I really want to create a new social network. I think the domain speedy.net is a good domain name, and if the network succeeds I also want to create web mail and other online services, such as automatic music composition, an online payment system (such as PayPal) and more. They will all be created using the Speedy keyword. so it is not an exercise in programming, but we will gain experience from working on this website.
We should have more features and a better user interface. we should be better. one of the reasons I want people to use our website is because we will allow creating short URLs, for example www.speedy.net/pagename and not the long URLs created by facebook. we should make an intuitive user interface for creating a page, group or cause; uploading photo albums to pages or groups or causes and sending messages to friends. people will want to reserve usernames and for this reason they will register to speedy.net . we don't want all the good usernames to be taken, we should reserve usernames for future users. I think reserving a username can be one of the main reasons to join while the website is young. I really don't understand how facebook succeeds when most of the users and pages don't have usernames at all.
Another feature I want to implement is creating public user pages, for example if you enter a person's page such as www.speedy.net/urievenchen , you will see all the public information about this person. I checked facebook and when you enter www.facebook.com/urievenchen (my facebook page), if you're not logged in, you see a very ugly page with no information. I want to enable all the user information on the public page, such as albums, pages and wall, music and interests. only private information (such as the list of friends) should not be public. users will be able to select what's private and what's public, but I think most users don't change the default settings. I think the default settings should be: wall will be public. photo albums will be public. list of relatives will be public. email address will be public. List of relatives will be public. Date of birth will be private or visible only to friends (according to user's selection). List of friends will be visible only to friends, not public. I hate it when facebook makes my list of friends public.
There will be an option to make any of the above private. However, this will not be recommended by us. Maybe during the alpha version we will not allow it at all - everything will be public (except date of birth and the list of friends).
We might want to store the pictures (photo albums) on another server, it's possible there will be millions of pictures with lots of disk space (maybe even hundreds of millions or billions). I noticed facebook store the pictures on a different domain . But the main website: I want everything to work from the main domain, www.speedy.net . It should work also without the www, but will redirect users to the www domain (any sub domain name should redirect to www.speedy.net, for example 1.speedy.net). Users should not see a URL which is not www.speedy.net, this is confusing. But images on the page can be stored on a different domain (such as photos.speedy.net ). Also videos can be stored on videos.speedy.net .
I'm not sure if it's good to let users upload videos - they take a lot of disk space, and it might be expensive. I'm also not sure how important it is to the users. We should start with everything else and implement videos only after everything else is working (including messages, chat, pages, groups, causes and likes). Lets start with limiting users to upload up to 10 video files. They will have to remove files if they want to upload more files. We should also limit the file size and length of a video. I don't know what limit to set.
Privacy is important, we should deal with privacy and let users protect their privacy. A wall is public, it should not be treated as private. You can send private messages instead. I think we will need a wall for each user, page and group (or cause). The wall will be public. I don't think a wall should be private. But we should allow some privacy, for example we should let users set privacy for each album and video - friends only or public (two options). I don't like the "friends of friends" option on facebook. Also date of birth, contact details (such as phone, email, skype) - they will be visible to friends only or public (default should be private). Interests, music, books, movies and likes - default will be public. groups and causes - public.
Another thing I want our website to be better than facebook: our website will be open for everyone. No age limit, no policy of disabling accounts of convicted people or for any other reason. We will do our best not to disable accounts of users. The site should be open to everyone, but we should allow users to block other users or report other users or pages.
Our database should be backed up at least once a day, and backup will be sent to an external server. At least the list of users and pages (and groups and causes) should be backed up.
I hope we will be able to upload an alpha version within 3 months. A beta version we will upload only when most of the features are working, after testing the alpha version for at least a few months.
Best Regards,
Uri Even-Chen
Mobile Phone: +972-50-9007559
E-mail: uri@speedy.net
Website: http://www.speedy.net/