Project Info
Inspiration
We come from Indonesia, a country that sits on the collision of two tectonic plates. Natural disasters are not abstract to us, they are part of life. Some of the deadliest events in human history happened in our region. The 1883 eruption of Krakatoa altered the global climate. The 1931 Yangtze River floods killed an estimated several million people, one of the deadliest disasters ever recorded. The 2010 Haiti earthquake killed roughly 300,000. Behind every one of those numbers is a family that lost someone, often because help could not find them in time. That is the gap we kept coming back to. In a disaster, the problem is rarely that no one cares. It is that no one knows where you are. Pair that with the rise in kidnappings across the US and Asia, and the same truth holds: the faster someone knows your exact location, the better your odds. We wanted to build the simplest possible tool that closes the distance between "something is wrong" and "someone knows where I am."
What it does
LifeTap is a physical panic button built from an Arduino, a Raspberry Pi 3, a buzzer, and a GPS module. When you are in trouble, you press the button. Two things happen at once. An 80 decibel buzzer sounds for 30 seconds to draw immediate attention and disorient a potential attacker. At the same time, the device captures your GPS coordinates and sends a pinpoint location to your emergency contact over WhatsApp, complete with a Google Maps link so they can navigate straight to you. It doesnt need a user to unlock a phone. No opening an app. No dialing. One press, and the people who can help you know exactly where you are.
How we built it
The Raspberry Pi 3 is the brain. It runs the main logic, handles the GPS processing, and acts as the transmitter that sends the alert out over WhatsApp. The Arduino is the receiver layer, reading the GPS coordinates and the button state and passing them to the Pi. A green status LED pulses to signal that the device is connected and working, so the user always knows it is armed and ready. The flow is simple by design. The GPS module acquires a satellite fix and feeds coordinates to the Arduino. The Arduino relays the button press and the coordinates to the Pi over a serial connection. The Pi packages the location into a message and sends it out. The buzzer fires the instant the button is pressed, before any of the networking happens, so the alarm never waits on a signal.
Challenges we ran into
We forgot a dedicated transmitter module. Rather than stall, we improvised, wiring the Raspberry Pi and Arduino together over USB serial and using that as our communication link. It worked, and it actually made the system simpler. We hit complications getting a Twilio phone number provisioned in time, so we pivoted from SMS to WhatsApp for the alert delivery. WhatsApp turned out to be easier to integrate and works internationally, which fits our disaster-response use case better anyway. GPS was harder than we expected. Getting a reliable satellite fix, especially indoors at the venue, taught us a lot about the limits of consumer GPS hardware and forced us to think about fallback behavior.
Accomplishments we're proud of
We built a complete, working system in 24 hours. The connections hold, the button triggers the buzzer, the GPS acquires coordinates, and the alert reaches a phone over WhatsApp with a working map link. Every time we hit a wall, we improvised a path through it instead of cutting the feature. Walking up to the table with hardware that actually fires end-to-end, on our own wiring, is the thing we are proudest of.
What we learned
GPS and satellite connectivity are genuinely hard. Getting a fix depends on conditions you do not control, and building around that uncertainty is its own engineering problem. We also learned that WhatsApp integration is far simpler than carrier SMS for getting a location message onto someone's phone quickly, especially across borders. Most of all, we learned that improvising under a deadline is a skill, and that a simpler design that works beats an elegant design that does not.
What's next
We want LifeTap to connect directly to the nearest emergency services and post a live, continuously updating location, which means working with local government and dispatch systems rather than just private contacts. On the hardware side, we want to make the device smaller, cheaper, and longer-lasting on a single charge, and add a true satellite uplink so it works in the remote and disaster-struck areas where cell coverage disappears exactly when it matters most.
LifeTap Website
Public launch site for LifeTap — a hardware panic button that sends GPS coordinates via SMS on one press.
Built for Y Combinator outreach, investor demos, waitlist signups, and product documentation.
Features
- Scroll-driven Two Futures story (with / without LifeTap)
- Hardware prototype section with specs, blueprints, and architecture diagrams
- Crisis stats, SMS mockup, and 911 comparison table
- Docs hub (
/docs) with hackathon guide, architecture, and roadmap - Waitlist API stub, Calendly demo booking, mobile-first nav
Stack
- Next.js 16 (App Router)
- TypeScript
- Tailwind CSS 4
- Framer Motion + GSAP ScrollTrigger + Lenis
- Poppins via
next/font
Quick start
npm install
cp .env.example .env.local
npm run dev
Open http://localhost:3000.
Scripts
| Command | Description |
|---|---|
npm run dev | Development server |
npm run build | Production build |
npm run start | Serve production build |
npm run lint | ESLint |
Project structure
lifetap_website/
├── content/ # Markdown source for docs pages
├── docs/ # Internal project documentation
├── public/images/ # Hero, prototype blueprints, OG image
├── src/
│ ├── app/ # Routes, layout, API, docs
│ ├── components/
│ │ ├── layout/ # Nav, footer, smooth scroll
│ │ ├── sections/ # Homepage sections
│ │ └── ui/ # Reusable UI pieces
│ ├── constants/ # Copy, stats, image paths
│ ├── lib/ # Utilities
│ └── types/ # Shared TypeScript types
└── .env.example # Environment template
Environment variables
| Variable | Description |
|---|---|
NEXT_PUBLIC_SITE_URL | Canonical site URL (OG tags, sitemap) |
See .env.example for waitlist provider placeholders (Resend, Supabase, webhook).
Waitlist API
POST /api/waitlist with { "email": "..." } — stub ready for your email provider or database.
Docs
- Live docs:
/docson the site - Architecture
- Assets guide
- Content & copy
- Deployment
- Roadmap
Deploy from GitHub
This repo is ready to host. Recommended: Vercel (free, built for Next.js).
- Push this repo to GitHub (see below).
- Go to vercel.com/new → Import Git Repository.
- Select LifeTap-Website → Deploy (defaults work).
- In Vercel → Settings → Environment Variables, add:
NEXT_PUBLIC_SITE_URL=https://your-domain.vercel.app - Redeploy. Your site is live.
GitHub Actions runs npm run build on every push to main so broken builds are caught before deploy.
Note: GitHub Pages alone does not support this app (Next.js API routes + server features). Use Vercel, Netlify, or any Node.js host.
See docs/DEPLOYMENT.md for custom domains and waitlist setup.
Push to GitHub
gh auth login
./scripts/publish-github.sh
Or manually:
git remote add origin git@github.com:YOUR_USERNAME/LifeTap-Website.git
git push -u origin main
Deploy (other hosts)
License
All rights reserved — LifeTap Technologies © 2026
Analysis
View
Metric
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- Next.jsIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
- C++Claimed
- HTMLClaimed
- PythonClaimed
- VercelClaimed
5 of 9 appear in the indexed code. 4 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig
- CodexConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
180 KB
Source files
74
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
ShadowEsu/LifeTap-website
100 files · 4.0 MB · @ f5dfea8
Structure
Interface
42 files · 42%Screens, components and styles rendered to the user.
API & routing
1 file · 1%Request entry points: routes, handlers and controllers.
Application logic
9 files · 9%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript75%
- Markdown22%
- CSS2%
- Shell0%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 16- @gsap/react
- framer-motion
- gsap
- lenis
- next
- react
- react-dom
- server-only
- +8 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Crisis stats, SMS mockup, and 911 comparison tableVerified
Crisis stats, SMS mockup, and 911 comparison table sections
Claimed on readmehigh confidencesrc/components/sections/StatsSection.tsx— Stats section component presentsrc/components/sections/SMSMockup.tsx— SMS mockup UI component present, showing simulated message with map link copysrc/components/sections/ComparisonTable.tsx— Comparison table component present (911 comparison)
Docs hub at /docs with hackathon guide, architecture, roadmapVerified
Docs hub (/docs) with hackathon guide, architecture, and roadmap
Claimed on readmehigh confidencesrc/app/docs/[slug]/page.tsx— Dynamic docs route renders markdown content via getDocContentcontent/hackathon-guide.md— Hackathon guide markdown content existscontent/ARCHITECTURE.md— Architecture doc content existscontent/ROADMAP.md— Roadmap doc content exists
Hardware prototype section with specs, blueprints, diagramsVerified
Hardware prototype section with specs, blueprints, and architecture diagrams
Claimed on readmehigh confidencesrc/components/sections/PrototypeSection.tsx— Prototype section component presentsrc/components/sections/HardwareBlueprint.tsx— Hardware blueprint component rendering diagram imagespublic/images/prototype/system-blueprint.png— Blueprint image assets used in the prototype section
Marketing website built with Next.js, TypeScript, Tailwind, Framer Motion, GSAP, LenisVerified
Public launch site built with Next.js 16, TypeScript, Tailwind CSS 4, Framer Motion, GSAP ScrollTrigger, Lenis, Poppins font
Claimed on readmehigh confidencepackage.json:14— Dependencies list next, framer-motion, gsap, @gsap/react, lenis, react matching the claimed stacksrc/components/layout/SmoothScrollProvider.tsx— Lenis-based smooth scroll provider is wired into layoutsrc/app/layout.tsx— References buzzer/GPS copy and Poppins font setup for the site shell
Mobile-first navigationVerified
Mobile-first nav
Claimed on readmemedium confidencesrc/components/layout/Navigation.tsx— Navigation component presentsrc/components/layout/MobileBottomBar.tsx— Dedicated mobile bottom bar component indicates mobile-first nav handling
Scroll-driven Two Futures story sectionVerified
Scroll-driven Two Futures story (with / without LifeTap)
Claimed on readmehigh confidencesrc/components/sections/TwoFutures.tsx— Dedicated component implementing the two-futures scroll sectionsrc/components/sections/TwoFuturesMobile.tsx— Mobile variant of the same section exists
Waitlist API stubVerified
Waitlist API stub ready for email provider or database (POST /api/waitlist)
Claimed on readmehigh confidencesrc/app/api/waitlist/route.ts:5— POST handler validates email and logs it; explicit TODO comment shows it is an unconnected stub, matching the README's own description
80dB buzzer alarm on button pressClaimed only
An 80 decibel buzzer sounds for 30 seconds when the button is pressed
Claimed on Devposthigh confidenceArduino/Pi serial communication and status LEDClaimed only
Arduino relays button press and GPS coordinates to the Raspberry Pi over USB serial; a green status LED pulses to show the device is armed
Claimed on Devposthigh confidenceCalendly demo booking integrationClaimed only
Calendly demo booking
Claimed on readmemedium confidenceGPS coordinate capture and WhatsApp alert with Google Maps linkClaimed only
The device captures GPS coordinates and sends a pinpoint location to an emergency contact over WhatsApp with a Google Maps link
Claimed on Devposthigh confidencePhysical panic button hardware (Arduino + Raspberry Pi + buzzer + GPS)Claimed only
LifeTap is a physical panic button built from an Arduino, a Raspberry Pi 3, a buzzer, and a GPS module
Claimed on Devposthigh confidenceTwilio/SMS alert deliveryClaimed only
Built with Twilio; README describes sending GPS coordinates via SMS on one press
Claimed on readmehigh confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.