vCamp logo
HIRE
ME
Case study

Mi Equipo LPF
Frictionless matchday intelligence.

A real-time, mobile-first football companion that answers Argentina's most frequent fan question in zero clicks: When does my team play?

Open app demo
Mi Equipo LPF team selection interface
App Demo
Role

Product Designer & Full-stack Engineer

Type

Sports Tech / Progressive Web Application / Fan Utility

Stack

TypeScript, React 18, Vite, Express.js, Tailwind CSS, ESPN Scoreboard API, iCalendar, Service Worker API, Lucide Icons

Overview

About the project

Mi Equipo LPF is an ultra-fast, mobile-first web application created to strip away the noise of modern sports media: intrusive ads, autoplay videos, gambling banners, and clickbait headlines.

Its sole mission is to provide Argentine football fans with an instantaneous, verified answer to their team's next two fixtures across all official competitions. Official club crests, live countdowns, broadcast details, native alarms, and WhatsApp sharing turn matchday planning into a dependable daily ritual.

The problem

Fragmentation and friction in football scheduling

Argentine football fans navigate constant scheduling friction across local and international calendars:

  • Fixtures scattered across noisy channelsKickoff times are split between social networks, sports portals, club accounts, and search results.
  • Schedule changes are easy to missRescheduling and competition changes make an old screenshot or social post unreliable.
  • Too much friction for one simple answerFans should not need to browse ads and headlines just to know when their team plays.
The solution

A zero-noise, real-time matchday dashboard

I designed and built an installable Progressive Web Application that behaves like a dedicated digital stadium program. A dark navy and slate interface, high-contrast typography, live countdown engines, and server-side aggregation keep the experience fast and focused.

The dashboard pulls verified fixture data across four major tournaments, surfaces venue and broadcast metadata, and gives fans one-tap access to system-level reminders and instant group sharing.

Key features

  • Next two fixtures at a glanceA focused home screen answers the matchday question immediately.
  • Multi-competition coverageLeague, Libertadores, Sudamericana, and Copa Argentina fixtures are normalized into one timeline.
  • Live countdown and verified metadataKickoff, venue, broadcast channels, and home-away context stay together.
  • Dual native calendar alarmsOne tap creates alerts one hour and fifteen minutes before kickoff.
  • Installable mobile experienceService worker support and a focused interface make the app feel at home on the phone.
  • WhatsApp group sharingFixture details can move from the dashboard into the fan group's conversation instantly.
Engineering

Technical highlights

The multi-competition scoreboard aggregator

Rather than scraping brittle HTML tables, the Node/Express backend interfaces directly with ESPN's official scoreboard endpoints. It queries a rolling 75-day window, filters completed encounters, extracts venue and broadcast metadata, and reconciles team IDs into a unified fixture model.

Server-side caching with change detection

An in-memory cache with a 15-minute TTL protects upstream quotas while keeping normal requests fast. An explicit refresh trigger lets users bypass the cache when a reschedule needs to be checked immediately.

// Querying multi-competition feeds and filtering future fixtures const SUPPORTED_LEAGUES = ['arg.1', 'conmebol.libertadores', 'conmebol.sudamericana', 'arg.copa_argentina']; async function fetchLiveFixtures(teamEspnId: number): Promise<Fixture[]> { const dateRange = `${formatDate(now)}-${formatDate(futureLimit)}`; const matches: Fixture[] = []; for (const league of SUPPORTED_LEAGUES) { const response = await fetch(`https://site.api.espn.com/apis/site/v2/sports/soccer/${league}/scoreboard?dates=${dateRange}`); const data = await response.json(); matches.push(...parseLeagueEvents(data.events, teamEspnId)); } return matches.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()).slice(0, 2); }

The client also generates RFC 5545 iCalendar payloads in memory, embedding display alarms for one hour and fifteen minutes before kickoff. This provides reliable locked-screen reminders without requiring an ongoing native background service or paid push infrastructure.

// Embedding dual VALARM triggers for locked-screen alerts const icsContent = [ 'BEGIN:VCALENDAR', 'VERSION:2.0', 'BEGIN:VEVENT', `SUMMARY:Football ${team.name} vs ${opponent}`, `DTSTART:${dtStart}`, `DTEND:${dtEnd}`, 'BEGIN:VALARM', 'TRIGGER:-PT60M', 'ACTION:DISPLAY', 'END:VALARM', 'BEGIN:VALARM', 'TRIGGER:-PT15M', 'ACTION:DISPLAY', 'END:VALARM', 'END:VEVENT', 'END:VCALENDAR' ].join('\\r\\n');
Result

Impact

Mi Equipo LPF transforms a fragmented, ad-saturated search into a frictionless one-second interaction. Fans open their home screen, see the exact countdown, verify the broadcast channel, and add system-level alarms to their phone in a single tap.

The result is a lightweight, dependable matchday companion that respects attention instead of competing for it.

Takeaways

Skills demonstrated

  • Product design for sports utilities
  • React 18 and TypeScript
  • Node.js and Express APIs
  • ESPN scoreboard integration
  • Server-side caching strategy
  • Progressive Web App architecture
  • RFC 5545 calendar generation
  • Mobile-first interaction design
  • Real-time fixture normalization