Penombre
A self-hosted drive. All the convenience of cloud storage, on hardware you own, with a bill of exactly zero.
Docs · Docker Hub · Project page
See the full showcase → — every screen, light and dark, generated from a real instance.
#What it is
Penombre is a file storage and synchronisation platform for people who want their files back. Drop it on a box, point it at your disks, and you get a modern web drive — without renting the disk from anyone.
It runs on SQLite out of the box: one container, one volume, no database server to run alongside it. PostgreSQL stays supported the day you outgrow that.
#Features
#Your files
- Uploads that survive a reload — files and whole folders, queued in the browser and resumed after a closed tab. Uploads
- Everything you expect from a drive — folders, search, starred, recent, automatic categories (images, music, video, documents…), zip downloads, and a trash that gives things back. Storage
- Copy and move anywhere — between folders, shared drives and mounted volumes, in one dialog.
- Big folders stay fast — listings page from the database and render only what is on screen, so a 20,000-file sample library scrolls like ten files.
#Music and media
- A real music player — the waveform is the progress bar, redrawn in your accent colour; skip, restart, change the speed without changing the pitch, or transpose without changing the tempo. Media
- Notes pinned to a moment — timestamped comments drawn on the waveform, for "the kick is too loud at 1:12". Media
- Previews for almost everything — images, video, PDFs, code, 3D models, with a full-screen viewer that keeps the playhead when you go in and out.
#Versions
- No more
final-final-really.wav— upload a file with the same name and the old one becomes a version you can play, preview or restore. Switch takes mid-playback and compare two mixes at the same bar. Versioning - Merge old takes into one file — select
Song-001.mp3…Song-014.mp3, order them by date or by name, preview the result, merge. Merging
#Documents
- Documents, sheets and decks in the browser, stored as plain HTML, CSV and Markdown files — no private format. Documents
- Word, Excel and PowerPoint edited in place — the original file is kept, only the text you changed is written back.
#Sharing
- Links with an optional password, expiry and sign-in requirement. Sharing
- People on the instance, as viewers, editors or with full access; they are notified in the app and by email. Notifications
- Shared drives owned by a team rather than a person, with member roles and a trash of their own. Shared drives
#Your disks, your layout
- Mount what you already have — declare a directory as a volume and its files show up, rescanned every minute, read-only if you like. Volumes
- WebDAV and sync — mount any drive in Finder, Explorer or GNOME Files, or keep a folder in two-way sync with rclone; a save over a file becomes a version, a delete lands in the trash. WebDAV and sync
- A desktop sync app — a tray app for macOS, Linux and Windows that keeps
several local folders in two-way sync with your drive, shared drives or
volumes;
brew install orochibraru/tap/penombre-sync. Desktop sync - Syncthing-friendly — what Penombre writes to a volume keeps its real name and its modification date, so the folder reads the same on every peer. Syncing with Syncthing
- Simple mode — no per-user drives, just one shared library everybody browses. Simple mode
- Encryption at rest — file bytes sealed with a key you hold, rotatable, recoverable without Penombre. Encryption
#Sign-in and administration
- Every way in — password, passkeys, magic links, emailed codes, two-factor and any OpenID Connect provider (Pocket ID, Google…), each switchable live from the admin panel. Authentication
- Invitations, users, SMTP, storage and an activity log in one admin panel. Admin
- A documented REST API — every
/api/v1endpoint is in the OpenAPI spec, with API keys for scripts.
#Made to be lived in
- Thirteen languages, light and dark themes, a choice of accent colours, typefaces and corner styles.
- A phone layout that is not an afterthought — bottom bar, drawer navigation, the player and uploads all fit.
#Run it
#Docker run
docker run -d --name penombre \
-p 3000:3000 \
-v penombre_data:/data \
-e AUTH_SECRET=$(openssl rand -hex 32) \
-e ORIGIN=https://drive.example.com \
orochibraru/penombre:latest#Docker Compose
services:
penombre:
image: orochibraru/penombre:latest
restart: unless-stopped
ports:
- 3000:3000
volumes:
- penombre_data:/data
environment:
AUTH_SECRET: a-long-random-string
ORIGIN: https://drive.example.com
volumes:
penombre_data:Either way it comes up on http://localhost:3000, on a setup screen that
creates the first administrator. One volume holds the lot: the SQLite database
under /data/db, your files under /data/storage. Those two variables are the
only ones required.
The getting started guide walks through it properly, and the env reference covers everything else: OAuth providers, SMTP, Redis, Postgres, volumes, simple mode.
#How it's built
- Frontend — SvelteKit with Svelte 5, TailwindCSS 4, shadcn-svelte
- Backend — SvelteKit
+server.tsroutes with Zod-validated contracts that also emit the OpenAPI spec - Database — SQLite with Drizzle ORM, PostgreSQL optional, chosen from the
DATABASE_URLscheme - Storage — plain local filesystem, so your files stay files
- Worker — a Go process for thumbnails, waveforms, scans, zips and bulk copies, embedded or run as its own container
- Auth — Better Auth
#Contributing
See CONTRIBUTING.md for local setup, commands, and the test and lint workflow.
#License
MIT — see LICENSE. Free, and staying that way.
#Acknowledgments
Built with these open-source technologies:
- SvelteKit - Full-stack web framework
- shadcn-svelte - UI components
- Bun - JavaScript runtime and toolkit
- Drizzle ORM - TypeScript ORM
- Better Auth - Authentication library
- SQLite - Database
- oxlint - Linter
- Biome - Formatter
#Star History
This guide lives in the project repo: edit it there, and this page follows within a day.