Compare commits

...

139 Commits

Author SHA1 Message Date
Alex Tran
10ff950bb8 Up version of openapi 2023-01-09 22:39:37 -06:00
Alex Tran
6b9a4a8d6f pump 2023-01-09 22:12:17 -06:00
Jason Rasmussen
079ee658a5 fix(mobile): omit null values from json requests (#1212)
* chore: initial template

* feat: exlude null values

* chore: regenerate openapi

* chore: merge

* feat: store changes in a patch file

* feat: extract to sh script

* chore: regenerate openapi

* chore: remove duplicate file

* feat: generate mobile by itself

* Fixed number property not decorated correctly

* Revert hotfix, fix test

* Merge main

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2023-01-09 22:08:45 -06:00
Jason Rasmussen
bd838a71d1 feat(web,server): disable password login (#1223)
* feat(web,server): disable password login

* chore: unit tests

* chore: fix import

* chore: linting

* feat(cli): server command for enable/disable password login

* chore: update docs

* feat(web): confirm dialogue

* chore: linting

* chore: linting

* chore: linting

* chore: linting

* chore: linting

* chore: fix web test

* chore: server unit tests
2023-01-09 16:32:58 -05:00
Krisjanis Lejejs
5999af6c78 chore(web) Add automatic server stats refetching (#1271) 2023-01-09 14:40:54 -06:00
Krisjanis Lejejs
af2eac52a8 chore(web) Add loading indicators to jobs panel (#1272) 2023-01-09 14:35:37 -06:00
Krisjanis Lejejs
e4e040f14b feat(web) Add search functionality to add photo to album modal (#1273) 2023-01-09 14:24:07 -06:00
Alex
10789503c1 feat(web/server) public album sharing (#1266) 2023-01-09 14:16:08 -06:00
Jason Rasmussen
fd15cdbf40 fix(server): log user delete errors (#1255) 2023-01-04 15:33:13 -06:00
bt90
9852376b38 Fix connection header (#1252) 2023-01-03 23:01:28 -06:00
Alex Tran
d327ec6ba4 Fixed drag-and-drop overlay blocks scrolling 2023-01-03 11:46:53 -06:00
Jason Rasmussen
9e6d6b2532 feat(web,server): api keys (#1244)
* feat(server): api keys

* chore: open-api

* feat(web): api keys

* fix: remove keys when deleting a user
2023-01-02 14:22:33 -06:00
Jason Rasmussen
9edbff0ec0 fix(web): pick deleted user (#1237) 2022-12-30 21:30:48 -06:00
bt90
b82a3f3300 feat(deployment): Consistent container names (#1232)
* Consistent container names

* Consistent container names

* Consistent container names

* Fix typo
2022-12-30 10:30:28 -06:00
Jason Rasmussen
d9fa6619e7 refactor(server): imports and repository tokens (#1220)
* refactor: entity imports

* refactor: rename user repository token

* chore: merge imports

* refactor: rename album repository token

* refactor: rename asset repository token

* refactor: rename tag repository token
2022-12-30 07:22:06 -06:00
Vedhavyas Singareddi
f7d3c4b4ff fix nginx conf file (#1229) 2022-12-30 05:12:24 -06:00
John P
4ff92d739d Docs: Github -> GitHub (#1221) 2022-12-29 22:45:25 -06:00
bt90
befd0f6ecd Compress more types (#1211) 2022-12-29 20:37:50 -06:00
otbutz
b584185f0f feat(nginx): Enable upstream keepalive (#1206)
* Enable keepalive

* Adapt envsubst

* Fix shellcheck issues

* Lower connection count
2022-12-29 20:09:38 -06:00
Krisjanis Lejejs
10b0924cfb feat(web) Add drag n drop upload functionality (#1216)
* Add image drag n drop functionality

* Change upload cover name, background color and opacity
2022-12-29 20:07:18 -06:00
Alex
6736063f83 fix(web) Fix incorrect album type (shared/non-shared) in album selection modal (#1219)
* fix(web) Fix incorrect album type (shared/non-shared) in album selection modal

* styling

* remove deadcode
2022-12-29 15:31:54 -06:00
Jason Rasmussen
93274a6d7b chore(web): show corresponding ffmpeg argument (#1217) 2022-12-29 15:13:37 -06:00
bt90
16b763e086 fix(docker-build): start main process with exec (#1210)
* Use exec

* Appl shellcheck fixes

* Close with newline
2022-12-29 14:49:02 -06:00
Jason Rasmussen
6974d4068b feat(server): mobile oauth with custom scheme redirect uri (#1204)
* feat(server): support providers without support for custom schemas

* chore: unit tests

* chore: test mobile override

* chore: add details to the docs
2022-12-29 14:47:30 -06:00
otbutz
0b65bb7e9a Fix nginx signaling (#1207) 2022-12-29 08:47:25 -06:00
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
Alex Tran
1efcac0946 Pump Patch 2022-12-11 14:25:51 -06:00
Matthias Rupp
415550f16d fix(server): Allow access to assets in shared album owned by current user (#1094)
* fix(server): Allow access to assets in shared album owned by current user

* Fix sql query

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2022-12-11 14:24:06 -06:00
Alex
aa554a9e77 [Localizely] Translations update (#1091) 2022-12-11 06:53:40 -06:00
Alex
2876c7ff97 Fix(server) Microservice didn't trigger to remove user (#1090) 2022-12-10 18:01:29 -06:00
Alex
651f56370a [Localizely] Translations update (#1089) 2022-12-10 15:15:06 -06:00
Alex Tran
950adeebbf Update language list in localizely 2022-12-10 15:08:25 -06:00
Alex Tran
4e33a52290 Update Localizely.yml 2022-12-10 15:04:37 -06:00
Alex Tran
f2cc7c2873 Fix(server) fix cannot change user password from mobile app due to first and last name property don't get passed from the app 2022-12-10 10:36:41 -06:00
Alex Tran
9c01ca1080 Added correct page title for admin sub pages 2022-12-10 09:23:02 -06:00
Alex Tran
09103dc981 Fixed upsert new DeviceInfo with null isAutoBackup property 2022-12-10 08:36:21 -06:00
Alex Tran
f096910abc Fix release note 2022-12-09 21:54:58 -06:00
Jason Rasmussen
242165485d fix(server): unique email database constraint (#1082) 2022-12-09 21:16:25 -06:00
Alex Tran
e6904ca884 api spec sync 2022-12-09 21:15:53 -06:00
Jason Rasmussen
5a792cc821 chore(docs): spelling (#1081) 2022-12-09 18:39:50 -05:00
Alex
0633eaf68c Pump 2022-12-09 15:19:22 -06:00
Jason Rasmussen
40afa3695a docs: server commands (#1079) 2022-12-09 14:54:19 -06:00
Jason Rasmussen
14889e7d85 fix(server): require local admin account (#1070) 2022-12-09 14:53:11 -06:00
Jason Rasmussen
3bb103c6b6 fix(server): link 'immich' (#1080) 2022-12-09 14:52:56 -06:00
Jason Rasmussen
5e680551b9 feat(server,web): migrate oauth settings from env to system config (#1061) 2022-12-09 14:51:42 -06:00
Jason Rasmussen
cefdd86b7f refactor(server): device info service (#1071)
* refactor(server): device info service

* use upsertDeviceInfo in mobile app

* fix: return types and dedupe code

Co-authored-by: Fynn Petersen-Frey <zoodyy@users.noreply.github.com>
2022-12-08 09:57:07 -06:00
Matt
b8e26a2112 unraid guide no longer external (#1074)
Co-authored-by: Matt Farrell <mfarrell@squareup.com>
2022-12-08 09:54:06 -06:00
Jason Rasmussen
58a149990d refactor(server): server version logging (#1073)
* refactor(server): server version logging

* chore: server => microservices
2022-12-08 09:53:18 -06:00
Fynn Petersen-Frey
c23b2479f7 feat(mobile): configurable background backup delay (#1068)
let's the user configure how much to delay the trigger for running the backup whenever assets are changed on the device
2022-12-08 09:51:36 -06:00
bo0tzz
a97b761eda Add generated openapi docs to website (#1067)
* Add generated openapi docs to website

* Uppercase API link in navbar

* fix(docs): open api empty summary (#1069)

* feat(docs): Use /docs/api path for swagger docs

* Sync api version to be the same as the server

* Update version

Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2022-12-07 21:57:34 -06:00
Alex
1adf8ff6b6 chore(web) Update SvelteKit (#1066)
* Update sveltekit

* Update sveltekit

* Update correct preloading attribute
2022-12-06 18:08:08 -06:00
Alex Tran
b5a5363a6a Fixed openapi generation command for mobile 2022-12-06 16:10:04 -06:00
Alex
f91bdc2785 fix(server) added TagResponseDto for TagController (#1065)
* fix(server) added TagResponseDto for TagController

* Added userId to DTO
2022-12-06 15:46:13 -06:00
Alex
db34f2f7fd fix(server) fix correct MIME type for Nikon NEF (#1060) 2022-12-05 12:05:02 -06:00
Alex
5de8ea162d feat(server) Tagging system (#1046) 2022-12-05 11:56:44 -06:00
Alex
6e2763b72c Fix plural 2022-12-05 10:52:21 -06:00
Alex
966d99217a fix(web) fix test (#1059) 2022-12-04 22:51:22 -06:00
Alex
5d140145c1 Update README.md 2022-12-04 17:15:41 -06:00
Alex
fcf3b0b672 Update README_zh_CN.md
Add information about community maintained readme
2022-12-04 17:15:14 -06:00
Matthias Rupp
e8bbad6772 feat(server): Per user asset access control (#993)
* Limit asset access to owner

* Check public albums for asset

* Clean up

* Fix test

* Rename repository method

* Simplify control flow

* Revert "Simplify control flow"

This reverts commit 7bc3cbf687.

* Revert Makefile change
2022-12-04 11:42:36 -06:00
Kiel Hurley
5f2b75997f feat(web): Localize dates and numbers (#1056) 2022-12-04 09:35:20 -06:00
chen3stones
426ce77f1c chore(): add Chinese README file (#1058)
Co-authored-by: chen3stones <chen3stones@outlook.com>
2022-12-03 22:03:29 -06:00
Fynn Petersen-Frey
83c7434eb5 feat(mobile): enable zoom of preview images & reuse cached thumbnails (#1049) 2022-12-03 21:59:39 -06:00
Jason Rasmussen
99854e90be feat(server): link via profile.sub (#1055) 2022-12-03 21:59:24 -06:00
Fynn Petersen-Frey
424b11cf50 feat(mobile): configure detail viewer asset loading (#1044) 2022-12-02 14:55:10 -06:00
Alex Tran
da87b1256c Release mobile hotfix 2022-12-01 23:16:22 -06:00
Alex
a3971543b5 fix(mobile): Start up from splash screen does not trigger foreground backup (#1042) 2022-12-01 09:20:53 -06:00
Alex
a384798779 Up version for release 2022-11-30 11:18:06 -06:00
Alex
d31eddf32f chore(mobile) Improve mobile UI (#1038) 2022-11-30 10:58:07 -06:00
Fynn Petersen-Frey
1068c4ad23 feat(server,web): activate ETags for all API endpoints and asset serving (#1031)
This greatly reduces the network traffic by app/web.
2022-11-29 15:45:47 -06:00
Alex
cbc979263e chore(mobile): Improve readability of logs page (#1033) 2022-11-28 14:14:22 -06:00
Fynn Petersen-Frey
765181bbc0 chore(mobile): improve CSV log export (#1032) 2022-11-28 10:17:27 -06:00
Fynn Petersen-Frey
d82dec9773 fix(mobile): fix cache invalidation on logout (#1030)
await all the cache-invalidation operations during logout and catch errors to actually perform all operations.
2022-11-28 10:01:09 -06:00
Alex
024177515d feat(mobile) Add in app logging to show app's log information (#1014) 2022-11-27 14:34:19 -06:00
Alex Tran
fb3b36a569 Added test for user.service 2022-11-26 15:09:06 -06:00
Alex
614743c8f4 fix(server): Prevent delete admin user (#1023) 2022-11-26 15:02:23 -06:00
Fynn Petersen-Frey
47f5e4134e feat(mobile): use cached asset info if unchanged instead of downloading all assets (#1017)
* feat(mobile): use cached asset info if unchanged instead of downloading all assets

This adds an HTTP ETag to the getAllAssets endpoint and client-side support in the app.
If locally cache content is identical to the content on the server, the potentially large list of all assets does not need to be downloaded.

* use ts import instead of require
2022-11-26 10:16:02 -06:00
denck007
efa7b3ba54 Fix(web): navbar color overlap and scroll bar incorrect z index (#1018)
* fix(web): Navbar color overlaps tall images

* fix(web): Scroll bar date behind navbar when scrubbing (fixes issue #757)
2022-11-25 20:52:01 -06:00
Alex
1e9d67ec39 Up mobile version for hotfix release 2022-11-24 15:50:18 -06:00
Alex
80d0ddca9a fix(mobile): Fix not able to show device asset on Android 13 (#1016) 2022-11-24 15:47:55 -06:00
Kiel Hurley
976d347623 feat(server,web,mobile): Use binary prefixes for data sizes (#1009) 2022-11-24 11:39:27 -06:00
Alex Tran
df0a059a02 Up patch version 2022-11-21 20:26:03 -06:00
Alex
cc697486fc fix(server): Deleted shared users cause problem with album retrival and creation (#1002)
* fix(server): Deleted shared users cause problem with album retrival and creation

* Remove dead code
2022-11-21 20:24:56 -06:00
Alex
2227a6f5f3 Added custom buildscript for XCodeCloud 2022-11-21 13:54:30 -06:00
Alex
a9320f06e8 Added v1.36 release note to website 2022-11-21 12:53:25 -06:00
Alex
39b7ab66d4 chore(mobile): clean up linter problems (#1000) 2022-11-21 06:13:14 -06:00
Alex Tran
bc9ee1d611 Added hotfix release note 2022-11-21 05:41:44 -06:00
Alex
56ce747ffc fix(mobile): freeze on splash screen due to accessing bad state (#998) 2022-11-21 05:29:43 -06:00
707 changed files with 33648 additions and 10533 deletions

13
.gitattributes vendored Normal file
View File

@@ -0,0 +1,13 @@
mobile/openapi/**/*.md -diff -merge
mobile/openapi/**/*.md linguist-generated=true
mobile/openapi/**/*.dart -diff -merge
mobile/openapi/**/*.dart linguist-generated=true
web/src/api/open-api/**/*.md -diff -merge
web/src/api/open-api/**/*.md linguist-generated=true
web/src/api/open-api/**/*.ts -diff -merge
web/src/api/open-api/**/*.ts linguist-generated=true
mobile/openapi/.openapi-generator/FILES -diff -merge
mobile/openapi/.openapi-generator/FILES linguist-generated=true

View File

@@ -4,6 +4,9 @@ dev:
dev-new:
rm -rf ./server/dist && docker compose -f ./docker/docker-compose.dev.yml up --remove-orphans
dev-new-update:
rm -rf ./server/dist && docker compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
dev-update:
rm -rf ./server/dist && docker-compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
@@ -26,4 +29,7 @@ prod-scale:
docker-compose -f ./docker/docker-compose.yml up --build -V --scale immich-server=3 --scale immich-microservices=3 --remove-orphans
api:
cd ./server && npm run api:generate
cd ./server && npm run api:generate
attach-server:
docker exec -it docker_immich-server_1 sh

View File

@@ -1,9 +0,0 @@
# TODO
Server scenario with web
[ ] 1 user exist without admin right -> make admin on first check
[ ] 2 users exist without admin right -> ask user to choose which account will be the admin
[ X ] No users exist -> prompt signup form for Admin

View File

@@ -17,6 +17,9 @@
<img src="design/immich-screenshots.png" title="Main Screenshot">
</a>
<br/>
<p align="center">
<a href="README_zh_CN.md">中文</a>
</p>
## Disclaimer
@@ -26,12 +29,13 @@
## 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)
- [Features](#features)
- [Introduction](https://immich.app/docs/overview/introduction)
- [Installation](https://immich.app/docs/installation/requirements)
- [Contribution Guidelines](https://immich.app/docs/contribution-guidelines)
- [Installation](https://immich.app/docs/install/requirements)
- [Contribution Guidelines](https://immich.app/docs/overview/support-the-project)
- [Support The Project](#support-the-project)
- [Known Issues](#known-issues)
@@ -64,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 |
| Download photos and videos to local device | Yes | Yes |
| Multi-user support | Yes | Yes |
| Album | Yes | Yes |
| Shared Albums | Yes | Yes |
| Quick navigation with draggable scrollbar | Yes | Yes |
| Album and Shared albums | Yes | Yes |
| Scrubbable/draggable scrollbar | Yes | Yes |
| Support RAW (HEIC, HEIF, DNG, Apple ProRaw) | Yes | Yes |
| Metadata view (EXIF, map) | Yes | Yes |
| Search by metadata, objects and image tags | Yes | No |
| Administrative functions (user management) | N/A | Yes |
| Background backup | Android | N/A |
| Virtual scroll | Yes | Yes |
| OAuth Support | Yes | Yes |
| LivePhotos Backup and Playback (iOS only) | Yes | Yes |
| OAuth support | Yes | Yes |
| LivePhoto backup and playback | iOS | Yes |
| User-defined storage structure | Yes | Yes |
# Support the project
@@ -91,18 +95,8 @@ If you feel like this is the right cause and the app is something you are seeing
# 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`:
```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`
Solution: https://immich.app/docs/install/requirements#hardware

115
README_zh_CN.md Normal file
View File

@@ -0,0 +1,115 @@
<p align="center">
<br/>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-green.svg?color=3F51B5&style=for-the-badge&label=License&logoColor=000000&labelColor=ececec" alt="License: MIT"></a>
<a href="https://discord.gg/D8JsnBEuKb">
<img src="https://img.shields.io/discord/979116623879368755.svg?label=Discord&logo=Discord&style=for-the-badge&logoColor=000000&labelColor=ececec" atl="Discord"/>
</a>
<br/>
<br/>
</p>
<p align="center">
<img src="design/immich-logo.svg" width="150" title="Login With Custom URL">
</p>
<h3 align="center">Immich - 高性能的自托管照片和视频备份方案</h3>
<p align="center">
请注意: 此README不是由Immich团队维护, 这意味着它在某一时间点不会被更新,因为我们是依靠贡献者来更新的。感谢理解。
</p>
<br/>
<a href="https://immich.app">
<img src="design/immich-screenshots.png" title="Main Screenshot">
</a>
<br/>
<p align="center">
<a href="README.md">English</a>
</p>
## 免责声明
- ⚠️ 本项目正在 **非常活跃** 的开发中。
- ⚠️ 可能存在bug或者重大变更。
- ⚠️ **不要把本软件作为你存储照片或视频的唯一方式!**
## 目录
- [官方文档](https://immich.app/docs/overview/introduction)
- [示例](#示例)
- [功能特性](#功能特性)
- [介绍](https://immich.app/docs/overview/introduction)
- [安装](https://immich.app/docs/install/requirements)
- [贡献指南](https://immich.app/docs/overview/support-the-project)
- [支持本项目](#support-the-project)
- [已知问题](#known-issues)
## 官方文档
你可以在 https://immich.app/ 找到包含安装手册的官方文档.
## 示例
你可以在 https://demo.immich.app 访问示例.
在移动端, 你可以使用 `https://demo.immich.app/api`获取`服务终端链接`
```bash title="示例认证信息"
认证信息
邮箱: demo@immich.app
密码: demo
```
```
规格: 甲骨文免费虚拟机套餐-阿姆斯特丹 4核 2.4Ghz ARM64 CPU, 24GB RAM。
```
# 功能特性
| 功能特性 | 移动端 | 网页端 |
| ------------------------------------------- | ------- | --- |
| 上传并查看照片和视频 | 是 | 是 |
| 软件运行时自动备份 | 是 | N/A |
| 选择需要备份的相册 | 是 | N/A |
| 下载照片和视频到本地 | 是 | 是 |
| 多用户支持 | 是 | 是 |
| 相册 | 是 | 是 |
| 共享相册 | 是 | 是 |
| 可拖动的快速导航栏 | 是 | 是 |
| 支持RAW格式 (HEIC, HEIF, DNG, Apple ProRaw) | 是 | 是 |
| 元数据视图 (EXIF, 地图) | 是 | 是 |
| 通过元数据、对象和标签进行搜索 | 是 | No |
| 管理功能 (用户管理) | N/A | 是 |
| 后台备份 | Android | N/A |
| 虚拟滚动 | 是 | 是 |
| OAuth支持 | 是 | 是 |
| 实时照片备份和查看 (仅iOS) | 是 | 是 |
# 支持本项目
我已经致力于本项目并且将我会持续更新文档、新增功能和修复问题。但是我不能一个人走下去,所以我需要你给予我走下去的动力。
就像我主页里面 [selfhosted.show - In the episode 'The-organization-must-not-be-name is a Hostile Actor'](https://selfhosted.show/79?t=1418) 说的一样,这是我和团队的一项艰巨的任务。我希望某一天我能够全职开发本项目,在此我希望你们能够助我梦想成真。
如果你使用了本项目一段时间,并且觉得上面的话有道理,那么请你按照如下方式帮助我吧。
## 捐赠
- [按月捐赠](https://github.com/sponsors/alextran1502) via GitHub Sponsors
- [一次捐赠](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) via Github Sponsors
# 已知问题
## TensorFlow 构建问题
_这是一个针对于Proxmox的已知问题_
TensorFlow 不能运行在很旧的CPU架构上, 需要运行在AVX和AVX2指令集的CPU上。如果你在docker-compose的命令行中遇到了 `illegal instruction core dump`的错误, 通过如下命令检查你的CPU flag寄存器然后确保你能够看到`AVX`和`AVX2`的字样:
```bash
more /proc/cpuinfo | grep flags
```
如果你在Proxmox中运行虚拟机, 虚拟机中没有启用flag寄存器。
你需要在虚拟机的硬件面板中把CPU类型从`kvm64`改为`host`。
`Hardware > Processors > Edit > Advanced > Type (dropdown menu) > host`

View File

@@ -30,12 +30,6 @@ REDIS_HOSTNAME=immich_redis
UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup
###################################################################################
# Log message level - [simple|verbose]
###################################################################################
LOG_LEVEL=simple
###################################################################################
# JWT SECRET
#
@@ -79,21 +73,6 @@ PUBLIC_LOGIN_PAGE_MESSAGE=
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################
# IMMICH_WEB_URL=http://immich-web:3000
# IMMICH_SERVER_URL=http://immich-server:3001
# 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"
IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003

View File

@@ -2,6 +2,7 @@ version: '3.8'
services:
immich-server:
container_name: immich_server
image: immich-server-dev:latest
build:
context: ../server
@@ -23,6 +24,7 @@ services:
- database
immich-machine-learning:
container_name: immich_machine_learning
image: immich-machine-learning-dev:latest
build:
context: ../machine-learning
@@ -41,6 +43,7 @@ services:
- database
immich-microservices:
container_name: immich_microservices
image: immich-microservices:latest
build:
context: ../server
@@ -60,6 +63,7 @@ services:
- immich-server
immich-web:
container_name: immich_web
image: immich-web-dev:1.9.0
build:
context: ../web

View File

@@ -2,6 +2,7 @@ version: "3.8"
services:
immich-server:
container_name: immich_server
image: altran1502/immich-server:staging
entrypoint: ["/bin/sh", "./start-server.sh"]
volumes:
@@ -16,6 +17,7 @@ services:
restart: always
immich-microservices:
container_name: immich_microservices
image: altran1502/immich-server:staging
entrypoint: ["/bin/sh", "./start-microservices.sh"]
volumes:
@@ -30,6 +32,7 @@ services:
restart: always
immich-machine-learning:
container_name: immich_machine_learning
image: altran1502/immich-machine-learning:staging
entrypoint: ["/bin/sh", "./entrypoint.sh"]
volumes:
@@ -43,6 +46,7 @@ services:
restart: always
immich-web:
container_name: immich_web
image: altran1502/immich-web:staging
entrypoint: ["/bin/sh", "./entrypoint.sh"]
env_file:

View File

@@ -2,6 +2,7 @@ version: "3.8"
services:
immich-server:
container_name: immich_server
image: altran1502/immich-server:release
entrypoint: ["/bin/sh", "./start-server.sh"]
volumes:
@@ -16,6 +17,7 @@ services:
restart: always
immich-microservices:
container_name: immich_microservices
image: altran1502/immich-server:release
entrypoint: ["/bin/sh", "./start-microservices.sh"]
volumes:
@@ -30,6 +32,7 @@ services:
restart: always
immich-machine-learning:
container_name: immich_machine_learning
image: altran1502/immich-machine-learning:release
entrypoint: ["/bin/sh", "./entrypoint.sh"]
volumes:
@@ -43,6 +46,7 @@ services:
restart: always
immich-web:
container_name: immich_web
image: altran1502/immich-web:release
entrypoint: ["/bin/sh", "./entrypoint.sh"]
env_file:

View File

@@ -1,12 +0,0 @@
---
slug: first-blog-post
title: First Blog Post
authors:
name: Gao Wei
title: Docusaurus Core Team
url: https://github.com/wgao19
image_url: https://github.com/wgao19.png
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@@ -1,44 +0,0 @@
---
slug: long-blog-post
title: Long Blog Post
authors: endi
tags: [hello, docusaurus]
---
This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@@ -1,20 +0,0 @@
---
slug: mdx-blog-post
title: MDX Blog Post
authors: [slorber]
tags: [docusaurus]
---
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
:::tip
Use the power of React to create interactive blog posts.
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

View File

@@ -1,25 +0,0 @@
---
slug: welcome
title: Welcome
authors: [slorber, yangshun]
tags: [facebook, hello, docusaurus]
---
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.
The blog post date can be extracted from filenames, such as:
- `2019-05-30-welcome.md`
- `2019-05-30-welcome/index.md`
A blog post folder can be convenient to co-locate blog post images:
![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)
The blog supports tags as well!
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.

View File

@@ -1,17 +1,5 @@
endi:
name: Endilie Yacop Sucipto
title: Maintainer of Docusaurus
url: https://github.com/endiliey
image_url: https://github.com/endiliey.png
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
image_url: https://github.com/yangshun.png
slorber:
name: Sébastien Lorber
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
alextran:
name: Alex Tran
title: Maintainer of Immich
url: https://github.com/alextran1502
image_url: https://github.com/alextran1502.png

View File

@@ -0,0 +1,114 @@
---
slug: release-1-36
title: Release v1.36.0
authors: [alextran]
tags: [release]
date: 2022-11-10
---
Hello everyone, it is my pleasure to deliver the new release of Immich to you. The team has been working hard to bring you the new features and improvements. This release includes some big features that the community has been asking since the beginning of Immich. We hope you will enjoy it.
Some notable features are:
- [OAuth integration](#livephoto-ios-support-)
- [LivePhoto support on iOS](#oauth-integration-)
- User config system
<!--truncate-->
## LivePhoto iOS Support 🎉
LivePhoto on iOS is now supported in Immich.
The motion part will now be uploaded and can be played on the mobile app and the web.
:::caution
- The server and the app has to be on version **1.36.x** for the application to work correctly.
- Previous uploaded photos will not be updated automatically, you will have to remove and reupload them if you want to keep the LivePhoto functionality.
:::
<img
src="https://media.giphy.com/media/fTrGceZd7t1ewi8ESc/giphy.gif"
width="100%"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
title="LivePhoto playback on the web"
/>
## OAuth Integration 🎉
I want to borrow this chance to express my gratitude to [@EnricoBilla](https://github.com/EnricoBilla), who has been the trailblazer for this feature since the beginning days of Immich. His PR has sparked ideas, suggestions, and discussion among the team member on how to integrate this feature successfully into the app. Thank you so much for your work and your time.
OAuth is now integrated into the system. Please follow the guide [here](https://immich.app/docs/usage/oauth) to set up your OAuth integration
After setting up the correct environment variables in the `.env` file, as shown below
| Key | Type | Default | Description |
| ------------------- | ------- | -------------------- | ------------------------------------------------------------------------- |
| OAUTH_ENABLED | boolean | false | Enable/disable OAuth2 |
| OAUTH_ISSUER_URL | URL | (required) | Required. Self-discovery URL for client |
| OAUTH_CLIENT_ID | string | (required) | Required. Client ID |
| OAUTH_CLIENT_SECRET | string | (required) | Required. Client Secret |
| OAUTH_SCOPE | string | openid email profile | Full list of scopes to send with the request (space delimited) |
| OAUTH_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
```bash title="Authentik Example"
OAUTH_ENABLED=true
OAUTH_ISSUER_URL=http://10.1.15.216:9000/application/o/immich-test/
OAUTH_CLIENT_ID=30596v8f78a4b6a97d5985c3076b6b4c4d12ddc33
OAUTH_CLIENT_SECRET=50f1eafdec353b95b1c638db390db4ab67ef035a51212dbec2f56175e2eb272b5d572c099176e6fe116ecf47ffdd544bgdb9e2edc588307ee0339d25eeccd88
OAUTH_BUTTON_TEXT=Login with Authentik
```
The web will have the option to sign in with OAuth.
<img
src="https://user-images.githubusercontent.com/27055614/202923726-f43fa148-47f5-4182-8f29-b0b87e4586fa.png"
width="50%"
title="Web Sign in with OAuth"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
/>
The mobile app will check if the server has OAuth enabled before displaying the OAuth
sign-in button.
<img
src="https://media.giphy.com/media/3iy3SaNkVYtlkEiw06/giphy.gif"
title="Mobile sign in with OAuth"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
/>
## Support
<img
src="https://media.giphy.com/media/LStqgGESXW8XnuCv5y/giphy.gif"
width="300"
style={{
borderRadius: "10px",
boxShadow:
"rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px",
}}
title="Support the project"
/>
If you find the project helpful and it helps you in some ways, you can support the project [one time](https://github.com/sponsors/alextran1502?frequency=one-time&sponsor=alextran1502) or [monthly](https://github.com/sponsors/alextran1502) from GitHub Sponsor
It is a great way to let me know that you want me to continue developing and working on this project for years to come.
## Details
For more details, please check out the [release note](https://github.com/immich-app/immich/releases/tag/v1.36.0_55-dev)

View File

@@ -13,7 +13,48 @@ sidebar_position: 6
| ![cloud-done](/img/cloud-done.svg) | Asset was uploaded from this device and is now backed up in the cloud/server and still available in original on the device |
### 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?
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?
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
@@ -88,6 +88,7 @@ OpenAPI is used to generate the client (Typescript, Dart) SDK. `openapi-generato
```bash
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.
## 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.
1. Attached to the server container shell.
2. Run
2. Run
```bash
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.
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
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" />
On iOS, there is only one option for automatic backup
* [**Foreground backup**](#foreground-backup)
On iOS, there is only one option for automatic backup
On Android, there are two options for automatic backup
* [**Foreground backup**](#foreground-backup)
* [**Background backup**](#background-backup)
- [Automatic Backup](#automatic-backup)
- [Foreground backup](#foreground-backup)
On Android, there are two options for automatic backup
- [Automatic Backup](#automatic-backup)
- [Foreground backup](#foreground-backup)
- [Background backup](#background-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 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.
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
* 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.
* 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.
:::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.
- 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)
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: 18 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: 22 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).
:::

107
docs/docs/features/oauth.md Normal file
View File

@@ -0,0 +1,107 @@
# OAuth Authentication
This page contains details about using OAuth in Immich.
:::tip
Unable to set `app.immich:/` as a valid redirect URI? See [Mobile Redirect URI](#mobile-redirect-uri) for an alternative solution.
:::
## 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
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 |
| [Auto Launch](#auto-launch) | boolean | false | When true, will skip the login page and automatically start the OAuth login process |
| [Mobile Redirect URI Override](#mobile-redirect-uri) | URL | (empty) | Http(s) alternative mobile redirect URI |
:::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.
:::
## Auto Launch
When Auto Launch is enabled, the login page will automatically redirect the user to the OAuth authorization url, to login with OAuth. To access the login screen again, use the browser's back button, or navigate directly to `/auth/login?autoLaunch=0`.
## Mobile Redirect URI
The redirect URI for the mobile app is `app.immich:/`, which is a [Custom Scheme](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app). If this custom scheme is an invalid redirect URI for your OAuth Provider, you can work around this by doing the following:
1. Configure an http(s) endpoint to forwards requests to `app.immich:/`
2. Whitelist the new endpoint as a valid redirect URI with your provider.
3. Specify the new endpoint as the `Mobile Redirect URI Override`, in the OAuth settings.
With these steps in place, you should be able to use OAuth from the [Mobile App](/docs/features/mobile-app.mdx) without a custom scheme redirect URI.
:::info
Immich has a route (`/api/oauth/mobile-redirect`) that is already configured to forward requests to `app.immich:/`, and can be used for step 1.
:::
## Example Configuration
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,32 @@
# Password Login
An overview of password login and related settings for Immich.
## Enable/Disable
Immich supports password login, which is enabled by default. The preferred way to disable it is via the [Administration Page](#administration-page), although it can also be changed via a [Server Command](#server-command) as well.
### Administration Page
To toggle the password login setting via the web, navigate to the "Administration", expand "Password Authentication", toggle the "Enabled" switch, and press "Save".
![Password Login Settings](./img/password-login-settings.png)
### Server Command
There are two [Server Commands](/docs/features/server-commands.md) for password login:
1. `enable-password-login`
2. `disable-password-login`
See [Server Commands](/docs/features/server-commands.md) for more details about how to run them.
## Password Reset
### Admin
To reset the administrator password, use the `reset-admin-password` [Server Command](/docs/features/server-commands.md).
### User
Immich does not currently support self-service password reset. However, the administration can reset passwords for other users. See [User Management: Password Reset](/docs/features/user-management.mdx#password-reset) for more information about how to do this.

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

@@ -0,0 +1,39 @@
# Server Commands
The `immich-server` docker image comes preinstalled with an administrative CLI (`immich`) that supports the following commands:
| Command | Description |
| ------------------------ | ------------------------------------- |
| `help` | Display help |
| `reset-admin-password` | Reset the password for the admin user |
| `disable-password-login` | Disable password login |
| `enable-password-login` | Enable password login |
## How to run a command
To run a command, connect to the container and then execute it by running `immich <command>`.
## Examples
```bash title="Reset Admin Password"
docker exec -it immich_server sh
/usr/src/app$ immich reset-admin-password
? Please choose a new password (optional) immich-is-awesome-unlike-this-password
New password:
immich-is-awesome-unlike-this-password
```
```bash title="Disable Password Login"
docker exec -it immich_server sh
/usr/src/app$ immich disable-password-login
Password login has been disabled.
```
```bash title="Enable Password Login"
docker exec -it immich_server sh
/usr/src/app$ immich enable-password-login
Password login has been enabled.
```

View File

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

View File

@@ -0,0 +1,24 @@
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.
## Password Reset
To reset a user's password, click the pencil icon to edit a user, then click "Reset Password". The user's password will be reset to "password" and they have to change it next time the sign in.
![Reset Password](./img/user-management-update.png)

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
---
# Docker Compose [Recommended]
# Recommended installation
This is the recommended installation method for production use.
Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose.
### 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"
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>
* Populate custom database information if necessary.
* 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 custom database information if necessary.
- 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:
```bash title="Command to generate secure JWT_SECRET key"
openssl rand -base64 128
@@ -114,5 +115,16 @@ docker-compose up -d # or `docker compose up -d` based on your docker-compose ve
```
:::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

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

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
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
---
# One-step installation
# Install Script [Experimental]
:::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:
@@ -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.
:::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).
:::

142
docs/docs/install/unraid.md Normal file
View File

@@ -0,0 +1,142 @@
---
sidebar_position: 5
---
# Unraid
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
- Guide was written using Unraid v6.11.1
- Requires you to have installed the plugin: [Docker Compose Manager](https://forums.unraid.net/topic/114415-plugin-docker-compose-manager/)
- An Unraid share created for your images
- There has been a [report](https://forums.unraid.net/topic/130006-errortraps-traps-node27707-trap-invalid-opcode-ip14fcfc8d03c0-sp7fff32889dd8-more/#comment-1189395) of this not working if your Unraid server doesn't support AVX _(e.g. using a T610)_
:::
## Installation Steps
1. Go to "**Plugins**" and click on "**Compose.Manager**"
2. Click "**Add New Stack**" and when prompted for a label enter "**Immich**"
<img
src={require('./img/unraid01.webp').default}
width="70%"
alt="Select Plugins > Compose.Manager > Add New Stack > Label it Immich"
/>
3. Select the cog ⚙️ next to Immich then click "**Edit Stack**"
4. Click "**Compose File**" and then paste the entire contents of the [Immich Docker Compose](https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml) file into the Unraid editor
<details >
<summary>Using an existing Postgres container? Click me! Otherwise proceed to step 5.</summary>
<ul>
<li>Comment out the database service</li>
<img
src={require('./img/unraid02.png').default}
width="50%"
alt="Comment out database service in the compose file"
/>
<li>Comment out the database dependency for <b>each service</b> <i>(example in screenshot below only shows 2 of the services - ensure you do this for all services)</i></li>
<img
src={require('./img/unraid03.png').default}
width="50%"
alt="Comment out every reference to the database service in the compose file"
/>
<li>Comment out the volumes</li>
<img
src={require('./img/unraid04.png').default}
width="20%"
alt="Comment out database volume"
/>
</ul>
</details>
5. Click "**Save Changes**", you will be promoted to edit stack UI labels, just leave this blank and click "**Ok**"
6. Select the cog ⚙️ next to Immich, click "**Edit Stack**", then click "**Env File**"
7. Past the entire contents of the [Immich .env.example](https://raw.githubusercontent.com/immich-app/immich/main/docker/.env.example) file into the Unraid editor, then **before saving** edit the following:
- `JWT_SECRET`: Generate a unique secret and paste the value here > Can be generated by either typing `openssl rand -base64 128` in your terminal or copying from [uuidgenerator](https://www.uuidgenerator.net/version1)
- `UPLOAD_LOCATION`: Create a folder in your Images Unraid share and place the **absolute** location here > For example my _"images"_ share has a folder within it called _"immich"_. If I browse to this directory in the terminal and type `pwd` the output is `/mnt/user/images/immich`. This is the exact value I need to enter as my `UPLOAD_LOCATION`
<img
src={require('./img/unraid05.webp').default}
width="70%"
alt="Absolute location of where you want immich images stored"
/>
<details >
<summary>Using an existing Postgres container? Click me! Otherwise proceed to step 8.</summary>
<p>Update the following database variables as relevant to your Postgres container:</p>
<ul>
<li><code>DB_HOSTNAME</code></li>
<li><code>DB_USERNAME</code></li>
<li><code>DB_PASSWORD</code></li>
<li><code>DB_DATABASE_NAME</code></li>
<li><code>DB_PORT</code></li>
</ul>
</details>
8. Click "**Save Changes**" followed by "**Compose Up**" and Unraid will begin to create the Immich containers in a popup window. Once complete you will see a message on the popup window stating _"Connection Closed"_. Click "**Done**" and go to the Unraid "**Docker**" page
> Note: This can take several minutes depending on your Internet speed and Unraid hardware
9. Once on the Docker page you will see several Immich containers, one of them will be labelled `immich_proxy` and will have a port mapping. Visit the `IP:PORT` displayed in your web browser and you should see the Immich admin setup page.
<img
src={require('./img/unraid06.webp').default}
width="80%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
<details >
<summary>Using the Unraid Docker Folders plugin? Click me! Otherwise you're complete!</summary>
<p>If you are using the Docker Folders plugin go the Docker tab and select "<b>New Folder</b>".<br />Label it <i>"Immich"</i> and use the logo from the <a href="https://immich.app/">Immich homepage</a> <i>(right click the logo, "Save As", and reupload to Unraid)</i><br />Then simply select all the Immich related containers before clicking "<b>Submit</b>"</p>
<img
src={require('./img/unraid07.webp').default}
width="80%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
<img
src={require('./img/unraid08.webp').default}
width="90%"
alt="Go to Docker Tab and visit the address listed next to immich-proxy"
/>
</details>
:::tip
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,15 +0,0 @@
---
sidebar_position: 5
---
# Unraid
Install Immich on Unraid.
:::info Community contribution
Please follow [this community contributed article](https://mfaz.dev/posts/immich-unraid/) to install Immich on Unraid.
:::
:::tip
For more information on how to use the application, please refer to the [Post Installation](/docs/usage/post-installation) guide.
:::

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",
"position": 1,
"link": {
"type": "generated-index",
"description": "Getting to know Immich"
}
"label": "Overview",
"position": 1
}

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
<img src={require('./img/feature-panel.png').default} alt='Immich' />
## Welcome!
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.
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.
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
---
# Logo meaning
# Logo
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)

View File

@@ -2,19 +2,26 @@
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.
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
* 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)
- 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)
## 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": "How to use the application",
"position": 3,
"link": {
"type": "generated-index",
"description": "Quick start on how to use the app on mobile and the web"
}
}

View File

@@ -1,76 +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 following environment variables:
| Key | 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_AUTO_REGISTER | boolean | true | When true, will automatically register a user the first time they sign in |
| OAUTH_BUTTON_TEXT | string | Login with OAuth | Text for the OAuth button on the web |
:::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 is an example of a valid configuration for setting up Immich to use OAuth with Authentik:
```
OAUTH_ENABLED=true
OAUTH_ISSUER_URL=http://192.168.0.187:9000/application/o/immich
OAUTH_CLIENT_ID=f08f9c5b4f77dcfd3916b1c032336b5544a7b368
OAUTH_CLIENT_SECRET=6fe2e697644da6ff6aef73387a457d819018189086fa54b151a6067fbb884e75f7e5c90be16d3c688cf902c6974817a85eab93007d76675041eaead8c39cf5a2
OAUTH_BUTTON_TEXT=Login with Authentik
```
[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,10 +28,23 @@ const config = {
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: [
[
"classic",
/** @type {import('@docusaurus/preset-classic').Options} */
"docusaurus-preset-openapi",
/** @type {import('docusaurus-preset-openapi').Options} */
({
docs: {
showLastUpdateAuthor: true,
@@ -42,6 +55,10 @@ const config = {
// Remove this to remove the "edit this page" links.
editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
},
api: {
path: "../server/immich-openapi-specs.json",
routeBasePath: "/docs/api",
},
// blog: {
// showReadingTime: true,
// editUrl: "https://github.com/immich-app/immich/tree/main/docs/",
@@ -56,6 +73,9 @@ const config = {
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
({
colorMode: {
defaultMode: "dark",
},
announcementBar: {
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!`,
@@ -78,14 +98,23 @@ const config = {
{
to: "/docs/overview/introduction",
position: "right",
label: "Documentation",
label: "Docs",
},
{
to: "/docs/api",
position: "right",
label: "API",
},
// { to: "/blog", label: "Blog", position: "right" },
{
href: "https://github.com/immich-app/immich",
label: "GitHub",
position: "right",
},
{
href: "https://github.com/orgs/immich-app/projects/1",
label: "Roadmap",
position: "right",
},
],
},
footer: {
@@ -100,7 +129,7 @@ const config = {
},
{
label: "Installation",
to: "/docs/installation/requirements",
to: "/docs/install/requirements",
},
],
},
@@ -114,16 +143,20 @@ const config = {
],
},
{
title: "More",
title: "Links",
items: [
{
label: "Blog",
to: "/blog",
},
// {
// label: "Blog",
// to: "/blog",
// },
{
label: "GitHub",
href: "https://github.com/immich-app/immich",
},
{
label: "Roadmap",
href: "https://github.com/orgs/immich-app/projects/1",
},
],
},
],
@@ -133,6 +166,7 @@ const config = {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
},
image: "overview/img/feature-panel.png",
}),
};

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