Compare commits

..

52 Commits

Author SHA1 Message Date
Alex
1eb9ac8217 fix(server) Cannot change first time password due to null in first and last name payload (#1205)
* fix(server) Cannot change first time password due to null in first and last name payload

* Added error message for form on the web
2022-12-28 21:07:04 -06:00
Kuljit Uppal
7810dd1942 chore(docs) Add link to releases (#1195)
Include link to Github releases page in updating instructions.
2022-12-28 09:49:34 -06:00
Damián
eeb0456356 Fixed translations and added missing (#1201)
Fixed some wrong translations and finished adding the missing ones.
2022-12-28 08:47:10 -06:00
Jason Rasmussen
c032cfd99e chore(server): fix unit test (#1194) 2022-12-27 20:29:58 -06:00
Alex Tran
4545249fa3 Update docs and readme 2022-12-27 14:28:25 -06:00
Jason Rasmussen
380f719fd8 feat(server,web): update email address (#1186)
* feat: change email

* test: change email
2022-12-27 10:36:31 -06:00
Alex
fdf51a8855 chore(server) Increase cache-control time (#1189)
* chore(server) Increase cache-control time

* Update version for openapi
2022-12-27 10:13:44 -06:00
Alex Tran
2d326f47ec add patch note 2022-12-27 10:03:08 -06:00
Alex Tran
9c38cc42f6 Up version for release 2022-12-27 09:53:04 -06:00
Jason Rasmussen
c27c89a680 feat(server): extend jwt expiration (#1187) 2022-12-27 09:42:01 -06:00
Jason Rasmussen
4e860b024b refactor(server): drop salt column (#1185) 2022-12-26 23:03:14 -05:00
Jason Rasmussen
0c896d9e59 test(server): change password (#1177) 2022-12-26 16:36:06 -06:00
Lukas H
4f8bc641bd Fixed minor typo (#1181)
Changed "Albums to be backup" to "Albums to be backed up"
2022-12-26 16:31:00 -06:00
Lukas H
e0a6119bb7 Fixed minor typo (#1178)
Changed "Note that some asset does not have any object detected..." to "Note that some assets may not have any objects detected..."
2022-12-26 12:32:23 -06:00
Jason Rasmussen
7dc12dea1e feat(web,server): link/unlink oauth account (#1154)
* feat(web,server): link/unlink oauth account

* chore: linting

* fix: broken oauth callback

* fix: user core bugs

* fix: tests

* fix: use user response

* chore: update docs

* feat: prevent the same oauth account from being linked twice

* chore: mock logger
2022-12-26 09:35:52 -06:00
Alex
ab0a3690f3 fix/mobile notification android 13 (#1175)
* fix(mobile) runtime notification permission rule Android 13

* Format
2022-12-25 22:47:54 -06:00
Jaime Baez
20c5578470 Make user business logic reusable (#1114)
- Refactor user business logic from `user.service` into `user.domain`
  Make user business logic reusable by using `user.domain` from other services than `user.service`

- Add `jest-when` lib to make testing easier and use it in `userService`
  Using when helps from coupling tests to order of mock implementations execution

- Move all user business logic from user-repository to user.service

- Fix user.service tests not awaiting promises leaking state between tests

- Presentation logic for `getUserProfileImage` moved from UserService to UserController

- Fix `user.e2e` test logic. Pending fixing the configuration of the test itself
2022-12-23 21:08:50 +01:00
Alex
bf921a41f9 fix(deployment) suppress warning of empty environment varialbe (#1168) 2022-12-22 21:51:47 -06:00
Alex Tran
ab56ab9b27 Added log for unsupported Mime type 2022-12-22 21:24:28 -06:00
Alex
d3bc92c3f8 fix(mobile) Disable autocorrection on endpoint URL (#1166) 2022-12-22 14:29:48 -06:00
Alex
2459eabb05 feat(mobile) delete button in detail viewer (#1165) 2022-12-22 14:10:21 -06:00
Alex
f25809befb feat(web) using template filename for downloaded file (#1164)
* feat(web) using template filename for downloaded file

* remove deadcode
2022-12-22 13:29:51 -06:00
Alex Tran
443182c879 Update font size of landing page on mobile 2022-12-22 11:12:37 -06:00
Alex
452bd04272 chore(docs) revamp landing page (#1161)
* Added tailwind

* Finished styling
2022-12-22 10:31:31 -06:00
Jason Rasmussen
da9c961fca chore(docs): FAQs, geocoding, jobs, search, and user settings (#1160) 2022-12-22 10:31:17 -06:00
Jason Rasmussen
feaf21373a chore(docs): fix build errors (#1156) 2022-12-21 15:33:18 -06:00
Jason Rasmussen
752b267399 chore(docs): refactor pages (#1144)
* chore(docs): refactor pages

* fix: links

* fix: broken link

* refactor: post install steps using partials
2022-12-21 15:01:50 -06:00
Jason Rasmussen
7966c925ea fix: increase oauth timeout (#1155) 2022-12-21 14:44:28 -06:00
Jason Rasmussen
832692c8af chore(web): linting (#1152) 2022-12-21 09:35:59 -06:00
Jason Rasmussen
14db7a09e3 feat(web): user profile (#1148)
* fix: allow updateUser for admin account

* feat: update user first/last name

* feat(web): change password
2022-12-21 08:43:35 -06:00
Alex Tran
723a7c563f Minor styling improvement 2022-12-20 22:00:47 -06:00
Jason Rasmussen
21d6874e54 fix(server) utf8 original filename (#1147) 2022-12-20 21:46:57 -06:00
bt90
354593a70d Improve TensorFlow docs (#1138)
* Improve grep

* Machine learning is optional

* Improved wording

* Clarify how to remove
2022-12-20 10:27:41 -06:00
Alex
38bf310eac Remove OAUTH setting from .env.example 2022-12-20 09:53:56 -06:00
bt90
1146e61821 Refer to the docs (#1136) 2022-12-20 09:51:22 -06:00
Enrico Brambilla
8ee7504c45 feat(mobile): autofill login form (#1128) 2022-12-20 09:10:31 -06:00
Alex
e824b55c20 Update post-installation.md 2022-12-20 09:09:26 -06:00
Alex
6d09cb6b6d Update docs and readme 2022-12-20 08:54:52 -06:00
Matt Farrell
2d2b9a2ac9 Update instructions for Unraid (#1131) 2022-12-19 23:00:16 -06:00
Alex Tran
69661879eb Update openapi version 2022-12-19 13:56:25 -06:00
Alex
42e57547f7 Update readme and docs 2022-12-19 13:34:44 -06:00
Alex
b88e24678b Up version for release 2022-12-19 12:27:07 -06:00
Alex
de69d0031e chore(server) Add job for storage migration (#1117) 2022-12-19 12:13:10 -06:00
Alex
8998a79ff9 Update translation 2022-12-18 06:13:37 -06:00
Alex
e116f17c43 feat(web) add user setting page (#1115)
* refactoring

* refactor

* fix naming

* Added animation

* add user setting page

* Add skeleton for user setting page

* styling

* styling

* Spelling
2022-12-17 16:08:18 -06:00
Peter Bašista
efa1781eb6 Date format change (#1113) 2022-12-17 15:24:26 -06:00
Alex
03e86ed147 chore(web) update SvelteKit to 1.0.0 (#1110) 2022-12-16 20:51:17 -06:00
Alex
c754c860fd feat(server) user-defined storage structure (#1098)
[Breaking] newly uploaded file will conform to the default structure of `{uploadLocation}/{userId}/year/year-month-day/filename.ext`
2022-12-16 14:26:12 -06:00
Cong Hoang Nguyen
391d00bcb9 Fix typo and update notification wording (#1100) 2022-12-12 21:38:45 -06:00
Peter Bašista
d7297b567d Slovak and Czech language added (#1099)
* Added SK translate

* Added SK translate

* Added CZ translate
2022-12-12 16:46:11 -06:00
Alex
e9cebedb4a Up version mobile 2022-12-11 14:51:03 -06:00
Alex
2edbf64e69 fix(mobile) invalid date in exif cause timeline to crash (#1095) 2022-12-11 14:49:03 -06:00
267 changed files with 7840 additions and 3070 deletions

View File

@@ -29,12 +29,13 @@
## Content ## Content
- [Official Documentation](https://immich.app/docs/overview/introduction) - [Official Documentation](https://immich.app/docs)
- [Roadmap](https://github.com/orgs/immich-app/projects/1)
- [Demo](#demo) - [Demo](#demo)
- [Features](#features) - [Features](#features)
- [Introduction](https://immich.app/docs/overview/introduction) - [Introduction](https://immich.app/docs/overview/introduction)
- [Installation](https://immich.app/docs/installation/requirements) - [Installation](https://immich.app/docs/install/requirements)
- [Contribution Guidelines](https://immich.app/docs/contribution-guidelines) - [Contribution Guidelines](https://immich.app/docs/overview/support-the-project)
- [Support The Project](#support-the-project) - [Support The Project](#support-the-project)
- [Known Issues](#known-issues) - [Known Issues](#known-issues)
@@ -67,17 +68,17 @@ Spec: Free-tier Oracle VM - Amsterdam - 2.4Ghz quad-core ARM64 CPU, 24GB RAM
| Selective album(s) for backup | Yes | N/A | | Selective album(s) for backup | Yes | N/A |
| Download photos and videos to local device | Yes | Yes | | Download photos and videos to local device | Yes | Yes |
| Multi-user support | Yes | Yes | | Multi-user support | Yes | Yes |
| Album | Yes | Yes | | Album and Shared albums | Yes | Yes |
| Shared Albums | Yes | Yes | | Scrubbable/draggable scrollbar | Yes | Yes |
| Quick navigation with draggable scrollbar | Yes | Yes |
| Support RAW (HEIC, HEIF, DNG, Apple ProRaw) | Yes | Yes | | Support RAW (HEIC, HEIF, DNG, Apple ProRaw) | Yes | Yes |
| Metadata view (EXIF, map) | Yes | Yes | | Metadata view (EXIF, map) | Yes | Yes |
| Search by metadata, objects and image tags | Yes | No | | Search by metadata, objects and image tags | Yes | No |
| Administrative functions (user management) | N/A | Yes | | Administrative functions (user management) | N/A | Yes |
| Background backup | Android | N/A | | Background backup | Android | N/A |
| Virtual scroll | Yes | Yes | | Virtual scroll | Yes | Yes |
| OAuth Support | Yes | Yes | | OAuth support | Yes | Yes |
| LivePhotos Backup and Playback (iOS only) | Yes | Yes | | LivePhoto backup and playback | iOS | Yes |
| User-defined storage structure | Yes | Yes |
# Support the project # Support the project
@@ -94,18 +95,8 @@ If you feel like this is the right cause and the app is something you are seeing
# Known Issues # Known Issues
## TensorFlow Build Issue ## immich-machine-learning fails to start
_This is a known issue for incorrect Proxmox setup_ Symptoms: the container logs `illegal instruction core dump` and restarts
TensorFlow doesn't run with older CPU architecture, it requires a CPU with AVX and AVX2 instruction set. If you encounter the error `illegal instruction core dump` when running the docker-compose command above, check for your CPU flags with the command and make sure you see `AVX` and `AVX2`: Solution: https://immich.app/docs/install/requirements#hardware
```bash
more /proc/cpuinfo | grep flags
```
If you are running virtualization in Proxmox, the VM doesn't have the flag enabled.
You need to change the CPU type from `kvm64` to `host` under VMs hardware tab.
`Hardware > Processors > Edit > Advanced > Type (dropdown menu) > host`

View File

@@ -38,8 +38,8 @@
- [示例](#示例) - [示例](#示例)
- [功能特性](#功能特性) - [功能特性](#功能特性)
- [介绍](https://immich.app/docs/overview/introduction) - [介绍](https://immich.app/docs/overview/introduction)
- [安装](https://immich.app/docs/installation/requirements) - [安装](https://immich.app/docs/install/requirements)
- [贡献指南](https://immich.app/docs/contribution-guidelines) - [贡献指南](https://immich.app/docs/overview/support-the-project)
- [支持本项目](#support-the-project) - [支持本项目](#support-the-project)
- [已知问题](#known-issues) - [已知问题](#known-issues)

View File

@@ -30,12 +30,6 @@ REDIS_HOSTNAME=immich_redis
UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup
###################################################################################
# Log message level - [simple|verbose]
###################################################################################
LOG_LEVEL=simple
################################################################################### ###################################################################################
# JWT SECRET # JWT SECRET
# #
@@ -79,21 +73,6 @@ PUBLIC_LOGIN_PAGE_MESSAGE=
# Note: immich-microservices is bound to 3002, but no references are made # Note: immich-microservices is bound to 3002, but no references are made
#################################################################################### ####################################################################################
# IMMICH_WEB_URL=http://immich-web:3000 IMMICH_WEB_URL=http://immich-web:3000
# IMMICH_SERVER_URL=http://immich-server:3001 IMMICH_SERVER_URL=http://immich-server:3001
# IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003 IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003
####################################################################################
# OAuth Setting - Optional
#
# These setting will enable OAuth login for your instance of Immich
# Folow the instructions in the page https://immich.app/docs/usage/oauth to set up your OAuth provider
####################################################################################
# OAUTH_ENABLED=false
# OAUTH_ISSUER_URL=
# OAUTH_CLIENT_ID=
# OAUTH_CLIENT_SECRET=
# OAUTH_BUTTON_TEXT=Login with OAuth
# OAUTH_AUTO_REGISTER=true
# OAUTH_SCOPE="openid profile email"

View File

@@ -14,12 +14,47 @@ sidebar_position: 6
### How can I sync an existing directory with Immich's server? ### How can I sync an existing directory with Immich's server?
Immich doesn't have the mechanism to sync an existing directory with the server. There is however, a helper CLI tool to help you bulk upload the existing photos and videos to the server. You can find the guide to use the CLI tool [here](/docs/usage/bulk-upload.md). Immich doesn't have the mechanism to sync an existing directory with the server. There is however, a helper CLI tool to help you bulk upload the existing photos and videos to the server. You can find the guide to use the CLI tool [here](/docs/features/bulk-upload.md).
### Why doesn't Immich watch an existing photo gallery directory? ### Why doesn't Immich watch an existing photo gallery directory?
The initial approach of Immich is to become a backup tool, primarily for mobile device usage. Thus, all the assets must be uploaded from the mobile client. The app was architectured to perform that job well. The initial approach of Immich is to become a backup tool, primarily for mobile device usage. Thus, all the assets must be uploaded from the mobile client. The app was architectured to perform that job well.
### What happens to existing files after I choose a new [Storage Template](/docs/features/storage-template.mdx)?
Template changes will only apply to new assets. To retroactively apply the template to previously uploaded assets, run the Storage Migration Job, available on the [Jobs](/docs/features/jobs.md) page.
### Why is object detection not very good?
The model we used for machine learning is a prebuilt model, so the accuracy is not very good. It will hopefully be replaced with a better solution in the future.
### How can I see Immich logs?
Most Immich components are typically deployed using docker. To see logs for deployed docker containers, you can use the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/), specifically the `docker logs` command. For examples, see [Docker Help](/docs/guides/docker-help.md)
### How can I run Immich as a non-root user?
1. Set the `PUID`/`PGID` environment variables (in `.env`).
2. Set the corresponding `user` argument in `docker-compose` for each service.
3. Add an additional volume to `immich-microservices` that mounts internally to `/usr/src/app/.reverse-geocoding-dump`.
The non-root user/group needs will need read/write access to the volume mounts, including `UPLOAD_LOCATION`.
### How can I reset the admin password? ### How can I reset the admin password?
The admin password can be reset by running the [reset-admin-password](/docs/usage/server-commands) command on the immich-server. The admin password can be reset by running the [reset-admin-password](/docs/features/server-commands.md) command on the immich-server.
### How can I **purge** data from Immich?
Data for Immich comes in two forms:
1. **Metadata** stored in a postgres database, persisted via the `pg_data` volume
2. **Files** (originals, thumbs, profile, etc.), stored in the `UPLOAD_LOCATION` folder.
To remove the **Metadata** you can stop Immich and delete the volume.
```bash title="Remove Immich (containers and volumes)"
docker-compose down -v
```
After removing the the containers and volumes, the **Files** can be cleaned up (if necessary) from the `UPLOAD_LOCATION` by simply deleting an unwanted files or folders.

View File

@@ -0,0 +1,4 @@
{
"label": "Developer",
"position": 4
}

View File

@@ -0,0 +1,39 @@
---
sidebar_position: 1
---
# Architecture
## High Level Diagram
![Immich Architecture](./img/app-architecture.png)
## Technology
Immich is a full-stack [TypeScript](https://www.typescriptlang.org/) application, with a [Flutter](https://flutter.dev/) mobile app.
### Mobile
- [Flutter](https://flutter.dev/)
- [Riverpod](https://riverpod.dev/) for state management.
### Web
- [SvelteKit](https://kit.svelte.dev/)
- [tailwindcss](https://tailwindcss.com/)
### Server
- [Node.js](https://nodejs.org/)
- [Nest.js](https://nestjs.com/)
- [TypeORM](https://typeorm.io/) for database management.
- [Jest](https://jestjs.io/) for testing.
### Database
- [PostgreSQL](https://www.postgresql.org/)
- [Redis](https://redis.io/) for job queuing.
### Web Server
- [NGINX](https://www.nginx.com/) for internal communication between containers and load balancing when scaling.

View File

Before

Width:  |  Height:  |  Size: 691 KiB

After

Width:  |  Height:  |  Size: 691 KiB

View File

@@ -0,0 +1,7 @@
---
sidebar_position: 5
---
# Open API
Immich uses the [Open API](https://swagger.io/specification/) standard to generate API documentation. To view the published docs see [here](/docs/api).

View File

@@ -1,10 +1,10 @@
--- ---
sidebar_position: 5 sidebar_position: 2
--- ---
# Contribution guidelines # Setup
## Environment setup ## Environment
### Server and web app ### Server and web app
@@ -88,6 +88,7 @@ OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generato
```bash ```bash
npm run api:generate # Run from the `server` directory npm run api:generate # Run from the `server` directory
``` ```
You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK. You can find the generated client SDK in the `web/src/api` for Typescript SDK and `mobile/openapi` for Dart SDK.
## Database migrations ## Database migrations
@@ -95,9 +96,11 @@ You can find the generated client SDK in the `web/src/api` for Typescript SDK an
After making any changes in the `server/libs/database/src/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration. After making any changes in the `server/libs/database/src/entities`, a database migration need to run in order to register the changes in the database. Follow the steps below to create a new migration.
1. Attached to the server container shell. 1. Attached to the server container shell.
2. Run 2. Run
```bash ```bash
npm run typeorm -- migration:generate ./libs/database/src/<migration-name> -d libs/database/src/config/database.config.ts npm run typeorm -- migration:generate ./libs/database/src/<migration-name> -d libs/database/src/config/database.config.ts
``` ```
3. Check if the migration file makes sense. 3. Check if the migration file makes sense.
4. Move the migration file to folder `server/libs/database/src/migrations` in your code editor. 4. Move the migration file to folder `server/libs/database/src/migrations` in your code editor.

View File

@@ -0,0 +1,4 @@
{
"label": "Features",
"position": 3
}

View File

@@ -1,20 +1,19 @@
---
sidebar_position: 2
---
# Automatic Backup # Automatic Backup
A guide on how the foreground and background automatic backup works. A guide on how the foreground and background automatic backup works.
<img src={require('./img/background-foreground-backup.png').default} width="50%" title="Foreground&Background Backup" /> <img src={require('./img/background-foreground-backup.png').default} width="50%" title="Foreground&Background Backup" />
On iOS, there is only one option for automatic backup On iOS, there is only one option for automatic backup
* [**Foreground backup**](#foreground-backup)
On Android, there are two options for automatic backup - [Automatic Backup](#automatic-backup)
* [**Foreground backup**](#foreground-backup) - [Foreground backup](#foreground-backup)
* [**Background backup**](#background-backup)
On Android, there are two options for automatic backup
- [Automatic Backup](#automatic-backup)
- [Foreground backup](#foreground-backup)
- [Background backup](#background-backup)
## Foreground backup ## Foreground backup
@@ -22,14 +21,16 @@ If foreground backup is enabled: whenever the app is opened or resumed, it will
## Background backup ## Background backup
Background backup is only available on Android thanks to the contribution effort of [@zoodyy](https://github.com/zoodyy). Background backup is only available on Android thanks to the contribution effort of [@zoodyy](https://github.com/zoodyy).
If background backup is enabled. The app will periodically check if there are any new photos or videos in the selected album(s) to be uploaded to the cloud. If there are, it will upload them to the cloud in the background. If background backup is enabled. The app will periodically check if there are any new photos or videos in the selected album(s) to be uploaded to the cloud. If there are, it will upload them to the cloud in the background.
A native Android notification shows up when the background upload is in progress. You can further customize the notification by going to the app's settings. A native Android notification shows up when the background upload is in progress. You can further customize the notification by going to the app's settings.
:::note :::info Note
* The app must be in the background for the backup worker to start running.
* It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone. - The app must be in the background for the backup worker to start running.
* If you reopen the app and the first page you see is the backup page, the counts will not reflect the background uploaded result. You have to navigate out of the page and come back to see the updated counts. - It is a well-known problem that some Android models are very strict with battery optimization settings, which can cause a problem with the background worker. Please visit [Don't kill my app](https://dontkillmyapp.com/) for a guide on disabling this setting on your phone.
- If you reopen the app and the first page you see is the backup page, the counts will not reflect the background uploaded result. You have to navigate out of the page and come back to see the updated counts.
::: :::

View File

@@ -1,7 +1,3 @@
---
sidebar_position: 3
---
# Bulk Upload (Using the CLI) # Bulk Upload (Using the CLI)
You can use the CLI to upload an existing gallery to the Immich server You can use the CLI to upload an existing gallery to the Immich server

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,23 @@
# Jobs
Several Immich functionalities are implemented as jobs, which run in the background. To view the status of a job navigate to the Administration Screen, and then the `Jobs` page.
## Generate Thumbnails
![Generate Thumbnails](./img/admin-jobs-thumbnails.png)
## Extract Exif
![Extract Exif](./img/admin-jobs-exif.png)
## Detect Objects
![Detect Objects](./img/admin-jobs-objects.png)
## Storage Migration
This job can be run after changing the [Storage Template](/docs/features/storage-template.mdx), in order to apply the change to the existing library.
![Storage Migration](./img/admin-jobs-template.png)

View File

@@ -0,0 +1,33 @@
import MobileAppDownload from '../partials/_mobile-app-download.md';
import MobileAppLogin from '../partials/_mobile-app-login.md';
import MobileAppBackup from '../partials/_mobile-app-login.md';
# Mobile App
:::tip
To upload from other devices, try using the [Bulk Upload CLI](/docs/features/bulk-upload.md).
:::
## Download
<MobileAppDownload />
:::info Beta Program
The beta release channel allows users to test upcoming changes before they are officially released. To join the channel use the links below.
- Android: Invitation link from [web](https://play.google.com/store/apps/details?id=app.alextran.immich) or from [mobile](https://play.google.com/store/apps/details?id=app.alextran.immich)
- iOS: [TestFlight invitation link](https://testflight.apple.com/join/1vYsAa8P)
:::
## Login
<MobileAppLogin />
## Backup
<MobileAppBackup />
:::info
You can enable automatic backup on supported devices. For more information see [Automatic Backup](/docs/features/automatic-backup.md).
:::

View File

@@ -0,0 +1,85 @@
# OAuth Authentication
This page contains details about using OAuth in Immich.
## Overview
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/)
- [Okta](https://www.okta.com/openid-connect/)
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
## Prerequisites
Before enabling OAuth in Immich, a new client application needs to be configured in the 3rd-party authentication server. While the specifics of this setup vary from provider to provider, the general approach should be the same.
1. Create a new (Client) Application
1. The **Provider** type should be `OpenID Connect` or `OAuth2`
2. The **Client type** should be `Confidential`
3. The **Application** type should be `Web`
4. The **Grant** type should be `Authorization Code`
2. Configure Redirect URIs/Origins
The **Sign-in redirect URIs** should include:
- `app.immich:/` - for logging in with OAuth from the [Mobile App](/docs/features/mobile-app.mdx)
- `http://DOMAIN:PORT/auth/login` - for logging in with OAuth from the Web Client
- `http://DOMAIN:PORT/user-settings` - for manually linking OAuth in the Web Client
:::info Redirect URIs
Redirect URIs should contain all the domains you will be using to access Immich. Some examples include:
Mobile
- `app.immich:/` (You **MUST** include this for iOS and Android mobile apps to work properly)
Localhost
- `http://localhost:2283/auth/login`
- `http://localhost:2283/user-settings`
Local IP
- `http://192.168.0.200:2283/auth/login`
- `http://192.168.0.200:2283/user-settings`
Hostname
- `https://immich.example.com/auth/login`)
- `https://immich.example.com/user-settings`)
:::
## Enable OAuth
Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings).
| Setting | Type | Default | Description |
| ------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| Enabled | boolean | false | Enable/disable OAuth |
| Issuer URL | URL | (required) | Required. Self-discovery URL for client (from previous step) |
| Client ID | string | (required) | Required. Client ID (from previous step) |
| Client secret | string | (required) | Required. Client Secret (previous step) |
| Scope | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| Button text | string | Login with OAuth | Text for the OAuth button on the web |
| Auto register | boolean | true | When true, will automatically register a user the first time they sign in |
:::info
The Issuer URL should look something like the following, and return a valid json document.
- `https://accounts.google.com/.well-known/openid-configuration`
- `http://localhost:9000/application/o/immich/.well-known/openid-configuration`
The `.well-known/openid-configuration` part of the url is optional and will be automatically added during discovery.
:::
Here's an example of OAuth configured for Authentik:
![OAuth Settings](./img/oauth-settings.png)
[oidc]: https://openid.net/connect/

View File

@@ -0,0 +1,14 @@
# Reverse Geocoding
Immich supports [Reverse Geocoding](https://en.wikipedia.org/wiki/Reverse_geocoding) using data from the [GeoNames](https://www.geonames.org/) geographical database.
## Extraction
During Exif Extraction, assets with latitudes and longitudes are reverse geocoded to determine their City, State, and Country.
## Usage
Data from a reverse geocode is displayed in the image details, and used in [Search](/docs/features/search.md).
<img src={require('./img/reverse-geocoding-mobile1.png').default} width='33%' title='Reverse Geocoding' />
<img src={require('./img/reverse-geocoding-mobile2.png').default} width='33%' title='Reverse Geocoding' />

View File

@@ -0,0 +1,16 @@
# Search
:::warning Work In Progress
Search is work-in-progress and subject to change. Stay tuned!
:::
## Search by Place
:::info
Searching is currently only implemented in the [Mobile App](/docs/features/mobile-app.mdx)
:::
Searching by the name of a city, state, or country is possible for assets with geolocation data and successful [Reverse Geocoding](/docs/features/reverse-geocoding.md).
<img src={require('./img/reverse-geocoding-mobile1.png').default} width='33%' title='Reverse Geocoding' />
<img src={require('./img/reverse-geocoding-mobile2.png').default} width='33%' title='Reverse Geocoding' />

View File

@@ -1,7 +1,3 @@
---
sidebar_position: 5
---
# Server Commands # Server Commands
The `immich-server` docker image comes preinstalled with an administrative CLI that supports the following commands: The `immich-server` docker image comes preinstalled with an administrative CLI that supports the following commands:

View File

@@ -0,0 +1,5 @@
import StorageTemplate from '../partials/_storage-template.md';
# Storage Template
<StorageTemplate />

View File

@@ -0,0 +1,18 @@
import RegisterAdminUser from '../partials/_register-admin.md';
import UserCreate from '../partials/_user-create.md';
# User Management
Immich supports multiple users, each with their own library.
## Register the Admin User
<RegisterAdminUser />
## Create a New User
<UserCreate />
## Delete a User
If you need to remove a user from Immich, head to "Administration", where users can be scheduled for deletion. The user account will immediately become disabled and their library and all associated data will be removed after 7 days.

View File

@@ -0,0 +1,23 @@
# User Settings
![User Modal](./img/user-popup.png)
## User Profile
View your User ID and email, and update your first and last name.
![User Profile](./img/user-profile.png)
## Change Password
Users can change their own passwords.
![Change Password](./img/user-change-password.png)
:::tip Reset Password
The admin can reset a password through the [User Management](/docs/features/user-management.mdx) screen.
:::
:::tip Reset Admin Password
The admin password can be reset using a [Server Command](/docs/features/server-commands.md)
:::

View File

@@ -0,0 +1,4 @@
{
"label": "Guides",
"position": 5
}

View File

@@ -0,0 +1,23 @@
---
sidebar_position: 1
---
# Docker Help
## Logs
```bash title="Log Examples"
docker ps # see a list of running containers
docker ps -a # see a list of running and stopped containers
docker logs <id or name> # see the logs for a specific container (by id or name)
docker logs immich_server
docker logs immich_microservices
docker logs immich_machine_learning
docker logs immich_web
docker logs immich_proxy
```
:::tip Follow a log
Adding `--follow` to a `docker logs <id or name>` command will stream new logs, instead of immediately exiting, which is often useful for debugging.
:::

View File

@@ -0,0 +1,4 @@
{
"label": "Install",
"position": 2
}

View File

@@ -2,14 +2,15 @@
sidebar_position: 3 sidebar_position: 3
--- ---
# Docker Compose [Recommended]
# Recommended installation Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose.
This is the recommended installation method for production use.
### Step 1 - Download the required files ### Step 1 - Download the required files
From a directory of your choice (e.g. `./immich-app`) run the following commands Download [`docker-compose.yml`][compose-file] [`.env.example`][env-file].
From a directory of your choice (e.g. `./immich-app`) run the following commands:
```bash title="Get docker-compose.yml file" ```bash title="Get docker-compose.yml file"
wget https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml wget https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml
@@ -99,9 +100,9 @@ PUBLIC_LOGIN_PAGE_MESSAGE="My Family Photos and Videos Backup Server"
</details> </details>
* Populate custom database information if necessary. - Populate custom database information if necessary.
* Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. - Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets.
* Populate a secret value for `JWT_SECRET`. You can use the command below to generate a secure key: - Populate a secret value for `JWT_SECRET`. You can use the command below to generate a secure key:
```bash title="Command to generate secure JWT_SECRET key" ```bash title="Command to generate secure JWT_SECRET key"
openssl rand -base64 128 openssl rand -base64 128
@@ -114,5 +115,16 @@ docker-compose up -d # or `docker compose up -d` based on your docker-compose ve
``` ```
:::tip :::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide. For more information on how to use the application, please refer to the [Post Installation](/docs/install/post-install.mdx) guide.
::: :::
### Step 4 - Upgrading
When a new version of Immich is [released](https://github.com/immich-app/immich/releases), the application can be upgraded with the following commands, run in the directory with the `docker-compose.yml` file:
```bash title="Upgrade Immich"
docker-compose pull && docker-compose up -d # Or `docker compose`
```
[compose-file]: https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml
[env-file]: https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example

View File

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 211 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 202 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 910 B

After

Width:  |  Height:  |  Size: 910 B

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -50,5 +50,5 @@ openssl rand -base64 128
:::tip :::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide. For more information on how to use the application, please refer to the [Post Installation](/docs/install/post-install.mdx) guide.
::: :::

View File

@@ -0,0 +1,38 @@
---
sidebar_position: 100
---
import RegisterAdminUser from '../partials/_register-admin.md';
import UserCreate from '../partials/_user-create.md';
import StorageTemplate from '../partials/_storage-template.md';
import MobileAppDownload from '../partials/_mobile-app-download.md';
import MobileAppLogin from '../partials/_mobile-app-login.md';
import MobileAppBackup from '../partials/_mobile-app-backup.md';
# Post Install Steps
A list of common steps to take after installing Immich include:
## Step 1 - Register the Admin User
<RegisterAdminUser />
## Step 2 - Create a New User (optional)
<UserCreate />
## Step 3 - Update the Storage Template
<StorageTemplate />
## Step 4 - Download the Mobile App
<MobileAppDownload />
## Step 5 - Login to the Mobile App
<MobileAppLogin />
## Step 6 - Backup Your Library
<MobileAppBackup />

View File

@@ -0,0 +1,47 @@
---
sidebar_position: 1
---
# Requirements
Hardware and software requirements for Immich
## Software
- [Docker](https://docs.docker.com/get-docker/)
- [Docker Compose](https://docs.docker.com/compose/install/)
:::info Podman
You can also use Podman to run the application. However, additional configuration might be required.
:::
## Hardware
- **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS, etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- **RAM**: At least 2GB, preferred 4GB.
- **CPU**: At least 2 cores, preferred 4 cores.
:::info Machine Learning on older CPU
The TensorFlow version used by Immich doesn't run on older CPU architectures. It requires a CPU with AVX and AVX2 instruction sets. If you encounter the error `illegal instruction core dump` check your CPU flags with the command below and make sure you see `avx` and `avx2`:
```bash
grep -E 'avx2?' /proc/cpuinfo
```
#### Promox
If you are running virtualization in Proxmox, the CPU type of the VM is probably configured incorrectly.
You need to change the CPU type from `kvm64` to `host` under VMs hardware tab.
`Hardware > Processors > Edit > Advanced > Type (dropdown menu) > host`
#### Other platforms
You can use the machine learning image that is built for Non-AVX CPU. The image is community maintained and can be found in the repository below
https://github.com/bertmelis/immich-machine-learning-no-avx
Otherwise, you can safely remove the `immich-machine-learning` service if you do not intend to use Immich's object detection features. Simply remove or comment out the declaration of the service in your compose file.
:::

View File

@@ -2,10 +2,10 @@
sidebar_position: 2 sidebar_position: 2
--- ---
# One-step installation # Install Script [Experimental]
:::caution :::caution
This method is for evaluation purposes only. It is not recommended for production use. For production usage, please refer to the recommended installation method [here](/docs/installation/recommended-installation). This method is experimental and not currently recommended for production use. For production, please refer to installing with [Docker Compose](/docs/install/docker-compose.md).
::: :::
In the shell, from a directory of your choice, run the following command: In the shell, from a directory of your choice, run the following command:
@@ -25,5 +25,5 @@ The web application will be available at `http://<machine-ip-address>:2283`, and
The directory which is used to store the library files is `./immich-data` relative to the current directory. The directory which is used to store the library files is `./immich-data` relative to the current directory.
:::tip :::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide. For common next steps, see [Post Install Steps](/docs/install/post-install.mdx).
::: :::

View File

@@ -4,7 +4,7 @@ sidebar_position: 5
# Unraid # Unraid
Install Immich on Unraid using the [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps. Immich can easily be installed and updated on Unraid using the [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/) plugin from the Unraid Community Apps.
:::info :::info
@@ -15,6 +15,8 @@ Install Immich on Unraid using the [Docker Compose Manager](https://forums.unrai
::: :::
## Installation Steps
1. Go to "**Plugins**" and click on "**Compose.Manager**" 1. Go to "**Plugins**" and click on "**Compose.Manager**"
2. Click "**Add New Stack**" and when prompted for a label enter "**Immich**" 2. Click "**Add New Stack**" and when prompted for a label enter "**Immich**"
@@ -103,5 +105,38 @@ alt="Go to Docker Tab and visit the address listed next to immich-proxy"
</details> </details>
:::tip :::tip
For more information on how to use the application once installed, please refer to the [Post Installation](/docs/usage/post-installation) guide. For more information on how to use the application once installed, please refer to the [Post Install](/docs/install/post-install.mdx) guide.
::: :::
## Updating Steps
Updating is extremely easy however it's important to be aware that containers managed via the Docker Compose Manager plugin do not integrate with Unraid's native dockerman ui, the label "_update ready_" will always be present on containers installed via the Docker Compose Manager.
<img
src={require('./img/unraid09.png').default}
width="50%"
alt="Docker Compose containers always say update ready, ignore it"
/>
You should ignore the "_update ready_" on the Unraid WebUI and update when you receive the notification within the Immich WebUI.
<img
src={require('./img/unraid10.png').default}
width="50%"
alt="Immich update notification"
/>
1. Go to the "**Docker**" tab and scroll to the Compose section
2. Next to Immich click the "**Update Stack**" button and Unraid will begin to update all Immmich related containers
> Note: **Do not** select Compose Down first, it is unecessary.
3. Once complete you will see a "_Connection Closed_" message, select "**Done**".
<img
src={require('./img/unraid11.png').default}
width="50%"
alt="Wait for Connection Closed and click Done"
/>
4. Return back to the Immich WebUI and you will see the version has been updated to the latest
<img
src={require('./img/unraid12.png').default}
width="70%"
alt="Wait for Connection Closed and click Done"
/>

View File

@@ -1,8 +0,0 @@
{
"label": "Installation",
"position": 2,
"link": {
"type": "generated-index",
"description": "Installation methods of Immich"
}
}

View File

@@ -1,31 +0,0 @@
---
sidebar_position: 1
---
# Requirements
Hardware and software requirements for Immich
## Software
- [Docker](https://docs.docker.com/get-docker/)
- [Docker Compose](https://docs.docker.com/compose/install/)
:::info Podman
You can also use Podman to run the application. However, additional configuration might be required on your end.
:::
## Hardware
- **OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS, etc). Windows works too, with [Docker Desktop on Windows](https://docs.docker.com/desktop/install/windows-install/)
- **RAM**: At least 2GB, preferred 4GB.
- **CPU**: At least 2 cores, preferred 4 cores.
## Installation methods
There are a couple installation methods that you can use to install the application. You can choose the one that suits you the best.
1. [One-step installation (Evaluation only)](/docs/installation/one-step-installation)
2. **[Docker Compose with manual configuration (Recommended)](/docs/installation/recommended-installation)**
3. [Portainer](/docs/installation/portainer-installation)
4. [Unraid (Community contribution)](/docs/installation/unraid-installation)

View File

@@ -1,12 +0,0 @@
---
sidebar_position: 4
---
# Mobile app Beta program
Join the beta release channel to test the latest update of the app
You can opt-in to join app beta release channel by following the links below:
* Android: Invitation link from [web](https://play.google.com/store/apps/details?id=app.alextran.immich) or from [mobile](https://play.google.com/store/apps/details?id=app.alextran.immich)
* iOS: [TestFlight invitation link](https://testflight.apple.com/join/1vYsAa8P)

View File

@@ -1,8 +1,4 @@
{ {
"label": "Getting Started", "label": "Overview",
"position": 1, "position": 1
"link": {
"type": "generated-index",
"description": "Getting to know Immich"
}
} }

View File

@@ -0,0 +1,16 @@
---
sidebar_position: 4
---
# Help Me!
Running into an issue or have a question? Try the following:
1. Check the [FAQs](/docs/FAQ.md).
2. Read through the [Release Notes][github-releases].
3. Search through existing [Github Issues][github-issues].
4. Open a help ticket on [Discord][discord-link].
[github-issues]: https://github.com/immich-app/immich/releases
[github-releases]: https://github.com/immich-app/immich/releases
[discord-link]: https://discord.com/invite/D8JsnBEuKb

View File

@@ -4,14 +4,12 @@ sidebar_position: 1
# Introduction # Introduction
<img src={require('./img/feature-panel.png').default} alt='Immich' />
## Welcome!
Hello, I am glad you are here. Hello, I am glad you are here.
<p style={{textAlign: 'center'}}>
![Introduction Image](https://user-images.githubusercontent.com/27055614/182044984-2ee6d1ed-c4a7-4331-8a4b-64fcde77fe1f.png)
</p>
My name is Alex. I am an Electrical Engineer by schooling, then turned into a Software Engineer by trade and the pure love of problem solving. My name is Alex. I am an Electrical Engineer by schooling, then turned into a Software Engineer by trade and the pure love of problem solving.
We were lying in bed with our newborn, and my wife said, "We are starting to accumulate a lot of photos and videos of our baby, and I don't want to pay for **_App-Which-Must-Not-Be-Named_** anymore. You always want to build something for me, so why don't you build me an app which can do that?" We were lying in bed with our newborn, and my wife said, "We are starting to accumulate a lot of photos and videos of our baby, and I don't want to pay for **_App-Which-Must-Not-Be-Named_** anymore. You always want to build something for me, so why don't you build me an app which can do that?"
@@ -22,4 +20,4 @@ Another motivation that pushed me to deliver my execution of the **_App-Which-Mu
I'm proud to share this creation with you, which values privacy, memories, and the joy of looking back at those moments in an easy-to-use and friendly interface. I'm proud to share this creation with you, which values privacy, memories, and the joy of looking back at those moments in an easy-to-use and friendly interface.
If you like the application or it helps you in some way, please consider [supporting](./support-the-project.md) to the project. It will help me to continue to develop and maintain the application. If you like the application or it helps you in some way, please consider [supporting](./support-the-project.md) the project. It will help me to continue to develop and maintain the application.

View File

@@ -2,11 +2,11 @@
sidebar_position: 2 sidebar_position: 2
--- ---
# Logo meaning # Logo
Why the colorful flower, you ask? Why the colorful flower, you ask?
I really like the Japanese culture, especially the books, history, and food. The current logo is a spin-off of [the Oda clan's symbol](https://en.wikipedia.org/wiki/Oda_clan). I really like the Japanese culture, especially the books, history, and food. The current logo is a spin-off of [the Oda clan's symbol](https://en.wikipedia.org/wiki/Oda_clan).
![Oda_emblem](https://user-images.githubusercontent.com/27055614/182044504-a5ed33a8-5640-42de-b359-18fdbee9fb90.svg) ![Oda_emblem](https://user-images.githubusercontent.com/27055614/182044504-a5ed33a8-5640-42de-b359-18fdbee9fb90.svg)

View File

@@ -2,19 +2,26 @@
sidebar_position: 3 sidebar_position: 3
--- ---
# Support the project # Support The Project
I've committed to this project, and I will not stop. I will keep updating the docs, adding new features, and fixing bugs. But I can't do it alone, so I need your help to give me additional motivation to keep going. I am committed to this project, and I will not stop. I will keep updating the docs, adding new features, and fixing bugs. But I can't do it alone, so I need your help to give me additional motivation to keep going.
As our hosts in the [selfhosted.show - In the episode 'The-organization-which-must-not-be-named is a Hostile Actor'](https://selfhosted.show/79?t=1418) said, this is a massive undertaking that the team and I are doing. I would love to someday be able to do this full-time, and I am asking for your help to make that happen. As our hosts in the [selfhosted.show - In the episode 'The-organization-which-must-not-be-named is a Hostile Actor'](https://selfhosted.show/79?t=1418) said, this is a massive undertaking that the team and I are doing. I would love to someday be able to do this full-time, and I am asking for your help to make that happen.
If you feel like this is the right cause and the app is something you see yourself using for a long time, please consider supporting the project with the options below. If you feel like this is the right cause and the app is something you see yourself using for a long time, please consider supporting the project with one of the options below.
## Donation ## Donation
* Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502) - Monthly donation via [GitHub Sponsors](https://github.com/sponsors/alextran1502)
* One-time donation via [Github Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) - One-time donation via [Github Sponsors](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502)
## Contribution ## Contributing
If you are a programmer/developer and the app's [technology stack](./technology-stack.md) is something you are familiar with, please consider contributing to the project. The team and I are always looking for new contributors. You can refer to the [contribution guildelines](/docs/contribution-guidelines) to start leaving your mark on the project. There are lots of non-monetary ways to contribute to Immich as well.
1. Testing - Using Immich and reporting bugs is a great way to help support the project. Found a bug? [Open an issue on Github][github-issue].
1. Translations - The Immich mobile app has been translated into [17 languages][github-langs] so far! To contribute with translations, email me at alex.tran1502@gmail.com or send me a message on discord.
1. Development - If you are a programmer or developer, take a look at Immich's [technology stack](/docs/developer/architecture.md) and consider fixing bugs or building new features. The team and I are always looking for new contributors. For information about how to contribute as a developer, see the [Developer](/docs/developer/architecture.md) section.
[github-issue]: https://github.com/immich-app/immich/issues/new/choose
[github-langs]: https://github.com/immich-app/immich/tree/main/mobile/assets/i18n

View File

@@ -1,23 +0,0 @@
---
sidebar_position: 4
---
# Technology stack
The app is built with the following technologies:
## Frontend
* [Flutter](https://flutter.dev/) for the mobile app
* [Riverpod](https://riverpod.dev/) as state management.
* [SvelteKit](https://kit.svelte.dev/) for the Web.
## Backend
* [Nest.js](https://nestjs.com/) for the server.
* [TypeORM](https://typeorm.io/) for database management.
* [PostgreSQL](https://www.postgresql.org/) for the database.
* [Redis](https://redis.io/) for communication between the core server and the microservices.
* [NGINX](https://www.nginx.com/) for internal communication between containers and load balancing when scaling.
## High level architecture
![Immich Architecture](./img/app-architecture.png)

View File

@@ -0,0 +1,9 @@
Navigate to the backup screen by clicking on the cloud icon in the top right corner of the screen.
<img src={require('./img/backup-header.png').default} width='50%' title='Backup button' />
You can select which album(s) you want to back up to the Immich server from the backup screen.
<img src={require('./img/album-selection.png').default} width='50%' title='Backup button' />
Scroll down to the bottom and press "**Start Backup**" to start the backup process.

View File

@@ -0,0 +1,6 @@
The mobile app can be downloaded from the following places:
- [Google Play Store](https://play.google.com/store/apps/details?id=app.alextran.immich)
- [Apple App Store](https://apps.apple.com/us/app/immich/id1613945652)
- [F-Droid](https://f-droid.org/packages/app.alextran.immich)
- [Github Releases (apk)](https://github.com/immich-app/immich/releases)

View File

@@ -0,0 +1,3 @@
Login to the mobile app with the server endpoint URL at `http://<machine-ip-address>:2283/api`
<img src={require('./img/sign-in-phone.jpeg').default} width='50%' title='Mobile App Sign In' />

View File

@@ -0,0 +1,7 @@
The first user to register will be the admin user. The admin user will be able to add other users to the application.
To register for the admin user, access the web application at `http://<machine-ip-address>:2283` and click on the **Getting Started** button.
<img src={require('./img/admin-registration-form.png').default} width="500" title="Admin Registration" />
Follow the prompts to register as the admin user and log in to the application.

View File

@@ -0,0 +1,11 @@
Immich allows the admin user to set the pattern of how the files are uploaded to the Immich would look like. Both in the directory and the filename level.
The admin user can set the template by using the template builder in the `Administration -> Settings -> Storage Template`. Immich provides a set of variables that you can use in constructing the template, along with additional custom text.
```bash title="Default template"
Year/Year-Month-Day/Filename.Extension
```
<img src={require('./img/storage-template.png').default} width="100%" title="Storage Template Setting" />
Immich also provides a mechanism to migrate between template so that if the template you set now doesn't work in the future, you can always migrate all the existing files to the new template. The mechanism is run as a job in the Job page.

View File

@@ -0,0 +1,3 @@
If you have friends or family members who want to use the application as well, you can create addition accounts. The default password is `password`, and the user can change their password after logging in to the application for the first time.
<img src={require('./img/create-new-user.png').default} title='Admin Registration' />

View File

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 105 KiB

View File

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 321 KiB

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

View File

@@ -1,8 +0,0 @@
{
"label": "Usage",
"position": 3,
"link": {
"type": "generated-index",
"description": "Quick start on how to use the app on mobile and the web"
}
}

View File

@@ -1,66 +0,0 @@
---
sidebar_position: 5
---
# OAuth Authentication
This page contains details about using OAuth 2 in Immich.
## Overview
Immich supports 3rd party authentication via [OpenID Connect][oidc] (OIDC), an identity layer built on top of OAuth2. OIDC is supported by most identity providers, including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/)
- [Okta](https://www.okta.com/openid-connect/)
- [Google](https://developers.google.com/identity/openid-connect/openid-connect)
## Prerequisites
Before enabling OAuth in Immich, a new client application needs to be configured in the 3rd-party authentication server. While the specifics of this setup vary from provider to provider, the general approach should be the same.
1. Create a new (Client) Application
1. The **Provider** type should be `OpenID Connect` or `OAuth2`
2. The **Client type** should be `Confidential`
3. The **Application** type should be `Web`
4. The **Grant** type should be `Authorization Code`
2. Configure Redirect URIs/Origins
The **Sign-in redirect URIs** should include:
- All URLs that will be used to access the login page of the Immich web client (eg. `http://localhost:2283/auth/login`, `http://192.168.0.200:2283/auth/login`, `https://immich.example.com/auth/login`)
- Mobile app redirect URL `app.immich:/`
:::caution
You **MUST** include `app.immich:/` as the redirect URI for iOS and Android mobile app to work properly.
**Authentik example**
<img src={require('./img/authentik-redirect.png').default} title="Authentik Redirection URL" width="80%" />
:::
## Enable OAuth
Once you have a new OAuth client application configured, Immich can be configured using the Administration Settings page, available on the web (Administration -> Settings).
| Setting | Type | Default | Description |
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| OAuth enabled | boolean | false | Enable/disable OAuth2 |
| OAuth issuer URL | URL | (required) | Required. Self-discovery URL for client (from previous step) |
| OAuth client ID | string | (required) | Required. Client ID (from previous step) |
| OAuth client secret | string | (required) | Required. Client Secret (previous step) |
| OAuth scope | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| OAuth button text | string | Login with OAuth | Text for the OAuth button on the web |
| OAuth auto register | boolean | true | When true, will automatically register a user the first time they sign in |
:::info
The Issuer URL should look something like the following, and return a valid json document.
- `https://accounts.google.com/.well-known/openid-configuration`
- `http://localhost:9000/application/o/immich/.well-known/openid-configuration`
The `.well-known/openid-configuration` part of the url is optional and will be automatically added during discovery.
:::
[oidc]: https://openid.net/connect/

View File

@@ -1,57 +0,0 @@
---
sidebar_position: 1
---
# Post Installation
This page contains information about what to do after you have installed the application.
## Step 1 - Download the mobile app
The mobile app can be downloaded from
- [Google Play Store](https://play.google.com/store/apps/details?id=app.alextran.immich)
- [Apple App Store](https://apps.apple.com/us/app/immich/id1613945652)
- [F-Droid](https://f-droid.org/packages/app.alextran.immich)
## Step 2 - Register the admin user
The first user to register will be the admin user. The admin user will be able to add other users to the application.
To register for the admin user, access the web application at `http://<machine-ip-address>:2283` and click on the **Getting Started** button.
<img src={require('./img/admin-registration-form.png').default} width="500" title="Admin Registration" />
Follow the prompts to register as the admin user and log in to the application.
## Step 3 - Create a new user (optional)
If you have a family member who wants to use the application, you can create a new account. The default password is `password`, and the user can change their password after logging in to the application for the first time.
<img src={require('./img/create-new-user.png').default} title="Admin Registration" />
## Step 4 - Access the mobile app
Login to the mobile app with the server endpoint URL at `http://<machine-ip-address>:2283/api`
<img src={require('./img/sign-in-phone.jpeg').default} width="50%" title="Mobile App Sign In" />
## Step 5 - Back up your photos and videos
Navigate to the backup screen by clicking on the cloud icon in the top right corner of the screen.
<img src={require('./img/backup-header.png').default} width="50%" title="Backup button" />
You can select which album(s) you want to back up to the Immich server from the backup screen.
<img src={require('./img/album-selection.png').default} width="50%" title="Backup button" />
Scroll down to the bottom and press "**Start Backup**" to start the backup process.
You can also enable auto foreground or background backup (only on Android). For more information about the app mechanism, please visit the next pages.
:::tip Application Mechanism
#### [Foreground and background backup](/docs/usage/automatic-backup)
#### [Bulk upload (using the CLI)](/docs/usage/bulk-upload)
:::

View File

@@ -1,11 +0,0 @@
---
sidebar_position: 4
---
# Update the application
If you are using Docker Compose, update the application use the following commands in the directory where the `docker-compose.yml` file is located:
```bash title="Update Immich"
docker-compose pull && docker-compose up -d # Or `docker compose`
```

View File

@@ -28,6 +28,19 @@ const config = {
locales: ["en"], locales: ["en"],
}, },
plugins: [
async function myPlugin(context, options) {
return {
name: "docusaurus-tailwindcss",
configurePostCss(postcssOptions) {
// Appends TailwindCSS and AutoPrefixer.
postcssOptions.plugins.push(require("tailwindcss"));
postcssOptions.plugins.push(require("autoprefixer"));
return postcssOptions;
},
};
},
],
presets: [ presets: [
[ [
"docusaurus-preset-openapi", "docusaurus-preset-openapi",
@@ -44,7 +57,7 @@ const config = {
}, },
api: { api: {
path: "../server/immich-openapi-specs.json", path: "../server/immich-openapi-specs.json",
routeBasePath: "/docs/api" routeBasePath: "/docs/api",
}, },
// blog: { // blog: {
// showReadingTime: true, // showReadingTime: true,
@@ -60,6 +73,9 @@ const config = {
themeConfig: themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */ /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({ ({
colorMode: {
defaultMode: "dark",
},
announcementBar: { announcementBar: {
id: "site_announcement_immich", id: "site_announcement_immich",
content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`, content: `⚠️ The project is under <strong>very active</strong> development. Expect bugs and changes. Do not use it as <strong>the only way</strong> to store your photos and videos!`,
@@ -82,19 +98,23 @@ const config = {
{ {
to: "/docs/overview/introduction", to: "/docs/overview/introduction",
position: "right", position: "right",
label: "Documentation", label: "Docs",
}, },
{ {
to: "/docs/api", to: "/docs/api",
position: "right", position: "right",
label: "API" label: "API",
}, },
{ to: "/blog", label: "Blog", position: "right" },
{ {
href: "https://github.com/immich-app/immich", href: "https://github.com/immich-app/immich",
label: "GitHub", label: "GitHub",
position: "right", position: "right",
}, },
{
href: "https://github.com/orgs/immich-app/projects/1",
label: "Roadmap",
position: "right",
},
], ],
}, },
footer: { footer: {
@@ -109,7 +129,7 @@ const config = {
}, },
{ {
label: "Installation", label: "Installation",
to: "/docs/installation/requirements", to: "/docs/install/requirements",
}, },
], ],
}, },
@@ -123,16 +143,20 @@ const config = {
], ],
}, },
{ {
title: "More", title: "Links",
items: [ items: [
{ // {
label: "Blog", // label: "Blog",
to: "/blog", // to: "/blog",
}, // },
{ {
label: "GitHub", label: "GitHub",
href: "https://github.com/immich-app/immich", href: "https://github.com/immich-app/immich",
}, },
{
label: "Roadmap",
href: "https://github.com/orgs/immich-app/projects/1",
},
], ],
}, },
], ],
@@ -142,6 +166,7 @@ const config = {
theme: lightCodeTheme, theme: lightCodeTheme,
darkTheme: darkCodeTheme, darkTheme: darkCodeTheme,
}, },
image: "overview/img/feature-panel.png",
}), }),
}; };

417
docs/package-lock.json generated
View File

@@ -11,11 +11,14 @@
"@docusaurus/core": "2.1.0", "@docusaurus/core": "2.1.0",
"@docusaurus/preset-classic": "2.1.0", "@docusaurus/preset-classic": "2.1.0",
"@mdx-js/react": "^1.6.22", "@mdx-js/react": "^1.6.22",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"docusaurus-preset-openapi": "^0.6.3", "docusaurus-preset-openapi": "^0.6.3",
"postcss": "^8.4.20",
"prism-react-renderer": "^1.3.5", "prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"tailwindcss": "^3.2.4",
"url": "^0.11.0" "url": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {
@@ -3681,6 +3684,35 @@
"acorn": "^8" "acorn": "^8"
} }
}, },
"node_modules/acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dependencies": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
}
},
"node_modules/acorn-node/node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-node/node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-walk": { "node_modules/acorn-walk": {
"version": "8.2.0", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
@@ -3926,9 +3958,9 @@
} }
}, },
"node_modules/autoprefixer": { "node_modules/autoprefixer": {
"version": "10.4.12", "version": "10.4.13",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
"integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -3941,7 +3973,7 @@
], ],
"dependencies": { "dependencies": {
"browserslist": "^4.21.4", "browserslist": "^4.21.4",
"caniuse-lite": "^1.0.30001407", "caniuse-lite": "^1.0.30001426",
"fraction.js": "^4.2.0", "fraction.js": "^4.2.0",
"normalize-range": "^0.1.2", "normalize-range": "^0.1.2",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
@@ -4403,9 +4435,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001425", "version": "1.0.30001441",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
"integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -5478,6 +5510,14 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/defined": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/del": { "node_modules/del": {
"version": "6.1.1", "version": "6.1.1",
"resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
@@ -5583,6 +5623,22 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}, },
"node_modules/detective": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
"dependencies": {
"acorn-node": "^1.8.2",
"defined": "^1.0.0",
"minimist": "^1.2.6"
},
"bin": {
"detective": "bin/detective.js"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/dezalgo": { "node_modules/dezalgo": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
@@ -5592,6 +5648,11 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
},
"node_modules/dir-glob": { "node_modules/dir-glob": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5603,6 +5664,11 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"node_modules/dns-equal": { "node_modules/dns-equal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@@ -8688,6 +8754,14 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": { "node_modules/object-inspect": {
"version": "1.12.2", "version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
@@ -9242,6 +9316,14 @@
"url": "https://github.com/sponsors/jonschlinkert" "url": "https://github.com/sponsors/jonschlinkert"
} }
}, },
"node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pkg-dir": { "node_modules/pkg-dir": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -9307,9 +9389,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.4.18", "version": "8.4.20",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
"integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -9431,6 +9513,68 @@
"postcss": "^8.2.15" "postcss": "^8.2.15"
} }
}, },
"node_modules/postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.3.3"
}
},
"node_modules/postcss-load-config": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
"dependencies": {
"lilconfig": "^2.0.5",
"yaml": "^1.10.2"
},
"engines": {
"node": ">= 10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-loader": { "node_modules/postcss-loader": {
"version": "7.0.1", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz",
@@ -9614,6 +9758,24 @@
"postcss": "^8.1.0" "postcss": "^8.1.0"
} }
}, },
"node_modules/postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
"integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": ">=12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-normalize-charset": { "node_modules/postcss-normalize-charset": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
@@ -10282,6 +10444,17 @@
} }
] ]
}, },
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/randombytes": { "node_modules/randombytes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -10654,6 +10827,14 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0" "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
} }
}, },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/readable-stream": { "node_modules/readable-stream": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -12388,6 +12569,57 @@
"url": "https://github.com/fb55/entities?sponsor=1" "url": "https://github.com/fb55/entities?sponsor=1"
} }
}, },
"node_modules/tailwindcss": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",
"integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==",
"dependencies": {
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"color-name": "^1.1.4",
"detective": "^5.2.1",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"lilconfig": "^2.0.6",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.18",
"postcss-import": "^14.1.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.10",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.22.1"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=12.13.0"
},
"peerDependencies": {
"postcss": "^8.0.9"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/tapable": { "node_modules/tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -16634,6 +16866,28 @@
"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
"requires": {} "requires": {}
}, },
"acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
"integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"requires": {
"acorn": "^7.0.0",
"acorn-walk": "^7.0.0",
"xtend": "^4.0.2"
},
"dependencies": {
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
},
"acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
}
}
},
"acorn-walk": { "acorn-walk": {
"version": "8.2.0", "version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
@@ -16823,12 +17077,12 @@
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
}, },
"autoprefixer": { "autoprefixer": {
"version": "10.4.12", "version": "10.4.13",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
"integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
"requires": { "requires": {
"browserslist": "^4.21.4", "browserslist": "^4.21.4",
"caniuse-lite": "^1.0.30001407", "caniuse-lite": "^1.0.30001426",
"fraction.js": "^4.2.0", "fraction.js": "^4.2.0",
"normalize-range": "^0.1.2", "normalize-range": "^0.1.2",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
@@ -17158,9 +17412,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001425", "version": "1.0.30001441",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz",
"integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg=="
}, },
"ccount": { "ccount": {
"version": "1.1.0", "version": "1.1.0",
@@ -17901,6 +18155,11 @@
"object-keys": "^1.1.1" "object-keys": "^1.1.1"
} }
}, },
"defined": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q=="
},
"del": { "del": {
"version": "6.1.1", "version": "6.1.1",
"resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
@@ -17977,6 +18236,16 @@
} }
} }
}, },
"detective": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
"integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
"requires": {
"acorn-node": "^1.8.2",
"defined": "^1.0.0",
"minimist": "^1.2.6"
}
},
"dezalgo": { "dezalgo": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
@@ -17986,6 +18255,11 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
},
"dir-glob": { "dir-glob": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -17994,6 +18268,11 @@
"path-type": "^4.0.0" "path-type": "^4.0.0"
} }
}, },
"dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"dns-equal": { "dns-equal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@@ -20249,6 +20528,11 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
}, },
"object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="
},
"object-inspect": { "object-inspect": {
"version": "1.12.2", "version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
@@ -20666,6 +20950,11 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
}, },
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
},
"pkg-dir": { "pkg-dir": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -20715,9 +21004,9 @@
} }
}, },
"postcss": { "postcss": {
"version": "8.4.18", "version": "8.4.20",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
"integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
"requires": { "requires": {
"nanoid": "^3.3.4", "nanoid": "^3.3.4",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
@@ -20785,6 +21074,33 @@
"postcss-selector-parser": "^6.0.5" "postcss-selector-parser": "^6.0.5"
} }
}, },
"postcss-import": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
"integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
"requires": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
}
},
"postcss-js": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
"integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
"requires": {
"camelcase-css": "^2.0.1"
}
},
"postcss-load-config": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
"integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
"requires": {
"lilconfig": "^2.0.5",
"yaml": "^1.10.2"
}
},
"postcss-loader": { "postcss-loader": {
"version": "7.0.1", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz",
@@ -20892,6 +21208,14 @@
"icss-utils": "^5.0.0" "icss-utils": "^5.0.0"
} }
}, },
"postcss-nested": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
"integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
"requires": {
"postcss-selector-parser": "^6.0.10"
}
},
"postcss-normalize-charset": { "postcss-normalize-charset": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
@@ -21352,6 +21676,11 @@
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
}, },
"quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
},
"randombytes": { "randombytes": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -21635,6 +21964,14 @@
"use-latest": "^1.2.1" "use-latest": "^1.2.1"
} }
}, },
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"requires": {
"pify": "^2.3.0"
}
},
"readable-stream": { "readable-stream": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -22967,6 +23304,46 @@
} }
} }
}, },
"tailwindcss": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",
"integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==",
"requires": {
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"color-name": "^1.1.4",
"detective": "^5.2.1",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"lilconfig": "^2.0.6",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.18",
"postcss-import": "^14.1.0",
"postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.4",
"postcss-nested": "6.0.0",
"postcss-selector-parser": "^6.0.10",
"postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1",
"resolve": "^1.22.1"
},
"dependencies": {
"glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"requires": {
"is-glob": "^4.0.3"
}
}
}
},
"tapable": { "tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",

View File

@@ -18,11 +18,14 @@
"@docusaurus/core": "2.1.0", "@docusaurus/core": "2.1.0",
"@docusaurus/preset-classic": "2.1.0", "@docusaurus/preset-classic": "2.1.0",
"@mdx-js/react": "^1.6.22", "@mdx-js/react": "^1.6.22",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"docusaurus-preset-openapi": "^0.6.3", "docusaurus-preset-openapi": "^0.6.3",
"postcss": "^8.4.20",
"prism-react-renderer": "^1.3.5", "prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"tailwindcss": "^3.2.4",
"url": "^0.11.0" "url": "^0.11.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -3,11 +3,15 @@
* bundles Infima by default. Infima is a CSS framework designed to * bundles Infima by default. Infima is a CSS framework designed to
* work well for content-centric websites. * work well for content-centric websites.
*/ */
@tailwind base;
@tailwind components;
@tailwind utilities;
@import url("https://fonts.googleapis.com/css2?family=Overpass:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Overpass:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Snowburst+One&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Snowburst+One&display=swap");
html { html,
button {
font-family: "Overpass", sans-serif; font-family: "Overpass", sans-serif;
} }

View File

@@ -1,66 +0,0 @@
/**
* CSS files with the .module.css suffix will be treated as CSS modules
* and scoped locally.
*/
.heroBanner {
padding: 4rem 0;
position: relative;
overflow: hidden;
text-align: center;
background: #606c88;
background: -webkit-linear-gradient(to top, #4e5362, #606c88);
background: linear-gradient(to top, #4e5362, #606c88);
color: whitesmoke;
}
@media screen and (max-width: 996px) {
.heroBanner {
padding: 2rem;
}
}
.buttons {
display: flex;
align-items: center;
justify-content: center;
}
.buttonsRow {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
margin-bottom: 4rem;
gap: 1rem;
}
.installButton {
background-color: #adcbfa;
color: #000000;
border-radius: 50px;
}
.installButton:hover {
color: #000000;
}
.introButton {
background-color: #e6ebf5;
color: #000000;
border-radius: 50px;
}
.introButton:hover {
color: #000000;
}
.demoButton {
background-color: aquamarine;
color: #000000;
border-radius: 50px;
}
.demoButton:hover {
color: #000000;
}

View File

@@ -1,71 +1,54 @@
import React from "react"; import React from "react";
import clsx from "clsx";
import Link from "@docusaurus/Link"; import Link from "@docusaurus/Link";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import Layout from "@theme/Layout"; import Layout from "@theme/Layout";
import HomepageFeatures from "@site/src/components/HomepageFeatures";
import styles from "./index.module.css";
function HomepageHeader() { function HomepageHeader() {
const { siteConfig } = useDocusaurusContext();
return ( return (
<header className={clsx("hero hero--primary", styles.heroBanner)}> <header>
<div className="container"> <section className="text-center m-6 p-12 border border-red-400 rounded-[50px] bg-gray-100 dark:bg-immich-dark-gray">
<h1 <h1 className="md:text-6xl font-bold mb-10 font-immich-title text-immich-primary dark:text-immich-dark-primary">
className="hero__title"
style={{
fontFamily: "Snowburst One",
color: "#adcbfa",
}}
>
IMMICH IMMICH
</h1> </h1>
<p className="hero__subtitle">{siteConfig.tagline}</p> <div className="font-thin sm:text-base md:text-2xl my-12 sm:leading-tight">
<div className={styles.buttonsRow}> <p>SELF-HOSTED BACKUP SOLUTION </p>
<div className={styles.buttons}> <p>FOR PHOTOS AND VIDEOS</p>
<Link <p>ON MOBILE DEVICE</p>
className={clsx("button button--lg", styles.introButton)} </div>
to="docs/overview/introduction"
>
Introduction
</Link>
</div>
<div className={styles.buttons}> <div className="flex place-items-center place-content-center mt-9 mb-16 gap-4 ">
<Link <Link
className={clsx("button button--lg", styles.installButton)} className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary dark:bg-immich-dark-primary rounded-full no-underline hover:no-underline text-white hover:text-gray-50 dark:text-immich-dark-bg font-bold"
to="docs/installation/requirements" to="docs/overview/introduction"
> >
Installation GET STARTED
</Link> </Link>
</div>
<div className={styles.buttons}> <Link
<Link className="flex place-items-center place-content-center py-3 px-8 border bg-immich-primary/10 dark:bg-gray-300 rounded-full hover:no-underline text-immich-primary dark:text-immich-dark-bg font-bold"
className={clsx("button button--lg", styles.demoButton)} to="https://demo.immich.app/"
to="https://demo.immich.app/" >
> DEMO PORTAL
Demo </Link>
</Link>
</div>
</div> </div>
<img src="/img/immich-screenshots.webp" alt="logo" /> <img src="/img/immich-screenshots.webp" alt="logo" />
</div> </section>
</header> </header>
); );
} }
export default function Home(): JSX.Element { export default function Home(): JSX.Element {
const { siteConfig } = useDocusaurusContext();
return ( return (
<Layout <Layout
title={`Home`} title={`Home`}
description="immich Self-hosted photo and video backup solution directly from your mobile phone " description="immich Self-hosted photo and video backup solution directly from your mobile phone "
noFooter={true}
> >
<HomepageHeader /> <HomepageHeader />
<main>{/* <HomepageFeatures /> */}</main> <div className="flex flex-col place-items-center place-content-center">
<p>This project is available under MIT license.</p>
<p className="text-xs">Privacy should not be a luxury</p>
</div>
</Layout> </Layout>
); );
} }

30
docs/tailwind.config.js Normal file
View File

@@ -0,0 +1,30 @@
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
corePlugins: {
preflight: false, // disable Tailwind's reset
},
content: ["./src/**/*.{js,jsx,ts,tsx}", "../docs/**/*.mdx"], // my markdown stuff is in ../docs, not /src
darkMode: ["class", '[data-theme="dark"]'], // hooks into docusaurus' dark mode settigns
theme: {
extend: {
colors: {
// Light Theme
"immich-primary": "#4250af",
"immich-bg": "white",
"immich-fg": "black",
"immich-gray": "#F6F6F4",
// Dark Theme
"immich-dark-primary": "#adcbfa",
"immich-dark-bg": "black",
"immich-dark-fg": "#e5e7eb",
"immich-dark-gray": "#212121",
},
fontFamily: {
"immich-title": ["Snowburst One", "cursive"],
},
},
},
plugins: [],
};

21
docs/vercel.json Normal file
View File

@@ -0,0 +1,21 @@
{
"redirects": [
{ "source": "/docs", "destination": "/docs/overview/introduction" },
{ "source": "/docs/mobile-app-beta-program", "destination": "/docs/features/mobile-app" },
{ "source": "/docs/contribution-guidelines", "destination": "/docs/overview/support-the-project#contributing" },
{ "source": "/docs/install", "destination": "/docs/install/docker-compose" },
{ "source": "/docs/installation/one-step-installation", "destination": "/docs/install/script" },
{ "source": "/docs/installation/portainer-installation", "destination": "/docs/install/portainer" },
{ "source": "/docs/installation/recommended-installation", "destination": "/docs/install/docker-compose" },
{ "source": "/docs/installation/unraid", "destination": "/docs/install/unraid" },
{ "source": "/docs/installation/requirements", "destination": "/docs/install/requirements" },
{ "source": "/docs/overview/logo-meaning", "destination": "/docs/overview/logo" },
{ "source": "/docs/overview/technology-stack", "destination": "/docs/developer/architecture" },
{ "source": "/docs/usage/automatic-backup", "destination": "/docs/features/automatic-backup" },
{ "source": "/docs/usage/bulk-upload", "destination": "/docs/features/bulk-upload" },
{ "source": "/docs/usage/oauth", "destination": "/docs/features/oauth" },
{ "source": "/docs/usage/post-installation", "destination": "/docs/install/post-install" },
{ "source": "/docs/usage/update", "destination": "/docs/install/docker-compose#step-4---upgrading" },
{ "source": "/docs/usage/server-commands", "destination": "/docs/features/server-commands" }
]
}

View File

@@ -1,11 +1,20 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.alextran.immich" xmlns:tools="http://schemas.android.com/tools"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="app.alextran.immich"
<application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true"> xmlns:tools="http://schemas.android.com/tools">
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <application android:label="Immich" android:name=".ImmichApp" android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher" android:requestLegacyExternalStorage="true">
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as <!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the
while the Flutter UI initializes. After that, this theme continues Android process has started. This theme is visible to the user
to determine the Window background behind the Flutter UI. --> while the
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> Flutter UI initializes. After that, this theme continues
to determine the
Window background behind the Flutter UI. -->
<meta-data android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@@ -25,7 +34,8 @@
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to
generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" /> <meta-data android:name="flutterEmbedding" android:value="2" />
<!-- Disables default WorkManager initialization to use our custom initialization --> <!-- Disables default WorkManager initialization to use our custom initialization -->
<provider <provider
@@ -33,14 +43,17 @@
android:authorities="${applicationId}.androidx-startup" android:authorities="${applicationId}.androidx-startup"
tools:node="remove"></provider> tools:node="remove"></provider>
</application> </application>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- If you want to read images--> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- If you want to read videos--> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- If you want to read audio--> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<queries> <queries>
<intent> <intent>

View File

@@ -35,8 +35,8 @@ platform :android do
task: 'bundle', task: 'bundle',
build_type: 'Release', build_type: 'Release',
properties: { properties: {
"android.injected.version.code" => 60, "android.injected.version.code" => 63,
"android.injected.version.name" => "1.38.0", "android.injected.version.name" => "1.40.0",
} }
) )
upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab') upload_to_play_store(skip_upload_apk: true, skip_upload_images: true, skip_upload_screenshots: true, aab: '../build/app/outputs/bundle/release/app-release.aab')

View File

@@ -0,0 +1 @@
* Hot fix: timeline crash when trying to group invalid date info.

View File

@@ -0,0 +1 @@
* Add additional supported translation for CZ, SK, and CN

View File

@@ -0,0 +1,5 @@
* Added Autofill login form
* Added Delete button in detail viewer
* Added Disable autocorrection on endpoint URL
* Fixed Notification android 13 permission
* Fixed Minor typo

View File

@@ -5,17 +5,17 @@
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.000201"> <testcase classname="fastlane.lanes" name="0: default_platform" time="0.000213">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="1: bundleRelease" time="63.132489"> <testcase classname="fastlane.lanes" name="1: bundleRelease" time="61.218233">
</testcase> </testcase>
<testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="38.15883"> <testcase classname="fastlane.lanes" name="2: upload_to_play_store" time="41.974053">
</testcase> </testcase>

View File

@@ -0,0 +1,194 @@
{
"album_info_card_backup_album_excluded": "VYLOUČENO",
"album_info_card_backup_album_included": "ZAHRNUTO",
"album_thumbnail_card_item": "1 položka",
"album_thumbnail_card_items": "{} položky",
"album_thumbnail_card_shared": "Sdíleno",
"album_viewer_appbar_share_delete": "odstranit album",
"album_viewer_appbar_share_err_delete": "Nepodařilo se odstranit album",
"album_viewer_appbar_share_err_leave": "Nepodařilo se ukončit album",
"album_viewer_appbar_share_err_remove": "Při odstraňování souborů z alba se vyskytly problémy.",
"album_viewer_appbar_share_err_title": "Nepodařilo se změnit název alba",
"album_viewer_appbar_share_leave": "Opustit album",
"album_viewer_appbar_share_remove": "Odstranit z alba",
"album_viewer_page_share_add_users": "Přidat uživatele",
"asset_list_settings_subtitle": "Nastavení rozložení mřížky fotografií",
"asset_list_settings_title": "Fotografická mřížka",
"backup_album_selection_page_albums_device": "Alba v zařízení ({})",
"backup_album_selection_page_albums_tap": "Klepnutím na položku ji zahrnete, dvojím klepnutím ji vyloučíte",
"backup_album_selection_page_assets_scatter": "Soubory mohou být roztroušeny ve více albech. To umožňuje zahrnout nebo vyloučit alba během procesu zálohování.",
"backup_album_selection_page_select_albums": "Vybraná alba",
"backup_album_selection_page_selection_info": "Informace o výběru",
"backup_album_selection_page_total_assets": "Celkový počet jedinečných souborů",
"backup_all": "Vše",
"backup_background_service_backup_failed_message": "Zálohování zdrojů selhalo. Zkouším to znovu...",
"backup_background_service_connection_failed_message": "Nepodařilo se připojit k serveru. Zkouším to znovu...",
"backup_background_service_current_upload_notification": "Nahrávání {}",
"backup_background_service_default_notification": "Kontrola nových zdrojů {}",
"backup_background_service_error_title": "Chyba zálohování",
"backup_background_service_in_progress_notification": "Vytvářím kopii vašich zdrojů...",
"backup_background_service_upload_failure_notification": "Nepodařilo se nahrát {}",
"backup_controller_page_albums": "Zálohovaná alba",
"backup_controller_page_background_battery_info_link": "Ukaž mi jak",
"backup_controller_page_background_battery_info_message": "Chcete-li dosáhnout nejlepších výsledků při zálohování na pozadí, vypněte všechny optimalizace baterie, které omezují aktivitu na pozadí pro Immich ve vašem zařízení. Jelikož to závisí na zařízení, zkontrolujte požadované informace pro výrobce vašeho zařízení.",
"backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Optimalizace baterie",
"backup_controller_page_background_charging": "Pouze během nabíjení",
"backup_controller_page_background_configure_error": "Nepodařilo se nakonfigurovat službu na pozadí",
"backup_controller_page_background_delay": "Zpoždění zálohování nových zdrojů: {}",
"backup_controller_page_background_description": "Povolte službu na pozadí pro automatické zálohování všech nových aktiv bez nutnosti otevření aplikace",
"backup_controller_page_background_is_off": "Automatické zálohování na pozadí je vypnuto",
"backup_controller_page_background_is_on": "Automatické zálohování na pozadí je zapnuto",
"backup_controller_page_background_turn_off": "Zakázat službu na pozadí",
"backup_controller_page_background_turn_on": "Povolit službu na pozadí",
"backup_controller_page_background_wifi": "Jen na WiFi",
"backup_controller_page_backup": "Zálohování",
"backup_controller_page_backup_selected": "Vybrané: ",
"backup_controller_page_backup_sub": "Zálohování fotografií a videí",
"backup_controller_page_cancel": "Zrušit",
"backup_controller_page_created": "Vytvořeno: {}",
"backup_controller_page_desc_backup": "Zapněte zálohování na popředí, aby se nové položky automaticky nahrávaly na server při otevření aplikace.",
"backup_controller_page_excluded": "Vyloučeno: ",
"backup_controller_page_failed": "Nepodařilo se ({})",
"backup_controller_page_filename": "Název souboru: {} [{}]",
"backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "Informace o zálohování",
"backup_controller_page_none_selected": "Žádné vybrané",
"backup_controller_page_remainder": "Zbytek",
"backup_controller_page_remainder_sub": "Zbývající fotografie a alba, která se mají zálohovat z výběru",
"backup_controller_page_select": "Vybrat",
"backup_controller_page_server_storage": "Serverové úložiště",
"backup_controller_page_start_backup": "Spustit zálohování",
"backup_controller_page_status_off": "Automatické zálohování na popředí je vypnuto",
"backup_controller_page_status_on": "Automatické zálohování na popředí je zapnuto",
"backup_controller_page_storage_format": "{} z {} použitých",
"backup_controller_page_to_backup": "Alba, která mají být zálohována",
"backup_controller_page_total": "Celkem",
"backup_controller_page_total_sub": "Všechny jedinečné fotografie a videa z vybraných alb",
"backup_controller_page_turn_off": "Zakázat zálohování na popředí",
"backup_controller_page_turn_on": "Povolit zálohování na popředí",
"backup_controller_page_uploading_file_info": "Nahrávání informací o souborech",
"backup_err_only_album": "Nelze odstranit pouze album",
"backup_info_card_assets": "položky",
"cache_settings_album_thumbnails": "Náhledy stránek knihovny (položek {})",
"cache_settings_clear_cache_button": "Vymazat vyrovnávací paměť",
"cache_settings_clear_cache_button_title": "Vymaže vyrovnávací paměť aplikace. To výrazně ovlivní výkon aplikace, dokud se vyrovnávací paměť neobnoví.",
"cache_settings_image_cache_size": "Velikost vyrovnávací paměti (položek {})",
"cache_settings_statistics_album": "Knihovna náhledů",
"cache_settings_statistics_assets": "{} položky ({})",
"cache_settings_statistics_full": "Kompletní fotografie",
"cache_settings_statistics_shared": "Sdílené náhledy alb",
"cache_settings_statistics_thumbnail": "Náhledy",
"cache_settings_statistics_title": "Použití vyrovnávací paměti",
"cache_settings_subtitle": "Ovládání chování mobilní aplikace Immich v mezipaměti",
"cache_settings_thumbnail_size": "Velikost vyrovnávací paměti náhledů (položek {})",
"cache_settings_title": "Nastavení vyrovnávací paměti",
"control_bottom_app_bar_add_to_album": "Přidat do alba",
"control_bottom_app_bar_album_info": "{} položky",
"control_bottom_app_bar_album_info_shared": "{} položky - sdílené",
"control_bottom_app_bar_create_new_album": "Vytvořit nové album",
"control_bottom_app_bar_delete": "Vymazat",
"control_bottom_app_bar_share": "Sdílet",
"create_album_page_untitled": "Bez názvu",
"create_shared_album_page_create": "Vytvořit",
"create_shared_album_page_share": "Sdílet",
"create_shared_album_page_share_add_assets": "PŘIDAT",
"create_shared_album_page_share_select_photos": "Vybrat fotografie",
"daily_title_text_date": "EEEE, d MMMM",
"daily_title_text_date_year": "EEEE, d MMMM y",
"date_format": "EEEE, d MMMM y • H:mm",
"delete_dialog_alert": "Tyto položky budou trvale odstraněny z Immich a z vašeho zařízení.",
"delete_dialog_cancel": "Zrušit",
"delete_dialog_ok": "Vymazat",
"delete_dialog_title": "Vymazat trvale",
"exif_bottom_sheet_description": "Přidat popis...",
"exif_bottom_sheet_details": "PODROBNOSTI",
"exif_bottom_sheet_location": "LOKALITA",
"experimental_settings_new_asset_list_subtitle": "Probíhající práce",
"experimental_settings_new_asset_list_title": "Povolení experimentální mřížky fotografií",
"experimental_settings_subtitle": "Používejte na vlastní riziko!",
"experimental_settings_title": "Experimentální",
"home_page_add_to_album_conflicts": "Přidány {added} položky do alba {album}. {failed} položky jsou již v albu.",
"home_page_add_to_album_success": "Přidány položky {added} do alba {album}.",
"library_page_albums": "Alba",
"library_page_new_album": "Nové album",
"login_form_button_text": "Přihlášení",
"login_form_email_hint": "tvůjmail@email.com",
"login_form_endpoint_hint": "http://ip-tvého-serveru:port/api",
"login_form_endpoint_url": "URL adresa serveru",
"login_form_err_http": "Prosím, uveďte http:// nebo https://",
"login_form_err_invalid_email": "Neplatný e-mail",
"login_form_err_leading_whitespace": "Úvodní mezera",
"login_form_err_trailing_whitespace": "Koncová mezera",
"login_form_failed_get_oauth_server_config": "Chyba přihlášení pomocí OAuth, zkontrolujte adresu URL serveru",
"login_form_failed_get_oauth_server_disable": "Funkce OAuth není na tomto serveru dostupná",
"login_form_failed_login": "Chyba přihlášení, zkontrolujte url adresu serveru, e-mail a heslo.",
"login_form_label_email": "E-mail",
"login_form_label_password": "Heslo",
"login_form_password_hint": "heslo",
"login_form_save_login": "Zůstat přihlášen",
"monthly_title_text_date_format": "LLLL y",
"profile_drawer_app_logs": "Logy",
"profile_drawer_client_server_up_to_date": "Klient a server jsou aktuální",
"profile_drawer_settings": "Nastavení",
"profile_drawer_sign_out": "Odhlásit se",
"search_bar_hint": "Prohledejte své obrázky",
"search_page_no_objects": "Žádné informace o objektech",
"search_page_no_places": "Žádné informace o místě",
"search_page_places": "Místa",
"search_page_things": "Věci",
"search_result_page_new_search_hint": "Nové vyhledávání",
"select_additional_user_for_sharing_page_suggestions": "Návrhy",
"select_user_for_sharing_page_err_album": "Nepodařilo se vytvořit album",
"select_user_for_sharing_page_share_suggestions": "Návrhy",
"setting_image_viewer_help": "V prohlížeči detailů se nejprve načte malá miniatura, poté se načte náhled střední velikosti (je-li povolen) a nakonec se načte originál (je-li povolen).",
"setting_image_viewer_original_subtitle": "Umožňuje načíst původní obrázek v plném rozlišení (velký!). Zakázat pro snížení používání dat (v síti iv mezipaměti zařízení).",
"setting_image_viewer_original_title": "Načíst původní obrázek",
"setting_image_viewer_preview_subtitle": "Umožňuje načíst obrázek se středním rozlišením. Zakažte, pokud chcete přímo načíst originál nebo použít pouze miniaturu.",
"setting_image_viewer_preview_title": "Načíst náhled obrázku",
"setting_notifications_notify_failures_grace_period": "Oznámení o selhání zálohování na pozadí: {}",
"setting_notifications_notify_hours": "{} hodin",
"setting_notifications_notify_immediately": "okamžitě",
"setting_notifications_notify_minutes": "{} minut",
"setting_notifications_notify_never": "nikdy",
"setting_notifications_notify_seconds": "{} sekundy",
"setting_notifications_single_progress_subtitle": "Podrobné informace o průběhu nahrávání pro položku",
"setting_notifications_single_progress_title": "Zobrazit průběh detailů zálohování na pozadí",
"setting_notifications_subtitle": "Přizpůsobení předvoleb oznámení",
"setting_notifications_title": "Oznámení",
"setting_notifications_total_progress_subtitle": "Celkový průběh nahrávání (hotové/celkové položky)",
"setting_notifications_total_progress_title": "Zobrazit celkový průběh zálohování na pozadí",
"setting_pages_app_bar_settings": "nastavení",
"settings_require_restart": "Pro použití tohoto nastavení restartujte Immich",
"share_add": "Přidat",
"share_add_photos": "Přidat fotografie",
"share_add_title": "Přidat název",
"share_create_album": "Vytvořit album",
"share_dialog_preparing": "Připravuji...",
"share_invite": "Pozvat do alba",
"sharing_page_album": "Shared albums",
"sharing_page_description": "Vytvářejte sdílená alba a sdílejte fotografie a videa s lidmi ve vaší síti.",
"sharing_page_empty_list": "Prázný dopis",
"sharing_silver_appbar_create_shared_album": "Vytvořit sdílené album",
"sharing_silver_appbar_share_partner": "Sdílet s partnerem",
"tab_controller_nav_library": "Knihovna",
"tab_controller_nav_photos": "Fotografie",
"tab_controller_nav_search": "Vyhledávání",
"tab_controller_nav_sharing": "Sdílení",
"theme_setting_asset_list_storage_indicator_title": "Zobrazit indikátor úložiště na dlaždicích zdrojů",
"theme_setting_asset_list_tiles_per_row_title": "Počet aktiv na řádek ({})",
"theme_setting_dark_mode_switch": "Tmavé téma",
"theme_setting_image_viewer_quality_subtitle": "Přizpůsobení kvality prohlížeče detailů",
"theme_setting_image_viewer_quality_title": "Kvalita prohlížeče obrázků",
"theme_setting_system_theme_switch": "Automaticky (podle systemového nastavení)",
"theme_setting_theme_subtitle": "Vyberte nastavení tématu aplikace",
"theme_setting_theme_title": "Téma",
"theme_setting_three_stage_loading_subtitle": "Třístupňové načítání může zvýšit výkonnost načítání, ale vede k výrazně vyššímu zatížení sítě.",
"theme_setting_three_stage_loading_title": "Povolení třístupňového načítání",
"version_announcement_overlay_ack": "Potvrdit",
"version_announcement_overlay_release_notes": "poznámky k vydání",
"version_announcement_overlay_text_1": "Ahoj, je zde nová verze",
"version_announcement_overlay_text_2": "najděte si čas na návštěvu ",
"version_announcement_overlay_text_3": " a ujistěte se, že vaše konfigurace docker-compose a .env je aktuální, abyste předešli nesprávné konfiguraci, zvláště pokud používáte WatchTower nebo jakýkoli mechanismus, který podporuje automatické aktualizace serverových aplikací.",
"version_announcement_overlay_title": "K dispozici je nová verze serveru \uD83C\uDF89"
}

View File

@@ -35,7 +35,7 @@
"backup_controller_page_background_battery_info_title": "Batterioptimering", "backup_controller_page_background_battery_info_title": "Batterioptimering",
"backup_controller_page_background_charging": "Kun under opladning", "backup_controller_page_background_charging": "Kun under opladning",
"backup_controller_page_background_configure_error": "Fejlede konfigureringen af baggrundsbackup", "backup_controller_page_background_configure_error": "Fejlede konfigureringen af baggrundsbackup",
"backup_controller_page_background_delay": "Delay new assets backup: {}", "backup_controller_page_background_delay": "Udskyd backup af nye billeder og videoer: {}",
"backup_controller_page_background_description": "Slå baggrundsbackup til, for automatisk at tage backup af nye billeder og videoer, uden at skulle åbne appen", "backup_controller_page_background_description": "Slå baggrundsbackup til, for automatisk at tage backup af nye billeder og videoer, uden at skulle åbne appen",
"backup_controller_page_background_is_off": "Automatisk baggrundsbackup er slået fra", "backup_controller_page_background_is_off": "Automatisk baggrundsbackup er slået fra",
"backup_controller_page_background_is_on": "Automatisk baggrundsbackup er slået til", "backup_controller_page_background_is_on": "Automatisk baggrundsbackup er slået til",
@@ -83,10 +83,10 @@
"cache_settings_subtitle": "Håndter cache-adfærden for Immich-appen.", "cache_settings_subtitle": "Håndter cache-adfærden for Immich-appen.",
"cache_settings_thumbnail_size": "Størrelse af miniaturebillede cache ({} billeder og videoer)", "cache_settings_thumbnail_size": "Størrelse af miniaturebillede cache ({} billeder og videoer)",
"cache_settings_title": "Cache-indstillinger", "cache_settings_title": "Cache-indstillinger",
"control_bottom_app_bar_add_to_album": "Add to album", "control_bottom_app_bar_add_to_album": "Tilføj til album",
"control_bottom_app_bar_album_info": "{} items", "control_bottom_app_bar_album_info": "{} genstande",
"control_bottom_app_bar_album_info_shared": "{} items · Shared", "control_bottom_app_bar_album_info_shared": "{} genstande • Delt",
"control_bottom_app_bar_create_new_album": "Create new album", "control_bottom_app_bar_create_new_album": "Opret nyt album",
"control_bottom_app_bar_delete": "Slet", "control_bottom_app_bar_delete": "Slet",
"control_bottom_app_bar_share": "Del", "control_bottom_app_bar_share": "Del",
"create_album_page_untitled": "Uden titel", "create_album_page_untitled": "Uden titel",
@@ -108,8 +108,8 @@
"experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter", "experimental_settings_new_asset_list_title": "Aktiver eksperimentelt fotogitter",
"experimental_settings_subtitle": "Brug på eget ansvar!", "experimental_settings_subtitle": "Brug på eget ansvar!",
"experimental_settings_title": "Eksperimentelle", "experimental_settings_title": "Eksperimentelle",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.", "home_page_add_to_album_conflicts": "Tilføjede {added} billeder og videoer til album {album}. {failed} billeder og videoer er allerede i albummet.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.", "home_page_add_to_album_success": "Tilføjede {added} billeder og videoer til album {album}.",
"library_page_albums": "Albummer", "library_page_albums": "Albummer",
"library_page_new_album": "Nyt album", "library_page_new_album": "Nyt album",
"login_form_button_text": "Log ind", "login_form_button_text": "Log ind",
@@ -120,15 +120,15 @@
"login_form_err_invalid_email": "Ugyldig email", "login_form_err_invalid_email": "Ugyldig email",
"login_form_err_leading_whitespace": "Mellemrum før", "login_form_err_leading_whitespace": "Mellemrum før",
"login_form_err_trailing_whitespace": "Mellemrum efter", "login_form_err_trailing_whitespace": "Mellemrum efter",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL", "login_form_failed_get_oauth_server_config": "Fejl med at logge på med OAuth. Tjek serveres URL",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server", "login_form_failed_get_oauth_server_disable": "OAuth er ikke tilgængelig på denne server",
"login_form_failed_login": "Der opstod en vejl ved at logge ind. Tjek server URL, email og kodeordet", "login_form_failed_login": "Der opstod en vejl ved at logge ind. Tjek server URL, email og kodeordet",
"login_form_label_email": "Email", "login_form_label_email": "Email",
"login_form_label_password": "Kodeord", "login_form_label_password": "Kodeord",
"login_form_password_hint": "kodeord", "login_form_password_hint": "kodeord",
"login_form_save_login": "Forbliv logget ind", "login_form_save_login": "Forbliv logget ind",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs", "profile_drawer_app_logs": "Log",
"profile_drawer_client_server_up_to_date": "Klient og server er ajour", "profile_drawer_client_server_up_to_date": "Klient og server er ajour",
"profile_drawer_settings": "Indstillinger", "profile_drawer_settings": "Indstillinger",
"profile_drawer_sign_out": "Log ud", "profile_drawer_sign_out": "Log ud",
@@ -141,17 +141,17 @@
"select_additional_user_for_sharing_page_suggestions": "Anbefalinger", "select_additional_user_for_sharing_page_suggestions": "Anbefalinger",
"select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album", "select_user_for_sharing_page_err_album": "Fejlede i at oprette et nyt album",
"select_user_for_sharing_page_share_suggestions": "Anbefalinger", "select_user_for_sharing_page_share_suggestions": "Anbefalinger",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).", "setting_image_viewer_help": "Detaljeret visning indlæser miniaturebilleder først. Herefter indlæses mediumstørrelse forhåndsvisning af billedet (hvis dette er slået til), for til sidst at vise originalen (hvis dette er slået til).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).", "setting_image_viewer_original_subtitle": "Slå indlæsning af originalbillede i fuld størrelse til (stort!). Deaktiver for at reducere dataforbruget (både på netværket og for enhedscache).",
"setting_image_viewer_original_title": "Load original image", "setting_image_viewer_original_title": "Indlæs originalbillede",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.", "setting_image_viewer_preview_subtitle": "Slå indlæsning af et mediumstørrelse billede til. Slå fra for enten direkte at indlæse originalen eller kun at bruge miniaturebilledet.",
"setting_image_viewer_preview_title": "Load preview image", "setting_image_viewer_preview_title": "Indlæs forhåndsvisning af billedet",
"setting_notifications_notify_failures_grace_period": "Giv besked om baggrundsbackupfejl: {}", "setting_notifications_notify_failures_grace_period": "Giv besked om baggrundsbackupfejl: {}",
"setting_notifications_notify_hours": "{} timer", "setting_notifications_notify_hours": "{} timer",
"setting_notifications_notify_immediately": "med det samme", "setting_notifications_notify_immediately": "med det samme",
"setting_notifications_notify_minutes": "{} minutter", "setting_notifications_notify_minutes": "{} minutter",
"setting_notifications_notify_never": "aldrig", "setting_notifications_notify_never": "aldrig",
"setting_notifications_notify_seconds": "{} seconds", "setting_notifications_notify_seconds": "{} sekunder",
"setting_notifications_single_progress_subtitle": "Detaljeret uploadstatus pr. billed og video", "setting_notifications_single_progress_subtitle": "Detaljeret uploadstatus pr. billed og video",
"setting_notifications_single_progress_title": "Vis detaljeret baggrundsuploadstatus", "setting_notifications_single_progress_title": "Vis detaljeret baggrundsuploadstatus",
"setting_notifications_subtitle": "Tilpas dine notifikationspræferencer", "setting_notifications_subtitle": "Tilpas dine notifikationspræferencer",

View File

@@ -62,7 +62,7 @@
"backup_controller_page_status_off": "Automatic foreground backup is off", "backup_controller_page_status_off": "Automatic foreground backup is off",
"backup_controller_page_status_on": "Automatic foreground backup is on", "backup_controller_page_status_on": "Automatic foreground backup is on",
"backup_controller_page_storage_format": "{} of {} used", "backup_controller_page_storage_format": "{} of {} used",
"backup_controller_page_to_backup": "Albums to be backup", "backup_controller_page_to_backup": "Albums to be backed up",
"backup_controller_page_total": "Total", "backup_controller_page_total": "Total",
"backup_controller_page_total_sub": "All unique photos and videos from selected albums", "backup_controller_page_total_sub": "All unique photos and videos from selected albums",
"backup_controller_page_turn_off": "Turn off foreground backup", "backup_controller_page_turn_off": "Turn off foreground backup",
@@ -191,4 +191,4 @@
"version_announcement_overlay_text_2": "please take your time to visit the ", "version_announcement_overlay_text_2": "please take your time to visit the ",
"version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.", "version_announcement_overlay_text_3": " and ensure your docker-compose and .env setup is up-to-date to prevent any misconfigurations, especially if you use WatchTower or any mechanism that handles updating your server application automatically.",
"version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89" "version_announcement_overlay_title": "New Server Version Available \uD83C\uDF89"
} }

View File

@@ -1,96 +1,96 @@
{ {
"album_info_card_backup_album_excluded": "EXCLUIDOS", "album_info_card_backup_album_excluded": "EXCLUIDOS",
"album_info_card_backup_album_included": "INCLUIDOS", "album_info_card_backup_album_included": "INCLUIDOS",
"album_thumbnail_card_item": "1 item", "album_thumbnail_card_item": "1 elemento",
"album_thumbnail_card_items": "{} items", "album_thumbnail_card_items": "{} elementos",
"album_thumbnail_card_shared": " · Shared", "album_thumbnail_card_shared": " · Compartido",
"album_viewer_appbar_share_delete": "Eliminar álbum ", "album_viewer_appbar_share_delete": "Eliminar álbum",
"album_viewer_appbar_share_err_delete": "No ha podido eliminar el álbum", "album_viewer_appbar_share_err_delete": "No se ha podido eliminar el álbum",
"album_viewer_appbar_share_err_leave": "No ha podido dejar el álbum", "album_viewer_appbar_share_err_leave": "No se ha podido dejar el álbum",
"album_viewer_appbar_share_err_remove": "Hay problemas para eliminar los activos del álbum", "album_viewer_appbar_share_err_remove": "Hay problemas para eliminar contenidos del álbum",
"album_viewer_appbar_share_err_title": "Error al cambiar el título del álbum ", "album_viewer_appbar_share_err_title": "No se ha podido cambiar el título del álbum",
"album_viewer_appbar_share_leave": "Abandonar álbum ", "album_viewer_appbar_share_leave": "Abandonar álbum",
"album_viewer_appbar_share_remove": "Eliminar del álbum ", "album_viewer_appbar_share_remove": "Eliminar del álbum",
"album_viewer_page_share_add_users": "Añadir usuarios", "album_viewer_page_share_add_users": "Añadir usuarios",
"asset_list_settings_subtitle": "Photo grid layout settings", "asset_list_settings_subtitle": "Configuración de la galería",
"asset_list_settings_title": "Photo Grid", "asset_list_settings_title": "Galería",
"backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})", "backup_album_selection_page_albums_device": "Álbumes en el dispositivo ({})",
"backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir", "backup_album_selection_page_albums_tap": "Toque para incluir, doble toque para excluir",
"backup_album_selection_page_assets_scatter": "Los activos pueden dispersarse en varios álbumes. De este modo, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.", "backup_album_selection_page_assets_scatter": "Los elementos pueden estar en varios álbumes. Por eso, los álbumes pueden ser incluidos o excluidos durante el proceso de copia de seguridad.",
"backup_album_selection_page_select_albums": "Seleccionar Álbumes", "backup_album_selection_page_select_albums": "Seleccionar álbumes",
"backup_album_selection_page_selection_info": "Información sobre la Selección", "backup_album_selection_page_selection_info": "Información sobre la selección",
"backup_album_selection_page_total_assets": "Total de activos únicos", "backup_album_selection_page_total_assets": "Total de elementos únicos",
"backup_all": "Todos", "backup_all": "Todos",
"backup_background_service_backup_failed_message": "Failed to backup assets. Retrying…", "backup_background_service_backup_failed_message": "No se ha podido realizar la copia de seguridad. Reintentando…",
"backup_background_service_connection_failed_message": "Failed to connect to the server. Retrying…", "backup_background_service_connection_failed_message": "No se ha podido conectar con el servidor. Reintentando…",
"backup_background_service_current_upload_notification": "Uploading {}", "backup_background_service_current_upload_notification": "Subidendo {}",
"backup_background_service_default_notification": "Checking for new assets…", "backup_background_service_default_notification": "Buscando nuevos elementos…",
"backup_background_service_error_title": "Backup error", "backup_background_service_error_title": "Error de copia de seguridad",
"backup_background_service_in_progress_notification": "Backing up your assets…", "backup_background_service_in_progress_notification": "Subiendo elementos…",
"backup_background_service_upload_failure_notification": "Failed to upload {}", "backup_background_service_upload_failure_notification": "Error al subir {}",
"backup_controller_page_albums": "Álbumes de copia de seguridad", "backup_controller_page_albums": "Álbumes de copia de seguridad",
"backup_controller_page_background_battery_info_link": "Show me how", "backup_controller_page_background_battery_info_link": "Muéstrame cómo",
"backup_controller_page_background_battery_info_message": "For the best background backup experience, please disable any battery optimizations restricting background activity for Immich.\n\nSince this is device-specific, please lookup the required information for your device manufacturer.", "backup_controller_page_background_battery_info_message": "Para disfrutar de la mejor experiencia de copia de seguridad en segundo plano, desactive cualquier optimización de la batería que restrinja la actividad en segundo plano para Immich.\nDado que esto es específico de cada dispositivo, busque la información necesaria para el fabricante de su dispositivo.",
"backup_controller_page_background_battery_info_ok": "OK", "backup_controller_page_background_battery_info_ok": "OK",
"backup_controller_page_background_battery_info_title": "Battery optimizations", "backup_controller_page_background_battery_info_title": "Optimización de batería",
"backup_controller_page_background_charging": "Only while charging", "backup_controller_page_background_charging": "Sólo mientras carga",
"backup_controller_page_background_configure_error": "Failed to configure the background service", "backup_controller_page_background_configure_error": "Error al configurar el servicio en segundo plano",
"backup_controller_page_background_delay": "Delay new assets backup: {}", "backup_controller_page_background_delay": "Delay new assets backup: {}",
"backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app", "backup_controller_page_background_description": "Activar el servicio en segundo plano para realizar copias de seguridad automáticas de los nuevos elementos sin tener que abrir la aplicación",
"backup_controller_page_background_is_off": "Automatic background backup is off", "backup_controller_page_background_is_off": "Copia de seguridad automática apagada",
"backup_controller_page_background_is_on": "Automatic background backup is on", "backup_controller_page_background_is_on": "Copia de seguridad automática encendida",
"backup_controller_page_background_turn_off": "Turn off background service", "backup_controller_page_background_turn_off": "Desactivar el servicio en segundo plano",
"backup_controller_page_background_turn_on": "Turn on background service", "backup_controller_page_background_turn_on": "Activar el servicio en segundo plano",
"backup_controller_page_background_wifi": "Only on WiFi", "backup_controller_page_background_wifi": "Sólo con WiFi",
"backup_controller_page_backup": "Copia de Seguridad", "backup_controller_page_backup": "Copia de Seguridad",
"backup_controller_page_backup_selected": "Seleccionado:", "backup_controller_page_backup_selected": "Seleccionado:",
"backup_controller_page_backup_sub": "Copia de seguridad de fotos y vídeos", "backup_controller_page_backup_sub": "Copia de seguridad de fotos y vídeos",
"backup_controller_page_cancel": "Cancelar", "backup_controller_page_cancel": "Cancelar",
"backup_controller_page_created": "Created on: {}", "backup_controller_page_created": "Creado el: {}",
"backup_controller_page_desc_backup": "Active la copia de seguridad para cargar automáticamente los nuevos activos al servidor.", "backup_controller_page_desc_backup": "Active la copia de seguridad para cargar automáticamente los nuevos elementos al servidor.",
"backup_controller_page_excluded": "Excluido:", "backup_controller_page_excluded": "Excluido:",
"backup_controller_page_failed": "Failed ({})", "backup_controller_page_failed": "Fallido ({})",
"backup_controller_page_filename": "File name: {} [{}]", "backup_controller_page_filename": "Nombre de archivo: {} [{}]",
"backup_controller_page_id": "ID: {}", "backup_controller_page_id": "ID: {}",
"backup_controller_page_info": "Información de la Copia de Seguridad", "backup_controller_page_info": "Información de la copia de seguridad",
"backup_controller_page_none_selected": "Ninguno seleccionado", "backup_controller_page_none_selected": "Ninguno seleccionado",
"backup_controller_page_remainder": "Remanente", "backup_controller_page_remainder": "Restantes",
"backup_controller_page_remainder_sub": "Fotos y álbumes restantes para hacer una copia de seguridad de la selección", "backup_controller_page_remainder_sub": "Fotos y álbumes restantes para hacer una copia de seguridad de la selección",
"backup_controller_page_select": "Seleccionar", "backup_controller_page_select": "Seleccionar",
"backup_controller_page_server_storage": "Almacenamiento en el servidor", "backup_controller_page_server_storage": "Almacenamiento en el servidor",
"backup_controller_page_start_backup": "Iniciar copia de seguridad", "backup_controller_page_start_backup": "Iniciar copia de seguridad",
"backup_controller_page_status_off": "La copia de seguridad está desactivada", "backup_controller_page_status_off": "La copia de seguridad está desactivada",
"backup_controller_page_status_on": "La copia de seguridad está activada", "backup_controller_page_status_on": "La copia de seguridad está activada",
"backup_controller_page_storage_format": "{} de {} usadas", "backup_controller_page_storage_format": "{} de {} usados",
"backup_controller_page_to_backup": "Álbumes a respaldar", "backup_controller_page_to_backup": "Álbumes a respaldar",
"backup_controller_page_total": "Total", "backup_controller_page_total": "Total",
"backup_controller_page_total_sub": "Todas las fotos y vídeos únicos de los álbumes seleccionados", "backup_controller_page_total_sub": "Todas las fotos y vídeos únicos de los álbumes seleccionados",
"backup_controller_page_turn_off": "Apagar la copia de seguridad", "backup_controller_page_turn_off": "Apagar la copia de seguridad",
"backup_controller_page_turn_on": "Activar la copia de seguridad", "backup_controller_page_turn_on": "Activar la copia de seguridad",
"backup_controller_page_uploading_file_info": "Uploading file info", "backup_controller_page_uploading_file_info": "SUbiendo información de archivos",
"backup_err_only_album": "No se puede eliminar el único álbum", "backup_err_only_album": "No se puede eliminar el único álbum",
"backup_info_card_assets": "activos", "backup_info_card_assets": "elementos",
"cache_settings_album_thumbnails": "Library page thumbnails ({} assets)", "cach_settings_album_thumbnails": "Miniaturas del álbum ({} elementos)",
"cache_settings_clear_cache_button": "Clear cache", "cache_settings_clear_cache_button": "Limpiar caché",
"cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.", "cache_settings_clear_cache_button_title": "Limpia el caché de la app. Esto afectará significativamente al rendimiento de la aplicación hasta que la caché se haya reconstruido.",
"cache_settings_image_cache_size": "Image cache size ({} assets)", "cache_settings_image_cache_size": "Miniaturas de imágenes ({} elementos)",
"cache_settings_statistics_album": "Library thumbnails", "cache_settings_statistics_album": "Miniaturas del álbum",
"cache_settings_statistics_assets": "{} assets ({})", "cache_settings_statistics_assets": "{} elementos ({})",
"cache_settings_statistics_full": "Full images", "cache_settings_statistics_full": "Imágenes completas",
"cache_settings_statistics_shared": "Shared album thumbnails", "cache_settings_statistics_shared": "Miniaturas del álbum compartido",
"cache_settings_statistics_thumbnail": "Thumbnails", "cache_settings_statistics_thumbnail": "Miniaturas",
"cache_settings_statistics_title": "Cache usage", "cache_settings_statistics_title": "Uso de caché",
"cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application", "cache_settings_subtitle": "Controla el comportamiento de almacenamiento en caché de la aplicación de Immich",
"cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)", "cache_settings_thumbnail_size": "Tamaño del caché de miniaturas ({} elementos)",
"cache_settings_title": "Caching Settings", "cache_settings_title": "Ajustes del caché",
"control_bottom_app_bar_add_to_album": "Add to album", "control_bottom_app_bar_add_to_album": "Añadir al álbum",
"control_bottom_app_bar_album_info": "{} items", "control_bottom_app_bar_album_info": "{} elementos",
"control_bottom_app_bar_album_info_shared": "{} items · Shared", "control_bottom_app_bar_album_info_shared": "{} elementos · Compartido",
"control_bottom_app_bar_create_new_album": "Create new album", "control_bottom_app_bar_create_new_album": "Crear nuevo álbum",
"control_bottom_app_bar_delete": "Eliminar", "control_bottom_app_bar_delete": "Eliminar",
"control_bottom_app_bar_share": "Share", "control_bottom_app_bar_share": "Compartir",
"create_album_page_untitled": "Untitled", "create_album_page_untitled": "Sin título",
"create_shared_album_page_create": "Create", "create_shared_album_page_create": "Crear",
"create_shared_album_page_share": "Compartir", "create_shared_album_page_share": "Compartir",
"create_shared_album_page_share_add_assets": "AÑADIR ACTIVOS", "create_shared_album_page_share_add_assets": "AÑADIR ACTIVOS",
"create_shared_album_page_share_select_photos": "Seleccionar Fotos", "create_shared_album_page_share_select_photos": "Seleccionar Fotos",
@@ -101,17 +101,17 @@
"delete_dialog_cancel": "Cancelar", "delete_dialog_cancel": "Cancelar",
"delete_dialog_ok": "Eliminar", "delete_dialog_ok": "Eliminar",
"delete_dialog_title": "Eliminar Permanentemente", "delete_dialog_title": "Eliminar Permanentemente",
"exif_bottom_sheet_description": "Añadir Descripción...", "exif_bottom_sheet_description": "Añadir descripción...",
"exif_bottom_sheet_details": "DETALLES", "exif_bottom_sheet_details": "DETALLES",
"exif_bottom_sheet_location": "LOCALZACIÓN", "exif_bottom_sheet_location": "LOCALZACIÓN",
"experimental_settings_new_asset_list_subtitle": "Work in progress", "experimental_settings_new_asset_list_subtitle": "En desarrollo",
"experimental_settings_new_asset_list_title": "Enable experimental photo grid", "experimental_settings_new_asset_list_title": "Habilitar galería experimental",
"experimental_settings_subtitle": "Use at your own risk!", "experimental_settings_subtitle": "¡Úsalo bajo tu responsabilidad!",
"experimental_settings_title": "Experimental", "experimental_settings_title": "Experimental",
"home_page_add_to_album_conflicts": "Added {added} assets to album {album}. {failed} assets are already in the album.", "home_page_add_to_album_conflicts": "Añadidos {added} elementos al álbum {album}. {failed} elementos ya estaban añadidos.",
"home_page_add_to_album_success": "Added {added} assets to album {album}.", "home_page_add_to_album_success": "Añadidos {added} elementos al álbum {album}.",
"library_page_albums": "Albums", "library_page_albums": "Álbumes",
"library_page_new_album": "New album", "library_page_new_album": "Nuevo álbum",
"login_form_button_text": "Iniciar Sesión", "login_form_button_text": "Iniciar Sesión",
"login_form_email_hint": "tucorreo@correo.com", "login_form_email_hint": "tucorreo@correo.com",
"login_form_endpoint_hint": "http://tu-ip-de-servidor:puerto/api", "login_form_endpoint_hint": "http://tu-ip-de-servidor:puerto/api",
@@ -120,75 +120,75 @@
"login_form_err_invalid_email": "Correo electrónico no válido", "login_form_err_invalid_email": "Correo electrónico no válido",
"login_form_err_leading_whitespace": "Espacio en blanco inicial", "login_form_err_leading_whitespace": "Espacio en blanco inicial",
"login_form_err_trailing_whitespace": "Espacio en blanco al final", "login_form_err_trailing_whitespace": "Espacio en blanco al final",
"login_form_failed_get_oauth_server_config": "Error logging using OAuth, check server URL", "login_form_failed_get_oauth_server_config": "Fallo al iniciar sesión con OAuth. Comprueba la URL del servidor.",
"login_form_failed_get_oauth_server_disable": "OAuth feature is not available on this server", "login_form_failed_get_oauth_server_disable": "OAuth no está disponible en este servidor",
"login_form_failed_login": "Error logging you in, check server URL, email and password", "login_form_failed_login": "Fallo al iniciar sesión, comprueba URL, correo y contraseña",
"login_form_label_email": "Correo", "login_form_label_email": "Correo",
"login_form_label_password": "Contraseña", "login_form_label_password": "Contraseña",
"login_form_password_hint": "contraseña", "login_form_password_hint": "contraseña",
"login_form_save_login": "Mantener la sesión iniciada", "login_form_save_login": "Mantener la sesión iniciada",
"monthly_title_text_date_format": "MMMM y", "monthly_title_text_date_format": "MMMM y",
"profile_drawer_app_logs": "Logs", "profile_drawer_app_logs": "Registros",
"profile_drawer_client_server_up_to_date": "El Cliente y el Servidor están actualizados", "profile_drawer_client_server_up_to_date": "El cliente y el servidor están actualizados",
"profile_drawer_settings": "Settings", "profile_drawer_settings": "Ajustes",
"profile_drawer_sign_out": "Cerrar Sesión", "profile_drawer_sign_out": "Cerrar Sesión",
"search_bar_hint": "Busca tus fotos", "search_bar_hint": "Buscar fotos",
"search_page_no_objects": "No Objects Info Available", "search_page_no_objects": "No hay información sobre objetos",
"search_page_no_places": "No hay información de lugares disponibles", "search_page_no_places": "No hay información sobre lugares",
"search_page_places": "Lugares", "search_page_places": "Lugares",
"search_page_things": "Cosas", "search_page_things": "Objetos",
"search_result_page_new_search_hint": "Nueva Busqueda", "search_result_page_new_search_hint": "Nueva squeda",
"select_additional_user_for_sharing_page_suggestions": "Sugerencias", "select_additional_user_for_sharing_page_suggestions": "Sugerencias",
"select_user_for_sharing_page_err_album": "Fallo al crear el álbum", "select_user_for_sharing_page_err_album": "Fallo al crear el álbum",
"select_user_for_sharing_page_share_suggestions": "Suggestions", "select_user_for_sharing_page_share_suggestions": "Sugerencias",
"setting_image_viewer_help": "The detail viewer loads the small thumbnail first, then loads the medium-size preview (if enabled), finally loads the original (if enabled).", "setting_image_viewer_help": "El visor carga primero la miniatura pequeña, luego carga la de tamaño medio (si está activada) y por último la original (si está activada).",
"setting_image_viewer_original_subtitle": "Enable to load the original full-resolution image (large!). Disable to reduce data usage (both network and on device cache).", "setting_image_viewer_original_subtitle": "Activar para cargar la imagen original (¡grande!). Desactivar para reducir el uso de datos (tanto de red como de caché).",
"setting_image_viewer_original_title": "Load original image", "setting_image_viewer_original_title": "Cargar imágenes originales",
"setting_image_viewer_preview_subtitle": "Enable to load a medium-resolution image. Disable to either directly load the original or only use the thumbnail.", "setting_image_viewer_preview_subtitle": "Activar para cargar una imagen de resolución media. Desactivar para cargar directamente el original o utilizar sólo la miniatura.",
"setting_image_viewer_preview_title": "Load preview image", "setting_image_viewer_preview_title": "Cargar miniaturas",
"setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}", "setting_notifications_notify_failures_grace_period": "Notificar fallos de carga en segundo plano: {}",
"setting_notifications_notify_hours": "{} hours", "setting_notifications_notify_hours": "{} horas",
"setting_notifications_notify_immediately": "immediately", "setting_notifications_notify_immediately": "inmediatamente",
"setting_notifications_notify_minutes": "{} minutes", "setting_notifications_notify_minutes": "{} minutos",
"setting_notifications_notify_never": "never", "setting_notifications_notify_never": "nunca",
"setting_notifications_notify_seconds": "{} seconds", "setting_notifications_notify_seconds": "{} segundos",
"setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset", "setting_notifications_single_progress_subtitle": "Información detallada por cada elemento en copia",
"setting_notifications_single_progress_title": "Show background backup detail progress", "setting_notifications_single_progress_title": "Mostrar detalles de la subida",
"setting_notifications_subtitle": "Adjust your notification preferences", "setting_notifications_subtitle": "Ajusta tus preferencias de notificación",
"setting_notifications_title": "Notifications", "setting_notifications_title": "Notificaciones",
"setting_notifications_total_progress_subtitle": "Overall upload progress (done/total assets)", "setting_notifications_total_progress_subtitle": "Progreso general de la subida (subidos/total elementos)",
"setting_notifications_total_progress_title": "Show background backup total progress", "setting_notifications_total_progress_title": "Mostrar progreso de la subida",
"setting_pages_app_bar_settings": "Settings", "setting_pages_app_bar_settings": "Ajustes",
"settings_require_restart": "Please restart Immich to apply this setting", "settings_require_restart": "Por favor, reinica Immich para aplicar estos cambios",
"share_add": "Añadir", "share_add": "Añadir",
"share_add_photos": "Añadir fotos", "share_add_photos": "Añadir fotos",
"share_add_title": "Añadir un título", "share_add_title": "Añadir un título",
"share_create_album": "Crear álbum", "share_create_album": "Crear álbum",
"share_dialog_preparing": "Preparing...", "share_dialog_preparing": "Preparando...",
"share_invite": "Invitar al álbum", "share_invite": "Invitar al álbum",
"sharing_page_album": "Álbumes compartidos", "sharing_page_album": "Álbumes compartidos",
"sharing_page_description": "Crea álbumes compartidos para compartir fotos y vídeos con las personas de tu red.", "sharing_page_description": "Crea álbumes compartidos para compartir fotos y vídeos con otros usuarios.",
"sharing_page_empty_list": "LISTA VACIA", "sharing_page_empty_list": "LISTA VACÍA",
"sharing_silver_appbar_create_shared_album": "Crear un álbum compartido", "sharing_silver_appbar_create_shared_album": "Crear un álbum compartido",
"sharing_silver_appbar_share_partner": "Compartir con el compañero", "sharing_silver_appbar_share_partner": "Compartir con pareja",
"tab_controller_nav_library": "Library", "tab_controller_nav_library": "Álbumes",
"tab_controller_nav_photos": "Fotos", "tab_controller_nav_photos": "Galería",
"tab_controller_nav_search": "Buscar", "tab_controller_nav_search": "Buscar",
"tab_controller_nav_sharing": "Compartiendo", "tab_controller_nav_sharing": "Compartido",
"theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles", "theme_setting_asset_list_storage_indicator_title": "Mostrar estado de subida en cada elemento",
"theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})", "theme_setting_asset_list_tiles_per_row_title": "Número de elementos por fila ({})",
"theme_setting_dark_mode_switch": "Dark mode", "theme_setting_dark_mode_switch": "Modo oscuro",
"theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer", "theme_setting_image_viewer_quality_subtitle": "Ajusta la calidad del visor",
"theme_setting_image_viewer_quality_title": "Image viewer quality", "theme_setting_image_viewer_quality_title": "Calidad del visor",
"theme_setting_system_theme_switch": "Automatic (Follow system setting)", "theme_setting_system_theme_switch": "Automático (Según ajustes del sistema)",
"theme_setting_theme_subtitle": "Choose the app's theme setting", "theme_setting_theme_subtitle": "Elige el tema de la app",
"theme_setting_theme_title": "Theme", "theme_setting_theme_title": "Tema",
"theme_setting_three_stage_loading_subtitle": "Three-stage loading might increase the loading performance but causes significantly higher network load", "theme_setting_three_stage_loading_subtitle": "La carga en tres fases podría aumentar el rendimiento pero provoca una mayor carga de red",
"theme_setting_three_stage_loading_title": "Enable three-stage loading", "theme_setting_three_stage_loading_title": "Activar carga en tres fases",
"version_announcement_overlay_ack": "Reconocer", "version_announcement_overlay_ack": "Reconocer",
"version_announcement_overlay_release_notes": "notas de versión", "version_announcement_overlay_release_notes": "Notas de la versión",
"version_announcement_overlay_text_1": "Hola amigo, hay una nueva versión de", "version_announcement_overlay_text_1": "¡Hola! Hay una nueva versión de",
"version_announcement_overlay_text_2": "tómese su tiempo para visitar la ", "version_announcement_overlay_text_2": "tómate tu tiempo para visitar la ",
"version_announcement_overlay_text_3": "y asegurate de que tu configuración de docker-compose y .env está actualizada para evitar cualquier desconfiguración, especialmente si utiliza WatchTower o cualquier mecanismo que se encargue de actualizar su aplicación de servidor automáticamente.", "version_announcement_overlay_text_3": "y asegúrate de que tu docker-compose y .env están actualizados para prevenir cualquier configuración errónea, especialmente si usas WatchTower o cualquier otro mecanismo que automatice la actualización.",
"version_announcement_overlay_title": "Nueva versión del servidor disponible \uD83C\uDF89" "version_announcement_overlay_title": "Nueva versión del servidor disponible \uD83C\uDF89"
} }

Some files were not shown because too many files have changed in this diff Show More