A real-time web dashboard that monitors Google Play Store app listings by displaying periodically captured screenshots from the backend service.
It automatically updates live via Server-Sent Events (SSE) whenever the backend captures a new screenshot β no refresh or polling required.
π PlayStore Monitoring Dashboard β Live Site
β
Real-time updates using Server-Sent Events (SSE)
β
Automatic refresh of app screenshots when backend updates the database
β
Add new app via Play Store URL β triggers backend screenshot capture
β
Sidebar with monitored apps
β
Screenshot timeline with newest first
β
Loading indicators for better UX
β
Built with React + TypeScript + Vite
| Layer | Tech |
|---|---|
| Framework | React 18 |
| Language | TypeScript |
| Build tool | Vite |
| API client | Axios |
| Real-time updates | Server-Sent Events (SSE) |
| Styling | Simple CSS |
frontend/ βββ src/ β βββ api/ β β βββ api.ts # Axios API client β βββ components/ β β βββ AddAppForm.tsx # Add new Play Store app β β βββ AppSidebar.tsx # Sidebar with app list β β βββ ScreenshotTimeline.tsx # Displays screenshots chronologically β β βββ ScreenshotCard.tsx # Individual screenshot UI β βββ pages/ β β βββ Dashboard.tsx # Main dashboard logic β βββ App.tsx β βββ main.tsx β βββ index.css βββ package.json βββ vite.config.ts Make sure you have:
- Node.js β₯ 18
- npm β₯ 9
- The backend service running at
http://56.228.15.190
npm installConfigure environment variables
VITE_API_URL=http://56.228.15.190/api/ npm run dev Then open your browser at: π http://localhost:5173
-
Paste a Play Store URL (e.g. https://play.google.com/store/apps/details?id=com.activision.callofduty.shooter)
-
Enter an app name
-
Click βAdd Appβ
The backend captures a screenshot, saves metadata to the database, and streams the new image to the dashboard.
- The first app in the sidebar loads automatically on page load.
- Screenshots are displayed in descending order (newest first).
- When the backend captures new screenshots (cron job), the timeline updates instantly via SSE.
No polling or manual refresh β the frontend subscribes to the backendβs SSE stream:
GET /api/events Whenever a new screenshot is saved, the backend broadcasts a JSON event like:
{ "appId": "com.activision.callofduty.shooter", "appName": "Call of Duty Mobile", "imageUrl": "/public/screenshots/com.activision.callofduty.shooter/...png", "capturedAt": "2025-10-29T12:50:32.345Z" } The frontend receives and renders it immediately.
| Task | File | Description |
|---|---|---|
| Fetch apps | Dashboard.tsx | Loads /api/apps on mount |
| Select first app | Dashboard.tsx | Auto-selects first app and fetches its screenshots |
| Add new app | AddAppForm.tsx | Calls /api/screenshot |
| Fetch screenshots | Dashboard.tsx | Calls /api/screenshots/:appId |
| Live updates | EventSource in Dashboard.tsx | Listens for /api/events |
| Render UI | ScreenshotTimeline.tsx + ScreenshotCard.tsx | Displays screenshots visually |
| Action | Backend Endpoint | Method | Description |
|---|---|---|---|
| Add new app | /api/screenshot | POST | Triggers capture and saves metadata |
| Get apps | /api/apps | GET | Returns all monitored apps |
| Get screenshots | /api/screenshots/:appId | GET | Returns all screenshots for one app |
| Live updates | /api/events | GET (SSE) | Pushes new screenshot events |
Dashboard UI
+-----------------------------------------------------+ | Monitored Apps | Play Store Monitoring | |-----------------------|------------------------------| | Call of Duty Mobile | [Add App Form] | | Clash of Clans | [Screenshot Timeline] | | ... | [Latest Screenshot β] | +-----------------------------------------------------+ - The first app in the list automatically loads on page initialization.
- The system uses Server-Sent Events (not WebSockets) for simplicity and efficiency.
- No setInterval or polling is used anywhere β updates are push-based.
- When the backend cron captures new screenshots, the dashboard reflects them in real time.
- You can extend this UI with Material UI, Tailwind, or Recharts for analytics.
- π βLast updatedβ indicator for each app
- π Diff-viewer (highlight what changed between screenshots)
- π Screenshot cleanup / retention control
- π§ Filter and search apps
- π§± Authentication & user management