Afilmory (/əˈfɪlməri/, "uh-FIL-muh-ree") is a term created for personal photography websites, blending Auto Focus (AF), aperture (light control), film (vintage medium), and memory (captured moments).
A modern photo gallery website built with React + TypeScript, supporting automatic photo synchronization from multiple storage sources (S3, GitHub), featuring high-performance WebGL rendering, masonry layout, EXIF information display, thumbnail generation, and more.
Live Photo Galleries:
Designed with adapter pattern, supporting multiple storage backends:
To achieve incremental builds in CI, it is necessary to configure a cache repository, which will pull the cache before each build and upload the build results after the build.
{
"repo": {
"enable": true,
"url": "https://github.com/username/gallery-assets"
}
}
This will automatically pull resources from the remote repository, avoiding rebuilds each time.
In order to achieve uploading to the git repository, you need to provide a GIT_TOKEN and write it in the .env file.
provider: Storage provider (s3 | github)bucket: S3 bucket nameregion: S3 regionendpoint: S3 endpoint (optional)prefix: File prefixcustomDomain: Custom domainexcludeRegex: Regular expression to exclude files (optional)defaultConcurrency: Default concurrencydigestSuffixLength: The length of the SHA-256 digest appended to the photo ID.enableLivePhotoDetection: Enable Live Photo detectionshowProgress: Show build progressshowDetailedStats: Show detailed statisticsworker.workerCount: Number of worker processesworker.timeout: Worker timeout (milliseconds)worker.useClusterMode: Enable cluster modeverbose: Verbose logginglevel: Log level (info | warn | error | debug)outputToFile: Output to file# View help
pnpm run build:manifest -- --help
# Incremental update (default)
pnpm run build:manifest
# Force full update
pnpm run build:manifest -- --force
# Only regenerate thumbnails
pnpm run build:manifest -- --force-thumbnails
# Only regenerate manifest
pnpm run build:manifest -- --force-manifest
# Start development server
pnpm dev
# Build production version
pnpm build
builder.config.json firstImplement the StorageProvider interface to support new storage backends:
import { StorageProvider } from './src/core/storage/interfaces'
class MyStorageProvider implements StorageProvider {
async getFile(key: string): Promise<Buffer | null> {
// Implement file retrieval logic
}
async listImages(): Promise<StorageObject[]> {
// Implement image list retrieval logic
}
// ... other methods
}
Add custom processors in the src/core/image/ directory:
export async function customImageProcessor(buffer: Buffer) {
// Custom image processing logic
return processedBuffer
}
MIT License © 2025 Innei
If this project helps you, please give it a ⭐️ Star for support!