# maciekrt/membrane-hub architecture

> Architecture diagram of the GitHub repository maciekrt/membrane-hub, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/maciekrt/membrane-hub
- Repository: https://github.com/maciekrt/membrane-hub

## Overview

Membrane Hub combines a Python image-processing dispatcher with a Next.js interface for dataset discovery, viewing, uploads, and segmentation-related routes. The visible backend workflow accepts work through the dispatcher, which queues Google Drive downloads and invokes segmentation routines; rendering and dataset metadata are separate processing capabilities. The viewer builds image galleries from dataset metadata. Several routes and standalone workflows are present in the tree but were not excerpted, so their internal calls are not asserted here.

Main entry points: [`membrane-dispatcher/dispatcher.py`](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/dispatcher.py) (Job dispatcher), [`membrane-dispatcher/standalone_processing.py`](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/standalone_processing.py) (Standalone processing), [`membrane-viewer-js/pages/index.js`](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/index.js) (Dataset home), [`membrane-viewer-js/lib/serverImages.js`](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/serverImages.js) (Image assembly)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_backend["Processing backend"]
  node_dispatcher["Job dispatcher<br/>[dispatcher.py]"]
  node_drive["Drive downloader<br/>[downloader.py]"]
  node_datasetmeta["Dataset metadata"]
  node_archive["Archive extraction<br/>[unzipper.py]"]
  node_seg2d["Segmentation runner"]
  node_seg3d["2D segmentation"]
  node_standalone["Standalone processing"]
  node_standseg["Standalone segmentation"]
  node_image_render["Image renderer<br/>[image_renderer.py]"]
  node_headless["Headless renderer"]
end

subgraph group_viewer["Dataset viewer"]
  node_home["Dataset home<br/>[index.js]"]
  node_dataset_list["Dataset list<br/>[listDatasets.js]"]
  node_gallery["Image gallery<br/>[&#91;...dataset&#93;.js]"]
  node_image_data["Image assembly<br/>[serverImages.js]"]
  node_dataset_data["Dataset access<br/>[serverDatasets.js]"]
  node_security["Access checks<br/>[security.js]"]
end

subgraph group_api["Web APIs"]
  node_dataset_api["Dataset API<br/>[&#91;...ownerData&#93;.js]"]
  node_image_api["Image API<br/>[&#91;...imagePath&#93;.js]"]
  node_seg_api["Segmentation API<br/>[&#91;...listCmd&#93;.js]"]
  node_upload_api["Upload routes<br/>[upload.js]"]
  node_scratchpad["Scratchpad workflow"]
  node_scratchdata["Scratchpad data<br/>[scratchpadData.js]"]
  node_scratchproc["Scratchpad processing"]
end

node_user(("Researcher"))

node_user -->|"browses"| node_home
node_home -->|"renders"| node_dataset_list
node_home -.->|"fetches datasets"| node_dataset_api
node_dataset_list -->|"opens dataset"| node_gallery
node_gallery -->|"loads image data"| node_image_data
node_image_data -->|"references image URLs"| node_image_api
node_image_data -.->|"uses helper"| node_security
node_dataset_api -->|"uses dataset service"| node_dataset_data
node_dataset_api -->|"checks access"| node_security
node_image_api -->|"checks access"| node_security
node_scratchpad -.->|"processes data"| node_scratchproc
node_scratchdata -->|"uses processor"| node_scratchproc
node_user -.->|"submits work"| node_dispatcher
node_dispatcher -->|"queues download"| node_drive
node_dispatcher -->|"runs segmentation"| node_seg2d
node_dispatcher -->|"dispatches segmentation"| node_seg3d
node_image_render -->|"creates renderer"| node_headless
node_standalone -->|"uses processing"| node_datasetmeta
node_standalone -->|"invokes segmentation"| node_seg2d
node_standalone -.->|"uses renderer"| node_image_render
node_standseg -->|"delegates processing"| node_standalone

click node_dispatcher "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/dispatcher.py"
click node_drive "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/GoogleDriveAPI/downloader.py"
click node_datasetmeta "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/processing/datasets_processing.py"
click node_archive "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/processing/unzipper.py"
click node_seg2d "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/segmentation/run_segmentation.py"
click node_seg3d "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/segmentation/run_segmentation_2d.py"
click node_standalone "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/standalone_processing.py"
click node_standseg "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/standalone_segmentation.py"
click node_image_render "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/rendererMembrane/image_renderer.py"
click node_headless "https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/rendererMembrane/headless_renderer.py"
click node_home "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/index.js"
click node_dataset_list "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/components/listDatasets.js"
click node_gallery "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/viewer/%5B...dataset%5D.js"
click node_image_data "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/serverImages.js"
click node_dataset_data "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/serverDatasets.js"
click node_security "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/security.js"
click node_dataset_api "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/datasets/%5B...ownerData%5D.js"
click node_image_api "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/images/%5B...imagePath%5D.js"
click node_seg_api "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/segmentation/list/%5B...listCmd%5D.js"
click node_upload_api "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/upload.js"
click node_scratchpad "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/uploadScratchpad.js"
click node_scratchdata "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/scratchpadData.js"
click node_scratchproc "https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/processScratchpad.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_dispatcher,node_drive,node_datasetmeta,node_archive,node_seg2d,node_seg3d,node_standalone,node_standseg,node_image_render,node_headless toneBlue
class node_home,node_dataset_list,node_gallery,node_image_data,node_dataset_data,node_security toneAmber
class node_dataset_api,node_image_api,node_seg_api,node_upload_api,node_scratchpad,node_scratchdata,node_scratchproc toneMint
class node_user toneIndigo
```

## Components

### Processing backend

- [Job dispatcher](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/dispatcher.py): `membrane-dispatcher/dispatcher.py`
- [Drive downloader](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/GoogleDriveAPI/downloader.py): `membrane-dispatcher/GoogleDriveAPI/downloader.py`
- [Dataset metadata](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/processing/datasets_processing.py): `membrane-dispatcher/processing/datasets_processing.py`
- [Archive extraction](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/processing/unzipper.py): `membrane-dispatcher/processing/unzipper.py`
- [Segmentation runner](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/segmentation/run_segmentation.py): `membrane-dispatcher/segmentation/run_segmentation.py`
- [2D segmentation](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/segmentation/run_segmentation_2d.py): `membrane-dispatcher/segmentation/run_segmentation_2d.py`
- [Standalone processing](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/standalone_processing.py): `membrane-dispatcher/standalone_processing.py`
- [Standalone segmentation](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/standalone_segmentation.py): `membrane-dispatcher/standalone_segmentation.py`
- [Image renderer](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/rendererMembrane/image_renderer.py): `membrane-dispatcher/rendererMembrane/image_renderer.py`
- [Headless renderer](https://github.com/maciekrt/membrane-hub/blob/main/membrane-dispatcher/rendererMembrane/headless_renderer.py): `membrane-dispatcher/rendererMembrane/headless_renderer.py`

### Dataset viewer

- [Dataset home](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/index.js): `membrane-viewer-js/pages/index.js`
- [Dataset list](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/components/listDatasets.js): `membrane-viewer-js/components/listDatasets.js`
- [Image gallery](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/viewer/%5B...dataset%5D.js): `membrane-viewer-js/pages/viewer/[...dataset].js`
- [Image assembly](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/serverImages.js): `membrane-viewer-js/lib/serverImages.js`
- [Dataset access](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/serverDatasets.js): `membrane-viewer-js/lib/serverDatasets.js`
- [Access checks](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/security.js): `membrane-viewer-js/lib/security.js`

### Web APIs

- [Dataset API](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/datasets/%5B...ownerData%5D.js): `membrane-viewer-js/pages/api/datasets/[...ownerData].js`
- [Image API](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/images/%5B...imagePath%5D.js): `membrane-viewer-js/pages/api/images/[...imagePath].js`
- [Segmentation API](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/segmentation/list/%5B...listCmd%5D.js): `membrane-viewer-js/pages/api/segmentation/list/[...listCmd].js`
- [Upload routes](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/upload.js): `membrane-viewer-js/pages/api/upload.js`
- [Scratchpad workflow](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/uploadScratchpad.js): `membrane-viewer-js/pages/api/uploadScratchpad.js`
- [Scratchpad data](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/pages/api/scratchpadData.js): `membrane-viewer-js/pages/api/scratchpadData.js`
- [Scratchpad processing](https://github.com/maciekrt/membrane-hub/blob/main/membrane-viewer-js/lib/processScratchpad.js): `membrane-viewer-js/lib/processScratchpad.js`

### Other components

- **Researcher**

## Connections

- Researcher → Dataset home: browses (evidence: `membrane-viewer-js/pages/index.js`)
- Dataset home → Dataset list: renders (evidence: `membrane-viewer-js/pages/index.js`)
- Dataset home → Dataset API: fetches datasets
- Dataset list → Image gallery: opens dataset (evidence: `membrane-viewer-js/components/listDatasets.js`)
- Image gallery → Image assembly: loads image data (evidence: `membrane-viewer-js/pages/viewer/[...dataset].js`)
- Image assembly → Image API: references image URLs (evidence: `membrane-viewer-js/lib/serverImages.js`)
- Image assembly → Access checks: uses helper
- Dataset API → Dataset access: uses dataset service (evidence: `membrane-viewer-js/pages/api/datasets/[...ownerData].js`)
- Dataset API → Access checks: checks access (evidence: `membrane-viewer-js/pages/api/datasets/[...ownerData].js`)
- Image API → Access checks: checks access (evidence: `membrane-viewer-js/pages/api/images/[...imagePath].js`)
- Scratchpad workflow → Scratchpad processing: processes data
- Scratchpad data → Scratchpad processing: uses processor (evidence: `membrane-viewer-js/pages/api/scratchpadData.js`)
- Researcher → Job dispatcher: submits work
- Job dispatcher → Drive downloader: queues download (evidence: `membrane-dispatcher/dispatcher.py`)
- Job dispatcher → Segmentation runner: runs segmentation (evidence: `membrane-dispatcher/dispatcher.py`)
- Job dispatcher → 2D segmentation: dispatches segmentation (evidence: `membrane-dispatcher/dispatcher.py`)
- Image renderer → Headless renderer: creates renderer (evidence: `membrane-dispatcher/rendererMembrane/image_renderer.py`)
- Standalone processing → Dataset metadata: uses processing (evidence: `membrane-dispatcher/standalone_processing.py`)
- Standalone processing → Segmentation runner: invokes segmentation (evidence: `membrane-dispatcher/standalone_processing.py`)
- Standalone processing → Image renderer: uses renderer
- Standalone segmentation → Standalone processing: delegates processing (evidence: `membrane-dispatcher/standalone_segmentation.py`)
