{"id":21972832,"url":"https://github.com/agustinsrg/personalmediavault","last_synced_at":"2026-04-05T15:01:13.791Z","repository":{"id":196260528,"uuid":"488874591","full_name":"AgustinSRG/PersonalMediaVault","owner":"AgustinSRG","description":"Self-hosted web application to store media files (video, audio and pictures) in an encrypted storage, and visualize them using a web browser.","archived":false,"fork":false,"pushed_at":"2026-04-04T16:20:49.000Z","size":13056,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-04T18:18:24.144Z","etag":null,"topics":["audio","encrypted","ffmpeg","golang","media","personal","personal-media-vault","pictures","pmv","self-hosted","storage","vault","video","vue"],"latest_commit_sha":null,"homepage":"https://agustinsrg.github.io/pmv-site/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AgustinSRG.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-05-05T07:35:02.000Z","updated_at":"2026-04-04T16:20:53.000Z","dependencies_parsed_at":"2023-10-01T20:48:25.201Z","dependency_job_id":"de156e0f-1876-45cd-8145-c731816df863","html_url":"https://github.com/AgustinSRG/PersonalMediaVault","commit_stats":null,"previous_names":["agustinsrg/personalmediavault"],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/AgustinSRG/PersonalMediaVault","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgustinSRG%2FPersonalMediaVault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgustinSRG%2FPersonalMediaVault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgustinSRG%2FPersonalMediaVault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgustinSRG%2FPersonalMediaVault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AgustinSRG","download_url":"https://codeload.github.com/AgustinSRG/PersonalMediaVault/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AgustinSRG%2FPersonalMediaVault/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31439442,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T13:13:19.330Z","status":"ssl_error","status_checked_at":"2026-04-05T13:13:17.778Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","encrypted","ffmpeg","golang","media","personal","personal-media-vault","pictures","pmv","self-hosted","storage","vault","video","vue"],"created_at":"2024-11-29T15:21:40.304Z","updated_at":"2026-04-05T15:01:13.766Z","avatar_url":"https://github.com/AgustinSRG.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![PersonalMediaVault](./favicon.readme.png) Personal Media Vault\n\n[![Backend](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/backend.yml/badge.svg)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/backend.yml)\n[![Frontend](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/frontend.yml/badge.svg)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/frontend.yml)\n[![Launcher (CLI)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/launcher.yml/badge.svg)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/launcher.yml)\n[![Launcher (GUI)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/launcher-gui.yml/badge.svg)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/launcher-gui.yml)\n[![Backup tool](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/backup-tool.yml/badge.svg)](https://github.com/AgustinSRG/PersonalMediaVault/actions/workflows/backup-tool.yml)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](./LICENSE)\n\nSelf-hosted web application to store media files (video, audio and pictures) in an encrypted storage, and visualize them using a web browser.\n\n![Screenshot](https://agustinsrg.github.io/pmv-site/images/screenshot.png)\n\n### Quick access links\n\n- 🌐 [PersonalMediaVault product website](https://agustinsrg.github.io/pmv-site/)\n- 📣 [Announcements](https://github.com/AgustinSRG/PersonalMediaVault/discussions/categories/announcements)\n- 🐛 [Report a bug](https://github.com/AgustinSRG/PersonalMediaVault/issues/new?template=bug_report.md)\n- ☣️ [Report a vulnerability](https://github.com/AgustinSRG/PersonalMediaVault/security/advisories/new)\n- 💡 [Suggest a new feature](https://github.com/AgustinSRG/PersonalMediaVault/issues/new?template=feature_request.md)\n- 🙏 [Need help? Ask a question](https://github.com/AgustinSRG/PersonalMediaVault/discussions/new?category=q-a)\n\n## Features\n\n- Support for videos, audios and pictures.\n- Web interface: The project provides a Web interface, allowing the access to the vault from multiple devices and operating systems.\n- Encrypted and easy to back-up storage: The vault is encrypted using the user's password, and is stored in files in a data folder. It's possible to make backups of the vault just by copying the folder, ideal for tools like rsync. This project also provides its own backup tool for doing that.\n- Indexed tags: Each media asset can be tagged, so the user can search for it with a tag based search system.\n- Albums: Media files can be sorted using albums.\n- Media encoding: Media files are encoded into multiple formats in order to allow the playback from multiple browsers. For videos and pictures, they can also be resized into multiple resolutions for different kind of devices.\n- Automated thumbnail generation: When videos or images are uploaded, a default thumbnail is generated. You can change the default thumbnail at any moment after the upload.\n- Subtitles support: SubRip subtitles can be added to your videos and audios.\n- Multiple audio track support: Videos can have multiple audio tracks, usually for multi-language audio.\n- Video timeline previews: Get previews while hovering the video timeline.\n- Video timeline slices: Divide long videos in sections to quickly navigate through them.\n- Image annotations: Add comments to images.\n- Attachments: Upload any file attached to your media to preserve them in the encrypted vault. This can be used to preserve a copy of the raw media file, before the encoding.\n\n## Run in a container\n\nRunning the vault in an isolated container is the most secure way of running it, gives access to all the features and allows for a fine-grained configuration. \n\nHowever, this may be a bit complex for non technical users. So, if you only need a local vault, go to the [Installation packages](#installation-packages) section instead.\n\nNote: If you wish to enable AI features, use the compose file present in the [packages/docker-compose-with-ai](./packages/docker-compose-with-ai) folder instead.\n\nYou will need a container management system, for example [Docker](https://www.docker.com/) or [Podman](https://podman.io/). In the documentation, Docker commands are being used, so, if you are using Podman, make sure to replace `docker` for `podman` before running them.\n\nYou can find the official image of the project uploaded to [Docker Hub](https://hub.docker.com/r/asanrom/pmv) and [GitHub Packages](https://github.com/AgustinSRG/PersonalMediaVault/pkgs/container/personalmediavault).\n\nTo create a vault setup, fist create a compose file ([docker-compose.yml](./packages/docker-compose/docker-compose.yml)):\n\n\u003cdetails\u003e\n\u003csummary\u003eFile contents (docker-compose.yml):\u003c/summary\u003e\n\n```yml\nservices:\n  pmvd:\n    hostname: \"pmvd\"\n    image: \"asanrom/pmv\"\n    ports:\n      - \"${VAULT_PORT}:8000\"\n    restart: unless-stopped\n    volumes:\n      - ${VAULT_PATH:-./vault}:/vault\n      - ${VAULT_SSL_PATH:-./ssl}:/ssl:ro\n    environment:\n      - USING_PROXY=${USING_PROXY:-NO}\n      - VAULT_INITIAL_USER=${VAULT_INITIAL_USER:-admin}\n      - VAULT_INITIAL_PASSWORD=${VAULT_INITIAL_PASSWORD:-changeme}\n      - SSL_CERT=${SSL_CERT:-}\n      - SSL_KEY=${SSL_KEY:-}\n    command: --daemon\n      --clean\n      --port 8000\n      --skip-lock\n      --vault-path /vault\n      --cache-size ${VAULT_CACHE_SIZE:-1024}\n      ${VAULT_EXTRA_OPTIONS:-}\n```\n\u003c/details\u003e\u003cbr\u003e\n\nAfter that, create in the same folder an environment file ([.env](./packages/docker-compose/.env.example)) for the configuration parameters in the compose file.\n\n\u003cdetails\u003e\n\u003csummary\u003eFile contents (.env):\u003c/summary\u003e\n\n```sh\n####################################\n# PersonalMediaVault configuration #\n####################################\n\n# Listening port\nVAULT_PORT=8000\n\n# Path where the vault will be stored\nVAULT_PATH=./vault\n\n# SSL (recommended)\n#\n# Running the vault with HTTP is the most secure option\n# Obtain a key and a certificate for your domain\n#\n# Set VAULT_SSL_PATH to the path where the key and the certificate are stored\n# This path will be mapped to /ssl in the container\n# Set SSL_KEY and SSL_CERT to the key and certificate chain files respectively\n# The files must be in the /ssl path (eg: /ssl/certificate.pem) and in PEM format\n\nVAULT_SSL_PATH=./ssl\n\n#SSL_KEY=/ssl/key.pem\n#SSL_CERT=/ssl/certificate.pem\n\n# Reverse proxy\n#\n# Sometimes is better to use a reverse proxy (line NGINX)\n# as the frontend and forward the requests to the daemon\n#\n# If you are using it, set USING_PROXY to YES in order for\n# the daemon to change the way it resolves the IP addresses of clients\n\nUSING_PROXY=NO\n\n# Initial vault user\n#\n# If the vault has no users, an initial user will be created\n#\n# Set VAULT_INITIAL_USER and VAULT_INITIAL_PASSWORD\n# for the username and password respectively\n#\n# Make sure to change them the first time you log into the vault.\n\nVAULT_INITIAL_USER=admin\nVAULT_INITIAL_PASSWORD=changeme\n\n# Cache size\n# You can modify it to accelerate the read speed\n# but will also result in higher memory usage\n# The recommended value is 1024\n\nVAULT_CACHE_SIZE=1024\n\n# Extra options\n#\n# You can set the following extra options,\n# separating them with spaces:\n#\n#   --log-requests - Enables request logging\n#   --debug - Enables debug logging (useful for troubleshooting)\n#   --fix-consistency - Fixes vault consistency at startup (takes some time)\n#   --recover - Recovers non-indexed media assets.\n\nVAULT_EXTRA_OPTIONS=--log-requests\n```\n\u003c/details\u003e\u003cbr\u003e\n\nRead the environment file in order to configure the file. Then, you can start the vault:\n\n```sh\ndocker compose up -d\n```\n\nIn case you want to upgrade the image, run:\n\n```sh\ndocker compose pull\ndocker compose up -d\n```\n\nIn case you want to stop it, run:\n\n```sh\ndocker compose down\n```\n\n## Installation packages\n\nWe offer several installation packages depending on the operating system you are using. You can find those packages in the [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases) section of the repository.\n\nThis method is ideal for non-technical users, as a graphical launcher will be installed to run the vault without any commands.\n\nRead the sections below for installation instructions.\n\n### Windows\n\nFor Windows, download the **MSI** installer (`PersonalMediaVault-{VERSION}-x64.msi`) from [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases).\n\nRun the installer and and everything will be set up for the application to work.\n\nAfter it's installed, create an empty folder to store your media vault and right click it. You should see a new option \"Open with PersonalMediaVault\". Click it to run the vault launcher.\n\n### Debian, Ubuntu or other Debian based Linux distribution\n\nFor Debian-based Linux distributions, download the **DEB** package (`personalmediavault_{VERSION}_amd64.deb`) from [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases).\n\nInstall the package, with `apt` or with your graphical package manager.\n\nYou can also install it directly from the PPA repository (built automatically with GitHub actions):\n\n```sh\n# Download the public key\ncurl -s --compressed \"https://agustinsrg.github.io/PersonalMediaVault/KEY.gpg\" | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/pmv.gpg \u003e/dev/null\n\n# Add the APT list file\nsudo curl -s --compressed -o /etc/apt/sources.list.d/pmv.list \"https://agustinsrg.github.io/PersonalMediaVault/pmv.list\"\n\n# Update APT lists\nsudo apt update\n\n# Install the package\nsudo apt install personalmediavault\n```\n\nAfter it's installed, you can run the launcher with `pmv /path/to/vault` or the graphical launcher by searching for \"PersonalMediaVault\" in your application menu.\n\n### Fedora Linux\n\nFor Fedora-based Linux distributions, download the **RPM** package (`personalmediavault-{VERSION}.x86_64.rpm`) from [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases).\n\nInstall the package, with `dnf` or with your graphical package manager.\n\nAfter it's installed, you can run the launcher with `pmv /path/to/vault` or the graphical launcher by searching for \"PersonalMediaVault\" in your application menu.\n\n### Arch Linux\n\nFor Arch-based Linux distributions, download the **PKG.TAR.ZST** package (`personalmediavault-{VERSION}-x86_64.pkg.tar.zst`) from [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases).\n\nInstall the package, with `pacman`:\n\n```sh\nsudo pacman -U personalmediavault-{VERSION}-x86_64.pkg.tar.zst\n```\n\nAfter it's installed, you can run the launcher with `pmv /path/to/vault` or the graphical launcher by searching for \"PersonalMediaVault\" in your application menu.\n\n### Other Linux distribution\n\nFor any other Linux distribution, you can download the **TAR.GZ** package (`personalmediavault_{VERSION}_amd64.tar.gz`) from [Releases](https://github.com/AgustinSRG/PersonalMediaVault/releases).\n\nUncompress it, and run the installation script (`install.sh`) with administration privileges:\n\n```sh\nsudo ./install.sh\n```\n\nAfter it's installed, you can run the launcher with `pmv /path/to/vault` or the graphical launcher by searching for \"PersonalMediaVault\" in your application menu.\n\n### KDE service menu\n\nIf you are using a Linux distribution, and KDE as your desktop environment, you can get the same context menu options to open vaults that are installed in the Windows package.\n\nCreate the file `~/.local/share/kio/servicemenus/pmv-open.desktop` with the following contents:\n\n\u003cdetails\u003e\n\u003csummary\u003eFile contents (pmv-open.desktop):\u003c/summary\u003e\n\n```conf\n[Desktop Entry]\nName=Open with PersonalMediaVault\nType=Service\nServiceTypes=KonqPopupMenu/Plugin\nMimeType=inode/directory\nActions=openWithPmv\n\n[Desktop Action openWithPmv]\nName=Open with PersonalMediaVault\nName[es]=Abrir con PersonalMediaVault\nTerminal=false\nIcon=pmv\nStartupWMClass=pmv\nExec=pmv-gui .\n```\n\u003c/details\u003e\u003cbr\u003e\n\nIf you prefer to use the console launcher instead, use the following desktop entry:\n\n\u003cdetails\u003e\n\u003csummary\u003eFile contents (pmv-open-console.desktop):\u003c/summary\u003e\n\n```conf\n[Desktop Entry]\nName=Open with PersonalMediaVault (Console)\nType=Service\nServiceTypes=KonqPopupMenu/Plugin\nMimeType=inode/directory\nActions=openWithPmvConsole\n\n[Desktop Action openWithPmvConsole]\nName=Open with PersonalMediaVault (Console)\nName[es]=Abrir con PersonalMediaVault (Consola)\nTerminal=false\nIcon=pmv\nStartupWMClass=pmv\nExec=konsole --separate -e 'pmv .'\n```\n\u003c/details\u003e\n\n## Project components\n\n- [Backend](./backend): Manages the vault, encodes and stores the media files and provides a HTTP API for clients to access it.\n- [Frontend](./frontend): Uses the HTTP API to access the vault, providing a web interface to the user.\n- [Backup tool](./backup-tool): Tool to make backups of media vaults (copies the new files and replaces the old ones, using the last modified date).\n- [Launcher](./launcher): CLI program to launch the web app. This component is made in order to make it easier to use in local, when you do not have the backend configured as a system service.\n- [Installation Packages](./packages): Collection of installation packages for multiple operating systems.\n\n## Project motivation\n\nThis is a personal project developed with the goal of making a media management tool that has a similar web interface to YouTube, while keeping the media files encrypted in disk.\n\n**Why encryption?:** When storing your personal pictures, videos or audio recordings, if you store them unencrypted in your computer, any malware that is able to infect your device will be able to easily get them from the file system. By encrypting them, it makes harder for those media files to be stolen. Also, by being encrypted, you can easily make backups of them in cloud storage services like Google Drive, without giving Google the ability to peek into your personal media files.\n\n**Why a web application?:** By making it a web application, its usage becomes very flexible. You can run the backend in a computer in your LAN or a remote server and you are able to use the app from all the devices connected to the Internet without any extra installation. Also, web interfaces are easier to develop to work in multiple devices and they offer standard features already implemented that are required for the app, like the video player.\n\n## License\n\nThis project is under the [MIT License](./LICENSE).\n\n## Contributing\n\n- [Pull requests](https://github.com/AgustinSRG/PersonalMediaVault/pulls)\n- [Contributing guidelines](./CONTRIBUTING.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagustinsrg%2Fpersonalmediavault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagustinsrg%2Fpersonalmediavault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagustinsrg%2Fpersonalmediavault/lists"}