Musee
Fast, responsive , self-hosted image gallery. Ships minimal JS to the client.
Install / Use
/learn @obviyus/MuseeREADME
Musée (pronounced myu-zay) was written primarily to experiment around with https://remix.run/ but now re-written using https://astro.build. Until now I had been using the excellent waschinski/photo-stream gallery for hosting my images but felt limited with having to use Ruby.
Mission accomplished! Musée now ships ZERO client-side JavaScript while maintaining a responsive masonry layout with proper horizontal ordering. This is achieved through Astro's build-time static generation, pre-calculating column distributions for each breakpoint and using pure CSS for responsive display.
<a align="center" href="https://gallery.obviy.us/"> <img src="images/preview.webp" alt="demo" width="100%"> </a> <p align="center"> <a href="https://gallery.obviy.us/"><code>[ Live Demo ]</code></a> </p>✨ Features
- [x] Zero JavaScript sent to clients
- [x] True masonry layout with horizontal ordering
- [x] Generate image thumbnails
- [x] Compress original images
- [x] Strip image metadata before deployment
- [x] Typescript support
- [x] Statically Generated
- [x] Uses TailwindCSS
- [x] OpenGraph meta tags
- [x] CSS-only animations
- [x] Works with JavaScript disabled
- [ ] Captions for images
- [ ] Device metadata for images
- [ ] Image geo-tag map generation
📸 Live Examples
Feel free to make a PR to add your own.
🏗 Development
- Install dependencies.
$ bun install
Load your images in the src/assets/images/original directory.
- Start development server
$ bun run dev
🚀 Deployment
Deployment (for now) is done to Cloudflare Pages. Documentation is available here: https://developers.cloudflare.com/pages/framework-guides/astro/
🏛️ Architecture
Musée achieves zero JavaScript by:
- Pre-calculating masonry column distributions at build time for each breakpoint
- Using CSS media queries to show/hide the appropriate pre-rendered layout
- Replacing React components with Astro components
- Moving all date calculations to build time
- Using pure CSS animations instead of JavaScript libraries
Contributing
Any and all contributions are welcome.
This repository uses the automated semantic-release suite of tools to generate version numbers. All commit messages must conform to the Angular Commit Message conventions.
Related Skills
bluebubbles
347.0kUse when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel="bluebubbles".
node-connect
347.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
slack
347.0kUse when you need to control Slack from OpenClaw via the slack tool, including reacting to messages or pinning/unpinning items in Slack channels or DMs.
frontend-design
107.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
