Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
95d13c5
Merged main with the location changes
mrosseel Mar 17, 2025
c872394
no ubx yet
mrosseel Mar 19, 2025
51f14f4
Merge branch 'main' of github.com:brickbots/PiFinder
mrosseel Mar 25, 2025
0ec4de8
Revert "no ubx yet"
mrosseel Mar 25, 2025
bbcad5c
Merge remote-tracking branch 'origin/main'
mrosseel Mar 27, 2025
fd44825
ZMerge branch 'main' of github.com:mrosseel/PiFinder
mrosseel Apr 5, 2025
64f8401
Merge remote-tracking branch 'origin/main'
mrosseel Apr 6, 2025
b46636f
Merge remote-tracking branch 'origin/main'
mrosseel Apr 6, 2025
77f79bd
Merge remote-tracking branch 'origin/main'
mrosseel Apr 6, 2025
30fa0dc
Merge branch 'main' of github.com:brickbots/PiFinder
mrosseel Jun 17, 2025
0a71bb5
Merge remote-tracking branch 'upstream'
mrosseel Jul 10, 2025
f4738fe
Merge remote-tracking branch 'upstream/main'
mrosseel Jul 28, 2025
9c508bc
Merge remote-tracking branch 'upstream/main'
mrosseel Sep 22, 2025
8da0875
Merge remote-tracking branch 'upstream/main'
mrosseel Nov 10, 2025
7f818bc
Merge branch 'main' of github.com:brickbots/PiFinder
mrosseel Nov 15, 2025
ee454f5
Merge remote-tracking branch 'upstream/main'
mrosseel Nov 16, 2025
08329cf
NixOS CI/CD: Single build + multi-channel releases (#2)
mrosseel Feb 4, 2026
5796dba
NixOS: Add CI/CD workflows and build configuration (#3)
mrosseel Feb 4, 2026
d69191a
fix: add filesystem stub for CI closure builds
mrosseel Feb 4, 2026
ad591d3
fix: add pifinder.devMode option declaration
mrosseel Feb 4, 2026
d033d1d
fix: wrap services.nix config in explicit config block
mrosseel Feb 4, 2026
16b8e55
fix: add package hashes to python-env.nix
mrosseel Feb 4, 2026
5d5b0a1
feat: support self-hosted ARM64 runner for faster builds
mrosseel Feb 4, 2026
bd2e4a3
fix: add device tree filter and fix PWM overlay syntax
mrosseel Feb 4, 2026
b16fa8c
release: v2.5.0-beta
github-actions[bot] Feb 5, 2026
a122d24
Merge remote-tracking branch 'upstream/main'
mrosseel Mar 3, 2026
7543873
fix: resolve lint and mypy errors in sys_utils_nixos.py
mrosseel Mar 17, 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
102 changes: 102 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: Build PiFinder NixOS

on:
push:
branches: [main]
pull_request:
types: [labeled, synchronize, opened]
workflow_dispatch:

jobs:
build:
if: |
github.event_name == 'push' ||
github.event_name == 'workflow_dispatch' ||
contains(github.event.pull_request.labels.*.name, 'preview')
# Prefer self-hosted aarch64 runner (Pi5), fallback to ubuntu with QEMU
runs-on: ${{ vars.RUNNER_LABELS || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v4

- name: Install Nix (self-hosted)
if: runner.arch == 'ARM64'
run: |
if ! command -v nix &> /dev/null; then
curl -L https://nixos.org/nix/install | sh -s -- --daemon
fi

- uses: cachix/install-nix-action@v27
if: runner.arch != 'ARM64'
with:
extra_nix_config: |
extra-platforms = aarch64-linux
extra-system-features = big-parallel

- uses: cachix/cachix-action@v15
with:
name: pifinder
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'

- name: Register QEMU binfmt for aarch64
if: runner.arch != 'ARM64'
run: sudo apt-get update && sudo apt-get install -y qemu-user-static

- name: Build NixOS system closure
run: |
# Native build on aarch64, cross-compile via QEMU on x86_64
SYSTEM_FLAG=""
if [[ "$(uname -m)" != "aarch64" ]]; then
SYSTEM_FLAG="--system aarch64-linux"
fi
nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \
$SYSTEM_FLAG \
-L --no-link

- name: Push to Cachix
if: github.event_name != 'pull_request'
run: |
SYSTEM_FLAG=""
if [[ "$(uname -m)" != "aarch64" ]]; then
SYSTEM_FLAG="--system aarch64-linux"
fi
nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \
$SYSTEM_FLAG \
--json | jq -r '.[].outputs.out' | cachix push pifinder

update-unstable:
needs: build
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}

- name: Update unstable channel
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DATE=$(date -I)

# Update main entry
jq --arg d "$DATE" \
'.channels.unstable.versions = [{version:"main", ref:"main", date:$d, notes:"Latest development"}]' \
versions.json > tmp.json && mv tmp.json versions.json

# Add all preview-labeled PRs (no limit)
gh pr list --label preview --json number,title,headRefOid | \
jq --arg d "$DATE" '.[] | {version:("PR #" + (.number|tostring)), ref:.headRefOid, date:$d, notes:.title}' | \
jq -s '.' > prs.json

jq --slurpfile prs prs.json '.channels.unstable.versions += $prs[0]' \
versions.json > tmp.json && mv tmp.json versions.json

rm prs.json

- name: Commit versions.json
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add versions.json
git diff --staged --quiet || git commit -m "chore: update unstable"
git push
104 changes: 104 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: Release

on:
workflow_dispatch:
inputs:
version:
description: 'Version (e.g., 2.5.0)'
required: true
notes:
description: 'Release notes'
required: true
type:
description: 'Release type'
type: choice
options:
- stable
- beta
default: stable
source_branch:
description: 'Source branch (default: main, use release/X.Y for hotfixes)'
required: false
default: 'main'

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.source_branch }}
token: ${{ secrets.GITHUB_TOKEN }}

- name: Create tag
run: |
TAG="v${{ inputs.version }}"
[[ "${{ inputs.type }}" == "beta" ]] && TAG="${TAG}-beta"
git tag "$TAG"
git push origin "$TAG"
echo "TAG=$TAG" >> $GITHUB_ENV

- uses: cachix/install-nix-action@v27
with:
extra_nix_config: |
extra-platforms = aarch64-linux
extra-system-features = big-parallel

- uses: cachix/cachix-action@v15
with:
name: pifinder
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'

- name: Register QEMU binfmt for aarch64
run: sudo apt-get update && sudo apt-get install -y qemu-user-static

- name: Build and push closure to Cachix
run: |
nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \
--system aarch64-linux -L
nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \
--system aarch64-linux --json | jq -r '.[].outputs.out' | cachix push pifinder

- name: Build SD image
run: |
nix build .#images.pifinder \
--system aarch64-linux \
-L -o result

- name: Update versions.json on main
run: |
# versions.json always lives on main, even for hotfix releases
git fetch origin main
git checkout main

DATE=$(date -I)
CHANNEL="${{ inputs.type }}"
VERSION="${{ inputs.version }}"
NOTES="${{ inputs.notes }}"
REF="$TAG"

jq --arg v "$VERSION" --arg r "$REF" --arg d "$DATE" --arg n "$NOTES" --arg c "$CHANNEL" \
'.channels[$c].versions = ([{version:$v, ref:$r, date:$d, notes:$n}] + .channels[$c].versions)[:3]' \
versions.json > tmp.json && mv tmp.json versions.json

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add versions.json
git commit -m "release: $TAG"
git push origin main

- name: Upload SD image artifact
uses: actions/upload-artifact@v4
with:
name: pifinder-sd-image
path: result/sd-image/*.img.zst
retention-days: 90

- name: Create GitHub Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ env.TAG }}
name: PiFinder ${{ env.TAG }}
body: ${{ inputs.notes }}
prerelease: ${{ inputs.type == 'beta' }}
files: result/sd-image/*.img.zst
73 changes: 50 additions & 23 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,65 @@
# PiFinder v2.5.0 Release Notes
# PiFinder v2.4.0 Release Notes

## New Features
## Major New Features

### T9 Input Support
Added T9-style text input for searching object catalogs using the hardware keypad. Type object names by pressing number keys to quickly filter catalog searches, just like texting on an old phone. Includes cached digit mapping for fast performance.
### Sky Quality Meter (SQM) - Experimental
A new Sky Quality Meter feature measures sky brightness and displays the corresponding Bortle scale classification. This helps observers assess observing conditions at their location.
- Real-time SQM measurement with Bortle class display
- Calibration UI for accurate readings across different camera configurations
- Camera profiles for IMX296 and other supported sensors
- Rotating constellation/SQM display in title bar

### Harris Globular Cluster Catalog
New catalog loader for the Harris Globular Cluster catalog, adding 147 globular clusters to the searchable database.
### Camera Auto Exposure
Automatic exposure control using a PID-based algorithm that adapts to changing sky conditions.
- Asymmetric tuning for responsive exposure adjustments
- Exposure sweep functionality for calibration
- SNR-based thresholds derived from camera profiles
- Visual exposure overlay in preview mode

### Stellarium+ Mobile Support
Added support for connecting to Stellarium+ Mobile, including the ACK command needed for reliable connections without timeouts.
### Cedar-Detect System Service
Cedar-Detect now runs as a dedicated system service rather than a subprocess, improving stability and resource management. This change is transparent to users but provides better crash recovery and memory handling.

### Chinese (zh) Locale
Full Chinese language translation with a custom Sarasa Mono font for proper CJK character rendering. Chinese can be selected from the language settings menu.
## Improvements

## Bug Fixes
### GPS
- **Configurable baud rate**: GPS baud rate can now be configured via the Advanced settings menu (#345)
- **Reorganized GPS settings**: GPS options now grouped under Settings > Advanced > GPS Settings
- **GPSD improvements**: Fixed lock_type handling for GPSD-based GPS messages (#358)
- **Early dongle fix**: Fixed issue where some GPS dongles never reported sky data (#373)

### Catalogs
- **WDS catalog**: Improved loading speed with background loading for better UI responsiveness (#352, #355)
- **Async search**: Search is now asynchronous for improved responsiveness
- **Comet catalog**: Better refresh and download handling with non-blocking updates (#353)
- **Bright stars**: Fixed off-by-one error in bright stars catalog

- **GPSD + Cedar crash fix**: Fixed an issue where early GPS dongles that never reported sky data could stall the GPS process. Also fixed auth-related solver crashes with Cedar.
- **Stellarium J2000 epoch fix**: Corrected coordinate epoch handling when connected to Stellarium, which uses J2000 rather than JNOW.
- **Double update bug**: Fixed an issue in the update script that could cause updates to run twice.
- **Eyepiece sorting**: Eyepieces are now always sorted by focal length (magnification) in the equipment list.
- **Push-to display fix**: Fixed a display issue in the push-to screen introduced by the Chinese locale update.
### User Interface
- **EQ mode**: Push-to now uses +/- buttons rather than arrows for clearer directional guidance
- **Settings reorganization**: Advanced settings (PiFinder Type, Camera Type, GPS Settings) now grouped under an "Advanced" submenu
- **Preview cleanup**: Removed background subtraction and gamma functions from preview
- **Experimental menu**: Moved higher in menu structure for easier access

## Developer Improvements
## Bug Fixes

- **Fake sys_utils environment toggle**: Added `PIFINDER_USE_FAKE_SYS_UTILS` environment variable for deterministic local development and testing without hardware dependencies.
- **Solver log level**: Reduced solver log verbosity for cleaner output.
- Fixed preview crash when marking menu items are missing
- Fixed crash when screenshot title contains a slash
- Fixed OSX logging levels by applying log config in each subprocess
- Fixed various solver stability issues with improved error handling
- Fixed typo in SkySafari documentation
- Fixed typo in menu

## Hardware & Documentation

- Added a `pi_mount_noinserts.stl` variant for cases without heat-set inserts.
- Removed references to the discontinued HQ camera and assembled kit version.
- Various typo and spelling fixes throughout the documentation.
- Adjusted GPS antenna holder sizing
- Improved case tolerances and new dovetail design
- Updated shroud with tighter tolerance
- Added instructions to build guide for testing LEDs and buttons
- Clarified DIY vs Assembled parts in case documentation

## Migration Notes

This release includes a migration script (`migration_source/v2.4.0.sh`) that sets up the Cedar-Detect system service. The migration will run automatically during the update process.

---

**Full Changelog**: 19 commits from release to main
**Full Changelog**: 40 commits from release to main
Binary file modified case/v3/common/pi_mount.stl
Binary file not shown.
6 changes: 3 additions & 3 deletions docs/source/BOM.rst
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ These are the bigger items/assemblies which you'll need to purchase to include i
- Other lenses might work here, but something fast with a 10deg FOV is ideal

You can use either the imx296 or imx462 module from innomaker. They both
perform about the same so choose the least expensive/easiest to get model
perform about the same so choose the least expesive/easiest to get model
in your particular location.

Case hardware
Expand Down Expand Up @@ -132,6 +132,6 @@ In addition to the 3d printed parts detailed in the :doc:`Build Guide<build_guid
Power
-----

The PiFinder takes about .9amp at 5v under full load, and about 60% of this when in power-save/idle mode. For battery sizing a good rule of thumb would be 1.25 hour of run time per 1000mah of battery capacity. You can use any battery pack that will produce at least 1.5 amp of power and plug this into the USB-C port on the unit.
The PiFinder takes about .9amp at 5v under full load, and about 60% of this when in power-save/idle mode. For battery sizing a good rule of thumb would be 1.25 hour of run time per 1000mah of battery capacity. You can use any batter pack that will produce at least 1.5 amp of power and plug this into the USB-C port on the unit.

If you'd like to have a fully stand-alone unit with integrated rechargeable battery, there are instructions in the build guide for integrating a `PiSugar S plus <https://github.com/PiSugar/PiSugar/wiki/PiSugarS-Plus>`_. This is the lower-cost version without RTC, but it has a 5000mah battery which should provide about 5 hours of run time.
If you'd like to have a fully stand-alone unit with integrated rechargeable battery, there are instructing in the build guide for integrating a `PiSugar S plus <https://github.com/PiSugar/PiSugar/wiki/PiSugarS-Plus>`_. This is the lower-cost version without RTC, but it has a 5000mah battery which should provide about 5 hours of run time.
Loading
Loading