community-scripts / community-scripts/ProxmoxVE-Local
Support custom/private repositories end-to-end in the current PocketBase-backed UI
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 377
- Forks
- 56
- PR merge metrics
- No merged PRs in 30d
Description
🌟 Briefly describe the feature
Reconnect the existing multi-repository JSON support to the current PocketBase-backed UI so enabled custom repositories (including private repositories readable with GITHUB_TOKEN) can be synchronized, displayed, opened, and downloaded end-to-end.
📝 Detailed description
The repository already contains most of the required building blocks:
- repository management with enabled repositories and priority;
githubJsonService.syncJsonFiles()/syncJsonFilesForRepo()for multi-repository JSON sync;githubJsonService.getScriptBySlug()andgetScriptCards()for JSON-backed scripts;Script.repository_url/ScriptCard.repository_urlfor custom sources;scriptDownloaderService.getRepoUrlForScript()andresolveScriptPath()so downloads can come from a script-specific repository and explicitinstall_methods[].scriptpaths.
However, the current main UI path is PocketBase-only in a few key places:
scripts.resyncScriptsrefreshes PocketBase data / logo cache but does not call the existing multi-repository JSON sync.getScriptCardsWithCategoriesreturns PocketBase cards only, so synced custom JSON scripts are not displayed.getScriptBySlug,loadScript, andcheckScriptFilesstop when PocketBase has no matching record instead of falling back to the JSON-backed custom repository service.
I verified the existing components with a non-destructive proof of concept using an enabled private GitHub repository:
- GitHub Contents API for
json/returned HTTP 200 with the configured token; - raw downloads for
json/<slug>.json,ct/<slug>.sh, andinstall/<slug>-install.shreturned HTTP 200; - direct
githubJsonService.syncJsonFiles()successfully synchronized the custom JSON and injectedrepository_url; - merging custom
githubJsonService.getScriptCards(repo.url)cards with the PocketBase cards (PocketBase wins on duplicate slug) made the custom script visible in the current UI; - falling back from PocketBase to
githubJsonService.getScriptBySlug(slug)ingetScriptBySlug,loadScript, andcheckScriptFilesallowed the existing downloader to fetch both the CT script and install script from the custom repository; - no changes were required in
scriptDownloaderServicefor repository selection: its existingrepository_urlsupport handled the custom source correctly.
A minimal upstream design could be:
- expose an explicit repository sync mutation/button that calls the existing multi-repository JSON sync (or integrate it into an appropriate existing sync flow);
- merge cards from enabled custom repositories into
getScriptCardsWithCategories, excluding the main Community Scripts repo to avoid duplicates and giving PocketBase precedence by slug; - when PocketBase has no record, fall back to
githubJsonService.getScriptBySlug()for detail/download/check routes; - extend the same fallback to multi-download if desired;
- keep PocketBase as the authoritative source for official Community Scripts and use local JSON/custom repos only as an additive source.
This preserves the current architecture while making the already-present custom repository functionality usable end-to-end.
💡 Why is this useful?
This enables private or self-maintained script catalogs without requiring users to publish their scripts to the official Community Scripts repository. It is especially useful for homelab operators who maintain private deployment scripts but still want the same PVE Scripts Local UX for discovery, download, and installation.
It also avoids duplicating infrastructure already present in the codebase: repository management, JSON sync, source provenance, and repository-aware downloading already exist; the missing piece is primarily wiring them back into the current PocketBase-backed UI/runtime paths.
I can provide the small POC diff / test details if that would help with implementation.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Trace scripts.resyncScripts, getScriptCardsWithCategories, getScriptBySlug, loadScript, and checkScriptFiles alongside githubJsonService and the existing downloader services. Verify the current PocketBase-only paths first, then confirm that enabled custom repositories sync, appear with PocketBase precedence, and support detail, download, and file checks without changing repository selection logic.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- github, typescript
- Domain
- api, full-stack
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100