Skip to content

Commit 45ea301

Browse files
feat: initial version
1 parent fdecdec commit 45ea301

16 files changed

Lines changed: 976 additions & 3 deletions

.github/workflows/build.yml

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
---
2+
name: Build
3+
4+
on:
5+
push:
6+
branches:
7+
- master
8+
pull_request:
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
14+
jobs:
15+
build:
16+
runs-on: ubuntu-latest
17+
permissions:
18+
contents: read
19+
steps:
20+
- uses: actions/checkout@v6
21+
22+
- name: Set up Node.js
23+
uses: actions/setup-node@v6
24+
with:
25+
node-version: '24'
26+
27+
- name: Install dependencies
28+
run: npm install
29+
30+
- name: Validate JSON files
31+
run: npm run validate
32+
33+
- name: Lint JavaScript files
34+
run: npm run lint
35+
36+
- name: Build indexes
37+
run: npm run build
38+
39+
- name: Upload dist artifacts
40+
uses: actions/upload-artifact@v6
41+
with:
42+
name: github-pages
43+
path: dist/
44+
if-no-files-found: error
45+
46+
deploy:
47+
needs: build
48+
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
49+
runs-on: ubuntu-latest
50+
permissions:
51+
pages: write # to deploy to Pages
52+
id-token: write # to verify the deployment originates from an appropriate source
53+
environment:
54+
name: github-pages
55+
url: ${{ steps.deployment.outputs.page_url }}
56+
steps:
57+
- name: Deploy to GitHub Pages
58+
id: deployment
59+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
# JetBrains IDEs
22
.idea/
3+
4+
# Node.js
5+
node_modules/
6+
package-lock.json
7+
8+
# Build output
9+
dist/

LICENSE

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,21 @@
1-
No license, replace this file after using the template.
1+
MIT License
2+
3+
Copyright (c) 2026 LizardByte
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 160 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,160 @@
1-
# template-base
2-
Base repository template for LizardByte.
1+
# LizardByte App Directory
2+
3+
A centralized directory of featured applications, clients, tools, and integrations for LizardByte projects.
4+
5+
## Repository Structure
6+
7+
```
8+
app-directory/
9+
├── .github/workflows/
10+
│ └── build.yml # Auto-build and deploy
11+
├── apps/ # App definitions
12+
│ ├── moonlight/
13+
│ ├── tools/
14+
│ └── integrations/
15+
├── projects/ # Project configurations
16+
│ └── sunshine/
17+
│ ├── project.json # Project config
18+
│ └── categories.json # Project categories
19+
├── schemas/ # JSON schemas
20+
│ ├── app.schema.json # App definition schema
21+
│ ├── categories.schema.json
22+
│ └── project.schema.json
23+
├── scripts/
24+
│ ├── build-index.js
25+
│ └── clean.js
26+
├── dist/ # Generated (deployed to gh-pages)
27+
│ ├── index.json
28+
│ └── sunshine.json
29+
├── package.json
30+
└── README.md
31+
```
32+
33+
## Quick Start
34+
35+
### Installation
36+
37+
```bash
38+
npm install
39+
```
40+
41+
### Build Indexes
42+
43+
```bash
44+
npm run build # Build all project indexes
45+
npm run validate # Validate all JSON files
46+
npm run lint # Lint JavaScript files
47+
npm run lint:fix # Auto-fix linting issues
48+
npm test # Validate + lint + build
49+
npm run clean # Remove dist directory
50+
```
51+
52+
## Usage
53+
54+
### For Project Web UIs
55+
56+
Each project has its own generated index file:
57+
58+
```javascript
59+
// For Sunshine
60+
const response = await fetch('https://lizardbyte.github.io/app-directory/sunshine.json');
61+
const data = await response.json();
62+
63+
// For master index (all apps)
64+
const response = await fetch('https://lizardbyte.github.io/app-directory/index.json');
65+
const data = await response.json();
66+
```
67+
68+
### Adding a New App
69+
70+
1. Create a JSON file in the appropriate `apps/` subdirectory
71+
2. Follow the schema defined in `schemas/app.schema.json`
72+
3. Validate: `npm run validate`
73+
4. Submit a pull request
74+
5. Indexes will be automatically regenerated and deployed
75+
76+
**Example**: See the Moonlight app definitions:
77+
- [`apps/moonlight/moonlight-qt.json`](apps/moonlight/moonlight-qt.json)
78+
- [`apps/moonlight/moonlight-android.json`](apps/moonlight/moonlight-android.json)
79+
80+
## Schema Fields
81+
82+
### Required Fields
83+
- `id`: Unique identifier (kebab-case)
84+
- `name`: Display name
85+
- `description`: Full description
86+
- `category`: Category ID (must match a category in your project's categories.json)
87+
- `platforms`: Array of supported platforms (windows, macos, linux, android, ios, web)
88+
89+
### Optional Fields
90+
- `tagline`: Short one-liner
91+
- `icon`: URL to app icon (512x512 PNG recommended)
92+
- `screenshots`: Array of screenshot URLs
93+
- `links`: Object with `website`, `github`, `download`, `documentation` URLs
94+
- `tags`: Array of searchable keywords
95+
- `featured`: Boolean to highlight the app
96+
- `compatibility`: Version requirements for host projects
97+
- `metadata`: Author, license, updated timestamp
98+
99+
## Adding a New Project
100+
101+
1. Create a project directory: `projects/{project-name}/`
102+
2. Create project configuration: `projects/{project-name}/project.json`
103+
3. Create project-specific categories: `projects/{project-name}/categories.json`
104+
105+
**Example**: See the Sunshine project configuration:
106+
- [`projects/sunshine/project.json`](projects/sunshine/project.json) - Project configuration
107+
- [`projects/sunshine/categories.json`](projects/sunshine/categories.json) - Category definitions
108+
109+
## Automation & Deployment
110+
111+
GitHub Actions automatically:
112+
- ✓ Validates all JSON files against schemas (apps, projects, categories)
113+
- ✓ Lints JavaScript files with ESLint
114+
- ✓ Builds project-specific indexes in `dist/` directory
115+
- ✓ Deploys to GitHub Pages (`gh-pages` branch)
116+
- ✓ Runs on every push and pull request
117+
118+
### npm Scripts
119+
120+
```bash
121+
npm run validate # Validate all JSON files
122+
npm run lint # Lint JavaScript files
123+
npm run lint:fix # Auto-fix linting issues
124+
npm run build # Build all indexes
125+
npm run build:all # Validate + lint + build
126+
npm test # Same as build:all
127+
npm run clean # Remove dist/ directory
128+
```
129+
130+
## CDN & Access
131+
132+
The built indexes are deployed to GitHub Pages and accessible via:
133+
134+
### GitHub Pages (Recommended)
135+
```
136+
https://lizardbyte.github.io/app-directory/{project}.json
137+
https://lizardbyte.github.io/app-directory/index.json
138+
```
139+
140+
### jsDelivr CDN (Faster, Global)
141+
```
142+
https://cdn.jsdelivr.net/gh/LizardByte/app-directory@gh-pages/{project}.json
143+
```
144+
145+
### Raw GitHub (Slower)
146+
```
147+
https://raw.githubusercontent.com/LizardByte/app-directory/gh-pages/{project}.json
148+
```
149+
150+
## Contributing
151+
152+
1. Fork the repository
153+
2. Add your app JSON file
154+
3. Ensure it validates against the schema
155+
4. Submit a pull request
156+
5. Maintainers will review and merge
157+
158+
## License
159+
160+
Apps listed in this directory retain their original licenses. This directory structure and metadata is MIT licensed.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"id": "moonlight-android",
3+
"name": "Moonlight for Android",
4+
"tagline": "GameStream client for Android",
5+
"description": "Open source client for NVIDIA GameStream and Sunshine.",
6+
"category": "client",
7+
"platforms": ["android"],
8+
"icon": "https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/icon.png",
9+
"screenshots": [
10+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1-pc.png",
11+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2-settings.png",
12+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/sevenInchScreenshots/1-pc.png",
13+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/sevenInchScreenshots/2-settings.png",
14+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/tenInchScreenshots/1-pc.png",
15+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/tenInchScreenshots/2-settings.png",
16+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/tvScreenshots/1-pc.png",
17+
"https://raw.githubusercontent.com/moonlight-stream/moonlight-android/master/fastlane/metadata/android/en-US/images/tvScreenshots/2-settings.png"
18+
],
19+
"links": {
20+
"website": "https://moonlight-stream.org/",
21+
"github": "https://github.com/moonlight-stream/moonlight-android",
22+
"download": "https://play.google.com/store/apps/details?id=com.limelight",
23+
"documentation": "https://github.com/moonlight-stream/moonlight-docs/wiki"
24+
},
25+
"tags": ["streaming", "android", "mobile", "gaming"],
26+
"featured": true,
27+
"compatibility": {
28+
"sunshine": ">=0.1.0"
29+
},
30+
"metadata": {
31+
"license": "GPL-3.0"
32+
}
33+
}

apps/moonlight/moonlight-qt.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"id": "moonlight-qt",
3+
"name": "Moonlight PC",
4+
"tagline": "GameStream client for PCs (Windows, Mac, Linux, and Steam Link)",
5+
"description": "Open source PC client for NVIDIA GameStream and Sunshine.",
6+
"category": "client",
7+
"platforms": ["windows", "macos", "linux"],
8+
"icon": "https://raw.githubusercontent.com/moonlight-stream/moonlight-qt/refs/heads/master/app/res/moonlight.svg",
9+
"links": {
10+
"website": "https://moonlight-stream.org/",
11+
"github": "https://github.com/moonlight-stream/moonlight-qt",
12+
"download": "https://github.com/moonlight-stream/moonlight-qt/releases/latest",
13+
"documentation": "https://github.com/moonlight-stream/moonlight-docs/wiki"
14+
},
15+
"tags": ["streaming", "gamestream", "client", "gaming"],
16+
"featured": true,
17+
"compatibility": {
18+
"sunshine": ">=0.1.0"
19+
},
20+
"metadata": {
21+
"license": "GPL-3.0"
22+
}
23+
}

eslint.config.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import js from "@eslint/js";
2+
3+
export default [
4+
js.configs.recommended,
5+
{
6+
languageOptions: {
7+
ecmaVersion: 2022,
8+
sourceType: "commonjs",
9+
globals: {
10+
console: "readonly",
11+
process: "readonly",
12+
__dirname: "readonly",
13+
require: "readonly",
14+
module: "readonly",
15+
exports: "readonly",
16+
fetch: "readonly"
17+
}
18+
},
19+
rules: {
20+
"no-unused-vars": ["error", {
21+
"argsIgnorePattern": "^_",
22+
"varsIgnorePattern": "^_",
23+
"caughtErrorsIgnorePattern": "^_",
24+
}],
25+
"no-console": "off",
26+
"prefer-const": "error",
27+
"no-var": "error",
28+
"eqeqeq": ["error", "always"],
29+
"curly": ["error", "all"],
30+
"brace-style": ["error", "1tbs"],
31+
"indent": ["error", 2],
32+
"quotes": ["error", "single", { "avoidEscape": true }],
33+
"semi": ["error", "always"],
34+
"comma-dangle": ["error", "always-multiline"],
35+
"no-trailing-spaces": "error",
36+
"eol-last": ["error", "always"]
37+
}
38+
},
39+
{
40+
files: ["scripts/**/*.cjs"],
41+
rules: {
42+
"no-process-exit": "off",
43+
}
44+
}
45+
];

0 commit comments

Comments
 (0)