- Invalidate slide timer during reset and guard nextSlide() when payload cleared to stop stale timer triggering false "No media files" state
- Remove sensitive logging from EnteCrypto and CastFileService
- Redact cast token from logs
Bug fix identified with GPT-5 preview assistance.
Co-Authored-By: Claude <noreply@anthropic.com>
Introduces a new tvOS application that enables users to cast and view
their Ente Photos on Apple TV. The app includes pairing functionality,
slideshow capabilities, and video playback support.
Key components:
- Cast app with SwiftUI interface for Apple TV
- EnteCast package for casting functionality and file management
- EnteNetwork package for API communication
- EnteCrypto package for secure authentication
- EnteCore package for shared utilities
- Custom fonts and branding assets
- Pairing view for device connection
- Slideshow and video player views
- Screen saver management
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
Authentication service was not working on android as `local_auth`
requires the use of a `FragmentActivity` instead of an `Activity` in
`MainActivity.kt`
Also updated `AndroidManifest.xml` file to include the USE_BIOMETRIC
permissions:
## Description
### Collection Sharing Feature Implementation
This PR implements a collection sharing functionality for locker,
allowing users to share collections with others and manage shared access
through various methods.
## Key Features
1. **Collection Sharing Mechanisms**
- Share collections via links
- Manage shared access with specific users
- Configure link expiry and device limits
2. **User Management** in shared collections
- Added participant (viewer/ collaborator)
- Implemented leave collection functionality
- Added user permissions and access controls
3. **UI Enhancements**
- New collection view types (main, outgoing, incoming)
- Grid view for collections
- Enhanced menu sections and descriptions
- Improved sharing dialogs and UI components
Replace sqflite with sqlite_async as the primary database package since the project has migrated to using sqlite_async.
Co-Authored-By: Claude <noreply@anthropic.com>
These test commands are not confirmed to be working correctly and have been removed from the documentation.
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
- Use `load` instead of `view`, since latter is read-only
- When loading fails in rust, delete index file in dart side and try
again
- Atomically save index file by first writing to temp file
## Tests
Tested in debug mode on my pixel phone.
Add three mandatory development practices:
1. Run flutter analyze after every change - zero issues required
2. Always reuse existing components - search before creating
3. Use Ente design system - no hardcoded colors or text styles
Co-Authored-By: Claude <noreply@anthropic.com>
Create comprehensive development guide from /init command including:
- Project philosophy and privacy focus
- Monorepo context and structure
- Development commands (melos and flutter)
- Architecture overview with service patterns
- Security architecture details
- Development setup requirements
Co-Authored-By: Claude <noreply@anthropic.com>
Updated cLTitle2 from "Manual video stream generation" to "Video streaming enhancements" across all supported locales to match the updated English copy.
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace withOpacity() with withValues(alpha:)
- Replace onPopInvoked with onPopInvokedWithResult
- Update MaterialState references to WidgetState
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace old changelog entries with new ones across all supported languages
- Add Similar Images, Manual video stream generation, and Performance Improvements features
- Remove outdated entries for Advanced Image Editor, Smart Albums, Improved Gallery, and Faster Scroll
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
This fixes https://github.com/ente-io/ente/issues/3428
This was broken because of
https://github.com/eaceto/flutter_local_authentication/issues/8
I've also added that if the app is locked manually, the macOS Touch ID
API won't be called until the user either presses the unlock button
again or unfocuses the app and then focuses back on it. This behavior
also applies when the app window is closed and then reopened.
## Summary
Rust CLI achieves feature parity with Go CLI for photos app core
functionality
## Changes
- Export, sync, and incremental updates working
- Hash-based deduplication and live photo support
- Public magic metadata for renamed files
- Progress indicators for downloads
## Remaining
- Export filters (album, date range)
- Resume interrupted downloads
- Shared/hidden album support
- Move isCurrentlyProcessing to widget state for better performance
- Only call setState when processing state actually changes
- Add comprehensive processing status handling (retry, compressing, uploading)
- Remove redundant service calls from build method
- Clean up unnecessary early returns and duplicate logic
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
This PR adds a custom icon for Parallels.
- Added `parallels.svg` under
`mobile/apps/auth/assets/custom-icons/icons/`
- Updated `custom-icons.json` with:
- title: "Parallels"
- slug: "parallels"
- hex: #E61E25
- altNames: ["Parallels Desktop", "Parallels VM"]
The icon is optimized (well under 50KB) and uses the official Parallels
red (#E61E25).
Remove languages from _getLanguageName that don't have >90% translation
coverage and aren't in appSupportedLocales (Finnish, Korean, Arabic).
Also improve Chinese locale display.
- Removed fi, ko, ar cases that don't meet translation threshold
- Fixed Chinese locale handling to properly show "中文 (简体)" for zh_CN
- Ensures only properly translated languages appear in the picker
Co-authored-by: Claude <noreply@anthropic.com>
Replace AppLocalizations.supportedLocales with a curated list of properly
translated locales in the Photos app. This fixes the issue where unsupported
language codes (Bg, Be, Ca, Cs, etc.) were appearing in the language selector
without proper language name formatting.
- Add custom appSupportedLocales list with only >90% translated languages
- Update all references throughout Photos app to use the custom locale list
- Ensures only properly supported languages appear in the language picker
Co-authored-by: Claude <noreply@anthropic.com>
- Add rename detection by tracking files via ID in metadata
- Remove old files (including live photo MOV components) when renamed
- Copy live photo MOV components during hash deduplication
- Preserve file deduplication optimization while handling renames correctly
This ensures that when a file is renamed in Ente, the old file is removed
and replaced with the renamed version, matching the Go CLI's behavior.
Co-Authored-By: Claude <noreply@anthropic.com>
Changed metadata export to match Go CLI's timestamp format.
Timestamps now serialize as ISO 8601 strings with timezone offset
(e.g., "2025-07-23T19:48:06.098+05:30") instead of Unix microseconds.
Also fixed clippy warnings to ensure CI compliance.
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed export to properly organize files into album folders by:
- Fetching files from all collections using /collections/v2/diff endpoint
- Decrypting encrypted collection names to get actual album names
- Using decrypted album names for folder organization
Files now export to proper album folders instead of all going to
"Uncategorized". Tested and verified with local data.
Co-Authored-By: Claude <noreply@anthropic.com>
When users click "Create Stream" on files already in queue from
previous sessions, ensure processing actually starts even if the
file was previously stalled due to ML blocking.
Add forceProcess parameter to queueFiles() to bypass the existing
queue check and trigger processing of stalled manual queue items.
When ML is enabled but not running, the compute controller blocks
all stream requests due to _waitingToRunML flag. This prevents
users from manually creating video streams even though ML isn't
actively using resources.
Add bypassMLWaiting parameter to allow manual stream creation
to proceed regardless of ML waiting state, improving UX.
## Description
Previously, when _loadWithRetry returned null due to widget unmounting,
the code incorrectly assumed the local file was deleted and would remove
database reference of the file and which would trigger re-upload of the
file.
Previously, when _loadWithRetry returned null due to widget unmounting,
the code incorrectly assumed the local file was deleted and would remove
database references or delete the file. This could lead to data loss.
Changes:
- Add new WidgetUnmountedException to centralized exceptions.dart for reuse
- Throw WidgetUnmountedException instead of returning null when widget unmounts
- Handle WidgetUnmountedException separately in error handler with appropriate logging
- Still set _errorLoadingLocalThumbnail flag to prevent retry attempts
Using Exception instead of Error follows Dart conventions:
- Exceptions are for recoverable runtime conditions (like widget unmounting)
- Errors are for programming mistakes that shouldn't be caught
This ensures that widget unmounting is properly distinguished from actual
file access failures.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Reverts the change from commit 1f1cad181f
which reduced galleryThumbnailDiskLoadDeferDuration from 500ms to 80ms.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
The reverted changes were intended to solve the issue #6957 fixed. So
these changes are no longer needed and there are doubts if they are
causing regressions related to thumbnail loading.
## Tests
Removes unused pre-installed software to free ~30-45GB:
- .NET SDK (~20-25GB)
- Haskell compiler (~5-8GB)
- Boost libraries (~1-2GB)
- Cached tool versions (~5-10GB)
Includes timing and space metrics for each removal
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
- Clear vectorDB index on logout
- Revert to using `view` on index
- Use `.usearch` for index file
- Minor design changes
## Tests
Tested in debug mode on my pixel phone.
## Summary
- Modified `_checkFileForPreviewCreation` method to accept `isManual`
parameter
- Bypass 500MB file size and 60 second duration limits when user
manually triggers video stream processing
- Maintains size/duration restrictions for automatic streaming to
preserve device performance
## Test plan
- [x] Manual Create/Recreate Stream button bypasses 500MB and 60 second
limits
- [x] Automatic streaming still respects size and duration restrictions
- [x] Files larger than 500MB or longer than 60 seconds can be manually
processed
Allow manual stream requests to bypass the 500MB file size and 60-second
duration limits by passing isManual parameter to _checkFileForPreviewCreation.
This ensures users can manually process large files even if they exceed the
automatic streaming limits.
## Summary
- Manual Create/Recreate Stream button presses now bypass user
interaction timer for immediate processing
- Fixed multiple concurrent streaming processes bug in ComputeController
- Fixed video streaming description text display spacing in advanced
settings
- Maintains device health and ML priority checks for all streaming
requests
## Tests
- [x] Manual Create/Recreate Stream button bypasses interaction timer
- [x] Automatic streaming still respects interaction timer
- [x] Only one streaming process allowed at a time
Remove condition allowing additional stream requests when already streaming to ensure only one stream process runs at a time.
Co-authored-by: Claude <noreply@anthropic.com>
## Summary
- Split videoStreamingDescription into separate line1/line2 localization
keys
- Remove TextAlign.justify from enabled state to fix awkward word
spacing
- Standardize text rendering between enabled and disabled states
- Both states now display description consistently without spacing
issues
## Test plan
- [x] Verify enabled state displays as single line without spacing
issues
- [x] Verify disabled state shows proper line breaks in onboarding
- [x] Confirm localization keys generate correctly
- [x] Run dart format and dart analyze (no issues)
Fixes video streaming settings page text display inconsistencies.
- Split videoStreamingDescription into separate line1/line2 localization keys
- Remove TextAlign.justify from enabled state to fix awkward word spacing
- Standardize text rendering between enabled and disabled states
- Both states now display description consistently without spacing issues
Co-authored-by: Claude <noreply@anthropic.com>
Export album and file metadata to .meta folders within each album directory.
Enables incremental sync and compatibility with Go CLI exports.
Co-Authored-By: Claude <noreply@anthropic.com>
Switch from date-based (YYYY/MM-Month) to album-based directory structure
to ensure compatibility with Go CLI. Files now export to AlbumName/ folders
with "Uncategorized" for files without albums.
Co-Authored-By: Claude <noreply@anthropic.com>
Align with Go CLI by integrating sync into export workflow.
Update CLAUDE.md to prevent default template usage in commits.
Co-Authored-By: Claude <noreply@anthropic.com>
- Hash-based file deduplication prevents duplicate exports
- Live photo extraction from ZIP archives
- Update conversion status documenting feature completion
- Make commit guidelines prominent in CLAUDE.md
- Remove redundant commit format section
Co-Authored-By: Claude <noreply@anthropic.com>
Check both public magic metadata (for edited names) and regular metadata
when determining file names during export and sync, matching Go CLI behavior
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
- [x] Fix Spacing in Video streaming settings
- [x] Update copy in Video Streaming settings
- [x] Disable debug notifications for work manager in iOS
## Tests
- Add configurable retry with exponential backoff for API calls
- Handle 429 and 5xx errors with automatic retries
- Add export filters for albums, shared, and hidden collections
- Fix formatting and clippy warnings to pass CI checks
Co-Authored-By: Claude <noreply@anthropic.com>
- Handle non-interactive mode in account add command
- Fix cross-filesystem file move issue by using copy+delete instead of rename
- Successfully tested downloading files from local server
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
When using Auth without backup, it was giving a error `Offline key is
missing`
**Reason**: During the `init` of `BaseConfiguration` if the `tokenKey`
is not set, we clear all the keys in the secure storage, and in this
process the `offlineAuthSecretKey` was also getting cleared
**Fix** Fixed by skipping the deletion of `offlineAuthSecretKey`
## Tests
[Test Video](https://wormhole.app/qz3mol#Dlhr0NRpVQVQsrid2X-quA)
Since the CLI hasn't been released yet, we don't need to maintain
backward compatibility. This commit removes unnecessary compatibility
code to simplify the codebase.
Changes:
- Remove id field from Account struct (use user_id directly)
- Remove update_file_local_path legacy wrapper method
- Use mark_file_synced directly instead of the wrapper
- Update all references from account.id to account.user_id
This results in cleaner, more maintainable code without unnecessary
compatibility layers.
Co-Authored-By: Claude <noreply@anthropic.com>
Since user_id is globally unique in Ente's system (like collection_id and
file_id), we can eliminate artificial primary keys and use the actual IDs
directly. This simplifies the schema and reduces redundancy.
Changes:
- Use (user_id, app) composite primary key in accounts table
- Use (user_id, app) composite primary key in secrets table
- Remove account_id references, use user_id directly
- Update collections table to use owner field (user_id)
- Update files table to use owner_id field (user_id)
- Remove account_id from album_files table
- Update sync_state table to use (user_id, app) primary key
- Update all storage methods to use new schema
- Update commands to pass correct parameters to storage methods
- Update indices for better query performance
This aligns with Ente's API design where these IDs are guaranteed to be
globally unique, eliminating the need for artificial primary keys.
Co-Authored-By: Claude <noreply@anthropic.com>
Collapsed nested if statement in sync.rs to satisfy clippy's
collapsible-if lint rule. This change is required for CI to pass
with the updated Rust version.
Co-Authored-By: Claude <noreply@anthropic.com>
Since collection_id and file_id are globally unique across all users in
Ente's API, we can use them directly as primary keys instead of creating
artificial auto-increment IDs. This simplifies the schema and reduces
redundancy.
Changes:
- Use collection_id as primary key in collections table
- Use file_id as primary key in files table
- Use composite primary key (album_id, file_id) in album_files table
- Update all related SQL queries to match new schema
- Add appropriate foreign key constraints
- Optimize indices for the new structure
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix collapsible if statement warnings in sync.rs and files.rs
- Update CLAUDE.md with clearer CI requirements
- Remove misleading auto-fix command that doesn't catch all issues
- Emphasize that ALL checks must pass before committing
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
- Integrated DownloadManager with sync command for actual file downloads
- Implemented proper sync state tracking using is_synced_locally flag
- Fixed database persistence by preserving sync state during updates
- Added proper collection key decryption for file downloads
- Files are only downloaded once and marked as synced
- Cleaned up schema - removed migrations since this is new code
- Fixed deserialization issues with RemoteFile thumbnail field
- Added proper error handling for missing collection keys
The sync command now:
1. Fetches metadata for collections and files
2. Downloads files that haven't been synced yet
3. Marks files as synced to avoid re-downloading
4. Properly handles existing files on disk
This matches the Go CLI's approach of using a synced flag rather than
checking file existence on every sync.
Co-Authored-By: Claude <noreply@anthropic.com>
- Added local_path column to files table for tracking downloaded files
- Implemented get_pending_downloads() to find files without local_path
- Integrated DownloadManager into sync command for full file downloads
- Added collection key decryption for file downloads
- Generate proper export paths with date/album structure
- Track successful downloads and update database with local paths
- Added migration to add local_path column to existing databases
The sync command now supports full file downloads (not just metadata).
Files are downloaded to the export directory with proper organization.
Co-Authored-By: Claude <noreply@anthropic.com>
- Fixed formatting issues in sync/engine.rs
- Added #[allow(dead_code)] for unused storage field in DownloadManager
- Replaced manual clamp with .clamp() method
Co-Authored-By: Claude <noreply@anthropic.com>
Reverts ente-io/ente#6950
I rushed a bit, sorry. The PR wasn't meant to be merged yet (if ever)
and it won't work right now anyway. It was meant to create conversation
on the topic and then possibly merged and there may be concerns to this
as a company may not want their logo/wordmark altered but I'm not well
versed in this topic (idk maybe I'm overthinking this).
Discussion: #6951
## Description
The current Activision icon is too wide and small to be nicely displayed
in Auth so this PR adds a smaller one, just like the favicon on
Activision's [website](https://activision.com).
I know the Activision icon is pulled from simple-icons and I don't want
to get rid of that, just add an option for a smaller one, but I see that
the smaller Allegro icon is also added but it isn't displayed in the
icon picker and the icon from simple-icons takes precedence so you'd
have to figure this out.
## Tests
I haven't tested this.
## Description
- Small correction on the self-hosted docker exec command.
- Added tip on how to install Ente CLI.
In spirit of starting with a small PR :p
- Add new `sync` command to fetch collections and file metadata
- Change config directory from ~/.ente/ to ~/.config/ente-cli/ to avoid conflicts with Go CLI
- Fix sync engine to use correct API endpoints (/collections/v2/diff instead of /diff)
- Implement per-collection file syncing matching Go CLI behavior
- Fix foreign key constraints in database schema
- Add metadata-only and full sync options
- Store database path in Storage struct for creating new instances
- Successfully tested with real account: syncs 5 files and exports correctly
The sync command now properly fetches all collections and files from the API,
storing them in SQLite for offline access and incremental sync support.
Co-Authored-By: Claude <noreply@anthropic.com>
Security improvements:
- Remove all debug logs that output tokens, keys, or credentials
- Remove email addresses from debug output
- Remove encrypted keys and nonces from logs
- Remove specific account references from documentation
- Add security guidelines to CLAUDE.md
No sensitive information (PII, credentials, tokens) should be logged
even in debug mode. Updated guidelines to prevent future occurrences.
Co-Authored-By: Claude <noreply@anthropic.com>
- Mark streaming XChaCha20-Poly1305 implementation as complete
- Document successful export functionality with all decryption working
- Update testing status with successful real account exports
- Add recent achievements section highlighting key milestones
- Update feature parity progress checklist
- Document what components are complete vs remaining
The export functionality is now fully working with proper decryption
of collections, files, and metadata. Updated PR description as well.
Co-Authored-By: Claude <noreply@anthropic.com>
- Show progress for each exported file with count
- Improve export summary with emojis and better formatting
- Add contextual success messages based on export results
- Make export output more user-friendly
The export now provides clear feedback during the process and
a helpful summary at the end.
Co-Authored-By: Claude <noreply@anthropic.com>
- Implement chunked streaming decryption matching Go's 4MB buffer size
- Update file decryption to use decrypt_file_data instead of decrypt_stream
- Successfully tested with 33MB RAW image file
- All test files now decrypt correctly
Large files are now properly handled with chunked decryption, preventing
memory issues and matching the Go implementation's behavior.
Co-Authored-By: Claude <noreply@anthropic.com>
- Add streaming cipher module using libsodium's secretstream API
- Update file and metadata decryption to use streaming XChaCha20-Poly1305
- Fix decryption issues - files now properly decrypt
- Successfully tested with real account - exports working for smaller files
The export now correctly decrypts files using the same streaming cipher
as the Go implementation. Large files may need chunked decryption support.
Co-Authored-By: Claude <noreply@anthropic.com>
- Create metadata module with FileMetadata struct
- Decrypt file metadata to extract original filename
- Use original filename in export path generation
- Add proper file type detection from metadata
- Implement filename sanitization for filesystem safety
Files are now exported with their original names instead of generic IDs.
Co-Authored-By: Claude <noreply@anthropic.com>
- Add ChaCha20-Poly1305 decryption for downloaded files
- Decrypt file keys using master key
- Extract nonce from encrypted file data
- Add basic filename generation with extension detection
- Comment out sync modules temporarily due to model mismatches
The export command now properly decrypts files instead of saving them encrypted.
Next steps: extract original filenames from decrypted metadata.
Co-Authored-By: Claude <noreply@anthropic.com>
Ensure clippy commands use --all-targets --all-features flags to match
the CI environment exactly. This prevents CI failures from warnings that
weren't caught locally.
Co-Authored-By: Claude <noreply@anthropic.com>
Add explicit pre-commit commands that must be run before every commit
to ensure CI passes. These commands simulate the CI environment locally.
Co-Authored-By: Claude <noreply@anthropic.com>
- Applied cargo fmt to ensure consistent formatting
- Fixed all clippy warnings (uninlined_format_args)
- Code now passes all CI checks with RUSTFLAGS="-D warnings"
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
Parameters were sorted based on name by intl plugin which is a breaking
change.
We now have shifted to named params for translations so position won't
change.
## Tests
- Fix token encoding to use base64 URL with padding (matching Go implementation)
- Add export command that iterates through collections and fetches files
- Update API models to handle actual server response field names (ownerID vs ownerId)
- Fix file download URLs for local/dev environments
- Implement proper directory structure creation (YYYY/MM-Month format)
- Add collection attributes and public URL models for complete API compatibility
- Successfully exports encrypted files from both local and production endpoints
The export command now:
- Fetches all collections for an account
- Iterates through each collection to get files
- Downloads encrypted files and saves them to the export directory
- Skips already downloaded files to support incremental exports
Note: Files are still encrypted; decryption will be implemented in a future commit.
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
- Put the rust generated bindings in gitignore
- Use `view` instead of `load` on VectorDB index to use less RAM
- Various UI changes
## Tests
Tested in debug mode on my pixel phone.
- Add endpoint field to accounts database table with default to production API
- Update Account model to include endpoint field
- Add --endpoint flag to account add command only
- Remove ENTE_ENDPOINT environment variable support
- Update account list to display endpoints in readable format
- Each account now maintains its own endpoint, preventing confusion between test and production environments
Co-Authored-By: Claude <noreply@anthropic.com>
- Use std::ffi::c_char for libsodium FFI context parameter cast
- Fix all clippy warnings to pass CI with RUSTFLAGS="-D warnings"
- Update CLAUDE.md with FFI casting guidance for future development
This ensures the code passes all CI checks including the stricter
clippy settings used in GitHub Actions.
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed issues preventing successful authentication:
- Corrected Argon2 memory limit handling (API sends bytes, not KB)
- Replaced Blake2b with crypto_kdf_derive_from_key for login subkey derivation
- Fixed serde field names to match API expectations (srpUserID, sessionID)
- Added non-interactive mode for CLI testing
- Added support for ENTE_ENDPOINT environment variable
The implementation now matches the web client's key derivation exactly,
enabling successful authentication with both local and production servers.
Co-Authored-By: Claude <noreply@anthropic.com>
Add comprehensive account management functionality with secure SRP authentication.
This enables users to add, list, update, and manage multiple Ente accounts
for photos, locker, and auth apps.
Key features:
- Complete account add flow with SRP authentication
- Two-factor authentication support (TOTP)
- Secure key decryption and storage
- Multi-account support with per-app configuration
- Account list and update commands
- Export directory management
- Interactive CLI prompts with dialoguer
The implementation integrates with the API client for authentication and
securely stores account credentials in SQLite.
Co-Authored-By: Claude <noreply@anthropic.com>
Add complete API client implementation with authentication, file operations,
and collection management. This enables the Rust CLI to interact with Ente
servers for photo backup and sync operations.
Key features:
- Multi-account token management with secure storage
- SRP authentication flow matching Go implementation
- Retry logic with exponential backoff for network resilience
- Full API coverage: auth, collections, files, trash, user details
- Request/response models for all API endpoints
- Separate download client for large file transfers
- Smart CDN routing for production file downloads
The implementation follows the conversion plan and maintains compatibility
with the existing Go CLI API patterns.
Co-Authored-By: Claude <noreply@anthropic.com>
Add detailed development commands, architecture overview, and module
descriptions to help future Claude instances understand the codebase
structure and development workflow.
Co-Authored-By: Claude <noreply@anthropic.com>
- Document current implementation status
- Detail API client implementation steps
- List all remaining components with specifications
- Include testing strategy and migration notes
- Provide file structure reference for navigation
- Add implementation guidelines and environment variables
This plan enables any developer to understand the project state
and continue the conversion work from the current point.
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace sled with SQLite for better reliability and tooling
- Create schema with tables for accounts, secrets, collections, files, and sync state
- Implement account storage with multi-account support
- Add configuration and sync state management
- Support for storing encrypted credentials separately
- Add indices for performance optimization
SQLite provides ACID transactions, better debugging tools, and a proven
track record for reliability with user data.
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
We depended on intl_utils but that had problems + it was not
auto-generating things when running `flutter pub get`
Now we are using pure intl implementation of l10n, by which generated
code would be less.
- [x] Removes generated locals
## Tests
## Description
Adds custom SVG icons for "CoinTracing", "VHV Versicherungen (German
Insurance Company)" and "HR Document Box".
SVG sourced from official CoinTracking press assets.
SVG sourced from Wikipedia for VHV Versicherungen.
For HR Document Box was no svg available, so i used a png to svg
converter.
## Tests
- Replace libc::c_char with std::ffi::c_char for password parameter
- Remove unnecessary libc dependency
- Use standard library FFI types (available since Rust 1.64)
This fixes the CI build error where libsodium expects *const c_char
for the password parameter in crypto_pwhash.
Co-Authored-By: Claude <noreply@anthropic.com>
For the current session cc was able to use that instruction to figure out all the linters etc to run. If that doesn't work in future sessions, we can use a longer instruction, something like what it itself suggested
## CI/CD Requirements
- Must pass `cargo fmt --check`
- Must pass `cargo clippy --all-targets --all-features`
- Must pass `RUSTFLAGS="-D warnings" cargo build`
- Fix all formatting before committing
- Address all clippy warnings
- Use `#![allow(dead_code)]` during development for unused code
## Code Quality
- Run `cargo fmt` before committing
- Fix clippy warnings: remove unnecessary casts, use idiomatic Rust
- Prefix unused variables with underscore
- Remove unused imports
- Fix code formatting with cargo fmt
- Remove unnecessary type casts
- Use range contains instead of manual comparison
- Prefix unused variables with underscore
- Remove unused imports
- Add allow(dead_code) for development phase
Co-Authored-By: Claude <noreply@anthropic.com>
Typical Claude Code commit message:
feat: implement user authentication
- Added login endpoint
- Implemented JWT tokens
- Created middleware
Created with Claude Code: https://claude.ai/code # <-- The promotional link
Co-authored-by: Claude <claude@anthropic.com> # <-- The co-author line
This memory is to ask claude to keep the co-author line but remove the self promo from the commit message it creates.
- Set up project structure mirroring Go CLI architecture
- Add dependencies with libsodium-sys-stable for all crypto operations
- Implement core crypto module with Argon2, ChaCha20-Poly1305, and Blake2b
- Create data models for accounts, files, and collections
- Set up Clap-based CLI framework with account, export, and version commands
- Add error handling with thiserror
- Configure for static linking to create standalone binaries
This establishes the foundation for converting the Ente CLI from Go to Rust,
with a focus on maintaining compatibility with existing libsodium-based crypto.
Co-Authored-By: Claude <noreply@anthropic.com>
## Description
Using `ColorFiltered` with `Blendmode.darken` introduces a performance
[issue](https://github.com/flutter/flutter/issues/174118) with flutter's
new rendering engine Impeller.
The fix uses an alternative method to that maintains the same UI
appearance as before.
This pr implements the feature to add a 2FA account by importing a QR
code image from the device gallery..
Adds a new "Import from gallery" button to the Floating Action Button
menu.
The button's text is localized, and its styling is consistent with the
app's theme.
How to Test:
Open the FAB menu and tap "Import from gallery".
1) Test with a valid 2FA QR code image. Expected: The account gets added
successfully.
2) Test with an image that has no QR code. Expected: A "No QR code
found" toast message appears.
3) Test with a QR code of plain text (like "hello "). Expected: An
"Invalid QR Code" dialog appears.
## Description
Implement TLS/SSL encryption for sending emails via SMTP. When an SMTP
provider explicitly requires TLS/SSL communication the current
implementation runs in a timeout and fails. A new configuration
parameter for smtp was added to enable TLS/SSL communication.
This would solve #5958
## Tests
I built a local docker image of my branch. The email provider I was
using is mailbox.org and using the tls configuration. Registering a new
user then resulted in a sent email containing the verification code.
I did not test a setup without TLS/SSL.
## Description
Widget tap was not opening the specified photo because the app group id
was not setting correctly when the method was being called.
## Tests
## Description
This PR updates documentation for S3 configuration with bucket-level
configuration for URL style and local buckets and updates needed
configuration that will make it intuitive for self-hosters.
## Description]
When switching between tabs on mobile, a white flash appear when
lockscreen is enable.
This PR fixes that by setting the background color to black for both
light and dark theme.
## Description
Few miscellaneous improvements for memories. Taking text embeddings from
assets, and better caching and choosing of which persons to show.
## Tests
Tested in debug mode on my pixel phone.
## Description
Introduces the similar images (debug) screen and similar images
functionality in the app. It doesn't include the final design, this PR
is more to get some things in main, so that the entire team can start
testing it. This PR also finally introduces functional rust code into
the mobile app, as well as a vector DB.
(Note that flutter_rust_bridge, needed for rust integration,
automatically formats certain dart code when generating bindings. So
some file changes in this PR are simply automatic formats and can be
ignored. Similarly, the `rust_builder` directory is mainly generated and
can be ignored.)
## Tests
Tested on my own device in both debug and release mode.
- Added Raider.IO SVG icon.
- Updated custom-icons.json to include the new icon.
Raider.IO is a platform that tracks World of Warcraft players'
performance.
- Added Raider.IO SVG icon.
- Updated custom-icons.json to include the new icon.
Raider.IO is a platform that tracks World of Warcraft players' performance.
## Description
## Tests
- Verified server db migrations is on 103
- Verified that duplicate custom domain results in error
- basic sanity testing for custom domain validation.
## Description
This PR upgrades flutter to stable version i.e. Flutter 3.32.8
- [x] Bump dependencies
- [x] Replace .withOpacity( with .withValues(alpha:
- [x] Fix broken l10n
- [x] Did some lint fixes
- [x] Update deprecated methods and arguments
- [x] Fix flutter_gen not found for Photos app (by removing the
l10n.yaml, fixing delegates, using `intl_utils/Flutter Intl`)
## Tests
- [x] Test app
- [x] Check upgraded deps
- [x] Test Deep links/Passkeys - Android
- [ ] Test Deep links/Passkeys - iOS
## Description
- [x] Create a new service to use for FFmpeg in an isolate'ed
environment
- [x] Apply this service wherever we use FFmpeg Kit
- [x] Make FFMpeg accessible in an isolate (background)
## Tests
- [x] Test FFmpeg intergrations
## Description
- Fix bottom navigation bar color in light theme
- Fix initial color in paint editor
- Tap to reset tune adjustment value (brightness, exposure, etc..) and
add haptics when crossing zero
## Description
On Android 16 with flutter upgrade, we are seeing `Could not decompress
image.` error for heic images taken from Iphone 16.
Instead of showing broken image, rendering the compressed version of the
image on UI.
Also, increased the minWidth/minWidth from default 1920/1080 to 8000/800
Refer:
https://pub.dev/packages/flutter_image_compress#minwidth-and-minheight
> If your image width is smaller than minWidth or height smaller than
minHeight, scale will be 1, that is, the size will not change.
```
E/FlutterJNI( 7914): Failed to decode image
E/FlutterJNI( 7914): java.io.IOException: getPixels failed with error invalid input
E/FlutterJNI( 7914): at android.graphics.ImageDecoder.nDecodeBitmap(Native Method)
E/FlutterJNI( 7914): at android.graphics.ImageDecoder.decodeBitmapInternal(ImageDecoder.java:1676)
E/FlutterJNI( 7914): at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1865)
E/FlutterJNI( 7914): at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1850)
E/FlutterJNI( 7914): at io.flutter.embedding.engine.FlutterJNI.decodeImage(FlutterJNI.java:571)
```
## Tests
Tested locally on Simulator with sample image.
## Description
After closing app or hidding the window on macos the dock icon still
appears even when the app is in tray which shouldn't happen this fixes
it
## Description
Fixed the broken link to custom-icons.md in CONTRIBUTING.md.
Also added new icons for Twitter (before rebrand), Animal Crossing, Best
Buy, Chucklefish, Toyhouse, and Art Fight.
I realized right after uploading a Best Buy icon that the Best Buy icon
already exists in the custom icon repositories. It doesn't show up when
I search for it in the Ente app (iOS), though, and I checked and there
are no updates for my app. I guess it wasn't pushed to the mobile app
yet?
My icon is called `best_buy.svg`. The one that was already there is
`bestbuy.svg`. Should I remove mine?
Thanks in advance!
Icons for Twitter (before rebrand), Art Fight, Toyhouse, Animal Crossing, Best Buy, and Chucklefish.
I wasn't able to find an official SVG of Toyhouse's icon or get it through inspect element, but I got it from here: https://logos.fandom.com/wiki/Toyhouse
Animal Crossing Leaf: Nintendo, Public domain, via Wikimedia Commons
Original Twitter logo: Martin Grasser, per source, Apache License 2.0 <http://www.apache.org/licenses/LICENSE-2.0>, via Wikimedia Commons
Best Buy: Best Buy, Public domain, via Wikimedia Commons
Chucklefish: https://en.wikipedia.org/wiki/File:Chucklefish.svg (Warns that this is not a free logo)
## Description
Adds 4 authenticate API for
- Creating link for individual file
- Update Link
- Delete Link
- Fetch all links (based on header, the server will return particular
app's link)
For link preview
- API to get Info (pending discussion)
- API to get file attributes (pending discussion)
- APIs to get thumbnail and file
- API to verify password
Pending
- [x] Clean up on account deletion
- [x] Clean up on file deletion
- [x] Clean up history for disabled links
## Tests
Basic santiy check during client integration
## Description
Update broken links in photos from the `Move auth/ to mobile/apps/auth`
in 99d7685be2
Updated the auth's contributing link to be consistent with the photos
## Tests
🔗
## Description
- This PR adds more logs for smart albums.
- Removes support of favorites and uncategorized for smart albums.
- Don't delete entry for smartConfig if collection is still present.
## Tests
## Description
Smart Album, without anything else.
### Auto-add people
Using this you can add person's automatically to the album you want.
## Tests
- [x] Files that are already hidden are not auto-added to the album
- [ ] Files that belong to some other users are not added to the album.
This will trigger a copy event, where file will be copied to user's
namespace.
## Description
This PR integrates a fully-featured advanced image editor which supports
the following features
- Added image adjustment tools (e.g., brightness, contrast, saturation)
- Enabled text annotations on images
- Added freehand drawing support
- Included sticker placement functionality
Add custom SVG icon for [Tally.so](https://tally.so/help/press-kit) in
accordance with their media kit to enhance branding.
Icon optimized with SVGOMG.
## Description
This PR updates docs for network status reporting in Ente Desktop on
Linux and removes documentation for object storage configuration which
will only be available in latest server image to reduce confusion.
## Description
- Better scrolling performance
- Gallery grouping options (day, week, month & year)
- New scrollbar
- Pinned to top header for each group in gallery.
Add custom SVG icon for [U.S. DHS](https://www.dhs.gov/) to enhance
branding.
Icon optimized with SVGOMG. It is relatively large because it is
elaborate and complex compared to most other icons.
I tried my best to minimize and strip unnecessary metadata and paths.
United States Department of Homeland Security (DHS) also shares the same
icon and branding for `altNames` provided:
- [United States Citizenship and Immigration Services
(USCIS)](https://www.uscis.gov/)
- [United States Immigration and Customs Enforcement
(ICE)](https://www.ice.gov/)
- [United States Customs and Border Protection
(CBP)](https://www.cbp.gov/)
since they are all subsidiaries of the former department.
## Description
This PR updates Ente CLI troubleshooting and email configuration along
with object storage configuration in configuration document.
This provides clarity for users who are facing keyring issues or with
bucket configuration.
## Description
This PR updates upgrading procedure to ensure lack of merge conflicts.
A minor grammar error in home page is fixed along with it.
It also fixes linting issues and minor grammatical errors.
## Description
This PR contains major revision for self-hosting documentation. Some
major changes are:
1. Up-to-date information for various installation methods
2. Documentation for configuration with examples
3. Documentation for administrative activities
4. Refactor community guides and include credits
5. Better UX for configuration by templated configuration
The setup includes Compose file that can be used for building from
source without hassle and
includes templated configuration files for ease-of-usage.
## Tests
- [x] I have tested the Docker Compose setup on my system
- [x] I have tested quickstart on my system
@@ -48,7 +48,11 @@ See [docs/](docs/README.md) for how to edit these documents.
## Code contributions
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](auth/docs/adding-icons.md), or fixing a specific bug.
If you'd like to contribute code, it is best to start small. Consider some well-scoped changes, say like adding more [custom icons to auth](mobile/apps/auth/docs/adding-icons.md), or fixing a specific bug. There is a (possibly outdated) list of tasks with the ["help wanted" or "good first issue"](<https://github.com/ente-io/ente/issues?q=state%3Aopen%20(label%3A%22good%20first%20issue%22%20OR%20label%3A%22help%20wanted%22%20)>) label too.
If you use any form of AI assistance, please include a co-author attribution in the commit for transparency.
In your PR, please include before / after screenshots, and clearly indicate the tests that you performed.
Code that changes the behaviour of the product might not get merged, at least not initially. The PR can serve as a discussion bed, but you might find it easier to just start a discussion instead, or post your perspective in the (likely) existing thread about the behaviour change or new feature you wish for.
description: Use your own domain when sharing photos and videos stored in Ente Photos
---
# Custom domains
Custom domains allow you to serve your public links with your own personalized domain.
For example, if I have an Ente album and wish to share it with my friends, I can go to the album's sharing settings and create a public link. When I copy this link, it will of the form of
```
https://albums.ente.io/?t=...
```
The custom domains feature allows you to instead create a link that uses your own domain, say
```
https://pics.example.org/?t=...
```
You don't need to run any servers or manage any services, Ente will still host and serve your album for you, the only thing that changes is that you can serve your links using your personalized domain.
## Availability
The custom domains feature requires the ability to publicly share albums which for abuse prevention reasons can only be done by people with an active Ente subscription.
## Setup
The setup involves two steps:
1. Letting Ente know about the domain you wish to use for serving your public links
2. Updating your DNS settings to point your domain (or subdomain) to **my.ente.io**
For people who are comfortable with changing DNS settings on their domain provider, this entire process is very simple will take a minute. For people who are not comfortable with changing DNS, we will provide a more detailed breakdown below.
Let's dive in.
To make the process concrete, let's assume we're trying to use _pics.example.org_ as our custom domain. Note that there is no restriction to use a subdomain, a top level domain can be used as a custom domain too. That is, either of _example.org_ or _subdomain.example.org_ is fine, Ente will work with both.
### Step 1 - Link your domain
The first step is to let Ente know about the domain or subdomain you wish to use by linking it to your account.
> [!WARNING]
>
> Currently (Sep 2025) the ability to link a custom domain is only present in Ente's web app, [web.ente.io](https://web.ente.io).
Head over to Preferences > Custom domains, in the domain field enter "pics.example.org" (replace with your subdomain) and press "Save". That's it. The linking is done.
### Step 2 - Add DNS entry
The second step is to add a CNAME entry in your DNS provider that forwards requests for pics.example.org (replace with your subdomain) to **my.ente.io**.
Specifically, you need to add a `CNAME record` from the domain (or subdomain) of your choice to `my.ente.io`. You can leave the `TTL` at its default.
| CNAME | Your subdomain, e.g `pics` | `my.ente.io` | Auto (default) |
The exact steps for doing this depend on the DNS provider that you're using.
> Your DNS provider usually is the service from which you bought your domain. The domain name seller will provide some sort of an admin panel where you can configure your DNS settings.
As concrete examples, here is how this step would look for Cloudflare:

Note that orange proxy option is off. And here is how it would look for Namecheap:

> [!NOTE]
>
> The examples are using "pics" as the subdomain, but that's just an example, you can use anything you like (or use "@" if you'd like to use the root domain itself).
The time it takes for DNS records to update is dependent on your DNS provider. Usually the changes should start reflecting within a few minutes, and should almost always reflect within an hour.
Once the DNS changes have been applied, then you can take any public link to your shared albums, replace `albums.ente.io` with your choice (e.g. `pics.example.org`), and the link will still work.
You don't need to do this manually though, the apps will do it for you. More on this in the next section. But first, some troubleshooting tips.
### Troubleshooting
If your domain is not working, go through the following checklist.
- The CNAME should be from your domain to my.ente.io, not the other way around. That is, `pics.example.org => my.ente.io`.
- If you're using Cloudflare DNS, make sure that the "Orange" proxy status toggle is off, and the Proxy status is the "Grey" DNS only.
## Using
Using is trivial. When you go to an album's sharing options and copy the link to it, Ente will automatically copy the link that uses your configured domain.
> [!WARNING]
>
> Currently (Sep 2025) the ability to automatically substitute your custom domain is present in Ente's web and mobile apps, but not in the desktop app (The next desktop version to be released will have that ability too).
## Unsetting
To stop using your custom domain, we need to undo the two steps we did during setup.
1. Unlink your domain in Ente. This can be done just by going to Preferences > Custom Domains, clearing the value in the "Domain" input and pressing "Update".
2. Remove the CNAME record you added during setup in your DNS provider.
## Implementation
Our engineers also wrote [explainer](https://ente.io/blog/custom-domains/) of how this works behind the scenes.
@@ -6,7 +6,7 @@ description: Removing duplicates photos using Ente Photos
# Deduplicate
Ente performs two different duplicate detections: one during uploads, and one
that can be manually run afterwards to remove duplicates across albums.
that can be manually run afterwards to remove duplicates and very similar files across albums.
## During uploads
@@ -16,7 +16,7 @@ When uploading, Ente will ignore exact duplicate files. This allows you to
resume interrupted uploads, or drag and drop the same folder, or reinstall the
app, and expect Ente to automatically skip duplicates and only add new files.
The duplicate detection works slightly different on each platform, to cater to
The duplicate detection works slightly differently on each platform, to cater to
the platform's nuances.
#### Mobile
@@ -48,7 +48,7 @@ to album", and the actual files are not re-uploaded.
## Manual deduplication
Ente also provides a tool for manual de-duplication in _Settings → Backup →
Ente provides a tool for manual de-duplication in _Settings → Backup → Free up space →
Remove duplicates_. This is useful if you have an existing library with
duplicates across different albums, but wish to keep only one copy.
@@ -57,6 +57,13 @@ single copy, and add symlinks to this copy within all existing albums. So your
existing album structure remains unchanged, while the space consumed by the
duplicate data is freed up.
## Filtering similar images
Ente also provides a tool for manual removal of images that are similar, but not the exact same, using our private ML. This feature can be found in _Settings → Backup → Free up space →
Similar images_. This is useful if you've taken a lot of similar photos, potentiall even in different albums, and want to keep only the best ones.
During this filtering process you can choose which photos to keep and which to delete for each set of similar images. Ente will then automatically add symlinks for the kept photos to any albums that only had the deleted images. This way you can easily prune similar images, without worrying about accidentally removing the best ones from a certain album.
## Adding to Ente album creates symlinks
Note that once a file is in Ente, adding it to another Ente album will create a
### Application reporting offline despite Internet connectivity
Due to unreliability of usage of `navigator.onLine` in Linux, the app may report that you are offline, even though the internet connection is functional.
You can resolve the issue by adding a dummy network interface using the following command:
```shell
ip link add dummy0 type dummy
ip addr add 10.10.10.1/24 dev dummy0
ip link set dummy0 up
```
Once the interface is up, Ente correctly detects that the system is online.
When thinking about backups, this translates into backing up the relevant state
from each of these:
1. For museum, you'd want to backup your `museum.yaml`, `credentials.yaml` or
any other custom configuration that you created. In particular, you should
backup the
[secrets that are specific to your instance](https://github.com/ente-io/ente/blob/74377a93d8e20e969d9a2531f32f577b5f0ef090/server/configurations/local.yaml#L188)
(`key.encryption`, `key.hash` and `jwt.secret`).
2. For postgres, the entire data volume needs to be backed up.
3. For object storage, the entire data volume needs to be backed up.
A common oversight is taking a lot of care for backing up the object storage,
even going as far as enabling replication and backing up the the multiple object
storage volumes, but not applying the same care to the database backup.
While the actual encrypted photos are indeed stored in the object storage,
**this encrypted data will not be usable without the database** since the
database contains information like a file specific encryption key.
Viewed differently, to decrypt your data you need three pieces of information:
1. The encrypted file data itself (which comes from the object storage backup).
2. The ([encrypted](https://ente.io/architecture/)) file and collection specific
encryption keys (which come from the database backup).
3. The master key (which comes from your password).
---
If you're starting out with self hosting, our recommendation is to start by
keeping a plaintext backup of your photos.
[You can use the CLI or the desktop app to automate this](/photos/faq/export).
Once you get more comfortable with the various parts, you can try backing up
your instance. As a reference,
[this document outlines how Ente itself treats backups](https://ente.io/reliability).
If you stop doing plaintext backups and instead rely on your instance backup,
ensure that you do the full restore process also to verify you can get back your
data. As the industry saying goes, a backup without a restore is no backup at
Any Linux or \*nix operating system, Ubuntu or Debian is recommended to have a
good Docker experience. Non-Linux operating systems tend to provide poor
experience with Docker and difficulty with troubleshooting and assistance.
#### Docker
Required for running Ente's server, web application and dependent services
(database and object storage)
## Getting started
## Set up the server
Run this command on your terminal to setup Ente.
@@ -39,17 +31,60 @@ Run this command on your terminal to setup Ente.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"
```
The above `curl` command pulls the Docker image, creates a directory `my-ente`
in the current working directory, prompts to start the cluster and starts all the containers required to run Ente.
This creates a directory `my-ente` in the current working directory, prompts to
start the cluster with needed containers after pulling the images required to
run Ente.

::: info

Make sure to modify the default values in `compose.yaml` and `museum.yaml` if
you wish to change endpoints, bucket configuration or server configuration.
> [!TIP] Important:
> If you have used quickstart for self-hosting Ente and are facing issues while > trying to run the cluster due to MinIO buckets not being created, please check [troubleshooting MinIO](/self-hosting/troubleshooting/docker#minio-provisioning-error)
>
>
:::
## Try the web app
Open Ente Photos web app at `http://<machine-ip>:3000` (or
`http://localhost:3000` if using on same local machine). Select **Don't have an
| `db.sslmode` | SSL mode for DB connection | `disable` |
| `db.user` | Database username | |
| `db.password` | Database password | |
| `db.extra` | Additional DSN parameters | |
### Object Storage
The `s3` section within `museum.yaml` is by default configured to use local
MinIO buckets when using `quickstart.sh` or Docker Compose.
If you wish to use an external S3 provider with SSL, you can edit the configuration with
your provider's credentials, and set `s3.are_local_buckets` to `false`. Additionally, you can configure this for specific buckets in the corresponding bucket sections in the Compose file.
If you are using default MinIO, it is accessible at port `3200`. Web Console can
be accessed by enabling port `3201` in the Compose file.
For more information on object storage configuration, check our
| `web` | `ENTE_API_ORIGIN` | Alias for `NEXT_PUBLIC_ENTE_ENDPOINT`. API Endpoint for Ente's API (Museum). | http://localhost:8080 |
| `web` | `ENTE_ALBUMS_ORIGIN` | Alias for `NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT`. Base URL for Ente Album, used for public sharing. | http://localhost:3002 |
Then the issue is that the password you're using is not the password postgres is
expecting (duh), and a potential scenario where that can happen is something
like this:
Then the issue is that the password you're using is not the password PostgreSQL
is expecting.
1. On a machine, you create a new cluster with `quickstart.sh`.
There are 2 possibilities:
2.Later you delete that folder, but then create another cluster with
`quickstart.sh`. Each time `quickstart.sh` runs, it creates new credentials,
and then when it tries to spin up the docker compose cluster, use them to
connect to the postgres running within.
1.If you are using Docker Compose for running Ente from source, you might not
have set the same credentials in `.env` and `museum.yaml` inside
`server/config` directory. Edit the values to make sure the correct
credentials are being used.
2. When you have created a cluster in `my-ente` directory on running
`quickstart.sh` and later deleted it, only to create another cluster with
same `my-ente` directory.
3. However, you would already have a docker volume from the first run of
`quickstart.sh`. Since the folder name is the same in both cases `my-ente`,
Docker will reuse the existing volumes (`my-ente_postgres-data`,
`my-ente_minio-data`). So your postgres is running off the old credentials,
and you're trying to connect to it using the new ones, and the error arises.
However, by deleting the directory, the Docker volumes are not deleted.
The solution is to delete the stale docker volume. **Be careful**, this will
delete all data in those volumes (any thing you uploaded etc), so first
understand if this is the exact problem you are facing before deleting those
volumes.
Thus the older volumes with previous cluster's credentials are used for new
cluster and the error arises.
If you're sure of what you're doing, the volumes can be deleted by
Deletion of the stale Docker volume can solve this. **Be careful**, this
will delete all data in those volumes (any thing you uploaded etc). Do this
if you are sure this is the exact problem.
```sh
docker volume ls
```
```shell
docker volume ls
```
to list them, and then delete the ones that begin with `my-ente` using
`docker volume rm`. You can delete all stale volumes by using
`docker system prune` with the `--volumes` flag, but be _really_ careful,
that'll delete all volumes (Ente or otherwise) on your machine that are not
currently in use by a running docker container.
to list them, and then delete the ones that begin with `my-ente` using
`docker volume rm`. You can delete all stale volumes by using
`docker system prune` with the `--volumes` flag, but be _really_ careful,
that'll delete all volumes (Ente or otherwise) on your machine that are not
currently in use by a running Docker container.
An alternative way is to delete the volumes along with removal of cluster's
containers using `docker compose` inside `my-ente` directory.
An alternative way is to delete the volumes along with removal of cluster's
containers using `docker compose` inside `my-ente` directory.
```sh
docker compose down --volumes
```
```sh
docker compose down --volumes
```
If you're unsure about removing volumes, another alternative is to rename your
`my-ente` folder. Docker uses the folder name to determine the volume name
prefix, so giving it a different name will cause Docker to create a volume
afresh for it.
If you're unsure about removing volumes, another alternative is to rename
your `my-ente` folder. Docker uses the folder name to determine the volume
name prefix, so giving it a different name will cause Docker to create a
volume afresh for it.
## MinIO provisioning error
If you have used our quickstart script for self-hosting Ente (new users will be unaffected) and are using the default MinIO container for object storage, you may run into issues while starting the cluster after pulling latest images with provisioning MinIO and creating buckets.
You may encounter similar logs while trying to start the cluster:
If you encounter similar logs while starting your Docker Compose cluster
```
my-ente-minio-1 -> | Waiting for minio...
@@ -148,30 +142,19 @@ my-ente-minio-1 -> | Waiting for minio...
my-ente-minio-1 -> | Waiting for minio...
```
MinIO has deprecated the `mc config` command in favor of `mc alias set` resulting in failure in execution of the command for creating bucket using `post_start` hook.
This can be resolved by changing `mc config host h0 add http://minio:3200 $minio_user $minio_pass` to `mc alias set h0 http://minio:3200 $minio_user $minio_pass`
This could be due to usage of deprecated MinIO `mc config` command. Changing
`mc config host h0 add` to `mc alias set h0` resolves this.
Thus the updated `post_start` will look as follows for `minio` service:
```yaml
minio:
```yaml
minio:
...
post_start:
- command: |
sh -c '
#!/bin/sh
while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.