Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
836a517
publications: add notedeck_publications crate for NKBIP-01 support
limina1 Jan 6, 2026
174bbe1
publications: add working relay fetch example
limina1 Jan 6, 2026
2a7e6ae
publications: add TimelineKind::Publications for 30040 feed
limina1 Jan 6, 2026
e897390
fix: resolve hyper type inference issues in http_req
limina1 Jan 6, 2026
cf64693
publications: add Publications column option to Add Column UI
limina1 Jan 6, 2026
ea7dc3b
publications: add Route::Publication and minimal reader placeholder
limina1 Jan 6, 2026
7ffeadd
publications: implement 30040 feed display and publication reader
limina1 Jan 7, 2026
1886ae1
nip19: use naddr for parameterized replaceable events in context menu
limina1 Jan 7, 2026
6849bf4
publications: wire up PublicationTree for hierarchical navigation
limina1 Jan 7, 2026
aebb350
publications: add navigation history to PublicationSelection
limina1 Jan 7, 2026
cfe2e22
publications: add breadcrumb navigation UI
limina1 Jan 7, 2026
8bc03c2
publications: add siblings() method for tree navigation
limina1 Jan 7, 2026
0b542f0
publications: add Index view mode foundation
limina1 Jan 7, 2026
8e4df1e
publications: implement index view rendering
limina1 Jan 7, 2026
574a0a0
publications: add index view navigation controls
limina1 Jan 7, 2026
ae60fde
publications: add section count to feed cards
limina1 Jan 7, 2026
8db5975
publications: add default reader mode toggle to feed
limina1 Jan 7, 2026
3e3d1a7
relay: add theforest.nostr1.com to bootstrap relays
limina1 Jan 7, 2026
3a635e9
publications: add NIP-11 relay info caching and load more support
limina1 Jan 18, 2026
38d149a
ci: add Android APK build and GitHub Release workflow
limina1 Jan 18, 2026
e6b514b
Merge origin/master into feature/publication-tree
limina1 Jan 18, 2026
2d80077
ci: create release even if some platform builds fail
limina1 Jan 18, 2026
43728ae
ui: rename Index view to Outline view
limina1 Jan 19, 2026
525091d
ui: show preview snippets for leaves in Outline view
limina1 Jan 19, 2026
3bd6954
ui: default to Outline view on narrow/mobile screens
limina1 Jan 19, 2026
a31db9f
publications: add configurable incremental resolution
limina1 Jan 19, 2026
3ae38bb
publications: implement lazy on-demand resolution with visibility tra…
limina1 Jan 19, 2026
46ebf3c
ui: make Outline view leaves expandable instead of showing previews
limina1 Jan 19, 2026
c7281d8
ui: add resolution strategy toggle in Publications feed
limina1 Jan 19, 2026
d1511a4
ui: make Lazy default and add Expand/Collapse All button
limina1 Jan 19, 2026
88b7dfa
publications: simplify to lazy-only resolution, reorder mode buttons
limina1 Jan 19, 2026
dd4ead1
ui: make Outline the default ReaderMode
limina1 Jan 19, 2026
2e3c4d6
ui: remove feed mode toggle, add breadcrumbs to paginated view
limina1 Jan 19, 2026
75a1322
feat: extract Publications into standalone notedeck_reader app
limina1 Jan 21, 2026
57a0aaa
perf: add profiling annotations to Reader render functions
limina1 Jan 21, 2026
3efd606
refactor: apply nevernesting pattern to Reader UI code
limina1 Jan 21, 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
214 changes: 214 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
name: Release

on:
push:
tags:
- 'v*'

jobs:
build-android:
name: Build Android APK
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup Java JDK
uses: actions/setup-java@v4.5.0
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Add android rust target
run: rustup target add aarch64-linux-android
- name: Install Cargo NDK
run: cargo install cargo-ndk
- name: Rust cache
uses: Swatinem/rust-cache@v2
- name: Build JNI library
run: make jni
- name: Build APK
run: make apk
- name: Rename APK with version
run: |
mkdir -p packages
cp crates/notedeck_chrome/android/app/build/outputs/apk/debug/app-debug.apk packages/notedeck-${{ github.ref_name }}-arm64.apk
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: android-apk
path: packages/notedeck-*.apk

build-linux:
name: Build Linux Packages
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
arch: [x86_64, aarch64]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libspeechd-dev libxkbcommon-dev libssl-dev
if [ "${{ matrix.arch }}" != "$(uname -m)" ]; then
sudo apt-get install -y gcc-${{ matrix.arch }}-linux-gnu g++-aarch64-linux-gnu
rustup target add ${{ matrix.arch }}-unknown-linux-gnu
fi
cargo install cargo-generate-rpm cargo-deb
- name: Rust cache
uses: Swatinem/rust-cache@v2
- name: Build (Cross)
if: matrix.arch != 'x86_64'
run: cargo build --release --target=${{ matrix.arch }}-unknown-linux-gnu
- name: Build (Native)
if: matrix.arch == 'x86_64'
run: cargo build --release
- name: Build RPM
run: |
if [ "${{ matrix.arch }}" != "x86_64" ]; then
cargo generate-rpm -p crates/notedeck_chrome --target=${{ matrix.arch }}-unknown-linux-gnu
else
cargo generate-rpm -p crates/notedeck_chrome
fi
- name: Build deb
run: |
if [ "${{ matrix.arch }}" != "x86_64" ]; then
cargo deb -p notedeck_chrome --target=${{ matrix.arch }}-unknown-linux-gnu
else
cargo deb -p notedeck_chrome
fi
- name: Collect packages
run: |
mkdir -p packages
if [ "${{ matrix.arch }}" == "x86_64" ]; then
cp target/release/generate-rpm/*.rpm packages/ || true
cp target/release/debian/*.deb packages/ || true
else
cp target/${{ matrix.arch }}-unknown-linux-gnu/generate-rpm/*.rpm packages/ || true
cp target/${{ matrix.arch }}-unknown-linux-gnu/debian/*.deb packages/ || true
fi
- name: Upload packages
uses: actions/upload-artifact@v4
with:
name: linux-${{ matrix.arch }}
path: packages/*

build-macos:
name: Build macOS DMG
runs-on: macos-latest
env:
NOTEDECK_APPLE_RELEASE_CERT_ID: ${{ secrets.NOTEDECK_APPLE_RELEASE_CERT_ID }}
NOTEDECK_RELEASE_APPLE_ID: ${{ secrets.NOTEDECK_RELEASE_APPLE_ID }}
NOTEDECK_APPLE_APP_SPECIFIC_PW: ${{ secrets.NOTEDECK_APPLE_APP_SPECIFIC_PW }}
NOTEDECK_APPLE_TEAM_ID: ${{ secrets.NOTEDECK_APPLE_TEAM_ID }}
strategy:
fail-fast: false
matrix:
arch: [x86_64, aarch64]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install Required Tools
run: |
brew install create-dmg
cargo install cargo-bundle
rustup target add ${{ matrix.arch }}-apple-darwin
- name: Import apple codesign cert
uses: apple-actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Rust cache
uses: Swatinem/rust-cache@v2
- name: Run macOS DMG Build Script
run: ARCH=${{ matrix.arch }} ./scripts/macos_build.sh
- name: Upload DMG
uses: actions/upload-artifact@v4
with:
name: macos-${{ matrix.arch }}
path: packages/*.dmg

build-windows:
name: Build Windows Installer
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [x86_64]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: Swatinem/rust-cache@v2
- name: Install Rust target
run: rustup target add ${{ matrix.arch }}-pc-windows-msvc
- name: Build
run: cargo build --release --target=${{ matrix.arch }}-pc-windows-msvc
- name: Install Inno Setup
run: choco install innosetup --no-progress --yes
- name: Generate Inno Setup Script
shell: pwsh
run: |
$arch = "${{ matrix.arch }}"
$issContent = @"
[Setup]
AppName=Damus Notedeck
AppVersion=${{ github.ref_name }}
DefaultDirName={pf}\Notedeck
DefaultGroupName=Damus Notedeck
OutputDir=..\packages
OutputBaseFilename=notedeck-${{ github.ref_name }}-$arch-installer
Compression=lzma
SolidCompression=yes

[Files]
Source: "..\target\$arch-pc-windows-msvc\release\notedeck.exe"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\Damus Notedeck"; Filename: "{app}\notedeck.exe"

[Run]
Filename: "{app}\notedeck.exe"; Description: "Launch Damus Notedeck"; Flags: nowait postinstall skipifsilent
"@
New-Item -ItemType Directory -Force -Path scripts
Set-Content -Path "scripts/windows-installer.iss" -Value $issContent
- name: Create packages directory
run: New-Item -ItemType Directory -Force -Path packages
- name: Build Installer
run: |
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" "scripts\windows-installer.iss"
- name: Upload Installer
uses: actions/upload-artifact@v4
with:
name: windows-${{ matrix.arch }}
path: packages/*.exe

create-release:
name: Create GitHub Release
runs-on: ubuntu-22.04
needs: [build-android, build-linux, build-macos, build-windows]
if: always() && needs.build-android.result == 'success'
permissions:
contents: write
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Display artifacts
run: find artifacts -type f
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: |
artifacts/**/*.apk
artifacts/**/*.rpm
artifacts/**/*.deb
artifacts/**/*.dmg
artifacts/**/*.exe
generate_release_notes: true
draft: false
prerelease: ${{ contains(github.ref_name, 'alpha') || contains(github.ref_name, 'beta') || contains(github.ref_name, 'rc') }}
31 changes: 31 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,37 @@ jobs:
- name: Run tests
run: make jni-check

android-apk:
name: Android APK
runs-on: ubuntu-22.04
needs: android
if: github.ref_name == 'master' || github.ref_name == 'ci' || startsWith(github.ref, 'refs/tags/')
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Setup Java JDK
uses: actions/setup-java@v4.5.0
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Add android rust target
run: rustup target add aarch64-linux-android
- name: Install Cargo NDK
run: cargo install cargo-ndk
- name: Rust cache
uses: Swatinem/rust-cache@v2
- name: Build JNI library
run: make jni
- name: Build APK
run: make apk
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: notedeck-arm64.apk
path: crates/notedeck_chrome/android/app/build/outputs/apk/debug/app-debug.apk

linux-test:
name: Test (Linux)
uses: ./.github/workflows/build-and-test.yml
Expand Down
Loading