Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
121bd63
feat(viewer): add interactive click handling with Python bridge integ…
spomichter Mar 1, 2026
f11ea58
feat(viewer): add Python bridge for receiving click events
spomichter Mar 1, 2026
ea403b0
feat(viewer): add invisible ground plane for click-anywhere support
spomichter Mar 1, 2026
f6c61b8
feat(viewer): replace TCP bridge with LCM publisher for click events
spomichter Mar 1, 2026
8ecaacc
refactor: remove dead TCP bridge code, clean up for LCM-only transport
spomichter Mar 3, 2026
9a5e143
Merge pull request #3 from dimensionalOS/chore/cleanup-tcp-from-lcm
spomichter Mar 3, 2026
86b206b
Merge pull request #2 from dimensionalOS/feat/lcm-click-transport
spomichter Mar 3, 2026
5d73025
feat(packaging): PyPI distribution for dimos-viewer via maturin
spomichter Mar 4, 2026
4e9b336
fix: manylinux_2_28 Docker container + trusted publisher for CI
spomichter Mar 4, 2026
7ca512f
fix: upgrade pip in manylinux container, setup-python on macOS
spomichter Mar 4, 2026
4360843
fix: use Rerun's ci_docker image for Linux wheel builds
spomichter Mar 4, 2026
af6c84c
fix: use public manylinux_2_28 image with Rerun's exact deps inline
spomichter Mar 4, 2026
f8d33a5
fix(ci): use manylinux Python 3.10 instead of system Python 3.6
spomichter Mar 4, 2026
d95f920
fix(ci): remove -i flag from maturin build for universal py3-none wheel
spomichter Mar 4, 2026
7e8b4fe
fix(ci): add Python 3.10 to PATH in manylinux, simplify test job
spomichter Mar 4, 2026
2416164
fix(ci): add Python 3.10 to PATH in manylinux, test with Python 3.12
spomichter Mar 4, 2026
0bd9826
fix(ci): test wheel with Python 3.10 to match build interpreter
spomichter Mar 4, 2026
53a36b8
feat: add Rerun-compatible CLI args for seamless spawn integration (#6)
spomichter Mar 4, 2026
2757b93
refactor: move dimos-viewer to dedicated dimos/ directory (#7)
spomichter Mar 4, 2026
edd8c08
fix: add missing README.md to dimos/ directory
spomichter Mar 4, 2026
5436dce
fix: replace invalid PyPI classifier
spomichter Mar 4, 2026
c6a4230
fix: produce universal py3-none wheel (v0.30.0a2)
spomichter Mar 4, 2026
d17906f
fix(ci): build with Python 3.12, remove unused dimos_viewer package
spomichter Mar 4, 2026
fb34f65
fix(ci): remove deleted Python wrapper tests, simplify verify step
spomichter Mar 4, 2026
cb207e1
fix(ci): build wheel matrix for Python 3.10, 3.11, 3.12
spomichter Mar 4, 2026
707880e
feat: implement WASD keyboard controls for dimos-viewer (DIM-660) (#9)
spomichter Mar 5, 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
313 changes: 313 additions & 0 deletions .github/workflows/build-viewer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
# Build & publish dimos-viewer wheels.
#
# Closely follows Rerun's reusable_build_and_upload_wheels.yml pattern:
# - manylinux_2_28 Docker container for Linux builds
# - Same system deps as Rerun's ci_docker Dockerfile
# - Same Rust toolchain (from rust-toolchain file)
# - Same shell defaults and env conventions
# - GitHub Artifacts instead of GCS for wheel storage
# - Trusted publisher (OIDC) for PyPI instead of API token
#
# Triggers:
# PR → main build + test
# push → main build + test
# tag v* build + test + publish to PyPI + GitHub Release

name: Build & Publish dimos-viewer

on:
push:
branches: [main]
tags: ['v*']
pull_request:
branches: [main]
workflow_dispatch:

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

permissions:
contents: write
id-token: write

defaults:
run:
shell: bash --noprofile --norc -euo pipefail {0}

env:
PYTHON_VERSION: "3.10"
PACKAGE_DIR: dimos

# ---------------------------------------------------------------------------
jobs:

# -------------------------------------------------------------------
# 1. Rust checks & tests (native Ubuntu, no container needed)
# -------------------------------------------------------------------
check:
name: Cargo check & test
runs-on: ubuntu-22.04
timeout-minutes: 60
steps:
- uses: actions/checkout@v4

- name: Install Rust
run: |
rustup install
rustup show active-toolchain

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev libxcb-render0-dev libxcb-shape0-dev \
libxcb-xfixes0-dev libxkbcommon-dev libvulkan-dev \
mesa-vulkan-drivers libxkbcommon-x11-0

- uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-check-${{ hashFiles('**/Cargo.lock') }}

- run: cargo check -p dimos-viewer
- run: cargo test -p dimos-viewer

# -------------------------------------------------------------------
# 2. Build wheels per platform
# Linux: manylinux_2_28 container with Rerun's exact deps
# macOS: native runner
# -------------------------------------------------------------------
build-wheel:
name: Build wheel (${{ matrix.platform }}-py${{ matrix.python-version }})
needs: [check]
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- platform: linux-x64
python-version: "3.10"
python-tag: cp310-cp310
os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
container: quay.io/pypa/manylinux_2_28_x86_64
compatibility: manylinux_2_28
- platform: linux-x64
python-version: "3.11"
python-tag: cp311-cp311
os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
container: quay.io/pypa/manylinux_2_28_x86_64
compatibility: manylinux_2_28
- platform: linux-x64
python-version: "3.12"
python-tag: cp312-cp312
os: ubuntu-22.04
target: x86_64-unknown-linux-gnu
container: quay.io/pypa/manylinux_2_28_x86_64
compatibility: manylinux_2_28
- platform: macos-arm64
python-version: "3.10"
python-tag: cp310-cp310
os: macos-14
target: aarch64-apple-darwin
container: ""
compatibility: ""
- platform: macos-arm64
python-version: "3.11"
python-tag: cp311-cp311
os: macos-14
target: aarch64-apple-darwin
container: ""
compatibility: ""
- platform: macos-arm64
python-version: "3.12"
python-tag: cp312-cp312
os: macos-14
target: aarch64-apple-darwin
container: ""
compatibility: ""

runs-on: ${{ matrix.os }}
container: ${{ matrix.container || null }}

steps:
- uses: actions/checkout@v4

# --- Linux (inside manylinux_2_28 container) ---
# Replicates Rerun's ci_docker/Dockerfile setup inline
- name: Install system dependencies (manylinux)
if: matrix.container != ''
run: |
dnf install -y \
make automake gcc gcc-c++ kernel-devel \
cmake \
curl \
git \
atk at-spi2-atk \
fontconfig-devel \
freetype-devel \
glib2-devel \
gtk3-devel \
openssl-devel \
xcb-util-renderutil-devel \
xcb-util-devel \
xcb-util-wm-devel \
libxkbcommon-devel \
python3-pip
dnf clean all

- name: Install Rust (manylinux)
if: matrix.container != ''
env:
RUSTUP_HOME: /usr/local/rustup
CARGO_HOME: /usr/local/cargo
run: |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "/usr/local/cargo/bin" >> "$GITHUB_PATH"

- name: Set up Rust toolchain (manylinux)
if: matrix.container != ''
run: |
rustup install
rustup show active-toolchain

- name: Install maturin (manylinux)
if: matrix.container != ''
run: |
/opt/python/${{ matrix.python-tag }}/bin/python3 -m pip install --upgrade pip
/opt/python/${{ matrix.python-tag }}/bin/python3 -m pip install maturin>=1.8.1
echo "/opt/python/${{ matrix.python-tag }}/bin" >> "$GITHUB_PATH"

- name: Build wheel (manylinux)
if: matrix.container != ''
run: |
maturin build \
--release \
--manifest-path "${{ env.PACKAGE_DIR }}/Cargo.toml" \
--target "${{ matrix.target }}" \
--compatibility "${{ matrix.compatibility }}" \
--out dist/

# --- macOS (native runner) ---
- name: Install Rust (macOS)
if: matrix.container == ''
run: |
rustup install
rustup show active-toolchain

- name: Set up Python (macOS)
if: matrix.container == ''
uses: actions/setup-python@v5
with:
python-version: "${{ matrix.python-version }}"

- name: Install maturin (macOS)
if: matrix.container == ''
run: |
python3 -m pip install maturin>=1.8.1

- name: Build wheel (macOS)
if: matrix.container == ''
run: |
maturin build \
--release \
--manifest-path "${{ env.PACKAGE_DIR }}/Cargo.toml" \
--target "${{ matrix.target }}" \
--out dist/

# --- Common ---
- name: Upload wheel artifact
uses: actions/upload-artifact@v4
with:
name: wheel-${{ matrix.platform }}-py${{ matrix.python-version }}
path: dist/*.whl

# -------------------------------------------------------------------
# 3. Test installed wheels
# -------------------------------------------------------------------
test-wheel:
name: Test wheel (py${{ matrix.python-version }})
needs: [build-wheel]
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12"]

steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "${{ matrix.python-version }}"

- name: Download linux-x64 wheel
uses: actions/download-artifact@v4
with:
name: wheel-linux-x64-py${{ matrix.python-version }}
path: dist/

- name: Install wheel
run: pip install dist/*.whl

- name: Verify binary
run: |
which dimos-viewer
dimos-viewer --help

# -------------------------------------------------------------------
# 4. Publish to PyPI (tag v* only)
# Uses trusted publisher (OIDC) — no API token needed.
# -------------------------------------------------------------------
publish-pypi:
name: Publish to PyPI
needs: [test-wheel]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-22.04
permissions:
id-token: write

steps:
- name: Download all wheels
uses: actions/download-artifact@v4
with:
pattern: wheel-*
merge-multiple: true
path: dist/

- run: ls -la dist/

- name: Publish to PyPI (trusted publisher)
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist/
skip-existing: true

# -------------------------------------------------------------------
# 5. GitHub Release (tag v* only)
# -------------------------------------------------------------------
github-release:
name: GitHub Release
needs: [publish-pypi]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-22.04

steps:
- name: Download all wheels
uses: actions/download-artifact@v4
with:
pattern: wheel-*
merge-multiple: true
path: dist/

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/*.whl
generate_release_notes: true
13 changes: 13 additions & 0 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3108,6 +3108,19 @@ dependencies = [
"subtle",
]

[[package]]
name = "dimos-viewer"
version = "0.30.0-alpha.1+dev"
dependencies = [
"bincode",
"clap",
"mimalloc",
"parking_lot",
"rerun",
"serde",
"tokio",
]

[[package]]
name = "directories"
version = "6.0.0"
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ members = [
"crates/utils/*",
"crates/viewer/*",
"docs/snippets",
"dimos",
"examples/rust/*",
"rerun_py",
"run_wasm",
Expand Down
42 changes: 42 additions & 0 deletions dimos/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[package]
name = "dimos-viewer"
version = "0.30.0-alpha.1+dev"
edition = "2024"
rust-version = "1.92"
license = "MIT OR Apache-2.0"
publish = false
description = "DimOS Interactive Viewer — custom Rerun viewer with LCM click-to-navigate"

[[bin]]
name = "dimos-viewer"
path = "src/viewer.rs"

[lib]
name = "dimos_viewer"
path = "src/lib.rs"

[features]
default = []
analytics = ["rerun/analytics"]

[dependencies]
rerun = { path = "../crates/top/rerun", default-features = false, features = [
"native_viewer",
"run",
"server",
] }

clap = { workspace = true, features = ["derive"] }
bincode.workspace = true
mimalloc.workspace = true
parking_lot.workspace = true
serde = { workspace = true, features = ["derive"] }
tokio = { workspace = true, features = [
"io-util",
"macros",
"net",
"rt-multi-thread",
"signal",
"sync",
"time",
] }
Loading
Loading