A visual computer park management tool. Upload your office floor plan, place machines on it, monitor their online/offline status in real time, and open SSH sessions in one click.
- Floor plan — upload any image (PNG, JPG, SVG…) as your floor background
- Machine inventory — create machines (PC, server, laptop, printer, switch, router…) with SSH credentials and a custom color
- Drag & drop — drag machines from the inventory onto the floor plan
- Real-time status — ICMP ping every 30 s with green/red indicator per machine; results broadcast via WebSocket
- SSH connection — one click opens a full terminal in the browser (xterm.js); the SSH session runs from the server (password via
sshpass, key file supported) - Multi-floor — create and switch between floors, each with its own plan
- Zoom & pan — scroll wheel to zoom (30 %–400 %, centered on cursor), drag the background to pan freely
- Machine resize — drag the resize handle on any placed machine to scale it
- Export / Import JSON — full backup and restore of all data
| Layer | Technology |
|---|---|
| Backend | Python · FastAPI · aiosqlite (SQLite) · WebSocket |
| Frontend | React 18 · TypeScript · Tailwind CSS · Zustand · Vite |
- Python 3.10+
- Node.js 18+
sshpass(optional — required for password-based SSH auth)
sudo apt install sshpass # Debian / Ubuntucurl -sSL https://raw.githubusercontent.com/Derbosoft/uptoco/main/get.sh | bash
bash install.sh
bash start.shThe app is available at http://localhost:8000.
| Script | Role |
|---|---|
curl … | bash |
Clones the repo and creates local install.sh / start.sh wrappers |
bash install.sh |
Creates the Python venv, installs dependencies, builds the frontend |
bash start.sh |
Fixes permissions if needed, rebuilds the frontend, starts the FastAPI backend |
For a server that should start at boot and recover automatically, install the systemd service instead of running start.sh manually:
bash install-service.shsudo systemctl status uptoco # status
journalctl -u uptoco -f # live logs
sudo systemctl restart uptoco # restart# Terminal 1 — backend (hot-reload)
cd backend
../.venv/bin/uvicorn main:app --reload --port 8000
# Terminal 2 — frontend (Vite dev server with proxy to :8000)
cd frontend
npm install
npm run dev # → http://localhost:5173uptoco/
├── backend/
│ ├── main.py # FastAPI app — REST API, WebSocket, SSH, static serving
│ ├── requirements.txt
│ ├── uptoco.db # SQLite database (auto-created on first run)
│ └── uploads/ # Uploaded floor plan images
├── frontend/
│ ├── src/
│ │ ├── components/ # FloorCanvas, Sidebar, TopNav, MachineModal, MachinePopup
│ │ ├── views/ # InventoryView, PlansView
│ │ ├── store.ts # Zustand global state
│ │ └── types.ts # Shared TypeScript types
│ └── dist/ # Built frontend (served by FastAPI)
├── get.sh # Download script (clone repo + create wrappers)
├── install.sh # Dependency installer + frontend build
├── start.sh # Permission fix + frontend build + backend start
└── install-service.sh # Install a systemd service (auto-restart + logs)
- Add a floor — click + Ajouter in the sidebar floor section
- Upload a plan — drag an image onto the canvas, or click 🖼 Changer l'image
- Add machines — go to the Inventaire view, fill in the SSH credentials and color, save
- Place machines — drag a machine from the sidebar onto the floor plan
- Navigate — scroll to zoom in/out (centered on cursor), drag the background to pan
- Connect via SSH — click a placed machine → Connexion SSH in the popup
- Resize a machine — drag the ↘ handle in the bottom-right corner of a machine card
- Backup — ⬇ Export downloads a JSON backup; ⬆ Import restores it
The terminal runs in the browser but the SSH connection is opened from the server, so credentials (key files) must be present on the server, not on the client machine.
| Type | Requirement |
|---|---|
| Password | sshpass installed on the server (sudo apt install sshpass) |
| Key file | Absolute path, on the server, to the .pem / private key file |
Security note: UpToco has no built-in authentication and stores SSH passwords in plain text in
uptoco.db. Anyone who can reach the web interface can read every credential and open a root shell on any machine. Run it only on a trusted network, and ideally behind a reverse proxy (e.g. Caddy) that adds a login and HTTPS.
MIT