Releases: SysAdminDoc/MyPortfolio
Releases · SysAdminDoc/MyPortfolio
MyPortfolio v0.1.0
Changelog
All notable changes to MyPortfolio are documented here. Format follows Keep a Changelog, and the project adheres to Semantic Versioning.
v0.1.0 — 2026-04-25
Initial release. Unifies LocalDesktopStore, LocalChromeStore, and LocalAndroidStore into a single Windows desktop catalog backed by GitHub releases.
Added
- WPF / .NET 9 shell with TabControl: Desktop apps, Chrome extensions, Android APKs
- Catppuccin Mocha dark theme — single resource dictionary, shared across every tab
- Shared header (logo, refresh-all, settings toggle), shared settings drawer, shared activity log, shared status bar
- One
AppSettingsJSON file at%APPDATA%\MyPortfolio\settings.jsondriving every tab GitHubClientFactoryrebuilt on token change so the PAT can be updated without restartHttpDownloaderwith stream-to-file (Desktop/Android) and bytes-to-memory (Chrome) variantsLogSinkthread-safe ring buffer (600 lines), every tab streams into it with a[Tab]prefixHashVerifiershared SHA-256 sidecar verification used by Desktop + Android tabs
Desktop apps tab (ported from LocalDesktopStore)
- Discovery via Octokit — every repo whose latest release ships an MSI / EXE / ZIP asset
- Asset classifier — name hints first, then bounded byte scan +
FileVersionInfoto distinguish Inno / NSIS / generic - Install handlers: MSI (
msiexec /i ... /qb /norestartwith verbose log), Inno (/SILENT /NORESTART), NSIS (/S), generic interactive, portable ZIP (extract + Start Menu shortcut) - Uninstall handlers: MSI (
/x ProductCode), Inno/NSIS via recordedUninstallString, portable folder + shortcut delete - Run handler: registry
DisplayIcon→InstallLocationprimary.exe→ portable launcher - Registry-diff install detection across
HKLM\Uninstall,HKLM\WOW6432Node\Uninstall,HKCU\Uninstall - SHA-256 sidecar verification toggle
- Per-tab topic filter (default
windows-app) - Install root override (default
%LOCALAPPDATA%\MyPortfolio\desktop\apps)
Chrome extensions tab (ported from LocalChromeStore)
- Discovery — repos with manifest.json at common paths or release ZIP/CRX
- Manifest enrichment — name / version / description / largest icon read from the ZIP entry or repo content API
- Zip-slip guard, single-wrapper-folder flatten
- CRX2 (pubkeyLen + sigLen) + CRX3 (headerLen) header strip → inner ZIP extract
- Browser launcher — Chrome / Brave / Edge / Vivaldi / Opera / Chromium auto-detect
--load-extension="path1,path2,..."comma-separated (Chromium ≥75 requirement)- Hide repo command — per-repo exclusion stored in
HiddenRepos, restorable from settings drawer - Per-tab topic filter (default
chrome-extension)
Android APKs tab (download-only, new)
- Discovery — every repo whose latest release contains a
.apkasset - Picks the largest
.apk(defaults to the signed release build over a debug variant) - Downloads to
%USERPROFILE%\Downloads\MyPortfolio\Android\<owner>\<repo>\<version>\<asset>.apk - Optional SHA-256 sidecar verification (failure logs but doesn't delete — APK is already on disk)
- Computes a local SHA-256 hash even when no sidecar exists
- "Reveal in Explorer" highlights the file inside its containing folder
- "Remove" deletes the per-repo download folder and clears the manifest row
- Update-detection card state + "Re-download" / "Update to vX.Y.Z" labels matching the other tabs
- Download root override (default
%USERPROFILE%\Downloads\MyPortfolio\Android) - Per-tab topic filter (default
android-app)
Notes
- The Windows host has no native APK install path. The Android tab intentionally stops at download — sideloading is left to the user (
adb install, file transfer, etc.). The Android-side install pipeline (signature pinning, PackageInstaller.Session) lives in the original LocalAndroidStore Android app. - Crash log writer at
%LOCALAPPDATA%\MyPortfolio\logs\covers every tab.