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 | }
--------------------------------------------------------------------------------