Dig: A Campus Pulse App for Student Opinion

Every campus has its own personality.

The same question can feel very different depending on where it is asked. What students care about at one university may not match what students are talking about at another. Dig is built around that simple idea: student opinion is more meaningful when it has campus context.

Dig is a mobile app for university communities. It lets students vote on polls, create posts, join discussions, and compare what their own school thinks against the broader student population.

The Big Idea

Dig is designed to answer questions like:

Students sign up with a university email address. Dig uses that email domain to connect them to their school. Once inside, they see a feed of polls, posts, and conversations shaped by both global and campus-specific activity.

That makes Dig more than a generic feed. It is a way to understand the mood of a campus.

How It Works

At the center of Dig is a swipeable card feed.

Students can move through polls and posts, vote yes or no, like content, and open discussions to comment. Polls are especially important because they can show two views at once:

So a question like “Should attendance be mandatory?” becomes more interesting. Dig can show what students think overall, and how one campus compares.

High-Level Architecture

dig_architecture

A Light Technical View

Dig is built as a React Native mobile app backed by AWS services.

The app uses:

The technical design follows the product idea: content is organized by scope.

Some content is global. Some content belongs to a specific school. That distinction allows Dig to compare campus sentiment against the overall student community without making the experience complicated for users.

Data Structure and Identity

Dig’s data model is organized around a simple idea: the same piece of content can have both a broad community view and a campus-specific view.

Polls use a shared poll identity plus a scope. The shared identity represents the question itself, while the scope says where the results belong: overall, or a specific school. That means Dig can ask one question and still keep separate result sets for the wider community and each campus.

In the GraphQL model, that idea shows up in the poll keys:

pollType: String!
  @primaryKey(sortKeyFields: ["pollGroupId"])
  @index(sortKeyFields: ["score"])
  @index(sortKeyFields: ["tag"])
pollGroupId: String! @index

pollType is the scope. It can represent the overall feed or a school-specific feed. pollGroupId is the shared identity for the poll question. Together, they let Dig store multiple versions of the same poll: one for the overall community, and one for each school that needs its own results.

The indexes also support the feed experience. Sorting by score helps Dig fetch ranked polls efficiently, while sorting by tag makes topic-based filtering possible without scanning every poll.

Posts follow a similar pattern. A post can be treated as overall content or school-scoped content, depending on where it should appear. Users also keep lightweight activity references, such as which polls they voted on or which posts they liked, so profile history and duplicate-vote checks stay straightforward.

At a simplified level, the identity model looks like this:

type ContentScope = "overall" | "school";

type PollIdentity = {
  pollGroupId: string; // the shared question
  pollType: string; // "overall" or a school domain
};

type UserActivity = {
  pollVoted: PollIdentity[];
  postLiked: string[];
};

The important design choice is that identity is not just a random ID. Content is identified by both what it is and where it belongs. That gives the app a clean path for campus comparisons without making the feed feel technical to the user.

Keeping the Feed Fresh

Dig ranks content using a simple idea: engagement matters, but time matters too.

A post or poll becomes more visible when people interact with it. As it gets older, it gradually moves down unless it keeps gaining activity. This helps the feed feel current instead of being dominated forever by older popular content.

This is similar to a lightweight “hot ranking” system:

score = (engagement + 1) / (ageInHours + 2)^1.8

In code, the idea is small enough to stay readable:

function calculateScore(engagement, createdAt) {
  const ageInHours = (Date.now() - new Date(createdAt).getTime()) / 36e5;
  return (engagement + 1) / Math.pow(ageInHours + 2, 1.8);
}

For polls, engagement comes from yes and no votes. For posts, engagement comes from likes. The +1 gives new content a starting chance, while the age decay keeps the feed from getting stuck on old popular items.

Design Concepts and UI

Early Design Concept

dig-design

Figma Wireframes

dig-figma-1

dig-figma-2

MVP/Prototype

The working app for iOS, Android, and Webapp can be found here: https://github.com/wjdpark/dig

Why Campus Identity Matters

Most social platforms flatten everyone into one huge crowd. Dig does something different. It treats school identity as a meaningful part of the conversation.

That unlocks a few useful experiences:

Dig is not just asking what people think. It is asking where those opinions are coming from.

The Work

Dig has the potential to become a real-time opinion layer for universities.

It gives students a fast way to understand what their campus thinks, how that compares with other schools, and which conversations are gaining momentum right now.

Dig is a campus-verified social polling app that helps students discover, compare, and discuss what their school community really thinks.