Requirements and Specifications - snuhcs-course/swpp-2026-project-team-09 GitHub Wiki
SNU Now: Requirements and Specifications
Team 9, Bonnie and Claude ยท Software Development Principles and Practice, Fall 2026 ยท Version 1.0 (Iteration 1, 2026-10-09)
This page describes what SNU Now does and how it looks to its users, as prototyped in Iteration 1. Features planned for later iterations are listed in section 5.3.
Contents
- Document Revision History
- Project Abstract
- Customer
- Competitive Landscape
- Functional Requirements: terms and roles, user stories, planned for later iterations
- Non-functional Requirements
- User Interface Requirements: rules for every screen, screen flows, screens
1. Document Revision History
| Version | Date | Key changes |
|---|---|---|
| 0.1 | 2026-09-28 | Initial draft, written from the specs before implementation. |
| 1.0 | 2026-10-09 | Rewritten to match the Iteration 1 prototype. A Quest now carries recruiting (capacity, Join Policy, Boards) and a Party is the group sharing location now. Friends connect by Friend ID or Invite Link. One session per User, Onboarding and consent added. Competitive landscape checked again. Non-functional requirements carry the implemented values. UI requirements follow the wireframes, with screen flows and the built screens. |
2. Project Abstract
SNU Now is a social map of Seoul National University's Gwanak campus for its students. A student signs in with an SNU Google account and sees the campus as a map with their own Avatar, their Friends' Avatars, events checked by an Administrator, the places of today's classes, cafeteria menus and the shuttle on its route. A student who wants company for an event joins or opens a small group for it (a "ํํฐ" on screen), recruited on a Board, among Friends, or formed by Matching from students who asked for companions. When the group is about to meet, any member activates its Party, and the members who accept see each other move on the map until they part. Friends connect by a Friend ID or a one-time Invite Link and propose Meetups with a place and a time. Location Sharing is off until the User turns it on, stops the moment it is switched off, never shows anyone outside the campus and keeps no history. The Iteration 1 prototype is a mobile app for Android and iOS with a web admin site. Iteration 2 plans to read notices and timetables with AI and to propose meetings from free time and walking times.
3. Customer
General audience. Students of SNU's Gwanak campus who have an SNU Google account and a smartphone. They move between buildings on a hillside campus all day, and today they piece together timetables, events, menus and the shuttle from separate services.
Specific customer types.
| Customer type | Situation | What SNU Now gives them |
|---|---|---|
| A student who wants company for a campus event | Sees an event in the ํ์ฌ tab and does not want to go alone. | The groups already going, the option to open one and recruit on a Board, or AI ๋งค์นญ with other students who asked. On the day the activated Party shows the members on the map, so that they find one another. |
| Two friends with a gap between classes | Both are free for an hour somewhere on campus and would otherwise message "์ด๋์ผ?". | Each other's Avatar with "๊ณต๊ฐ" and the place, and a Meetup with a place and a time that becomes a private group once accepted. |
| A student deciding where to eat or whether to wait for the shuttle | Close to lunchtime, near a shuttle stop. | Today's menus by restaurant with prices, the restaurants pinned on the map, and the shuttle's stops, route and vehicles, or the notice that it is not running. |
Administrators are team members who use a separate admin site to check collected events before students see them. Event organizers are a future customer; they have no account in Iteration 1.
4. Competitive Landscape
The competitors were checked against their store pages, help pages and public code on 2026-10-08.
- Live-location sharing: Apple Find My, Google Maps, KakaoMap ์น๊ตฌ ์์น. Friends' positions anywhere, always on or for a set time.
- Social maps: Bump (formerly Zenly), whoo. Friends' live positions with a history of the places they visited.
- Campus apps: Campify (Canada, 2025) shows friends' presence on campus and reads a timetable from a screenshot, without a map. ์๋ธ๋ฆฌํ์ and SNUTT offer timetables and boards.
- SNU services: ํ์ค lists events read from notices, ์์ธ๋ ์บ ํผ์ค ๋งต shows buildings and a shuttle tab, and Siksha shows cafeteria menus.
O = offered, โณ = partly, X = not offered.
| Feature | Find My / KakaoMap | Bump / whoo | Campify | ์๋ธ๋ฆฌํ์ / SNUTT | ํ์ค | ์บ ํผ์ค ๋งต / Siksha | SNU Now |
|---|---|---|---|---|---|---|---|
| Friends' live location on a map | O | O | X | X | X | X | O |
| Location shared only on campus, with no history | X | X | โณ | X | X | X | O |
| Location shared within a group meeting now, Friends or not | โณ | X | X | X | X | X | O |
| Campus events in a list and on the map | X | X | โณ | โณ | โณ | โณ | O |
| Finding companions for an event, recruiting on a Board | X | X | X | X | X | X | O |
| Today's classes shown with their place | X | X | โณ | O | โณ | X | O |
| Proposing a meeting with a place and a time | X | X | โณ | X | X | X | O |
| Cafeteria menus / shuttle vehicles on the map | X | X | X | โณ | X | O / โณ | O |
How SNU Now differs.
- From an event, to the people going, to the place where they meet. No competitor takes a student from an event to companions and then shows the group converging on the map.
- Location that is deliberate, short and bound to the campus. Sharing is off by default, has a switch for each friendship and each Party, is hidden outside the campus, and keeps only the latest position for ten minutes. Bump and whoo keep a history, and Find My shares anywhere.
- One map for people, events and campus services, where a student uses four apps today.
Iteration 2 sharpens the first point: a meeting proposed from the members' free time and walking times, and notices and timetable screenshots read by a model whose accuracy is measured (Design Documentation, section 4.4).
5. Functional Requirements
5.1 Terms and roles
The stories use the project's terms, written with a capital letter. The screens are in Korean, and some words on screen differ from the terms. In the stories, group means a Quest together with its members.
| Term | On screen | Meaning |
|---|---|---|
| User | A student signed in with an SNU Google account. A and B in the scenarios are any two Users. | |
| Friend | ์น๊ตฌ | Two Users connected by an accepted request or Invite Link. Friendship is always mutual. |
| Global Event | ํ์ฌ | An activity with a time and a place, published to every User by an Administrator. A Draft is one that was collected and is not yet published. |
| Quest | ํํฐ | What Users gather around: a title, a time, a place, up to 8 members, a Leader ("ํํฐ์ฅ") and a Join Policy. The list on the map is called "ํ์คํธ". |
| Join Policy | ๋ฐ๋ก ์ฐธ์ฌ, ์น์ธ ํ ์ฐธ์ฌ, ๋น๊ณต๊ฐ | How Users enter a Quest: Open (at once), Approval (the Leader accepts) or Closed (by invitation only). |
| Board | ๊ฒ์ํ | One of four lists where Open and Approval Quests recruit: ์์ฌ, ์ง๋ก, ์ทจ๋ฏธ, ๊ณต์ฐ. |
| Party | ํ์ฑ ํํฐ | The members of one Quest who are together now and share their locations. It is activated by hand, and a User is in at most one. |
| Meetup | ํํฐ ์ด๋ | A proposal between two Friends to meet at a place and a time. Accepting it creates a private Quest. |
| Matching | AI ๋งค์นญ | Grouping Users who asked for companions for the same Global Event. |
| Location Sharing | ์์น ๊ณต์ | Mutual visibility on the map within one friendship or one Party, each with its own switch. "์น๊ตฌ์ ์์น ๊ณต์ " turns all of a User's sharing on or off. |
| Campus Boundary | The outline of the campus plus 10 m. Outside it a User is hidden. |
Each story has the form "As a (role), I want (capability), so that (benefit)". Its acceptance criteria are numbered scenarios in Given, When, Then form, marked Positive (the expected path) or Negative (a refusal or an edge). The roles are SNU student (a User), Leader, member of a group or of its Party, and Administrator (a team member who publishes events on the admin site).
| Epic | Stories | State at the end of Iteration 1 |
|---|---|---|
| 1. Sign-in | US-AUTH-01, 02 | Built |
| 2. Map and Location Sharing | US-LOC-01 to 04 | Built; sharing with the phone locked is not yet verified on phones |
| 3. Global Events | US-EVENT-01 | Built |
| 4. Groups ("ํํฐ") | US-QUEST-01 to 03 | Built |
| 5. Matching ("AI ๋งค์นญ") | US-MATCH-01 | Built |
| 6. Party ("ํ์ฑ ํํฐ") | US-PARTY-01, 02 | Built |
| 7. Friends and Meetup | US-FRIEND-01, 02, US-MEETUP-01 | Built; opening an Invite Link from a messenger is not yet verified |
| 8. Timetable and campus services | US-CLASS-01, US-DINING-01, US-SHUTTLE-01 | Built |
| 9. Administration | US-ADMIN-01 | Built |
The three demo flows (from an event to companions, Friends and a Meetup, campus services) run automatically against the built servers on every change. The key stories for the user acceptance test are chosen by the end of Iteration 3.
5.2 User stories
Epic 1. Sign-in
US-AUTH-01 ยท Sign in with an SNU account
As an SNU student, I want to sign in with my SNU Google account, so that I need no extra password and only SNU students are in the app.
- First sign-in (Positive)
- Given a student opens the app for the first time
- When they tap "์์ธ๋ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ", choose their SNU account and agree to the terms
- Then ํ๋กํ ๋ง๋ค๊ธฐ opens with the name from Google. After they enter a department and tap "์ ์ฅํ๊ณ ์์ํ๊ธฐ", the map opens. Later starts open the map directly.
- An account outside SNU (Negative)
- Given a Google account outside the
snu.ac.krdomain - When its owner tries to sign in
- Then sign-in is refused with "๋ก๊ทธ์ธํ์ง ๋ชปํ์ด์ ยท @snu.ac.kr ๊ณ์ ๋ง ๊ฐ๋ฅํด์".
- Given a Google account outside the
US-AUTH-02 ยท One phone at a time
As an SNU student, I want my account signed in on one phone at a time, so that nobody shares my location from a phone I no longer hold.
- A second phone (Positive)
- Given A is signed in on phone 1 with Location Sharing on
- When A signs in on phone 2
- Then phone 1 is signed out at once with "๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ๋ก๊ทธ์ธํ์ด์" and sends no more positions.
- Signing out (Positive)
- Given Friend B sees A's Avatar
- When A taps "๋ก๊ทธ์์" and confirms
- Then A's Avatar disappears from B's map and A's position is removed.
Epic 2. Map and Location Sharing
US-LOC-01 ยท Sharing is off until I turn it on
As an SNU student, I want the campus map to show my own Avatar and one switch, "์น๊ตฌ์ ์์น ๊ณต์ ", that is off until I turn it on, so that my location is never shared without my decision.
- A new User shares nothing (Negative)
- Given a new User who has not touched the switch
- When they walk across campus with the app open
- Then no position is sent and nobody sees them. The map itself works.
- Switching off (Positive)
- Given A shares with Friend B on campus
- When A turns the switch off
- Then A's Avatar disappears from B's map at once, and A no longer sees anyone.
US-LOC-02 ยท Hidden off campus, a switch for each relationship
As an SNU student, I want to be hidden outside the Campus Boundary and to have a separate switch for each Friend and for my Party, so that my life off campus stays private and I can stop sharing with one person only.
- Leaving the campus (Negative)
- Given A shares with Friend B
- When A walks out of the Campus Boundary
- Then A's Avatar disappears from B's map and A sees "์บ ํผ์ค ๋ฐ์ด๋ผ ์์น๊ฐ ๊ณต์ ๋์ง ์์์". B is not told why A is gone.
- One switch off, another on (Positive)
- Given A and B are Friends and in the same Party, with every switch on
- When A turns the switch for Friend B off
- Then they still see each other through the Party.
US-LOC-03 ยท Avatars that move, and say when they are old
As an SNU student, I want the Avatars of my Friends and Party members to move in near real time and to be marked when old, so that I can find them and know when a position may be wrong.
- A Friend walks (Positive)
- Given A and B see each other
- When B walks across campus
- Then B's Avatar glides to each new position on A's map within seconds.
- A phone stops reporting (Negative)
- Given B's phone has stopped reporting
- When 2 minutes pass
- Then B's Avatar is dimmed and labelled "N๋ถ ์ ". After 10 minutes it is removed.
US-LOC-04 ยท Sharing while the phone is locked
As an SNU student, I want my position to keep updating while my phone is locked, under a notification I can always see, so that my companions can find me and I know that sharing is on. Built; not yet verified on phones.
- Locked phone (Positive)
- Given sharing and "๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๊ณต์ " are on, and location is allowed all the time
- When the User locks the phone and walks
- Then a permanent notification is shown and a position is sent every 30 seconds.
- Permission only while in use (Negative)
- Given location is allowed only while the app is in use
- When the app goes to the background
- Then nothing is sent, and the switch explains that "ํญ์ ํ์ฉ" is needed.
Epic 3. Global Events
US-EVENT-01 ยท Events in a list and on the map
As an SNU student, I want published Global Events in a list with filters and as pins on the map, so that I see what is happening on campus and where.
- A published event (Positive)
- Given an Administrator has published an event with a position on campus
- When the User opens the ํ์ฌ tab or taps the event's pin
- Then a card shows its announcer, title, time, place and the number of groups going, with "ํํฐ ์ฐพ๊ธฐ/๋ชจ์ง" and "AI ๋งค์นญ".
- Not published, or over (Negative)
- Given an event that is still a Draft, or has ended
- When the User opens the ํ์ฌ tab
- Then it is not listed.
Epic 4. Groups ("ํํฐ")
US-QUEST-01 ยท Go to an event with others
As an SNU student, I want to see who is already going to an event and join them, or open a group of my own, so that I do not go alone.
- Joining a group that is going (Positive)
- Given two groups are recruiting for an event
- When the User taps "ํํฐ ์ฐพ๊ธฐ/๋ชจ์ง"
- Then a sheet lists both groups with Leader, places taken ("3/6๋ช "), time and place. "์ฐธ์ฌํ๊ธฐ" on an Open group makes the User a member at once; "์ฐธ์ฌ ์ ์ฒญ" on an Approval group waits for the Leader.
- Already going (Negative)
- Given the User is already in a group for that event
- When they tap "ํํฐ ๋ชจ์ง"
- Then no second group is created. They are taken to their group with "์ด ํ์ฌ์ ํจ๊ป ๊ฐ๋ ํํฐ๊ฐ ์ด๋ฏธ ์์ด์".
US-QUEST-02 ยท Create a group and recruit on a Board
As an SNU student, I want to create a group with a title, time, place, capacity and Join Policy, public on a Board or private among invited Friends, so that I find people to do something with.
- Posting a group (Positive)
- Given a User fills in ํํฐ ๋ง๋ค๊ธฐ as ๊ณต๊ฐ, with a description, the Board ์์ฌ and "๋ฐ๋ก ์ฐธ์ฌ"
- When they tap "ํํฐ ์ฌ๋ฆฌ๊ธฐ"
- Then the group is listed first on that Board and under ๋ด ํํฐ. Posted as ๋น๊ณต๊ฐ instead, only the invited Friends receive an invitation.
- The last place (Negative)
- Given a group with one free place
- When two Users tap "์ฐธ์ฌํ๊ธฐ" at the same moment
- Then one enters and the other is refused with the reason. A group never exceeds its capacity.
US-QUEST-03 ยท Run a group
As a Leader, I want to accept or decline join requests, invite Friends, hand the role over and end the group, so that I decide who joins and the group ends when it is no longer needed.
- Accepting a request (Positive)
- Given B asked to join A's Approval group
- When Leader A taps "์๋ฝ" in the group's room
- Then B is a member, and every member's room shows B without refreshing.
- Ending the group (Positive)
- Given B has the room of A's group open
- When Leader A confirms "ํํฐ ์์ ๊ธฐ"
- Then the group and its post disappear, and B's room closes with "ํํฐ์์ ๋น ์ก์ด์". If the Leader only leaves, the member who joined earliest becomes Leader.
Epic 5. Matching ("AI ๋งค์นญ")
US-MATCH-01 ยท Be matched with companions for an event
As an SNU student, I want to ask for Matching on an event with a group size of 2 to 4 and be placed with students who share my interests, so that I find companions I do not know yet.
Matching first fills a free place in an Open group of the requested size. Otherwise it groups the requesters of the same event and size, preferring those who share the most interest hashtags.
- Two requests of the same size (Positive)
- Given A and B each tap "AI ๋งค์นญ" on the same event, choose 2๋ช and tap "๋งค์นญ ์ ์ฒญ"
- When the next Matching round runs (every 60 seconds)
- Then A and B are members of one new private group for the event, and each sees "{event} ํํฐ๊ฐ ๋ง๋ค์ด์ก์ด์".
- Different sizes (Negative)
- Given A asked for 2๋ช and B for 3๋ช on the same event
- When the round runs
- Then nobody is matched and both keep waiting. A request expires when the event starts.
Epic 6. Party ("ํ์ฑ ํํฐ")
US-PARTY-01 ยท Activate the Party
As a member of a group, I want to activate its Party when we are about to meet, or to accept or decline one that another member activated, so that the members who accept see each other on the map.
- Activating and joining (Positive)
- Given a group of A, B and C with no running Party
- When A taps "ํํฐ ํ์ฑํ" and confirms, and B taps "์ฐธ์ฌ" on the notice "{name}๋์ด ํํฐ๋ฅผ ํ์ฑํํ์ด์"
- Then A and B see each other's Avatars whether or not they are Friends, and the map's button reads "ํ์ฑ ํํฐ ยท 2๋ช ๊ณต์ ์ค". C, who has not answered, shares nothing.
- Already in another Party (Negative)
- Given B is in the Party of another group
- When B taps "์ฐธ์ฌ"
- Then B is asked to leave the current Party first ("๋๊ฐ๊ณ ์ฐธ์ฌ"). A User is never in two Parties.
US-PARTY-02 ยท Pause, leave or end the Party
As a Party member, I want to pause my sharing, leave the Party, or end it as its Leader, so that I can go my own way and stop sharing at once.
- Leaving (Positive)
- Given A and B are Party members and not Friends
- When A turns "๋ด ์์น ๊ณต์ " off, or confirms "ํ์ฑํ์์ ๋๊ฐ๊ธฐ"
- Then A's Avatar disappears from B's map at once, and A stays a member of the group.
- Ending (Positive)
- Given a running Party
- When its Leader confirms "ํ์ฑํ ๋๊ธฐ"
- Then sharing through the Party stops for every member. The group and its post remain.
Epic 7. Friends and Meetup
US-FRIEND-01 ยท Add a Friend by ID or by link
As an SNU student, I want to add a Friend by their Friend ID or by a one-time Invite Link, so that we connect the way we already talk and both agree to it. Built; opening the link from a messenger is not yet verified.
- By Friend ID (Positive)
- Given A types B's 8-character Friend ID in ์น๊ตฌ ์ถ๊ฐ and taps "์ฐพ๊ธฐ", then "์ถ๊ฐ"
- When B taps "์๋ฝ" under ์น๊ตฌ ์์ฒญ
- Then A and B are Friends ("{name}๋๊ณผ ์น๊ตฌ๊ฐ ๋์ด์").
- By Invite Link (Positive)
- Given A taps "์ด๋ ๋งํฌ ๋ณด๋ด๊ธฐ" and sends the link through a messenger
- When B opens it, reads A's name and the notice that accepting shows each other's location, and taps "์๋ฝ"
- Then they are Friends.
- A link that no longer works (Negative)
- Given an Invite Link that was already used, or is older than 24 hours
- When someone opens it
- Then it is refused with its reason, such as "์ด๋ฏธ ์ฌ์ฉ๋ ์ด๋ ๋งํฌ์์".
US-FRIEND-02 ยท See and manage Friends
As an SNU student, I want my Friends in a list with their state and a sharing switch each, and a way to end a friendship, so that I know whom I share with and can stop for good.
- The Friend list (Positive)
- Given A opens the Friend panel on the map
- When the list loads
- Then Friends are grouped by state ("๊ณต๊ฐ", "์์ ์ค", "์ด๋ ์ค", "์์น ๊บผ์ง"), and tapping a visible Friend moves the map to them.
- Ending a friendship (Positive)
- Given A and B are Friends
- When A taps B in ์น๊ตฌ ๊ด๋ฆฌ, then "์น๊ตฌ ๋๊ธฐ", and confirms
- Then the friendship ends for both at once, and they disappear from each other's maps.
US-MEETUP-01 ยท Propose a Meetup to a Friend
As an SNU student, I want to propose a Meetup to a Friend with a title, a place and a time, and to accept or decline one I receive, so that we agree where and when to meet.
- Accepted (Positive)
- Given A opens "ํํฐ ๋ง๋ค๊ธฐ" from B's card on the map, fills in a title, a time and a place, and sends it
- When B taps "์๋ฝ" under ํํฐ โบ ์ด๋
- Then A and B share one private group led by A, shown under ๋ด ํํฐ and on the map. No Party is activated yet.
- Declined or cancelled (Negative)
- Given A sent B a Meetup
- When B declines it, or A cancels it before B answers
- Then A sees "๊ฑฐ์ ํจ", or B is told "์ด๋ฏธ ์ทจ์๋๊ฑฐ๋ ์ง๋ ์ด๋์์".
Epic 8. Timetable and campus services
US-CLASS-01 ยท My classes, and the way there
As an SNU student, I want to enter my classes with their times, buildings and rooms, and to see the walking route to where I am going, so that today's classes appear in my list and I know how to get there.
- Adding a class (Positive)
- Given a User adds a class with weekdays, a start and end time, a building from the Place list and a room
- When they save
- Then on each of those weekdays it appears in the list on the map as "๊ฐ์ ยท {building} {room}".
- Overlap (Negative)
- Given the User has a class on Monday at 14:00
- When they save another class that overlaps it
- Then it is saved with the warning "{course}์ ์๊ฐ์ด ๊ฒน์ณ์".
- The route (Positive)
- Given a User on campus
- When they tap "๊ธธ์ฐพ๊ธฐ" on a group's card
- Then the walking route to its place is drawn. If no route exists, "๊ธธ์ ์ฐพ์ง ๋ชปํ์ด์".
US-DINING-01 ยท Today's menus
As an SNU student, I want the restaurants serving today pinned on the map and their menus by day and meal with prices, so that I can choose where to eat.
- A restaurant's menu (Positive)
- Given today's menus have been collected
- When the User turns the "์๋น" layer on and taps a pin's "๋ฉ๋ด ๋ณด๊ธฐ"
- Then the menu panel opens at that restaurant and the meal served next, with prices and the time the menus were collected.
- No menu (Negative)
- Given no menu was posted for the chosen day
- When the User opens that day
- Then the panel says "์ด๋ ์ฌ๋ผ์จ ๋ฉ๋ด๊ฐ ์์ด์".
US-SHUTTLE-01 ยท The shuttle on the map
As an SNU student, I want the shuttle's stops, route and vehicles on the map, and to be told when it is not running, so that I know where to wait and do not wait for nothing.
- In service (Positive)
- Given a weekday between 08:00 and 21:00
- When the User turns "์ ํ๋ฒ์ค" on
- Then the stops, the route line and the vehicles appear, and a vehicle glides on as its position arrives every 15 seconds.
- Out of service (Negative)
- Given a weekend, or a time outside 08:00 to 21:00
- When the User turns "์ ํ๋ฒ์ค" on
- Then "์ง๊ธ์ ์ ํ๋ฒ์ค๊ฐ ์ดํํ์ง ์์์" is shown with the service hours.
Epic 9. Administration
US-ADMIN-01 ยท Check, publish and maintain events
As an Administrator, I want to check each collected Draft against its source, complete its time and position, publish it, and change or cancel it later, so that nothing reaches students unchecked and they always see the current time and place.
- Publishing (Positive)
- Given a Draft with a title, a start time and a position inside the campus
- When a signed-in Administrator publishes it
- Then it becomes a Global Event that Users see without restarting the app.
- An incomplete Draft (Negative)
- Given a Draft without a start time or a position
- When the Administrator tries to publish it
- Then publishing is refused and the missing items are named.
- Changing a published event (Positive)
- Given Users are in groups for a published event
- When the Administrator changes its time, or cancels it
- Then the Users' lists and groups show the new time. A cancelled event disappears from the map.
5.3 Planned for later iterations
The Iteration 1 review (2026-10-07) asked for more technical depth in one main feature, ideally solved with AI, and a clearer story about Friends. The plan below answers it. Iteration numbers follow the current schedule and may change; the scope of Iteration 2 is confirmed at its kickoff.
| Planned | What it adds | Iteration |
|---|---|---|
| Two words on screen | The Quest is shown as "์ฝ์" and the Party as "ํํฐ", the ์ฝ์ while it runs. A Meetup is a proposed ์ฝ์. | 2 |
| Reading with AI | A timetable screenshot becomes classes with rooms, and a university notice becomes an event with its time and Place. The accuracy is measured on a labelled set. | 2 to 3 |
| A meeting proposed for the group | From the members' free time and positions the app proposes a place and a time that every member can reach before their next class, with walking times that know the campus's slopes. | 2 to 4 |
| Notifications | Push notifications for invitations, join requests and activated Parties. | 2 |
| Private Events, Private Zones, blocking | Events only the User sees, areas where the User is hidden, and blocking a User. | 3 or later |
| AI chat, organizer accounts, study spaces | The assistant behind the map's input bar, organizers publishing their own events, and study spaces as a layer on the map. | After the beta test |
6. Non-functional Requirements
Values without a mark are implemented in the prototype. Target marks a value that is stated and not yet measured on phones.
| Requirement | What must hold | How it is checked |
|---|---|---|
| NFR-01 Location freshness | A position is reported at most every 5 seconds while the app is open and every 30 seconds while the phone is locked. An Avatar older than 2 minutes is dimmed, and it is removed at 10 minutes. | Server receipt times on a 5-minute walk, then 10 minutes locked. |
| NFR-02 Response latency | A reported position appears on a viewer's map within 2 seconds. The map is shown within 3 seconds of opening the app. Target. | Two phones filmed over 20 reports; at least 19 within the limit. |
| NFR-03 Scalability | With 10 Users sharing at once, NFR-02 still holds. Target. | Simulated Users (Iteration 3). |
| NFR-04 Privacy: stopping | Turning a switch off, leaving a Party, ending a friendship or signing out removes the Avatar from every viewer at once (target: within 2 seconds). | Filmed on two phones, 10 trials. |
| NFR-05 Privacy: no history, campus only | Only the latest position of a User is kept, for 10 minutes; no movement history exists. A position outside the Campus Boundary is never kept or delivered. | Stored data inspected after a walk; an automated test in which deliveries from outside must be 0. |
| NFR-06 Privacy: consent | Sharing is off for a new User. The terms and each location permission are explained before they are asked. Joining a group and activating a Party say that members will share location. | A new account carried across campus must cause no report. |
| NFR-07 Security | Only snu.ac.kr Google accounts can sign in, verified on the server. A User has one session; signing in on another phone ends the earlier one. An Invite Link works once and for 24 hours. |
Automated tests of refusal, session replacement and link reuse. |
| NFR-08 Consistency | A group never exceeds its capacity. A User is never in two Parties. A repeated request is carried out once. On the admin site a save never overwrites another Administrator's newer change. | Automated tests with simultaneous attempts. |
| NFR-09 Reliability | After a lost connection the app shows the current state within 5 seconds of reconnecting (target). A failed Collection keeps the data collected before. | Flight mode for 1 minute, timed; the admin site's Collection page. |
| NFR-10 Data freshness | Menus are collected at 05:00 and 10:00, events every 6 hours, and shuttle vehicles every 15 seconds on weekdays from 08:00 to 21:00. | The admin site's Collection page over one day. |
| NFR-11 Usability and platform | The app runs on Android and iOS. Every label and message is in Korean, and every refusal says why. | Screens read through against section 7. |
7. User Interface Requirements
The wireframes cover the whole app and were drawn before implementation. Section 7.2 shows how the screens follow one another, and section 7.3 describes each screen next to the screen as built in Iteration 1 (captured on an Android emulator with sample data).
7.1 Rules for every screen
- The map is the main screen. It fills the screen above the bottom tabs (์ง๋, ํํฐ, ํ์ฌ, ๋ด ์ ๋ณด) and is limited to the campus. Lists, panels and cards open over the map. The back button closes the topmost one, and on another tab it returns to the map.
- Every refusal says why. An input that is not allowed keeps the User on the screen and shows the reason in Korean. A button whose form is incomplete stays disabled. A control that is not built yet answers "์ค๋น ์ค์ด์์".
- Sharing and leaving are confirmed first. Joining a group, activating or leaving a Party, ending a friendship and signing out each ask in a sheet before anything happens.
- Loading, empty and error states look the same everywhere: a spinner, the screen's own empty sentence, or "๋ถ๋ฌ์ค์ง ๋ชปํ์ด์" with "๋ค์ ์๋".
- A lost connection keeps what the screen showed. The app fetches the current state by itself when the connection returns. A session that cannot be renewed, or was replaced on another phone, leads to Sign-in.
| Refused sign-in | A list that failed to load | An empty list | A warning in a form |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
7.2 Screen flows
Each flow is a row of wireframes. An arrow carries the User's input that leads to the next screen. Under a screen, a red note is a failure case, where the User stays on the screen and reads the reason, and a grey note is another way on. A and B are two Users.
Flow 1. Entering the app (US-AUTH-01)

Flow 2. From an event to companions on the map (US-EVENT-01, US-QUEST-01, US-MATCH-01, US-PARTY-01)

Flow 3. Friends and a Meetup (US-FRIEND-01, US-MEETUP-01)

Flow 4. Campus services (US-DINING-01, US-SHUTTLE-01)

Flow 5. Timetable (US-CLASS-01)

7.3 Screens
UI-01 Sign-in and Onboarding
| Wireframe | Built | Wireframe | Built |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. One round button, "์์ธ๋ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ยท @snu.ac.kr", and a character pointing at it. The character is a placeholder until the app's mascot is drawn. After the first sign-in, the consent screen, then ํ๋กํ ๋ง๋ค๊ธฐ with the name from Google, a department search, ํ๋ฒ and ๊ด์ฌ์ฌ chips.
- The User can tap the button (the phone's account sheet opens), agree to the terms, enter a name and a department, add up to 20 hashtags, and tap "์ ์ฅํ๊ณ ์์ํ๊ธฐ".
- Failure cases. "๋ก๊ทธ์ธํ์ง ๋ชปํ์ด์ ยท @snu.ac.kr ๊ณ์ ๋ง ๊ฐ๋ฅํด์". A department that is not in the list: "๊ฒฐ๊ณผ ์์". "๊ด์ฌ์ฌ๋ 20๊ฐ๊น์ง ์ถ๊ฐํ ์ ์์ด์". "์ ์ฅํ์ง ๋ชปํ์ด์. ๋ค์ ์๋ํด ์ฃผ์ธ์".
- Differs from the wireframe. The footer links to the terms became a consent screen.
UI-02 The map
| Wireframe | Built | Wireframe: Friend panel | Built: Friend panel |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. The campus map with the User's Avatar, the Friends and Party members who can be seen, and pins of events and of the User's groups. Top left, "์น๊ตฌ N" with up to three Friends and their state; top right, "ํ์คํธ N" with today's classes and groups. At the bottom, "ํ์ฑ ํํฐ ยท N๋ช ๊ณต์ ์ค" while in a Party, the ํธ์๊ธฐ๋ฅ button, zoom and "๋ด ์์น๋ก ์ด๋". The Friend panel lists the Friends by state, with a calendar button for each (it opens the Meetup form) and "์น๊ตฌ ์ถ๊ฐ".
- The User can move and zoom the map, tap an Avatar or a pin (a card opens), tap a Friend row (the map moves to them), tap a class row (the map moves to its building), tap a group row (its room opens), and expand either list.
- Failure cases. Location not yet allowed: "๋ด ์์น๋ฅผ ์ง๋์ ํ์ํ ๊น์?" with "๋์ค์" and "๊ณ์". Off campus: "์บ ํผ์ค ๋ฐ์ ์์ด์". A Friend who cannot be seen is listed as "์์น ๊บผ์ง". An Avatar older than 2 minutes is dimmed with "N๋ถ ์ ".
- Differs from the wireframe. ์ค๋์ ๋ฐ์๊ตญ, the AI input bar and the + button (์ฌ๋ฆฌ๊ธฐ) are drawn and answer "์ค๋น ์ค์ด์์".
UI-03 Cards and the route
| Built: Friend card | Built: event card | Built: group card | Built: route |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
A card opens over the map when an Avatar or a pin is tapped.
| Card of | Shows | Main button |
|---|---|---|
| A Friend | Name, department, state and place, walking minutes. | "ํํฐ ๋ง๋ค๊ธฐ" opens the Meetup form. |
| A Global Event | "๊ณต์ ํ์ฌ ยท {announcer}", title, time, place, "๊ฐ์ด ๊ฐ ํํฐ N๊ฐ". | "๊ฐ์ด ๊ฐ ์ฌ๋ ์ฐพ๊ธฐ" opens ํํฐ ๋ง๋ค๊ธฐ for the event, or the User's existing group for it. |
| A public group | "ํํฐ ยท n/m๋ช ", title, next time and place. | "ํํฐ ์ด๊ธฐ" or "์ฐธ์ฌํ๊ธฐ" opens the room. |
| A private group | "๋น๊ณต๊ฐ ํํฐ ยท {name}๊ณผ", title, time, place. | "๊ธธ์ฐพ๊ธฐ" draws the route. Failure: "๊ธธ์ ์ฐพ์ง ๋ชปํ์ด์", "์บ ํผ์ค ๋ฐ์ ์์ด์". |
| A restaurant, a stop, a vehicle | The meals served today; "{stop} ์ ๋ฅ์ฅ ยท ๋ค์ ์ ๋ฅ์ฅ {next}"; "์ดํ ์ค". | "๋ฉ๋ด ๋ณด๊ธฐ"; none; "๋ ธ์ ๋ณด๊ธฐ". |
UI-04 ํธ์๊ธฐ๋ฅ: restaurants, menus, shuttle
| Wireframe | Built | Wireframe: ๋ฉ๋ด | Built: ๋ฉ๋ด |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. The ํธ์๊ธฐ๋ฅ button opens three tiles: ์๋น, ์ ํ๋ฒ์ค and ๋ฉ๋ด. ์๋น pins each restaurant serving today. ์ ํ๋ฒ์ค draws the stops, the route line and the moving vehicles. The ๋ฉ๋ด panel has seven days, ์์นจ ยท ์ ์ฌ ยท ์ ๋ , each restaurant's lines with prices, and the time the menus were collected.
- The User can turn a layer on or off (it stays on across tabs), open ๋ฉ๋ด from its tile or from a pin's "๋ฉ๋ด ๋ณด๊ธฐ" (it opens at the meal served next), choose a day or a meal, and tap a stop or a vehicle.
- Failure cases. A restaurant without that meal: "์ด์ํ์ง ์์์". A day without menus: "์ด๋ ์ฌ๋ผ์จ ๋ฉ๋ด๊ฐ ์์ด์". Outside the service hours: "์ง๊ธ์ ์ ํ๋ฒ์ค๊ฐ ์ดํํ์ง ์์์". A vehicle that has not reported for 60 seconds disappears.
- Differs from the wireframe. There is no ๊ณต๋ถ๊ณต๊ฐ layer, because there is no data for it yet.
UI-05 The ํ์ฌ tab
| Wireframe | Built | Built: groups going | Built: AI ๋งค์นญ |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. Published events as cards (announcer, title, time, place, "๊ฐ์ด ๊ฐ ํํฐ N๊ฐ"), the filters ์ ์ฒด ยท ์ค๋ ยท ์ด๋ฒ ์ฃผ ยท ํํฐ ๋ชจ์ง ์ค, a search, and a sparkle button with the number of waiting Matching requests.
- The User can tap "ํํฐ ์ฐพ๊ธฐ/๋ชจ์ง" for a sheet with the groups going and "ํํฐ ๋ชจ์ง"; tap "AI ๋งค์นญ" for a sheet with 2๋ช ยท 3๋ช ยท 4๋ช and "๋งค์นญ ์ ์ฒญ"; tap the sparkle button to see waiting requests and cancel one; tap "์์ธํ" to read the notice at its source.
- Failure cases. "์์ ๋ ํ์ฌ๊ฐ ์์ด์". "์ด๋ฏธ ๋งค์นญ ์ค์ด์์". "์ด๋ฏธ ์์ํ ํ์ฌ์์". "๋งค์นญ ์๋ฒ๊ฐ ์๋ตํ์ง ์์์. ์ ์ ํ ๋ค์ ์๋ํด ์ฃผ์ธ์".
- Differs from the wireframe. There are no category tabs and no โ ๊ด์ฌ ํ์ฌ. The AI ๋งค์นญ sheet asks only for the group size.
UI-06 The ํํฐ tab: ์ฐพ๊ธฐ, Boards, ๋ด ํํฐ, ์ด๋
| Wireframe: ์ฐพ๊ธฐ | Built: ์ฐพ๊ธฐ | Wireframe: ๋ด ํํฐ | Built: ๋ด ํํฐ |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. ์ฐพ๊ธฐ: the newest recruiting groups and the four Boards, each newest first; a post shows its Leader, the places taken, the description, time and place. ๋ด ํํฐ: the group whose Party is running first, then Parties waiting for the User's answer, then the groups by day. ์ด๋: received invitations and Meetups, and sent Meetups with their state.
- The User can tap "์ฐธ์ฌํ๊ธฐ" or "์ฐธ์ฌ ์ ์ฒญ" and confirm the sheet, which says that members share location once the Party is activated; tap a card to open the room; edit or remove their own post.
- Failure cases. A full or ended group is refused with the reason. "์์ง ๋ชจ์ง๊ธ์ด ์์ด์". "์ด๋ฏธ ์ทจ์๋๊ฑฐ๋ ์ง๋ ์ด๋์์". "์ด๋ฏธ ๋ตํ ์ด๋์์".
UI-07 ํํฐ ๋ง๋ค๊ธฐ and the Meetup form
| Wireframe | Built | Wireframe: private | Built: Meetup form |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. ํํฐ ๋ง๋ค๊ธฐ: ๊ด๋ จ ํ์ฌ (optional), ์ ๋ชฉ, ๋ณธ๋ฌธ, ์ธ์ , ์ธ์ (2 to 8), ์ด๋์, ๊ณต๊ฐ or ๋น๊ณต๊ฐ, ๋ฐ๋ก ์ฐธ์ฌ or ์น์ธ ํ ์ฐธ์ฌ, ๊ฒ์ํ, ์น๊ตฌ ์ด๋. The Meetup form, opened from a Friend: ์ ๋ชฉ, ์ธ์ , ๋๋๋ ์๊ฐ and ์ด๋์ (a search over 230 Places, or a pin on the map).
- The User can fill in the form and submit it. A message confirms, such as "ํํฐ๋ฅผ ์ฌ๋ ธ์ด์" or "{name}๋์๊ฒ ํํฐ ์ด๋๋ฅผ ๋ณด๋์ด์".
- Failure cases. The button stays disabled until there is a title and, for a public group, a description and a Board, or for a private one at least one Friend. "์์ ์๊ฐ์ด ์ง๋ฌ์ด์. ๋ค์ ๊ณจ๋ผ ์ฃผ์ธ์". "๋๋๋ ์๊ฐ์ด ์์ ์๊ฐ๋ณด๋ค ๋ฆ์ด์ผ ํด์". "{name}๋๊ณผ ๋ ์ด์ ์น๊ตฌ๊ฐ ์๋์์".
UI-08 The group's room
| Wireframe | Built: not activated | Built: Party running | Wireframe: leaving |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. Badges ("ํํฐ ยท n/m๋ช ", "๋น๊ณต๊ฐ", the event), the description, the activation box, ์ผ์ (what the group does, with time and place), join requests (for the Leader), the members with their state, and "๋๊ฐ๊ธฐ" or, for the Leader, "ํํฐ ์์ ๊ธฐ".
- The activation box has four states: not activated ("ํํฐ ํ์ฑํ"); running with the User ("ํ์ฑํ ์ค ยท N๋ช ์ด ์๋ก ์์น๋ฅผ ๊ณต์ ํ๊ณ ์์ด์", the "๋ด ์์น ๊ณต์ " switch, and "ํ์ฑํ์์ ๋๊ฐ๊ธฐ" or, for the Party's Leader, "ํ์ฑํ ๋๊ธฐ"); running without the User ("{name}๋์ด ํํฐ๋ฅผ ํ์ฑํํ์ด์" with "๊ฑฐ์ " and "์ฐธ์ฌ"); declined.
- The User can press any button above and confirm in a sheet, and tap a visible member to move the map to them.
- Failure cases. Two members activate at once: one Party runs and the second member enters it ("์ด๋ฏธ ํ์ฑํ๋ ํํฐ์ ์ฐธ์ฌํ์ด์"). Already in another Party: "๋๊ฐ๊ณ ์ฐธ์ฌ". A member who is not sharing is marked "์์น ๊บผ์ง" or "์๋ต ๋๊ธฐ". The group was ended meanwhile: "ํํฐ์์ ๋น ์ก์ด์".
- Differs from the wireframe. Any member can activate the Party.
UI-09 ๋ด ์ ๋ณด and Friends
| Wireframe: ๋ด ์ ๋ณด | Built: ๋ด ์ ๋ณด | Wireframe: ์น๊ตฌ ์ถ๊ฐ | Built: ์น๊ตฌ ์ถ๊ฐ |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. ๋ด ์ ๋ณด: the profile card, the week grid of classes, the switches "์น๊ตฌ์ ์์น ๊ณต์ " and "๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ๊ณต์ ", ์น๊ตฌ ๊ด๋ฆฌ, "๋ก๊ทธ์์" and a bell for notifications. ์น๊ตฌ ๊ด๋ฆฌ: every Friend with a sharing switch and "์น๊ตฌ ๋๊ธฐ". ์น๊ตฌ ์ถ๊ฐ: "๋ด ์น๊ตฌ ID", a Friend ID field with "์ฐพ๊ธฐ" and "์ถ๊ฐ", and "์ด๋ ๋งํฌ ๋ณด๋ด๊ธฐ".
- The User can flip the switches (a missing permission is explained first, then the system prompt opens), and answer "์๋ฝ", "๊ฑฐ์ ", "์น๊ตฌ ๋๊ธฐ" and "๋ก๊ทธ์์" with a confirmation.
- Failure cases. "์์น ๊ถํ์ ํ์ฉํด์ผ ๊ณต์ ํ ์ ์์ด์". "์บ ํผ์ค ๋ฐ์ด๋ผ ์์น๊ฐ ๊ณต์ ๋์ง ์์์". "์ด ์น๊ตฌ ID๋ฅผ ๊ฐ์ง ์ฌ๋์ด ์์ด์", "๋ด ์น๊ตฌ ID์์", "{name}๋๊ณผ๋ ์ด๋ฏธ ์น๊ตฌ์์".
- Differs from the wireframe. There are no ๋น๊ณต๊ฐ ๊ตฌ์ญ, ์๋ฆผ ์ค์ , ์นํ ์น๊ตฌ or ์ฐจ๋จ.
UI-10 The timetable
| Wireframe | Built | Wireframe: overlap | Built: overlap |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Shows. Each class with its weekdays, times, building and room, and "+ ์์ ์ถ๊ฐ". The class form has ๊ณผ๋ชฉ๋ช , ์์ผ, ์์ยท์ข ๋ฃ ์๊ฐ, ์ฅ์ (the Place picker) and ๊ฐ์์ค.
- The User can add, edit and delete a class. Today's classes then appear as "๊ฐ์" in the list on the map.
- Failure cases. "์ข ๋ฃ ์๊ฐ์ด ์์ ์๊ฐ๋ณด๋ค ๋ฆ์ด์ผ ํด์". An overlap is a warning, not a refusal: "{course}์ ์๊ฐ์ด ๊ฒน์ณ์ ยท ๊ทธ๋๋ก ์ ์ฅํ ์ ์์ด์". "์์ ์ 15๊ฐ๊น์ง ๋ฃ์ ์ ์์ด์".
- Differs from the wireframe. ์ด๋ฏธ์ง๋ก ๋ถ๋ฌ์ค๊ธฐ and ๋น ์๊ฐ ๋งํ๊ธฐ answer "์ค๋น ์ค์ด์์".
UI-11 Admin site
A web page for Administrators, without a wireframe.
- Shows. The event list: Drafts with what publishing still needs, and published events. An event page with title, description, start and end, place name, a position picker on a map, the original text and the source link. The pages Places, Collection (each source's last success and failure), Users and Administrators.
- The Administrator can sign in with Google, enter a new event by hand, and save, publish, discard or cancel an event.
- Failure cases. A person who is not an Administrator is refused at sign-in. Publishing without a start time or a position names what is missing. Saving over someone else's change asks to reload.
Planned screens (wireframes only)
| AI chat | ์ค๋์ ๋ฐ์๊ตญ | Private Event | Private Zones |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |














































