Lessons Learned from Behrend Hackathon 2026 | RedScare Project Insights

Participating in Behrend’s 2026 Hackathon this past Saturday (4/11) was one of my most rewarding learning experiences I’ve had as an emerging computer science professional. In 12 hours, my teammate – Jamie Frantz (a Computer Science third-year) – and I designed and developed RedScare – a period tracking and health insights web application focused on creating a more thoughtful, user-centered approach to women’s health.

Our goal was simple but meaningful: build a platform that goes beyond basic cycle tracking and instead helps users understand their bodies. Many existing apps prioritize data collection, but fewer emphasize interpretation and personalization. We wanted to change that. We developed core features including:

  • Cycle and symptom tracking
  • An interactive insights dashboard for visualizing trends
  • AI-powered data analysis to provide personalized health insights

Using HTML (EJS), CSS, JavaScript, and Supabase, we built a responsive front-end and backend infrastructure. For data interpretation, we integrated an Anthropic Opus 4.2 API from Penn State’s AIStudio Pilot to generate user-friendly insights from user-tracked data.

GIF of RedScare Calendar page

Pictured above: GIF of the RedScare dashboard and calendar (created by author).

Key Lessons I’ve Learned:

1. User-Centered Design Matters More Than Features
In a time-constrained event, we initially thought to build as many features as possible. However, we quickly realized that clarity and usability had a greater impact than complexity. Designing an intuitive dashboard for visualizing trends was more valuable than adding extra, less-refined functionality. We honed in on a few major components rather than the quantity.

2. AI is a Tool, Not a Shortcut
Using AI to analyze health data added real value, but only when paired with thoughtful prompting and validation. AI-generated insights accurate and easy to understand. We had to figure out how to responsibly curate prompts to give a consistent output outlining the same features every time. We also made it so the user could click to request the insight, making the feature completely optional. Here is an example output displaying our clear sections per user-requested analysis:

Image displaying RedScare Period Tracker's "Health" page, which entails an AI Health Insight Snapshot

Pictured above: Image of the RedScare AI Health Insights (Anthropic Opus 4.2 API) on Health page (created by author).

This is a segment of how we prompted the LLM API to create this type of layout from the on-click request! If you would like to reference out repository (listed below), this is from public/js/modules/health.js:

return `You are a knowledgeable and empathetic health assistant specializing in menstrual health. Analyze the following cycle data and provide personalized insights. Consider cycle length, period length, flow intensity, and logged symptoms, notes, and moods. Be warm, body-positive, and informative. Do NOT provide medical diagnoses. Flag symptoms that may warrant attention, but always encourage the user to seek professional advice for concerns.

USER DATA (last 60 days):
- Total daily logs: ${totalLogs}
- Cycles tracked: ${cycles.length}
- Average cycle length: ${avgCycleLen} days
- Average period length: ${avgPeriodLen} days
- Average flow intensity: ${avgFlowIntensity} / 4
- Discharge Patterns: ${dischargeSummary}

SYMPTOM FREQUENCY:
${Object.entries(recentSymptoms).sort((a, b) => b[1] - a[1]).map(([s, c]) => `  ${s}: ${c} times`).join('\n')}

MOOD FREQUENCY:
${Object.entries(recentMoods).sort((a, b) => b[1] - a[1]).map(([m, c]) => `  ${m}: ${c} times`).join('\n')}

FLAGGED CONCERNS:
${flagSummary || 'None detected'}

Provide an assesment on symptoms, causes, and actions to take for cycle length, period length, flow intensity, and logged symptoms, notes, and moods. Format reponse as follows:
**Your Health Snapchot**
1-2 sentence personable intro
**Cycle Length**
3-5 sentence assessment of symptoms, causes, and actions to take for the user's average cycle length. If relevant, emphasize individual cycle lengths that vary significantly from their average.
**Period Length**
3-5 sentence assessment of symptoms, causes, and actions to take for the user's average period length. If relevant, emphasize individual period lengths that vary significantly from their average.
**Flow Intensity**
3-5 sentence assessment of symptoms, causes, and actions to take for the user's average flow intensity. If relevant, emphasize individual flow intensities that vary significantly from their average.
**Discharge Patterns**
3-5 sentence assessment of symptoms, causes, and actions to take for the user's discharge patterns. If relevant, emphasize individual discharge patterns that vary significantly from their average.
**Symptoms and Moods**
3-5 sentence assessment of symptoms, causes, and actions to take for logged symptoms, notes, and moods. If relevant, emphasize symptoms that may warrant their healthcare provider's attention.

Keep the response concise (under 300 words), warm, and empowering.`
}

async function fetchLLMInsights(prompt) {
    const response = await fetch('/api/llm-insights', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ prompt })
  })

  if (!response.ok) throw new Error(`API error: ${response.status}`)

  const data = await response.json()
  return data.content[0].text
}

/**
 * Render the LLM response in the UI
 */
function renderAIResponse(responseText) {
  const placeholder = document.getElementById('health-ai-placeholder')
  const responseContainer = document.getElementById('health-ai-response')
  const responseContent = document.getElementById('ai-response-content')

  if (placeholder) placeholder.hidden = true
  if (responseContainer) responseContainer.hidden = false

  // Simple markdown-like rendering (paragraphs and bold)
  const html = responseText
    .split('\n\n')
    .filter(p => p.trim())
    .map(p => {
      let text = p.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
      text = text.replace(/\n/g, '<br>')
      return `<p>${text}</p>`
    })
    .join('')

  if (responseContent) responseContent.innerHTML = html

Project Snapshot:

Tech Stack: HTML (EJS), CSS, JavaScript, Supabase, Anthropic API
Focus Areas: Women’s health, data visualization, AI-assisted insights
Repository: https://github.com/moekoch/RedScare

This hackathon pushed me to think critically about how technology can empower users – especially in areas like women’s health, where thoughtful design and privacy are essential. RedScare was more than just a project; it was a reminder that impactful software is built at the intersection of technical skill, empathy, and intentional design.

As I continue developing my skills in computer science and management information systems, I’m especially interested in building tools that transform data into meaningful, human-centered insights.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *