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
84 changes: 84 additions & 0 deletions .github/ISSUE_TEMPLATE/app-problem.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Проблема в приложении
description: Сообщить о проблеме, которая относится именно к приложению PulseSync
title: "[App Bug]: "
labels:
- bug
body:
- type: markdown
attributes:
value: |
Если проблема связана с приложением **PulseSync**, заполните форму ниже.

Если ошибка возникает в моде [**PulseSync-mod**](https://github.com/PulseSync-LLC/PulseSync-mod), пожалуйста, создайте issue в репозитории мода.

- type: checkboxes
id: confirmation
attributes:
label: Подтверждение
options:
- label: Я подтверждаю, что проблема относится к приложению PulseSync, а не к PulseSync-mod
required: true
- label: Я использую актуальную версию PulseSync
required: true

- type: textarea
id: problem
attributes:
label: Описание проблемы
description: Опишите, что работает не так
placeholder: "Например: приложение не запускается, не обновляет статус или показывает ошибку"
validations:
required: true

- type: textarea
id: steps
attributes:
label: Как воспроизвести
description: Расскажите, что нужно сделать, чтобы ошибка появилась
placeholder: |
1. Открыть PulseSync
2. Нажать ...
3. Получить ошибку ...
validations:
required: true

- type: textarea
id: expected
attributes:
label: Ожидаемое поведение
placeholder: Что вы ожидали увидеть?
validations:
required: true

- type: textarea
id: actual
attributes:
label: Фактическое поведение
placeholder: Что произошло на самом деле?
validations:
required: true

- type: input
id: version
attributes:
label: Версия PulseSync
placeholder: Например, 2.3.1
validations:
required: true

- type: input
id: os
attributes:
label: Операционная система
placeholder: Например, Windows 11 24H2
validations:
required: true

- type: textarea
id: logs
attributes:
label: Скриншоты или логи
description: Если есть, приложите скриншоты, текст ошибки или логи
placeholder: Это поможет быстрее понять причину проблемы
validations:
required: false
58 changes: 57 additions & 1 deletion .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ on:
tags:
- '*'

permissions:
contents: write

jobs:
build:
runs-on: ${{ matrix.os }}
environment: BUILD_PRODUCTION
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest, macos-15-intel]
os: [ubuntu-latest, windows-latest, macos-26, macos-26-intel]

steps:
- uses: actions/checkout@v5
Expand Down Expand Up @@ -61,6 +64,13 @@ jobs:
--prefix "$PREFIX" \
--mac-manifest

- name: Upload release artifacts for GitHub Release
uses: actions/upload-artifact@v7
with:
name: release-${{ matrix.os }}
path: release/**/*
if-no-files-found: error

- name: Publish changelog (single-run on ubuntu)
if: ${{ matrix.os == 'ubuntu-latest' && !contains(github.ref_name, 'dev') }}
shell: bash
Expand All @@ -72,3 +82,49 @@ jobs:

yarn publish:api "${VERSION_ARGS[@]}"
yarn publish:discord "${VERSION_ARGS[@]}"

github_release:
name: Create GitHub Release
needs: build
if: ${{ startsWith(github.ref, 'refs/tags/') }}
runs-on: ubuntu-latest

steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
pattern: release-*
path: github-release-artifacts

- name: Prepare GitHub Release assets
shell: bash
run: |
mkdir -p github-release-assets
declare -A NAME_COUNT=()

while IFS= read -r -d '' file; do
base_name="$(basename "$file")"
artifact_dir="$(printf '%s' "$file" | sed -E 's#^github-release-artifacts/([^/]+)/.*#\1#')"
target_name="$base_name"
name_count="${NAME_COUNT[$base_name]:-0}"

if (( name_count > 0 )); then
target_name="${artifact_dir}-${name_count}-${base_name}"
fi

NAME_COUNT["$base_name"]=$((name_count + 1))
cp "$file" "github-release-assets/$target_name"
done < <(find github-release-artifacts -type f -print0 | sort -z)

find github-release-assets -maxdepth 1 -type f | sort

- name: Create GitHub Release
uses: softprops/action-gh-release@v2.5.0
with:
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
generate_release_notes: true
overwrite_files: true
fail_on_unmatched_files: true
files: |
github-release-assets/*
15 changes: 0 additions & 15 deletions .graphqlconfig

This file was deleted.

8 changes: 8 additions & 0 deletions graphql.config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
schema: schema.graphql
extensions:
endpoints:
Default GraphQL Endpoint:
url: http://localhost:4000/graphql
headers:
user-agent: HEHEHEHA GraphQL
introspect: false
51 changes: 26 additions & 25 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"author": "PulseSync <contact@pulsesync.dev>",
"description": "PulseSync app for desktops",
"homepage": "https://pulsesync.dev",
"version": "2.11.0-beta",
"version": "2.11.1-beta",
"main": ".vite/main/index.js",
"scripts": {
"start": "electron-forge start",
Expand All @@ -24,7 +24,7 @@
"keywords": [],
"license": "SEE LICENSE IN LICENSE",
"devDependencies": {
"@aws-sdk/client-s3": "^3.995.0",
"@aws-sdk/client-s3": "^3.1004.0",
"@electron-forge/cli": "^7.11.1",
"@electron-forge/maker-deb": "^7.11.1",
"@electron-forge/maker-dmg": "^7.11.1",
Expand All @@ -37,7 +37,7 @@
"@types/fs-extra": "^11.0.4",
"@types/glob": "^9.0.0",
"@types/lodash.debounce": "^4.0.9",
"@types/node": "^25.3.0",
"@types/node": "^25.3.5",
"@types/plist": "^3.0.5",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
Expand All @@ -53,12 +53,13 @@
"@types/unzipper": "^0.10.11",
"@types/uuid": "^11.0.0",
"@types/yazl": "^3.3.0",
"@typescript-eslint/eslint-plugin": "^8.56.0",
"@typescript-eslint/parser": "^8.56.0",
"@vitejs/plugin-react-swc": "^4.2.3",
"electron": "40.6.0",
"@typescript-eslint/eslint-plugin": "^8.56.1",
"@typescript-eslint/parser": "^8.56.1",
"@vitejs/plugin-react": "^5.1.4",
"babel-plugin-react-compiler": "^1.0.0",
"electron": "40.8.0",
"electron-builder": "^26.8.1",
"eslint": "^10.0.1",
"eslint": "^10.0.3",
"eslint-plugin-import": "^2.32.0",
"iconv-lite": "^0.7.2",
"prettier": "^3.8.1",
Expand All @@ -71,18 +72,18 @@
"vite-plugin-svgr": "^4.5.0"
},
"dependencies": {
"@apollo/client": "^4.1.5",
"@dr.pogodin/react-helmet": "^3.0.6",
"@apollo/client": "^4.1.6",
"@dr.pogodin/react-helmet": "^3.1.1",
"@electron-forge/plugin-fuses": "^7.11.1",
"@electron/fuses": "2.0.0",
"@electron/fuses": "2.1.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@mui/joy": "^5.0.0-beta.52",
"@radix-ui/react-tooltip": "^1.2.8",
"acorn": "^8.16.0",
"acorn-walk": "^8.3.5",
"adm-zip": "^0.5.16",
"axios": "^1.13.5",
"axios": "^1.13.6",
"browserify-fs": "^1.0.0",
"browserify-sign": "^4.2.5",
"chart.js": "^4.5.1",
Expand All @@ -92,12 +93,12 @@
"electron-store": "11.0.2",
"electron-updater": "^6.8.3",
"formik": "^2.4.9",
"framer-motion": "^12.34.3",
"fs-extra": "^11.3.3",
"framer-motion": "^12.35.2",
"fs-extra": "^11.3.4",
"glob": "^13.0.6",
"graphql": "^16.12.0",
"graphql": "^16.13.1",
"graphql-ws": "^6.0.7",
"i18next": "^25.8.13",
"i18next": "^25.8.16",
"lodash.debounce": "^4.0.8",
"log4js": "^6.9.1",
"net": "^1.0.2",
Expand All @@ -106,12 +107,12 @@
"react-chartjs-2": "^5.3.1",
"react-dom": "^19.2.4",
"react-hot-toast": "^2.6.0",
"react-i18next": "^16.5.4",
"react-icons": "^5.5.0",
"react-i18next": "^16.5.6",
"react-icons": "^5.6.0",
"react-loading-skeleton": "^3.5.0",
"react-markdown": "^10.1.0",
"react-modal": "^3.16.3",
"react-router-dom": "^7.13.0",
"react-router-dom": "^7.13.1",
"react-transition-group": "^4.4.5",
"rehype-raw": "^7.0.0",
"remark-breaks": "^4.0.0",
Expand All @@ -124,8 +125,8 @@
"source-map-support": "^0.5.21",
"stream-browserify": "^3.0.0",
"string-similarity": "^4.0.4",
"systeminformation": "^5.31.1",
"tar": "^7.5.9",
"systeminformation": "^5.31.3",
"tar": "^7.5.11",
"url": "^0.11.4",
"uuid": "^13.0.0",
"yaml": "^2.8.2",
Expand All @@ -141,12 +142,12 @@
"forge": "./forge.config.ts"
},
"buildInfo": {
"VERSION": "2.11.0-beta",
"BRANCH": "db8c91f",
"BUILD_TIME": "21.02.2026, 00:13:01"
"VERSION": "2.11.1-beta",
"BRANCH": "ca23eb7",
"BUILD_TIME": "25.02.2026, 00:32:52"
},
"optionalDependencies": {
"bufferutil": "^4.1.0",
"utf-8-validate": "^6.0.6"
}
}
}
1 change: 1 addition & 0 deletions src/common/appConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const config = {
PORT,
UPDATE_URL: 'https://s3.pulsesync.dev',
SERVER_URL: isDev ? 'http://localhost:4000' : 'https://ru-node-1.pulsesync.dev',
SERVER_v2_URL: 'https://ru-node-1.pulsesync.dev',
WEBSITE_URL: isDev ? 'http://localhost:3100' : 'https://pulsesync.dev',
S3_URL: 'https://s3.pulsesync.dev',
SOCKET_URL: isDev ? 'http://localhost:1337/' : 'https://ru-node-1.pulsesync.dev/',
Expand Down
21 changes: 20 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import process from 'process'
import path from 'path'
import * as fs from 'original-fs'
import createTray from './main/modules/tray'
import { checkForSingleInstance, isFirstInstance } from './main/modules/singleInstance'
import {
checkForSingleInstance,
consumePendingBrowserAuthFromDeepLink,
consumePendingInstallModUpdateFromPath,
isFirstInstance,
} from './main/modules/singleInstance'
import { setAddon } from './main/modules/httpServer'
import { checkAsar, findAppByName, getPathToYandexMusic, isLinux, isMac, isWindows } from './main/utils/appUtils'
import logger from './main/modules/logger'
Expand All @@ -25,6 +30,8 @@ import { startThemeWatcher } from './main/modules/nativeModules'
import * as fsp from 'fs/promises'
import MainEvents from './common/types/mainEvents'
import RendererEvents from './common/types/rendererEvents'
import { installModUpdateFromAsar } from './main/modules/mod/installModUpdateFrom'
import { processBrowserAuth } from './main/modules/auth/browserAuth'

export let updated = false
export let hardwareAcceleration = false
Expand Down Expand Up @@ -100,6 +107,18 @@ app.on('ready', async () => {
}
await createWindow()
handleEvents(mainWindow)
const pendingBrowserAuth = consumePendingBrowserAuthFromDeepLink()
if (pendingBrowserAuth) {
void processBrowserAuth(pendingBrowserAuth, { window: mainWindow }).catch(err => {
logger.main.error('Failed to process pending BROWSER_AUTH deeplink:', err)
})
}
const pendingInstallModUpdateFrom = consumePendingInstallModUpdateFromPath()
if (pendingInstallModUpdateFrom) {
void installModUpdateFromAsar(pendingInstallModUpdateFrom.path, mainWindow, pendingInstallModUpdateFrom.source).catch(err => {
logger.main.error('Failed to apply pending INSTALL_MOD_UPDATE_FROM:', err)
})
}
if (isWindows()) {
await checkOldYandexMusic()
}
Expand Down
Loading