Sign inSign up

hoshinosuzumi/chronoframe

By hoshinosuzumi

•Updated about 2 months ago

Personal gallery application with online photo management, supporting Live Photos, EXIF parsing.

Image
Content management system
0

10K+

hoshinosuzumi/chronoframe repository overview

A smooth photo display and management application, supporting multiple image formats and large-size image rendering.

Useful links: Live Demo⁠ | Documention⁠ | GitHub Repository⁠


⁠✨ Features

⁠🖼️ Powerful Photo Management
  • Manage photos online - Easily manage and browse photos via the web interface
  • Explore map - Browse photo locations on a map
  • Smart EXIF parsing - Automatically extracts metadata such as capture time, geolocation, and camera parameters
  • Reverse geocoding - Automatically identifies photo shooting locations
  • Multi-format support - Supports mainstream formats including JPEG, PNG, HEIC/HEIF
  • Smart thumbnails - Efficient thumbnail generation using ThumbHash
⁠🔧 Modern Tech Stack
  • Nuxt 4 - Built on the latest Nuxt framework with SSR/SSG support
  • TypeScript - Full type safety
  • TailwindCSS - Modern CSS framework
  • Drizzle ORM - Type-safe database ORM
⁠☁️ Flexible Storage Solutions
  • Multiple storage backends - Supports S3-compatible storage, GitHub (WIP), and local filesystem (WIP)
  • CDN acceleration - Configurable CDN URL for faster photo delivery

⁠🐳 Deployment

We recommend deploying with the prebuilt Docker image. View the image on ghcr⁠

Before deployment, create a .env file and configure environment variables. Refer to .env.example⁠.

# Admin user email (required)
CFRAME_ADMIN_EMAIL=
# Admin user name (default to Chronoframe, optional)
CFRAME_ADMIN_NAME=
# Admin user password (default to CF1234@!, optional)
CFRAME_ADMIN_PASSWORD=

# App info
NUXT_PUBLIC_APP_TITLE=
NUXT_PUBLIC_APP_SLOGAN=
NUXT_PUBLIC_APP_AUTHOR=
NUXT_PUBLIC_APP_AVATAR_URL=

# Mapbox access token for map features, Mapbox GL JS (Client-side, public)
NUXT_PUBLIC_MAPBOX_ACCESS_TOKEN=
# Mapbox secret access token for server-side, Mapbox Search API (Reverse Geocoding)
NUXT_MAPBOX_ACCESS_TOKEN=

# Storage provider (s3/github/local)
NUXT_STORAGE_PROVIDER=s3
# S3 storage config
NUXT_PROVIDER_S3_ENDPOINT=
NUXT_PROVIDER_S3_BUCKET=chronoframe
NUXT_PROVIDER_S3_REGION=auto
NUXT_PROVIDER_S3_ACCESS_KEY_ID=
NUXT_PROVIDER_S3_SECRET_ACCESS_KEY=
NUXT_PROVIDER_S3_PREFIX=photos/
NUXT_PROVIDER_S3_CDN_URL=

# Session password (32 chars, required)
NUXT_SESSION_PASSWORD=

# GitHub OAuth
NUXT_OAUTH_GITHUB_CLIENT_ID=
NUXT_OAUTH_GITHUB_CLIENT_SECRET=
⁠Docker

Run with customized environment variables:

docker run -d --name chronoframe -p 3000:3000 -v $(pwd)/data:/app/data --env-file .env ghcr.io/hoshinosuzumi/chronoframe:latest
⁠Docker Compose

Create docker-compose.yml:

services:
  chronoframe:
    image: ghcr.io/hoshinosuzumi/chronoframe:latest
    container_name: chronoframe
    restart: unless-stopped
    ports:
      - '3000:3000'
    volumes:
      - ./data:/app/data
    env_file:
      - .env

Start:

docker-compose up -d
⁠Environment Variables
VariableDescriptionDefaultRequired
CFRAME_ADMIN_EMAILEmail of the initial admin userNoneYes, must be the GitHub account email used for login
CFRAME_ADMIN_NAMEUsername of the initial adminChronoframeNo
CFRAME_ADMIN_PASSWORDPassword of the initial adminCF1234@!No
NUXT_PUBLIC_APP_TITLEApplication titleChronoFrameNo
NUXT_PUBLIC_APP_SLOGANApplication sloganNoneNo
NUXT_PUBLIC_APP_AUTHORApplication authorNoneNo
NUXT_PUBLIC_APP_AVATAR_URLApplication avatar URLNoneNo
NUXT_PUBLIC_MAPBOX_ACCESS_TOKENMapbox access token for map serviceNoneYes
NUXT_MAPBOX_ACCESS_TOKENMapbox access token for location infoNoneNo
NUXT_STORAGE_PROVIDERStorage provider (s3, github, local)s3Yes
NUXT_PROVIDER_S3_ENDPOINTS3 endpointNoneRequired if provider is s3
NUXT_PROVIDER_S3_BUCKETS3 bucket namechronoframeRequired if provider is s3
NUXT_PROVIDER_S3_REGIONS3 bucket regionautoRequired if provider is s3
NUXT_PROVIDER_S3_ACCESS_KEY_IDS3 access key IDNoneRequired if provider is s3
NUXT_PROVIDER_S3_SECRET_ACCESS_KEYS3 secret access keyNoneRequired if provider is s3
NUXT_PROVIDER_S3_PREFIXS3 object prefixphotos/No
NUXT_PROVIDER_S3_CDN_URLS3 CDN URLNoneNo
NUXT_OAUTH_GITHUB_CLIENT_IDGitHub OAuth app Client IDNoneYes
NUXT_OAUTH_GITHUB_CLIENT_SECRETGitHub OAuth app Client SecretNoneYes
NUXT_SESSION_PASSWORDSession encryption password (32 chars)NoneYes

⁠📖 User Guide

If CFRAME_ADMIN_EMAIL and CFRAME_ADMIN_PASSWORD are not set, the default admin account is:

⁠Logging into the Dashboard
  1. Click avatar to sign in with GitHub OAuth or use email/password login
⁠Uploading Photos
  1. Go to the dashboard at /dashboard
  2. On the Photos page, select and upload images (supports batch & drag-and-drop)
  3. System will automatically parse EXIF data, generate thumbnails, and perform reverse geocoding

Tag summary

Content type

Image

Digest

sha256:2edf0ef29…

Size

143.4 MB

Last updated

about 2 months ago

docker pull hoshinosuzumi/chronoframe:nightly