Compliment I think my pitch is well written, making Fritter seem like a new, innovative product. It has a clear purpose: to increase the user’s freedom of expression by providing them greater autonomy to choose exactly who gets to see their content, and exactly when they see other user’s content.
Criticism The chirper concept’s principle (concept efficacy) could be clearer by describing mutual friends and suggested friends as part of chirper, rather than being in parentheses. In addition (concept simplicity), the state does not need the detailed adjacency list since it constricts the concept too tightly, and the actions can be more general, rather than including the assertion statements and dependencies on the aforementioned adjacency list (addressed in modifications)
Criticism The group time concept’s states (concept efficacy) could include the groups, since it makes sense to track each group and the times associated with that group (addressed in modifications)
Speculation, Criticism It might make sense to remove the ordering from nests and make it a synchronization between nests, filter, and feed. This way, users are not restricted to ordering nests from 1-5, and can rather filter their feed from nest categories (addressed in modifications)
From Piero:
The user profile concept should include an action for editing a profile (addressed in modifications)
The chirper concept should be synchronized with the filter concept to filter through profiles (I believe Piero may have intended to say whether we could filter by nests to see different profiles (otherwise, this is just implementing a general search). I address this in my modifications by making an explicit sync between nest, filter, and chirper)
Create a sync between the user profile concept and user authentication concept to incorporate edit action (addressed in modifications)
From Pasit:
The chirper concept state/actions should be loosened to allow users who have no friends send friend requests (addressed in modifications)
The group time concept state should be loosened to allow users to set times between 9:00 PM to 2:00 AM, for example (addressed in modifications)
Allow users to order more than 5 nests (I partially address this by removing the order feature from my nests. Instead, I’ll create a sync between filter, nest, and feed, but believe there should still be a maximum of 5 nests to filter by, or else the feed page will get too crowded)
From Ophelia:
Concept names should be more general (i.e. chirper to friend, nest to circle) (not addressed: as Professor Jackson noted, it makes sense to keep both names)
Strengthen nest’s purpose to include private sharing (addressed in modifications)
Create a sync for user authentication and nests to clarify how users collaboratively add and remove users to a nest (I believe Ophelia did not understand the purpose of nests, since nests are private to a user, and other users cannot see what nests they are part of. I will not address this since it was already addressed in my sync rules)
Combine feed and post concept (I will not address this, since this is concept overloading and the feed and post concepts have two separate purposes, especially when synced)
In general, I think relaxing some of the constraints on my concepts would improve the strength of my design. I also believe adding some more sync rules to clarify the relationships between my concepts could help clarify the way my design works as a whole.
You. Unfiltered.
Social media is extremely public, forcing us to constantly curate when, where, and how we interact with posts. We’re pressured to please everyone – hyperfixating over the number of followers we have, the kind of interests we share, and the content we produce. Making us obsessed with our digital reputation and who’s viewing our posts, social media has stunted our ability to express ourselves freely.
Fritter breaks down these barriers. Fritter’s focus on friends, rather followers or friend/follower counts, promotes a platform where users uplift each other, creating a space to share posts that are more spontaneous and real. With nests, Fritter users can enjoy selective privacy, allowing them to choose which nests a post will be shared to, and which friends belong to which nests. In addition, nest times provide users with greater autonomy on the time of day they see a certain nest’s content.
Users will be able to maintain digital relationships across different social circles on the same platform, instead of creating multiple accounts or losing those digital relationships. More importantly, users will have greater control over their privacy, protecting their freedom of expression from not only friends, but also governments and groups aiming to restrict their freedom of thought and speech.
Fritter solves Twitter’s lack of privacy flexibility for users, Twitter’s inability to protect its users’ privacy and content from authoritarian governments, Twitter’s lack of user autonomy over the content they see, and Twitter’s secondary impacts on social and digital reputations.
Join Fritter and be unfiltered.
Be you.
concept: user authentication
purpose: verify the identity of a user
principle: if a user registers with a user name and password, then they can sign in with the same user name and password, and will be authenticated as the user who registered. If a user registers with a user name and password, and then signs in with the same username but a different password, they will not be authenticated.
states
username, password: Text
accounts = Map<username, password>()
authorize: Bool
actions
register (username: Text, password: Text)
if !accounts.has(username):
accounts.set(username, password)
signIn (username: Text, password: Text)
if accounts.has(username):
if accounts.get(username) == password:
authorize = true
else:
authorize = false
Adapted from Professor Jackson’s blog post
concept: user profile
purpose: provide information about the entity that created the social media account
principle: if a user clicks on their profile, they can see information about themselves. If a user clicks on another user’s profile, they can see that user’s information. If a user want’s to edit their profile, they can edit the information about themselves.
states
user: Me | Other
myProfile: Bool
editMyProfile = Bool
actions
display (user: Me | Other)
if user == Me:
myProfile = true
if user == Other:
myProfile = false
editProfile (user: Me | Other) //only I can edit my own profile
if user == Me:
editMyProfile = true
Adapted from Lecture 6 slides
concept: chirper (aka friend)
purpose: allow a user to view another user’s network
principle: if a user A is not friends with another user B, they can send a friend request. If user A is not friends with user B, user A can see mutual friends with user B, i.e. user A’s friends in their network are friends with user B. If user A becomes friends with user B, they can now see suggested friends, i.e. the friends user B has that user A is not friends with.
states
users: Adjacency List
user.mutuals(user): Set<User>()
user.suggested(user): Set<User>()
actions
display userA.mutual(userB) //whether two users are friends or not, they can see each other's mutual friends
userA.sendRequest(userB): //whether two users are friends or not, they can send friend requests
if userB.acceptRequest(userA): //if the user who received the friend request accepts it
display userA.suggested(userB) //now, user A can see all of user B's friends that they're not friends with and vice versa
if userA.removeFriend(userB) | userB.removeFriend(userA): //if either of the user's unfriend each other
remove userA.suggested(userB) //neither of their mutuals change, but user A can no longer see all of user B's friends that they're not friends with and vice versa
concept: chirp (aka post)
purpose: publish small media
principle: after a user creates a post, it’s associated with that user as author
states
content: Text
author: User
posts: Map<author, Set<content>>()
actions
createPost(author, content):
userPosts = posts.get(author)
userPosts.add(content)
posts.set(author, userPosts)
deletePost(author, content):
userPosts = posts.get(author)
userPosts.remove(content)
posts.set(author, userPosts)
editPost(author, oldContent, editedContent):
userPosts = posts.get(author)
userPosts.remove(oldContent)
userPosts.add(editedContent)
posts.set(author, userPosts)
Adapted from Lecture 5 slides
concept: nests (aka circles)
purpose: allow the user to group other users into one or more categories and privately share content to these categories
principle: if a user wants to create a group of users, she can create and name the nest, and then add the users to this nest.
states
nestName: Text
users: Set<User>()
nests: Map<nestName, users>()
actions
createNest(nestName):
nests.set(nestName, ())
addToNest(nestName, user):
nests.get(nestName).add(user)
removeFromNest(nestName, user):
nests.get(nestName).remove(user)
deleteNest(nestName):
nests.delete(nestName)
concept: group times
purpose: allow the user to select the time of day when the content of a group will be shown
principle: if a user wants to see a group’s content from 9:00 AM to 10:00 AM, they can click on the group and select the start time to be 9:00 AM and the end time to be 10:00 AM
states
groups: Map<groupName, [startTime, endTime]>
startTime: Time
endTime: Time
actions
groups.setTime(groupName, startTime, endTime):
concept: filter
purpose: find the match of an item within a larger collection of items
principle: if a user filters for item in a collection of items, the user will be returned all the items in the collection that match with the item.
states
item: Item
collection: Array<Items>[]
match: Bool
actions
filter(item, collection):
matches = []
for i in collection:
if match(i, item):
matches.push(i)
return matches
concept: feed
purpose: display posts for a user on a page
principle: if a user clicks on their feed, they can view a collection of posts
states
feed: Array<Post>[]
actions
display(feed)
app Fritter
includes User Authentication, User Profile, Chirp (Post), Chirper (Friend), Feed, Nest, Group Times, Filter
The user’s profile. The user is not able to see their total number of chirpers, and can manage their nests directly to their profile. The user is also able to view all the chirps they’ve made, and view and edit which nest that chirp is shared with. The user is able to see a filtered view of all their public chirps.
The profile of a user the user is not chirpers with. They can view that user’s public chirps, mutual chirpers, and the option to add the user as a chirper.
The profile of a user the user is chirpers with. They can view that user’s public chirps, and if they’re part of any of that user’s nests, they can view the chirps that user has made to that nest. They can also view mutual and suggested chirpers, the option to quick add or remove the user from any nests, and in the user’s tweets, see which nests they’re part of.
These are the user’s nests. They can create new nests, delete nests, and add nest times to a nest. For nest times, they can select from what time they want to be able to view content from users in a nest, and what time they want to stop seeing content from users in a nest. In addition, the user can click on the nest access the nest’s page.
This is the page for the user’s family nest. They can add chirpers to the nest, remove chirpers from the nest, and view what other nests chirpers in this nest are part of. If they click on a chirper, they are brought to that chirper’s profile.
This is the user’s home page. They can chirp and edit which nests they’re chirping to on the top, and view the chirps from all their nests or the chirps of a selected nest. In addition, within the other user’s chirps, the user can see which nests that user belongs to. By pressing the settings icon, the user can manage the nests viewable from their home page.
This is the user’s home page nest settings. They can reorder the nests viewable from their home page by dragging a nest to a slot. In addition, they can remove a nest from their home page by clicking the ‘X’. They can also add a nest to the home page by clicking the ‘+’ icon. Lastly, they can add up to five nests viewable from their home page.
If a user selects a nest on their home page during a time outside of the nest’s hours, they will receive this message. In addition, if they selected ‘All,’ they would not see any posts from users in this nest.
A social media platform has two ways to connect people: friends or followers. Fritter uses friends, rather than followers, as a way to ease the pressure of having a good follower/following ratio and in general, promote more real digital relationships between users, avoiding “influencers” and advertised content. Instead of following public figures, a user on Fritter can focus on building their friendships instead. However, users of Fritter will have to rely on their friends to populate their feed with content, rather than larger content creators who post every day.
In class we saw how friends/followers are usually used for limiting access to published posts. Rather than using this model, Fritter’s design delegates post access management to nests as a way to provide a user with more flexibility on who gets to see their content. Posts shared no longer are seen by all of a user’s friends; instead, a user can now categorize their friends and posts into nests. Although this additional privacy could allow a user to create spaces that are potentially exclusionary, more importantly, it allows the user to protect their privacy from malicious groups aiming to suppress it.
Normally, one can filter content on their feed, by categories. Fritter could either implement separate filterable categories for a user’s feed, or integrate nests with these categories. Fritter’s design ended up using the later to prevent a confusion between categories and nests (as we’ve seen with Google’s categories and labels). In addition, because a user is most likely adding users to nests based on interests (such as family, work, politics, etc.), they could continue this synergy into their feed.