A Nextcloud External App (ExApp) that provides 3D point cloud viewing using Potree.
- WebGL-based Rendering: Uses Potree's octree LOD structure for large datasets
- Format Support: Converts LAS, LAZ, and E57 files to Potree format on-demand
- Smart Caching: Configurable cache duration (default: 30 days) with automatic cleanup
- Event-Driven Cleanup: Reacts to file deletion events to remove cached point clouds
- Progressive Loading: Loads appropriate detail levels based on camera distance
- Admin Configuration: Declarative settings for cache duration and conversion options
- Nextcloud 28+ (tested on 32)
- AppAPI enabled (included with Nextcloud 30+)
- Docker for ExApp deployment
- Minimum 4GB RAM for large point clouds
- SSD recommended for conversion performance
git clone https://github.com/your-username/nc_potree.git
cd nc_potreecp .env.example .env
# Edit .env with your Nextcloud URL and credentialsmake buildmake register┌─────────────────────────────────────────┐
│ NEXTCLOUD SERVER │
│ ┌────────┐ ┌──────────────────┐ │
│ │ PHP App │ │ Event Bus (TS) │ │
│ └────┬─────┘ └─────────┴─┘ │ │
│ │ Events │ │
│ │ AppAPI/OCS API ↓ │
│ ↓ │
└────────────────────────────────────────┘
│
┌──────────────────────────────────────────┐
│ │ RUST EXAPP (Docker) │
│ │ ┌────────┐ ┌──────────┐ │
│ │ │ │ Axum │ │ Potree │ │
│ │ │ │ Server │ │ Converter │ │ Cache│ │
│ │ └────┬───┘ └─────┴─┘ └───┴───┘ │ │
└───────┼───────────┼───────────┼──┘───┼───┘───┘
│
┌───────┴─────┘ └───────────────────────┴─┘
┌───────────────────────────┴───────────────┴─┐
│ Persistent Storage │
│ /nc_app_nc_ │
│ potree_data/ │
│ ├── pointclouds/│ │
│ │ ├── {fileid}/│ │
│ │ │ ├── Potree│ │
│ │ │ ├── cloud.js │ │
│ │ │ ├── data/ │ │
│ │ │ └── metadata.json │
│ │ └── cache_meta.json │
└───────────────────────────────────────────────┘
┌───────────────────────────────────┴───────────────┴─┐
│ File Actions UI │
└───────────────────────────────────────────────┘
- User uploads
.las,.laz, or.e57file to Nextcloud - Nextcloud fires
NodeCreatedEvent - ExApp receives event, downloads file via WebDAV
- For E57 files: converts to LAS using LAStools
e572las - For LAS/LAZ: converts directly using PotreeConverter 2.0
- Stores output in
APP_PERSISTENT_STORAGE/{fileid}/with:cloud.js- Potree metadata and hierarchydata/- Octree node files (.las)metadata.json- Conversion metadata
- Registers "View in 3D" file action
- User clicks action → Potree viewer loads point cloud
| Format | Conversion Path | Notes |
|---|---|---|
| LAS | PotreeConverter 2.0 | Native support, fast conversion |
| LAZ | PotreeConverter 2.0 | Compressed LAS, requires laszip |
| E57 | LAStools e572las → PotreeConverter | Multi-scan support, pre-conversion required |
- Cache Duration: Number of days to cache converted point clouds (default: 30, min: 1)
- Max File Size: Maximum size in GB for automatic conversion (default: 10)
- Sampling Method: PotreeConverter sampling strategy (default: Poisson)
poisson: Better point distributionpoisson_average: Smoother resultsrandom: Fastest conversion
- Encoding: Compression format for output (default: Brotli)
See .env.example for all configuration options.
- Rust 1.85+
- Node 20+ (for frontend)
- Docker 20+
# Start backend
cd app/ex_app/backend
cargo run
# Start frontend (in separate terminal)
cd app/ex_app/frontend
npm run dev# Run Rust tests
cargo test
# Run TypeScript tests
npm test
# Run Playwright E2E tests
npm run test:e2e- Check PotreeConverter build status:
make check-potree - Verify file format is supported
- Check disk space in persistent storage
- Review conversion logs in
APP_PERSISTENT_STORAGE/conversion_logs/
- Clear all caches via Nextcloud admin settings
- Verify
CACHE_DURATION_DAYSis > 1 - Check file permissions on persistent storage
- Use SSD for persistent storage
- Limit concurrent conversions
- Adjust sampling method (random is fastest)
- Enable Brotli encoding for smaller files
AGPL-3.0-or-later
See CONTRIBUTING.md for development guidelines.
- Issues: https://github.com/your-username/nc_potree/issues
- Documentation: https://github.com/your-username/nc_potree/wiki
- Nextcloud ExApp docs: https://docs.nextcloud.com/server/latest/developer_manual/exapp_development/
A Nextcloud External App (ExApp) that provides 3D point cloud viewing using Potree.
- WebGL-based Rendering: Uses Potree's octree LOD structure for large datasets
- Format Support: Converts LAS, LAZ, and E57 files to Potree format on-demand
- Smart Caching: Configurable cache duration (default: 30 days) with automatic cleanup
- Event-Driven Cleanup: Reacts to file deletion events to remove cached point clouds
- Progressive Loading: Loads appropriate detail levels based on camera distance
- Admin Configuration: Declarative settings for cache duration and conversion options
- Nextcloud 28+ (tested on 32)
- AppAPI enabled (included with Nextcloud 30+)
- Docker for ExApp deployment
- Minimum 4GB RAM for large point clouds
- SSD recommended for conversion performance
git clone https://github.com/your-username/nc_potree.git
cd nc_potreecp .env.example .env
# Edit .env with your Nextcloud URL and credentialsmake buildmake register┌─────────────────────────────────────────────┐
│ NEXTCLOUD SERVER │
│ ┌──────────┐ ┌──────────────────┐ │
│ │ PHP App │ │ Event Bus (TS) │ │
│ └────┬─────┘ └─────────┬────────┘ │
│ │ │ Events │
│ │ AppAPI/OCS API ↓ │
│ ↓ │
│ ┌──────────────────────────────────────┐ │
│ │ RUST EXAPP (Docker) │ │
│ │ ┌────────┐ ┌──────────┐ ┌────┐ │ │
│ │ │ Axum │ │ Potree │ │Cache│ │ │
│ │ │ Server │ │Converter │ │Mgr │ │ │
│ │ └────┬───┘ └────┬─────┘ └──┬──┘ │ │
│ └───────┼──────────────┼──────────┼──────┘ │
└───────────┼──────────────┼──────────┼─────────────┘
│ │ │
┌───────┴──────┐ │ │
│ Persistent Storage│ │ │
│ /nc_app_nc_ │ │ │
│ potree_data/ │ │ │
│ ├── pointclouds/│ │ │
│ │ ├── {fileid}/│ │ │
│ │ │ └── Potree│ │ │
│ └── cache_meta.json│ │ │
└──────────────────────┘ │ │
┌──────────┴──────┐
│ File Actions UI │
└───────────────────┘
- User uploads
.las,.laz, or.e57file to Nextcloud - Nextcloud fires
NodeCreatedEvent - ExApp receives event, downloads file via WebDAV
- For E57 files: converts to LAS using LAStools
e572las - For LAS/LAZ: converts directly using PotreeConverter 2.0
- Stores output in
APP_PERSISTENT_STORAGE/{fileid}/with:cloud.js- Potree metadata and hierarchydata/- Octree node files (.las)metadata.json- Conversion metadata
- Registers "View in 3D" file action
- User clicks action → Potree viewer loads point cloud
| Format | Conversion Path | Notes |
|---|---|---|
| LAS | PotreeConverter 2.0 | Native support, fast conversion |
| LAZ | PotreeConverter 2.0 | Compressed LAS, requires laszip |
| E57 | LAStools e572las → PotreeConverter | Multi-scan support, pre-conversion required |
- Cache Duration: Number of days to cache converted point clouds (default: 30, min: 1)
- Max File Size: Maximum size in GB for automatic conversion (default: 10)
- Sampling Method: PotreeConverter sampling strategy (default: Poisson)
poisson: Better point distributionpoisson_average: Smoother resultsrandom: Fastest conversion
See .env.example for all configuration options.
- Rust 1.85+
- Node 20+ (for frontend)
- Docker 20+
# Start backend
cd app/ex_app/backend
cargo run
# Start frontend (in separate terminal)
cd app/ex_app/frontend
npm run dev# Run Rust tests
cargo test
# Run TypeScript tests
npm run test
# Run Playwright E2E tests
npm run test:e2e- Check PotreeConverter build status:
make check-potree - Verify file format is supported
- Check disk space in persistent storage
- Review conversion logs in
APP_PERSISTENT_STORAGE/conversion_logs/
- Clear all caches via Nextcloud admin settings
- Verify
CACHE_DURATION_DAYSis > 1 - Check file permissions on persistent storage
- Use SSD for persistent storage
- Limit concurrent conversions
- Adjust sampling method (random is fastest)
- Enable Brotli encoding for smaller files
AGPL-3.0-or-later
See CONTRIBUTING.md for development guidelines.