Skip to content

Assignment 3: Convergent Design

Pitch

Introducing ADDapp: a revolution in social media for focus and inclusion

Do you struggle with sensory overload, distraction, or find it challenging to keep up with your online world?

Enter ADDapp, where we've redefined social media to cater to individuals with ADD, ADHD, and those on the autism spectrum. We've taken lessons from in-depth interviews to create a platform that truly understands your unique needs.

Experience peaceful scrolling: tired of visual chaos? ADDapp boasts a clean, clutter-free interface that reduces visual pollution, letting you focus on what matters.

Red mode for better sleep: say goodbye to endless scrolling nights! Activate our soothing red mode during late-night scrolling sessions to ease into a restful slumber. Your sleep cycle deserves a break from the blue light.

Image summaries: no more information overload! We've introduced image summaries that capture the essence of each post, making content easier to digest, even when you're on the go.

Personalized daily highlights: feel overwhelmed by constant updates? You're in control! Specify the day, and ADDapp curates the most important posts from that date, ensuring you never miss a beat without the pressure to be "always on."

Discover ADDapp, the social media that's designed to make your online world a more inclusive, peaceful, and manageable place. Join us today and experience the difference for yourself!

An image summary of ADDapp!

A man healthily using his phone

Functional design

Standard parts

concept Authentication
    purpose
        provide authentication
    principle
        after registration, returns the object associated with provided credentials if they're right
    state
        registered: set User
        username, password: registered -> one String
    actions
        register(name, pwd: String, out u: User)
        authenticate(name, pwd: String, out u: User)
concept Authentication
    purpose
        provide authentication
    principle
        after registration, returns the object associated with provided credentials if they're right
    state
        registered: set User
        username, password: registered -> one String
    actions
        register(name, pwd: String, out u: User)
        authenticate(name, pwd: String, out u: User)
concept Session[User]
    purpose
        provide authentication for extended period
    principle
        after a session starts (and before it ends), authentication won't be needed again, until the session is ended.
    state
        active: set Session
        user: active -> one User
    actions
        start(u: User, out s: Session)
        getUser(s: Session, out u: User)
        end(s: Session)
concept Session[User]
    purpose
        provide authentication for extended period
    principle
        after a session starts (and before it ends), authentication won't be needed again, until the session is ended.
    state
        active: set Session
        user: active -> one User
    actions
        start(u: User, out s: Session)
        getUser(s: Session, out u: User)
        end(s: Session)
concept Tag[Item]
    purpose
        provide systematic classification
    principle
        after associating tags to objects, when given a set of tags, returns a set of objects that have those tags associated (has to include all of them)
    state
        tags: set Tag
        tagging: tags -> many Item
    actions
        setTagToItem(tag: Tag, item: Item)
        deleteTagFromItem(tag: Tag, item: Item)
        allWithTag(tag: set Tag, out u: set Item)
concept Tag[Item]
    purpose
        provide systematic classification
    principle
        after associating tags to objects, when given a set of tags, returns a set of objects that have those tags associated (has to include all of them)
    state
        tags: set Tag
        tagging: tags -> many Item
    actions
        setTagToItem(tag: Tag, item: Item)
        deleteTagFromItem(tag: Tag, item: Item)
        allWithTag(tag: set Tag, out u: set Item)
concept TextToImage[Post]
    purpose
        create images that convey the tone of a text
    principle
        for every post, there'll be a thumbnail, a visual representation of the tone in the text.
    state
        thumbnails: set Thumbnail
        assignments: thumbnails -> many Post
    actions
        generateImage(post: Post, out u: Thumbnail)
        deleteThumbnail(post: Post)
concept TextToImage[Post]
    purpose
        create images that convey the tone of a text
    principle
        for every post, there'll be a thumbnail, a visual representation of the tone in the text.
    state
        thumbnails: set Thumbnail
        assignments: thumbnails -> many Post
    actions
        generateImage(post: Post, out u: Thumbnail)
        deleteThumbnail(post: Post)
concept Feed[Item, User]
    purpose
        bring together content from multiple sources into a single, centralized location
    principle
        add objects to a feed, that can be retrieved when lookup (sorted differently according to whom it belongs)
    state
        items: set Item
        feeds: Feed -> many User
    actions
        createFeed(user: User, out u: Feed)
        addToFeed(item: Item, user: User, out u: Feed)
        removeFromFeed(item: Item, user: User)
        lookupFeed(user: User, out u: Feed)
concept Feed[Item, User]
    purpose
        bring together content from multiple sources into a single, centralized location
    principle
        add objects to a feed, that can be retrieved when lookup (sorted differently according to whom it belongs)
    state
        items: set Item
        feeds: Feed -> many User
    actions
        createFeed(user: User, out u: Feed)
        addToFeed(item: Item, user: User, out u: Feed)
        removeFromFeed(item: Item, user: User)
        lookupFeed(user: User, out u: Feed)
concept Post
    purpose
        allow users to contribute to the community
    principle
        after creating content, it is made into an object that allows removing and editing
    state
        posts: set Post
    actions
        addPost(text: String, out u: Post)
        removePost(post: Post)
        editPost(newText: String, out u: Post)
concept Post
    purpose
        allow users to contribute to the community
    principle
        after creating content, it is made into an object that allows removing and editing
    state
        posts: set Post
    actions
        addPost(text: String, out u: Post)
        removePost(post: Post)
        editPost(newText: String, out u: Post)
concept Highlight[Post]
    purpose
        set apart important items among a set of items
    principle
        after adding or removing objects and their dates, given a date, returns a summary of the most important objects related to that date
    state
        dateToPosts: Date -> many Post
        highlights: Date -> Highlight
    actions
        addPost(date: Date, post: Post)
        removePost(date: Date, post: Post)
        getHighlights(date: Date, out u: Highlight)
concept Highlight[Post]
    purpose
        set apart important items among a set of items
    principle
        after adding or removing objects and their dates, given a date, returns a summary of the most important objects related to that date
    state
        dateToPosts: Date -> many Post
        highlights: Date -> Highlight
    actions
        addPost(date: Date, post: Post)
        removePost(date: Date, post: Post)
        getHighlights(date: Date, out u: Highlight)

Synchronizations

app ADDapp
    include Authentication
    include Session
    include Post
    include Feed[Post.Post]
    include TextToImage[Post.Post]
    include Tag[Post.Post]
    include Highlight[Post.Post]

    sync register(name, password: String)
        Authentication.register(name, password)
    
    sync login(name, password: String)
        when Authentication.authenticate(name, password, user)
        Session.start(user)

    sync logout(s: Session)
        Session.end(s)

    sync post(content: String, date: Highlight.Date)
        when Post.addPost(content, post)
        for user in Authentication:
            Feed.addToFeed(post, user)
        TextToImage.generateImage(post)
        Highlight.addPost(date, post)
        // put the tag of the current date to the post
        // so filtering by date is just a tag lookup
        Tag.setTagToItem(date, post)

    sync filter(tags: set Tag)
        Tag.allWithTag(tags, posts)

    sync highlight(date: Highlight.Date)
        Highlight.getHighlights(date, highlight)
app ADDapp
    include Authentication
    include Session
    include Post
    include Feed[Post.Post]
    include TextToImage[Post.Post]
    include Tag[Post.Post]
    include Highlight[Post.Post]

    sync register(name, password: String)
        Authentication.register(name, password)
    
    sync login(name, password: String)
        when Authentication.authenticate(name, password, user)
        Session.start(user)

    sync logout(s: Session)
        Session.end(s)

    sync post(content: String, date: Highlight.Date)
        when Post.addPost(content, post)
        for user in Authentication:
            Feed.addToFeed(post, user)
        TextToImage.generateImage(post)
        Highlight.addPost(date, post)
        // put the tag of the current date to the post
        // so filtering by date is just a tag lookup
        Tag.setTagToItem(date, post)

    sync filter(tags: set Tag)
        Tag.allWithTag(tags, posts)

    sync highlight(date: Highlight.Date)
        Highlight.getHighlights(date, highlight)

Dependency diagram


Dependency diagram

Wireframes

Link

Design tradeoffs

How big the elements should be

I caught myself struggling to decide the size of the elements on the screen. At the same time I wanted to include most features on a single page, so the user wouldn't need to hunt them down through paths in the website, I, as a person with ADHD, feel overwhelmed by a lot of options in the same place. I decided to make them big and visually easy to spot, compromising a bit the navigation (although I think I was able to make this better - the maximum depth an user have to go is 3).

Since the filter feature is one of the app's main characteristics, I thought that I should create a new page for it so users can choose their filters in an extremely thorough way. It would also be an advantage visually, because the user wouldn't be overwhelmed by the other features appearing. However, I figured the user would have to use arrows to go back to the normal navigation, and the search would feel disconnected from the main app. I still wanted to show a bit of background or anything that could set up the environment like ADDapp. This way, the search is a drop-down menu (that can be expanded for more results) with the background blurry (diminishing visual pollution).

How to create reference to the recap feature

I didn't know if I would put a bell (like notification), a banner with posts switching views, a simple button, or the writing that I eventually picked. I preferred writing "Click here to see what you missed yesterday!" because it explicitly conveys the purpose (unlike the bell), and it does so in a non-invasive (like the banner) and friendly (unlike the button) way.