Assignment 3
Pitch
Welcome to Cook Nook, the food community for home cooks, chefs, and adventurers looking for creative recipe ideas! Beyond being a personalizable pocket cookbook where you can organize both your own recipes and new ones found online, Cook Nook serves as a hub where people can explore and share their creations with both friends and strangers.
Browse featured recipes and comment on posts with funny memes, feedback, or your own ingredient modifications! In addition, filter through recipes using public tags--such as healthy, one-pot, Japanese cuisine, baking--and find the latest updates from friends and your favorite recipe creators. Similarly, assign your own custom private tags to filter through your favorite saved posts. If you're getting home and just want a dinner fast, you can also input whatever ingredients you have available to find quick and easy recipes right away! Lastly, take note of challenging recipe steps or make your own mark on a dish by adding personalized notes to existing posts. From measurement adjustments to writing down fun ingredient twists, use private notes to turn Cook Nook into the perfect recipe diary!
Functional Design - Concepts
Concept 1 - User
Purpose: Save user information over various sessions on the application
Principle: Whenever they use the app, user signs in with a username and password
State:
- registered: set User
- username, password: User -> one String
Actions:
- register ()
- authenticate (username: one String, password: one String, out b: one Boolean)
- login (username: one String, password: one String, out u: User)
- delete ()
Concept 2 - Post
Purpose: Upload content to the platform
Principle: Users can create and publish posts containing media such as text, image, video, etc.
State:
- content: set String, set Media (Media is a concept that denotes simple photos or video that may be uploaded as part of a post)
Actions:
- publish (title: one String, out p: Post)
- edit (s: set String)
- upload (v: set Media)
- remove (p: one Media)
- delete ()
Concept 3 - Savour
Purpose: Keep and organize (recipe) posts for future reference
Principle: When a user saves a post, a link to the post is added to some easily accessible page that the user can refer back to later
State:
- saved: set Post
Actions:
- save (p: Post)
- unsave (p: Post)
Concept 4 - Tag and Filter
Purpose: Organize posts with overlapping
Principle: Users can assign tags to their own posts and to posts that they save; users can only assign public tags to their own posts, but they can assign private tags to any post
State:
- tags: set String
- tagged: Post -> set Tag,
Actions:
- create (tag_name: one String, private: one Boolean)
- add (p: Post, t: Tag)
- remove (p: Post, t: Tag)
- find (ts: set Tag, out ps: set Post)
Concept 5 - Post Notes
Purpose: Duplicate posts (recipes) and customize them in your own save folders
Principle: Save only the desired content of a post and add personal comments/notes on that post in your records
State:
- notes: Post -> set String
Actions:
- create (s: set String, out p: Post)
- edit (s: set String)
Concept 6 - Ingredient Match (specialized search)
Purpose: Given a set of keywords (i.e. ingredients), find posts that contain those keywords
Principle: User enters a list of ingredients, and a list of posts including all of those ingredients is generated
State:
- query (set String -> set Post)
Actions:
- find (ss: set String, out ps: set Post)
Concept 7 - Featured Posts
Purpose: Highlight a subset of posts based on some criteria (tags, popularity, etc.)
Principle: For a given time cadence (i.e. daily, weekly), a new set of posts is chosen by some algorithm and is featured in the application via display or promotion
State:
- featured: set Post
Actions:
- set_theme (s: String)
- feature (p: Post)
- unfeature (p: Post)
Dependency Diagram

Functional Design - Synchronizations
- When a post is saved, featured, or has notes, it can be tagged as "saved," "featured," or "noted." For a smoother UI, these tags can be invisible, or internal only to the backend search and filter functions.
- When a post is unsaved or no longer featured, its invisible "saved" or "featured" tag is removed.
- When adding personal notes to a post, a user is also effectively creating and saving their own private post. To keep saved and noted posts organized, we can call noted posts their own category separate from saved posts, but the mechanisms for maintaining the two sets can be essentially the same, except the act of notating creates a copy of the original post instead of directly saving the original.
- When a user is deleted, all of their posts, notes, and save records are deleted, but their comments will remain. To account for user deletion, the username will be removed from each of the user's comments (and replaced with a new string such as "user deleted"). In addition, if other users took notes on posts created by the deleted user, those users will still have the duplicates of the posts with their notes that are created by annotating a post with notes, but the link to see the original post will show a message saying that the original post was deleted. However, if any of the deleted user's posts were saved by other users, those posts will be deleted from the other users' records as well (maybe with a warning in advance so users can turn saved posts into notes).
- When a post is deleted, the entire post as well as any comments on the post are deleted. However, the behavior on any notes that other users took on the deleted post is the same as when a user is deleted, so note-modified duplicates of the deleted post may still remain in other users' records.
- When a user saves a post, the entire post is saved, including the comments and multimedia.
- When a user takes notes on a post, the original post content is duplicated, but the comments are not copied over.
- When a user takes notes on any post, the post can still be saved or unsaved, but the user will be able to find the post by searching for "My Notes."
- Public tags are visible to all users and must be added by to a post by the poster. This can be done in the initial post or via edits afterwards. When a tag is private/personal, it is only visible to the user who added the tag and will thus only be applied for searches initiated by that user.
Wireframes
Sketches

Screenshots









Figma Link
Design Tradeoffs
Issue 1 - Global Delete
Options: When any given post is deleted, what happens to users who saved or took notes on that post? Should they be deleted or not?
Choice Rationale: When an individual post is deleted, I chose to make the original post completely disappear, meaning that it will be deleted from other users' save records, but not from other users' notes records, since notes are always copies of original posts. The workflow here would be that when a user deletes a post, it is immediately deleted from public feeds, but other users who saved that post will get a grace period (say 24 hours) to turn that post into a note before it is deleted from their save records as well. This maintains the original poster's autonomy in that their post is deleted, but it also allows other users to keep information that they found valuable in the form of notes. This does have the con of potentially bothering users with too many notifications, but it is also projected that most users on Cook Nook will be unlikely to delete their posts or accounts.
Issue 2 - Sticky Note Save
Options: When a user takes notes on a post, one design consideration is whether the new noted post and/or the original post should be automatically saved as well.
Choice Rationale: If the user is choosing to make a new private post by taking notes instead of saving the original post directly, it would probably be undesirable to also save the original post. Similarly, if the new noted post can be found via searching for "My Notes," it may be redundant to also save it. As such, in the current design iteration, noted posts are not necessarily saved. However, this may change later, since although tightening removes some user flexibility, it is also useful in simplifying other features such as post deletion.
Issue 3 - Touchy Tags
Options: Who should be able to assign tags? Who should see which tags?
Choice Rationale: The problem with having everyone assign tags is that posts could easily become overloaded, or they could be assigned unsuitable tags by internet trolls. However, users may want to customize or add their own tags, especially to posts that they save. To balance this, the current design leverages two types of tags: public and private/personal. Public tags can only be added by posters, and they will be considered when any user filters by tags. Private tags are added by individual users and associated with their account, meaning that private tags will only be considered when the user who added them is searching among posts.