cleanyourtv-app
A community-built phone app for Clean Your TV: clean up an Android TV from your phone. No laptop, no coding agent, nothing uninstalled.
3D simulation for Kelana Jaya LRT, built with Three.js.
OtherHTMLGitHub @Thilak7cOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Railgrid · Kelana Jaya: an interactive 3D control-room dashboard for KJ24 Kelana Jaya LRT station (Kelana Jaya Line, Petaling Jaya, Selangor), built with Three.js.
It renders the elevated station, viaduct, roads, feeder bus hub and Park & Ride in 3D. Driverless 4-car trains run on both tracks, passengers build up on the platforms, and buses come and go. Live panels show station KPIs, train status, crowding, facilities and alerts.
Live demo: https://lrt-3d-simulation.vercel.app
All data is simulated. Nothing is pulled from Rapid KL or any live feed. The timetable, ridership and facility faults are generated in the browser so the demo has something realistic to show.
vendor/, so no CDN is needed.The app is a single HTML file, but it must be served over HTTP. Browsers block ES-module imports from file://, so double-clicking the HTML file shows a blank page.
# 1. Clone the repo
git clone https://github.com/Thilak7c/lrt-3d-simulation.git
cd lrt-3d-simulation
# 2. Start a local web server
python -m http.server 8000
Then open http://localhost:8000/railgrid-kelana-jaya.html in your browser.
Press Ctrl+C in the terminal to stop the server.
npx serve .
Open the URL it prints and click railgrid-kelana-jaya.html.
Install the Live Server extension, right-click railgrid-kelana-jaya.html and choose Open with Live Server.
| Action | Mouse / touch |
|---|---|
| Pan | Left-drag (one-finger drag on touch) |
| Rotate / tilt | Right-drag (two-finger rotate on touch) |
| Zoom | Scroll wheel / pinch |
| Select an object | Click it (the cursor turns into a pointer over clickable things) |
The toolbar on the left side of the map has buttons for: zoom in / out, rotate left / right, reset view and cinematic orbit.
When you zoom in close, the station roof fades out so you can see the platform.
| Key | Action |
|---|---|
/ | Focus the search box |
Enter (in search) | Jump to the first result |
Esc | Clear search and close any open pop-up |
KJ24 Kelana Jaya): jump to any area of the station.Everything runs client-side in railgrid-kelana-jaya.html.
DEM) runs from 0 to 1 by hour. It peaks around 07:00–09:30 and 17:00–20:00.headway()). Trains get small random delays, which feed the on-time KPI and late-arrival alerts.ENTRY_RATE × demand, wait on the platform, and board or alight when a train dwells. Crowding thresholds:
FAC). Fare gate 12 is deliberately faulty to show how alerts look.rng(2024)) makes the layout and starting state the same on every load.The code points out where real data could be plugged in. For example, the headway is marked as a shortcut to replace with a real GTFS feed.
lrt-3d-simulation/
├── railgrid-kelana-jaya.html # The whole app: HTML, CSS and JS (ES module)
├── vendor/
│ └── three/ # Local copy of [email protected] (only the files used)
│ ├── build/
│ │ └── three.module.js
│ └── examples/jsm/
│ ├── controls/ # MapControls.js, OrbitControls.js
│ ├── lines/ # LineSegments2.js, LineSegmentsGeometry.js, LineMaterial.js
│ ├── renderers/ # CSS2DRenderer.js
│ └── utils/ # BufferGeometryUtils.js
├── docs/
│ └── screenshot.png # Screenshot used in this README
├── vercel.json # Serves the app at the site root on Vercel
└── README.md
railgrid-kelana-jaya.htmlThe script is split into sections with banner comments (/* ==== ... ==== */). In order:
MapControls, lighting and shadows.mergeGeometries) to keep draw calls low.Three.js is loaded through an import map that points at the local vendor/ folder:
<script type="importmap">
{"imports":{"three":"./vendor/three/build/three.module.js","three/addons/":"./vendor/three/examples/jsm/"}}
</script>
So the app runs with no internet connection, as long as you serve it from a local server (see Quick start).
The only online resource left is the Inter font from Google Fonts. Offline, the browser falls back to a system font and everything else works the same.
If you move the HTML file, keep the vendor/ folder next to it.
Download the same set of files for the new version from https://cdn.jsdelivr.net/npm/three@<version>/... into vendor/three/.
Check each add-on's own import lines, since add-ons can depend on other add-ons. For example, MapControls.js needs OrbitControls.js.
Newer versions (r171+) also split the core into three.core.js, which must be downloaded too.
The app is a static site, so any static host works. It is deployed on Vercel:
npm i -g vercel # once
vercel login # once
vercel deploy --prod
vercel.json rewrites / to railgrid-kelana-jaya.html, so the site root opens the simulation. No build step or framework setting is needed.
| What | Where (search for it in the HTML) |
|---|---|
| Peak / off-peak headway | const headway= |
| Ridership curve by hour | const DEM= |
| Passenger entry rate | const ENTRY_RATE= |
| Facility list and faults | const FAC= |
| Neighbouring stations in the tracker | const STNS= |
| Initial camera position | const HOME= |
| Colours | const C= |
| Problem | Fix |
|---|---|
| Blank page / stuck on "Loading…" | You opened the file via file://. Serve it with a local server instead (see Quick start). |
| Blank page while served | Open DevTools (F12) → Console. A 404 on vendor/... means the vendor/ folder is missing or in the wrong place. |
Address already in use | Port 8000 is taken. Use another port: python -m http.server 8080. |
| Changes not showing | Hard refresh with Ctrl+Shift+R. |
| Low frame rate | Close other GPU-heavy tabs, or make the browser window smaller. The shadow map is 4096², which is the main GPU cost. |
| Font looks different | You're offline, so Inter can't load and a system font is used. This is expected. |
MapControls, CSS2DRenderer, fat lines (LineSegments2).npm install.