Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
d910d70
format issues
WeekendSuperhero Mar 24, 2026
d6bde4b
updated to have a webserver
WeekendSuperhero Apr 14, 2026
bf5fea1
updated to have install script
WeekendSuperhero Apr 14, 2026
10f0b0f
updated to use better path resolution with paths
WeekendSuperhero Apr 14, 2026
c3c65bd
updated config
WeekendSuperhero Apr 14, 2026
009e3be
fixed viszualizer colors
WeekendSuperhero Apr 14, 2026
adf216b
changed loop back device
WeekendSuperhero Apr 14, 2026
b0292ba
fixed cargo plus hardware interfaces list
WeekendSuperhero Apr 14, 2026
c4aaf5a
fixed cargo plus hardware interfaces list
WeekendSuperhero Apr 15, 2026
3f966f2
fixed defaults
WeekendSuperhero Apr 15, 2026
22f7df6
fixed audio-leaf vs api
WeekendSuperhero Apr 15, 2026
afd7d42
fixed audio leaf formatting
WeekendSuperhero Apr 15, 2026
f46f290
fixed audio support
WeekendSuperhero Apr 16, 2026
a92e683
reinstall again
WeekendSuperhero Apr 16, 2026
9923d35
fixed settings
WeekendSuperhero Apr 16, 2026
72b03e9
fixed settings
WeekendSuperhero Apr 16, 2026
abe6dff
fixed some more settings
WeekendSuperhero Apr 16, 2026
ac7fa6a
removed vite proxy
WeekendSuperhero Apr 16, 2026
0097625
removed vite proxy
WeekendSuperhero Apr 16, 2026
e0fcb47
used found device
WeekendSuperhero Apr 16, 2026
698c99c
updated configuration values
WeekendSuperhero Apr 16, 2026
49d8b0d
updated buffer window
WeekendSuperhero Apr 16, 2026
564984b
added a tokio heartbeat
WeekendSuperhero Apr 16, 2026
a7642dc
added more features to tokio
WeekendSuperhero Apr 16, 2026
e0132c7
updated buffer window
WeekendSuperhero Apr 16, 2026
58224c2
update binary
WeekendSuperhero Apr 16, 2026
bdb4eb2
updated quick methods
WeekendSuperhero Apr 16, 2026
16f6b2a
updated the front end
WeekendSuperhero Apr 16, 2026
ba2fc9c
updated the ui design a little bit
WeekendSuperhero Apr 16, 2026
9dbad59
fixed UI
WeekendSuperhero Apr 16, 2026
6b83bb9
fixed UI
WeekendSuperhero Apr 17, 2026
7014856
fixed UI state and viw
WeekendSuperhero Apr 17, 2026
82eb95f
changed viszualizer setting
WeekendSuperhero Apr 17, 2026
12158c1
changed viszualizer setting
WeekendSuperhero Apr 18, 2026
8dfb7b7
one more fix
WeekendSuperhero Apr 19, 2026
0415bca
fixed playback issues
WeekendSuperhero Apr 19, 2026
c10b577
fixed playback issues
WeekendSuperhero Apr 19, 2026
8b54861
audio leaf for the win
WeekendSuperhero Apr 19, 2026
af80ec9
updated audio parsing album
WeekendSuperhero Apr 19, 2026
cd991c5
update audio parsing and clean seperation of mac and linux
WeekendSuperhero Apr 19, 2026
e56faa7
the start of something new
WeekendSuperhero Apr 20, 2026
746cfa8
updated docker job
WeekendSuperhero Apr 22, 2026
e73de52
updated to lowercae
WeekendSuperhero Apr 22, 2026
4c95ffa
updated docker file
WeekendSuperhero Apr 22, 2026
d86f97e
updated docker file
WeekendSuperhero Apr 22, 2026
6069185
fmt fix
WeekendSuperhero Apr 26, 2026
d4b9aa6
fmt fix
WeekendSuperhero Apr 26, 2026
6ae5397
updated configuration settings
WeekendSuperhero Apr 26, 2026
9e349f9
updated files with issues
WeekendSuperhero Apr 26, 2026
256f64b
one final fix
WeekendSuperhero Apr 26, 2026
161314a
one final fix
WeekendSuperhero Apr 26, 2026
65f9103
fixed formatting
WeekendSuperhero May 1, 2026
61e5e2b
fixed formatting
WeekendSuperhero May 1, 2026
5616078
longer lines
WeekendSuperhero May 1, 2026
861d137
fixed sync.conf file
WeekendSuperhero May 1, 2026
bc58fc5
revert settings
WeekendSuperhero May 1, 2026
b3f9674
changed settings
WeekendSuperhero May 1, 2026
49cdaff
don't use master
WeekendSuperhero May 1, 2026
b5b219e
Updated with debug script + audioleaf changes
WeekendSuperhero May 7, 2026
592d2b8
fixed CI/CD
WeekendSuperhero May 7, 2026
1708cbe
Update to only have one host at a time
WeekendSuperhero May 7, 2026
f49ded4
updated to use windows
WeekendSuperhero May 7, 2026
5126a07
updated code should work now
WeekendSuperhero May 8, 2026
ac98f4e
updated viz code
WeekendSuperhero May 9, 2026
79745c3
updated pair process
WeekendSuperhero May 23, 2026
1cb3b8c
updated pair steps
WeekendSuperhero May 23, 2026
cc71f01
fixed a few more bugs
WeekendSuperhero May 23, 2026
2aa7bf5
fixed a few more bugs related to panel orentation
WeekendSuperhero May 23, 2026
3e872e3
most likely one of the final changes
WeekendSuperhero May 23, 2026
8eaa431
NanoViz for the win
WeekendSuperhero May 23, 2026
c025aa6
spawn blocking task
WeekendSuperhero May 23, 2026
704a65d
updated a few packages
WeekendSuperhero May 23, 2026
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
13 changes: 13 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.git
.github
target
node_modules
web/node_modules
web/dist
Assets
test.wav
*.md
LICENSE
.DS_Store
.idea
.vscode
12 changes: 6 additions & 6 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
os: [ubuntu-latest, macos-latest]
rust: [stable]

steps:
Expand Down Expand Up @@ -64,8 +64,8 @@ jobs:
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings

- name: Build
if: matrix.os != 'macos-latest'
- name: Build (Linux)
if: matrix.os == 'ubuntu-latest'
run: cargo build --release --verbose

- name: Add macOS targets
Expand All @@ -78,9 +78,9 @@ jobs:
cargo build --release --target x86_64-apple-darwin
cargo build --release --target aarch64-apple-darwin
lipo -create \
target/x86_64-apple-darwin/release/audioleaf \
target/aarch64-apple-darwin/release/audioleaf \
-output target/release/audioleaf-universal
target/x86_64-apple-darwin/release/nanoviz \
target/aarch64-apple-darwin/release/nanoviz \
-output target/release/nanoviz-universal

- name: Run tests
run: cargo test --verbose
151 changes: 151 additions & 0 deletions .github/workflows/container.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
name: Container

on:
push:
branches:
- main
tags:
- "v*"
pull_request:
paths:
- "Dockerfile"
- ".dockerignore"
- "containers/**"
- ".github/workflows/container.yaml"
- "Cargo.toml"
- "Cargo.lock"
- "src/**"
- "web/**"
- "piWebServer/**"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !github.ref_protected }}

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
build:
name: Build (${{ matrix.platform }})
runs-on: ${{ matrix.runner }}
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-24.04
- platform: linux/arm64
runner: ubuntu-24.04-arm

steps:
- name: Resolve image name (lowercase)
run: echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/nanoviz" >> "$GITHUB_ENV"

- name: Prepare platform pair
id: platform
run: |
platform="${{ matrix.platform }}"
echo "pair=${platform//\//-}" >> "$GITHUB_OUTPUT"

- name: Checkout
uses: actions/checkout@v6

- name: Set up Buildx
uses: docker/setup-buildx-action@v4

- name: Log in to GHCR
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Compute image labels
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.IMAGE }}

- name: Build and push by digest
id: build
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.IMAGE }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=gha,scope=${{ steps.platform.outputs.pair }}
cache-to: type=gha,mode=max,scope=${{ steps.platform.outputs.pair }}

- name: Export digest
run: |
mkdir -p "${{ runner.temp }}/digests"
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/upload-artifact@v7
with:
name: digests-${{ steps.platform.outputs.pair }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1

merge:
name: Publish manifest
needs: build
runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Resolve image name (lowercase)
run: echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY_OWNER,,}/nanoviz" >> "$GITHUB_ENV"

- name: Download digests
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true

- name: Set up Buildx
uses: docker/setup-buildx-action@v4

- name: Log in to GHCR
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Compute image metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.IMAGE }}
tags: |
type=ref,event=branch
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha,format=short
type=raw,value=latest,enable={{is_default_branch}}
type=raw,value=dev,enable=${{ github.event_name == 'pull_request' }}

- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create \
$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.IMAGE }}@sha256:%s ' *)

- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.IMAGE }}:${{ steps.meta.outputs.version }}
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,12 @@
/target
/node_modules
.DS_Store
web/node_modules
web/dist
web/*.tsbuildinfo
.claude
*.wav
.pnpm-store

# Stakpak session files
.stakpak/session*
File renamed without changes
File renamed without changes.
34 changes: 26 additions & 8 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,27 @@ All notable changes to this fork of audioleaf are documented in this file.

This fork focuses on macOS compatibility, support for all Nanoleaf device types, and enhanced color palette features.

## [4.0.0] — Renamed to NanoViz

The project was renamed from **audioleaf** to **NanoViz** to reflect its
shift from a terminal-only macOS tool to a Pi-first AirPlay appliance with
a web control panel. Original audioleaf credit preserved in [NOTICE](NOTICE)
and the README's Credits section. Breaking changes for existing installs:

- Crate / binary / container image are now `nanoviz`. Old image path
`ghcr.io/weekendsuperhero-io/audioleaf` is dead; pull
`ghcr.io/weekendsuperhero-io/nanoviz` instead.
- Env vars renamed: `AUDIOLEAF_*` → `NANOVIZ_*` (including
`NANOVIZ_AIRPLAY_NAME`, `NANOVIZ_FRONTEND_DIR`,
`NANOVIZ_SHAIRPORT_METADATA_PIPE`, `NANOVIZ_LOG_METADATA`).
- Default config dir is now `~/.config/nanoviz/` (was
`~/.config/audioleaf/`). On Linux you can `mv` the old dir or pass
`--config-dir=~/.config/audioleaf` to keep using the old layout.
- systemd unit, polkit rule, Quadlet filename, and container name all
default to `nanoviz` instead of `audioleaf`.
- Default AirPlay receiver name is now `nanoviz`; override with
`pi/setup.sh --airplay-name="..."` as before.

## [3.5.0] - 2026-03-17

### Added
Expand Down Expand Up @@ -70,8 +91,8 @@ This fork focuses on macOS compatibility, support for all Nanoleaf device types,
- **SSDP deduplication**: Prevent duplicate device entries when multiple SSDP responses are received for the same device

- **macOS config directory support**: Properly handle macOS Application Support directory
- Config location: `~/Library/Application Support/audioleaf/`
- Device data location: `~/Library/Application Support/audioleaf/`
- Config location: `~/Library/Application Support/nanoviz/`
- Device data location: `~/Library/Application Support/nanoviz/`
- Previous version assumed Linux-style `~/.config/` on all platforms

- **Flexible config parsing**: Accept both integer and float values for `default_gain` in config.toml
Expand All @@ -80,7 +101,7 @@ This fork focuses on macOS compatibility, support for all Nanoleaf device types,

- **Comprehensive documentation**:
- Complete configuration reference with all options explained
- Platform-specific audio setup guides (macOS, Linux, Windows)
- Platform-specific audio setup guides (macOS, Linux)
- Pre-made color palette examples using HSB color system
- HSB color wheel reference (0-359 hue values)
- Detailed troubleshooting section
Expand Down Expand Up @@ -125,7 +146,6 @@ This fork focuses on macOS compatibility, support for all Nanoleaf device types,

- **Recommended gain values**: Updated documentation for audio devices
- macOS BlackHole 2ch (targeted directly): `default_gain = 1`
- Windows VB Cable: `default_gain = 200-500` (may vary)
- Physical microphones: `default_gain = 1-10`
- Important: Target BlackHole 2ch directly, not the Multi-Output aggregate device

Expand Down Expand Up @@ -155,9 +175,8 @@ Panel filtering logic excludes controller units:

| Platform | Config Path | Device Data Path |
| -------- | ----------------------------------------------------- | --------------------------------------------------------- |
| macOS | `~/Library/Application Support/audioleaf/config.toml` | `~/Library/Application Support/audioleaf/nl_devices.toml` |
| Linux | `~/.config/audioleaf/config.toml` | `~/.config/audioleaf/nl_devices.toml` |
| Windows | `%APPDATA%\audioleaf\config.toml` | `%APPDATA%\audioleaf\nl_devices.toml` |
| macOS | `~/Library/Application Support/nanoviz/config.toml` | `~/Library/Application Support/nanoviz/nl_devices.toml` |
| Linux | `~/.config/nanoviz/config.toml` | `~/.config/nanoviz/nl_devices.toml` |

### Audio Gain Values

Expand All @@ -166,7 +185,6 @@ Recommended gain settings based on audio source:
| Audio Source | Configuration | Recommended Gain |
| ----------------------------- | --------------------------------- | ---------------- |
| BlackHole 2ch (macOS, direct) | `audio_backend = "BlackHole 2ch"` | 1 |
| VB Cable (Windows) | Varies by setup | 200-500 |
| Physical microphone | Direct input | 1-10 |

**Important for macOS users**: Set `audio_backend` to `"BlackHole 2ch"` (the virtual device itself), not the Multi-Output Device aggregate. This provides proper audio levels with `default_gain = 1`.
Expand Down
Loading
Loading