Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/ci-patched.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: CI-Patched

# Fork-only copy of upstream's CI with a node_modules cache in front of
# `npm ci`. Upstream's ci.yml stays byte-identical so nightly merges stay
# clean; the upstream CI workflow is disabled in the fork's Actions settings
# so PRs run this one instead of both. Same triggers, same steps, same gate.
on:
push:
branches: [main, nightly]
pull_request:

permissions:
contents: read

jobs:
checks:
name: Patched checks
# Never runs outside the fork: if this file ever reaches upstream by a bad
# merge, it stays silent there instead of double-running their CI.
if: github.repository == 'codeon89/Atlas'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Restore node_modules
id: nm-cache
uses: actions/cache@v4
with:
path: node_modules
key: nm-v1-${{ runner.os }}-${{ hashFiles('package-lock.json') }}

# Cache hit means the lock file is unchanged, so the tree on disk is
# exactly what `npm ci` would produce -- skip the ~2 min reinstall.
- name: Install dependencies
if: steps.nm-cache.outputs.cache-hit != 'true'
run: npm ci --no-audit --no-fund

- name: Build browser extension
run: npm run build:extension

- name: Run Vitest suite
run: npm run test:run

- name: Run legacy check scripts + build
# `npm run check` also runs test:run (harmless) and vite build, giving us
# the syntax checks, asset/layout checks, the test suite, and a renderer
# build in one gate. git diff --check catches whitespace/conflict markers.
run: npm run check
95 changes: 83 additions & 12 deletions .github/workflows/nightly-patched.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
name: Atlas Nightly-Patched Prerelease

# Fork-only release flow. Modelled on upstream's nightly.yml (draft-first,
# verify-then-publish): single Windows leg, full `npm run check` gate inline,
# versions naming the upstream nightly they were built from.
# verify-then-publish): Windows + Linux legs sharing one draft release, full
# `npm run check` gate inline, versions naming the upstream nightly they were
# built from.
on:
push:
branches: [nightly-patched]
Expand Down Expand Up @@ -146,11 +147,14 @@ jobs:
needs: prepare
# Skip when prepare is skipped (repo guard) or opted out via [no-build].
if: needs.prepare.result == 'success' && needs.prepare.outputs.skip != 'true'
runs-on: windows-latest
timeout-minutes: 45
defaults:
run:
shell: pwsh
runs-on: ${{ matrix.os }}
strategy:
# One platform failing must not cancel the other mid-upload, which would
# leave the draft holding a partial asset set.
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest]
timeout-minutes: 60
env:
PATCHED_NIGHTLY: ${{ needs.prepare.outputs.nightly }}
PATCHED_BUILD_NUMBER: ${{ needs.prepare.outputs.number }}
Expand All @@ -171,27 +175,76 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Install Linux system dependencies
if: matrix.os == 'ubuntu-latest'
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y libarchive-tools rpm
# appimagetool (bundled by electron-builder for the AppImage target)
# is itself an AppImage and needs FUSE2 to run. Ubuntu 24.04
# renamed libfuse2 -> libfuse2t64; keep the old name as fallback.
sudo apt-get install -y libfuse2t64 || sudo apt-get install -y libfuse2

# Version, owner (fork repo) and channel (patched) come from
# scripts/build-patched.js — never from package.json at rest.
# scripts/build-patched.js — never from package.json at rest. The script
# picks nsis vs deb/AppImage/pacman from the runner OS, so both legs run
# the same command and upload to the same draft.
- name: Build and upload Windows installer
if: matrix.os == 'windows-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: pwsh
run: npm run publish

- name: Build and upload Linux packages
if: matrix.os == 'ubuntu-latest'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
run: npm run publish

- name: Assert installer exists
- name: Assert installer exists (Windows)
if: matrix.os == 'windows-latest'
shell: pwsh
run: |
$exe = Get-ChildItem -Path "release/patched-$env:PATCHED_NIGHTLY-$env:PATCHED_BUILD_NUMBER" -Filter *.exe
if (-not $exe) { throw 'No installer was produced.' }
$exe | ForEach-Object { Write-Output "$($_.Name) ($($_.Length) bytes)" }

- name: Assert packages exist (Linux)
if: matrix.os == 'ubuntu-latest'
shell: bash
run: |
shopt -s nullglob
files=(release/patched-"$PATCHED_NIGHTLY"-"$PATCHED_BUILD_NUMBER"/*.deb release/patched-"$PATCHED_NIGHTLY"-"$PATCHED_BUILD_NUMBER"/*.AppImage release/patched-"$PATCHED_NIGHTLY"-"$PATCHED_BUILD_NUMBER"/*.pacman)
if [ ${#files[@]} -eq 0 ]; then
echo "No Linux packages were produced."
exit 1
fi
printf '%s\n' "${files[@]}"

- name: Upload Windows artifact
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: windows-patched-installer
path: release/patched-*/*.exe
if-no-files-found: error

- name: Upload Linux artifact
if: always() && matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: linux-patched-packages
path: |
release/patched-*/*.deb
release/patched-*/*.AppImage
release/patched-*/*.pacman
if-no-files-found: error

virus-scan:
name: ClamAV scan of patched artifacts
needs: build
Expand All @@ -209,6 +262,13 @@ jobs:
path: scan/windows
continue-on-error: true

- name: Download Linux artifact
uses: actions/download-artifact@v4
with:
name: linux-patched-packages
path: scan/linux
continue-on-error: true

- name: Install ClamAV
run: |
sudo apt-get update
Expand All @@ -223,7 +283,7 @@ jobs:
run: |
set +e
shopt -s nullglob globstar
files=(scan/**/*.exe)
files=(scan/**/*.exe scan/**/*.AppImage scan/**/*.deb scan/**/*.pacman)
if [ ${#files[@]} -eq 0 ]; then
echo "No patched artifacts were downloaded to scan." | tee -a "$GITHUB_STEP_SUMMARY"
echo "detections=0" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -289,8 +349,9 @@ jobs:
echo "$names"

# Publishing with a missing installer, blockmap or channel manifest
# would ship a release the updater cannot use. Refuse and leave the
# draft for a re-run instead.
# would ship a release the updater cannot use. Either platform
# missing refuses the whole release and leaves the draft for a
# re-run instead.
for suffix in ".exe" ".exe.blockmap"; do
if ! echo "$names" | grep -qxF "Atlas-Setup-${version}${suffix}"; then
echo "::error::Missing or incomplete asset: Atlas-Setup-${version}${suffix}."
Expand All @@ -301,6 +362,16 @@ jobs:
echo "::error::Missing or incomplete asset: patched.yml."
exit 1
fi
for ext in ".deb" ".AppImage" ".pacman"; do
if ! echo "$names" | grep -qE "\\${ext}$"; then
echo "::error::Missing or incomplete asset: no *${ext} on $tag."
exit 1
fi
done
if ! echo "$names" | grep -qxF 'patched-linux.yml'; then
echo "::error::Missing or incomplete asset: patched-linux.yml."
exit 1
fi

gh release edit "$tag" --draft=false --prerelease --latest=false
echo "Published $tag"
58 changes: 30 additions & 28 deletions CHANGELOG.PATCHED.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
# Changelog - PATCHED
# CHANGELOG - PATCHED

## Fork's Nightly Changes
*Changes that's already on the fork and waiting to be reviewed for merge into original Atlas*
- Update debounce logic for Browse and Library: Search in Catalog Browse and Library now debounces the text input and waits for a pause before filtering. Previously every keystroke updated `activeFilters.text` and ran `filterGamesWithState` (Library) or scheduled a catalog fetch, causing input lag on large libraries and a wasted local-filter pass even while browsing the server-side catalog. The input still echoes instantly from local state; clear bypasses the delay.[PR#398](https://github.com/towerwatchman/Atlas/pull/398)
**v0.9.9-patched.nightly.494.2**
- Removed the stale restart popup and hint on the Show debug console toggle — it applies immediately to all open windows.[PR#399](https://github.com/towerwatchman/Atlas/pull/399)
- (Dev-Only) DevTools no longer auto-opens in dev mode unless explicitly enabled in config.
- Nightly-Patched: support Linux builds & patch ci runs. [PR#20](https://github.com/codeon89/Atlas/pull/20)

## Independent Changes
*Any fork-only changes that is not accepted for merged but valid, or independent changes to make the fork repo releasable (e.g. custom version or preventing updates)*
- Support `[no-build]` detection in your HEAD commit message when pushing without wanting a release (docs or changelog-only pushes) or merge existing change from original Atlas.
- Nightly-Patched releases: the fork ships its own Windows installer line (`{base}-patched.nightly.{nightly}.{p}`) with a third update channel under Settings > App Updates. Patched builds check only the fork feed; upstream nightlies surface as a read-only notice, never a download. See `docs/FORK-PATCHED-RUNBOOK.md`.
- LewdCorner member tier detection. Atlas now scrapes your LewdCorner account's shop page to determine your membership tier (Standard / Plus) and stores it alongside your credentials. Browse filters content by tier so Plus users see everything while Standard or non-login users only see what their subscription allows.[PR#391](https://github.com/towerwatchman/Atlas/pull/391)
**v0.9.9-patched.nightly.494.1**
- Update debounce logic for Browse and Library: Search in Catalog Browse and Library now debounces the text input and waits for a pause before filtering. Previously every keystroke updated `activeFilters.text` and ran `filterGamesWithState` (Library) or scheduled a catalog fetch, causing input lag on large libraries and a wasted local-filter pass even while browsing the server-side catalog. The input still echoes instantly from local state; clear bypasses the delay.[PR#398](https://github.com/towerwatchman/Atlas/pull/398)
- LewdCorner member tier detection. Atlas now scrapes your LewdCorner account's shop page to determine your membership tier (Standard / Plus) and stores it alongside your credentials. Browse filters content by tier so Plus users see everything while Standard or non-login users only see what their subscription allows.[PR#391](https://github.com/towerwatchman/Atlas/pull/391)
- Support `[no-build]` detection in your HEAD commit message when pushing without wanting a release (docs or changelog-only pushes) or merge existing change from original Atlas.[PR#19](https://github.com/codeon89/Atlas/pull/19)
- Nightly-Patched releases: the fork ships its own Windows + Linux installer line (`{base}-patched.nightly.{nightly}.{p}`) with a third update channel under Settings > App Updates. Patched builds check only the fork feed; upstream nightlies surface as a read-only notice, never a download. See `docs/FORK-PATCHED-RUNBOOK.md`.[PR#19](https://github.com/codeon89/Atlas/pull/19)


**Previously merged before packaging**
- Catalog tag filtering now matches Library and use exact-token filtering (avoid issue of -male +female return no result).[PR#394](https://github.com/towerwatchman/Atlas/pull/394)
- Fixed MEGA v1 test timeout — legacy key derivation is intentionally slow and needed a longer test timeout.[PR#392](https://github.com/towerwatchman/Atlas/pull/392)
- Fix multiple executable chooser rendering logic, and redo the executable chooser UI.[PR#389](https://github.com/towerwatchman/Atlas/pull/389)
- Fixed bat file launcher for Atlas.[PR#388](https://github.com/towerwatchman/Atlas/pull/388)
- Allow setting folder and program locations by typing or paste a path directly besides using Browse / Select Folder button.[PR#385](https://github.com/towerwatchman/Atlas/pull/385)
- Allow Win download links to show up for Linux platform since Linux can run both Linux version and also use Wine to run Win executable.[PR#377](https://github.com/towerwatchman/Atlas/pull/377)
- Support Local Previews Management: [PR#379](https://github.com/towerwatchman/Atlas/pull/379)
- Add Media Upload UI, support Custom Previews via file picker, drag upload or URL upload.
- Add drag sort interaction in MediaTab, preserve sorting order.
- Fix existing Downloaded Assets Issues not skip already-download entries.
- Add scrolling to Downloads page.The scrollbar is hidden but it will show up if hover on the right side.[PR#376](https://github.com/towerwatchman/Atlas/pull/376)
- Add Buzzheavier host support (`buzzheavier.com`, `bzzhr.to`, `bzzhr.co`). Note: Each time IP change there will be a quick Cloudflare auto-resolve window, and the challenge result will persist (certain cookies from the throwaway partition is persist instead of complete partition removal prior).[PR#375](https://github.com/towerwatchman/Atlas/pull/375)
- Add release verstion github page redirect when clicking on app version [PR#373](https://github.com/towerwatchman/Atlas/pull/373)
- Fixed the colour pickers in the Banner Editor's Layout tab closing as soon as the colour changed, so the slider and shade square could only be click-selected and never dragged open. The per-field editor (`Inspector`) was defined *inside* the editor's render body, which makes React treat it as a new component type on every re-render; the first `onChange` re-rendered the editor, remounted the whole inspector, and destroyed the `<input type="color">` the native dialog was bound to. `Inspector` is now module-scope and takes its state as props, so its identity is stable and the picker stays open through a drag. Size & Image and Panels tabs were unaffected.[PR#372](https://github.com/towerwatchman/Atlas/pull/372)
- Implement add/remove wishlist in Browse mode context menu that trigger `toggleWishlist` action for non-local rows, Using optimistc UI approach to dispatch the db update, and the success broadcast triggers the renderer so grid view without triggering full refresh. The `wishlist-updated` broadcast is now source-tagged: context-menu toggles skip the catalog refetch (optimistic UI already flipped the row), while the extension path keeps it (no optimistic UI exists there). [PR#368](https://github.com/towerwatchman/Atlas/pull/368)
- Fixed slow "wishlist only" filtering in Browse and Library by 1. Adding indexes on columns used in query and 2. Splitting a single multi-OR subquery into separate EXISTS clauses. [PR#367](https://github.com/towerwatchman/Atlas/pull/367)
- Fix and remove the redundant isWishlistEntry memory flag which was set but never unset and cause unexpected behavior on entry display regarding wishlist. The isWishlisted logic will check the data from wishlist_entries instead. Note: the IPC behavior is not related and not updated. [PR#366](https://github.com/towerwatchman/Atlas/pull/366)
- Remove the 'has Steam mapping' quick filter. [PR#360](https://github.com/towerwatchman/Atlas/pull/360)


## Merged to thetowerman/Atlas's Nightly
- Catalog tag filtering now matches Library and use exact-token filtering (avoid issue of -male +female return no result).[PR#394](https://github.com/towerwatchman/Atlas/pull/394)
- Fixed MEGA v1 test timeout — legacy key derivation is intentionally slow and needed a longer test timeout.[PR#392](https://github.com/towerwatchman/Atlas/pull/392)
- Fix multiple executable chooser rendering logic, and redo the executable chooser UI.[PR#389](https://github.com/towerwatchman/Atlas/pull/389)
- Fixed bat file launcher for Atlas.[PR#388](https://github.com/towerwatchman/Atlas/pull/388)
- Allow setting folder and program locations by typing or paste a path directly besides using Browse / Select Folder button.[PR#385](https://github.com/towerwatchman/Atlas/pull/385)
- Allow Win download links to show up for Linux platform since Linux can run both Linux version and also use Wine to run Win executable.[PR#377](https://github.com/towerwatchman/Atlas/pull/377)
- Support Local Previews Management: [PR#379](https://github.com/towerwatchman/Atlas/pull/379)
- Add Media Upload UI, support Custom Previews via file picker, drag upload or URL upload.
- Add drag sort interaction in MediaTab, preserve sorting order.
- Fix existing Downloaded Assets Issues not skip already-download entries.
- Add scrolling to Downloads page.The scrollbar is hidden but it will show up if hover on the right side.[PR#376](https://github.com/towerwatchman/Atlas/pull/376)
- Add Buzzheavier host support (`buzzheavier.com`, `bzzhr.to`, `bzzhr.co`). Note: Each time IP change there will be a quick Cloudflare auto-resolve window, and the challenge result will persist (certain cookies from the throwaway partition is persist instead of complete partition removal prior).[PR#375](https://github.com/towerwatchman/Atlas/pull/375)
- Add release verstion github page redirect when clicking on app version [PR#373](https://github.com/towerwatchman/Atlas/pull/373)
- Fixed the colour pickers in the Banner Editor's Layout tab closing as soon as the colour changed, so the slider and shade square could only be click-selected and never dragged open. The per-field editor (`Inspector`) was defined *inside* the editor's render body, which makes React treat it as a new component type on every re-render; the first `onChange` re-rendered the editor, remounted the whole inspector, and destroyed the `<input type="color">` the native dialog was bound to. `Inspector` is now module-scope and takes its state as props, so its identity is stable and the picker stays open through a drag. Size & Image and Panels tabs were unaffected.[PR#372](https://github.com/towerwatchman/Atlas/pull/372)
- Implement add/remove wishlist in Browse mode context menu that trigger `toggleWishlist` action for non-local rows, Using optimistc UI approach to dispatch the db update, and the success broadcast triggers the renderer so grid view without triggering full refresh. The `wishlist-updated` broadcast is now source-tagged: context-menu toggles skip the catalog refetch (optimistic UI already flipped the row), while the extension path keeps it (no optimistic UI exists there). [PR#368](https://github.com/towerwatchman/Atlas/pull/368)
- Fixed slow "wishlist only" filtering in Browse and Library by 1. Adding indexes on columns used in query and 2. Splitting a single multi-OR subquery into separate EXISTS clauses. [PR#367](https://github.com/towerwatchman/Atlas/pull/367)
- Fix and remove the redundant isWishlistEntry memory flag which was set but never unset and cause unexpected behavior on entry display regarding wishlist. The isWishlisted logic will check the data from wishlist_entries instead. Note: the IPC behavior is not related and not updated. [PR#366](https://github.com/towerwatchman/Atlas/pull/366)
- Remove the 'has Steam mapping' quick filter. [PR#360](https://github.com/towerwatchman/Atlas/pull/360)
Loading
Loading