Fritter Review and Refinement


Self Review

  • 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)


Review Summary

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.


Modifications

  • Incorporate in a clearer fashion the chirper concept’s suggested and mutual chirpers into its operational principle
  • Loosen the chirper concept’s state/action constraints
  • Loosen the group time concept’s state constraints, add a groups state
  • Create a synchronization between filter, nest, and feed to clarify filtering posts by nests on feed
  • Create an edit action for user profiles
  • Create a synchronization between filter, nest, user profile, and chirper to be able to filter profiles by nests
  • Create a synchronization between user profiles and user authentication to manage the edit action
  • Strengthen nest’s purpose to include private sharing

Modified Design

Pitch

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.


Concepts

  1. 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

  2. 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

  3. 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
    
  4. 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

  5. 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)
    
    
  6. 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):
    
  7. 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
    
  8. 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)
    

Synchronizations

app Fritter
includes User Authentication, User Profile, Chirp (Post), Chirper (Friend), Feed, Nest, Group Times, Filter
  • sync rules for user authentication, chirp (post)
    • when a user u signs in and creates post p, post p’s author is user u
    • if a user u is not signed in, they cannot create, edit, nor delete a post p
  • sync rules for user authentication, nests (circles)
    • if a user u is not signed in, they cannot create, delete, add users, nor remove users from a nest n
    • if a user u is signed in, they can create, delete, add users, remove users from a nest n
  • sync rules for user authentication, group times
    • if a user u is not signed in, they cannot set a group time
  • sync rules for user authentication, filter
    • if a user u is not signed in, they cannot filter their feed
  • sync rules for user authentication, feed
    • if a user u is not signed in, they cannot view their feed
  • sync rules for user authentication, profile
    • when a user u signs in, u’s profile is displayed
    • if a user u is not signed in, u cannot see any profiles
    • if a user is signed in, they can only edit their profile; if they sign in again, these changes will be visible
  • sync rules for nest, filter, chirper, profile
    • if a user clicks on a nest, it will automatically filter all the chirpers in a user’s network to only those in the nest
    • if a user clicks on a chirper in the nest, they will automatically see the profile of the user
  • sync rules for chirper (friend), profile
    • a user u’s profile displays all u’s friends to u
    • if a user u1 is not friends with a user u2, u1 can view mutual friends with u2 and send a friend request, and vice versa
    • if a user u1 friends a user u2, u1 can see u2’s suggested friends, and vice versa
    • if a user u1 unfriends a user u2, u1 can no longer see u2’s suggested friends, and vice versa
  • sync rules for chirper (friend), nest, chirp (post)
    • a user u is part of all their nests n
    • if a user u1 is not friends with a user u2, u2 is part of u1’s public nest, and vice versa
    • if a user u1 posts post p to their public nest, any user u2 can see u1’s post
    • if a user u1 posts post p to nest n, if a user u2 is part of nest n, u2 can view u1’s post
    • if a user u1 removes a user u2 from a nest n, u2 can no longer see any posts p posted to nest n
    • if a user u1 unfriends a user u2, user u2 is now only part of user u1’s public nest, and vice versa
    • if a user u1 posts post p to a nest n, and then adds a user u2 to nest n, u2 can now view post p
    • if a user u1 posts post p to a nest n, and then removes a user u2 from nest n, u2 can no longer view any posts p under nest n
    • if a user edits a post p to belong to a nest n, p becomes viewable to all users in n
    • if a user u posts a post p to no nests, the post p is only visible to u
    • if a user u deletes nest n, all posts under nest n are edited to no longer be part of nest n, and all users part of nest n are no longer part of nest n
    • if a user u deletes a post p, post p is removed from all nests and no user can view it
    • if a user u1 is part of a user u2’s nest n, when a user u1 posts, u2 can see what nests u1 is part of on their post
    • a user u1 can see the nests they’ve created, but another u2 cannot see what nest they are part of nor the nests u1 has created, regardless of friendship status (i.e. only the creator of a nest can manage the nest)
    • if a user u1 posts post p to nest n, they are the only ones who can see that post p has been posted to nest n (i.e. only the creator of a post can manage the nests on the post)
  • sync rules for chirper (friend), nest, feed, group times, filter, posts
    • if a user filters for a nest on their feed, their feed only displays posts from users in that nest
    • a user can only have up to 5 nest filters visible on their feed
    • if a user sets a time for a nest, and they view their feed outside of that nest’s time, they will not see any posts from that nest
    • if a user sets a time for a nest, and they view their feed filtered for that nest outside of that nest’s time, they will not see any posts from that nest

Wireframes

A picture of a wireframe for your personal profile 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.

A picture of a wireframe for the profile of a user I'm not chirpers with 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.

A picture of a wireframe for the profile of a user I'm chirpers with 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.

A picture of a wireframe for nests 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.

A picture of a wireframe for a nest named family'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.

A picture of a wireframe for a user's home page 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.

A picture of a wireframe for a user's home page settings 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.

A picture of a wireframe for a user's 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.


Tradeoffs

To be, or not to be (friends), that is the question

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.

Access to Posts, from Friends to Nests

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.

What came first: Nests or Categories?

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.