The public-facing website for the ELDORA ecosystem β a single-page marketing site that showcases the caregiver app, hosts a dynamic APK download route that always resolves the latest GitHub Release, and provides Google Play-required legal pages.
π Live Site Β· π€ DoraBot Β· βοΈ Backend Β· π± Mobile App
Eldora-Frontend is the public web presence of the ELDORA eldercare ecosystem. It serves three purposes: communicate the product story to families and caregivers, provide a /download endpoint that always resolves to the newest APK asset from GitHub Releases, and host the Privacy Policy and Account Deletion pages required for Google Play Store compliance.
Eldora-Frontend's role in the ELDORA ecosystem: "The storefront β the first place families learn about ELDORA, and the one URL that always hands them the latest app."
| Framework | Next.js 16 (App Router) |
| Language | TypeScript 5.9 |
| Styling | Tailwind CSS 3.4 |
| Animation | Framer Motion 12 + GSAP 3.13 |
| Icons | Phosphor Icons (React) |
| Site URL | https://eldora.my.id |
Eldora-Frontend is the public storefront for the ecosystem β it links visitors directly to the mobile app download:
ELDORA Ecosystem
βββ π‘οΈ DoraShield β Fall detection wearable (ESP32)
βββ π€ DoraBot β AI voice companion (ESP32-S3)
βββ βοΈ Eldora-Backend β API server & orchestration
βββ π§ Eldora-AI-Pipeline β Voice AI service
βββ π± Eldora-Mobile β Caregiver app (the product this site promotes)
βββ π Eldora-Frontend β Marketing site + APK download (this repo)
- π Hero Section β full-viewport landing with GSAP-animated floating phone mockups, an orbital ring decoration, and a Framer Motion scroll-progress bar fixed at the top of the page
- π£ Animated Marquee β continuously scrolling strip of ELDORA feature keywords, driven by GSAP
- π Features Section β three pillar cards (DoraShield alerts, Device status, Wellness summaries) with
whileInViewfade-up animations - π± Mobile Preview Showcase β six phone mockup frames arranged as an editorial layout, plus a second auto-scrolling mockup carousel below using Framer Motion
- πͺ How It Works β three numbered steps walking visitors through DoraBot pairing and monitoring
- π₯ APK Download CTA β a prominent download section linking to
/download, which dynamically resolves the latest release asset from theEldoraaa/Eldora-MobileGitHub repository and redirects visitors via HTTP 302 - π Privacy Policy β full privacy policy page (
/privacy) for Google Play Store compliance - ποΈ Account Deletion β guided account deletion page (
/account-deletion) explaining the in-app deletion flow, meeting Google Play data deletion requirements - π Full SEO & Open Graph β canonical URL, OG image (screen-1.jpg), Twitter large card,
application/ld+jsonschema.orgSoftwareApplicationstructured data, complete favicon set withsite.webmanifest - πΌοΈ Next.js Image Optimization β AVIF and WebP format negotiation via
next.config.ts
| Layer | Technology | Purpose |
|---|---|---|
| Framework | Next.js 16 (App Router) | SSR + static pages, API routes |
| Language | TypeScript 5.9 | Type-safe component and data authoring |
| Styling | Tailwind CSS 3.4 | Utility-first CSS, custom design tokens |
| UI Animation | Framer Motion 12 | Scroll progress bar, parallax hero, whileInView fade-up transitions, mockup carousel |
| DOM Animation | GSAP 3.13 | Floating elements, pulsing ring, orbital decoration, marquee scroll |
| Icons | Phosphor Icons React 2.1 | Lightweight icon components |
| Image Optimization | Next.js <Image> + AVIF/WebP |
Responsive, format-negotiated image delivery |
| Font | Inter (system stack) | Clean, readable sans-serif for medical/care context |
Eldora-Frontend/
β
βββ π app/ # Next.js App Router
β βββ layout.tsx # Root layout β full SEO metadata (OG, Twitter card,
β β # canonical, favicon, viewport, theme color)
β βββ page.tsx # Landing page β hero, marquee, features, preview,
β β # how-it-works, APK CTA, footer
β βββ globals.css # Tailwind base layers + global resets, Inter font
β βββ π download/
β β βββ route.ts # Dynamic API route β fetches GitHub Releases API,
β β # redirects (302) to latest .apk asset; falls back to
β β # hardcoded v1.0.0-build.24 if API is unavailable
β βββ π privacy/
β β βββ page.tsx # Privacy Policy page (Google Play requirement)
β βββ π account-deletion/
β βββ page.tsx # Account Deletion page (Google Play requirement)
β
βββ π src/
β βββ π components/common/
β β βββ PhoneMockup.tsx # Phone frame component β rounded bezel, dynamic island
β β β # notch, screenshot image via next/image
β β βββ MiniIcon.tsx # Section icon variants (shield, device, care, scene)
β β βββ index.ts # Barrel export
β βββ π constants/
β βββ data.tsx # All site copy, URLs, mockup paths, hero stats,
β # pillars, features, steps, marquee items, fadeUp variant
β
βββ π public/
β βββ π brand/ # eldora_logo.png, eldora_logo_nobg.png
β βββ π favicon_io/ # Full favicon set + apple-touch-icon + site.webmanifest
β βββ π illustrations/ # Feature illustration PNGs (care, alerts, wellness, welcome)
β βββ π mockups/ # App screen screenshots (screen-1.jpg β¦ screen-6.jpg)
β
βββ π next.config.ts # Image formats: AVIF + WebP
βββ π postcss.config.js # Tailwind + Autoprefixer
βββ π package.json
In plain English:
Visitor lands on eldora.app
β sees hero with animated phone mockups
β scrolls through feature pillars, mockup carousel, how-it-works steps
β clicks "Download latest APK"
β browser hits GET /download (Next.js API route)
β server fetches GitHub Releases API (5-minute cache)
β finds the first asset whose name ends in .apk
β 302 redirect β visitor downloads the APK directly
β alternatively: clicks "View GitHub release" β github.com/Eldoraaa/Eldora-Mobile/releases/latest
The site uses a custom set of Tailwind color tokens defined in tailwind.config (referenced throughout page.tsx):
| Token | Role | Appearance |
|---|---|---|
eldora-coral |
CTAs, section eyebrows, hover states | Warm red-orange (#D95545) |
eldora-text |
Primary headings and body text | Deep charcoal (#17202A) |
eldora-muted |
Subheadings and descriptive text | Medium grey |
eldora-soft |
Card backgrounds, icon containers | Pale warm cream |
eldora-mint |
Accent highlights, orbit dot | Soft green (rgba(168,216,194,β¦)) |
eldora-line |
Borders, dividers | Light neutral |
eldora-warm |
Gradient card backgrounds | Warm off-white to cream |
Background: #FDF8F5 β a warm off-white used consistently across all pages and the html element.
Typography: Inter, system-ui fallback chain. All headings use negative tracking (tracking-[-0.07em] to tracking-[-0.105em]) and heavy weight (font-black) for editorial density.
Animation strategy:
- GSAP handles continuous loops:
gsap-float(gentle vertical drift),gsap-pulse(scale breathe),gsap-orbit(360Β° rotation over 36 s), and the text marquee (xPercent: -50over 30 s) - Framer Motion handles scroll-reactive effects:
useScroll+useTransformfor hero parallax (heroY,heroRotate) and the background glowglowScale, pluswhileInViewfade-up for all content sections
The /download route (app/download/route.ts) is the only server-side dynamic behavior in the project:
GET /download
β fetch https://api.github.com/repos/Eldoraaa/Eldora-Mobile/releases/latest
{ Accept: application/vnd.github+json, next: { revalidate: 300 } }
β find first asset where name.endsWith('.apk')
β 302 redirect to asset.browser_download_url
β fallback: redirect to hardcoded v1.0.0-build.24 APK URL
The route is marked export const dynamic = "force-dynamic" so it never serves a stale cached response for the redirect target. The revalidate: 300 applies only to the GitHub API fetch, caching that response for 5 minutes to avoid hitting GitHub rate limits on high traffic.
Both pages are required for Google Play Store listing compliance:
| Route | Page | Purpose |
|---|---|---|
/privacy |
Privacy Policy | Explains what data ELDORA collects (account info, device/safety data, notifications, wellness summaries), why it's collected, and how users can control or delete it. Last updated: June 9, 2026 |
/account-deletion |
Account Deletion | Guides users through the in-app account deletion flow and explains what data is removed |
These pages share the same warm cream background (#FDF8F5) and design system as the landing page, with a "Back to Eldora" link in the header.
# 1. Clone the repository
git clone https://github.com/Eldoraaa/eldora-frontend.git
cd eldora-frontend
# 2. Install dependencies
npm install
# 3. Start the dev server
npm run devThe site starts at http://localhost:3000.
npm run build # Production build
npm run start # Start production server (after build)
npm run typecheck # TypeScript type check without emittingnpm run typecheck # runs tsc --noEmitβΉοΈ No
.envfile is needed. The APK download route fetches the GitHub Releases API without authentication β the public rate limit (60 req/hour per IP) is sufficient given the 5-minute revalidation window.
APK download redirects to fallback instead of latest release
The /download route falls back to the hardcoded v1.0.0-build.24 APK URL when the GitHub Releases API returns a non-OK response. This can happen if:
- The
Eldoraaa/Eldora-Mobilerepository has no published releases - GitHub's API rate limit (60 req/hour unauthenticated) is exceeded
- The latest release has no
.apkasset attached
To fix: publish a release on Eldoraaa/Eldora-Mobile with an .apk file attached as a release asset. The route will pick it up on the next request (within the 5-minute revalidation window).
GSAP animations not playing on first load
GSAP animations in page.tsx run inside a useEffect with a gsap.context() scoped to pageRef. If animations don't play:
- Confirm the page renders as a Client Component (
"use client"at line 1 ofpage.tsx) - Confirm GSAP is installed:
npm installshould includegsap@^3.13.0 - Check the browser console for
gsap is not definederrors
Phone mockup images not loading
PhoneMockup renders screenshots from public/mockups/screen-1.jpg through screen-6.jpg. If images show broken:
- Verify the files exist in
public/mockups/ - Next.js serves
public/files at the root path βscreen-1.jpgmaps to/mockups/screen-1.jpg - The
priorityprop is set forscreen-1.jpgto preload the above-the-fold hero image
Eldora-Frontend is the public face of ELDORA, a privacy-first elderly safety ecosystem designed for ASEAN aging populations. The full system follows the Protect β Respond β Recover framework:
| Phase | Component | Role |
|---|---|---|
| π‘οΈ Protect | DoraShield (ESP32) | Fall detection wearable β hardware safety layer |
| π€ Respond | DoraBot (ESP32-S3) | AI voice companion β audio capture and playback |
| π§ Voice AI | Eldora-AI-Pipeline | STT β LLM β Intent β Emotion β TTS |
| βοΈ Orchestrate | Eldora-Backend | API server, device commands, FCM push |
| π± Recover | Eldora-Mobile | Caregiver app β safety alerts and monitoring |
| π Showcase | Eldora-Frontend (this repo) | Marketing site + APK download |
ELDORA β BINUS BM Team Passage to ASEAN Hackathon 2026
| Name | Role |
|---|---|
| Stanley Nathanael Wijaya | Team Lead |
| Lutfi Alvaro Pratama | IoT Engineer |
| Andrian Pratama | Mobile Developer |
| Khalisa Amanda Sifa Ghaizani | Backend Developer |
| Devon Nicholas | AI Engineer |
Have questions, want to collaborate, or interested in ELDORA?
| Channel | Details |
|---|---|
| π§ Email | stanley.n.wijaya7@gmail.com |
| @xstynwx | |
| π¬ Discord | stynw7 |
This project is licensed under the MIT License β free to use, modify, and distribute.
MIT License
Copyright (c) 2026 ELDORA β BINUS BM Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software.
ELDORA Component Map
| Repository | Component | Status |
|---|---|---|
eldora-dorashield |
π‘οΈ Fall detection wearable | π |
eldora-dorabot |
π€ Voice companion firmware | π |
eldora-mobile |
π± Caregiver mobile app | π |
eldora-backend |
βοΈ API server & orchestration | π |
eldora-ai-pipeline |
π§ Voice AI service | π |
eldora-frontend |
π Marketing site + APK download | β This repo |
"Stay safe. Stay connected. Stay supported."
Made with π€ by BINUS BM Team π₯
