Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
532ac72
Add design spec: pointcloud kernel + UI rebrand (v0.4.0)
DutchSailor May 22, 2026
6c1bacd
Add implementation plan: UI rebrand to @openaec/ui (Plan 1 of 5)
DutchSailor May 22, 2026
83d7acf
chore: ignore PROMPTS.md
DutchSailor May 22, 2026
84253e9
ui: install @openaec/ui and wire tokens + components CSS
DutchSailor May 22, 2026
293296b
ui: replace --theme-* with @openaec/ui --oaec-* tokens in globals.css
DutchSailor May 22, 2026
068fda0
ui: rename --theme-* to --oaec-* in Ribbon.css
DutchSailor May 22, 2026
cb12ab7
ui: rename --theme-* to --oaec-* in SettingsDialog.css
DutchSailor May 22, 2026
af6226c
ui: remove multi-theme switcher — single OpenAEC theme via index.html
DutchSailor May 22, 2026
074a6a0
ui: Tauri bg + rename dropdown classes + drop dead theme CSS
DutchSailor May 22, 2026
3d746f7
docs: update README features for single OpenAEC theme
DutchSailor May 22, 2026
8337795
ui: drop dead input CSS + align ErrorBoundary palette to OpenAEC
DutchSailor May 22, 2026
3787dd6
Merge feat/ui-rebrand-openaec: full adoption of @openaec/ui design sy…
DutchSailor May 22, 2026
8af8e0a
ui: add File tab + align colors to OpenAEC style-book
DutchSailor May 22, 2026
4d5ab17
ui: add AppMenu backstage view (File tab opens overlay with Open/Impo…
DutchSailor May 22, 2026
e085acd
Add editable straight CAD lines to plan and section drawings
boazeggs Oct 7, 2026
afd78b8
Show straight CAD contours in section preview
boazeggs Oct 7, 2026
19e01c1
Open E57 photos in reusable native view tabs
boazeggs Oct 8, 2026
c6b9202
docs: add Dutch user manual
boazeggs Oct 13, 2026
7a79b9b
Sign the installers for updates through the OpenAEC Installer
Nino3BM Oct 29, 2026
0cb7f5d
docs: research point-cloud competitors and propose priorities
boazeggs Nov 2, 2026
9e9500e
Merge remote-tracking branch 'upstream/main' into docs/competitor-res…
boazeggs Nov 4, 2026
36578cf
docs: expand weekly competitor research and issue deduplication brief
boazeggs Nov 4, 2026
1c598fc
Merge pending updater signing changes for integration checks
boazeggs Nov 5, 2026
61353ff
Merge remote-tracking branch 'upstream/pr-46' into codex/resolve-open…
boazeggs Nov 5, 2026
a6eabd6
Merge CAD line PR while retaining integrated native implementation
boazeggs Nov 5, 2026
645fdfa
Merge original photo tabs PR retaining current comparison and photo e…
boazeggs Nov 5, 2026
7d678c8
Merge Dutch manual PR retaining maintained wiki and manual entry point
boazeggs Nov 5, 2026
45d0e1f
Merge Classic UI rebrand into archived tree and retain current native…
boazeggs Nov 5, 2026
d6a646f
Synchronize every product version and give Classic MSI a valid version
boazeggs Nov 5, 2026
a06163a
Record measured indoor TLS and SLAM registration with independent exp…
boazeggs Nov 5, 2026
33d3927
Require every platform signing proof before release publication
boazeggs Nov 5, 2026
5fdd5bf
Add private feedback form and bottom-right MCP access control
boazeggs Nov 5, 2026
0dd7273
Add managed native SuperCloud defaults and desktop MCP HTTP transport
boazeggs Nov 5, 2026
1be2fac
Record the published 2026.45.1 platform verification evidence
boazeggs Nov 5, 2026
0bb1f44
Use the verified release number for the SDK matrix
boazeggs Nov 5, 2026
5f5292d
Preserve raw E57 fields when applying photo colours
boazeggs Nov 5, 2026
e6223cb
Initialize UI test fixtures directly for Clippy
boazeggs Nov 5, 2026
24627d7
Record independent BLK2GO and Riegl photo export validation
boazeggs Nov 5, 2026
b777cb7
Record the final managed Wayland probe with GUI readiness checks
boazeggs Nov 5, 2026
95e3c35
Verify E57 field precision through independent prototype comparison
boazeggs Nov 5, 2026
5e9247f
Bake calibrated photographs onto mesh atlases with visibility and bou…
boazeggs Nov 5, 2026
5cb749e
Preview baked photo atlases in the native viewport and expose source …
boazeggs Nov 5, 2026
c45cc4e
Separate historical clean-machine plans from verified release evidence
boazeggs Nov 5, 2026
14f8161
Record native and independent viewer proof and align texture API expe…
boazeggs Nov 5, 2026
9fedcc8
Keep overlapping photo working sets within a byte budget and validate…
boazeggs Nov 5, 2026
d07b00b
Validate photo atlas export and cancellation on 199 million measured …
boazeggs Nov 5, 2026
f092549
Keep calibrated station panoramas in independent photo tabs and prese…
boazeggs Nov 6, 2026
b15a394
Merge synchronized release versions into pending integration
boazeggs Nov 6, 2026
71264b6
Merge real indoor registration validation into pending integration
boazeggs Nov 6, 2026
44d3437
Merge release signing gate while retaining OpenAEC Installer update s…
boazeggs Nov 6, 2026
cde5c0d
Record real BLK2GO GUI evidence for independent station photo tabs
boazeggs Nov 6, 2026
60353c3
Merge private feedback and MCP status controls into pending integration
boazeggs Nov 6, 2026
9897913
Merge managed sessions while preserving feedback, MCP access control …
boazeggs Nov 6, 2026
a3c11a2
Merge lossless coloured E57 export into pending integration
boazeggs Nov 6, 2026
5c75efd
Merge photo texture preview while retaining managed sessions and feed…
boazeggs Nov 6, 2026
04c2cc1
Merge station photo tabs and retain cumulative API revision 15
boazeggs Nov 6, 2026
dd2ffd3
Correct the headless station-tab validation wrapper reference
boazeggs Nov 6, 2026
1c8648e
Keep managed GUI health independent of paused MCP access
boazeggs Nov 6, 2026
51d5ed9
Merge corrected station-tab headless validation documentation
boazeggs Nov 6, 2026
e568b4e
Exercise managed GUI health with external MCP deliberately paused
boazeggs Nov 6, 2026
15287a5
Model document ownership, pane splits and recoverable window layouts
boazeggs Nov 6, 2026
6685901
Give pane layouts canonical document keys for all tab kinds
boazeggs Nov 6, 2026
bc1c946
Store bounded pane layouts and cameras with ordered atomic publication
boazeggs Nov 6, 2026
f196cc6
Give every viewport independent GPU camera and upload storage
boazeggs Nov 6, 2026
2fbca16
Prepare shared drawing scenes and explicit multiwindow application li…
boazeggs Nov 6, 2026
d41a107
Own photo workers and camera snapshots per document
boazeggs Nov 6, 2026
ff426f5
Render document panes and native satellite windows with owned input a…
boazeggs Nov 6, 2026
57c09e5
Persist native pane layouts and restore source-backed document looks
boazeggs Nov 6, 2026
87fa30b
Preserve tiled drawing annotations and first-strip document drags
boazeggs Nov 6, 2026
2c89fda
Render tiled sheets with independent paper cameras and shared contents
boazeggs Nov 6, 2026
2a6bab1
Resolve native tab drops across windows and Wayland outputs
boazeggs Nov 6, 2026
7bf2397
Link photo and scene panes without changing the scene camera
boazeggs Nov 6, 2026
5423c28
Clarify link inheritance when a tab splits another pane
boazeggs Nov 6, 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
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Test product version synchronization
run: python3 native/packaging/test-classic-version.py
- name: Check the version
run: bash native/packaging/set-version.sh check
- name: Test the release signing gate
run: python3 native/packaging/test-require-signatures.py

native:
strategy:
Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/classic-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Classic package metadata

on:
pull_request:
paths:
- 'classic/**'
- 'native/packaging/*version*'
- '.github/workflows/classic-check.yml'
workflow_dispatch:

jobs:
windows:
runs-on: windows-latest
defaults:
run:
working-directory: classic
env:
# The pinned public UI dependency must not need an SSH account.
GIT_CONFIG_COUNT: '1'
GIT_CONFIG_KEY_0: url.https://github.com/.insteadOf
GIT_CONFIG_VALUE_0: ssh://git@github.com/
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: classic/package-lock.json
- uses: dtolnay/rust-toolchain@stable
- name: Install locked frontend dependencies
run: npm ci
- name: Check all product version fields
working-directory: .
run: bash native/packaging/set-version.sh check
- name: Build Windows MSI and NSIS without publishing
run: npm exec tauri build -- --bundles msi,nsis
8 changes: 7 additions & 1 deletion .github/workflows/packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ jobs:
sudo apt-get update
# The MIME database first, so that installing the package triggers it.
sudo apt-get install -y shared-mime-info libglib2.0-bin desktop-file-utils appstream \
xvfb mesa-vulkan-drivers libegl1 libgl1-mesa-dri fuse3 python3-venv
xvfb mesa-vulkan-drivers libegl1 libgl1-mesa-dri fuse3 python3-venv labwc
- name: Install the .deb
run: sudo apt-get install -y "./packages/open-pointcloud-studio_${NUMBER}_${ARCH}.deb"
- name: Smoke-test the installed application
Expand Down Expand Up @@ -791,6 +791,12 @@ jobs:
xvfb-run -a -s '-screen 0 1440x900x24' python3 native/packaging/gui-smoke.py \
"packages/open-pointcloud-studio_${NUMBER}_${ARCH}.AppImage" --version "$NUMBER" \
--screenshot "screenshots/appimage-$ARCH.png"
- name: Managed native app on Wayland without a GPU or FUSE
run: |
bash native/packaging/managed-wayland-smoke.sh \
"$RUNNER_TEMP/appimage/squashfs-root/AppRun" "screenshots/managed-$ARCH"
bash native/packaging/managed-wayland-smoke.sh \
"$RUNNER_TEMP/appimage/squashfs-root/AppRun" "screenshots/managed-paused-$ARCH" --paused-access
- name: Start the archive binary
run: |
tar -xzf "packages/open-pointcloud-studio_${NUMBER}_linux-${ARCH}.tar.gz"
Expand Down
102 changes: 67 additions & 35 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ jobs:
packages: write
outputs:
gpg_signed: ${{ steps.gpg.outputs.gpg_signed }}
updater_signed: ${{ steps.updater.outputs.updater_signed }}
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ needs.prepare.outputs.tag }}
Expand Down Expand Up @@ -227,41 +228,6 @@ jobs:
[[ "$missing" -eq 0 ]]
for sum in *.sha256; do sha256sum -c "$sum"; done
ls -l
# A release whose application is signed never ships a library that is
# not; a draft run only warns, so that it can be looked at.
- name: Check that the libraries are signed as the applications are
env:
WINDOWS_SIGNED: ${{ needs.packages.outputs.windows_signed }}
MACOS_SIGNED: ${{ needs.packages.outputs.macos_signed }}
SDK_WINDOWS_SIGNED: ${{ needs.sdk.outputs.windows_signed }}
SDK_MACOS_SIGNED: ${{ needs.sdk.outputs.macos_signed }}
DRAFT_ONLY: ${{ inputs.draft_only }}
run: |
{
echo "### Signing gate"
echo
echo "| Files | Signed |"
echo "| --- | --- |"
echo "| Windows application and installer | ${WINDOWS_SIGNED:-false} |"
echo "| ops_pointcloud.dll | ${SDK_WINDOWS_SIGNED:-false} |"
echo "| macOS application and disk image | ${MACOS_SIGNED:-false} |"
echo "| libops_pointcloud.dylib | ${SDK_MACOS_SIGNED:-false} |"
} >> "$GITHUB_STEP_SUMMARY"
problems=()
if [[ "$WINDOWS_SIGNED" == true && "$SDK_WINDOWS_SIGNED" != true ]]; then
problems+=("the Windows application is signed, ops_pointcloud.dll is not")
fi
if [[ "$MACOS_SIGNED" == true && "$SDK_MACOS_SIGNED" != true ]]; then
problems+=("the macOS application is signed and notarized, libops_pointcloud.dylib is not")
fi
for problem in "${problems[@]}"; do
if [[ "$DRAFT_ONLY" == true ]]; then
echo "::warning::$problem"
else
echo "::error::$problem"
fi
done
[[ ${#problems[@]} -eq 0 || "$DRAFT_ONLY" == true ]]
- name: Write SHA256SUMS
working-directory: assets
run: |
Expand All @@ -283,6 +249,29 @@ jobs:
else
echo "OpenPGP: not signed; the key of the organisation is not configured." >> "$GITHUB_STEP_SUMMARY"
fi
# The signature the OpenAEC Installer checks before a silent update, on
# the files as they are published: after Authenticode and OpenPGP.
- name: Sign the installers for the OpenAEC Installer
id: updater
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: |
bash native/packaging/sign-updates.sh assets "$NUMBER"
if grep -qxF updater_signed=true "$GITHUB_OUTPUT"; then
echo "Updater: the Windows setup and the AppImages carry a .sig for the OpenAEC Installer." >> "$GITHUB_STEP_SUMMARY"
else
echo "Updater: not signed; the updater key is not configured." >> "$GITHUB_STEP_SUMMARY"
fi
- name: Require signatures before creating or publishing a release
env:
WINDOWS_SIGNED: ${{ needs.packages.outputs.windows_signed }}
MACOS_SIGNED: ${{ needs.packages.outputs.macos_signed }}
SDK_WINDOWS_SIGNED: ${{ needs.sdk.outputs.windows_signed }}
SDK_MACOS_SIGNED: ${{ needs.sdk.outputs.macos_signed }}
LINUX_GPG_SIGNED: ${{ steps.gpg.outputs.gpg_signed }}
DRAFT_ONLY: ${{ inputs.draft_only }}
run: bash native/packaging/require-signatures.sh
# Every Linux package and Linux archive of the C library gets a build
# attestation, signed through Sigstore and kept by GitHub. `gh
# attestation verify FILE --repo OWNER/REPO --signer-workflow
Expand Down Expand Up @@ -323,6 +312,7 @@ jobs:
working-directory: assets
env:
KEEP_SIGNATURES: ${{ steps.gpg.outputs.gpg_signed }}
KEEP_UPDATER_SIGNATURES: ${{ steps.updater.outputs.updater_signed }}
run: |
for name in $(bash ../native/packaging/expected-assets.sh "$NUMBER"); do
gh release upload "$TAG" "$name" "$name.sha256" --clobber --repo "$GITHUB_REPOSITORY"
Expand All @@ -336,6 +326,7 @@ jobs:
- name: Remove the files of an earlier run from the draft
env:
KEEP_SIGNATURES: ${{ steps.gpg.outputs.gpg_signed }}
KEEP_UPDATER_SIGNATURES: ${{ steps.updater.outputs.updater_signed }}
run: bash native/packaging/prune-release-assets.sh "$TAG" "$NUMBER"
- name: Publish the release
if: ${{ !inputs.draft_only }}
Expand Down Expand Up @@ -694,3 +685,44 @@ jobs:
cat "$record" >> "$GITHUB_STEP_SUMMARY"
gh release upload "$TAG" "$record" "$record.sha256" --clobber --repo "$GITHUB_REPOSITORY"
[[ "$RESULT" == success ]]

# The latest.json the OpenAEC Installer reads, made with the release kit of
# the installer once the release is public (OpenAEC-Foundation/OpenAEC-Blueprint#33).
# It checks every .sig against UPDATER_PUBKEY and the tag against the
# version in native/Cargo.toml, and is attached last: until then no
# installer offers the update. A release published by this workflow starts
# no other workflow, so this is a job here and not a workflow of its own.
updater-manifest:
needs: [prepare, publish]
if: ${{ !cancelled() && !inputs.draft_only && needs.publish.result == 'success' && needs.publish.outputs.updater_signed == 'true' }}
runs-on: ubuntu-latest
permissions:
contents: write
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ needs.prepare.outputs.tag }}
steps:
- uses: actions/checkout@v4
- name: Fetch the release kit
uses: actions/checkout@v4
with:
repository: OpenAEC-Foundation/openaec-installer
ref: main
path: .release-kit
sparse-checkout: release-kit
- name: Only a published release
run: |
state=$(gh release view "$TAG" --repo "$GITHUB_REPOSITORY" --json isDraft,isPrerelease --jq '"\(.isDraft) \(.isPrerelease)"')
[ "$state" = "false false" ] || { echo "::error::$TAG is a draft or pre-release; no latest.json"; exit 1; }
- name: Make latest.json (checks every signature)
run: |
gh release download "$TAG" --repo "$GITHUB_REPOSITORY" --dir updates \
--pattern '*_x64-setup.exe' --pattern '*_x64-setup.exe.sig' \
--pattern '*.AppImage' --pattern '*.AppImage.sig'
node .release-kit/release-kit/latest-json.mjs \
--repo "$GITHUB_REPOSITORY" --tag "$TAG" --dir updates \
--pubkey "${{ vars.UPDATER_PUBKEY }}" --version-file native/Cargo.toml \
--notes "See https://github.com/$GITHUB_REPOSITORY/releases/tag/$TAG" \
--out latest.json
- name: Attach latest.json last
run: gh release upload "$TAG" latest.json --repo "$GITHUB_REPOSITORY" --clobber
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ section its version and date.

## Unreleased

- The main-window pane layout, scans and model/photo cameras return after restarting. Detached documents return to the main window.

- Side-by-side model, photo and drawing panes keep their own cameras. Documents can open in separate windows and dock back into the main window; closing the main window closes them together.

- Feedback in the title strip opens a native private Open Feedback Studio form. It sends the entered message and optional reply email with the app version, retains the draft on failure, and attaches no scans, paths, screenshots or logs.
- The MCP server checkbox at the bottom right allows or pauses external MCP/API commands and remembers the choice. Extension runs and jobs already started continue. API revision 13 reports the bridge state as `mcp_enabled`.

## 2026.45.1 - 2026-11-03

- E57 exports now retain station photos, spherical and cylindrical panoramas, masks, camera poses and scan associations after filtering, section export and colouring points from photos. Edits that cannot preserve camera poses fail explicitly instead of silently dropping the images.
Expand Down
Loading
Loading