Internal App Launcher & Health Dashboard
An internal portal I built at Vitrosens Biotechnology that gives the team one place to find, health-check, and launch the company's internal web apps. The server probes each app's health on a short cache and shows a live status badge, so a hundred open tabs still mean one check per app. It has a hidden, rate-limited admin panel to manage apps, announcements, and users, ships as an installable PWA with an offline page, and runs self-hosted behind a hardened service. Built with FastAPI and React 19.
- Python
- FastAPI
- React
- TypeScript
- SQLite
- Tailwind CSS
Summary. An internal portal I built at Vitrosens Biotechnology that gives the team one place to find, health-check, and launch the company's internal web apps. The standout piece is how it reports health: the server probes each app on a short cache and shows a live status badge, so many open tabs still mean one check per app.
Live health, without hammering the apps
When the home page loads it asks the server for each app's status rather than calling the apps itself. The server keeps a short in-memory cache per app, and on a miss it probes the app's own health URL with a three-second timeout, then classifies the result: a fast success is healthy, a slow success is degraded, and an error or timeout is down. The UI turns that into a colour-coded badge. So whether one person or the whole team has the portal open, each app is checked about once per interval.
A small, locked-down surface
The public side, reachable only from inside the company network, is read-only: list the apps, read the announcements, check status. Logging in is rate-limited, and the admin surface returns a plain 404 to anyone without a valid admin token, so scanners never even learn it exists. App URLs that admins add are checked against an allow-list before they are saved. Every response also sets strict security headers, a tight content security policy, no framing, and httpOnly tokens.
Installable, and fine offline
It ships as a progressive web app: the team can install it like a native app, and a service worker caches the app shell (the layout and styles) and shows a bilingual offline page if the network drops, while live data always goes to the network so nothing goes stale silently.
Stack and delivery
FastAPI and SQLite on the back, React 19 with TypeScript, Vite, and Tailwind on the front, localized in English and Turkish. It is fully self-hosted with no external services, runs behind a hardened systemd service (read-only filesystem, no new privileges, only the capability it needs to bind its port), and is checked by a GitHub Actions pipeline that lints, type-checks, tests, and builds both sides.
Questions
Is it public?
No. It runs inside the company network for the team, so it is not indexed, and the admin area is hidden behind authentication.
Why check health on the server instead of the browser?
So one probe per app serves every open browser. The server checks each app on a short cache and classifies the result centrally, which keeps the apps from being hit once per visitor and keeps the badges consistent for everyone.