# dustinspace217/dustin-space architecture

> Architecture diagram of the GitHub repository dustinspace217/dustin-space, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dustinspace217/dustin-space
- Repository: https://github.com/dustinspace217/dustin-space

## Overview

DUST IN SPACE is an astrophotography portfolio with a separate image-ingest application and a background “currently imaging” publisher. Visitors browse published work and interactive browser experiences; image ingestion turns submitted files into gallery-ready assets and metadata, while the imaging agent publishes live capture status. The graph also captures the major standalone explainers and game in the source tree. README and sampled entry points support the principal flows; some site templates and subsystem internals were not sampled, so uncertain wiring is omitted.

Main entry points: [`ingest/lib/pipeline.js`](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/pipeline.js) (Image pipeline), [`now-imaging/agent.js`](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/agent.js) (Imaging agent), [`src/descent/js/main.js`](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/main.js) (Information descent), [`src/aperture-synthesis/src/main.js`](https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/main.js) (Aperture synthesis)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portfolio["Portfolio site"]
  node_gallery["Image gallery"]
  node_image_catalog["Published images<br/>[publishedImages.js]"]
  node_deep_zoom[("Deep-zoom tiles")]
end

subgraph group_ingest["Image ingest"]
  node_ingest_server["Ingest server<br/>[server.js]"]
  node_ingest_routes["Ingest routes"]
  node_pipeline["Image pipeline<br/>[pipeline.js]"]
  node_metadata_lookup["Metadata lookup"]
  node_plate_solving["Plate solving<br/>[platesolve.js]"]
  node_catalog_lookup["Object catalog<br/>[simbad.js]"]
  node_renditions["Image renditions<br/>[images.js]"]
  node_gallery_update["Gallery update<br/>[gallery.js]"]
  node_r2_upload["Tile upload<br/>[r2.js]"]
end

subgraph group_imaging["Live imaging"]
  node_live_agent["Imaging agent<br/>[agent.js]"]
  node_frame_select["Frame selection<br/>[select.js]"]
  node_target_resolve["Target resolution<br/>[resolve.js]"]
  node_status_validate["Status validation<br/>[status.js]"]
  node_status_publish["Status publishing<br/>[publish.js]"]
  node_agent_state[("Publish state<br/>[state.js]")]
end

subgraph group_explorables["Interactive experiences"]
  node_aperture_app["Aperture synthesis<br/>[main.js]"]
  node_aperture_clean["Image CLEAN<br/>[clean.js]"]
  node_aperture_render["Imaging renderer<br/>[render.js]"]
  node_descent_app["Information descent<br/>[main.js]"]
  node_descent_data["Coda corpus<br/>[data.js]"]
  node_descent_compute["Ladder computation<br/>[compute.js]"]
  node_descent_analysis["Information analysis<br/>[index.js]"]
  node_descent_view["Descent view<br/>[descent.js]"]
  node_lenia_app["Lenia Lab<br/>[main.js]"]
end

node_visitor(("Site visitor"))
node_ingest_user(("Ingest operator"))
node_astrometry["Astrometry.net"]
node_simbad["SIMBAD"]
node_r2[("Cloudflare R2")]
node_nina["NINA capture"]
node_explorable_user(("Explorable reader"))

node_visitor -->|"browses"| node_gallery
node_image_catalog -->|"supplies entries"| node_gallery
node_gallery -.->|"loads tiles"| node_deep_zoom
node_ingest_user -->|"submits images"| node_ingest_server
node_ingest_server -->|"mounts routes"| node_ingest_routes
node_ingest_routes -->|"starts jobs"| node_pipeline
node_pipeline -->|"reads metadata"| node_metadata_lookup
node_pipeline -->|"solves coordinates"| node_plate_solving
node_plate_solving -.->|"fallback solve"| node_astrometry
node_pipeline -->|"finds annotations"| node_catalog_lookup
node_catalog_lookup -->|"queries objects"| node_simbad
node_pipeline -->|"creates previews"| node_renditions
node_pipeline -->|"uploads tiles"| node_r2_upload
node_r2_upload -->|"stores tiles"| node_r2
node_pipeline -->|"updates catalog"| node_gallery_update
node_gallery_update -->|"writes images"| node_image_catalog
node_live_agent -->|"reads capture history"| node_nina
node_live_agent -->|"selects latest light"| node_frame_select
node_live_agent -->|"resolves target"| node_target_resolve
node_live_agent -->|"validates status"| node_status_validate
node_live_agent -->|"publishes frame"| node_status_publish
node_status_publish -->|"stores status"| node_r2
node_live_agent -->|"tracks published frame"| node_agent_state
node_explorable_user -->|"interacts"| node_aperture_app
node_aperture_app -->|"cleans image"| node_aperture_clean
node_aperture_app -->|"renders views"| node_aperture_render
node_explorable_user -->|"explores"| node_descent_app
node_descent_app -->|"loads corpus"| node_descent_data
node_descent_app -->|"computes ladder"| node_descent_compute
node_descent_compute -->|"measures information"| node_descent_analysis
node_descent_app -->|"mounts experience"| node_descent_view
node_explorable_user -->|"experiments"| node_lenia_app

click node_gallery "https://github.com/dustinspace217/dustin-space/tree/main/src/gallery"
click node_image_catalog "https://github.com/dustinspace217/dustin-space/blob/main/src/_data/publishedImages.js"
click node_ingest_server "https://github.com/dustinspace217/dustin-space/blob/main/ingest/server.js"
click node_ingest_routes "https://github.com/dustinspace217/dustin-space/tree/main/ingest/routes"
click node_pipeline "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/pipeline.js"
click node_metadata_lookup "https://github.com/dustinspace217/dustin-space/tree/main/ingest/lib"
click node_plate_solving "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/platesolve.js"
click node_catalog_lookup "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/simbad.js"
click node_renditions "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/images.js"
click node_gallery_update "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/gallery.js"
click node_r2_upload "https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/r2.js"
click node_live_agent "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/agent.js"
click node_frame_select "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/select.js"
click node_target_resolve "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/resolve.js"
click node_status_validate "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/status.js"
click node_status_publish "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/publish.js"
click node_agent_state "https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/state.js"
click node_aperture_app "https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/main.js"
click node_aperture_clean "https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/clean.js"
click node_aperture_render "https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/render.js"
click node_descent_app "https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/main.js"
click node_descent_data "https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/data.js"
click node_descent_compute "https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/compute.js"
click node_descent_analysis "https://github.com/dustinspace217/dustin-space/blob/main/src/descent/src/analysis/index.js"
click node_descent_view "https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/descent.js"
click node_lenia_app "https://github.com/dustinspace217/dustin-space/blob/main/src/lenia/src/main.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_gallery,node_image_catalog,node_deep_zoom toneBlue
class node_ingest_server,node_ingest_routes,node_pipeline,node_metadata_lookup,node_plate_solving,node_catalog_lookup,node_renditions,node_gallery_update,node_r2_upload,node_r2 toneAmber
class node_live_agent,node_frame_select,node_target_resolve,node_status_validate,node_status_publish,node_agent_state toneMint
class node_aperture_app,node_aperture_clean,node_aperture_render,node_descent_app,node_descent_data,node_descent_compute,node_descent_analysis,node_descent_view,node_lenia_app toneRose
class node_visitor,node_ingest_user,node_astrometry,node_simbad,node_nina,node_explorable_user toneIndigo
```

## Components

### Portfolio site

- [Image gallery](https://github.com/dustinspace217/dustin-space/tree/main/src/gallery): `src/gallery`
- [Published images](https://github.com/dustinspace217/dustin-space/blob/main/src/_data/publishedImages.js): `src/_data/publishedImages.js`
- **Deep-zoom tiles**

### Image ingest

- [Ingest server](https://github.com/dustinspace217/dustin-space/blob/main/ingest/server.js): `ingest/server.js`
- [Ingest routes](https://github.com/dustinspace217/dustin-space/tree/main/ingest/routes): `ingest/routes`
- [Image pipeline](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/pipeline.js): `ingest/lib/pipeline.js`
- [Metadata lookup](https://github.com/dustinspace217/dustin-space/tree/main/ingest/lib): `ingest/lib`
- [Plate solving](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/platesolve.js): `ingest/lib/platesolve.js`
- [Object catalog](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/simbad.js): `ingest/lib/simbad.js`
- [Image renditions](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/images.js): `ingest/lib/images.js`
- [Gallery update](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/gallery.js): `ingest/lib/gallery.js`
- [Tile upload](https://github.com/dustinspace217/dustin-space/blob/main/ingest/lib/r2.js): `ingest/lib/r2.js`

### Live imaging

- [Imaging agent](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/agent.js): `now-imaging/agent.js`
- [Frame selection](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/select.js): `now-imaging/lib/select.js`
- [Target resolution](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/resolve.js): `now-imaging/lib/resolve.js`
- [Status validation](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/status.js): `now-imaging/lib/status.js`
- [Status publishing](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/publish.js): `now-imaging/lib/publish.js`
- [Publish state](https://github.com/dustinspace217/dustin-space/blob/main/now-imaging/lib/state.js): `now-imaging/lib/state.js`

### Interactive experiences

- [Aperture synthesis](https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/main.js): `src/aperture-synthesis/src/main.js`
- [Image CLEAN](https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/clean.js): `src/aperture-synthesis/src/clean.js`
- [Imaging renderer](https://github.com/dustinspace217/dustin-space/blob/main/src/aperture-synthesis/src/render.js): `src/aperture-synthesis/src/render.js`
- [Information descent](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/main.js): `src/descent/js/main.js`
- [Coda corpus](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/data.js): `src/descent/js/data.js`
- [Ladder computation](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/compute.js): `src/descent/js/compute.js`
- [Information analysis](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/src/analysis/index.js): `src/descent/src/analysis/index.js`
- [Descent view](https://github.com/dustinspace217/dustin-space/blob/main/src/descent/js/descent.js): `src/descent/js/descent.js`
- [Lenia Lab](https://github.com/dustinspace217/dustin-space/blob/main/src/lenia/src/main.js): `src/lenia/src/main.js`

### Other components

- **Site visitor**
- **Ingest operator**
- **Astrometry.net**
- **SIMBAD**
- **Cloudflare R2**
- **NINA capture**
- **Explorable reader**

## Connections

- Site visitor → Image gallery: browses
- Published images → Image gallery: supplies entries
- Image gallery → Deep-zoom tiles: loads tiles
- Ingest operator → Ingest server: submits images
- Ingest server → Ingest routes: mounts routes
- Ingest routes → Image pipeline: starts jobs
- Image pipeline → Metadata lookup: reads metadata
- Image pipeline → Plate solving: solves coordinates
- Plate solving → Astrometry.net: fallback solve
- Image pipeline → Object catalog: finds annotations
- Object catalog → SIMBAD: queries objects
- Image pipeline → Image renditions: creates previews
- Image pipeline → Tile upload: uploads tiles
- Tile upload → Cloudflare R2: stores tiles
- Image pipeline → Gallery update: updates catalog
- Gallery update → Published images: writes images
- Imaging agent → NINA capture: reads capture history
- Imaging agent → Frame selection: selects latest light
- Imaging agent → Target resolution: resolves target
- Imaging agent → Status validation: validates status
- Imaging agent → Status publishing: publishes frame
- Status publishing → Cloudflare R2: stores status
- Imaging agent → Publish state: tracks published frame
- Explorable reader → Aperture synthesis: interacts
- Aperture synthesis → Image CLEAN: cleans image
- Aperture synthesis → Imaging renderer: renders views
- Explorable reader → Information descent: explores
- Information descent → Coda corpus: loads corpus
- Information descent → Ladder computation: computes ladder
- Ladder computation → Information analysis: measures information
- Information descent → Descent view: mounts experience
- Explorable reader → Lenia Lab: experiments
