Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
d64cf1c
feat: Begin modularization - Phase 0 implementation
dskvr Sep 15, 2025
6cadbb0
feat: Implement renderer abstraction - Phase 1
dskvr Sep 15, 2025
40b1fcd
feat: Implement platform abstraction - Phase 2
dskvr Sep 15, 2025
bd62b5b
feat: Implement compositor adapters - Phase 3
dskvr Sep 15, 2025
628a01b
feat: Implement runtime switching - Phase 4
dskvr Sep 15, 2025
10b49ff
Wire everything together, fix broken tests
dskvr Sep 15, 2025
359df06
address review comments
dskvr Sep 15, 2025
352f535
add more compositors, update docs, update tests
dskvr Sep 16, 2025
c2a149a
missing tests
dskvr Sep 16, 2025
09564db
add more granular tets
dskvr Sep 16, 2025
68e36ff
Update tests/test_config_validation.c
dskvr Sep 16, 2025
77f4f2d
add runtime controls to ctr command (hyprlax ctl) and respective docs…
dskvr Sep 16, 2025
85316e4
fix memcheck errors
dskvr Sep 16, 2025
04a3fea
address review comments
dskvr Sep 16, 2025
b18287e
add sections to website, switch to component model, finish x11 platfo…
dskvr Sep 16, 2025
3fc4cab
add gif to readme
dskvr Sep 16, 2025
afa714e
add pre-release workflow
dskvr Sep 16, 2025
1d52b91
fix wf
dskvr Sep 16, 2025
0cc33b4
fix prelease assets
dskvr Sep 16, 2025
374dbf7
add readiness check
dskvr Sep 16, 2025
e2ee9a9
add single instance protection, add IPC connection retries to all com…
dskvr Sep 16, 2025
43baad6
fix stdout/stder crash when closed condition
dskvr Sep 16, 2025
f1535a8
add new docs
dskvr Sep 16, 2025
8288e4f
add first phase of multi-monitor support
dskvr Sep 16, 2025
5f0e3cc
feat: Add multi and space example configurations
dskvr Sep 16, 2025
c23e48a
add window context abstraction to support different workspace methodo…
dskvr Sep 17, 2025
3b427a7
add feature branch builds and bot to link to binaries.
dskvr Sep 17, 2025
250ed24
add workflow dispatch trigger to feature build
dskvr Sep 17, 2025
f0f9837
simply rendering logic, single path for all monitor configs, add feat…
dskvr Sep 17, 2025
05f52b1
code formatting and added better messages to integration tests
dskvr Sep 17, 2025
2491bed
Merge pull request #15 from sandwichfarm/feature/v2-multi-monitor
dskvr Sep 17, 2025
52fc3b7
chore: bump version to v2.0.0-beta.2
dskvr Sep 17, 2025
5f3977c
remove X11 platform support
dskvr Sep 18, 2025
bba93d9
Merge master into feature/refactor, resolving conflicts
dskvr Sep 18, 2025
121a8d3
[bugfix] parallax inconsistency and unexpected mouse behaviors (#21)
dskvr Sep 19, 2025
b1b56cf
implement niri parallax correctly
dskvr Sep 19, 2025
fed7f43
finish and correfct delta calculations
dskvr Sep 19, 2025
fdc7e91
fix lagging state bug caused by multi-state tracking
dskvr Sep 19, 2025
12f062d
remove all state tracking from Niri compositor adapter, fix bugs in c…
dskvr Sep 19, 2025
f5fa347
fix tests
dskvr Sep 19, 2025
a3a2c8b
appease linter
dskvr Sep 19, 2025
6ff36d9
fix: remove hyprlax-ctl references from workflows
dskvr Sep 19, 2025
255867c
single source of truth for version
dskvr Sep 19, 2025
146cc25
update release procedure and feature branch workflow
dskvr Sep 19, 2025
561e6f6
River, working on single monitor setup (#44)
dskvr Sep 19, 2025
7b70bd7
Merge feature/refactor into feature/niri, resolving Makefile conflicts
dskvr Sep 19, 2025
3910910
Niri Support (#41)
dskvr Sep 19, 2025
c59a9f9
Merge branch 'feature/niri' into feature/refactor
dskvr Sep 19, 2025
23787fc
Performance Optimizations (#46)
dskvr Sep 19, 2025
a0a1e99
Merge branch 'master' into feature/refactor
dskvr Sep 19, 2025
7546bb0
add event driven rendering from idle instead of poll
dskvr Sep 19, 2025
dd1be03
add smoke tests for get_event_fd in compositors
dskvr Sep 19, 2025
b9c3f23
Parallax Modes: Cursor Tracking, TOML Config (#48)
dskvr Sep 21, 2025
a399fa8
Hierarchical documentation restructure (#51)
dskvr Sep 22, 2025
1c5ddb7
Fix IPC (#53)
dskvr Sep 22, 2025
c356eae
move time to middle layer
dskvr Sep 22, 2025
f92249d
Cherry blossom with time example (#55)
dskvr Sep 23, 2025
a1d41dc
AUR (#54)
dskvr Sep 23, 2025
c96fae9
Feature/align config keys (#56)
dskvr Sep 23, 2025
8252569
fix regressions from claude's conflict resolution (#57)
dskvr Sep 23, 2025
5a1287a
fix IPC tint + help menu
dskvr Sep 23, 2025
34f6511
tint with blur
dskvr Sep 23, 2025
d3da142
add first iteration of TOD simulator
dskvr Sep 23, 2025
6be46bc
functional sun/moon phase
dskvr Sep 24, 2025
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
79 changes: 79 additions & 0 deletions .github/workflows/aur-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Publish AUR (hyprlax)

on:
release:
types: [published]

jobs:
aur:
if: ${{ github.event.release.prerelease == false }}
runs-on: ubuntu-latest
container: archlinux:base-devel
steps:
- name: Install tools
run: |
pacman -Syu --noconfirm git openssh wget sed which base-devel wayland wayland-protocols

- name: Checkout repository
uses: actions/checkout@v4

- name: Prepare PKGBUILD for release tag
id: prep
env:
TAG: ${{ github.event.release.tag_name }}
run: |
set -euo pipefail
if [[ -z "${TAG:-}" ]]; then echo "Missing tag"; exit 1; fi
PKGVER="${TAG#v}"
echo "pkgver=${PKGVER}" >> "$GITHUB_OUTPUT"
WORKDIR=/tmp/aur-hyprlax
mkdir -p "$WORKDIR"
cp packaging/arch/hyprlax/PKGBUILD "$WORKDIR/PKGBUILD"
# Update pkgver in PKGBUILD
sed -i "s/^pkgver=.*/pkgver=${PKGVER}/" "$WORKDIR/PKGBUILD"
# Fetch source tarball and compute sha256
TARBALL_URL="https://github.com/sandwichfarm/hyprlax/archive/refs/tags/${TAG}.tar.gz"
wget -O /tmp/src.tar.gz "$TARBALL_URL"
SHA256=$(sha256sum /tmp/src.tar.gz | awk '{print $1}')
# Ensure source filename has v${pkgver}
sed -i "s|^source=.*|source=(\"hyprlax-v${PKGVER}.tar.gz::${TARBALL_URL}\")|" "$WORKDIR/PKGBUILD"
sed -i "s/^sha256sums=.*/sha256sums=('${SHA256}')/" "$WORKDIR/PKGBUILD"
# Generate .SRCINFO
cd "$WORKDIR"
makepkg --printsrcinfo > .SRCINFO
ls -la

- name: Configure SSH for AUR
env:
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
run: |
set -euo pipefail
if [[ -z "${AUR_SSH_PRIVATE_KEY:-}" ]]; then
echo "AUR_SSH_PRIVATE_KEY secret is not set" >&2
exit 1
fi
install -m 700 -d ~/.ssh
echo "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -t ed25519 aur.archlinux.org >> ~/.ssh/known_hosts

- name: Push to AUR (hyprlax)
env:
PKGDIR: /tmp/aur-hyprlax
run: |
set -euo pipefail
cd /tmp
git clone ssh://[email protected]/hyprlax.git aur-hyprlax-repo
cd aur-hyprlax-repo
# Copy updated files
cp -f "$PKGDIR/PKGBUILD" "$PKGDIR/.SRCINFO" .
if git diff --quiet --no-index . "$PKGDIR"; then
echo "No changes to push to AUR"
exit 0
fi
git config user.name "github-actions"
git config user.email "[email protected]"
git add PKGBUILD .SRCINFO
git commit -m "release: ${GITHUB_REF#refs/tags/}"
git push

52 changes: 52 additions & 0 deletions .github/workflows/feature-build-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Feature Build Cleanup

on:
pull_request:
types: [converted_to_draft, closed]

jobs:
cleanup-comment:
runs-on: ubuntu-latest

steps:
- name: Remove build artifact comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});

const botComment = comments.data.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('🤖 **Build Artifact Available**')
);

if (botComment) {
const eventType = context.payload.action;
let updateBody = '';

if (eventType === 'converted_to_draft') {
updateBody = `🤖 **Build Artifact Paused**

This PR has been converted to draft. Build artifacts are only generated for PRs ready for review.

Mark this PR as "Ready for review" to generate a new build artifact.`;
} else if (eventType === 'closed') {
updateBody = `🤖 **Build Artifact Expired**

This PR has been closed. The build artifact links above may no longer work.`;
}

if (updateBody) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: updateBody
});
}
}
13 changes: 11 additions & 2 deletions .github/workflows/feature-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,20 @@ jobs:
libwayland-dev \
libegl1-mesa-dev \
libgles2-mesa-dev \
libx11-dev \
libxext-dev \
wayland-scanner++ \
pkg-config

- name: Generate VERSION file
if: steps.pr_info.outputs.skip != 'true'
run: |
# Sanitize branch name (replace / with -)
BRANCH_NAME=$(echo "${{ steps.pr_info.outputs.head_ref }}" | sed 's/\//-/g')
# Get short commit hash
SHORT_SHA=$(echo "${{ steps.pr_info.outputs.head_sha }}" | cut -c1-7)
# Create VERSION file with branch-commit format
echo "${BRANCH_NAME}-${SHORT_SHA}" > VERSION
echo "Generated version: $(cat VERSION)"

- name: Build hyprlax
if: steps.pr_info.outputs.skip != 'true'
run: |
Expand Down
23 changes: 5 additions & 18 deletions .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,17 @@ jobs:
wayland-protocols \
libegl1-mesa-dev \
libgles2-mesa-dev \
libx11-dev \
libxext-dev \
check

- name: Build binary
env:
CC: ${{ matrix.cc }}
ARCH: ${{ matrix.arch }}
run: |
# Add pre-release version info to build
VERSION=${{ github.ref_name }}
# Extract version from tag (remove 'v' prefix)
VERSION="${GITHUB_REF_NAME#v}"
echo "$VERSION" > VERSION
echo "Building pre-release version: $VERSION"
echo "#define HYPRLAX_VERSION \"$VERSION-PRE\"" > src/version.h

make clean
make
Expand All @@ -88,21 +86,14 @@ jobs:
run: |
# Rename binaries to match release workflow naming
mv hyprlax hyprlax-${{ matrix.arch }}
mv hyprlax-ctl hyprlax-ctl-${{ matrix.arch }}
chmod +x hyprlax-${{ matrix.arch }}
chmod +x hyprlax-ctl-${{ matrix.arch }}

- name: Upload hyprlax artifact
uses: actions/upload-artifact@v4
with:
name: hyprlax-${{ matrix.arch }}
path: hyprlax-${{ matrix.arch }}

- name: Upload hyprlax-ctl artifact
uses: actions/upload-artifact@v4
with:
name: hyprlax-ctl-${{ matrix.arch }}
path: hyprlax-ctl-${{ matrix.arch }}

create-pre-release:
needs: [validate-branch, build-pre-release]
Expand Down Expand Up @@ -187,20 +178,17 @@ jobs:
### 🔧 Installation (Testing Only)

\`\`\`bash
# Download binaries
# Download binary
wget https://github.com/sandwichfarm/hyprlax/releases/download/${VERSION}/hyprlax-x86_64
wget https://github.com/sandwichfarm/hyprlax/releases/download/${VERSION}/hyprlax-ctl-x86_64

# Make executable and install (at your own risk)
chmod +x hyprlax-x86_64 hyprlax-ctl-x86_64
chmod +x hyprlax-x86_64
sudo mv hyprlax-x86_64 /usr/local/bin/hyprlax
sudo mv hyprlax-ctl-x86_64 /usr/local/bin/hyprlax-ctl
\`\`\`

### 📦 Available Builds

- \`hyprlax-x86_64\` - Main hyprlax binary for Intel/AMD 64-bit
- \`hyprlax-ctl-x86_64\` - Control client for Intel/AMD 64-bit

*Note: ARM64 builds not available for pre-releases. Please build from source.*

Expand Down Expand Up @@ -245,7 +233,6 @@ jobs:
prerelease: true # ALWAYS true for pre-releases
files: |
hyprlax-x86_64
hyprlax-ctl-x86_64
SHA256SUMS
fail_on_unmatched_files: true
generate_release_notes: false # We generate our own
Expand Down
70 changes: 44 additions & 26 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,40 @@ name: Release
on:
push:
tags:
- 'v*'
# Only match stable version tags (no dash)
# v1.0.0, v2.1.3 etc. (NOT v1.0.0-beta.1)
- 'v[0-9]+.[0-9]+.[0-9]+'

permissions:
contents: write

jobs:
validate-branch:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Validate tag is from master
run: |
# Get the branch containing this tag
BRANCH=$(git branch -r --contains ${{ github.ref_name }} | grep -v HEAD | head -1 | sed 's/.*origin\///')
echo "Stable release tag ${{ github.ref_name }} is on branch: $BRANCH"

# Stable releases must be from master branch
if [[ "$BRANCH" != "master" ]] && [[ "$BRANCH" != "main" ]]; then
echo "::error::Stable release tags must be created from master/main branch!"
echo "Current branch is: $BRANCH"
echo "For pre-releases from feature branches, use version tags like v1.0.0-beta.1"
exit 1
fi

echo "✅ Stable release tag is correctly on master/main branch"

build:
needs: validate-branch
strategy:
matrix:
include:
Expand All @@ -34,6 +61,13 @@ jobs:
pkg-config \
make

- name: Write VERSION file from tag
run: |
# Extract version from tag (remove 'v' prefix)
VERSION="${GITHUB_REF_NAME#v}"
echo "$VERSION" > VERSION
echo "Building version: $VERSION"

- name: Build
env:
CC: ${{ matrix.cc }}
Expand All @@ -45,26 +79,17 @@ jobs:
id: binary
run: |
echo "hyprlax_name=hyprlax-${{ matrix.arch }}" >> $GITHUB_OUTPUT
echo "ctl_name=hyprlax-ctl-${{ matrix.arch }}" >> $GITHUB_OUTPUT

- name: Rename binaries
- name: Rename binary
run: |
mv hyprlax ${{ steps.binary.outputs.hyprlax_name }}
mv hyprlax-ctl ${{ steps.binary.outputs.ctl_name }}
chmod +x ${{ steps.binary.outputs.hyprlax_name }}
chmod +x ${{ steps.binary.outputs.ctl_name }}

- name: Upload hyprlax artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.binary.outputs.hyprlax_name }}
path: ${{ steps.binary.outputs.hyprlax_name }}

- name: Upload hyprlax-ctl artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.binary.outputs.ctl_name }}
path: ${{ steps.binary.outputs.ctl_name }}

release:
needs: build
Expand All @@ -84,17 +109,12 @@ jobs:
# Move all binaries to root
find ./binaries -type f -name 'hyprlax-*' -exec mv {} . \;

# Check if we have the x86_64 binaries
# Check if we have the x86_64 binary
if [ ! -f hyprlax-x86_64 ]; then
echo "Error: hyprlax-x86_64 binary not found!"
exit 1
fi

if [ ! -f hyprlax-ctl-x86_64 ]; then
echo "Error: hyprlax-ctl-x86_64 binary not found!"
exit 1
fi

# Create checksums
sha256sum hyprlax-* > SHA256SUMS

Expand Down Expand Up @@ -127,25 +147,24 @@ jobs:
body: |
## Release ${{ steps.version.outputs.version }}

Smooth parallax wallpaper animations for Hyprland.
Multi-compositor parallax wallpaper engine for Linux.

### Installation

Download the binaries:
- `hyprlax-x86_64` - Main hyprlax binary for x86_64 systems
- `hyprlax-ctl-x86_64` - Control client for x86_64 systems
Download the binary:
- `hyprlax-x86_64` - hyprlax binary for x86_64 systems (control interface integrated)

```bash
# Download both binaries
# Download binary
wget https://github.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.version }}/hyprlax-x86_64
wget https://github.com/${{ github.repository }}/releases/download/${{ steps.version.outputs.version }}/hyprlax-ctl-x86_64

# Make executable and install
chmod +x hyprlax-x86_64 hyprlax-ctl-x86_64
chmod +x hyprlax-x86_64
sudo mv hyprlax-x86_64 /usr/local/bin/hyprlax
sudo mv hyprlax-ctl-x86_64 /usr/local/bin/hyprlax-ctl
```

**Note:** The control interface is now integrated. Use `hyprlax ctl <command>` for runtime control.

For ARM64 and other architectures, please build from source.

### Changes
Expand All @@ -158,7 +177,6 @@ jobs:

files: |
hyprlax-x86_64
hyprlax-ctl-x86_64
SHA256SUMS
draft: false
prerelease: ${{ contains(steps.version.outputs.version, '-') }}
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ jobs:
--suppress=unusedFunction \
--suppress=constVariablePointer \
--inline-suppr \
src/ipc.c src/hyprlax-ctl.c
src/ipc.c src/hyprlax_ctl.c

- name: Check code formatting
run: |
Expand Down
Loading