All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- S3 upload validation: Server-side contentType whitelist restricts uploads to image formats only (jpeg, png, webp, heic, heif, avif) and enforces file size limit
- LIKE injection prevention: Escape SQL wildcards (
%,_,\) in photo search input - Visibility enforcement: Public pages (travel, cities) now only return photos with
visibility: "public" - Protected procedures:
photos.getOneandphotos.getManyrestricted to authenticated users
- Vitest test framework: Test setup with mocks for React cache, next/headers, S3 client, and auth session
- Photo procedure tests: 16 test cases covering create, update, getOne, getMany, remove and edge cases
- Environment validation: Zod-based server env validation — app fails fast with clear errors on missing config
.dockerignore: Reduces Docker build context by excluding node_modules, .next, .git, IDE files, etc.
- Database transactions:
photos.createandphotos.removewrapped indb.transaction()for data consistency - ctx.db migration: All tRPC routers now use
ctx.dbinstead of directdbimports for better testability - DB connection pool caching: Cached on
globalThisto prevent connection pool leaks during Next.js HMR - Docker secrets externalized:
docker-compose.ymlanddocker-compose.standalone.ymluse${VAR:-default}syntax, overridable via.env - Error handling:
photos.removere-throwsTRPCErrorto preserve original error codes - updatedAt timestamps: Photo updates now correctly refresh the
updatedAtfield - Remove procedure cleanup: Merged duplicated city set update branches, S3 delete moved after DB commit
- Removed unused
select()query after city set upsert in photo creation - Removed empty
elseblock in photo creation procedure
- 19 commits since v2.2.0
- 37 files changed
- +1,379 insertions, -676 deletions
- Docker Support: Full Docker deployment with RustFS and Standalone modes
- Screensaver Feature:
- Animated grid screensaver with photo flip transitions
- Settings modal with fullscreen toggle and auto-hide controls
- Photo data prefetching for smooth transitions
- Individual Photograph Pages:
- Dedicated photo detail view with metadata generation
- Blurred background image effect
- Loading skeleton state
- Cloudflare Image Loader: Optimized image delivery via Cloudflare
- Enhanced Mapbox:
- Multi-marker support with drag-and-drop positioning
- Map auto-centering when selecting photos in discover view
- Limited zoom level to 10 for better UX
- Photo Sorting: Sort photos by date with newest/oldest first options
- PostgreSQL Support: Added PostgreSQL dependencies for database flexibility
- Next.js: Upgraded from 16.0.0 → 16.0.7 → 16.0.10
- UI Improvements:
- Increased city sets display limit from 9 to 12
- Improved photo preview card responsive layout and styling
- Better screensaver grid with fixed row count and dynamic sizing
- Code Organization:
- Renamed and reorganized S3 utility functions and client files
- Renamed blog components and removed PostPreview wrapper
- Standardized zod imports and use native validators
- Standardized onMarkerDragEnd callback signature
- Fixed sidebar skeleton width calculation
- Addressed YouTube extension typing issues
- Updated image placeholder extension
- Added cache invalidation for city sets
- Removed unused limit parameter from getCitySets procedure
- Removed user-card component from auth module
- Removed debugging console logs
- Added screenshots section to README with home page and dashboard images
- Added warning about custom image loader configuration for non-Cloudflare R2 users
- 31 commits since v2.1.0
- 75 files changed
- +1,721 insertions, -1,722 deletions
- Mapbox Integration: Interactive map embeds with location toolbar functionality
- Interactive map preview with zoom controls in MapboxToolbar dialog
- Drag rotate and drag pan controls for enhanced map interaction
- Location-based content embedding support
- Editor Toolbar Enhancements:
- Dedicated Heading toolbar component for better text formatting
- Separate Color and Highlight toolbar components for improved UX
- Numeric font size display replacing generic Type icon
- Editor Performance: Optimized editor toolbar performance using
useEditorStatehook - Code Organization:
- Extracted Tiptap editor styles to dedicated CSS file for better maintainability
- Normalized YouTube extension indentation from 4 spaces to 2 spaces
- Image Responsiveness: Improved image component responsiveness and simplified RichTextViewer
- Added explicit
type="button"attribute to prevent unintended form submissions in editor components
- 28 files changed
- +1,846 insertions, -750 deletions
- Initial stable release