├── .github ├── ISSUE_TEMPLATE │ └── app-request.md ├── PULL_REQUEST_TEMPLATE │ └── submit_app_template.md └── workflows │ └── updatecache.yaml ├── .gitignore ├── .husky └── pre-commit ├── .vscode └── settings.json ├── Apps ├── deluge │ ├── app.json │ └── metadata │ │ ├── addscreen.png │ │ ├── app.md │ │ ├── configscreen.png │ │ ├── icon.png │ │ └── screenshot.png ├── jellyfin │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.jpg ├── linkding │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.png ├── miniflux │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.png ├── photoprism │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.png ├── pihole │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── images │ │ ├── dashboard.png │ │ ├── initial.png │ │ └── login.png ├── plex │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.jpg ├── prowlarr │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.png ├── radarr │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── icon.png │ │ └── screenshot.png ├── sonarr │ ├── app.json │ └── metadata │ │ ├── app.md │ │ ├── calendar.png │ │ ├── downloadhandling.png │ │ ├── icon.png │ │ ├── manualsearch.png │ │ └── screenshot.png └── transmission │ ├── app.json │ └── metadata │ ├── app.md │ ├── icon.png │ └── screenshot.jpg ├── LICENSE.txt ├── categories.json ├── index.js ├── index.json ├── package.json ├── readme.md └── schemas ├── app.schema.json └── categories.schema.json /.github/ISSUE_TEMPLATE/app-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: App request 3 | about: Suggest a new app 4 | title: "[APP]" 5 | labels: App, good first issue 6 | assignees: nodgear 7 | 8 | --- 9 | 10 | 🚀 **App name:** 11 | insert app name here 12 | 13 | 🌐 **App url** 14 | insert a link for the app website or dockerhub image here 15 | 16 | 🏷️ **Categories** 17 | Include one or more categories for this app 18 | 19 | ✅ **Checklist** 20 | - [ ] This app is neither already in the repository or in another request. 21 | - [ ] I've read the repository rules in the read.md (repository home page) 22 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/submit_app_template.md: -------------------------------------------------------------------------------- 1 | 🚀 **App name** 2 | 3 | 4 | 📝 **App description** 5 | 6 | 7 | ✅ **Check list** 8 | - [ ] App manifest (app.json). 9 | - [ ] App metadata (app.md). 10 | - [ ] My app icon is consistent with the [current design](https://www.figma.com/file/Z2ITlEF1MDClLfaClekQ8x/VoltaOS?node-id=14%3A3) 11 | - [ ] Screenshots. 12 | - [ ] I executed the `validate` script and it didn't fail. 13 | -------------------------------------------------------------------------------- /.github/workflows/updatecache.yaml: -------------------------------------------------------------------------------- 1 | name: "clearCDN" 2 | on: 3 | push: 4 | paths: 5 | - '**.json' 6 | - '**.png' 7 | - '**.webp' 8 | - '**.md' 9 | branches: 10 | - "master" 11 | jobs: 12 | purge-jsdelivr-cache: 13 | runs-on: ubuntu-20.04 14 | steps: 15 | - uses: gacts/purge-jsdelivr-cache@v1 16 | with: 17 | url: | 18 | https://cdn.jsdelivr.net/gh/gethyperos/apps@master/index.json 19 | - uses: gacts/purge-jsdelivr-cache@v1 20 | with: 21 | url: | 22 | https://cdn.jsdelivr.net/gh/gethyperos/apps@master/categories.json 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn.lock 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npm run validate 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "json.schemas": [ 3 | { 4 | "fileMatch": [ 5 | "app.json" 6 | ], 7 | "url": "./schemas/app.schema.json" 8 | }, 9 | { 10 | "fileMatch": [ 11 | "categories.json" 12 | ], 13 | "url": "./schemas/categories.schema.json" 14 | } 15 | ], 16 | "files.exclude": { 17 | ".vscode": true, 18 | "**/node_modules": true, 19 | "index.js": true, 20 | "package-lock.json": true, 21 | "yarn.lock": true 22 | } 23 | } -------------------------------------------------------------------------------- /Apps/deluge/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "deluge", 4 | "name": "Deluge", 5 | "description": "Deluge is a cross-platform BitTorrent client", 6 | "categories": [ 7 | "Files", 8 | "Torrent" 9 | ], 10 | "webport": "8112", 11 | "icon": "metadata/icon.png", 12 | "directory": "deluge" 13 | }, 14 | "Services": { 15 | "deluge": { 16 | "container_name": "deluge", 17 | "images": { 18 | "x86_64": "linuxserver/deluge:latest", 19 | "armhf": "linuxserver/deluge:armhf-latest", 20 | "arm64": "linuxserver/deluge:arm64-latest" 21 | }, 22 | "ports": [ 23 | { 24 | "container": "8112", 25 | "host": "8112", 26 | "protocol": "tcp", 27 | "description": "Web Interface port" 28 | }, 29 | { 30 | "container": "6881", 31 | "host": "6881", 32 | "protocol": "tcp", 33 | "description": "Torrent Port TCP" 34 | }, 35 | { 36 | "container": "6881", 37 | "host": "6881", 38 | "protocol": "udp", 39 | "description": "Torrent Port UDP" 40 | } 41 | ], 42 | "volumes": [ 43 | { 44 | "host": "/hypros/AppData/deluge/config", 45 | "container": "/config", 46 | "description": "Config Directory" 47 | }, 48 | { 49 | "host": "/hypros/Downloads", 50 | "container": "/downloads", 51 | "description": "Downloads Directory" 52 | } 53 | ], 54 | "environment": [ 55 | { 56 | "name": "TZ", 57 | "description": "Timezone", 58 | "value": "Europe/London" 59 | }, 60 | { 61 | "name": "USER", 62 | "description": "Specify an optional username for the interface", 63 | "value": "vltos" 64 | }, 65 | { 66 | "name": "PASS", 67 | "description": "Specify an optional password for the interface", 68 | "value": "vltos" 69 | }, 70 | { 71 | "name": "HOST_WHITELIST", 72 | "description": "Specify an optional list of comma separated ip whitelist. Fills rpc-whitelist setting.", 73 | "value": "" 74 | }, 75 | { 76 | "name": "PUID", 77 | "description": "Ensure any volume directories on the host are owned by the same user", 78 | "value": "1000" 79 | }, 80 | { 81 | "name": "PGID", 82 | "description": "Ensure any volume directories on the host are owned by the same group", 83 | "value": "1000" 84 | } 85 | ], 86 | "restart": "unless-stopped" 87 | } 88 | } 89 | } -------------------------------------------------------------------------------- /Apps/deluge/metadata/addscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/deluge/metadata/addscreen.png -------------------------------------------------------------------------------- /Apps/deluge/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Deluge is a BitTorrent client that utilizes a daemon/client model. It has various user interfaces available such as the GTK-UI, Web-UI and Console-UI. It uses libtorrent at its core to handle the BitTorrent protocol. 7 | -------------------------------------------------------------------------------- /Apps/deluge/metadata/configscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/deluge/metadata/configscreen.png -------------------------------------------------------------------------------- /Apps/deluge/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/deluge/metadata/icon.png -------------------------------------------------------------------------------- /Apps/deluge/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/deluge/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/jellyfin/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "jellyfin", 4 | "name": "Jellyfin", 5 | "description": "Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media", 6 | "categories": [ 7 | "Media" 8 | ], 9 | "webport": "8096", 10 | "icon": "metadata/icon.png", 11 | "directory": "jellyfin" 12 | }, 13 | "Services": { 14 | "jellyfin": { 15 | "images": { 16 | "x86_64": "lscr.io/linuxserver/jellyfin:latest", 17 | "arm": "lscr.io/linuxserver/jellyfin:latest", 18 | "arm64": "lscr.io/linuxserver/jellyfin:latest" 19 | }, 20 | "container_name": "jellyfin", 21 | "environment": [ 22 | { 23 | "name": "TZ", 24 | "value": "America/New_York", 25 | "description": "Timezone" 26 | }, 27 | { 28 | "name": "PUID", 29 | "value": "1000", 30 | "description": "User ID" 31 | }, 32 | { 33 | "name": "PGID", 34 | "value": "1000", 35 | "description": "Group ID" 36 | }, 37 | { 38 | "name": "JELLYFIN_PublishedServerUrl", 39 | "value": "", 40 | "description": "Set the autodiscovery response domain or IP address." 41 | } 42 | ], 43 | "ports": [ 44 | { 45 | "host": "8096", 46 | "container": "8096", 47 | "protocol": "tcp", 48 | "description": "Web Interface port" 49 | }, 50 | { 51 | "host": "7359", 52 | "container": "7359", 53 | "protocol": "udp", 54 | "description": "Allows clients to discover Jellyfin on the local network." 55 | }, 56 | { 57 | "host": "1900", 58 | "container": "1900", 59 | "protocol": "udp", 60 | "description": "Service discovery used by DNLA and clients." 61 | } 62 | ], 63 | "volumes": [ 64 | { 65 | "host": "/hypros/Media/TV", 66 | "container": "/tv", 67 | "description": "Media directory for tv series" 68 | }, 69 | { 70 | "host": "/hypros/Media/Movies", 71 | "container": "/movie", 72 | "description": "Media directory for movies" 73 | } 74 | ], 75 | "devices": [ 76 | { 77 | "container": "/dev/dri", 78 | "host": "/dev/dri", 79 | "description": "Video device for hardware acceleration" 80 | } 81 | ], 82 | "restart": "unless-stopped" 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /Apps/jellyfin/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media: 7 | 8 | - There are no strings attached. 9 | - No premium licenses or features. 10 | - No hidden agendas: just a team who want to build something better and work together to achieve it. 11 | 12 | ## Easy. 13 | 14 | Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. 15 | 16 | ## Lean. 17 | 18 | Jellyfin is a cross-platform and alternative to propriety media streaming applications such as Emby and Plex. Jellyfin is easy to install and set up and accessible via the browser. Clients can connect devices to your Jellyfin server and let you view your content on any supported device. Jellyfin allows you to organize your movies, TV shows, music and photos in one beautiful interface and stream those media files on your PC, tablet, phone, TV, Roku, etc on the network or over the Internet. -------------------------------------------------------------------------------- /Apps/jellyfin/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/jellyfin/metadata/icon.png -------------------------------------------------------------------------------- /Apps/jellyfin/metadata/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/jellyfin/metadata/screenshot.jpg -------------------------------------------------------------------------------- /Apps/linkding/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "linkding", 4 | "name": "linkding", 5 | "description": "Self-hosted bookmark service", 6 | "categories": [ 7 | "Reading" 8 | ], 9 | "webport": "9090", 10 | "icon": "metadata/icon.png", 11 | "directory": "linkding" 12 | }, 13 | "Services": { 14 | "linkding": { 15 | "images": { 16 | "x86_64": "sissbruecker/linkding:latest", 17 | "armhf": "sissbruecker/linkding:latestt", 18 | "arm64": "sissbruecker/linkding:latest" 19 | }, 20 | "restart": "unless-stopped", 21 | "container_name": "linkding", 22 | "environment": [ 23 | { 24 | "name": "LD_DISABLE_BACKGROUND_TASKS", 25 | "value": "False", 26 | "description": "Option to disable background tasks" 27 | }, 28 | { 29 | "name": "LD_DISABLE_URL_VALIDATION", 30 | "value": "False", 31 | "description": "Option to disable URL validation for bookmarks completely" 32 | } 33 | ], 34 | "ports": [ 35 | { 36 | "host": "9090", 37 | "container": "9090", 38 | "protocol": "tcp", 39 | "description": "Port used for the web app" 40 | } 41 | ], 42 | "volumes": [ 43 | { 44 | "host": "/hypros/AppData/linkding", 45 | "container": "/etc/linkding/data", 46 | "description": "Data dir" 47 | } 48 | ] 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /Apps/linkding/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | linkding is a simple bookmark service that you can host yourself. 6 | It's designed be to be minimal, fast, and easy to set up using Docker. 7 | 8 | The name comes from: 9 | - *link* which is often used as a synonym for URLs and bookmarks in common language 10 | - *Ding* which is German for thing 11 | - ...so basically something for managing your links 12 | 13 | **Feature Overview:** 14 | - Tags for organizing bookmarks 15 | - Search by text or tags 16 | - Bulk editing 17 | - Bookmark archive 18 | - Dark mode 19 | - Automatically creates snapshots of bookmarked websites on [the Internet Archive Wayback Machine](https://archive.org/web/) 20 | - Automatically provides titles and descriptions of bookmarked websites 21 | - Import and export bookmarks in Netscape HTML format 22 | - Extensions for [Firefox](https://addons.mozilla.org/de/firefox/addon/linkding-extension/) and [Chrome](https://chrome.google.com/webstore/detail/linkding-extension/beakmhbijpdhipnjhnclmhgjlddhidpe), and a bookmarklet that should work in most browsers 23 | - REST API for developing 3rd party apps 24 | - Admin panel for user self-service and raw data access 25 | - Easy to set up using Docker, uses SQLite as database 26 | 27 | 28 | **Demo:** https://demo.linkding.link/ (configured with open registration) 29 | -------------------------------------------------------------------------------- /Apps/linkding/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/linkding/metadata/icon.png -------------------------------------------------------------------------------- /Apps/linkding/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/linkding/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/miniflux/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "miniflux", 4 | "name": "Miniflux", 5 | "description": "Miniflux is a minimalist and opinionated feed reader.", 6 | "categories": [ 7 | "Media", 8 | "Reading" 9 | ], 10 | "webport": "1080", 11 | "icon": "metadata/icon.png", 12 | "directory": "miniflux" 13 | }, 14 | "Services": { 15 | "miniflux": { 16 | "restart": "unless-stopped", 17 | "images": { 18 | "x86_64": "miniflux/miniflux:latest", 19 | "armhf": "miniflux/miniflux:latest", 20 | "arm64": "miniflux/miniflux:latest" 21 | }, 22 | "container_name": "miniflux", 23 | "depends_on": [ 24 | "miniflux_db" 25 | ], 26 | "environment": [ 27 | { 28 | "name": "DATABASE_URL", 29 | "value": "postgres://miniflux:hyperos@miniflux_db/miniflux?sslmode=disable", 30 | "description": "PostgreSQL connection URL" 31 | }, 32 | { 33 | "name": "RUN_MIGRATIONS", 34 | "value": "1", 35 | "description": "Allows miniflux to automatically migrate data to database" 36 | }, 37 | { 38 | "name": "CREATE_ADMIN", 39 | "value": "1", 40 | "description": "Automatically creates admin account" 41 | }, 42 | { 43 | "name": "ADMIN_USERNAME", 44 | "value": "hyperos", 45 | "description": "Username for the admin account" 46 | }, 47 | { 48 | "name": "ADMIN_PASSWORD", 49 | "value": "hyperos", 50 | "description": "Password for the admin account" 51 | } 52 | ], 53 | "ports": [ 54 | { 55 | "host": "1080", 56 | "container": "8080", 57 | "protocol": "tcp", 58 | "description": "Port used by WebUI" 59 | } 60 | ] 61 | }, 62 | "miniflux_db": { 63 | "restart": "unless-stopped", 64 | "images": { 65 | "x86_64": "postgres:latest", 66 | "armhf": "postgres:latest", 67 | "arm64": "postgres:latest" 68 | }, 69 | "container_name": "miniflux_db", 70 | "environment": [ 71 | { 72 | "name": "POSTGRES_USER", 73 | "value": "miniflux", 74 | "description": "Database default username and database name" 75 | }, 76 | { 77 | "name": "POSTGRES_PASSWORD", 78 | "value": "hyperos", 79 | "description": "Database default user password" 80 | } 81 | ], 82 | "volumes": [ 83 | { 84 | "host": "/hypros/AppData/miniflux/database", 85 | "container": "/var/lib/postgresql/data", 86 | "description": "Database files location *never empty" 87 | } 88 | ] 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /Apps/miniflux/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Miniflux is a minimalist and opinionated feed reader. 6 | 7 | 8 | Summary 9 | 10 | - Optimized for readability 11 | - The page layout, fonts, and colors are chosen to be readable on a screen. The most important thing is the content. 12 | - Download original article contents 13 | - Do you have feeds that display only a summary? Fetch the original article automatically. 14 | - No fancy features 15 | - I suppose you don't like bloated software? Miniflux focuses on simplicity. Less is more! 16 | - Fast and efficient 17 | - Be productive, use the keyboard shortcuts to navigate through the application. Scan quickly your unread items with the lightweight user interface. 18 | - Your privacy is guaranteed 19 | - Nobody resells your private data or track your usage. 20 | - No advertising and user tracking 21 | - Miniflux removes automatically pixel trackers. 22 | - Super simple installation 23 | - Miniflux is compiled statically without external dependencies, drop the binary on your server and you are done. You also have the choice to use the RPM/Debian package or the Docker image. 24 | - Free, open source and self-hosted 25 | - Miniflux is a free and open source project distributed under the permissive Apache 2.0 License. 26 | -------------------------------------------------------------------------------- /Apps/miniflux/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/miniflux/metadata/icon.png -------------------------------------------------------------------------------- /Apps/miniflux/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/miniflux/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/photoprism/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "photoprism", 4 | "name": "PhotoPrism", 5 | "description": "AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.", 6 | "categories": [ 7 | "Media" 8 | ], 9 | "webport": "2342", 10 | "icon": "metadata/icon.png", 11 | "directory": "photoprism" 12 | }, 13 | "Services": { 14 | "photoprism": { 15 | "restart": "unless-stopped", 16 | "images": { 17 | "x86_64": "photoprism/photoprism:latest", 18 | "arm64": "photoprism/photoprism:latest" 19 | }, 20 | "container_name": "photoprism", 21 | "environment": [ 22 | { 23 | "name": "PHOTOPRISM_ADMIN_PASSWORD", 24 | "value": "insecure", 25 | "description": "YOUR INITIAL ADMIN PASSWORD (MINIMUM 8 CHARACTERS, USERNAME admin)" 26 | }, 27 | { 28 | "name": "PHOTOPRISM_SITE_URL", 29 | "value": "http://localhost:2342/", 30 | "description": "public server URL incl http:// or https:// and /path, :port is optional" 31 | }, 32 | { 33 | "name": "PHOTOPRISM_ORIGINALS_LIMIT", 34 | "value": "5000", 35 | "description": "file size limit for originals in MB (increase for high-res video)" 36 | }, 37 | { 38 | "name": "PHOTOPRISM_HTTP_COMPRESSION", 39 | "value": "gzip", 40 | "description": "improves transfer speed and bandwidth utilization (none or gzip)" 41 | }, 42 | { 43 | "name": "PHOTOPRISM_LOG_LEVEL", 44 | "value": "info", 45 | "description": "log level: trace, debug, info, warning, error, fatal, or panic" 46 | }, 47 | { 48 | "name": "PHOTOPRISM_PUBLIC", 49 | "value": "false", 50 | "description": "no authentication required (disables password protection)" 51 | }, 52 | { 53 | "name": "PHOTOPRISM_READONLY", 54 | "value": "false", 55 | "description": "do not modify originals directory (reduced functionality)" 56 | }, 57 | { 58 | "name": "PHOTOPRISM_EXPERIMENTAL", 59 | "value": "false", 60 | "description": "enables experimental features" 61 | }, 62 | { 63 | "name": "PHOTOPRISM_DISABLE_CHOWN", 64 | "value": "false", 65 | "description": "disables storage permission updates on startup" 66 | }, 67 | { 68 | "name": "PHOTOPRISM_DISABLE_WEBDAV", 69 | "value": "false", 70 | "description": "disables built-in WebDAV server" 71 | }, 72 | { 73 | "name": "PHOTOPRISM_DISABLE_SETTINGS", 74 | "value": "false", 75 | "description": "disables settings UI and API" 76 | }, 77 | { 78 | "name": "PHOTOPRISM_DISABLE_TENSORFLOW", 79 | "value": "false", 80 | "description": "disables all features depending on TensorFlow" 81 | }, 82 | { 83 | "name": "PHOTOPRISM_DISABLE_FACES", 84 | "value": "false", 85 | "description": "disables facial recognition" 86 | }, 87 | { 88 | "name": "PHOTOPRISM_DISABLE_CLASSIFICATION", 89 | "value": "false", 90 | "description": "disables image classification" 91 | }, 92 | { 93 | "name": "PHOTOPRISM_DISABLE_RAW", 94 | "value": "false", 95 | "description": "disables indexing and conversion of RAW files" 96 | }, 97 | { 98 | "name": "PHOTOPRISM_RAW_PRESETS", 99 | "value": "false", 100 | "description": "enables applying user presets when converting RAW files (reduces performance)" 101 | }, 102 | { 103 | "name": "PHOTOPRISM_JPEG_QUALITY", 104 | "value": "85", 105 | "description": "image quality, a higher value reduces compression (25-100)" 106 | }, 107 | { 108 | "name": "PHOTOPRISM_DETECT_NSFW", 109 | "value": "false", 110 | "description": "flag photos as private that MAY be offensive (requires TensorFlow)" 111 | }, 112 | { 113 | "name": "PHOTOPRISM_UPLOAD_NSFW", 114 | "value": "true", 115 | "description": "allows uploads that MAY be offensive" 116 | }, 117 | { 118 | "name": "PHOTOPRISM_DATABASE_DRIVER", 119 | "value": "mysql", 120 | "description": "use MariaDB 10.5+ or MySQL 8+ instead of SQLite for improved performance" 121 | }, 122 | { 123 | "name": "PHOTOPRISM_DATABASE_SERVER", 124 | "value": "mariadb:3306", 125 | "description": "MariaDB or MySQL database server (hostname:port)" 126 | }, 127 | { 128 | "name": "PHOTOPRISM_DATABASE_NAME", 129 | "value": "photoprism", 130 | "description": "MariaDB or MySQL database schema name" 131 | }, 132 | { 133 | "name": "PHOTOPRISM_DATABASE_USER", 134 | "value": "photoprism", 135 | "description": "MariaDB or MySQL database user name" 136 | }, 137 | { 138 | "name": "PHOTOPRISM_DATABASE_PASSWORD", 139 | "value": "insecure", 140 | "description": "MariaDB or MySQL database user password" 141 | }, 142 | { 143 | "name": "PHOTOPRISM_SITE_CAPTION", 144 | "value": "AI-Powered Photos App" 145 | }, 146 | { 147 | "name": "PHOTOPRISM_SITE_DESCRIPTION", 148 | "value": "HyperOS - Photoprism", 149 | "description": "meta site description" 150 | }, 151 | { 152 | "name": "PHOTOPRISM_SITE_AUTHOR", 153 | "value": "HyperOS", 154 | "description": "Site author" 155 | } 156 | ], 157 | "ports": [ 158 | { 159 | "host": "2342", 160 | "container": "2342", 161 | "protocol": "tcp", 162 | "description": "Port used by WebUI" 163 | } 164 | ], 165 | "volumes": [ 166 | { 167 | "host": "/vltos/photoprism", 168 | "container": "/photoprism/originals", 169 | "description": "original media files (photos and videos)" 170 | }, 171 | { 172 | "host": "/vltos/photoprism/storage", 173 | "container": "/photoprism/storage", 174 | "description": "*writable* storage folder for cache, database, and sidecar files (never remove)" 175 | } 176 | ], 177 | "depends_on": [ 178 | "photoprism_mariadb" 179 | ] 180 | }, 181 | "photoprism_mariadb": { 182 | "container_name": "photoprism_mariadb", 183 | "restart": "unless-stopped", 184 | "images": { 185 | "x86_64": "mariadb:10.6", 186 | "arm64": "mariadb:10.6" 187 | }, 188 | "command": "mysqld --innodb-buffer-pool-size=512M --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=512 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=120", 189 | "environment": [ 190 | { 191 | "name": "MARIADB_AUTO_UPGRADE", 192 | "value": "1" 193 | }, 194 | { 195 | "name": "MARIADB_INITDB_SKIP_TZINFO", 196 | "value": "1" 197 | }, 198 | { 199 | "name": "MARIADB_DATABASE", 200 | "value": "photoprism" 201 | }, 202 | { 203 | "name": "MARIADB_USER", 204 | "value": "photoprism" 205 | }, 206 | { 207 | "name": "MARIADB_PASSWORD", 208 | "value": "insecure" 209 | }, 210 | { 211 | "name": "MARIADB_ROOT_PASSWORD", 212 | "value": "insecure" 213 | } 214 | ], 215 | "volumes": [ 216 | { 217 | "host": "/hypros/AppData/photoprism/database", 218 | "container": "/var/lib/mysql", 219 | "description": "Database files location *never empty" 220 | } 221 | ] 222 | } 223 | } 224 | } -------------------------------------------------------------------------------- /Apps/photoprism/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PhotoPrism® is an AI-Powered Photos App for the Decentralized Web. 6 | 7 | It makes use of the latest technologies to tag and find pictures automatically without getting in your way. You can run it at home, on a private server, or in the cloud. 8 | 9 | Some of the features include: 10 | - Browse all your photos and videos without worrying about RAW conversion, duplicates or video formats 11 | - Easily find specific pictures using powerful search filters 12 | - Includes four high-resolution world maps to bring back the memories of your favorite trips 13 | - Play Live Photos™ by hovering over them in albums and search results 14 | - Recognizes the faces of your family and friends 15 | - Automatic classification of pictures based on their content and location 16 | 17 | # Privacy Mission 18 | 19 | Our mission is to provide the most user- and privacy-friendly solution to keep your pictures organized and accessible. PhotoPrism was designed from the ground up to run wherever you need it, without compromising freedom, privacy, or functionality. 20 | 21 | Because we are 100% self-funded and independent, we can promise you that we will never sell your data and that we will always be transparent about our software and services. Your data will also never be shared with Google, Amazon, Facebook, or Apple unless you intentionally upload files to one of their services. 🔒 22 | -------------------------------------------------------------------------------- /Apps/photoprism/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/photoprism/metadata/icon.png -------------------------------------------------------------------------------- /Apps/photoprism/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/photoprism/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/pihole/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "pihole", 4 | "name": "Pi-hole", 5 | "description": "Pi-hole is a general purpose network-wide ad-blocker that protects your network from ads and trackers", 6 | "categories": [ 7 | "Network" 8 | ], 9 | "webport": "2092", 10 | "icon": "metadata/icon.png", 11 | "directory": "pihole" 12 | }, 13 | "Services": { 14 | "pihole": { 15 | "images": { 16 | "x86_64": "pihole/pihole:latest", 17 | "arm64": "pihole/pihole:latest", 18 | "armhf": "pihole/pihole:latest" 19 | }, 20 | "container_name": "pihole", 21 | "environment": [ 22 | { 23 | "name": "TZ", 24 | "value": "America/Chicago", 25 | "description": "Timezone" 26 | }, 27 | { 28 | "name": "WEBPASSWORD", 29 | "value": "hyperos", 30 | "description": "Password for WebUI" 31 | } 32 | ], 33 | "ports": [ 34 | { 35 | "host": "53", 36 | "container": "53", 37 | "protocol": "tcp", 38 | "description": "DNS Service port" 39 | }, 40 | { 41 | "host": "53", 42 | "container": "53", 43 | "protocol": "udp", 44 | "description": "DNS Service port" 45 | }, 46 | { 47 | "host": "67", 48 | "container": "67", 49 | "protocol": "udp", 50 | "description": "Only required if you are using Pi-hole as your DHCP server" 51 | }, 52 | { 53 | "host": "2092", 54 | "container": "80", 55 | "protocol": "tcp", 56 | "description": "Web Interface port" 57 | } 58 | ], 59 | "volumes": [ 60 | { 61 | "host": "/hypros/AppData/pihole", 62 | "container": "/pihole", 63 | "description": "Pihole volume" 64 | }, 65 | { 66 | "host": "/hypros/AppData/pihole/dnsmasq.d", 67 | "container": "/piholedns", 68 | "description": "dnsmasq is both a DNS and a DHCP server" 69 | } 70 | ], 71 | "cap_add": [ 72 | "NET_ADMIN" 73 | ], 74 | "restart": "unless-stopped" 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /Apps/pihole/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Pi-hole is a general purpose network-wide ad-blocker that protects your network from ads and trackers without requiring any setup on individual devices. It is able to block ads on any network device (e.g. smart appliances), and, unlike browser add-ons, Pi-hole blocks ads on any type of software. 8 | 9 | # The Pi-hole 10 | is a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software. 11 | 12 | - Easy-to-install: our versatile installer walks you through the process and takes less than ten minutes 13 | 14 | - Responsive: seamlessly speeds up the feel of everyday browsing by caching DNS queries 15 | 16 | - Lightweight: runs smoothly with minimal hardware and software requirements 17 | 18 | - Robust: a command-line interface that is quality assured for interoperability 19 | 20 | - Insightful: a beautiful responsive Web Interface dashboard to view and control your Pi-hole 21 | 22 | - Versatile: can optionally function as a DHCP server, ensuring all your devices are protected automatically 23 | 24 | - Scalable: capable of handling hundreds of millions of queries when installed on server-grade hardware 25 | 26 | - Modern: blocks ads over both IPv4 and IPv6 27 | 28 | - Free: open-source software which helps ensure you are the sole person in control of your privacy 29 | 30 | -------------------------------------------------------------------------------- /Apps/pihole/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/pihole/metadata/icon.png -------------------------------------------------------------------------------- /Apps/pihole/metadata/images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/pihole/metadata/images/dashboard.png -------------------------------------------------------------------------------- /Apps/pihole/metadata/images/initial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/pihole/metadata/images/initial.png -------------------------------------------------------------------------------- /Apps/pihole/metadata/images/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/pihole/metadata/images/login.png -------------------------------------------------------------------------------- /Apps/plex/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "plex", 4 | "name": "plex", 5 | "description": "Plex organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices.", 6 | "categories": [ 7 | "Media" 8 | ], 9 | "webport": "8096", 10 | "icon": "metadata/icon.png", 11 | "directory": "plex" 12 | }, 13 | "Services": { 14 | "plex": { 15 | "images": { 16 | "x86_64": "lscr.io/linuxserver/plex:latest", 17 | "arm": "lscr.io/linuxserver/plex:latest", 18 | "arm64": "lscr.io/linuxserver/plex:latest" 19 | }, 20 | "container_name": "plex", 21 | "environment": [ 22 | { 23 | "name": "PUID", 24 | "value": "1000", 25 | "description": "User ID" 26 | }, 27 | { 28 | "name": "PGID", 29 | "value": "1000", 30 | "description": "Group ID" 31 | }, 32 | { 33 | "name": "VERSION", 34 | "value": "docker", 35 | "description": "Set whether to update plex or not (See linuxserver/plex application section for more informations)" 36 | }, 37 | { 38 | "name": "PLEX_CLAIM", 39 | "value": "", 40 | "description": "Optionally you can obtain a claim token from https://plex.tv/claim and input here. Keep in mind that the claim tokens expire within 4 minutes." 41 | } 42 | ], 43 | "ports": [ 44 | { 45 | "host": "32400", 46 | "container": "32400", 47 | "description": "Web Interface port" 48 | } 49 | ], 50 | "volumes": [ 51 | { 52 | "host": "/hypros/AppData/plex/config", 53 | "container": "/config", 54 | "description": "Plex library location. This can grow very large, 50gb+ is likely for a large collection." 55 | }, 56 | { 57 | "host": "/hypros/Media/TV", 58 | "container": "/tv", 59 | "description": "Media directory for tv series" 60 | }, 61 | { 62 | "host": "/hypros/Media/Movies", 63 | "container": "/movie", 64 | "description": "Media directory for movies" 65 | } 66 | ], 67 | "devices": [ 68 | { 69 | "container": "/dev/dri", 70 | "host": "/dev/dri", 71 | "description": "Video device for hardware acceleration" 72 | } 73 | ], 74 | "restart": "unless-stopped" 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /Apps/plex/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Plex organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. 7 | 8 | ## A Single Library Means Easy Sharing 9 | 10 | Adding an App to your Plex setup is simple. Install the App, launch it and watch as it discovers any Plex Servers on the network. The Server sends the App details about your media library, ready for you to watch. The nice thing about this process is that with the Server installed and running, you don’t have to do anything more than that. It literally takes seconds to get an App up and playing media. 11 | 12 | ## Centralized Management 13 | 14 | Having all your media housed by a central Server means you have a single place to manage your media collection. You might have some new movies to add, or don’t like the poster image being used for your favorite TV Show. Every aspect of the Server is managed by the Plex Web App. It runs in a web browser from anywhere in your home, so you don’t have to be at a particular computer to manage your library. Once a change is made, it’s immediately available to all the Apps in your home without having to do anything extra. 15 | 16 | ## Plex Pass 17 | With a Plex Pass subscription, you can do even more. First off, there are loads of premium features—set up a DVR to watch and record over-the-air content with a tuner & antenna, sync media to your mobile device for offline access, and get early access and discounts on various things. You also get audio enhancements, parental controls, and much more. -------------------------------------------------------------------------------- /Apps/plex/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/plex/metadata/icon.png -------------------------------------------------------------------------------- /Apps/plex/metadata/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/plex/metadata/screenshot.jpg -------------------------------------------------------------------------------- /Apps/prowlarr/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "prowlarr", 4 | "name": "Prowlarr", 5 | "description": "prowlarr is a indexer manager/proxy/", 6 | "categories": [ 7 | "Torrent" 8 | ], 9 | "webport": "9696", 10 | "icon": "metadata/icon.png", 11 | "directory": "prowlarr" 12 | }, 13 | "Services": { 14 | "prowlarr": { 15 | "container_name": "prowlarr", 16 | "images": { 17 | "x86_64": "lscr.io/linuxserver/prowlarr:develop", 18 | "arm64": "lscr.io/linuxserver/prowlarr:develop", 19 | "armhf": "lscr.io/linuxserver/prowlarr:develop" 20 | }, 21 | "ports": [ 22 | { 23 | "host": "9696", 24 | "container": "9696", 25 | "description": "Web Interface port" 26 | } 27 | ], 28 | "environment": [ 29 | { 30 | "name": "TZ", 31 | "value": "America/New_York", 32 | "description": "Timezone" 33 | }, 34 | { 35 | "name": "PUID", 36 | "value": "1000", 37 | "description": "User ID" 38 | }, 39 | { 40 | "name": "PGID", 41 | "value": "1000", 42 | "description": "Group ID" 43 | } 44 | ], 45 | "volumes": [ 46 | { 47 | "host": "/hypros/AppData/prowlarr/config", 48 | "container": "/config", 49 | "description": "Config directory" 50 | } 51 | ], 52 | "restart": "unless-stopped" 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /Apps/prowlarr/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with: 7 | 8 | - Lidarr. 9 | - Mylar3. 10 | - Radarr. 11 | - Readarr. 12 | - Sonarr. 13 | 14 | offering complete management of your indexers with no per app Indexer setup required (we do it all). 15 | 16 | ## Major Features Includes 17 | 18 | - Usenet support for 24 indexers natively, including Headphones VIP 19 | - Usenet support for any Newznab compatible indexer via "Generic Newznab" 20 | - Torrent support for over 500 trackers with more added all the time 21 | - Torrent support for any Torznab compatible tracker via "Generic Torznab" 22 | - Support for custom YML definitions via Cardigann that includes JSON and XML parsing 23 | - Indexer Sync to Lidarr/Mylar3/Radarr/Readarr/Sonarr, so no manual configuration of the other applications are required 24 | - Indexer history and statistics 25 | - Manual searching of Trackers & Indexers at a category level 26 | - Parameter based manual searching 27 | - Support for pushing multiple releases at once directly to your download clients from Prowlarr 28 | - Indexer health and status notifications 29 | - Per Indexer proxy support (SOCKS4, SOCKS5, HTTP, Flaresolverr) 30 | -------------------------------------------------------------------------------- /Apps/prowlarr/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/prowlarr/metadata/icon.png -------------------------------------------------------------------------------- /Apps/prowlarr/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/prowlarr/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/radarr/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "radarr", 4 | "name": "Radarr", 5 | "description": "Radarr is a movie collection manager", 6 | "categories": [ 7 | "Media", 8 | "Torrent" 9 | ], 10 | "webport": "7878", 11 | "icon": "metadata/icon.png", 12 | "directory": "radarr" 13 | }, 14 | "Services": { 15 | "radarr": { 16 | "images": { 17 | "x86_64": "linuxserver/radarr:nightly", 18 | "armhf": "linuxserver/radarr:latest", 19 | "arm64": "linuxserver/radarr:latest" 20 | }, 21 | "restart": "unless-stopped", 22 | "container_name": "radarr", 23 | "environment": [ 24 | { 25 | "name": "PUID", 26 | "value": "1000", 27 | "description": "Ensure any volume directories on the host are owned by the same user" 28 | }, 29 | { 30 | "name": "PGID", 31 | "value": "1000", 32 | "description": "Ensure any volume directories on the host are owned by the same group" 33 | }, 34 | { 35 | "name": "TZ", 36 | "value": "America/Sao_Paulo", 37 | "description": "Timezone" 38 | }, 39 | { 40 | "name": "UMASK_SET", 41 | "value": "022", 42 | "description": "Define umask settings for file permissions" 43 | } 44 | ], 45 | "ports": [ 46 | { 47 | "host": "7878", 48 | "container": "7878", 49 | "protocol": "tcp", 50 | "description": "Port used by WebUI" 51 | } 52 | ], 53 | "volumes": [ 54 | { 55 | "host": "/hypros/AppData/radarr/config", 56 | "container": "/config", 57 | "description": "Place to save our configuration files" 58 | }, 59 | { 60 | "host": "/hypros/Media/Movies", 61 | "container": "/movies", 62 | "description": "Place to save your media" 63 | }, 64 | { 65 | "host": "/hypros/Downloads", 66 | "container": "/downloads", 67 | "description": "Download directory (The same as your torrent client)" 68 | } 69 | ] 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /Apps/radarr/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Radarr is a movie collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new movies and will interface with clients and indexers to grab, sort, and rename them. It can also be configured to automatically upgrade the quality of existing files in the library when a better quality format becomes available. 7 | 8 | # Major Features Include 9 | 10 | - Adding new movies with lots of information, such as trailers, ratings, etc. 11 | - Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc. 12 | - Can watch for better quality of the movies you have and do an automatic upgrade. e.g. from DVD to Blu-Ray 13 | - Automatic failed download handling will try another release if one fails 14 | - Manual search so you can pick any release or to see why a release was not downloaded automatically 15 | - Full integration with SABnzbd and NZBGet 16 | - Automatically searching for releases as well as RSS Sync 17 | - Automatically importing downloaded movies 18 | - Recognizing Special Editions, Director's Cut, etc. 19 | - Identifying releases with hardcoded subs 20 | - Identifying releases with AKA movie names 21 | - SABnzbd, NZBGet, QBittorrent, Deluge, rTorrent, Transmission, uTorrent, and other download clients are supported and integrated 22 | - Full integration with Kodi and Plex (notifications, library updates) 23 | - Importing Metadata such as trailers or subtitles 24 | - Adding metadata such as posters and information for Kodi and others to use 25 | - Advanced customization for profiles, such that Radarr will always download the copy you want 26 | - A beautiful UI 27 | -------------------------------------------------------------------------------- /Apps/radarr/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/radarr/metadata/icon.png -------------------------------------------------------------------------------- /Apps/radarr/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/radarr/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/sonarr/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "sonarr", 4 | "name": "Sonarr", 5 | "description": "Sonarr (formerly NZBdrone) is a PVR for usenet and bittorrent users.", 6 | "categories": [ 7 | "Media", 8 | "Torrent" 9 | ], 10 | "webport": "8989", 11 | "icon": "metadata/icon.png", 12 | "directory": "sonarr" 13 | }, 14 | "Services": { 15 | "sonarr": { 16 | "images": { 17 | "arm64": "linuxserver/sonarr:arm64-latest", 18 | "armhf": "linuxserver/sonarr:armhf-latest", 19 | "x86_64": "linuxserver/sonarr:latest" 20 | }, 21 | "container_name": "sonarr", 22 | "ports": [ 23 | { 24 | "container": "8989", 25 | "host": "8989", 26 | "description": "Web Interface port" 27 | } 28 | ], 29 | "volumes": [ 30 | { 31 | "host": "/hypros/AppData/sonarr/config", 32 | "container": "/config", 33 | "description": "Config directory" 34 | }, 35 | { 36 | "host": "/hypros/Media/TV", 37 | "container": "/tv", 38 | "description": "Media directory" 39 | }, 40 | { 41 | "host": "/hypros/Downloads", 42 | "container": "/downloads", 43 | "description": "Download directory (The same as your torrent client)" 44 | } 45 | ], 46 | "environment": [ 47 | { 48 | "name": "TZ", 49 | "value": "America/New_York", 50 | "description": "Timezone" 51 | }, 52 | { 53 | "name": "PUID", 54 | "value": "1000", 55 | "description": "User ID" 56 | }, 57 | { 58 | "name": "PGID", 59 | "value": "1000", 60 | "description": "Group ID" 61 | } 62 | ], 63 | "restart": "unless-stopped" 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /Apps/sonarr/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Sonarr (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. 7 | 8 | -------------------------------------------------------------------------------- /Apps/sonarr/metadata/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/sonarr/metadata/calendar.png -------------------------------------------------------------------------------- /Apps/sonarr/metadata/downloadhandling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/sonarr/metadata/downloadhandling.png -------------------------------------------------------------------------------- /Apps/sonarr/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/sonarr/metadata/icon.png -------------------------------------------------------------------------------- /Apps/sonarr/metadata/manualsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/sonarr/metadata/manualsearch.png -------------------------------------------------------------------------------- /Apps/sonarr/metadata/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/sonarr/metadata/screenshot.png -------------------------------------------------------------------------------- /Apps/transmission/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "App": { 3 | "id": "transmission", 4 | "name": "Transmission", 5 | "description": "Transmission is a cross-platform BitTorrent client", 6 | "categories": [ 7 | "Files", 8 | "Torrent" 9 | ], 10 | "webport": "9091", 11 | "icon": "metadata/icon.png", 12 | "directory": "transmission" 13 | }, 14 | "Services": { 15 | "transmission": { 16 | "container_name": "transmission", 17 | "images": { 18 | "x86_64": "linuxserver/transmission:latest", 19 | "armhf": "linuxserver/transmission:armhf-latest", 20 | "arm64": "linuxserver/transmission:arm64-latest" 21 | }, 22 | "ports": [ 23 | { 24 | "container": "9091", 25 | "host": "9091", 26 | "protocol": "tcp", 27 | "description": "Web Interface port" 28 | }, 29 | { 30 | "container": "51413", 31 | "host": "51413", 32 | "protocol": "tcp", 33 | "description": "Torrent Port TCP" 34 | }, 35 | { 36 | "container": "51413", 37 | "host": "51413", 38 | "protocol": "udp", 39 | "description": "Torrent Port UDP" 40 | } 41 | ], 42 | "volumes": [ 43 | { 44 | "host": "/hypros/AppData/transmission/config", 45 | "container": "/config", 46 | "description": "Config Directory" 47 | }, 48 | { 49 | "host": "/hypros/Downloads", 50 | "container": "/downloads", 51 | "description": "Downloads Directory" 52 | } 53 | ], 54 | "environment": [ 55 | { 56 | "name": "TZ", 57 | "description": "Timezone", 58 | "value": "America/New_York" 59 | }, 60 | { 61 | "name": "USER", 62 | "description": "Specify an optional username for the interface", 63 | "value": "hyperos" 64 | }, 65 | { 66 | "name": "PASS", 67 | "description": "Specify an optional password for the interface", 68 | "value": "hyperos" 69 | }, 70 | { 71 | "name": "HOST_WHITELIST", 72 | "description": "Specify an optional list of comma separated ip whitelist. Fills rpc-whitelist setting.", 73 | "value": "" 74 | }, 75 | { 76 | "name": "PUID", 77 | "description": "Ensure any volume directories on the host are owned by the same user", 78 | "value": "1000" 79 | }, 80 | { 81 | "name": "PGID", 82 | "description": "Ensure any volume directories on the host are owned by the same group", 83 | "value": "1000" 84 | }, 85 | { 86 | "name": "TRANSMISSION_WEB_HOME", 87 | "value": "/flood-for-transmission/", 88 | "options": [ 89 | "/combustion-release/", 90 | "/transmission-web-control/", 91 | "/kettu/", 92 | "/flood-for-transmission/", 93 | "/transmissionic/" 94 | ], 95 | "description": "UI used on front-end" 96 | } 97 | ], 98 | "restart": "unless-stopped" 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /Apps/transmission/metadata/app.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Transmission is an open source, volunteer-based project. Unlike some BitTorrent clients, Transmission doesn't play games with its users to make money: 8 | 9 | - Transmission doesn't bundle toolbars, pop-up ads, flash ads, twitter tools, or anything else. 10 | - It doesn't hold some features back for a payware version. 11 | - Its source code is available for anyone to review. 12 | - We don't track our users, and our website and forums have no third-party ads or analytics. 13 | 14 | ## Easy. 15 | 16 | Transmission is designed for easy, powerful use. We've set the defaults to "Just Work" and it only takes a few clicks to configure advanced features like watch directories, bad peer blocklists, and the web interface. When Ubuntu chose Transmission as its default BitTorrent client, one of the most-cited reasons was its easy learning curve. 17 | 18 | ## Lean. 19 | 20 | In separate benchmarks, Linux Format and Lacrocivious both found Transmission to use less CPU than any other GUI client. It even used less CPU than some non-GUI clients. 21 | 22 | Transmission also has the lowest memory footprint of any major BitTorrent client. 23 | 24 | Imageshack chose Transmission for its BitTorrent farms because the competition "requires amounts of memory several times greater than Transmission". 25 | 26 | Transmission's small footprint is one reason why many home device manufacturers, such as FON, Belkin, and Networked Media Tank ship with Transmission. When Belkin and Vuze Inc. partnered to write a "Torrent Genie" to let people who ran Vuze and owned a Belkin router keep sharing files even when Vuze wasn't running, they decided to use Transmission -- not Vuze's own BitTorrent client -- on the router. -------------------------------------------------------------------------------- /Apps/transmission/metadata/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/transmission/metadata/icon.png -------------------------------------------------------------------------------- /Apps/transmission/metadata/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gethyperos/apps/e7bb66a6c732afc954ce3e617113e9f549122411/Apps/transmission/metadata/screenshot.jpg -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. -------------------------------------------------------------------------------- /categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "name": "Files", "icon": "IoFolderOpenOutline" }, 3 | { "name": "Torrent", "icon": "IoDownloadOutline" }, 4 | { "name": "Network", "icon": "IoWifiOutline" }, 5 | { "name": "Media", "icon": "IoPlayOutline" }, 6 | { "name": "Reading", "icon": "IoBookOutline" }, 7 | { "name": "Development", "icon": "IoCode" }, 8 | { "name": "Cloud", "icon": "IoCloudOutline" }, 9 | { "name": "Finance", "icon": "IoWalletOutline" }, 10 | { "name": "Games", "icon": "IoGameControllerOutline" }, 11 | { "name": "Learning", "icon": "IoSchoolOutline" }, 12 | { "name": "Notes", "icon": "IoCreateOutline" }, 13 | { "name": "Home Automation", "icon": "IoHomeOutline" }, 14 | { "name": "Utility", "icon": "IoColorWandOutline" } 15 | ] -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Repository index generator 2 | // 3 | 4 | // List of available icons: 5 | // https://ionic.io/ionicons 6 | // 7 | 8 | const fs = require('fs') 9 | const Validator = require('jsonschema').Validator; 10 | const validator = new Validator(); 11 | const console = require('consola') 12 | 13 | function readJson(path) { 14 | return JSON.parse(fs.readFileSync(path, 'utf8')) 15 | } 16 | 17 | function writeJson(path, data) { 18 | fs.writeFileSync(path, JSON.stringify(data, null, 2)) 19 | } 20 | 21 | 22 | function enforceCategories() { 23 | const Categories = readJson('./categories.json') 24 | const Schema = readJson('./schemas/categories.schema.json') 25 | const validationResult = validator.validate(Categories, Schema) 26 | 27 | if (validationResult.errors.length > 0) { 28 | console.error(`Invalid categories.json`) 29 | validationResult.errors.forEach( err => { 30 | console.info(`${err.stack ?? err.property + ' ' + err.nessage}`) 31 | }) 32 | process.exit(1) 33 | } else { 34 | console.success(`categories.json is valid`) 35 | } 36 | } 37 | 38 | function generateAppIndex() { 39 | try { 40 | const Apps = [] 41 | const UniqueIds = [] 42 | 43 | const categories = readJson('./categories.json') 44 | 45 | fs.readdirSync('./Apps').forEach(path => { 46 | if (!fs.lstatSync(`./Apps/${path}`).isDirectory) { return } 47 | 48 | const appManifest = readJson(`./Apps/${path}/app.json`) 49 | 50 | const Schema = readJson('./schemas/app.schema.json') 51 | const validationResult = validator.validate(appManifest, Schema) 52 | 53 | 54 | appManifest.App.categories.forEach( category => { 55 | const foundCategory = categories.filter( c => c.name === category ) 56 | if (foundCategory.length < 1) { 57 | console.warn(`App "${appManifest.App.name}" has invalid category: ${category}`) 58 | process.exit(1) 59 | } 60 | }) 61 | 62 | if (UniqueIds.includes(appManifest.App.id)) { 63 | console.warn(`Duplicate app id: ${appManifest.App.id} for: ${path}/app.json`) 64 | process.exit(1) 65 | } 66 | 67 | try { 68 | fs.readFileSync(`Apps/${path}/${appManifest.App.icon}`) 69 | } catch (e) { 70 | console.warn(`App "${appManifest.App.name}" has invalid icon path! 71 | ${appManifest.App.icon} (Icon not found) 72 | Missing icon doesn\'t prevent your app from validating, but it won\'t be merged.` 73 | ) 74 | } 75 | 76 | UniqueIds.push(appManifest.App.id) 77 | Apps.push({ 78 | id: appManifest.App.id, 79 | name: appManifest.App.name, 80 | description: appManifest.App.description, 81 | directory: path, 82 | icon: `Apps/${path}/${appManifest.App.icon}`, 83 | manifest: `Apps/${path}/app.json`, 84 | metadata: `Apps/${path}/metadata/app.md`, 85 | categories: appManifest.App.categories 86 | }) 87 | 88 | if (validationResult.errors.length > 0) { 89 | console.error(`Invalid app manifest: ${path}/app.json`) 90 | validationResult.errors.forEach( err => { 91 | console.info(`${err.stack ?? err.property + ' ' + err.nessage}`) 92 | }) 93 | process.exit(1) 94 | } else { 95 | console.success(`App "${appManifest.App.name}" is valid`) 96 | } 97 | 98 | appManifest.App.directory = path 99 | fs.writeFileSync(`Apps/${path}/app.json`, JSON.stringify(appManifest, null, 2)) 100 | }) 101 | 102 | writeJson( './index.json', Apps.sort() ) 103 | } catch(e) { 104 | console.error(`${e}`) 105 | } 106 | } 107 | 108 | enforceCategories() 109 | generateAppIndex() -------------------------------------------------------------------------------- /index.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "deluge", 4 | "name": "Deluge", 5 | "description": "Deluge is a cross-platform BitTorrent client", 6 | "directory": "deluge", 7 | "icon": "Apps/deluge/metadata/icon.png", 8 | "manifest": "Apps/deluge/app.json", 9 | "metadata": "Apps/deluge/metadata/app.md", 10 | "categories": [ 11 | "Files", 12 | "Torrent" 13 | ] 14 | }, 15 | { 16 | "id": "jellyfin", 17 | "name": "Jellyfin", 18 | "description": "Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media", 19 | "directory": "jellyfin", 20 | "icon": "Apps/jellyfin/metadata/icon.png", 21 | "manifest": "Apps/jellyfin/app.json", 22 | "metadata": "Apps/jellyfin/metadata/app.md", 23 | "categories": [ 24 | "Media" 25 | ] 26 | }, 27 | { 28 | "id": "linkding", 29 | "name": "linkding", 30 | "description": "Self-hosted bookmark service", 31 | "directory": "linkding", 32 | "icon": "Apps/linkding/metadata/icon.png", 33 | "manifest": "Apps/linkding/app.json", 34 | "metadata": "Apps/linkding/metadata/app.md", 35 | "categories": [ 36 | "Reading" 37 | ] 38 | }, 39 | { 40 | "id": "miniflux", 41 | "name": "Miniflux", 42 | "description": "Miniflux is a minimalist and opinionated feed reader.", 43 | "directory": "miniflux", 44 | "icon": "Apps/miniflux/metadata/icon.png", 45 | "manifest": "Apps/miniflux/app.json", 46 | "metadata": "Apps/miniflux/metadata/app.md", 47 | "categories": [ 48 | "Media", 49 | "Reading" 50 | ] 51 | }, 52 | { 53 | "id": "photoprism", 54 | "name": "PhotoPrism", 55 | "description": "AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.", 56 | "directory": "photoprism", 57 | "icon": "Apps/photoprism/metadata/icon.png", 58 | "manifest": "Apps/photoprism/app.json", 59 | "metadata": "Apps/photoprism/metadata/app.md", 60 | "categories": [ 61 | "Media" 62 | ] 63 | }, 64 | { 65 | "id": "pihole", 66 | "name": "Pi-hole", 67 | "description": "Pi-hole is a general purpose network-wide ad-blocker that protects your network from ads and trackers", 68 | "directory": "pihole", 69 | "icon": "Apps/pihole/metadata/icon.png", 70 | "manifest": "Apps/pihole/app.json", 71 | "metadata": "Apps/pihole/metadata/app.md", 72 | "categories": [ 73 | "Network" 74 | ] 75 | }, 76 | { 77 | "id": "plex", 78 | "name": "plex", 79 | "description": "Plex organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices.", 80 | "directory": "plex", 81 | "icon": "Apps/plex/metadata/icon.png", 82 | "manifest": "Apps/plex/app.json", 83 | "metadata": "Apps/plex/metadata/app.md", 84 | "categories": [ 85 | "Media" 86 | ] 87 | }, 88 | { 89 | "id": "prowlarr", 90 | "name": "Prowlarr", 91 | "description": "prowlarr is a indexer manager/proxy/", 92 | "directory": "prowlarr", 93 | "icon": "Apps/prowlarr/metadata/icon.png", 94 | "manifest": "Apps/prowlarr/app.json", 95 | "metadata": "Apps/prowlarr/metadata/app.md", 96 | "categories": [ 97 | "Torrent" 98 | ] 99 | }, 100 | { 101 | "id": "radarr", 102 | "name": "Radarr", 103 | "description": "Radarr is a movie collection manager", 104 | "directory": "radarr", 105 | "icon": "Apps/radarr/metadata/icon.png", 106 | "manifest": "Apps/radarr/app.json", 107 | "metadata": "Apps/radarr/metadata/app.md", 108 | "categories": [ 109 | "Media", 110 | "Torrent" 111 | ] 112 | }, 113 | { 114 | "id": "sonarr", 115 | "name": "Sonarr", 116 | "description": "Sonarr (formerly NZBdrone) is a PVR for usenet and bittorrent users.", 117 | "directory": "sonarr", 118 | "icon": "Apps/sonarr/metadata/icon.png", 119 | "manifest": "Apps/sonarr/app.json", 120 | "metadata": "Apps/sonarr/metadata/app.md", 121 | "categories": [ 122 | "Media", 123 | "Torrent" 124 | ] 125 | }, 126 | { 127 | "id": "transmission", 128 | "name": "Transmission", 129 | "description": "Transmission is a cross-platform BitTorrent client", 130 | "directory": "transmission", 131 | "icon": "Apps/transmission/metadata/icon.png", 132 | "manifest": "Apps/transmission/app.json", 133 | "metadata": "Apps/transmission/metadata/app.md", 134 | "categories": [ 135 | "Files", 136 | "Torrent" 137 | ] 138 | } 139 | ] -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "repository_template", 3 | "version": "0.0.1", 4 | "description": "Repository template for VoltaOS", 5 | "main": "index.js", 6 | "repository": "https://github.com/voltaos/repository_template", 7 | "author": "Nodge", 8 | "license": "GNU GPL 3", 9 | "private": false, 10 | "dependencies": { 11 | "consola": "^2.15.3", 12 | "jsonschema": "^1.4.1" 13 | }, 14 | "scripts": { 15 | "prepare": "husky install", 16 | "validate": "node ./index.js" 17 | }, 18 | "devDependencies": { 19 | "husky": "^8.0.1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | [![Contributors][contributors-shield]][contributors-url] 6 | [![MIT License][license-shield]][license-url] 7 | 8 |
9 | 10 |
11 | 12 |
13 | 14 |

15 | 16 |

17 | 18 |
19 | 20 | 21 |

22 | Collection of curated apps for HyperOS the no bullshit home-server dashboard. 23 |
24 | View apps 25 | · 26 | Request new app 27 | · 28 | Submit new app 29 |

30 |
31 | 32 | ## This repository contains all official apps for hyperos. 33 | 34 | - Based on the [hypr-repository](https://github.com/getHyperOS/hypr-repository) template 35 | - Doesn't contain any core functionality for HyperOS, allowing users to build their own custom repository. 36 | 37 | ## Contributing 38 | 39 | --- 40 | 41 |
42 | Making new apps 43 | 44 | Fork this repository, create a new app under the `Apps` directory.
45 | Now, let's populate the folder with the files we need. 46 | 47 | 48 | 📂 yourapp
49 | └ 📝 app.json 50 | 51 | 52 | This file is your entry for describing the functionality of this app. 53 | - It works by extending the popular `docker-compose` format. 54 | - Auto-completion and intelisense is provided by a json schema, almost every field has a description on hover if you need it. 55 | - Every file path specified is relative to itself (ex: `metadata/icons.png` = `Apps//icon.png`) 56 | 57 | Your `App` property describes how the app should behave on the front-end.
58 | - The `directory` property will be automatically filled for you when running the validation script or by husky when commiting. 59 | - The Icon property: [click here](https://www.figma.com/file/Z2ITlEF1MDClLfaClekQ8x/HyperOS?node-id=14%3A3) To access our figma file with the icon template and many alredy-made icons.
Like everything else on your app, the icon path is relative to app.json. 60 | 61 |
62 | 63 | 📂 yourapp
64 | └ 📂 metadata
65 |    └ 📝 app.md 66 | 67 | This file is displayed on your app page under HyperOS web interface, it should contains a more detailed description about your app and what it does 68 | 69 | HyperOS parses some extra tags to better fit the appStore: 70 | 71 | - ` ` The gallery tag accepts multiple images as content, drawing the horizontal image slide (usually shown as first element on appstore) 72 | - `` Image requires the appId and image path as props, path is relative to app.json 73 | 74 |
75 | 76 | --- 77 | 78 | 79 |
80 | Issues / Requesting new apps 81 | 82 | Feel free to open issues requesting new apps, bare in mind the official repository has few rules that every app must fit: 83 | 84 | - Applications directly related to porn are not allowed. 85 | - Crypto mining related applications are not allowed, you might wanna look at [Umbrel](https://github.com/getumbrel/). 86 | 87 |
88 | 89 | ### Pull requests 90 | 91 | - Icons must have same look-and-feel. 92 | - Non nullable environment variables must have a description. 93 | - Nullable environmet variables may have an empty string as value. 94 | - Unless required to function, apps should use the `/hypros` directory for volume bindings 95 | - Make sure your app has the needed metadata. 96 | 97 | 98 | Your app is validated before you commit by Husky. 99 | Use the provided PR template whenever it's possible. 100 | You can manually validate your app to check if everything is going well by running `npm run validate` or `yarn validate` (remember to install dependencies first) 101 | 102 | 103 | 104 | 105 | 106 | [contributors-shield]: https://img.shields.io/github/contributors/gethyperos/apps.svg?style=for-the-badge 107 | [contributors-url]: https://github.com/gethyperos/apps/graphs/contributors 108 | [license-shield]: https://img.shields.io/github/license/gethyperos/apps.svg?style=for-the-badge 109 | [license-url]: https://github.com/gethyperos/apps/blob/master/LICENSE.txt 110 | -------------------------------------------------------------------------------- /schemas/app.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$id": "https://github.com/gethyperos/hypr-repository/tree/master/schemas/app.schema.json", 3 | "$schema": "http://json-schema.org/draft-07/schema#", 4 | "title": "App", 5 | "type": "object", 6 | "properties": { 7 | "App": { 8 | "type": "object", 9 | "description": "HyperOS App specifications", 10 | "properties": { 11 | "webport": { 12 | "type": "string", 13 | "description": "Default port for web interface (if any)" 14 | }, 15 | "id": { 16 | "type": "string", 17 | "description": "App Unique Identifier", 18 | "pattern": "^[a-z0-9-_]+$" 19 | }, 20 | "name": { 21 | "type": "string", 22 | "description": "App Name" 23 | }, 24 | "icon": { 25 | "type": "string", 26 | "description": "App Icon file (relative to app.json)", 27 | "pattern": ".*\\.(webp|png|gif)" 28 | }, 29 | "description": { 30 | "type": "string", 31 | "description": "App Description", 32 | "minItems": 1, 33 | "uniqueItems": true 34 | }, 35 | "categories": { 36 | "type": "array", 37 | "description": "App Categories (Must exist in categories.json file)", 38 | "items": { 39 | "type": "string" 40 | }, 41 | "minItems": 1 42 | }, 43 | "directory": { 44 | "type": "string", 45 | "description": "Directory name where this app.json is located (Usually the app name)", 46 | "pattern": "^[a-zA-Z0-9-_]+$" 47 | } 48 | }, 49 | "required": [ 50 | "id", 51 | "name", 52 | "description", 53 | "categories", 54 | "icon", 55 | "directory" 56 | ], 57 | "examples": [ 58 | { 59 | "id": "welcome", 60 | "name": "HyperOS Example app", 61 | "description": "HyperOS App Template", 62 | "categories": ["Example"], 63 | "icon": "example.png", 64 | "directory": "welcome" 65 | } 66 | ] 67 | }, 68 | "Services": { 69 | "description": "Docker-compose style services list but expanded to allow Volta customizability", 70 | "type": "object", 71 | "patternProperties": { 72 | "^[a-zA-Z0-9_-]+$": { 73 | "type": "object", 74 | "description": "Service", 75 | "properties": { 76 | "images": { 77 | "type": "object", 78 | "description": "App Docker images for supported platforms", 79 | "properties": { 80 | "armhf": { 81 | "type": "string", 82 | "description": "Arm / ArmHF image" 83 | }, 84 | "arm64": { 85 | "type": "string", 86 | "description": "Arm64 image" 87 | }, 88 | "x86_64": { 89 | "type": "string", 90 | "description": "Default image (32/64bit)" 91 | } 92 | }, 93 | "required": ["x86_64"] 94 | }, 95 | "container_name": { 96 | "type": "string", 97 | "description": "Container name, which will be later prefix by vltos-", 98 | "pattern": "^[a-zA-Z0-9-_]+$" 99 | }, 100 | "environment": { 101 | "type": "array", 102 | "description": "Environment variables for the container", 103 | "items": { 104 | "type": "object", 105 | "properties": { 106 | "name": { 107 | "type": "string", 108 | "description": "Environment variable name" 109 | }, 110 | "value": { 111 | "type": "string", 112 | "description": "Environment variable value" 113 | }, 114 | "description": { 115 | "type": "string", 116 | "description": "Environment variable description (Used by front-end)" 117 | } 118 | }, 119 | "required": ["name", "value"], 120 | "minItems": 1 121 | } 122 | }, 123 | "ports": { 124 | "type": "array", 125 | "description": "Ports for the container", 126 | "items": { 127 | "type": "object", 128 | "properties": { 129 | "host": { 130 | "type": "string", 131 | "description": "Port to be exposed on HOST" 132 | }, 133 | "container": { 134 | "type": "string", 135 | "description": "Port on container" 136 | }, 137 | "protocol": { 138 | "type": "string", 139 | "description": "Protocol (tcp/udp) defaults to tcp", 140 | "enum": ["tcp", "udp"] 141 | }, 142 | "description": { 143 | "type": "string", 144 | "description": "Port description (Used by front-end)" 145 | } 146 | }, 147 | "required": ["host", "container", "description"], 148 | "minItems": 1 149 | } 150 | }, 151 | "volumes": { 152 | "type": "array", 153 | "description": "Volume bindings for the container", 154 | "items": { 155 | "type": "object", 156 | "properties": { 157 | "host": { 158 | "type": "string", 159 | "description": "Path on host", 160 | "pattern": "((\\.{2}/{1})+|((\\.{1}/{1})?)|(/{1}))([a-zA-Z0-9])+$" 161 | }, 162 | "container": { 163 | "type": "string", 164 | "description": "Path on container", 165 | "pattern": "((\\.{2}/{1})+|((\\.{1}/{1})?)|(/{1}))([a-zA-Z0-9])+$" 166 | }, 167 | "description": { 168 | "type": "string", 169 | "description": "Volume description (Used by front-end)" 170 | } 171 | }, 172 | "required": ["host", "container"], 173 | "minItems": 1 174 | } 175 | }, 176 | "devices": { 177 | "type": "array", 178 | "description": "Devices for the container", 179 | "items": [ 180 | { 181 | "type": "object", 182 | "properties": { 183 | "host": { 184 | "type": "string", 185 | "description": "Path on host", 186 | "pattern": "((\\.{2}/{1})+|((\\.{1}/{1})?)|(/{1}))(([a-zA-Z0-9]+/{1})+)([a-zA-Z0-9])+$" 187 | }, 188 | "container": { 189 | "type": "string", 190 | "description": "Path on container", 191 | "pattern": "((\\.{2}/{1})+|((\\.{1}/{1})?)|(/{1}))(([a-zA-Z0-9]+/{1})+)([a-zA-Z0-9])+$" 192 | }, 193 | "description": { 194 | "type": "string", 195 | "description": "Device description (Used by front-end)" 196 | } 197 | }, 198 | "required": ["host", "container"], 199 | "minItems": 1 200 | } 201 | ] 202 | }, 203 | "cap_add": { 204 | "type": "array", 205 | "description": "Capabilities to add to the container", 206 | "items": { 207 | "type": "string", 208 | "description": "Capability name", 209 | "pattern": "^[a-zA-Z0-9-_]+$" 210 | }, 211 | "minItems": 1 212 | }, 213 | "cap_drop": { 214 | "type": "array", 215 | "description": "Capabilities to drop from the container", 216 | "items": { 217 | "type": "string", 218 | "description": "Capability name", 219 | "pattern": "^[a-zA-Z0-9-_]+$" 220 | }, 221 | "minItems": 1 222 | }, 223 | "restart": { 224 | "type": "string", 225 | "description": "Restart policy for the container", 226 | "enum": ["no", "always", "on-failure", "unless-stopped"] 227 | }, 228 | "network_mode": { 229 | "type": "object", 230 | "description": " set service containers network mode.", 231 | "properties": { 232 | "mode": { 233 | "description": "Network mode (must include service name if using service mode)", 234 | "enum": ["host", "none", "service"], 235 | "type": "string" 236 | }, 237 | "service": { 238 | "description": "Service name in case mode = service", 239 | "type": "string" 240 | } 241 | }, 242 | "required": ["mode"] 243 | }, 244 | "logging": { 245 | "type": "object", 246 | "description": "logging defines the logging configuration for the service.", 247 | "properties": { 248 | "driver": { 249 | "type": "string", 250 | "description": "Logging driver", 251 | "enum": [ 252 | "json-file", 253 | "syslog", 254 | "journald", 255 | "gelf", 256 | "fluentd", 257 | "fluentbit" 258 | ] 259 | }, 260 | "options": { 261 | "type": "object", 262 | "description": "Logging driver options", 263 | "properties": { 264 | "tag": { 265 | "type": "string", 266 | "description": "Logging tag" 267 | } 268 | }, 269 | "minItems": 1 270 | } 271 | }, 272 | "required": ["driver"] 273 | }, 274 | "security_opt": { 275 | "type": "array", 276 | "description": "security_opt overrides the default labeling scheme for each container.", 277 | "items": { 278 | "type": "string", 279 | "description": "Security option", 280 | "pattern": "^[a-zA-Z0-9-_]+$" 281 | }, 282 | "minItems": 1 283 | }, 284 | "command": { 285 | "type": "string", 286 | "description": "Overrides the command executed on container start-up" 287 | }, 288 | "depends_on": { 289 | "type": "array", 290 | "items": { 291 | "type": "string", 292 | "description": "Expresses startup and shutdown dependencies between services (the name must match the service key).", 293 | "pattern": "^[a-zA-Z0-9_-]+$" 294 | } 295 | } 296 | }, 297 | "required": ["images", "container_name", "restart"], 298 | "minProperties": 1, 299 | "additionalProperties": false 300 | } 301 | }, 302 | "examples": [ 303 | { 304 | "myapp": { 305 | "images": { 306 | "x86_64": "myapp:latest", 307 | "armhf": "myapp:latest", 308 | "arm64": "myapp:latest" 309 | }, 310 | "container_name": "myapp_container_name", 311 | "environment": [ 312 | { 313 | "name": "variable_name", 314 | "value": "variable_value", 315 | "description": "Description of what this env does" 316 | } 317 | ], 318 | "ports": [ 319 | { 320 | "host": "8080", 321 | "container": "8080", 322 | "protocol": "tcp", 323 | "description": "description of what this port is for" 324 | } 325 | ], 326 | "volumes": [ 327 | { 328 | "host": "/path/on/host", 329 | "container": "/path/on/container", 330 | "description": "Description of what is this volume for" 331 | } 332 | ], 333 | "devices": [ 334 | { 335 | "host": "/dev/dri", 336 | "container": "/dev/dri", 337 | "description": "GPU Device for hardware acceleration" 338 | } 339 | ] 340 | } 341 | } 342 | ] 343 | } 344 | }, 345 | "required": ["App", "Services"] 346 | } 347 | -------------------------------------------------------------------------------- /schemas/categories.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$id": "https://github.com/voltaos/repoTemplate/tree/master/schemas/category.schema.json", 3 | "$schema": "http://json-schema.org/draft-07/schema#", 4 | "title": "App", 5 | "type": "array", 6 | "items": [{ 7 | "type": "object", 8 | "properties": { 9 | "name": { 10 | "type": "string", 11 | "minLength": 1, 12 | "maxLength": 100, 13 | "pattern": "^[a-zA-Z0-9_]+$" 14 | }, 15 | "description": { 16 | "type": "string", 17 | "minLength": 1, 18 | "maxLength": 100 19 | }, 20 | "icon": { 21 | "type": "string", 22 | "description": "Icon name for the category (Available icons: https://ionic.io/ionicons)", 23 | "enum": ["IoAccessibilityOutline","IoAddCircleOutline","IoAddOutline","IoAirplaneOutline","IoAlarmOutline","IoAlbumsOutline","IoAlertCircleOutline","IoAlertOutline","IoAmericanFootballOutline","IoAnalyticsOutline","IoApertureOutline","IoAppsOutline","IoArchiveOutline","IoArrowBackCircleOutline","IoArrowBackOutline","IoArrowDownCircleOutline","IoArrowDownOutline","IoArrowForwardCircleOutline","IoArrowForwardOutline","IoArrowRedoCircleOutline","IoArrowRedoOutline","IoArrowUndoCircleOutline","IoArrowUndoOutline","IoArrowUpCircleOutline","IoArrowUpOutline","IoAtCircleOutline","IoAtOutline","IoAttachOutline","IoBackspaceOutline","IoBagAddOutline","IoBagCheckOutline","IoBagHandleOutline","IoBagOutline","IoBagRemoveOutline","IoBalloonOutline","IoBanOutline","IoBandageOutline","IoBarChartOutline","IoBarbellOutline","IoBarcodeOutline","IoBaseballOutline","IoBasketOutline","IoBasketballOutline","IoBatteryChargingOutline","IoBatteryDeadOutline","IoBatteryFullOutline","IoBatteryHalfOutline","IoBeakerOutline","IoBedOutline","IoBeerOutline","IoBicycleOutline","IoBluetoothOutline","IoBoatOutline","IoBodyOutline","IoBonfireOutline","IoBookOutline","IoBookmarkOutline","IoBookmarksOutline","IoBowlingBallOutline","IoBriefcaseOutline","IoBrowsersOutline","IoBrushOutline","IoBugOutline","IoBuildOutline","IoBulbOutline","IoBusOutline","IoBusinessOutline","IoCafeOutline","IoCalculatorOutline","IoCalendarClearOutline","IoCalendarNumberOutline","IoCalendarOutline","IoCallOutline","IoCameraOutline","IoCameraReverseOutline","IoCarOutline","IoCarSportOutline","IoCardOutline","IoCaretBackCircleOutline","IoCaretBackOutline","IoCaretDownCircleOutline","IoCaretDownOutline","IoCaretForwardCircleOutline","IoCaretForwardOutline","IoCaretUpCircleOutline","IoCaretUpOutline","IoCartOutline","IoCashOutline","IoCellularOutline","IoChatboxEllipsesOutline","IoChatboxOutline","IoChatbubbleEllipsesOutline","IoChatbubbleOutline","IoChatbubblesOutline","IoCheckboxOutline","IoCheckmarkCircleOutline","IoCheckmarkDoneCircleOutline","IoCheckmarkDoneOutline","IoCheckmarkOutline","IoChevronBackCircleOutline","IoChevronBackOutline","IoChevronDownCircleOutline","IoChevronDownOutline","IoChevronForwardCircleOutline","IoChevronForwardOutline","IoChevronUpCircleOutline","IoChevronUpOutline","IoClipboardOutline","IoCloseCircleOutline","IoCloseOutline","IoCloudCircleOutline","IoCloudDoneOutline","IoCloudDownloadOutline","IoCloudOfflineOutline","IoCloudOutline","IoCloudUploadOutline","IoCloudyNightOutline","IoCloudyOutline","IoCodeDownloadOutline","IoCodeOutline","IoCodeSlashOutline","IoCodeWorkingOutline","IoCogOutline","IoColorFillOutline","IoColorFilterOutline","IoColorPaletteOutline","IoColorWandOutline","IoCompassOutline","IoConstructOutline","IoContractOutline","IoContrastOutline","IoCopyOutline","IoCreateOutline","IoCropOutline","IoCubeOutline","IoCutOutline","IoDesktopOutline","IoDiamondOutline","IoDiceOutline","IoDiscOutline","IoDocumentAttachOutline","IoDocumentLockOutline","IoDocumentOutline","IoDocumentTextOutline","IoDocumentsOutline","IoDownloadOutline","IoDuplicateOutline","IoEarOutline","IoEarthOutline","IoEaselOutline","IoEggOutline","IoEllipseOutline","IoEllipsisHorizontalCircleOutline","IoEllipsisHorizontalOutline","IoEllipsisVerticalCircleOutline","IoEllipsisVerticalOutline","IoEnterOutline","IoExitOutline","IoExpandOutline","IoExtensionPuzzleOutline","IoEyeOffOutline","IoEyeOutline","IoEyedropOutline","IoFastFoodOutline","IoFemaleOutline","IoFileTrayFullOutline","IoFileTrayOutline","IoFileTrayStackedOutline","IoFilmOutline","IoFilterCircleOutline","IoFilterOutline","IoFingerPrintOutline","IoFishOutline","IoFitnessOutline","IoFlagOutline","IoFlameOutline","IoFlashOffOutline","IoFlashOutline","IoFlashlightOutline","IoFlaskOutline","IoFlowerOutline","IoFolderOpenOutline","IoFolderOutline","IoFootballOutline","IoFootstepsOutline","IoFunnelOutline","IoGameControllerOutline","IoGiftOutline","IoGitBranchOutline","IoGitCommitOutline","IoGitCompareOutline","IoGitMergeOutline","IoGitNetworkOutline","IoGitPullRequestOutline","IoGlassesOutline","IoGlobeOutline","IoGolfOutline","IoGridOutline","IoHammerOutline","IoHandLeftOutline","IoHandRightOutline","IoHappyOutline","IoHardwareChipOutline","IoHeadsetOutline","IoHeartCircleOutline","IoHeartDislikeCircleOutline","IoHeartDislikeOutline","IoHeartHalfOutline","IoHeartOutline","IoHelpBuoyOutline","IoHelpCircleOutline","IoHelpOutline","IoHomeOutline","IoHourglassOutline","IoIceCreamOutline","IoIdCardOutline","IoImageOutline","IoImagesOutline","IoInfiniteOutline","IoInformationCircleOutline","IoInformationOutline","IoInvertModeOutline","IoJournalOutline","IoKeyOutline","IoKeypadOutline","IoLanguageOutline","IoLaptopOutline","IoLayersOutline","IoLeafOutline","IoLibraryOutline","IoLinkOutline","IoListCircleOutline","IoListOutline","IoLocateOutline","IoLocationOutline","IoLockClosedOutline","IoLockOpenOutline","IoLogInOutline","IoLogOutOutline","IoMagnetOutline","IoMailOpenOutline","IoMailOutline","IoMailUnreadOutline","IoMaleFemaleOutline","IoMaleOutline","IoManOutline","IoMapOutline","IoMedalOutline","IoMedicalOutline","IoMedkitOutline","IoMegaphoneOutline","IoMenuOutline","IoMicCircleOutline","IoMicOffCircleOutline","IoMicOffOutline","IoMicOutline","IoMoonOutline","IoMoveOutline","IoMusicalNoteOutline","IoMusicalNotesOutline","IoNavigateCircleOutline","IoNavigateOutline","IoNewspaperOutline","IoNotificationsCircleOutline","IoNotificationsOffCircleOutline","IoNotificationsOffOutline","IoNotificationsOutline","IoNuclearOutline","IoNutritionOutline","IoOpenOutline","IoOptionsOutline","IoPaperPlaneOutline","IoPartlySunnyOutline","IoPauseCircleOutline","IoPauseOutline","IoPawOutline","IoPencilOutline","IoPeopleCircleOutline","IoPeopleOutline","IoPersonAddOutline","IoPersonCircleOutline","IoPersonOutline","IoPersonRemoveOutline","IoPhoneLandscapeOutline","IoPhonePortraitOutline","IoPieChartOutline","IoPinOutline","IoPintOutline","IoPizzaOutline","IoPlanetOutline","IoPlayBackCircleOutline","IoPlayBackOutline","IoPlayCircleOutline","IoPlayForwardCircleOutline","IoPlayForwardOutline","IoPlayOutline","IoPlaySkipBackCircleOutline","IoPlaySkipBackOutline","IoPlaySkipForwardCircleOutline","IoPlaySkipForwardOutline","IoPodiumOutline","IoPowerOutline","IoPricetagOutline","IoPricetagsOutline","IoPrintOutline","IoPrismOutline","IoPulseOutline","IoPushOutline","IoQrCodeOutline","IoRadioButtonOffOutline","IoRadioButtonOnOutline","IoRadioOutline","IoRainyOutline","IoReaderOutline","IoReceiptOutline","IoRecordingOutline","IoRefreshCircleOutline","IoRefreshOutline","IoReloadCircleOutline","IoReloadOutline","IoRemoveCircleOutline","IoRemoveOutline","IoReorderFourOutline","IoReorderThreeOutline","IoReorderTwoOutline","IoRepeatOutline","IoResizeOutline","IoRestaurantOutline","IoReturnDownBackOutline","IoReturnDownForwardOutline","IoReturnUpBackOutline","IoReturnUpForwardOutline","IoRibbonOutline","IoRocketOutline","IoRoseOutline","IoSadOutline","IoSaveOutline","IoScaleOutline","IoScanCircleOutline","IoScanOutline","IoSchoolOutline","IoSearchCircleOutline","IoSearchOutline","IoSendOutline","IoServerOutline","IoSettingsOutline","IoShapesOutline","IoShareOutline","IoShareSocialOutline","IoShieldCheckmarkOutline","IoShieldHalfOutline","IoShieldOutline","IoShirtOutline","IoShuffleOutline","IoSkullOutline","IoSnowOutline","IoSparklesOutline","IoSpeedometerOutline","IoSquareOutline","IoStarHalfOutline","IoStarOutline","IoStatsChartOutline","IoStopCircleOutline","IoStopOutline","IoStopwatchOutline","IoStorefrontOutline","IoSubwayOutline","IoSunnyOutline","IoSwapHorizontalOutline","IoSwapVerticalOutline","IoSyncCircleOutline","IoSyncOutline","IoTabletLandscapeOutline","IoTabletPortraitOutline","IoTelescopeOutline","IoTennisballOutline","IoTerminalOutline","IoTextOutline","IoThermometerOutline","IoThumbsDownOutline","IoThumbsUpOutline","IoThunderstormOutline","IoTicketOutline","IoTimeOutline","IoTimerOutline","IoTodayOutline","IoToggleOutline","IoTrailSignOutline","IoTrainOutline","IoTransgenderOutline","IoTrashBinOutline","IoTrashOutline","IoTrendingDownOutline","IoTrendingUpOutline","IoTriangleOutline","IoTrophyOutline","IoTvOutline","IoUmbrellaOutline","IoUnlinkOutline","IoVideocamOffOutline","IoVideocamOutline","IoVolumeHighOutline","IoVolumeLowOutline","IoVolumeMediumOutline","IoVolumeMuteOutline","IoVolumeOffOutline","IoWalkOutline","IoWalletOutline","IoWarningOutline","IoWatchOutline","IoWaterOutline","IoWifiOutline","IoWineOutline","IoWomanOutline"] 24 | } 25 | }, 26 | "minItems": 1 27 | }] 28 | } --------------------------------------------------------------------------------