[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-73842":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":16,"starSnapshotCount":16,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},73842,"afilmory","Afilmory\u002Fafilmory","Afilmory","Modern photo gallery for photographers, with S3\u002FGitHub sync, EXIF details, maps, and a WebGL viewer.","https:\u002F\u002Fafilmory.art",null,"TypeScript",2523,311,4,26,0,16,61.08,"Other",false,"main",true,[],"2026-06-12 04:01:12","\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FAfilmory\u002Fassets\u002Fblob\u002Fmain\u002Fafilmory-readme-2:1.webp?raw=true\" alt=\"Afilmory\" width=\"100%\" \u002F>\n\u003C\u002Fp>\n\n# \u003Cp align=\"center\">Afilmory\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cem>A modern, high-performance photo gallery platform for photographers\u003C\u002Fem>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fafilmory.art\u002F\">Official SaaS\u003C\u002Fa> •\n  \u003Ca href=\"https:\u002F\u002Fdocs.afilmory.art\u002F\">Documentation\u003C\u002Fa> •\n  \u003Ca href=\"#-live-galleries\">Live Examples\u003C\u002Fa> •\n  \u003Ca href=\"#-self-hosting\">Self-Hosting\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n**Afilmory** (\u002Fəˈfɪlməri\u002F, \"uh-FIL-muh-ree\") is a comprehensive photo gallery solution that combines **Auto Focus (AF)**, **Aperture** (light control), **Film** (vintage medium), and **Memory** (captured moments). Built with React + TypeScript, it offers automatic photo synchronization from multiple storage sources, high-performance WebGL rendering, and professional EXIF metadata display.\n\n## 🚀 Quick Start\n\n### Option 1: Official SaaS (Recommended)\n\n**👉 [Get Started at afilmory.art](https:\u002F\u002Fafilmory.art\u002F)** - Zero setup, live in minutes!\n\nThe easiest way to create your photo gallery. No deployment, no servers, no maintenance required.\n\n**Why Choose SaaS?**\n- ✅ **Zero Configuration** - Sign up and go live immediately\n- ✅ **Live CMS** - Edit photos, titles, and metadata in real-time\n- ✅ **Custom Domains** - Bind your own domain with DNS verification\n- ✅ **Auto Updates** - Always running the latest features\n- ✅ **Managed Infrastructure** - We handle scaling, backups, and maintenance\n\n[**Start Your Gallery Now →**](https:\u002F\u002Fafilmory.art\u002F)\n\n### Option 2: Self-Hosting\n\nFor developers who need full control over their deployment:\n\n**Docker (Recommended)**\n```bash\n# See our Docker deployment guide\nhttps:\u002F\u002Fgithub.com\u002FAfilmory\u002Fdocker\n```\n\n**Manual Installation**\n```bash\n# 1. Clone and install\ngit clone https:\u002F\u002Fgithub.com\u002FAfilmory\u002FAfilmory.git\ncd Afilmory\npnpm install\n\n# 2. Configure\ncp config.example.json config.json\ncp builder.config.default.ts builder.config.ts\n# Edit both files with your settings\n\n# 3. Build manifest and thumbnails\npnpm run build:manifest\n\n# 4. Start the application\npnpm dev\n```\n\nFor detailed self-hosting instructions, see [DEVELOPMENT.md](.\u002FDEVELOPMENT.md) and [Documentation](https:\u002F\u002Fdocs.afilmory.art).\n\n## 📸 Live Galleries\n\nSee Afilmory in action:\n\n- [afilmory.innei.in](https:\u002F\u002Fafilmory.innei.in) - Creator's personal gallery\n- [gallery.mxte.cc](https:\u002F\u002Fgallery.mxte.cc)\n- [photography.pseudoyu.com](https:\u002F\u002Fphotography.pseudoyu.com)\n- [afilmory.magren.cc](https:\u002F\u002Fafilmory.magren.cc)\n\n## ✨ Features\n\n### Core Capabilities\n\n- 🖼️ **High-Performance WebGL Renderer** - Custom WebGL image viewer with smooth zoom, pan, and gesture support\n- 📱 **Responsive Masonry Layout** - Powered by Masonic, adapts seamlessly to any screen size\n- 🎨 **Modern UI\u002FUX** - Built with Tailwind CSS and Radix UI for accessibility and aesthetics\n- ⚡ **Incremental Sync** - Smart change detection processes only new or modified photos\n- 🌐 **Internationalization** - Multi-language support with i18next\n- 🔗 **Social Sharing** - OpenGraph metadata for rich social media previews\n\n### Image Processing\n\n- 🔄 **Format Support** - Automatic conversion of HEIC\u002FHEIF and TIFF formats\n- 🖼️ **Smart Thumbnails** - Multi-size thumbnail generation for optimized loading\n- 📊 **Complete EXIF Display** - Camera model, focal length, aperture, ISO, and more\n- 🌈 **Blurhash Placeholders** - Elegant progressive loading experience\n- 📱 **Live Photos** - Detection and display of iPhone Live Photos\n- ☀️ **HDR Images** - Full HDR image support\n- 🎛️ **Fujifilm Recipes** - Display Fujifilm film simulation settings\n\n### Advanced Features\n\n- 🗂️ **Multi-Storage Support** - S3-compatible storage, GitHub, Eagle, and local file system\n- 🏷️ **File System Tags** - Auto-generated tags based on directory structure\n- ⚡ **Concurrent Processing** - Multi-process\u002Fmulti-thread support for fast builds\n- 🗺️ **Interactive Map** - Geographic visualization with GPS coordinates using MapLibre\n- 🔍 **Fullscreen Viewer** - Immersive image viewing with gesture controls\n- 📷 **Share & Embed** - Share images to social media or embed in your website\n\n## 🏗️ Architecture\n\n### Monorepo Structure\n\n```\nafilmory\u002F\n├── apps\u002F\n│   ├── web\u002F              # React SPA (Vite + React Router 7)\n│   ├── ssr\u002F              # Next.js SSR wrapper for SEO\u002FOG\n│   ├── docs\u002F             # Documentation site (VitePress)\n├── be\u002F                   # Backend services (Hono-based)\n│   ├── apps\u002F\n│   │   ├── core\u002F         # Core API server\n│   │   ├── dashboard\u002F    # Admin dashboard backend\n│   │   └── oauth-gateway\u002F# OAuth authentication gateway\n│   └── packages\u002F\n│       ├── framework\u002F    # Hono enterprise framework\n│       ├── db\u002F           # Database schemas (Drizzle ORM)\n│       ├── redis\u002F        # Redis client\n│       └── websocket\u002F    # WebSocket gateway\n├── packages\u002F\n│   ├── builder\u002F          # Photo processing pipeline\n│   ├── webgl-viewer\u002F     # WebGL image viewer component\n│   ├── ui\u002F               # Shared UI components\n│   ├── hooks\u002F            # React hooks library\n│   ├── sdk\u002F              # API client SDK\n│   ├── utils\u002F            # Utility functions\n│   └── data\u002F             # Shared data types\n└── plugins\u002F              # Builder plugins\n```\n\n### Frontend Stack\n\n- **React 19** - Latest React with Compiler\n- **TypeScript** - Full type safety\n- **Vite** - Lightning-fast build tool\n- **React Router 7** - Modern routing\n- **Tailwind CSS** - Utility-first CSS framework\n- **Radix UI** - Accessible component primitives\n- **Jotai** - Atomic state management\n- **TanStack Query** - Data fetching and caching\n- **i18next** - Internationalization\n\n### Backend Stack\n\n- **Hono** - Ultra-fast web framework\n- **Drizzle ORM** - Type-safe database toolkit\n- **PostgreSQL** - Primary database\n- **Redis** - Caching and pub\u002Fsub\n- **WebSocket** - Real-time communication\n\n### Build Pipeline\n\n- **Node.js** - Server-side runtime\n- **Sharp** - High-performance image processing\n- **AWS SDK** - S3 storage operations\n- **Worker Threads\u002FCluster** - Parallel processing\n- **EXIF-Reader** - Metadata extraction\n\n### Storage Adapters\n\nDesigned with adapter pattern for flexibility:\n\n- **S3-Compatible** - AWS S3, MinIO, Backblaze B2, Alibaba Cloud OSS\n- **GitHub** - Use GitHub repository as storage\n- **Eagle** - Import from Eagle app library\n- **Local File System** - For development and testing\n\n## 🛠️ Development\n\n### Prerequisites\n\n- Node.js 18+\n- pnpm 10+\n- TypeScript 5.9+\n\n### Project Setup\n\n```bash\n# Install dependencies\npnpm install\n\n# Copy configuration files\ncp config.example.json config.json\ncp builder.config.default.ts builder.config.ts\n\n# Set up environment variables\ncp .env.template .env\n# Edit .env with your credentials\n```\n\n### Common Commands\n\n```bash\n# Development\npnpm dev                    # Start web + SSR\npnpm dev:be                 # Start backend services\npnpm --filter web dev       # Web app only\npnpm --filter @afilmory\u002Fssr dev  # SSR only\n\n# Build\npnpm build                  # Build production web app\npnpm build:manifest         # Generate photo manifest (incremental)\npnpm build:manifest -- --force  # Full rebuild\n\n# Documentation\npnpm docs:dev               # Start docs dev server\npnpm docs:build             # Build documentation\n\n# Code Quality\npnpm lint                   # Lint and fix\npnpm format                 # Format code\npnpm type-check             # Type checking\n```\n\n### Configuration Files\n\n**`config.json`** - Site presentation config:\n```json\n{\n  \"name\": \"My Gallery\",\n  \"title\": \"My Photography\",\n  \"description\": \"Capturing beautiful moments\",\n  \"url\": \"https:\u002F\u002Fgallery.example.com\",\n  \"accentColor\": \"#007bff\",\n  \"author\": {\n    \"name\": \"Your Name\",\n    \"url\": \"https:\u002F\u002Fexample.com\",\n    \"avatar\": \"https:\u002F\u002Fexample.com\u002Favatar.jpg\"\n  },\n  \"social\": {\n    \"github\": \"username\",\n    \"twitter\": \"username\"\n  },\n  \"map\": [\"maplibre\"],\n  \"mapStyle\": \"builtin\",\n  \"mapProjection\": \"mercator\"\n}\n```\n\n**`builder.config.ts`** - Photo processing config:\n```typescript\nimport { defineBuilderConfig } from '@afilmory\u002Fbuilder'\n\nexport default defineBuilderConfig(() => ({\n  storage: {\n    provider: 's3',\n    bucket: 'my-photos',\n    region: 'us-east-1',\n    \u002F\u002F ... other S3 settings\n  },\n  system: {\n    processing: {\n      defaultConcurrency: 10,\n      enableLivePhotoDetection: true,\n    },\n    observability: {\n      showProgress: true,\n      showDetailedStats: true,\n    },\n  },\n}))\n```\n\n## 🔌 Extending Afilmory\n\n### Custom Storage Provider\n\nImplement the `StorageProvider` interface:\n\n```typescript\nimport { StorageProvider } from '@afilmory\u002Fbuilder'\n\nclass MyStorageProvider implements StorageProvider {\n  async getFile(key: string): Promise\u003CBuffer | null> {\n    \u002F\u002F Your implementation\n  }\n\n  async listImages(): Promise\u003CStorageObject[]> {\n    \u002F\u002F Your implementation\n  }\n\n  \u002F\u002F ... other required methods\n}\n```\n\n### Custom Builder Plugin\n\nCreate a plugin for the build pipeline:\n\n```typescript\nimport { BuilderPlugin } from '@afilmory\u002Fbuilder'\n\nexport const myPlugin = (): BuilderPlugin => ({\n  name: 'my-plugin',\n  async onBeforeBuild(context) {\n    \u002F\u002F Pre-build hook\n  },\n  async onAfterBuild(context) {\n    \u002F\u002F Post-build hook\n  },\n})\n```\n\n## 📚 Documentation\n\n- **[Official Documentation](https:\u002F\u002Fdocs.afilmory.art\u002F)** - Complete guides and API reference\n- **[Quick Start Guide](https:\u002F\u002Fdocs.afilmory.art\u002Fgetting-started\u002Fquick-start)** - Get running in 5 minutes\n- **[SaaS Mode](https:\u002F\u002Fdocs.afilmory.art\u002Fsaas)** - Learn about hosted galleries\n- **[Storage Providers](https:\u002F\u002Fdocs.afilmory.art\u002Fstorage\u002Fproviders)** - Setup guides for all storage options\n- **[Deployment Guides](https:\u002F\u002Fdocs.afilmory.art\u002Fdeployment)** - Deploy to various platforms\n- **[API Reference](https:\u002F\u002Fdocs.afilmory.art\u002Fapi)** - Backend API documentation\n\n## 🤝 Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](.\u002FCONTRIBUTING.md) for details.\n\n### Development Workflow\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature\u002Famazing-feature`)\n3. Make your changes\n4. Run tests and linting (`pnpm test && pnpm lint`)\n5. Commit your changes (`git commit -m 'Add amazing feature'`)\n6. Push to the branch (`git push origin feature\u002Famazing-feature`)\n7. Open a Pull Request\n\n## 📄 License\n\nAttribution Network License (ANL) v1.0 © 2025 Afilmory Team\n\nSee [LICENSE](.\u002FLICENSE) for more details.\n\n## 🔗 Links\n\n- **[Official SaaS](https:\u002F\u002Fafilmory.art\u002F)** - Hosted gallery service\n- **[Documentation](https:\u002F\u002Fdocs.afilmory.art\u002F)** - Full documentation\n- **[GitHub](https:\u002F\u002Fgithub.com\u002FAfilmory\u002FAfilmory)** - Source code\n- **[Creator's Website](https:\u002F\u002Finnei.in)** - Project creator\n\n## 🙏 Acknowledgments\n\nBuilt with love by the Afilmory team and contributors. Special thanks to all photographers using Afilmory to share their work with the world.\n\n---\n\n\u003Cp align=\"center\">\n  If this project helps you, please give it a ⭐️ Star!\n\u003C\u002Fp>\n","Afilmory 是一个专为摄影师设计的现代化高性能照片画廊平台。该项目使用 React 和 TypeScript 构建，支持从 S3 或 GitHub 等多种存储源自动同步照片，并提供专业的 EXIF 详细信息展示、地图定位以及流畅的 WebGL 图像查看器。Afilmory 的核心功能包括高响应性的 Masonry 布局、现代化的用户界面和体验、增量同步等，确保了高效的数据处理与优质的浏览体验。它适用于需要在线展示摄影作品的专业摄影师或摄影爱好者，无论是通过官方提供的 SaaS 服务快速部署，还是选择自托管以获得更高的控制权，Afilmory 都能很好地满足需求。",2,"2026-06-11 03:47:36","high_star"]