Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
0c0c04a
update: ZUNO
noFAYZ Jul 25, 2026
a1403a3
update: ZUNO v1
noFAYZ Jul 25, 2026
7ce8ac6
update: readme
noFAYZ Jul 25, 2026
d205b1c
Settings: switches and select, and version 1.0.0
noFAYZ Jul 25, 2026
e41915e
Use own updater signing key, and never commit private keys
noFAYZ Jul 25, 2026
a59f47e
Rename bundle identifier to com.zuno.desktop, migrating app data
noFAYZ Jul 25, 2026
bf66908
Fix updater signing: password-less key, and macOS updater artifacts
noFAYZ Jul 25, 2026
7193268
Share one track row across playlist, album and artist pages
noFAYZ Jul 25, 2026
ad3935c
Share one hero header across playlist, album and artist pages
noFAYZ Jul 25, 2026
550346c
Lift the ambient wash above the search bar and make it vibrant
noFAYZ Jul 25, 2026
f7e23bd
Header play button reflects state; SpinnerSteps in buttons
noFAYZ Jul 25, 2026
1c10da3
Release 1.0.1
noFAYZ Jul 25, 2026
d925b43
Fix the sidebar to a collapsed rail with tooltips
noFAYZ Jul 25, 2026
cbd5ee6
Use a real cover for Liked Songs
noFAYZ Jul 25, 2026
c409f20
Sidebar: tab tooltips, a create-playlist popover, honest durations
noFAYZ Jul 25, 2026
4eab4b0
Fix the sidebar create-playlist popover with a portalled panel
noFAYZ Jul 25, 2026
c4c0b7c
Volume: icon that opens a slider panel on hover
noFAYZ Jul 26, 2026
39f93a4
Fix: Multiple UI , Logic fixes
noFAYZ Jul 26, 2026
6eb3935
Release 1.1.0
noFAYZ Jul 26, 2026
cf99f15
update &fix: UI downloads pages
noFAYZ Jul 26, 2026
022ec85
FIX: downloads
noFAYZ Jul 26, 2026
a01b8b2
feat: UI fixes, like/dislike buttons
noFAYZ Jul 26, 2026
5b9d764
Release 1.1.1
noFAYZ Jul 26, 2026
00abf01
as
noFAYZ Jul 26, 2026
4aaae5f
docs: ignore scratch material, refresh the README feature table
noFAYZ Jul 26, 2026
bac5c2d
update: readme
noFAYZ Jul 27, 2026
bdb0ec3
Release 1.1.2
noFAYZ Jul 27, 2026
9407230
update:landing
noFAYZ Jul 27, 2026
8eeb6bf
update:landing ui
noFAYZ Jul 27, 2026
7c3573b
update:landing hero
noFAYZ Jul 27, 2026
2efee63
update:landing hero
noFAYZ Jul 27, 2026
78cceff
feat: Downloads, notification dropdowns fix:artist avatars
noFAYZ Jul 27, 2026
a418600
Release 1.1.3
noFAYZ Jul 27, 2026
e9540a7
ci: release without the manual steps
noFAYZ Jul 27, 2026
38924c7
update: Authentication persistence
noFAYZ Jul 28, 2026
937ad98
update: Performance, Authentication persistence, Library limit,
noFAYZ Jul 29, 2026
dfe4651
feat: Lyrics UI and settings
noFAYZ Jul 29, 2026
961a668
Update: vercel skills run. performance improvement
noFAYZ Jul 29, 2026
f8c729d
feat: Show hide carousel
noFAYZ Jul 29, 2026
ac807e6
feat: Release note and Google sign in button
noFAYZ Jul 29, 2026
3b6c164
chore: release 1.2.0
noFAYZ Jul 29, 2026
fa6f6ab
update:Play animation and browse page, readmeand more features
noFAYZ Jul 29, 2026
168eae9
fix: restore static youtubei.js import, and show release notes on upg…
noFAYZ Jul 29, 2026
9681486
build: bundle GStreamer into the AppImage, and package zuno-bin for t…
noFAYZ Jul 29, 2026
92d0252
ci: run every makepkg helper as the unprivileged builder
noFAYZ Jul 29, 2026
37b1cea
ci: trust the AUR host key deterministically
noFAYZ Jul 29, 2026
92124dd
build: publish the AUR package as zuno rather than zuno-bin
noFAYZ Jul 29, 2026
e660fa7
docs: trim the AUR readme to what someone needs to do
noFAYZ Jul 29, 2026
bf50f20
docs: add AUR install to the readme
noFAYZ Jul 29, 2026
60891d9
docs(landing): use the 1.2 screenshots, and show more than one screen
noFAYZ Jul 29, 2026
1e472ad
build: add Flatpak packaging and a workflow to build it
noFAYZ Jul 29, 2026
074e963
ci: install the generators' real dependencies
noFAYZ Jul 29, 2026
8bbaffc
ci: install the metadata validators
noFAYZ Jul 29, 2026
140b62e
ci: add the flathub remote before resolving build deps
noFAYZ Jul 29, 2026
284d5fd
build: point npm at the generated offline cache
noFAYZ Jul 29, 2026
54c5f78
build: move the Flatpak to the GNOME 47 runtime
noFAYZ Jul 29, 2026
3149245
build: align the Flatpak submission with Flathub's stated requirements
noFAYZ Jul 29, 2026
11672f8
docs(landing): rebuild the hero around the product's own identity
noFAYZ Jul 29, 2026
983d0e7
fix(landing): let the hero video actually fill its column
noFAYZ Jul 29, 2026
5e70ff1
fix(landing): use the demo video's own aspect ratio
noFAYZ Jul 29, 2026
a71430e
feat(landing): rebuild the hero as a poster, drop the screenshots sec…
noFAYZ Jul 29, 2026
0952cc5
chore: add a security policy, dependency updates, and a PR template
noFAYZ Jul 30, 2026
35243af
update landing
noFAYZ Jul 30, 2026
6db6d7e
chore: add issue forms for bugs and features
noFAYZ Jul 30, 2026
6edb992
chore: route questions to Q&A discussions
noFAYZ Jul 30, 2026
09b8a16
update: UI
noFAYZ Jul 30, 2026
00ea1ba
fix(deps): bump serde_with to 3.21.0 for RUSTSEC advisory
noFAYZ Jul 30, 2026
b3d94f8
update:readme
noFAYZ Jul 30, 2026
049dc26
update:readme
noFAYZ Jul 30, 2026
c471088
Merge pull request #11 from noFAYZ/dev
noFAYZ Jul 30, 2026
e6faa98
fix(deps): bump esbuild to 0.28.1 for GHSA-g7r4-m6w7-qqqr
noFAYZ Jul 30, 2026
b5f99e5
ci: compile the Linux-only Rust on Linux
noFAYZ Jul 30, 2026
de66fd8
feat(packaging): ship an rpm alongside the deb and AppImage
noFAYZ Jul 30, 2026
66f0436
fix:Auth silent update
noFAYZ Jul 30, 2026
2a27798
feat(landing): logo, OS badges and a floating mini player
noFAYZ Jul 30, 2026
e533e39
feat(landing): give the mini player a real track and the character av…
noFAYZ Jul 30, 2026
7bfc751
lyrics tom rhodW
noFAYZ Jul 30, 2026
2a2f76d
fg
noFAYZ Jul 30, 2026
33655f9
feat: NativeAudio support + memory leak fix
noFAYZ Aug 1, 2026
3dbc24f
fix: more performance tweaks
noFAYZ Aug 1, 2026
941f11a
feat:hotnext for nativeplay
noFAYZ Aug 1, 2026
7e1f65a
feat:Youtube Auh streaming and scrobbling
noFAYZ Aug 1, 2026
f8e9c56
update: UI fixes Settings page
noFAYZ Aug 1, 2026
39d6419
update: cold load optimize
noFAYZ Aug 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
46 changes: 46 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Bug report
description: Something in the app is broken or behaves wrong
labels: [bug]
body:
- type: textarea
id: what
attributes:
label: What happens
description: What you did, what you expected, and what you got instead.
placeholder: |
1. Opened a playlist
2. Clicked the third video
3. Player stays black, audio plays
validations:
required: true

- type: input
id: version
attributes:
label: Zuno version
description: Settings → About, or the installer filename.
placeholder: "1.2.1"
validations:
required: true

- type: dropdown
id: os
attributes:
label: OS
options:
- Windows
- macOS
- Linux
validations:
required: true

- type: textarea
id: logs
attributes:
label: Log
description: |
`current.log` from the log directory — it usually says what failed.
Windows: `%LOCALAPPDATA%\com.zuno.desktop\logs`
macOS: `~/Library/Logs/com.zuno.desktop`
Linux: `~/.local/share/com.zuno.desktop/logs`
render: text
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Blank issues stay on: not every report fits a form, and a bad-fit form is how a real
# bug turns into no report at all.
blank_issues_enabled: true
contact_links:
- name: Security vulnerability
url: https://github.com/noFAYZ/zuno/security/advisories/new
about: Report privately, not as a public issue. See SECURITY.md for scope.

- name: Question or help using Zuno
url: https://github.com/noFAYZ/zuno/discussions/new?category=q-a
about: Not sure whether it is a bug? Ask here — it can be moved to an issue.
17 changes: 17 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Feature request
description: Suggest something Zuno should do
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: The problem
description: What are you trying to do that Zuno makes hard or impossible today?
validations:
required: true

- type: textarea
id: idea
attributes:
label: What you have in mind
description: Optional. A rough idea is fine — the problem above matters more.
33 changes: 33 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Dependency updates. Monthly, grouped into one PR per ecosystem — zuno has a single
# maintainer, and a weekly drip of five separate PRs is how update PRs get ignored.
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: monthly
groups:
npm:
patterns: ["*"]

- package-ecosystem: npm
directory: /landing
schedule:
interval: monthly
groups:
landing:
patterns: ["*"]

- package-ecosystem: cargo
directory: /src-tauri
schedule:
interval: monthly
groups:
cargo:
patterns: ["*"]

# Ungrouped: an action bump is one line and worth reading on its own.
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
18 changes: 18 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## What and why

<!-- What changed, and the problem it solves. One paragraph is plenty. -->

Closes #

## How it was checked

<!-- Delete what does not apply. -->

- [ ] `npm run verify` passes
- [ ] `cargo test` passes (if `src-tauri/` changed)
- [ ] Ran the app and used the affected screen
- [ ] Screenshot or clip below (UI changes)

## Notes for the reviewer

<!-- Anything non-obvious: a tradeoff, a shortcut left in, a follow-up needed. -->
27 changes: 27 additions & 0 deletions .github/rulesets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Rulesets

Rulesets are repository *settings*, not configuration GitHub reads from the tree — a file here
does nothing until it is imported. It lives in the repo so the protection on `main` is reviewable
in a diff instead of being a thing someone once clicked.

Apply or update:

```sh
gh api --method PUT repos/noFAYZ/zuno/rulesets/20021321 --input .github/rulesets/main.json
```

`main.json` is applied — id `20021321`, created 2026-07-30. Edit the file, run the command, and the
two stay in step; skip the command and the file is fiction. `gh api repos/noFAYZ/zuno/rulesets`
lists what is actually live. The UI equivalent is Settings → Rules → Rulesets.

## What `main.json` does

- No deletion, no force-push.
- Changes arrive by pull request. **Zero** approvals required — this is a solo-maintained repo, and
a review count of one would lock the maintainer out of their own default branch, since nobody can
approve their own PR.
- `verify` and `rust` — both CI jobs — must pass first. Not strict: a branch does not have to be
rebased onto the newest `main` before merging, which on a repo this size is churn without a
matching risk.
- No bypass actors. An admin can still edit the ruleset itself, so the escape hatch exists without
a standing exemption that quietly makes the rules advisory.
35 changes: 35 additions & 0 deletions .github/rulesets/main.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "main",
"target": "branch",
"enforcement": "active",
"conditions": {
"ref_name": {
"include": ["~DEFAULT_BRANCH"],
"exclude": []
}
},
"bypass_actors": [],
"rules": [
{ "type": "deletion" },
{ "type": "non_fast_forward" },
{
"type": "pull_request",
"parameters": {
"required_approving_review_count": 0,
"dismiss_stale_reviews_on_push": false,
"require_code_owner_review": false,
"require_last_push_approval": false,
"required_review_thread_resolution": false,
"allowed_merge_methods": ["merge", "squash", "rebase"]
}
},
{
"type": "required_status_checks",
"parameters": {
"strict_required_status_checks_policy": false,
"do_not_enforce_on_create": false,
"required_status_checks": [{ "context": "verify" }, { "context": "rust" }]
}
}
]
}
108 changes: 108 additions & 0 deletions .github/workflows/aur.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Publishes zuno to the AUR whenever a release is published.
#
# Runs from CI because the AUR needs an Arch environment and an SSH key, and the maintainer
# develops on Windows — doing this by hand meant either a VM or the package going stale.
#
# Requires one repository secret:
# AUR_SSH_PRIVATE_KEY — the private half of the SSH key registered on the AUR account
name: AUR

on:
release:
types: [published]
# Lets a botched package be re-pushed without cutting another release.
workflow_dispatch:
inputs:
version:
description: "Version to publish, without the leading v (e.g. 1.2.1)"
required: true

# Publishing happens over SSH to the AUR, not through the GitHub token.
permissions:
contents: read

jobs:
publish:
runs-on: ubuntu-latest
container: archlinux:base-devel
steps:
- uses: actions/checkout@v4

- name: Resolve version
id: version
run: |
if [ -n "${{ github.event.inputs.version }}" ]; then
version="${{ github.event.inputs.version }}"
else
version="${GITHUB_REF_NAME#v}"
fi
echo "version=$version" >> "$GITHUB_OUTPUT"

- name: Install packaging tools
run: |
pacman -Syu --noconfirm --needed git openssh pacman-contrib sudo
# makepkg and everything built on it — updpkgsums, --printsrcinfo — refuse to run
# as root, and the container is root. One unprivileged user serves all of them.
useradd -m builder
# `makepkg -s` installs the declared dependencies, which needs pacman.
echo 'builder ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/builder

- name: Update version and checksum
working-directory: packaging/aur/zuno
run: |
version="${{ steps.version.outputs.version }}"
sed -i "s/^pkgver=.*/pkgver=${version}/" PKGBUILD
sed -i "s/^pkgrel=.*/pkgrel=1/" PKGBUILD
chown -R builder .
# updpkgsums downloads the released .deb and rewrites sha256sums from what actually
# shipped, rather than trusting a hash edited by hand alongside the version.
#
# .SRCINFO is what the AUR reads — not the PKGBUILD — so a stale one silently serves
# the old version even after a successful push.
su builder -c "updpkgsums && makepkg --printsrcinfo > .SRCINFO"

- name: Build it before anyone else has to
working-directory: packaging/aur/zuno
run: su builder -c "makepkg -sf --noconfirm"

- name: Publish
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
run: |
version="${{ steps.version.outputs.version }}"

mkdir -p ~/.ssh
echo "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
chmod 600 ~/.ssh/aur
# `accept-new` rather than a keyscan: a keyscan that returns nothing fails silently
# and leaves an empty known_hosts, which is what broke the first run. This trusts
# the host on first contact and pins it for the rest of the job, and unlike
# StrictHostKeyChecking=no it still rejects a key that changes mid-run.
export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=$HOME/.ssh/known_hosts"

git config --global user.name "${{ github.actor }}"
git config --global user.email "${{ github.actor }}@users.noreply.github.com"

# A package that does not exist yet clones as an empty repo rather than failing, so
# the first run creates it and every run after updates it. That matters because the
# maintainer is on Windows: without this, publishing would need a Linux box once,
# purely to make the initial commit.
git clone ssh://aur@aur.archlinux.org/zuno.git /tmp/aur || {
echo "No AUR repo yet — initialising one."
mkdir -p /tmp/aur
git -C /tmp/aur init -b master
git -C /tmp/aur remote add origin ssh://aur@aur.archlinux.org/zuno.git
}

# Only these two files belong in an AUR repo — no sources, no built packages.
cp packaging/aur/zuno/PKGBUILD packaging/aur/zuno/.SRCINFO /tmp/aur/

cd /tmp/aur
# `--quiet` alone reports nothing on a fresh repo where the files are untracked.
git add PKGBUILD .SRCINFO
if git diff --cached --quiet; then
echo "AUR already at ${version}, nothing to push."
exit 0
fi
git commit -m "zuno ${version}"
git push -u origin master
Loading