# PLONDS Skeleton Penguin Logistics Online Network Distribution System, or PLONDS, is the standalone update-distribution skeleton for LanMountainDesktop. This directory is intentionally isolated from the main app and Launcher. It contains only the new distribution protocol, a thin read-only API, and sample S3-style metadata files. ## Directory Layout ```text PenguinLogisticsOnlineNetworkDistributionSystem/ README.md src/ Plonds.Shared/ Plonds.Api/ sample-data/ meta/ channels/ stable/ windows-x64/ windows-x86/ linux-x64/ distributions/ ``` ## Projects - `Plonds.Shared` provides protocol constants and models. - `Plonds.Core` owns hashing, diffing, object-repo generation, manifest generation, signing, and publish orchestration. - `Plonds.Tool` is the CI-facing CLI entrypoint. PowerShell should stay as a thin wrapper around this tool. - `Plonds.Api` is a thin read-only API that reads metadata from a local folder laid out like S3. ## Architecture PLONDS is intentionally built around a single C# implementation stack so the protocol and publish behavior do not drift across languages. ```text Host App -> checks updates, downloads objects, stages incoming payload Launcher -> verifies signature, applies file map, switches deployment, rolls back PLONDS.Api -> read-only metadata projection for clients PLONDS.Tool -> CI/release command surface PLONDS.Core -> hash/diff/object-repo/sign/publish implementation PLONDS.Shared -> protocol constants and DTOs ``` Rules for v1: - Core protocol behavior should live in `Plonds.Core`, not in PowerShell scripts. - `scripts/*.ps1` may remain only as thin wrappers for GitHub Actions and local convenience. - Host keeps download responsibility. - Launcher keeps apply, atomic switch, snapshot, and rollback responsibility. ## Storage Layout The first version keeps one fixed object root: ```text lanmountain/update/ repo/sha256// meta/channels///latest.json meta/distributions/.json installers///... ``` Planned but not enabled in v1: ```text lanmountain/update/repo-compressed/// lanmountain/update/patches/// ``` ## Public Endpoints The API base path is `/api/plonds/v1`. - `GET /healthz` - `GET /api/plonds/v1/metadata` - `GET /api/plonds/v1/channels/{channel}/{platform}/latest?currentVersion=...` - `GET /api/plonds/v1/distributions/{distributionId}` ## Local Run ```powershell dotnet run --project src/Plonds.Api ``` By default the API reads metadata from `sample-data`.