Details-view listing
Sortable columns, Windows-style date grouping (Today / Yesterday / Last week…), multi-select via click, Shift/Ctrl, or a mouse rubber-band drag, and a right-click context menu.
A fast, browser-based file manager for a Linux host — full filesystem access, durable background copy/move/delete jobs, a proper Trash, permissions editing, and keyboard navigation that actually feels native.
Built for admins who live on the terminal — but want a Windows-Explorer-grade UI when they don't.
Not a toy uploader — a Details-view explorer with the operations you'd expect from a desktop OS, running entirely in the browser.
Sortable columns, Windows-style date grouping (Today / Yesterday / Last week…), multi-select via click, Shift/Ctrl, or a mouse rubber-band drag, and a right-click context menu.
Arrows, Shift+arrows, Ctrl+A, Enter, Backspace, F2, Delete, Ctrl+C/X/V, and instant type-ahead search — the grid is fully operable without a mouse.
Copy, move, and delete run as background jobs that keep going even if you close the tab, with live progress on the Tasks page pushed over SignalR.
Deleting moves items to a per-drive hidden Trash instead of removing them immediately — restore or permanently purge from the dedicated Trash page.
Left-hand drive list with free-space usage bars. The sidebar is resizable and its width is shared across Explorer, Tasks, and Trash.
A Properties dialog shows size/type/dates, plus a Permissions tab to view and change owner, group, and rwx bits (chmod/chown) when the API runs on Linux.
Inline preview for images, text, PDF, audio, and video, without ever leaving the folder listing.
Search the current folder and everything beneath it — instant type-ahead search finds what you need without switching views.
Login with a change-password flow baked in — no anonymous access. Bring your own reverse proxy for TLS termination.
Screenshots straight from the local dev sandbox — the same views you get once it's running against your own drives.
The API treats one configured physical directory as its "root"
(FileSystem:RootPath, default /host_root) —
every path the client sees is relative to that. In Docker, the host's real
/ is bind-mounted there, so the API can reach anything the host can.
The API is designed to run as root so it can browse, chmod, and
chown anywhere on the host. Keep it off the public internet, put it behind a
trusted network/VPN, and always set a strong JWT_KEY and admin
password.
# backend — ASP.NET Core 10 Web API
backend/FileExplorer.Api/
├── Controllers/ # auth, files, drives, operations,
│ # tasks, trash, permissions, search
└── Services/Jobs/ # background job queue + worker
# frontend — Angular (standalone + signals) + PrimeNG
frontend/src/app/
├── features/ # shell, explorer, tasks, trash, login
└── core/ # axios client, auth, typed API services
# two containers, wired by docker-compose.yml
api Kestrel · EF Core · SQLite · SignalR
web nginx serving Angular + proxying /api /hubs
Click a row, or Tab into the grid, to give the listing focus — then everything below just works.
The recommended path is Docker Compose — two containers, wired together, nothing else to install.
git clone https://github.com/pavangayakwad/linux-drive-explorer.git
cd linux-drive-explorer
cp .env.example .env
openssl rand -base64 48 # paste output into JWT_KEY
By default the entire host filesystem (/) is bind-mounted into the API container at /host_root. Narrow this in docker-compose.yml if you only want specific paths exposed.
docker compose up -d --build
Navigate to http://<host>:8080. If ADMIN_PASSWORD was left blank, fetch the generated password from the logs:
docker compose logs api | grep -A2 "Password:"
Self-hosted, open source under Apache 2.0, and built to sit behind your own VPN or reverse proxy.