Movement halls routed 24 of the 26 movements through 8 generic detail kinds, four of which (modern, industrial, atelier, museum) rendered nothing at all, and `salon` was a single ceiling ring shared by eight movements. `details` is now a 26-value MovementDetailKind, one per movement, each built from the architecture of the same period as the movement itself. Gothic and Byzantine are unchanged and stay in MovementHallDetails.tsx as the reference implementations; the rest live under components/hall-details/, split by era, over shared wall-flush primitives. hall-details/geometry.ts records the budget the Gothic and Byzantine components established, since frames hang 0.23 m proud with a 0.7 m clear margin at each wall end: relief limits above and below the frame line, corner pockets for freestanding masses, doorway and title-band clearance, and a cap of two added lights per hall. Halls now pass their computed windows down so upper-wall panels, arches and roundels step around the openings. Also holds the pale interiors back from blowing out: gallery wall tints are authored around 0.50-0.56 luminance instead of near-white, and the 19 halls that read too bright take lightScale 0.30, matching the basilica. Verified by rendering all 26 interiors offline at two hall sizes and measuring the scene graph: nothing through walls, floor or ceiling, maximum 0.17 m intrusion into the hang zone, at most two added lights per hall. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Art Gallery
Interactive virtual art gallery: zoomable historical timeline (classic left→right, vertical, or Tree of Art lineage chart — shareable via ?layout=) with era click-to-zoom, major event markers (vertical guides into the movement flow), branching art-movement streams (click a movement name to enter its 3D movement gallery — photorealistic period interiors with painted walls, stone, and wood textures; chronological wings with up to ~55 works each, side-wall windows, wing navigator), one 3D hall per artist (parquet floor, movement-tinted walls, black/gold frames by review status, corridor layout for large catalogs, museum-style exit doors, golden influence lamps, canvas placeholders for missing works, influence-linked exits), painting detail with art-history annotations, prev/next catalog browsing and fullscreen lightbox, curator-gated debug-mode image audit on painting detail and artist bio (Checked / Fix it / More / Clear / Upload; painting detail also Remove entry), optional Show more auto-opens the search picker, Checkup page, preserved gallery camera on return, and Wikipedia-sourced artist biographies. Anonymous visitors browse freely; curators sign in via Curator login in the header.
Documentation
| Document | Purpose |
|---|---|
| Documentation/basics.md | Architecture, layout, user flow |
| Documentation/ui-interaction-and-component-standards.md | UI interaction, navigation, and component standards |
| Documentation/movement-tree.md | Tree of Art start page — tree layout rules |
| Documentation/FAC.md | Command cheat sheet — start/stop, import, deploy |
| Documentation/environments.md | Dev/prod URLs, DB split, deploy, sync |
| Documentation/setup.md | Install, env, npm scripts |
| Documentation/DB_structure.md | PostgreSQL tables |
| Documentation/API.md | REST endpoints |
| Documentation/data-and-images.md | Catalog, bios, seeding, image pipeline |
Stack
- Backend: Node.js, Express, PostgreSQL
- Frontend: React, Vite, Three.js (
@react-three/fiber,@react-three/drei)
Setup
-
Copy
.env.exampleto.envand set database credentials (DB_NAME=gallery_devafter one-time split). SetSESSION_SECRET,CURATOR_USERNAME, andCURATOR_PASSWORDfor curator login (see setup.md). -
Install dependencies:
npm install cd client && npm install && cd .. -
Apply database schema (requires PostgreSQL superuser for first-time setup):
npm run dev:migrate npm run dev:seed -
Enrich the catalog (recommended after seed):
npm run dev:sync-image-paths # import paintings from data/images/paintings/ when present npm run dev:fetch-artist-images # link or download artist portraits npm run dev:fetch-artist-bios # Wikipedia biographies for all artists npm run dev:expand-catalog # add famous works for artists with thin catalogs npm run dev:update-influences # art-history lineage links (detail panels + 3D hall) npm run dev:migrate:artist-palette # optional: JSONB column for PainterPalette enrichment npm run dev:import-painter-palette # optional: metadata + influence links from Inputs/PainterPalette.csv npm run dev:migrate:checkup-flags # review/fixed flags for Checkup + debug mode (paintings) npm run dev:migrate:artist-checkup-flags # same flags for artist portraits (bio debug) npm run dev:migrate:painting-annotations # art-history notes on painting detail npm run dev:update-painting-annotations # load curated notes (+ optional --wikipedia) npm run dev:fetch-images -- --limit=50 # random batch of missing images (10s per work) npm run dev:fetch-images -- --artist="Claude Monet" # one artist in catalog order -
Development (public URL):
npm run dev:webOpen https://devgallery.mysuperlab.netcraze.pro (or http://localhost:5173 locally).
Production: https://gallery.mysuperlab.netcraze.pro — see Documentation/environments.md and infra/docker/DEPLOY-truenas.md.
Deployed URLs
| Environment | URL | Host |
|---|---|---|
| Development | https://devgallery.mysuperlab.netcraze.pro | Dev PC :5173 (Vite) + :3451 (API) |
| Production | https://gallery.mysuperlab.netcraze.pro | TrueNAS Docker :5173 |
Operator guide: Documentation/environments.md.
Development
Workflow: All changes are made and tested on dev (gallery_dev, https://devgallery.mysuperlab.netcraze.pro). Production is updated on a scheduled release (~weekly): promote DB/images, build/push the Docker image, restart TrueNAS. See Documentation/environments.md.
Public dev (Keenetic):
npm run dev:web # Vite :5173, API :3451
Local HMR:
npm run dev:server # API — PORT from .env
npm run dev:client # http://localhost:5173 (proxies /api and /images)