尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Open Museum is a project dedicated to capturing and maintaining 3D models of monuments, public art and cultural heritage globally using 3D reconstruction.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Open Museum is a bilingual (English/German) static website for exploring 3D reconstructions of monuments, fountains, and public art. The project documents cultural heritage through interactive 3D presentation at openmuseum.io.
Working on the code? AGENTS.md is the orientation guide — architecture, the build's Firestore dependency, and the gotchas that are not visible from the tree. Written for coding agents, but the same ground a new contributor needs.查看完整 README ↗Open Museum is a bilingual (English/German) static website for exploring 3D reconstructions of monuments, fountains, and public art. The project documents cultural heritage through interactive 3D presentation at openmuseum.io.
Working on the code?
AGENTS.mdis the orientation guide — architecture, the build's Firestore dependency, and the gotchas that are not visible from the tree. Written for coding agents, but the same ground a new contributor needs.
The primary aim is to document and preserve 3D models of cultural and artistic heritage in public spaces. By leveraging modern photogrammetry and 3D reconstruction, we make these works accessible for online viewing and cultural documentation.
All works are available on the website for interactive viewing in the browser:
.glb (web) and .usdz (Apple AR) where availableEach work page shows its IP status (public domain, freedom of panorama, or authorized use) and whether downloads are available.
| Layer | Choice |
|---|---|
| Framework | Astro v7 (static output) |
| Styling | Tailwind CSS v4 |
| 3D viewer | <model-viewer> v4 |
| Content | Cloud Firestore (content / works) loaded at build time |
| i18n | Astro built-in routing — English at /, German under /de/ |
| Deployment | GitHub Pages via GitHub Actions |
pnpm install
pnpm dev
Content is fetched from Firestore during astro dev and astro build. Authenticate with Application Default Credentials first:
# Option A: gcloud ADC
gcloud auth application-default login
# Option B: point at a credentials file
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/adc.json
export GOOGLE_CLOUD_PROJECT=open-museum-885a1
Create a .env file in the project root for optional configuration (see Asset Storage).
Large files (3D models and images) are hosted on external storage to keep the repository lightweight.
The storage URL is configured via the PUBLIC_ASSETS_BASE_URL environment variable:
# .env
PUBLIC_ASSETS_BASE_URL=https://open-museum-885a1.firebasestorage.app
Asset paths in Firestore documents are resolved at build/runtime via src/utils/assets.ts.
PUBLIC_ASSETS_BASE_URL in .env and assets load from Firebase (or another compatible host)PUBLIC_ASSETS_BASE_URL empty and place asset files in public/models/ and public/images/works/ (these directories are gitignored)getAssetUrl()When Firebase is configured, model files can be loaded through authenticated requests. Set these in .env (or as GitHub Actions variables for deployment):
PUBLIC_FIREBASE_API_KEYPUBLIC_FIREBASE_AUTH_DOMAINPUBLIC_FIREBASE_PROJECT_IDPUBLIC_FIREBASE_STORAGE_BUCKETPUBLIC_FIREBASE_APP_IDWorks are stored in Firestore (project open-museum-885a1, database content, collection works). Each document ID is the work slug (for example berlinstein). Astro loads the collection only at build/dev time via a custom content loader — visitors receive static HTML and never talk to Firestore.
Edit documents in the Firebase Console or via the Firebase/Admin CLI. Security rules allow public reads (the work data is public website content) and deny client writes except for the content-admin allowlist in isContentAdmin(), which exists so the work creator below can publish new works. Console/CLI updates use IAM and are not blocked by those rules.
Key fields:
title, description — bilingual (de / en)category — brunnen, denkmal, or kunstwerkmodel.glb, model.usdz — asset pathsphotos, poster — gallery and preview imageslocation — coordinates, address, optional Google My Maps embed URLcity, country, artist, modelCreator, year, material — metadataipStatus — public-domain, freedom-of-panorama, or authorized-usedownloadAllowed — whether GLB/USDZ download is offered on the work pagetour — optional guided camera tour stepsSee src/content/work-schema.ts for the full schema.
pnpm work:create
This serves the work creator at
http://localhost:5174/tools/work-creator/: a local page that uploads the
GLB/USDZ/poster/photos to Firebase Storage and writes the works/<slug>
document, validated against the same rules the build enforces. It needs a
one-time setup (an admin user plus a config file) — see
tools/work-creator/README.md.
Gallery thumbnails need no action: prebuild regenerates missing .webp files
from Storage during the build, so nothing has to be committed for a new work.
Validation is shared between the tool and the CLI in
scripts/lib/work-shape.mjs; keep it in sync with
src/content/work-schema.ts when fields change.
Firestore edits do not auto-publish. After updating works:
main, orworkflow_dispatch)If you still have local JSON under src/content/works/:
pnpm works:migrate:dry # validate + print plan
pnpm works:migrate # upsert into Firestore
pnpm works:verify # read back / validate remote documents
In addition to the existing PUBLIC_* variables, set:
| Variable | Example |
|---|---|
GCP_WORKLOAD_IDENTITY_PROVIDER | projects/717967107645/locations/global/workloadIdentityPools/github-actions/providers/github-oidc |
GCP_SERVICE_ACCOUNT | [email protected] |
These enable keyless Workload Identity Federation so CI/deploy can read Firestore at build time.
Work-page gallery images use generated .webp thumbnails for initial render and load the full-size photo only when the user opens the lightbox.
pnpm thumbs:generatescripts/generate-work-photo-thumbnails.mjsprebuild runs the generator automaticallypublic/images/thumbnails/works/The generator reads all photos arrays from Firestore works (gallery photos only), then:
PUBLIC_ASSETS_BASE_URL when set (Firebase-compatible URL handling), orpublic/ when external storage is not configured.Optional tuning via environment variables:
WORK_THUMBNAIL_WIDTH (default: 900)WORK_THUMBNAIL_QUALITY (default: 72)WORK_THUMBNAIL_CONCURRENCY (default: 4)The deployment workflow includes an automated changed-page asset validation step:
pnpm test:assets:changedscripts/ci/asset-health-check.mjs<model-viewer poster> and og:image)<img src>)<model-viewer src> and ios-src)If validation fails, the workflow:
asset-health-report.md as a workflow artifact,Feel free to contribute in any way you can — capturing new models, improving existing ones, or sharing feedback.
If you have questions or suggestions, don't hesitate to get in touch.
Your support means a lot:
All source code (Astro/TypeScript/CSS/JavaScript) in this repository is licensed under the MIT License. See LICENSE.
Not all assets share the same license. Rights vary by work:
Check the IP status badge and download controls on each work page at openmuseum.io before reusing any asset. For rights questions or takedown requests, see the About page or contact [email protected].
Thank you for your interest in Open Museum!