=> {
let path: string;
let isFileTemporary: boolean;
@@ -116,18 +120,19 @@ export const makeFileForDataOrPathOrZipItem = async (
/* no-op */
};
- if (typeof dataOrPathOrZipItem == "string") {
- path = dataOrPathOrZipItem;
+ if (typeof item == "string") {
+ path = item;
isFileTemporary = false;
} else {
path = await makeTempFilePath();
isFileTemporary = true;
- if (dataOrPathOrZipItem instanceof Uint8Array) {
- writeToTemporaryFile = () =>
- fs.writeFile(path, dataOrPathOrZipItem);
+ if (item instanceof Uint8Array) {
+ writeToTemporaryFile = () => fs.writeFile(path, item);
+ } else if (item instanceof ReadableStream) {
+ writeToTemporaryFile = () => writeStream(path, item);
} else {
writeToTemporaryFile = async () => {
- const [zipPath, entryName] = dataOrPathOrZipItem;
+ const [zipPath, entryName] = item;
const zip = openZip(zipPath);
try {
await zip.extract(entryName, path);
diff --git a/desktop/src/preload.ts b/desktop/src/preload.ts
index 3fab447722..ef586210dd 100644
--- a/desktop/src/preload.ts
+++ b/desktop/src/preload.ts
@@ -66,6 +66,7 @@ import type { IpcRendererEvent } from "electron";
import type {
AppUpdate,
CollectionMapping,
+ FFmpegCommand,
FolderWatch,
PendingUploads,
ZipItem,
@@ -183,6 +184,8 @@ const fsWriteFileViaBackup = (path: string, contents: string) =>
const fsIsDir = (dirPath: string) => ipcRenderer.invoke("fsIsDir", dirPath);
+const fsStatMtime = (path: string) => ipcRenderer.invoke("fsStatMtime", path);
+
// - Conversion
const convertToJPEG = (imageData: Uint8Array) =>
@@ -201,7 +204,7 @@ const generateImageThumbnail = (
);
const ffmpegExec = (
- command: string[],
+ command: FFmpegCommand,
dataOrPathOrZipItem: Uint8Array | string | ZipItem,
outputFileExtension: string,
) =>
@@ -289,11 +292,11 @@ const pendingUploads = () => ipcRenderer.invoke("pendingUploads");
const setPendingUploads = (pendingUploads: PendingUploads) =>
ipcRenderer.invoke("setPendingUploads", pendingUploads);
-const markUploadedFiles = (paths: PendingUploads["filePaths"]) =>
- ipcRenderer.invoke("markUploadedFiles", paths);
+const markUploadedFile = (path: string, associatedPath?: string) =>
+ ipcRenderer.invoke("markUploadedFile", path, associatedPath);
-const markUploadedZipItems = (items: PendingUploads["zipItems"]) =>
- ipcRenderer.invoke("markUploadedZipItems", items);
+const markUploadedZipItem = (item: ZipItem, associatedItem?: ZipItem) =>
+ ipcRenderer.invoke("markUploadedZipItem", item, associatedItem);
const clearPendingUploads = () => ipcRenderer.invoke("clearPendingUploads");
@@ -335,7 +338,7 @@ const clearPendingUploads = () => ipcRenderer.invoke("clearPendingUploads");
* >
* > https://www.electronjs.org/docs/latest/api/context-bridge#methods
*
- * The copy itself is relatively fast, but the problem with transfering large
+ * The copy itself is relatively fast, but the problem with transferring large
* amounts of data is potentially running out of memory during the copy.
*
* For an alternative, see [Note: IPC streams].
@@ -378,6 +381,7 @@ contextBridge.exposeInMainWorld("electron", {
writeFile: fsWriteFile,
writeFileViaBackup: fsWriteFileViaBackup,
isDir: fsIsDir,
+ statMtime: fsStatMtime,
findFiles: fsFindFiles,
},
@@ -410,7 +414,7 @@ contextBridge.exposeInMainWorld("electron", {
pathOrZipItemSize,
pendingUploads,
setPendingUploads,
- markUploadedFiles,
- markUploadedZipItems,
+ markUploadedFile,
+ markUploadedZipItem,
clearPendingUploads,
});
diff --git a/desktop/src/types/ipc.ts b/desktop/src/types/ipc.ts
index f61cd71a2a..7701836217 100644
--- a/desktop/src/types/ipc.ts
+++ b/desktop/src/types/ipc.ts
@@ -32,3 +32,5 @@ export interface PendingUploads {
filePaths: string[];
zipItems: ZipItem[];
}
+
+export type FFmpegCommand = string[] | { default: string[]; hdr: string[] };
diff --git a/desktop/tsconfig.json b/desktop/tsconfig.json
index cf0f8b8856..b677d664e8 100644
--- a/desktop/tsconfig.json
+++ b/desktop/tsconfig.json
@@ -7,10 +7,10 @@
* Recommended target, lib and other settings for code running in the
* version of Node.js bundled with Electron.
*
- * Currently, with Electron 30, this is Node.js 20.11.1.
- * https://www.electronjs.org/blog/electron-30-0
+ * Currently, with Electron 35, this is Node.js 22.14.0.
+ * https://www.electronjs.org/blog/electron-35-0
*/
- "extends": "@tsconfig/node20/tsconfig.json",
+ "extends": "@tsconfig/node22/tsconfig.json",
/* TSConfig docs: https://aka.ms/tsconfig.json */
"compilerOptions": {
diff --git a/desktop/yarn.lock b/desktop/yarn.lock
index 09ae1ae36e..25b3a8f43a 100644
--- a/desktop/yarn.lock
+++ b/desktop/yarn.lock
@@ -25,19 +25,19 @@
ajv "^6.12.0"
ajv-keywords "^3.4.1"
-"@electron/asar@3.2.18":
- version "3.2.18"
- resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.18.tgz#fa607f829209bab8b9e0ce6658d3fe81b2cba517"
- integrity sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==
+"@electron/asar@3.4.1":
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.4.1.tgz#4e9196a4b54fba18c56cd8d5cac67c5bdc588065"
+ integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/asar@^3.2.7":
- version "3.2.10"
- resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.10.tgz#615cf346b734b23cafa4e0603551010bd0e50aa8"
- integrity sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==
+ version "3.2.18"
+ resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.18.tgz#fa607f829209bab8b9e0ce6658d3fe81b2cba517"
+ integrity sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
@@ -103,10 +103,10 @@
minimist "^1.2.6"
plist "^3.0.5"
-"@electron/rebuild@3.7.0":
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.7.0.tgz#82e20c467ddedbb295d7f641592c52e68c141e9f"
- integrity sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==
+"@electron/rebuild@3.7.2":
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.7.2.tgz#8d808b29159c50086d27a5dec72b40bf16b4b582"
+ integrity sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==
dependencies:
"@electron/node-gyp" "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2"
"@malept/cross-spawn-promise" "^2.0.0"
@@ -177,10 +177,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.1.tgz#4a97e85e982099d6c7ee8410aacb55adaa576f06"
integrity sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==
-"@eslint/js@^9.22.0":
- version "9.22.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.22.0.tgz#4ff53649ded7cbce90b444b494c234137fa1aa3d"
- integrity sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==
+"@eslint/js@^9.25.1":
+ version "9.25.1"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.25.1.tgz#25f5c930c2b68b5ebe7ac857f754cbd61ef6d117"
+ integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==
"@eslint/object-schema@^2.1.4":
version "2.1.4"
@@ -290,10 +290,10 @@
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
-"@tsconfig/node20@^20.1.4":
- version "20.1.4"
- resolved "https://registry.yarnpkg.com/@tsconfig/node20/-/node20-20.1.4.tgz#3457d42eddf12d3bde3976186ab0cd22b85df928"
- integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==
+"@tsconfig/node22@^22.0.1":
+ version "22.0.1"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node22/-/node22-22.0.1.tgz#27e3ee9b359e31e5b94690bf2bad5a923c1d57d0"
+ integrity sha512-VkgOa3n6jvs1p+r3DiwBqeEwGAwEvnVCg/hIjiANl5IEcqP3G0u5m8cBJspe1t9qjZRlZ7WFgqq5bJrGdgAKMg==
"@types/auto-launch@^5.0.5":
version "5.0.5"
@@ -346,25 +346,18 @@
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
-"@types/node@*":
- version "22.5.4"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.4.tgz#83f7d1f65bc2ed223bdbf57c7884f1d5a4fa84e8"
- integrity sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==
+"@types/node@*", "@types/node@^22.7.7":
+ version "22.14.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.14.0.tgz#d3bfa3936fef0dbacd79ea3eb17d521c628bb47e"
+ integrity sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==
dependencies:
- undici-types "~6.19.2"
+ undici-types "~6.21.0"
"@types/node@^10.0.3":
version "10.17.60"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
-"@types/node@^20.9.0":
- version "20.16.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53"
- integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==
- dependencies:
- undici-types "~6.19.2"
-
"@types/plist@^3.0.1":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0"
@@ -392,62 +385,62 @@
dependencies:
"@types/node" "*"
-"@typescript-eslint/eslint-plugin@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz#3e48eb847924161843b092c87a9b65176b53782f"
- integrity sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==
+"@typescript-eslint/eslint-plugin@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz#62f1befe59647524994e89de4516d8dcba7a850a"
+ integrity sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "8.26.1"
- "@typescript-eslint/type-utils" "8.26.1"
- "@typescript-eslint/utils" "8.26.1"
- "@typescript-eslint/visitor-keys" "8.26.1"
+ "@typescript-eslint/scope-manager" "8.31.1"
+ "@typescript-eslint/type-utils" "8.31.1"
+ "@typescript-eslint/utils" "8.31.1"
+ "@typescript-eslint/visitor-keys" "8.31.1"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^2.0.1"
-"@typescript-eslint/parser@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.26.1.tgz#0e2f915a497519fc43f52cf2ecbfa607ff56f72e"
- integrity sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==
+"@typescript-eslint/parser@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.31.1.tgz#e9b0ccf30d37dde724ee4d15f4dbc195995cce1b"
+ integrity sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==
dependencies:
- "@typescript-eslint/scope-manager" "8.26.1"
- "@typescript-eslint/types" "8.26.1"
- "@typescript-eslint/typescript-estree" "8.26.1"
- "@typescript-eslint/visitor-keys" "8.26.1"
+ "@typescript-eslint/scope-manager" "8.31.1"
+ "@typescript-eslint/types" "8.31.1"
+ "@typescript-eslint/typescript-estree" "8.31.1"
+ "@typescript-eslint/visitor-keys" "8.31.1"
debug "^4.3.4"
-"@typescript-eslint/scope-manager@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz#5e6ad0ac258ccf79462e91c3f43a3f1f7f31a6cc"
- integrity sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==
+"@typescript-eslint/scope-manager@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz#1eb52e76878f545e4add142e0d8e3e97e7aa443b"
+ integrity sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==
dependencies:
- "@typescript-eslint/types" "8.26.1"
- "@typescript-eslint/visitor-keys" "8.26.1"
+ "@typescript-eslint/types" "8.31.1"
+ "@typescript-eslint/visitor-keys" "8.31.1"
-"@typescript-eslint/type-utils@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz#462f0bae09de72ac6e8e1af2ebe588c23224d7f8"
- integrity sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==
+"@typescript-eslint/type-utils@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz#be0f438fb24b03568e282a0aed85f776409f970c"
+ integrity sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==
dependencies:
- "@typescript-eslint/typescript-estree" "8.26.1"
- "@typescript-eslint/utils" "8.26.1"
+ "@typescript-eslint/typescript-estree" "8.31.1"
+ "@typescript-eslint/utils" "8.31.1"
debug "^4.3.4"
ts-api-utils "^2.0.1"
-"@typescript-eslint/types@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.1.tgz#d5978721670cff263348d5062773389231a64132"
- integrity sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==
+"@typescript-eslint/types@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.31.1.tgz#478ed6f7e8aee1be7b63a60212b6bffe1423b5d4"
+ integrity sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==
-"@typescript-eslint/typescript-estree@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz#eb0e4ce31753683d83be53441a409fd5f0b34afd"
- integrity sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==
+"@typescript-eslint/typescript-estree@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz#37792fe7ef4d3021c7580067c8f1ae66daabacdf"
+ integrity sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==
dependencies:
- "@typescript-eslint/types" "8.26.1"
- "@typescript-eslint/visitor-keys" "8.26.1"
+ "@typescript-eslint/types" "8.31.1"
+ "@typescript-eslint/visitor-keys" "8.31.1"
debug "^4.3.4"
fast-glob "^3.3.2"
is-glob "^4.0.3"
@@ -455,22 +448,22 @@
semver "^7.6.0"
ts-api-utils "^2.0.1"
-"@typescript-eslint/utils@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.1.tgz#54cc58469955f25577f659753b71a0e117a0539f"
- integrity sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==
+"@typescript-eslint/utils@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.31.1.tgz#5628ea0393598a0b2f143d0fc6d019f0dee9dd14"
+ integrity sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
- "@typescript-eslint/scope-manager" "8.26.1"
- "@typescript-eslint/types" "8.26.1"
- "@typescript-eslint/typescript-estree" "8.26.1"
+ "@typescript-eslint/scope-manager" "8.31.1"
+ "@typescript-eslint/types" "8.31.1"
+ "@typescript-eslint/typescript-estree" "8.31.1"
-"@typescript-eslint/visitor-keys@8.26.1":
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz#c5267fcc82795cf10280363023837deacad2647c"
- integrity sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==
+"@typescript-eslint/visitor-keys@8.31.1":
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz#6742b0e3ba1e0c1e35bdaf78c03e759eb8dd8e75"
+ integrity sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==
dependencies:
- "@typescript-eslint/types" "8.26.1"
+ "@typescript-eslint/types" "8.31.1"
eslint-visitor-keys "^4.2.0"
"@xmldom/xmldom@^0.8.8":
@@ -571,44 +564,35 @@ any-shell-escape@^0.1.1:
resolved "https://registry.yarnpkg.com/any-shell-escape/-/any-shell-escape-0.1.1.tgz#d55ab972244c71a9a5e1ab0879f30bf110806959"
integrity sha512-36j4l5HVkboyRhIWgtMh1I9i8LTdFqVwDEHy1cp+QioJyKgAUG40X0W8s7jakWRta/Sjvm8mUG1fU6Tj8mWagQ==
-anymatch@~3.1.2:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
- integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
app-builder-bin@5.0.0-alpha.12:
version "5.0.0-alpha.12"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80"
integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==
-app-builder-lib@26.0.0:
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0.tgz#726b8b2c058f04f854aba70c7245d48454905980"
- integrity sha512-vZTt6Nc401IHBHISqspcO9tUF80ddOP5ehh2B4goLefM+zdT75CvuQUuqz7yzRgW16pHLqCvKMws0FbJQfLB5w==
+app-builder-lib@26.0.14:
+ version "26.0.14"
+ resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.14.tgz#a28fbefb600cf052d1259932f32289e043573f61"
+ integrity sha512-nc/A9MUd95MCc7bR4yVW7Lhs9FZTA/l8QdV8PE1vZZOOiogK4dupBfCCJG0UqLU81JS62f078/bwAeuMjt3hfQ==
dependencies:
"@develar/schema-utils" "~2.6.5"
- "@electron/asar" "3.2.18"
+ "@electron/asar" "3.4.1"
"@electron/fuses" "^1.8.0"
"@electron/notarize" "2.5.0"
"@electron/osx-sign" "1.3.1"
- "@electron/rebuild" "3.7.0"
+ "@electron/rebuild" "3.7.2"
"@electron/universal" "2.0.1"
"@malept/flatpak-bundler" "^0.4.0"
"@types/fs-extra" "9.0.13"
async-exit-hook "^2.0.1"
- bluebird-lst "^1.0.9"
- builder-util "26.0.0"
- builder-util-runtime "9.3.0"
+ builder-util "26.0.13"
+ builder-util-runtime "9.3.2"
chromium-pickle-js "^0.2.0"
config-file-ts "0.2.8-rc1"
debug "^4.3.4"
dotenv "^16.4.5"
dotenv-expand "^11.0.6"
ejs "^3.1.8"
- electron-publish "26.0.0"
+ electron-publish "26.0.13"
fs-extra "^10.1.0"
hosted-git-info "^4.1.0"
is-ci "^3.0.0"
@@ -617,10 +601,12 @@ app-builder-lib@26.0.0:
json5 "^2.2.3"
lazy-val "^1.0.5"
minimatch "^10.0.0"
+ plist "3.1.0"
resedit "^1.7.0"
semver "^7.3.8"
tar "^6.1.12"
temp-file "^3.4.0"
+ tiny-async-pool "1.3.0"
applescript@^1.0.0:
version "1.0.0"
@@ -688,11 +674,6 @@ base64-js@^1.3.1, base64-js@^1.5.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-binary-extensions@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
- integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -702,18 +683,6 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
-bluebird-lst@^1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
- integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==
- dependencies:
- bluebird "^3.5.5"
-
-bluebird@^3.5.5:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
boolean@^3.0.1:
version "3.2.0"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
@@ -734,7 +703,7 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@^3.0.3, braces@~3.0.2:
+braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
@@ -759,24 +728,23 @@ buffer@^5.1.0, buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
-builder-util-runtime@9.3.0:
- version "9.3.0"
- resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0.tgz#58d97c279bb8626a10d779e1cf22fea0eb25f5e8"
- integrity sha512-wR81YIybr41JITLSltwtTsZXkgTwcpBol7LGOyB5A8fKCcZaYLDWgUqDwmsjhlgADD6sGD5ieyzS/5wbL2l/qQ==
+builder-util-runtime@9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.2.tgz#2a69a239b50e26accf4ed4ea1730406a3117213c"
+ integrity sha512-7QDXJ1FwT6d9ZhG4kuObUUPY8/ENBS/Ky26O4hR5vbeoRGavgekS2Jxv+8sCn/v23aPGU2DXRWEeJuijN2ooYA==
dependencies:
debug "^4.3.4"
sax "^1.2.4"
-builder-util@26.0.0:
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0.tgz#e5bc122f3e9e94fa2e3afd2e837e81ce9f177359"
- integrity sha512-iLN4R0UAzSz4MxPmz+6vnXMqaY5BMd2FSNlM9f7eHSRYqZrsoTHCSrd7W4Kr4qFIdUxLlRz3X2npATapXzomIg==
+builder-util@26.0.13:
+ version "26.0.13"
+ resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.13.tgz#a2c11f8e89e5392719e540d610d70d8413943d74"
+ integrity sha512-6b64uHzywaL2KAG+rVcqk/Prta1m3I2Jo1d4d2CrApb6EeSk2V384tmSL0EniH+P8jaNbMp6qhg7cIALw32zRA==
dependencies:
"7zip-bin" "~5.2.0"
"@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12"
- bluebird-lst "^1.0.9"
- builder-util-runtime "9.3.0"
+ builder-util-runtime "9.3.2"
chalk "^4.1.2"
cross-spawn "^7.0.6"
debug "^4.3.4"
@@ -789,6 +757,7 @@ builder-util@26.0.0:
source-map-support "^0.5.19"
stat-mode "^1.0.0"
temp-file "^3.4.0"
+ tiny-async-pool "1.3.0"
cacache@^16.1.0:
version "16.1.3"
@@ -850,20 +819,12 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chokidar@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
- integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+chokidar@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
+ integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
dependencies:
- anymatch "~3.1.2"
- braces "~3.0.2"
- glob-parent "~5.1.2"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.6.0"
- optionalDependencies:
- fsevents "~2.3.2"
+ readdirp "^4.0.1"
chownr@^2.0.0:
version "2.0.0"
@@ -1046,16 +1007,7 @@ cross-env@^7.0.3:
dependencies:
cross-spawn "^7.0.1"
-cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-cross-spawn@^7.0.6:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -1153,14 +1105,14 @@ dir-compare@^4.2.0:
minimatch "^3.0.5"
p-limit "^3.1.0 "
-dmg-builder@26.0.0:
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0.tgz#6dc81be31f7ffe9f8a5fc77ce7f83eba33ae9aa7"
- integrity sha512-NyyTgm1U56ytpFvuGjj63PYug3v+oYYbPc8e08EiHP6G4TvMwYabmSzFtanfoO1iI7xOljpW/fW7SNCHHElsfw==
+dmg-builder@26.0.14:
+ version "26.0.14"
+ resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.14.tgz#ce8180da319cf3ee05d42cd460a7509207ad474b"
+ integrity sha512-0l7oEj175hee7NfnaUpb0zf7fsgh1SyHeLjDA0AtOMnBUfTGxPPwrifbUxfd73qzamrGNcyeqza+m/EJx3QUug==
dependencies:
- app-builder-lib "26.0.0"
- builder-util "26.0.0"
- builder-util-runtime "9.3.0"
+ app-builder-lib "26.0.14"
+ builder-util "26.0.13"
+ builder-util-runtime "9.3.2"
fs-extra "^10.1.0"
iconv-lite "^0.6.2"
js-yaml "^4.1.0"
@@ -1207,35 +1159,35 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
-electron-builder@^26.0.0:
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0.tgz#f5c03b049e3e9b0d3da7737f93bf1a830d1f17bb"
- integrity sha512-R1ZNTCtwjApiELkE4LTNIF6UkV+FMgyDIjILlsVvFak8Jr60cI9gu4q3lVALYzGBcFyzHKn2RPp6j0gl5kuVow==
+electron-builder@^26.0.14:
+ version "26.0.14"
+ resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.14.tgz#8927c6da42a69425d15e08f351e944ea0e7866da"
+ integrity sha512-YBxpWLMGj0oS7fbS3LVingeZqFunU0F8s+uB9QTd5+wN4qgrf/rSGRkqoImbWg2+F2yHq11wmaA/Xr9xzvgQ0w==
dependencies:
- app-builder-lib "26.0.0"
- builder-util "26.0.0"
- builder-util-runtime "9.3.0"
+ app-builder-lib "26.0.14"
+ builder-util "26.0.13"
+ builder-util-runtime "9.3.2"
chalk "^4.1.2"
- dmg-builder "26.0.0"
+ dmg-builder "26.0.14"
fs-extra "^10.1.0"
is-ci "^3.0.0"
lazy-val "^1.0.5"
simple-update-notifier "2.0.0"
yargs "^17.6.2"
-electron-log@^5.3.2:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.3.2.tgz#76aa0091f9cbf0d304546ca6f271ebb6ad953bf4"
- integrity sha512-EFI5MFFEzFJU5gyhJNpKQhfGfrRP9IWzSu0sSxrWXasWKvVAOFgBySafX8W1pbPKa/w8/DDPu2bBBtVZJdDsnw==
+electron-log@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.4.0.tgz#3180bf5194b2e2efacb62ec1392f8150faf4de6b"
+ integrity sha512-AXI5OVppskrWxEAmCxuv8ovX+s2Br39CpCAgkGMNHQtjYT3IiVbSQTncEjFVGPgoH35ZygRm/mvUMBDWwhRxgg==
-electron-publish@26.0.0:
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0.tgz#f37b9babe62885c2ee552af2817bf2048b566637"
- integrity sha512-0MOeYp1IRDj+jdkWluEVMer8fpc/htwWJZdGQUMbbbhgMnX8AvDdwHuR0UdaPFLDJ076E9YHd2urkeFyLm7PUQ==
+electron-publish@26.0.13:
+ version "26.0.13"
+ resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.13.tgz#04340520e6e9de5262fecfa011658cfcc3fc8917"
+ integrity sha512-O5hfHSwli5cegQ4JS3Dp0dZcheex6UCRE/qYyRQvhB6DhSwojiwTnAGEuQCJXc8K8Zxz2lku5Du3VwYHf8d5Lw==
dependencies:
"@types/fs-extra" "^9.0.11"
- builder-util "26.0.0"
- builder-util-runtime "9.3.0"
+ builder-util "26.0.13"
+ builder-util-runtime "9.3.2"
chalk "^4.1.2"
form-data "^4.0.0"
fs-extra "^10.1.0"
@@ -1250,12 +1202,12 @@ electron-store@^8.2.0:
conf "^10.2.0"
type-fest "^2.17.0"
-electron-updater@^6.4.0:
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.4.0.tgz#f413e5d1cb4fadde451eb7daa585ddb6332e2409"
- integrity sha512-E2fqL3GrVaXGZm2w95s4kJuPIF633pi5GhEy1/ReOHjDW9h/C0mZ1LXcLq0LsyQ4vyVj9UsdRb4E+Zy/d7RKUw==
+electron-updater@^6.6.3:
+ version "6.6.3"
+ resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.6.3.tgz#a1f53671ffbb08a475d495d48f0c0d971e665d5d"
+ integrity sha512-i448/SwMtqxy5wqAcXScnWjiFxZp+hmWA2jZCmojcdfodEGhi/DWTdRP01mE3lCILb8hmdE28SBaHf1oQW3+kw==
dependencies:
- builder-util-runtime "9.3.0"
+ builder-util-runtime "9.3.2"
fs-extra "^10.1.0"
js-yaml "^4.1.0"
lazy-val "^1.0.5"
@@ -1264,13 +1216,13 @@ electron-updater@^6.4.0:
semver "^7.6.3"
tiny-typed-emitter "^2.1.0"
-electron@^34.3.4:
- version "34.3.4"
- resolved "https://registry.yarnpkg.com/electron/-/electron-34.3.4.tgz#3acbcb5fe1aabfa926dddce23de28da9e6023cc5"
- integrity sha512-bIsjBh5EN229K4orJpVfjLb7JEoCYkUVg3tS981E1elEjvhBITqwm+K1j9goEqMIlxqYWgogREYpSZRQ+aLWgQ==
+electron@^36.1.0:
+ version "36.1.0"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-36.1.0.tgz#9919b77e61cd1400acc6dd24f9db8451fba5f8eb"
+ integrity sha512-gnp3BnbKdGsVc7cm1qlEaZc8pJsR08mIs8H/yTo8gHEtFkGGJbDTVZOYNAfbQlL0aXh+ozv+CnyiNeDNkT1Upg==
dependencies:
"@electron/get" "^2.0.0"
- "@types/node" "^20.9.0"
+ "@types/node" "^22.7.7"
extract-zip "^2.0.1"
emoji-regex@^8.0.0:
@@ -1342,12 +1294,7 @@ eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint-visitor-keys@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb"
- integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
-
-eslint-visitor-keys@^4.2.0:
+eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
@@ -1621,11 +1568,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
- integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
@@ -1664,7 +1606,7 @@ git-hooks-list@^3.0.0:
resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.1.0.tgz#386dc531dcc17474cf094743ff30987a3d3e70fc"
integrity sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==
-glob-parent@^5.1.2, glob-parent@~5.1.2:
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -1942,13 +1884,6 @@ ip-address@^9.0.5:
jsbn "1.1.0"
sprintf-js "^1.1.3"
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
is-ci@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867"
@@ -1973,7 +1908,7 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -2185,10 +2120,10 @@ lru-cache@^10.2.0:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
-lru-cache@^11.0.2:
- version "11.0.2"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39"
- integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==
+lru-cache@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117"
+ integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==
lru-cache@^6.0.0:
version "6.0.0"
@@ -2459,11 +2394,6 @@ nopt@^6.0.0:
dependencies:
abbrev "^1.0.0"
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
@@ -2633,7 +2563,7 @@ pend@~1.2.0:
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
-picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -2650,7 +2580,7 @@ pkg-up@^3.1.0:
dependencies:
find-up "^3.0.0"
-plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
+plist@3.1.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
@@ -2744,12 +2674,10 @@ readable-stream@^3.0.2, readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readdirp@~3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
- integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
- dependencies:
- picomatch "^2.2.1"
+readdirp@^4.0.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
+ integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
rechoir@^0.6.2:
version "0.6.2"
@@ -2886,6 +2814,11 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+semver@^5.5.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
semver@^6.2.0:
version "6.3.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
@@ -3133,6 +3066,13 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+tiny-async-pool@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz#c013e1b369095e7005db5595f95e646cca6ef8a5"
+ integrity sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==
+ dependencies:
+ semver "^5.5.0"
+
tiny-typed-emitter@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5"
@@ -3209,29 +3149,24 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
-typescript-eslint@^8.26.1:
- version "8.26.1"
- resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.26.1.tgz#d17a638a7543bc535157b83cdf5876513c71493b"
- integrity sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==
+typescript-eslint@^8.31.1:
+ version "8.31.1"
+ resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.31.1.tgz#b77ab1e48ced2daab9225ff94bab54391a4af69b"
+ integrity sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==
dependencies:
- "@typescript-eslint/eslint-plugin" "8.26.1"
- "@typescript-eslint/parser" "8.26.1"
- "@typescript-eslint/utils" "8.26.1"
+ "@typescript-eslint/eslint-plugin" "8.31.1"
+ "@typescript-eslint/parser" "8.31.1"
+ "@typescript-eslint/utils" "8.31.1"
-typescript@^5.4.3:
- version "5.5.4"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
- integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
+typescript@^5.4.3, typescript@^5.8.3:
+ version "5.8.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
+ integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
-typescript@^5.8.2:
- version "5.8.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4"
- integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==
-
-undici-types@~6.19.2:
- version "6.19.8"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
- integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+undici-types@~6.21.0:
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
+ integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
unique-filename@^2.0.0:
version "2.0.1"
diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts
index 5999d84b77..43ee4fe192 100644
--- a/docs/docs/.vitepress/sidebar.ts
+++ b/docs/docs/.vitepress/sidebar.ts
@@ -182,6 +182,7 @@ export const sidebar = [
text: "Auth",
items: [
{ text: "Introduction", link: "/auth/" },
+ { text: "Features", link: "/auth/features/" },
{
text: "FAQ",
collapsed: true,
@@ -223,6 +224,7 @@ export const sidebar = [
},
{
text: "Troubleshooting",
+ collapsed: true,
items: [
{
text: "Windows login",
@@ -238,58 +240,91 @@ export const sidebar = [
items: [
{ text: "Getting started", link: "/self-hosting/" },
{
- text: "System requirements",
- link: "/self-hosting/guides/system-requirements",
+ text: "Connecting to custom server",
+ link: "/self-hosting/guides/custom-server/",
+ },
+ {
+ text: "Creating accounts",
+ link: "/self-hosting/creating-accounts",
+ },
+ {
+ text: "Configuring your server",
+ link: "/self-hosting/museum",
+ },
+ {
+ text: "Configuring S3",
+ link: "/self-hosting/guides/configuring-s3",
+ },
+ {
+ text: "Reverse proxy",
+ link: "/self-hosting/reverse-proxy",
},
{
text: "Guides",
+ collapsed: true,
items: [
{ text: "Introduction", link: "/self-hosting/guides/" },
- {
- text: "Connect to custom server",
- link: "/self-hosting/guides/custom-server/",
- },
- {
- text: "Hosting the web app",
- link: "/self-hosting/guides/web-app",
- },
- {
- text: "Configuring S3",
- link: "/self-hosting/guides/configuring-s3",
- },
- {
- text: "Hosting Ente with external S3 (Community)",
- link: "/self-hosting/guides/external-s3",
- },
- {
- text: "DB migration",
- link: "/self-hosting/guides/db-migration",
- },
- {
- text: "Hosting Ente without Docker",
- link: "/self-hosting/guides/standalone-ente",
- },
- {
- text: "Ente via Tailscale (Community)",
- link: "/self-hosting/guides/Tailscale.md",
- },
- {
- text: "Configure CLI for Self Hosted Instance",
- link: "/self-hosting/guides/selfhost-cli",
- },
{
text: "Administering your server",
link: "/self-hosting/guides/admin",
},
-
{
- text: "Mobile build",
- link: "/self-hosting/guides/mobile-build",
+ text: "Configuring CLI for your instance",
+ link: "/self-hosting/guides/selfhost-cli",
+ },
+ {
+ text: "Running Ente from source",
+ link: "/self-hosting/guides/from-source",
+ },
+ {
+ text: "Running Ente without Docker",
+ link: "/self-hosting/guides/standalone-ente",
},
],
},
+ {
+ text: "Troubleshooting",
+ collapsed: true,
+ items: [
+ {
+ text: "General",
+ link: "/self-hosting/troubleshooting/misc",
+ },
+ {
+ text: "Bucket CORS",
+ link: '/self-hosting/troubleshooting/bucket-cors'
+ },
+ {
+ text: "Uploads",
+ link: "/self-hosting/troubleshooting/uploads",
+ },
+ {
+ text: "Docker / quickstart",
+ link: "/self-hosting/troubleshooting/docker",
+ },
+ {
+ text: "Ente CLI secrets",
+ link: "/self-hosting/troubleshooting/keyring",
+ },
+ ],
+ },
+ {
+ text: "Community Guides",
+ collapsed: true,
+ items :[
+ {
+ text: "Ente via Tailscale",
+ link: "/self-hosting/guides/Tailscale",
+ },
+ {
+ text: "Ente with External S3",
+ link: "/self-hosting/guides/external-s3",
+ }
+ ]
+ },
{
text: "FAQ",
+ collapsed: true,
items: [
{ text: "General", link: "/self-hosting/faq/" },
{
@@ -306,27 +341,6 @@ export const sidebar = [
},
],
},
- {
- text: "Troubleshooting",
- items: [
- {
- text: "Uploads",
- link: "/self-hosting/troubleshooting/uploads",
- },
- {
- text: "Docker",
- link: "/self-hosting/troubleshooting/docker",
- },
- {
- text: "Yarn",
- link: "/self-hosting/troubleshooting/yarn",
- },
- {
- text: "Ente CLI Secrets",
- link: "/self-hosting/troubleshooting/keyring",
- },
- ],
- },
],
},
{
diff --git a/docs/docs/auth/features/index.md b/docs/docs/auth/features/index.md
new file mode 100644
index 0000000000..ddee2bd2fb
--- /dev/null
+++ b/docs/docs/auth/features/index.md
@@ -0,0 +1,139 @@
+---
+title: Features - Auth
+description: Features available in Ente Auth
+---
+
+# Features
+
+This page outlines the key features available in Ente Auth.
+
+### Icons
+
+Ente Auth supports the icon pack provided by
+[simple-icons](https://github.com/simple-icons/simple-icons). If an icon you
+need is missing, please refer to the
+[docs/adding-icons](https://github.com/ente-io/ente/blob/main/auth/docs/adding-icons.md)
+guide for instructions on how to contribute.
+
+### Search
+
+Quickly find your codes by searching based on issuer or account name. You can
+also configure the app to focus the search bar automatically on app start by
+going to **Settings → General → Focus search on app start**.
+
+### Tags
+
+Organize and filter your codes with ease using tags.
+
+- **Creating a Tag:** When adding or editing a code, tap the orange (+) icon to
+ create a new tag.
+- **Adding an existing Tag:** When adding or editing a code, select the desired
+ tag from the list.
+
+### Pinning
+
+Highlight your frequently used services by pinning them to the top of your code
+list. To pin a code, long-press (mobile) or right-click (desktop) the code and
+select "Pin".
+
+### Notes
+
+Add additional information to your codes using notes. Notes can be added during
+the process of creating or modifying a code.
+
+### Sharing
+
+Securely share codes temporarily with others.
+
+- Long-press (mobile) or right-click (desktop) on a code and choose "Share".
+- Select a duration for the shared link: 2 minutes, 5 minutes, or 10 minutes.
+- This generates a unique, time-limited link. Recipients can view the codes for
+ the specified duration without gaining access to the underlying secret key.
+ After the link expires, the recipients will no longer be able to view new
+ codes.
+
+### Custom sorting
+
+Customize the order in which your codes are displayed. Ente Auth provides
+several sorting options:
+
+- Issuer name
+- Account name
+- Frequently used
+- Recently used
+- Manual (custom drag-and-drop order)
+
+Access the sort menu in the top-right corner (next to the search icon) to change
+your sorting preference.
+
+### Offline mode
+
+Ente Auth can be used entirely offline. Choose "Use without backups" on the
+login screen. In this mode, your codes are stored locally on your device.
+
+Unlike when using an account, data is not synced or backed up to the cloud. You
+are responsible for manually backing up your codes.
+
+### Display options
+
+Customize how your codes are displayed for optimal usability.
+
+- **Show large icons:** Display codes with larger icons for enhanced visibility.
+- **Compact mode:** Switch to a more compact layout to view more codes on the
+ screen simultaneously.
+- **Hide codes:** Hide the actual code values for extra privacy. Double-tap a
+ code to reveal it when needed.
+
+### App lock
+
+Add an additional layer of protection using the app lock. Choose from the
+following lock methods:
+
+- **Device lock:** Use the existing lock configured on your device (e.g., Face
+ ID, Touch ID, system password).
+- **PIN lock:** Set up a 4-digit PIN code to unlock the app.
+- **Password lock:** Set up a password to unlock the app.
+
+Additionally, configure **Auto lock** to automatically lock the app after a
+specified period of time (options: Immediately, 5s, 15s, 1m, 5m, 30m).
+
+### Import / Export
+
+Ente Auth offers various import and export options for your codes.
+
+- **Export:** Export your codes in plain text, as an encrypted file, or
+ automatically via the CLI.
+- **Import:** Import codes from various other authentication apps.
+
+For detailed instructions, refer to the
+[migration guides](../migration-guides/).
+
+### Deduplicate codes
+
+If you import codes and end up with duplicates, you can easily remove them. Go
+to **Settings → Data → Duplicate codes** to find and remove duplicate codes.
+
+### Trash
+
+Manage unwanted codes by moving them to the Trash. The Trash is not cleared
+automatically, giving you the flexibility to restore or permanently delete codes
+at any time.
+
+- **Trashing a code:** Long-press (mobile) or right-click (desktop) on a code
+ and select "Trash" to move it to the Trash.
+- **Viewing trashed codes:** If you have trashed codes, you can view them by
+ selecting the Trash tag.
+- **Managing trashed codes:** In the Trash view, you can either permanently
+ delete codes or restore them back to your main list.
+
+### Scan QR
+
+Easily add or share entries using QR codes:
+
+- **Add by scanning (mobile):** On mobile, you can add a new entry by scanning
+ the QR code provided by the service. This quickly adds the entry to Ente Auth.
+- **Show entry as QR code:** On all apps, you can long-press (mobile) or
+ right-click (desktop) a code and select "QR". This allows you to easily share
+ the complete entry (including the secret) with others by letting them scan the
+ displayed QR code. This can also be used to easily add the same entry to
+ another authenticatior app or service.
diff --git a/docs/docs/auth/migration-guides/authy/index.md b/docs/docs/auth/migration-guides/authy/index.md
index 30b8c550cf..27baa97ab1 100644
--- a/docs/docs/auth/migration-guides/authy/index.md
+++ b/docs/docs/auth/migration-guides/authy/index.md
@@ -10,8 +10,8 @@ A guide written by Green, an ente.io lover
> [!WARNING]
>
> Authy has dropped all support for its desktop apps. It is no longer possible
-> to export data from Authy using methods 1 and 2. You will either need a rooted
-> android phone or you will need to reconfigure 2FA for each of your accounts.
+> to export data from Authy using methods 1 and 2. You will need either an iOS device
+> and computer (method 4) or a rooted Android phone (method 3) to follow this guide.
---
@@ -202,7 +202,15 @@ This uses the tool [Aegis Authenticator](https://getaegis.app/) from
6. Then export the codes from Aegis Authenticator to `json` or `txt` using the
"Export to file" option in the "Import & Export" menu.
-## Importing to Ente Authenticator (Method 1, method 2.1)
+## Method 4: Authy-iOS-MiTM
+
+**Who should use this?** Technical iOS users of Authy that cannot export their tokens with methods 1 or 2 (due to those methods being patched) or method 3 (due to that method requiring a rooted Android device).
+
+This method works by intercepting the data the Authy app receives while logging in for the first time, which contains your encrypted authenticator tokens. After the encrypted authenticator tokens are dumped, you can decrypt them using your backup password and convert them to an Ente token file.
+
+For an up-to-date guide of how to retrieve the encrypted authenticator tokens and decrypt them, please see [Authy-iOS-MiTM](https://github.com/AlexTech01/Authy-iOS-MiTM). To convert the `decrypted_tokens.json` file from that guide into a format Ente Authenticator can recognize, use [this](https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93?permalink_comment_id=5317087#gistcomment-5317087) Python script. Once you have the `ente_auth_import.plain` file from that script, transfer it to your device and follow the instructions below to import it into Ente Authenticator.
+
+## Importing to Ente Authenticator (Method 1, method 2.1, method 4)
1. Copy the TXT file to one of your devices with Ente Authenticator.
2. Log in to your account (if you haven't already), or press "Use without
diff --git a/docs/docs/photos/faq/export.md b/docs/docs/photos/faq/export.md
index 12e203061d..16879ee327 100644
--- a/docs/docs/photos/faq/export.md
+++ b/docs/docs/photos/faq/export.md
@@ -7,10 +7,9 @@ description: Frequently asked questions about keeping extra backups of your data
## How can I backup my data in a local drive outside Ente?
-Yes! You can use our CLI tool or our desktop app to set up exports of your data
-to your local drive. This way, you can use Ente in your day to day use, but will
-have an additional guarantee that a copy of your original photos and videos are
-always available in normal directories and files.
+You can use our CLI tool or our desktop app to set up exports of your data
+to your local drive. This way, you can use Ente in your day to day use, with an additional guarantee that a copy of your original photos and videos are
+always available on your machine.
- You can use [Ente's CLI](https://github.com/ente-io/ente/tree/main/cli#export)
to export your data in a cron job to a location of your choice. The exports
diff --git a/docs/docs/photos/features/family-plans.md b/docs/docs/photos/features/family-plans.md
index 080c3362d8..711b9e3094 100644
--- a/docs/docs/photos/features/family-plans.md
+++ b/docs/docs/photos/features/family-plans.md
@@ -24,7 +24,7 @@ In brief,
## Storage Limits
-If you're an admin of a family, you will be able to set storage limits for the
+If you're an admin of a family, you will be able to set storage limits for the
members in your family plan.
In brief,
@@ -38,15 +38,5 @@ In brief,
- If the admin has set a limit for any user, that limit value will be prefilled
in the input box.
-- Incase, if you want to remove any storage limit from a members account, you
+- If you want to remove any storage limit from a members account, you
can click on the "Remove Limit" and they can upload photos without any limit.
-
-## FAQ
-
-- **Can you assign a storage quota for each individual member in the family
- plan?**
-
- Unfortunately, at this moment, assigning a storage quota for each individual
- member in the family plan is not supported. For updates on this feature
- request, please follow
- [this thread](https://github.com/ente-io/ente/discussions/857).
diff --git a/docs/docs/photos/features/trash.md b/docs/docs/photos/features/trash.md
index 84a685279b..b60226a671 100644
--- a/docs/docs/photos/features/trash.md
+++ b/docs/docs/photos/features/trash.md
@@ -6,7 +6,7 @@ description: Deleting items and trash
# Trash
Whenever you delete an item from Ente, it is moved to Trash. These items will be
-automatically deleted from Trash after 30 days. You can manaully select photos
+automatically deleted from Trash after 30 days. You can manually select photos
to permanently delete or completely empty the trash if you wish.
Items in trash are included in your used storage calculation.
diff --git a/docs/docs/photos/troubleshooting/nas.md b/docs/docs/photos/troubleshooting/nas.md
index 262d4c758d..c84463ce63 100644
--- a/docs/docs/photos/troubleshooting/nas.md
+++ b/docs/docs/photos/troubleshooting/nas.md
@@ -14,9 +14,21 @@ directly stream chunks of Google Takeout zips that are stored on network drives.
In particular, the folder watch functionality suffers a lot since the app needs
access to file system events to detect changes to the users files so that they
-can be uploaded whenever there are changes.
+can be uploaded whenever there are changes. Network drives are less reliable in
+providing these file change events correctly.
Since are high chances of the user having a subpar experience, we request
customers to avoid using the desktop app directly with network attached storage
and instead temporarily copy the files to their local storage for uploads, and
avoid watching folders that live on a network drive.
+
+## Exporting to UNC paths
+
+Generally, exports are likely to work better than imports, since the interaction
+with the file system is relatively simpler (Note that the app still needs to
+scan the folder to find existing files, esp. if the continuous export option is
+enabled).
+
+A special case is when exporting to a UNC path. In this case, the file
+separators will not work as expected and the export will not start. As a
+workaround, you can map your UNC path to a network drive and use that instead.
diff --git a/docs/docs/public/cloudflare.png b/docs/docs/public/cloudflare.png
new file mode 100644
index 0000000000..fe3d379dd4
Binary files /dev/null and b/docs/docs/public/cloudflare.png differ
diff --git a/docs/docs/public/endpoint.png b/docs/docs/public/endpoint.png
new file mode 100644
index 0000000000..ddd2c3bd5d
Binary files /dev/null and b/docs/docs/public/endpoint.png differ
diff --git a/docs/docs/public/otp.png b/docs/docs/public/otp.png
new file mode 100644
index 0000000000..a4591c7672
Binary files /dev/null and b/docs/docs/public/otp.png differ
diff --git a/docs/docs/public/quickstart.png b/docs/docs/public/quickstart.png
new file mode 100644
index 0000000000..c70fe513ab
Binary files /dev/null and b/docs/docs/public/quickstart.png differ
diff --git a/docs/docs/public/web-app.webp b/docs/docs/public/web-app.webp
new file mode 100644
index 0000000000..3db4ccf683
Binary files /dev/null and b/docs/docs/public/web-app.webp differ
diff --git a/docs/docs/self-hosting/creating-accounts.md b/docs/docs/self-hosting/creating-accounts.md
new file mode 100644
index 0000000000..5c3a53d3a3
--- /dev/null
+++ b/docs/docs/self-hosting/creating-accounts.md
@@ -0,0 +1,27 @@
+---
+title: Creating accounts
+description: Creating accounts on your deployment
+---
+
+# Creating accounts
+
+Once Ente is up and running, the Ente Photos web app will be accessible on
+`http://localhost:3000`. Open this URL in your browser and proceed with creating
+an account.
+
+The default API endpoint for museum will be `localhost:8080`.
+
+
+
+To complete your account registration you will need to enter a 6-digit
+verification code.
+
+This code can be found in the server logs, which should already be shown in your
+quickstart terminal. Alternatively, you can open the server logs with the
+following command from inside the `my-ente` folder:
+
+```sh
+sudo docker compose logs
+```
+
+
diff --git a/docs/docs/self-hosting/faq/otp.md b/docs/docs/self-hosting/faq/otp.md
index 5a9b8d0f2d..0a85b60717 100644
--- a/docs/docs/self-hosting/faq/otp.md
+++ b/docs/docs/self-hosting/faq/otp.md
@@ -12,6 +12,19 @@ verification code by:
- Reading it from the DB (otts table)
+The easiest option when getting started is to look for it in the server (museum)
+logs. If you're already running the docker compose cluster using the quickstart
+script, you should be already seeing the logs in your terminal. Otherwise you
+can go to the folder (e.g. `my-ente`) where your `compose.yaml` is, then run
+`docker compose logs museum --follow`. Once you can see the logs, look for a
+line like:
+
+```
+... Skipping sending email to email@example.com: *Verification code: 112089*
+```
+
+That is the verification code.
+
> [!TIP]
>
> You can also configure your instance to send out emails so that you can get
diff --git a/docs/docs/self-hosting/guides/configuring-s3.md b/docs/docs/self-hosting/guides/configuring-s3.md
index 45076c91fc..f4095db2eb 100644
--- a/docs/docs/self-hosting/guides/configuring-s3.md
+++ b/docs/docs/self-hosting/guides/configuring-s3.md
@@ -5,23 +5,26 @@ description:
from outside localhost
---
-# Components of the Architecture
+# Architecture

-There are three components involved in uploading:
+There are three components involved in uploading a file:
1. The client (e.g. the web app or the mobile app)
2. Ente's server (museum)
-3. The S3-compatible object storage (e.g. minio in the default starter)
+3. The S3-compatible object storage (e.g. MinIO in the default starter)
For the uploads to work, all three of them need to be able to reach each other.
-This is because the client uploads directly to the object storage. The
-interaction goes something like this:
+This is because the client uploads directly to the object storage.
-1. Client wants to upload, it asks museum where it should upload to.
-2. Museum creates pre-signed URLs for the S3 bucket that was configured.
-3. Client directly uploads to the S3 buckets these URLs.
+A file upload flows as follows:
+
+1. Client that wants to upload a file asks museum where it should upload the
+ file to
+2. museum creates pre-signed URLs for the S3 bucket that was configured
+3. Client directly uploads to the S3 buckets these URLs
+4. Client finally informs museum that a file has been uploaded to this URL
The upshot of this is that _both_ the client and museum should be able to reach
your S3 bucket.
@@ -30,10 +33,10 @@ your S3 bucket.
The URL for the S3 bucket is configured in
[scripts/compose/credentials.yaml](https://github.com/ente-io/ente/blob/main/server/scripts/compose/credentials.yaml#L10).
-You can edit this file directly when testing, though it is just simpler and more
-robust to create a `museum.yaml` (in the same folder as the Docker compose file)
-and put your custom configuration there (in your case, you can put an entire
-`s3` config object in your `museum.yaml`).
+
+You can edit this file directly while testing, though it is more robust to
+create a `museum.yaml` (in the same folder as the Docker compose file) and to
+setup your custom configuration there.
> [!TIP]
> For more details about these configuration objects, see the documentation for
@@ -42,29 +45,32 @@ and put your custom configuration there (in your case, you can put an entire
By default, you only need to configure the endpoint for the first bucket.
-The docker compose file is shipped with MinIO as the Self Hosted S3 Compatible Storage.
-By default, MinIO server is served on `localhost:3200` and the MinIO UI on
-`localhost:3201`.
-For example, in a localhost network situation, the way this
-connection works is, Museum (`1`) and MinIO (`2`) run on the same docker network and
-the web app (`3`) which will also be hosted on the localhost. This enables all the
-three components of the setup being able to communicate with each other seamlessly.
+The Docker compose file is shipped with MinIO as the self hosted S3 compatible
+storage. By default, MinIO server is served on `localhost:3200` and the MinIO UI
+on `localhost:3201`.
+
+For example, in a localhost network situation, the way this connection works is,
+museum (`1`) and MinIO (`2`) run on the same Docker network and the web app
+(`3`) will also be hosted on your localhost. This enables all the three
+components of the setup to communicate with each other seamlessly.
The same principle applies if you're deploying to your custom domain.
## Replication

-Community contributed diagram of Ente's Replication Process
+Community contributed diagram of Ente's replication process
> [!IMPORTANT]
-> As of now, Replication works only if all the 3 storage type
-> needs are fulfilled (1 Hot, 1 Cold and 1 Glacier Storage).
+>
+> As of now, replication works only if all the 3 storage type needs are
+> fulfilled (1 hot, 1 cold and 1 glacier storage).
>
> [Reference](https://github.com/ente-io/ente/discussions/3167#discussioncomment-10585970)
-If you're wondering why there are 3 buckets on MinIO UI - that's because our
-production instance uses these to perform [replication](https://ente.io/reliability/).
+If you're wondering why there are 3 buckets on the MinIO UI - that's because our
+production instance uses these to perform
+[replication](https://ente.io/reliability/).
If you're also wondering about why the bucket names are specifically what they are,
it's because that is exactly what we are using on our production instance.
@@ -72,10 +78,10 @@ We use `b2-eu-cen` as hot, `wasabi-eu-central-2-v3` as cold (also the secondary
and `scw-eu-fr-v3` as glacier storage. As of now, all of this is hardcoded.
Hence, the same hardcoded configuration is applied when you self host Ente.
-In a Self hosted Ente Instance replication is turned off by default.
-When replication is turned off, only the first bucket (`b2-eu-cen`) is used,
-and the other two are ignored. Only the names here are specifically fixed, but
-in the configuration body you can put any other keys. It does not have any relation
+In a self hosted Ente instance replication is turned off by default. When
+replication is turned off, only the first bucket (`b2-eu-cen`) is used, and the
+other two are ignored. Only the names here are specifically fixed, but in the
+configuration body you can put any other keys. It does not have any relation
with `b2`, `wasabi` or even `scaleway`.
Use the `s3.hot_storage.primary` option if you'd like to set one of the other
@@ -85,23 +91,23 @@ predefined buckets as the primary bucket.
> [!NOTE]
>
-> If you need to configure SSL, for example if you're running over the internet,
-> you'll need to turn off `s3.are_local_buckets` (which disables SSL in the
-> default starter compose template).
+> If you need to configure SSL, you'll need to turn off `s3.are_local_buckets`
+> (which disables SSL in the default starter compose template).
>
Disabling `s3.are_local_buckets` also switches to the subdomain style URLs for
-the buckets. However, not all S3 providers support these, in particular, minio
-does not work with these in default configuration. So in such cases you'll
-also need to then enable `s3.use_path_style_urls`.
+the buckets. However, not all S3 providers support these. In particular, MinIO
+does not work with these in default configuration. So in such cases you'll also
+need to enable `s3.use_path_style_urls`.
## Summary
Set the S3 bucket `endpoint` in `credentials.yaml` to a `yourserverip:3200` or
-some such IP/hostname that accessible from both where you are running the Ente
-clients (e.g. the mobile app) and also from within the Docker compose cluster.
+some such IP / hostname that is accessible from both where you are running the
+Ente clients (e.g. the mobile app) and also from within the Docker compose
+cluster.
-#### Example
+### Example
An example `museum.yaml` when you're trying to connect to museum running on your
computer from your phone on the same WiFi network:
@@ -115,51 +121,4 @@ s3:
endpoint: http://:3200
region: eu-central-2
bucket: b2-eu-cen
-```
-
-## FAE (Frequently Answered Errors)
-
-Here are some Frequently Answered Errors from the Community Chat with the reasoning
-for a particular error and its potential fix.
-
-In most situations, the problem turns out to be some minute mistakes or misconfigurations
-on the users end and that turns out to be the bottleneck of the whole problem.
-Please make sure to `reverse_proxy` Museum to a domain as well as check your S3
-Credentials and whole config for any minor mis-configurations.
-
-It is also suggested that the user setups Bucket CORS on MinIO or any external
-S3 Bucket they are connecting to. To setup Bucket CORS, help yourself by upload
-[this](https://help.ente.io/self-hosting/guides/external-s3#_5-fix-potential-cors-issue-with-your-bucket).
-
-### 403 Forbidden
-
-If museum (`2`) is able to make a network connection to your S3 bucket (`3`) but
-uploads are still failing, it could be a credentials or permissions issue. A
-telltale sign of this is that in the museum logs you can see `403 Forbidden`
-errors about it not able to find the size of a file even though the
-corresponding object exists in the S3 bucket.
-
-To fix these, you should ensure the following:
-
-1. The bucket CORS rules do not allow museum to access these objects.
- - For uploading files from the browser, you will need to currently set
- allowedOrigins to "\*", and allow the "X-Auth-Token", "X-Client-Package"
- headers configuration too.
- [Here is an example of a working configuration](https://github.com/ente-io/ente/discussions/1764#discussioncomment-9478204).
-
-2. The credentials are not being picked up (you might be setting the correct
- creds, but not in the place where museum picks them from).
-
-### Mismatch in File Size
-
-The "Mismatch in File Size" error mostly occurs in a situation where the client (`1`)
-is re-uploading a file which is already in the bucket with a different File Size. The
-reason for re-upload could be anything including Network issue, sudden killing of app
-before the upload is complete and etc.
-
-This is also one of Museums (`2`) Validation Checks for the size of file being
-re-uploaded from the client to the size of the file which is already
-uploaded to the S3 Bucket.
-
-In most case, it is very unlikely that this error could be a cause of some mistake in
-the configuration or Browser/Bucket CORS.
+```
\ No newline at end of file
diff --git a/docs/docs/self-hosting/guides/custom-server/index.md b/docs/docs/self-hosting/guides/custom-server/index.md
index 42577e7eae..86060ba909 100644
--- a/docs/docs/self-hosting/guides/custom-server/index.md
+++ b/docs/docs/self-hosting/guides/custom-server/index.md
@@ -8,6 +8,8 @@ description: Using a custom self-hosted server with Ente client apps and CLI
You can modify various Ente client apps and CLI to connect to a self hosted
custom server endpoint.
+[[toc]]
+
## Mobile
The pre-built Ente apps from GitHub / App Store / Play Store / F-Droid can be
@@ -77,3 +79,37 @@ endpoint:
(Another
[example](https://github.com/ente-io/ente/blob/main/cli/config.yaml.example))
+
+## Find the hostname of your server
+
+If you want to access your museum within your own network, you can use the
+`hostname` command to find a addressable local network hostname or IP for your
+computer, and then use it by suffixing it with the port number.
+
+First, run
+
+```sh
+hostname
+```
+
+The result will look something like this
+
+```sh
+my-computer.local
+```
+
+You will need to replace the server endpoint with an address that uses your
+server's hostname and the port number. Here's an example:
+
+```
+http://my-computer.local:8080
+```
+
+Note that this will only work within your network. To access it from outside the
+network, you need to use the public IP or hostname.
+
+> [!TIP]
+>
+> If you're having trouble uploading from your mobile app, it is likely that
+> museum is not able to connect to your S3 storage. See the [Configuring
+> S3](/self-hosting/guides/configuring-s3) guide for more details.
diff --git a/docs/docs/self-hosting/guides/external-s3.md b/docs/docs/self-hosting/guides/external-s3.md
index 610d6e1c3d..0a919092c0 100644
--- a/docs/docs/self-hosting/guides/external-s3.md
+++ b/docs/docs/self-hosting/guides/external-s3.md
@@ -250,64 +250,6 @@ docker compose exec -i postgres psql -U pguser -d ente_db -c "INSERT INTO storag
After few reloads, you should see 1 To of quota.
-## 5. Fix potential CORS issue with your bucket
-
-### For AWS S3
-
-If you cannot upload a photo due to a CORS issue, you need to fix the CORS
-configuration of your bucket.
-
-Create a `cors.json` file with the following content:
-
-```json
-{
- "CORSRules": [
- {
- "AllowedOrigins": ["*"],
- "AllowedHeaders": ["*"],
- "AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
- "MaxAgeSeconds": 3000,
- "ExposeHeaders": ["Etag"]
- }
- ]
-}
-```
-
-You may want to change the `AllowedOrigins` to a more restrictive value.
-
-If you are using AWS for S3, you can execute the below command to get rid of
-CORS. Make sure to enter the right path for the `cors.json` file.
-
-```bash
-aws s3api put-bucket-cors --bucket YOUR_S3_BUCKET --cors-configuration /path/to/cors.json
-```
-
-### For Self-hosted Minio Instance
-
-> Important: MinIO does not take JSON CORS file as the input, instead you will
-> have to build a CORS.xml file or just convert the above `cors.json` to XML.
-
-A minor requirement here is the tool `mc` for managing buckets via command line
-interface. Checkout the `mc set alias` document to configure alias for your
-instance and bucket. After this you will be prompted for your AccessKey and
-Secret, which is your username and password, go ahead and enter that.
-
-```sh
-mc cors set // set "cors_allowed_origin=*"
-```
-
-You can create also `.csv` file and dump the list of origins you would like to
-allow and replace the `*` with `path` to the CSV file.
-
-Now, uploads should be working fine.
-
## Related
Some other users have also shared their setups.
@@ -315,3 +257,5 @@ Some other users have also shared their setups.
- [Using Traefik](https://github.com/ente-io/ente/pull/3663)
- [Building custom images from source (Linux)](https://github.com/ente-io/ente/discussions/3778)
+
+- [Troubleshooting Bucket CORS](/self-hosting/troubleshooting/bucket-cors)
diff --git a/docs/docs/self-hosting/guides/from-source.md b/docs/docs/self-hosting/guides/from-source.md
new file mode 100644
index 0000000000..df3ec7e5fb
--- /dev/null
+++ b/docs/docs/self-hosting/guides/from-source.md
@@ -0,0 +1,228 @@
+---
+title: Ente from Source
+description: Getting started self hosting Ente Photos and/or Ente Auth
+---
+
+
+# Ente from Source
+
+> [!WARNING] NOTE
+> The below documentation will cover instructions about self-hosting the web app manually. If you
+> want to deploy Ente hassle free, use the [one line](https://ente.io/blog/self-hosting-quickstart/)
+> command to setup Ente. This guide might be deprecated in the near future.
+
+## Installing Docker
+
+Refer to
+[How to install Docker from the APT repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
+for detailed instructions.
+
+## Start the server
+
+```sh
+git clone https://github.com/ente-io/ente
+cd ente/server
+docker compose up --build
+```
+
+> [!TIP]
+>
+> You can also use a pre-built Docker image from `ghcr.io/ente-io/server`
+> ([More info](https://github.com/ente-io/ente/blob/main/server/docs/docker.md))
+
+Install the necessary dependencies for running the web client
+
+```sh
+# installing npm and yarn
+
+sudo apt update
+sudo apt install nodejs npm
+sudo npm install -g yarn // to install yarn globally
+```
+
+Then in a separate terminal, you can run (e.g) the web client
+
+```sh
+cd ente/web
+git submodule update --init --recursive
+yarn install
+NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev
+```
+
+That's about it. If you open http://localhost:3000, you will be able to create
+an account on a Ente Photos web app running on your machine, and this web app
+will be connecting to the server running on your local machine at
+`localhost:8080`.
+
+For the mobile apps, you don't even need to build, and can install normal Ente
+apps and configure them to use your
+[custom self-hosted server](/self-hosting/guides/custom-server/).
+
+> If you want to build the mobile apps from source, see the instructions
+> [here](/self-hosting/guides/mobile-build).
+
+## Web app with Docker and Compose
+
+The instructoins in previous section were just a temporary way to run the web app locally.
+To run the web apps as services, the user has to build a docker image manually.
+
+> [!IMPORTANT]
+>
+> Recurring changes might be made by the team or from community if more
+> improvements can be made so that we are able to build a full-fledged docker
+> image.
+
+```dockerfile
+FROM node:20-bookworm-slim as builder
+
+WORKDIR ./ente
+
+COPY . .
+COPY apps/ .
+
+# Will help default to yarn versoin 1.22.22
+RUN corepack enable
+
+# Endpoint for Ente Server
+ENV NEXT_PUBLIC_ENTE_ENDPOINT=https://your-ente-endpoint.com
+ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your-albums-endpoint.com
+
+RUN yarn cache clean
+RUN yarn install --network-timeout 1000000000
+RUN yarn build:photos && yarn build:accounts && yarn build:auth && yarn build:cast
+
+FROM node:20-bookworm-slim
+
+WORKDIR /app
+
+COPY --from=builder /ente/apps/photos/out /app/photos
+COPY --from=builder /ente/apps/accounts/out /app/accounts
+COPY --from=builder /ente/apps/auth/out /app/auth
+COPY --from=builder /ente/apps/cast/out /app/cast
+
+RUN npm install -g serve
+
+ENV PHOTOS=3000
+EXPOSE ${PHOTOS}
+
+ENV ACCOUNTS=3001
+EXPOSE ${ACCOUNTS}
+
+ENV AUTH=3002
+EXPOSE ${AUTH}
+
+ENV CAST=3003
+EXPOSE ${CAST}
+
+# The albums app does not have navigable pages on it, but the
+# port will be exposed in-order to self up the albums endpoint
+# `apps.public-albums` in museum.yaml configuration file.
+ENV ALBUMS=3004
+EXPOSE ${ALBUMS}
+
+CMD ["sh", "-c", "serve /app/photos -l tcp://0.0.0.0:${PHOTOS} & serve /app/accounts -l tcp://0.0.0.0:${ACCOUNTS} & serve /app/auth -l tcp://0.0.0.0:${AUTH} & serve /app/cast -l tcp://0.0.0.0:${CAST}"]
+```
+
+The above is a multi-stage Dockerfile which creates a production ready static
+output of the 4 apps (Photos, Accounts, Auth and Cast) and serves the static
+content with Caddy.
+
+Looking at 2 different node base-images doing different tasks in the same
+Dockerfile would not make sense, but the Dockerfile is divided into two just to
+improve the build efficiency as building this Dockerfile will arguably take more
+time.
+
+Lets build a Docker image from the above Dockerfile. Copy and paste the above
+Dockerfile contents in the root of your web directory which is inside
+`ente/web`. Execute the below command to create an image from this Dockerfile.
+
+```sh
+# Build the image
+docker build -t : --no-cache --progress plain .
+```
+
+You can always edit the Dockerfile and remove the steps for apps which you do
+not intend to install on your system (like auth or cast) and opt out of those.
+
+Regarding Albums App, take a note that they are not apps with navigable pages,
+if accessed on the web-browser they will simply redirect to ente.web.io.
+
+## compose.yaml
+
+Moving ahead, we need to paste the below contents into the compose.yaml inside
+`ente/server/compose.yaml` under the services section.
+
+```yaml
+ente-web:
+ image: # name of the image you used while building
+ ports:
+ - 3000:3000
+ - 3001:3001
+ - 3002:3002
+ - 3003:3003
+ - 3004:3004
+ environment:
+ - NODE_ENV=development
+ restart: always
+```
+
+Now, we're good to go. All we are left to do now is start the containers.
+
+```sh
+docker compose up -d # --build
+
+# Accessing the logs
+docker compose logs
+```
+
+## Configure App Endpoints
+
+> [!NOTE]
+> Previously, this was dependent on the env variables `NEXT_ENTE_PUBLIC_ACCOUNTS_ENDPOINT`
+> and etc. Please check the below documentation to update your setup configurations
+
+You can configure the web endpoints for the other apps including Accounts, Albums
+Family and Cast in your `museum.yaml` configuration file. Checkout
+[`local.yaml`](https://github.com/ente-io/ente/blob/543411254b2bb55bd00a0e515dcafa12d12d3b35/server/configurations/local.yaml#L76-L89)
+to configure the endpoints. Make sure to setup up your DNS Records accordingly to the
+similar URL's you set up in `museum.yaml`.
+
+Next part is to configure the web server.
+
+# Web server configuration
+
+The last step ahead is configuring reverse_proxy for the ports on which the apps
+are being served (you will have to make changes, if you have cusotmized the
+ports). The web server of choice in this guide is
+[Caddy](https://caddyserver.com) because with caddy you don't have to manually
+configure/setup SSL ceritifcates as caddy will take care of that.
+
+```sh
+photos.yourdomain.com {
+ reverse_proxy http://localhost:3001
+ # for logging
+ log {
+ level error
+ }
+}
+
+auth.yourdomain.com {
+ reverse_proxy http://localhost:3002
+}
+# and so on ...
+```
+
+Next, start the caddy server :).
+
+```sh
+# If caddy service is not enabled
+sudo systemctl enable caddy
+
+sudo systemctl daemon-reload
+sudo systemctl start caddy
+```
+
+## Contributing
+
+Please start a discussion on the Github Repo if you have any suggestions for the
+Dockerfile, You can also share your setups on Github Discussions.
diff --git a/docs/docs/self-hosting/guides/web-app.md b/docs/docs/self-hosting/guides/web-app.md
index 1213eacf8f..015cb7d986 100644
--- a/docs/docs/self-hosting/guides/web-app.md
+++ b/docs/docs/self-hosting/guides/web-app.md
@@ -5,6 +5,12 @@ description:
server
---
+
+> [!WARNING] NOTE
+> This page covers documentation around self-hosting the web app manually. If you
+> want to deploy Ente hassle free, please use the [one line](https://ente.io/blog/self-hosting-quickstart/)
+> command to setup Ente. This guide might be deprecated in the near future.
+
# Web app
The getting started instructions mention using `yarn dev` (which is an alias of
diff --git a/docs/docs/self-hosting/index.md b/docs/docs/self-hosting/index.md
index bb0396d4a3..c0eef22f2c 100644
--- a/docs/docs/self-hosting/index.md
+++ b/docs/docs/self-hosting/index.md
@@ -10,90 +10,32 @@ the same code we use for our own cloud service.
> [!TIP]
>
-> To get some context, you might find our
-> [blog post](https://ente.io/blog/open-sourcing-our-server/) announcing the
-> open sourcing of our server useful.
+> You might find our [blog post](https://ente.io/blog/open-sourcing-our-server/)
+> announcing the open sourcing of our server useful.
-## Getting started - Quickstart
+## System requirements
-Install [Docker](https://www.docker.com). Then, paste the following command in a
-your terminal:
+The server has minimal resource requirements, running as a lightweight Go
+binary. It performs well on small cloud instances, old laptops, and even
+[low-end embedded devices](https://github.com/ente-io/ente/discussions/594).
+
+## Getting started
+
+Run this command on your terminal to setup Ente.
```sh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ente-io/ente/main/server/quickstart.sh)"
```
-> [!TIP]
->
-> For more details about what this does, see [the quickstart
-> README](https://github.com/ente-io/ente/blob/main/server/docs/quickstart.md).
+The above `curl` command pulls the Docker image, creates a directory `my-ente`
+in the current working directory and starts all containers required to run Ente.
-That's about it. If you open http://localhost:3000, you will be able to create
-an account on a Ente Photos web app running on your machine, and this web app
-will be connecting to the server running on your local machine at
-`localhost:8080`. The verification code will be shown in the server logs.
+
-For the mobile or desktop apps, you don't even need to build, and can install
-normal Ente apps and configure them to use your
-[custom self-hosted server](guides/custom-server/).
+
-## Getting started - From source
+## Queries?
-The quickstart method above uses pre-built images. Alternatively, if you want to
-build the self hosted server images from source, you can use the steps in this
-section.
-
-#### Installing Docker
-
-Refer to
-[How to install Docker from the APT repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
-for detailed instructions.
-
-#### Start the server
-
-```sh
-git clone https://github.com/ente-io/ente
-cd ente/server
-docker compose up --build
-```
-
-Install the necessary dependencies for running the web client
-
-```sh
-# installing npm and yarn
-
-sudo apt update
-sudo apt install nodejs npm
-sudo npm install -g yarn // to install yarn globally
-```
-
-Then in a separate terminal, you can run (e.g) the web client
-
-```sh
-cd ente/web
-yarn install
-NEXT_PUBLIC_ENTE_ENDPOINT=http://localhost:8080 yarn dev
-```
-
-> If you want to build the mobile apps from source, see the instructions
-> [here](guides/mobile-build).
-
-## Next steps
-
-- More details about the server are in its
- [README](https://github.com/ente-io/ente/tree/main/server#readme)
-
-- More details about running the server (with or without Docker) are in
- [RUNNING](https://github.com/ente-io/ente/blob/main/server/RUNNING.md)
-
-- If you have questions around self-hosting that are not answered in any of the
- existing documentation, you can ask in our
- [GitHub Discussions](https://github.com/ente-io/ente/discussions). **Please
- remember to search first if the query has been already asked and answered.**
-
-## Contributing!
-
-One particular way in which you can help is by adding new [guides](guides/) on
-this help site. The documentation is written in Markdown and adding new pages is
-[easy](https://github.com/ente-io/ente/tree/main/docs#readme). Editing existing
-pages is even easier: at the bottom of each page is an _Edit this page_ link.
+If you need support, please ask on our community
+[Discord](https://ente.io/discord) or start a discussion on
+[GitHub](https://github.com/ente-io/ente/discussions/).
diff --git a/docs/docs/self-hosting/museum.md b/docs/docs/self-hosting/museum.md
new file mode 100644
index 0000000000..4d1da34b0a
--- /dev/null
+++ b/docs/docs/self-hosting/museum.md
@@ -0,0 +1,69 @@
+---
+title: Configuring your server
+description: Guide to writing a museum.yaml
+---
+
+# Configuring your server
+
+Ente's monolithic server is called **museum**.
+
+`museum.yaml` is a YAML configuration file used to configure museum. By default,
+[`local.yaml`](https://github.com/ente-io/ente/tree/main/server/configurations/local.yaml)
+is provided, but its settings are overridden with those from `museum.yaml`.
+
+If you used our quickstart script, your `my-ente` directory will include a
+`museum.yaml` file with preset configurations for encryption keys, secrets,
+PostgreSQL and MinIO.
+
+> [!TIP]
+>
+> Always do `docker compose down` inside your `my-ente` directory. If you've
+> made changes to `museum.yaml`, restart the containers with `docker compose up
+> -d ` to see your changes in action.
+
+## S3 buckets
+
+The `s3` section within `museum.yaml` is by default configured to use local
+MinIO buckets.
+
+If you wish to use an external S3 provider, you can edit the configuration with
+your provider's credentials, and set `are_local_buckets` to `false`.
+
+Check out [Configuring S3](/self-hosting/guides/configuring-s3.md) to understand
+more about configuring S3 buckets.
+
+MinIO uses the port `3200` for API Endpoints and their web app runs over
+`:3201`. You can login to MinIO Web Console by opening `localhost:3201` in your browser.
+
+If you face any issues related to uploads then checkout [Troubleshooting bucket
+CORS](/self-hosting/troubleshooting/bucket-cors) and [Frequently encountered S3
+errors](/self-hosting/guides/configuring-s3#frequently-encountered-errors).
+
+## Web apps
+
+The web apps for Ente Photos is divided into multiple sub-apps like albums,
+cast, auth, etc. These endpoints are configurable in the museum.yaml under the
+`apps.*` section.
+
+For example,
+
+```yaml
+apps:
+ public-albums: albums.myente.xyz
+ cast: cast.myente.xyz
+ accounts: accounts.myente.xyz
+ family: family.myente.xyz
+```
+
+By default, all the values redirect to our publicly hosted production services.
+After you are done with filling the values, restart museum and the app will
+start utilizing those endpoints instead of Ente's production instances.
+
+Once you have configured all the necessary endpoints, `cd` into `my-ente` and
+stop all the Docker containers with `docker compose down` and restart them with
+`docker compose up -d`.
+
+Similarly, you can use the default
+[`local.yaml`](https://github.com/ente-io/ente/tree/main/server/configurations/local.yaml)
+as a reference for building a functioning `museum.yaml` for many other
+functionalities like SMTP, Discord notifications, Hardcoded-OTTs, etc.
diff --git a/docs/docs/self-hosting/reverse-proxy.md b/docs/docs/self-hosting/reverse-proxy.md
new file mode 100644
index 0000000000..7ef79ac412
--- /dev/null
+++ b/docs/docs/self-hosting/reverse-proxy.md
@@ -0,0 +1,49 @@
+---
+Title: Configuring Reverse Proxy
+Description: configuring reverse proxy for Museum and other endpoints
+---
+
+# Reverse proxy
+
+Ente's server (museum) runs on port `:8080`, web app on `:3000` and the other
+apps from ports `3001-3004`.
+
+We highly recommend using HTTPS for Museum (`8080`). For security reasons museum
+will not accept incoming HTTP traffic.
+
+Head over to your DNS management dashboard and setup the appropriate records for
+the endpoints. Mostly, `A` or `AAAA` records targeting towards your server's IP
+address should be sufficient. The rest of the work will be done by the web
+server on your machine.
+
+
+
+### Caddy
+
+Setting up a reverse proxy with Caddy is easy and straightforward.
+
+Firstly, install Caddy on your server.
+
+```sh
+sudo apt install caddy
+```
+
+After the installation is complete, a `Caddyfile` is created on the path
+`/etc/caddy/`. This file is used to configure reverse proxies among other
+things.
+
+```yaml
+# Caddyfile - myente.xyz is just an example.
+api.myente.xyz {
+ reverse_proxy http://localhost:8080
+}
+ente.myente.xyz {
+ reverse_proxy http://localhost:3000
+}
+#...and so on for other endpoints
+```
+
+After a hard-reload, the Ente Photos web app should be up on https://ente.myente.xyz.
+
+If you are using a different tool for reverse proxy (like nginx), please check
+out their documentation.
diff --git a/docs/docs/self-hosting/troubleshooting/bucket-cors.md b/docs/docs/self-hosting/troubleshooting/bucket-cors.md
new file mode 100644
index 0000000000..19c1dbff47
--- /dev/null
+++ b/docs/docs/self-hosting/troubleshooting/bucket-cors.md
@@ -0,0 +1,62 @@
+---
+title: Bucket CORS
+description: Troubleshooting CORS issues with S3 Buckets
+---
+
+# Fix potential CORS issues with your Buckets
+
+## For AWS S3
+
+If you cannot upload a photo due to a CORS issue, you need to fix the CORS
+configuration of your bucket.
+
+Create a `cors.json` file with the following content:
+
+```json
+{
+ "CORSRules": [
+ {
+ "AllowedOrigins": ["*"],
+ "AllowedHeaders": ["*"],
+ "AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"],
+ "MaxAgeSeconds": 3000,
+ "ExposeHeaders": ["Etag"]
+ }
+ ]
+}
+```
+
+You may want to change the `AllowedOrigins` to a more restrictive value.
+
+If you are using AWS for S3, you can execute the below command to get rid of
+CORS. Make sure to enter the right path for the `cors.json` file.
+
+```bash
+aws s3api put-bucket-cors --bucket YOUR_S3_BUCKET --cors-configuration /path/to/cors.json
+```
+
+## For Self-hosted Minio Instance
+
+> Important: MinIO does not take JSON CORS file as the input, instead you will
+> have to build a CORS.xml file or just convert the above `cors.json` to XML.
+
+A minor requirement here is the tool `mc` for managing buckets via command line
+interface. Checkout the `mc set alias` document to configure alias for your
+instance and bucket. After this you will be prompted for your AccessKey and
+Secret, which is your username and password, go ahead and enter that.
+
+```sh
+mc cors set // api cors_allow_origin="*"
+```
+
+You can create also `.csv` file and dump the list of origins you would like to
+allow and replace the `*` with `path` to the CSV file.
+
+Now, uploads should be working fine.
\ No newline at end of file
diff --git a/docs/docs/self-hosting/troubleshooting/docker.md b/docs/docs/self-hosting/troubleshooting/docker.md
index 905ac709e4..6c80070b34 100644
--- a/docs/docs/self-hosting/troubleshooting/docker.md
+++ b/docs/docs/self-hosting/troubleshooting/docker.md
@@ -70,3 +70,61 @@ services.postgres.healthcheck Additional property start_interval is not allowed
You will need to upgrade your Docker compose version to a newer version that
supports the `start_interval` property on the health check.
+
+## Postgres authentication failed
+
+If you're getting Postgres password authentication failures when starting your
+cluster, then you might be using a stale Docker volume.
+
+In more detail, if you're getting an error of the following form (pasting a full
+example for easier greppability):
+
+```
+museum-1 | panic: pq: password authentication failed for user "pguser"
+museum-1 |
+museum-1 | goroutine 1 [running]:
+museum-1 | main.setupDatabase()
+museum-1 | /etc/ente/cmd/museum/main.go:846 +0x338
+museum-1 | main.main()
+museum-1 | /etc/ente/cmd/museum/main.go:124 +0x44c
+museum-1 exited with code 2
+```
+
+Then the issue is that the password you're using is not the password postgres is
+expecting (duh), and a potential scenario where that can happen is something
+like this:
+
+1. On a machine, you create a new cluster with `quickstart.sh`.
+
+2. Later you delete that folder, but then create another cluster with
+ `quickstart.sh`. Each time `quickstart.sh` runs, it creates new credentials,
+ and then when it tries to spin up the docker compose cluster, use them to
+ connect to the postgres running within.
+
+3. However, you would already have a docker volume from the first run of
+ `quickstart.sh`. Since the folder name is the same in both cases `my-ente`,
+ Docker will reuse the existing volumes (`my-ente_postgres-data`,
+ `my-ente_minio-data`). So your postgres is running off the old credentials,
+ and you're trying to connect to it using the new ones, and the error arises.
+
+The solution is to delete the stale docker volume. **Be careful**, this will
+delete all data in those volumes (any thing you uploaded etc), so first
+understand if this is the exact problem you are facing before deleting those
+volumes.
+
+If you're sure of what you're doing, the volumes can be deleted by
+
+```
+docker volume ls
+```
+
+to list them, and then delete the ones that begin with `my-ente` using
+`docker volume rm`. You can delete all stale volumes by using
+`docker system prune` with the `--volumes` flag, but be _really_ careful,
+that'll delete all volumes (Ente or otherwise) on your machine that are not
+currently in use by a running docker container.
+
+If you're unsure about removing volumes, another alternative is to rename your
+`my-ente` folder. Docker uses the folder name to determine the volume name
+prefix, so giving it a different name will cause Docker to create a volume
+afresh for it.
diff --git a/docs/docs/self-hosting/troubleshooting/misc.md b/docs/docs/self-hosting/troubleshooting/misc.md
new file mode 100644
index 0000000000..65c1e7ffd1
--- /dev/null
+++ b/docs/docs/self-hosting/troubleshooting/misc.md
@@ -0,0 +1,35 @@
+---
+title: General troubleshooting cases
+description: Fixing various errors when trying to self host Ente
+---
+
+## Functionality not working on self hosted
+
+If some specific functionality (e.g. album listing, video playback) does not
+work on your self hosted instance, it is possible that you have set _some_, but
+not _all_ needed CSP headers (by default, CSP is not enabled).
+
+To expand on it - by default, currently the generated build does not enable CSP
+headers. The generated build includes a _headers file that Cloudflare will use
+to set HTTP response headers, but even these do not enable CSP, it is set to a
+report only mode.
+
+However, your web server might be setting some CSP policy. If so, then you will
+need to ensure that all necessary CSP headers are set.
+
+You can see the current
+[_headers](https://github.com/ente-io/ente/blob/main/web/apps/photos/public/_headers)
+file contents to use a template for your CSP policy. The
+`Content-Security-Policy-Report-Only` value will show you the CSP headers in
+"dry run" report-only mode we're setting - you can use that as a template,
+tweaking it as per your setup.
+
+How do you know if this is the problem you're facing? The browser console
+_might_ be giving you errors when you try to open the page and perform the
+corresponding function.
+
+> Refused to load https://subdomain.example.org/... because it does not appear
+> in the script-src directive of the Content Security Policy.
+
+This is not guaranteed, each browsers handles CSP errors differently, and some
+may silently swallow it.
diff --git a/docs/docs/self-hosting/troubleshooting/uploads.md b/docs/docs/self-hosting/troubleshooting/uploads.md
index 435a5e93c6..6bfef9f923 100644
--- a/docs/docs/self-hosting/troubleshooting/uploads.md
+++ b/docs/docs/self-hosting/troubleshooting/uploads.md
@@ -1,13 +1,54 @@
---
-title: Uploads failing
+title: Uploads
description: Fixing upload errors when trying to self host Ente
---
-# Uploads failing
+# Troubleshooting upload failures
-If uploads to your minio are failing, you need to ensure that you've configured
-the S3 bucket `endpoint` in `credentials.yaml` (or `museum.yaml`) to, say,
-`yourserverip:3200`. This can be any host or port, it just need to be a value
-that is reachable from both your client and from museum.
+Here are some errors our community members frequently encountered with the
+context and potential fixes.
-For more details, see [configuring-s3](/self-hosting/guides/configuring-s3).
+Fundamentally in most situations, the problem is because of minor mistakes or
+misconfiguration. Please make sure to reverse proxy museum and MinIO API
+endpoint to a domain and check your S3 credentials and whole configuration
+file for any minor misconfigurations.
+
+It is also suggested that the user setups bucket CORS on MinIO or any external
+S3 service provider they are connecting to. To setup bucket CORS, please [read
+this](/self-hosting/troubleshooting/bucket-cors).
+
+## What is S3 and how is it incorporated in Ente ?
+
+S3 is an cloud storage protocol made by Amazon (specifically AWS). S3 is designed to store
+files and data as objects inside Buckets and it is mostly used for Online
+Backups and storing different types of files.
+
+Ente's Docker setup is shipped with [MinIO](https://min.io/) as its default S3 provider.
+MinIO supports the Amazon S3 protocol and leverages your disk storage to
+dump all the uploaded files as encrypted object blobs.
+
+## 403 Forbidden
+
+If museum is able to make a network connection to your S3 bucket but
+uploads are still failing, it could be a credentials or permissions issue.
+
+A telltale sign of this is that in the museum logs you can see `403 Forbidden`
+errors about it not able to find the size of a file even though the
+corresponding object exists in the S3 bucket.
+
+This could be because
+
+1. The bucket CORS rules do not allow museum to access these objects. For
+ uploading files from the browser, you will need to set `allowedOrigins` to
+ `*`, and allow the `X-Auth-Token`, `X-Client-Package` headers configuration
+ too. [Here is an example of a working
+ configuration](https://github.com/ente-io/ente/discussions/1764#discussioncomment-9478204).
+
+2. The credentials are not being picked up (you might be setting the correct
+ credentials, but not in the place where museum reads them from).
+
+## Mismatch in file size
+
+The "Mismatch in file size" error mostly occurs in a situation where the client is re-uploading a file which is already in the bucket with a different
+file size. The reason for re-upload could be anything including network issue,
+sudden killing of app before the upload is complete and etc.
diff --git a/infra/staff/src/App.tsx b/infra/staff/src/App.tsx
index 2a754f3bd0..a1bf14d6c8 100644
--- a/infra/staff/src/App.tsx
+++ b/infra/staff/src/App.tsx
@@ -10,10 +10,10 @@ import "./App.css";
import FamilyTableComponent from "./components/FamilyComponentTable";
import StorageBonusTableComponent from "./components/StorageBonusTableComponent";
import TokensTableComponent from "./components/TokenTableComponent";
-import type { UserData } from "./components/UserComponent";
import UserComponent from "./components/UserComponent";
import duckieimage from "./components/duckie.png";
import { apiOrigin } from "./services/support";
+import type { UserData, UserResponse } from "./types";
export let email = "";
export let token = "";
@@ -29,38 +29,6 @@ export const setToken = (newToken: string) => {
export const getEmail = () => email;
export const getToken = () => token;
-interface User {
- ID: string;
- email: string;
- creationTime: number;
-}
-
-interface Subscription {
- productID: string;
- paymentProvider: string;
- expiryTime: number;
- storage: number;
-}
-
-interface Security {
- isEmailMFAEnabled: boolean;
- isTwoFactorEnabled: boolean;
- passkeys: string;
- passkeyCount: number;
- canDisableEmailMFA: boolean;
-}
-
-interface UserResponse {
- user: User;
- subscription: Subscription;
- authCodes?: number;
- details?: {
- usage?: number;
- storageBonus?: number;
- profileData: Security;
- };
-}
-
const App: React.FC = () => {
const [localEmail, setLocalEmail] = useState("");
const [localToken, setLocalToken] = useState("");
@@ -139,7 +107,7 @@ const App: React.FC = () => {
console.log("API Response:", userDataResponse);
const extractedUserData: UserData = {
- User: {
+ user: {
"User ID": userDataResponse.user.ID || "None",
Email: userDataResponse.user.email || "None",
"Creation time":
@@ -147,7 +115,7 @@ const App: React.FC = () => {
userDataResponse.user.creationTime / 1000,
).toLocaleString() || "None",
},
- Storage: {
+ storage: {
Total: userDataResponse.subscription.storage
? userDataResponse.subscription.storage >= 1024 ** 3
? `${(userDataResponse.subscription.storage / 1024 ** 3).toFixed(2)} GB`
@@ -166,7 +134,7 @@ const App: React.FC = () => {
: `${(userDataResponse.details.storageBonus / 1024 ** 2).toFixed(2)} MB`
: "None",
},
- Subscription: {
+ subscription: {
"Product ID":
userDataResponse.subscription.productID || "None",
Provider:
@@ -176,7 +144,7 @@ const App: React.FC = () => {
userDataResponse.subscription.expiryTime / 1000,
).toLocaleString() || "None",
},
- Security: {
+ security: {
"Email MFA": userDataResponse.details?.profileData
.isEmailMFAEnabled
? "Enabled"
diff --git a/infra/staff/src/components/ChangeEmail.tsx b/infra/staff/src/components/ChangeEmail.tsx
index 26407af50e..d3824babc4 100644
--- a/infra/staff/src/components/ChangeEmail.tsx
+++ b/infra/staff/src/components/ChangeEmail.tsx
@@ -10,10 +10,10 @@ import {
import React, { useEffect, useState } from "react";
import { getEmail, getToken } from "../App";
import { apiOrigin } from "../services/support";
-interface ErrorResponse {
- message: string;
-}
+import type { ErrorResponse } from "../types";
+// The below interfaces will only be used in this file
+// hence not including them into a sub-merged types file
interface ChangeEmailProps {
open: boolean;
onClose: () => void;
diff --git a/infra/staff/src/components/CloseFamily.tsx b/infra/staff/src/components/CloseFamily.tsx
index 145c11b505..5ab71bd474 100644
--- a/infra/staff/src/components/CloseFamily.tsx
+++ b/infra/staff/src/components/CloseFamily.tsx
@@ -10,14 +10,7 @@ import {
import React, { useState } from "react";
import { getEmail, getToken } from "../App"; // Import getEmail and getToken functions
import { apiOrigin } from "../services/support";
-
-interface UserData {
- subscription?: {
- userID: string;
- // Add other properties as per your API response structure
- };
- // Add other properties as per your API response structure
-}
+import type { UserData } from "../types";
interface CloseFamilyProps {
open: boolean;
diff --git a/infra/staff/src/components/Disable2FA.tsx b/infra/staff/src/components/Disable2FA.tsx
index 29a3a6cd5a..62166aef24 100644
--- a/infra/staff/src/components/Disable2FA.tsx
+++ b/infra/staff/src/components/Disable2FA.tsx
@@ -10,14 +10,7 @@ import {
import React, { useState } from "react";
import { getEmail, getToken } from "../App"; // Import getEmail and getToken functions
import { apiOrigin } from "../services/support";
-
-interface UserData {
- subscription?: {
- userID: string;
- // Add other properties as per your API response structure
- };
- // Add other properties as per your API response structure
-}
+import type { UserData } from "../types";
interface Disable2FAProps {
open: boolean;
diff --git a/infra/staff/src/components/DisablePasskeys.tsx b/infra/staff/src/components/DisablePasskeys.tsx
index 824b2f2f87..a2757a371d 100644
--- a/infra/staff/src/components/DisablePasskeys.tsx
+++ b/infra/staff/src/components/DisablePasskeys.tsx
@@ -10,20 +10,7 @@ import {
import React, { useState } from "react";
import { getEmail, getToken } from "../App"; // Import getEmail and getToken functions
import { apiOrigin } from "../services/support";
-
-interface UserData {
- subscription?: {
- userID: string;
- // Add other properties as per your API response structure
- };
- // Add other properties as per your API response structure
-}
-
-interface DisablePasskeysProps {
- open: boolean;
- handleClose: () => void;
- handleDisablePasskeys: () => void; // Callback to handle disabling passkeys
-}
+import type { DisablePasskeysProps, UserData } from "../types";
const DisablePasskeys: React.FC = ({
open,
diff --git a/infra/staff/src/components/FamilyComponentTable.tsx b/infra/staff/src/components/FamilyComponentTable.tsx
index 2171b3aeda..859960483e 100644
--- a/infra/staff/src/components/FamilyComponentTable.tsx
+++ b/infra/staff/src/components/FamilyComponentTable.tsx
@@ -13,23 +13,10 @@ import * as React from "react";
import { useEffect, useState } from "react";
import { getEmail, getToken } from "../App";
import { apiOrigin } from "../services/support";
+import type { FamilyMember, UserData } from "../types";
+import { formatUsageToGB } from "../utils/";
import CloseFamily from "./CloseFamily";
-interface FamilyMember {
- id: string;
- email: string;
- status: string;
- usage: number;
-}
-
-interface UserData {
- details: {
- familyData: {
- members: FamilyMember[];
- };
- };
-}
-
const FamilyTableComponent: React.FC = () => {
const [familyMembers, setFamilyMembers] = useState([]);
const [closeFamilyOpen, setCloseFamilyOpen] = useState(false);
@@ -54,7 +41,7 @@ const FamilyTableComponent: React.FC = () => {
}
const userData = (await response.json()) as UserData; // Typecast to UserData interface
const members: FamilyMember[] =
- userData.details.familyData.members;
+ userData.details?.familyData.members ?? [];
setFamilyMembers(members);
} catch (error) {
console.error("Error fetching family data:", error);
@@ -69,11 +56,6 @@ const FamilyTableComponent: React.FC = () => {
);
}, []);
- const formatUsageToGB = (usage: number): string => {
- const usageInGB = (usage / (1024 * 1024 * 1024)).toFixed(2);
- return `${usageInGB} GB`;
- };
-
const handleOpenCloseFamily = () => {
setCloseFamilyOpen(true);
};
diff --git a/infra/staff/src/components/ToggleEmailMFA.tsx b/infra/staff/src/components/ToggleEmailMFA.tsx
index 0e0a469a73..82e3f28015 100644
--- a/infra/staff/src/components/ToggleEmailMFA.tsx
+++ b/infra/staff/src/components/ToggleEmailMFA.tsx
@@ -10,14 +10,7 @@ import {
import React, { useState } from "react";
import { getEmail, getToken } from "../App"; // Import getEmail and getToken functions
import { apiOrigin } from "../services/support";
-
-interface UserData {
- subscription?: {
- userID: string;
- // Add other properties as per your API response structure
- };
- // Add other properties as per your API response structure
-}
+import type { UserData } from "../types";
interface ToggleEmailMFAProps {
open: boolean;
diff --git a/infra/staff/src/components/UpdateSubscription.tsx b/infra/staff/src/components/UpdateSubscription.tsx
index b1bf7dfea1..1b1806b59a 100644
--- a/infra/staff/src/components/UpdateSubscription.tsx
+++ b/infra/staff/src/components/UpdateSubscription.tsx
@@ -62,8 +62,8 @@ const UpdateSubscription: React.FC = ({
expiryTime: "",
userId: "",
attributes: {
- "customerID": "",
- "stripeAccountCountry": ""
+ customerID: "",
+ stripeAccountCountry: "",
},
});
@@ -108,9 +108,13 @@ const UpdateSubscription: React.FC = ({
expiryTime: expiryTime,
userId: userDataResponse.subscription.userID || "",
attributes: {
- customerID: userDataResponse.subscription.attributes.customerID || "",
- stripeAccountCountry: userDataResponse.subscription.attributes.stripeAccountCountry || ""
- }
+ customerID:
+ userDataResponse.subscription.attributes
+ .customerID || "",
+ stripeAccountCountry:
+ userDataResponse.subscription.attributes
+ .stripeAccountCountry || "",
+ },
});
} catch (error) {
console.error("Error fetching data:", error);
@@ -174,8 +178,9 @@ const UpdateSubscription: React.FC = ({
transactionId: values.transactionId,
attributes: {
customerID: values.attributes.customerID,
- stripeAccountCountry: values.attributes.stripeAccountCountry
- }
+ stripeAccountCountry:
+ values.attributes.stripeAccountCountry,
+ },
};
try {
diff --git a/infra/staff/src/components/UserComponent.tsx b/infra/staff/src/components/UserComponent.tsx
index bc93101960..be2b1afb11 100644
--- a/infra/staff/src/components/UserComponent.tsx
+++ b/infra/staff/src/components/UserComponent.tsx
@@ -13,6 +13,7 @@ import TableContainer from "@mui/material/TableContainer";
import TableRow from "@mui/material/TableRow";
import Typography from "@mui/material/Typography";
import * as React from "react";
+import type { UserComponentProps } from "../types";
import ChangeEmail from "./ChangeEmail";
import DeleteAccount from "./DeleteAccont";
import Disable2FA from "./Disable2FA";
@@ -20,17 +21,6 @@ import DisablePasskeys from "./DisablePasskeys";
import ToggleEmailMFA from "./ToggleEmailMFA";
import UpdateSubscription from "./UpdateSubscription";
-export interface UserData {
- User: Record;
- Storage: Record;
- Subscription: Record;
- Security: Record;
-}
-
-interface UserComponentProps {
- userData: UserData | null;
-}
-
const UserComponent: React.FC = ({ userData }) => {
const [deleteAccountOpen, setDeleteAccountOpen] = React.useState(false);
const [email2FAEnabled, setEmail2FAEnabled] = React.useState(false);
@@ -44,10 +34,10 @@ const UserComponent: React.FC = ({ userData }) => {
const [disablePasskeysOpen, setDisablePasskeysOpen] = React.useState(false);
React.useEffect(() => {
- setTwoFactorEnabled(userData?.Security["Two factor 2FA"] === "Enabled");
- setEmail2FAEnabled(userData?.Security["Email MFA"] === "Enabled");
+ setTwoFactorEnabled(userData?.security["Two factor 2FA"] === "Enabled");
+ setEmail2FAEnabled(userData?.security["Email MFA"] === "Enabled");
setCanDisableEmailMFA(
- userData?.Security["Can Disable EmailMFA"] === "Yes",
+ userData?.security["Can Disable EmailMFA"] === "Yes",
);
}, [userData]);
@@ -148,14 +138,10 @@ const DataTable: React.FC = ({
minHeight: 300,
display: "flex",
flexDirection: "column",
- marginBottom: "20px",
height: "100%",
width: "100%",
- padding: "13px",
+ padding: "10px",
overflowX: "hidden",
- "&:not(:last-child)": {
- marginBottom: "40px",
- },
}}
>
= ({
width: "100%",
}}
>
- {title}
+ {title.charAt(0).toUpperCase() + title.slice(1)}
- {title === "User" && (
+ {title === "user" && (
= ({
)}
- {title === "Subscription" && (
+ {title === "subscription" && (
;
+ storage: Record;
+ subscription?: Record;
+ security: Record;
+ details?: {
+ familyData: {
+ members: FamilyMember[];
+ };
+ };
+}
+
+export interface UserComponentProps {
+ userData: UserData | null;
+}
+
+// Error Response Interface
+export interface ErrorResponse {
+ message: string;
+}
+
+// Types related to Subscriptions
+export interface Subscription {
+ productID: string;
+ paymentProvider: string;
+ expiryTime: number;
+ storage: number;
+}
+
+export interface Security {
+ isEmailMFAEnabled: boolean;
+ isTwoFactorEnabled: boolean;
+ passkeys: string;
+ passkeyCount: number;
+ canDisableEmailMFA: boolean;
+}
+
+// Types related Family
+export interface FamilyMember {
+ id: string;
+ email: string;
+ status: string;
+ usage: number;
+}
+
+// Types related to passkeys
+export interface DisablePasskeysProps {
+ open: boolean;
+ handleClose: () => void;
+ handleDisablePasskeys: () => void; // Callback to handle disabling passkeys
+}
diff --git a/infra/staff/src/utils/index.ts b/infra/staff/src/utils/index.ts
new file mode 100644
index 0000000000..46a4bc3fcf
--- /dev/null
+++ b/infra/staff/src/utils/index.ts
@@ -0,0 +1,5 @@
+// Common utilities
+export function formatUsageToGB(usage: number): string {
+ const usageInGB = (usage / (1024 * 1024 * 1024)).toFixed(2);
+ return `${usageInGB} GB`;
+}
diff --git a/infra/staff/src/utils/strings.ts b/infra/staff/src/utils/strings.ts
deleted file mode 100644
index 39b22fcd76..0000000000
--- a/infra/staff/src/utils/strings.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * User facing strings in the app.
- *
- * By keeping them separate, we make our lives easier if/when we need to
- * localize the corresponding pages. Right now, these are just the values in the
- * default language, English.
- */
-const S = {
- hello: "Hello Ente!",
- error_generic: "Oops, something went wrong.",
-};
-
-export default S;
diff --git a/mobile/android/build.gradle b/mobile/android/build.gradle
index 35258232be..5f335a8ac0 100644
--- a/mobile/android/build.gradle
+++ b/mobile/android/build.gradle
@@ -1,5 +1,6 @@
ext {
- appCompatVersion = '1.1.0' // for background_fetch
+ compileSdkVersion = 35
+ targetSdkVersion = 35
}
allprojects {
@@ -11,6 +12,9 @@ allprojects {
maven {
url "${project(':background_fetch').projectDir}/libs"
}
+ maven {
+ url "${project(':ffmpeg_kit_flutter').projectDir}/libs"
+ }
}
}
diff --git a/mobile/fastlane/metadata/android/ar/full_description.txt b/mobile/fastlane/metadata/android/ar/full_description.txt
index 9ba4fe3143..4c64b17c6f 100644
--- a/mobile/fastlane/metadata/android/ar/full_description.txt
+++ b/mobile/fastlane/metadata/android/ar/full_description.txt
@@ -1,36 +1,36 @@
-ente is a simple app to backup and share your photos and videos.
+Ente هو تطبيق بسيط للنسخ الاحتياطي لصورك ومقاطع الفيديو الخاصة بك ومشاركتها.
-If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+إذا كنت تبحث عن بديل لتطبيق صور جوجل (Google Photos) يراعي خصوصيتك، فقد وصلت إلى المكان المناسب. مع Ente، يتم تخزين ذكرياتك بتشفير كامل من طرف إلى طرف (e2ee)، مما يعني أنك وحدك من يستطيع الاطلاع عليها. هذا يعني أنك وحدك من يستطيع رؤيتها.
-We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
+لدينا تطبيقات مفتوحة المصدر لمنصات أندرويد، وآي أو إس، والويب، وسطح المكتب، وستتم مزامنة صورك بسلاسة بينها جميعًا بطريقة مشفرة بالكامل من طرف إلى طرف (e2ee).
-ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
+يجعل من السهل أيضا مشاركة الألبومات مع أحبائك، حتى وإن لم يكونوا على ente. يمكنك مشاركة روابط عامة يمكن لأي شخص عرضها، حيث يستطيعون مشاهدة ألبومك والمساهمة بإضافة الصور إليه، حتى بدون الحاجة إلى حساب أو تطبيق.
-Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+تُكرّر بياناتك المشفرة في 3 مواقع مختلفة، بما في ذلك ملجأ محصن في باريس. نحن نأخذ مسألة الحفاظ على ذكرياتك للأجيال القادمة بجدية ونسهّل عليك ضمان بقاء ذكرياتك حية بعد رحيلك.
-We are here to make the safest photos app ever, come join our journey!
+مهمتنا هي تطوير تطبيق الصور الأكثر أمانًا على الإطلاق، ندعوك للانضمام إلينا في هذه الرحلة!
-FEATURES
-- Original quality backups, because every pixel is important
-- Family plans, so you can share storage with your family
-- Collaborative albums, so you can pool together photos after a trip
-- Shared folders, in case you want your partner to enjoy your "Camera" clicks
-- Album links, that can be protected with a password
-- Ability to free up space, by removing files that have been safely backed up
-- Human support, because you're worth it
-- Descriptions, so you can caption your memories and find them easily
-- Image editor, to add finishing touches
-- Favorite, hide and relive your memories, for they are precious
-- One-click import from Google, Apple, your hard drive and more
-- Dark theme, because your photos look good in it
-- 2FA, 3FA, biometric auth
-- and a LOT more!
+الميزات
+- نسخ احتياطية بالجودة الأصلية، لأن كل بكسل له قيمة.
+- خطط عائلية، لتتمكن من مشاركة مساحة التخزين مع عائلتك.
+- ألبومات تعاونية، لتتمكنوا من جمع صوركم المشتركة بعد رحلة ما.
+- مجلدات مشتركة، إذا كنت ترغب في أن يستمتع شريكك بصور "الكاميرا" الخاصة بك.
+- روابط للألبومات، يمكن حمايتها بكلمة مرور.
+- إمكانية تحرير مساحة على جهازك، عن طريق إزالة الملفات التي تم نسخها احتياطيًا بأمان.
+- دعم فني يقدمه أفراد حقيقيون، لأنك تستحق الاهتمام.
+- إضافة أوصاف، لتتمكن من تعليق ذكرياتك والعثور عليها بسهولة.
+- محرر صور، لإضفاء لمساتك النهائية.
+- إضافة للمفضلة، إخفاء، واستعادة ذكرياتك، فهي لا تُقدّر بثمن.
+- استيراد بنقرة واحدة من جوجل، وآبل، والقرص الصلب الخاص بك، وغيرها.
+- الوضع الداكن، لأن صورك تظهر بشكلٍ أفضل فيه
+- مصادقة ثنائية (2FA)، مصادقة ثلاثية (3FA)، مصادقة بيومترية
+- والكثير غيرها!
-PERMISSIONS
-ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
+أذونات
+يطلب Ente أذونات معينة للعمل كمزود لتخزين الصور، يمكن مراجعة تفاصيلها هنا: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
-PRICING
-We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+التسعير
+نحن لا نوفر خططًا مجانية دائمة، لأنه من المهم بالنسبة لنا أن نضمن استدامة الخدمة وصمودها أمام اختبار الزمن. بدلاً من ذلك، نقدم خططًا بأسعار معقولة يمكنك مشاركتها بحرية مع عائلتك. يمكنك العثور على مزيد من المعلومات على ente.io.
-SUPPORT
-We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
+الدعم
+نحن نفخر بتقديم الدعم البشري. إذا كنت من عملائنا المشتركين، يمكنك التواصل عبر team@ente.io وتوقع ردًا من فريقنا في غضون 24 ساعة.
diff --git a/mobile/fastlane/metadata/android/cs/full_description.txt b/mobile/fastlane/metadata/android/cs/full_description.txt
index 9ba4fe3143..c6300bd1a3 100644
--- a/mobile/fastlane/metadata/android/cs/full_description.txt
+++ b/mobile/fastlane/metadata/android/cs/full_description.txt
@@ -26,11 +26,11 @@ FEATURES
- 2FA, 3FA, biometric auth
- and a LOT more!
-PERMISSIONS
+OPRÁVNĚNÍ
ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
-SUPPORT
+PODPORA
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
diff --git a/mobile/fastlane/metadata/android/eu/full_description.txt b/mobile/fastlane/metadata/android/eu/full_description.txt
new file mode 100644
index 0000000000..9ba4fe3143
--- /dev/null
+++ b/mobile/fastlane/metadata/android/eu/full_description.txt
@@ -0,0 +1,36 @@
+ente is a simple app to backup and share your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
+
+ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
+
+Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Collaborative albums, so you can pool together photos after a trip
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password
+- Ability to free up space, by removing files that have been safely backed up
+- Human support, because you're worth it
+- Descriptions, so you can caption your memories and find them easily
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from Google, Apple, your hard drive and more
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+PERMISSIONS
+ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
+
+PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
diff --git a/mobile/fastlane/metadata/android/eu/short_description.txt b/mobile/fastlane/metadata/android/eu/short_description.txt
new file mode 100644
index 0000000000..7a5fe973db
--- /dev/null
+++ b/mobile/fastlane/metadata/android/eu/short_description.txt
@@ -0,0 +1 @@
+ente is an end-to-end encrypted photo storage app
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/eu/title.txt b/mobile/fastlane/metadata/android/eu/title.txt
new file mode 100644
index 0000000000..3a4fed48fe
--- /dev/null
+++ b/mobile/fastlane/metadata/android/eu/title.txt
@@ -0,0 +1 @@
+ente - encrypted photo storage
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/or/full_description.txt b/mobile/fastlane/metadata/android/or/full_description.txt
new file mode 100644
index 0000000000..9ba4fe3143
--- /dev/null
+++ b/mobile/fastlane/metadata/android/or/full_description.txt
@@ -0,0 +1,36 @@
+ente is a simple app to backup and share your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
+
+ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
+
+Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Collaborative albums, so you can pool together photos after a trip
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password
+- Ability to free up space, by removing files that have been safely backed up
+- Human support, because you're worth it
+- Descriptions, so you can caption your memories and find them easily
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from Google, Apple, your hard drive and more
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+PERMISSIONS
+ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
+
+PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
diff --git a/mobile/fastlane/metadata/android/or/short_description.txt b/mobile/fastlane/metadata/android/or/short_description.txt
new file mode 100644
index 0000000000..7a5fe973db
--- /dev/null
+++ b/mobile/fastlane/metadata/android/or/short_description.txt
@@ -0,0 +1 @@
+ente is an end-to-end encrypted photo storage app
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/or/title.txt b/mobile/fastlane/metadata/android/or/title.txt
new file mode 100644
index 0000000000..3a4fed48fe
--- /dev/null
+++ b/mobile/fastlane/metadata/android/or/title.txt
@@ -0,0 +1 @@
+ente - encrypted photo storage
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/pt_BR/full_description.txt b/mobile/fastlane/metadata/android/pt_BR/full_description.txt
new file mode 100644
index 0000000000..08da532506
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_BR/full_description.txt
@@ -0,0 +1,36 @@
+ente é um aplicativo simples para fazer cópia de segurança e compartilhar suas fotos e vídeos.
+
+Se você está procurando por uma alternativa ao Google Fotos focado em privacidade, você veio ao lugar certo. Com ente, eles são armazenados com criptografia de ponta a ponta (e2ee). Isso significa que só você pode vê-los.
+
+Nós temos aplicativos de código aberto em todas as plataformas, Android, iOS, web e desktop, e suas fotos vão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee).
+
+ente também torna simples compartilhar seus álbuns com seus entes queridos, mesmo que eles não estejam no ente. Você pode compartilhar links para o público, em que eles podem visualizar seu álbum e colaborar adicionando fotos a ele, mesmo sem uma conta ou aplicativo.
+
+Seus dados criptografados são replicados em 3 locais diferentes, incluindo um abrigo avançado em Paris. Nós levamos a sério a nossa postura e fazemos que seja fácil garantir que suas memórias vivam.
+
+Estamos aqui para se tornar o aplicativo de fotos mais seguro de todos, venha e participe de nossa jornada!
+
+RECURSOS
+— Cópia de resolução original, por cada pixel ser importante
+- Planos familiares, para você poder compartilhar o armazenamento com sua família
+- Álbuns colaborativos, para você agrupar fotos após uma corrida
+- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques na "Câmera"
+- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar
+- Capacidade de liberar espaço, removendo arquivos salvos com segurança
+- Apoio humano, porque você vale a pena
+- Descrições, para você poder captar suas memórias e encontrá-las com facilidade
+- Editor de imagens, para adicionar últimos toques
+- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
+- Importar num só clique do Google, Apple, seu disco rígido e muito mais
+- Tema escuro, porque suas fotos parecem bem nele
+- 2FA, 3FA, Autenticação biométrica
+- e MUITO mais!
+
+PERMISSÕES
+ente solicita certas permissões para servir o propósito de um fornecedor de armazenamento de fotos, que pode ser revisado aqui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
+
+PREÇO
+Nós não oferecemos planos grátis para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com seus familiares. Você pode encontrar mais informações em ente.io.
+
+AJUDA
+Nós temos orgulho em oferecer apoio humano. Se você é um cliente pago, você pode contatar em team@ente.io e esperar uma resposta de nossa equipe dentro de 1 dia.
diff --git a/mobile/fastlane/metadata/android/pt_BR/short_description.txt b/mobile/fastlane/metadata/android/pt_BR/short_description.txt
new file mode 100644
index 0000000000..59c457c0e3
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_BR/short_description.txt
@@ -0,0 +1 @@
+ente é um aplicativo de armazenamento de fotos criptografado de ponta a ponta
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/pt_BR/title.txt b/mobile/fastlane/metadata/android/pt_BR/title.txt
new file mode 100644
index 0000000000..8d04a2f96e
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_BR/title.txt
@@ -0,0 +1 @@
+ente - armazenamento de fotos criptografado
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/pt_PT/full_description.txt b/mobile/fastlane/metadata/android/pt_PT/full_description.txt
new file mode 100644
index 0000000000..38a7c1b83f
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_PT/full_description.txt
@@ -0,0 +1,36 @@
+ente é uma aplicação simples para fazer backup e para partilhar as fotos e vídeos.
+
+Se busca por uma alternativa do Google Fotos baseada em privacidade, chegaste ao lugar correto. Com ente, eles são encriptados de ponta a ponta (e2ee). Significando que só o utilizador pode vê-las.
+
+Temos aplicações de fonte aberta para Android, iOS, sítio web e desktop, e as fotos serão perfeitamente sincronizadas entre todas elas numa maneira de encriptação de ponta a ponta (e2ee).
+
+Ente também simplifica a partilha dos seus álbuns com os seus entes queridos, mesmo que estes não estejam no ente. Pode partilhar ligações visíveis publicamente, onde podem ver o seu álbum e colaborar adicionando fotografias ao mesmo, mesmo sem uma conta ou aplicação.
+
+Os seus dados encriptados são replicados em 3 locais diferentes, incluindo um abrigo de emergência em Paris. Levamos a posteridade a sério e facilitamos a tarefa de garantir que as suas memórias perdurem para além de si.
+
+Estamos aqui para criar a aplicação de fotografias mais segura de sempre, junte-se à nossa viagem!
+
+RECURSOS
+- Cópias de segurança de qualidade original, porque cada pixel é importante
+- Planos familiares, para que possa partilhar o armazenamento com a sua família
+- Álbuns colaborativos, para que possa reunir fotos depois de uma viagem
+- Pastas partilhadas, caso queira que o seu parceiro desfrute dos seus cliques na “Câmara”
+- Links para álbuns, que podem ser protegidas com uma palavra-passe
+- Capacidade de libertar espaço, removendo ficheiros dos quais foi feita uma cópia de segurança segura
+- Apoio humano, porque vale a pena
+- Descrições, para que possa legendar as suas memórias e encontrá-las facilmente
+- Editor de imagens, para dar os retoques finais
+- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
+- Importação com um clique do Google, da Apple, do seu disco rígido e muito mais
+- Tema escuro, porque as suas fotos ficam bem com ele
+- 2FA, 3FA, autenticação biométrica
+- e MUITO mais!
+
+PERMISSÕES
+ente solicita determinadas permissões para servir o objetivo de um fornecedor de armazenamento de fotografias, que pode ser consultado aqui: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
+
+PREÇO
+Não oferecemos planos gratuitos para sempre, porque é importante para nós mantermo-nos sustentáveis e resistirmos ao teste do tempo. Em vez disso, oferecemos planos acessíveis que pode partilhar livremente com a sua família. Pode encontrar mais informações em ente.io.
+
+SUPPORT
+Orgulhamo-nos de oferecer um apoio humano Se for nosso cliente pago, pode contactar team@ente.io e esperar uma resposta da nossa equipa no prazo de 24 horas.
diff --git a/mobile/fastlane/metadata/android/pt_PT/short_description.txt b/mobile/fastlane/metadata/android/pt_PT/short_description.txt
new file mode 100644
index 0000000000..26293fcd81
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_PT/short_description.txt
@@ -0,0 +1 @@
+ente é uma aplicação de armazenamento de fotos encriptadas ponta a ponta
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/android/pt_PT/title.txt b/mobile/fastlane/metadata/android/pt_PT/title.txt
new file mode 100644
index 0000000000..3ef173686f
--- /dev/null
+++ b/mobile/fastlane/metadata/android/pt_PT/title.txt
@@ -0,0 +1 @@
+ente - armazenamento de fotos encriptado
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/ios/ar/description.txt b/mobile/fastlane/metadata/ios/ar/description.txt
index a98a74300a..df0c52ee93 100644
--- a/mobile/fastlane/metadata/ios/ar/description.txt
+++ b/mobile/fastlane/metadata/ios/ar/description.txt
@@ -1,33 +1,33 @@
-Ente is a simple app to automatically backup and organize your photos and videos.
+Ente هو تطبيق بسيط لإنشاء نسخ احتياطية وتنظيم صورك ومقاطع الفيديو الخاصة بك تلقائيًا.
-If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+إذا كنت تبحث عن بديل يحفظ الخصوصية للحفاظ على ذكرياتك، فأنت في المكان الصحيح. مع Ente، يتم تخزينهن بتشفير من طرف إلى طرف (e2ee). هذا يعني أنك وحدك من يستطيع رؤيتها.
-We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
+لدينا تطبيقات عبر جميع المنصات، وستتم مزامنة صورك بسلاسة بين جميع أجهزتك بطريقة مشفرة من طرف إلى طرف (e2ee).
-Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+يجعل Ente أيضًا من السهل مشاركة ألبوماتك مع أحبائك. يمكنك إما مشاركتها مباشرة مع مستخدمي Ente الآخرين، بتشفير من طرف إلى طرف؛ أو باستخدام روابط قابلة للعرض بشكل عام.
-Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+يتم تخزين بياناتك المشفرة عبر مواقع متعددة، بما في ذلك ملجأ للطوارئ في باريس. نحن نأخذ مسألة البقاء على مر الزمن بجدية ونجعل من السهل ضمان أن ذكرياتك ستدوم بعدك.
-We are here to make the safest photos app ever, come join our journey!
+نحن هنا لنصنع أكثر تطبيقات الصور أمانًا على الإطلاق، انضم إلى رحلتنا!
-FEATURES
-- Original quality backups, because every pixel is important
-- Family plans, so you can share storage with your family
-- Shared folders, in case you want your partner to enjoy your "Camera" clicks
-- Album links, that can be protected with a password and set to expire
-- Ability to free up space, by removing files that have been safely backed up
-- Image editor, to add finishing touches
-- Favorite, hide and relive your memories, for they are precious
-- One-click import from all major storage providers
-- Dark theme, because your photos look good in it
-- 2FA, 3FA, biometric auth
-- and a LOT more!
+الميزات
+- نسخ احتياطية بالجودة الأصلية، لأن كل بكسل مهم
+- خطط عائلية، حتى تتمكن من مشاركة مساحة التخزين مع عائلتك
+- مجلدات مشتركة، في حال كنت ترغب في أن يستمتع شريكك بصور "الكاميرا" الخاصة بك
+- روابط الألبوم، التي يمكن حمايتها بكلمة مرور وتعيينها لتنتهي صلاحيتها
+- القدرة على تحرير المساحة، عن طريق إزالة الملفات التي تم نسخها احتياطيًا بأمان
+- محرر الصور، لإضافة اللمسات النهائية
+- إضافة إلى المفضلة، إخفاء، وإعادة إحياء ذكرياتك، فهي ثمينة
+- استيراد بنقرة واحدة من جميع مزودي التخزين الرئيسيين
+- الوضع الداكن، لأن صورك تظهر بشكلٍ أفضل فيه
+- مصادقة ثنائية (2FA)، مصادقة ثلاثية (3FA)، مصادقة بيومترية
+- وأكثر من ذلك بكثير!
-PRICING
-We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+التسعير
+نحن لا نقدم خططًا مجانية إلى الأبد، لأنه من المهم بالنسبة لنا أن نبقى مستدامين ونتجاوز اختبار الزمن. بدلاً من ذلك، نقدم خططًا بأسعار معقولة يمكنك مشاركتها بحرية مع عائلتك. يمكنك العثور على مزيد من المعلومات على ente.io.
-SUPPORT
-We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
+الدعم
+نحن نفخر بتقديم الدعم البشري. إذا كنت عميلاً مدفوعًا لدينا، يمكنك التواصل عبر team@ente.io وتوقع ردًا من فريقنا في غضون 24 ساعة.
-TERMS
+الشروط
https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/ar/keywords.txt b/mobile/fastlane/metadata/ios/ar/keywords.txt
index 482e69dbc3..531605f2df 100644
--- a/mobile/fastlane/metadata/ios/ar/keywords.txt
+++ b/mobile/fastlane/metadata/ios/ar/keywords.txt
@@ -1 +1 @@
-صور، تصوير، عائلة، خصوصية، سحابة، نسخ احتياطي، مقاطع الفيديو، صورة، تشفير، تخزين، ألبوم، بديل
+صور، تصوير، عائلة، خصوصية، سحابة، نسخ احتياطي، مقاطع الفيديو، صورة، تشفير، تخزين، مجموعة الصور، بديل
diff --git a/mobile/fastlane/metadata/ios/eu/description.txt b/mobile/fastlane/metadata/ios/eu/description.txt
new file mode 100644
index 0000000000..a98a74300a
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/eu/description.txt
@@ -0,0 +1,33 @@
+Ente is a simple app to automatically backup and organize your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
+
+Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+
+Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password and set to expire
+- Ability to free up space, by removing files that have been safely backed up
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from all major storage providers
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
+
+TERMS
+https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/eu/keywords.txt b/mobile/fastlane/metadata/ios/eu/keywords.txt
new file mode 100644
index 0000000000..e1462baf51
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/eu/keywords.txt
@@ -0,0 +1 @@
+photos,photography,family,privacy,cloud,backup,videos,photo,encryption,storage,album,alternative
diff --git a/mobile/fastlane/metadata/ios/eu/name.txt b/mobile/fastlane/metadata/ios/eu/name.txt
new file mode 100644
index 0000000000..3a991c4abc
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/eu/name.txt
@@ -0,0 +1 @@
+Ente Photos
diff --git a/mobile/fastlane/metadata/ios/eu/subtitle.txt b/mobile/fastlane/metadata/ios/eu/subtitle.txt
new file mode 100644
index 0000000000..958a35f1c9
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/eu/subtitle.txt
@@ -0,0 +1 @@
+Encrypted photo storage
diff --git a/mobile/fastlane/metadata/ios/lt/description.txt b/mobile/fastlane/metadata/ios/lt/description.txt
index 73464e32c3..13249a5328 100644
--- a/mobile/fastlane/metadata/ios/lt/description.txt
+++ b/mobile/fastlane/metadata/ios/lt/description.txt
@@ -12,7 +12,7 @@ Esame čia tam, kad sukurtume saugiausią nuotraukų programą, prisijunkite pri
FUNKCIJOS
– Originalios kokybės atsarginės kopijos, nes kiekvienas taškelis yra svarbus
-– Šeimos planai, kad galėtumėte dalytis saugykla su šeima
+– Šeimos planai, tad galite dalytis saugykla su šeima
– Bendrinami aplankai, jei norite, kad partneris galėtų mėgautis jūsų „fotoaparato“ paspaudimais
– Albumo nuorodos, kurias galima apsaugoti slaptažodžiu ir nustatyti jų galiojimo laiką
– Galimybė atlaisvinti vietą, pašalinant saugiai atsargines kopijas sukūrusius failus
@@ -24,9 +24,9 @@ FUNKCIJOS
– ir DAR daugiau!
KAINODARA
-Nesiūlome amžinai nemokamų planų, nes mums svarbu, kad išliktume tvarūs ir atlaikytume laiko išbandymą. Vietoj to siūlome nebrangius planus, kuriais galite laisvai dalytis su savo šeima. Daugiau informacijos galima rasti svetainėje ente.io.
+Nesiūlome visam laikui nemokamų planų, nes mums svarbu, kad išliktume tvarūs ir atlaikytume laiko išbandymą. Vietoj to siūlome nebrangius planus, kuriais galite laisvai dalytis su savo šeima. Daugiau informacijos galima rasti svetainėje ente.io.
-PALAIKYMAS
+PAGALBA
Didžiuojamės galėdami pasiūlyti žmogiškąją pagalbą. Jei esate mūsų mokamas klientas, galite susisiekti adresu team@ente.io ir tikėtis mūsų komandos atsakymo per 24 valandas.
SĄLYGOS
diff --git a/mobile/fastlane/metadata/ios/or/description.txt b/mobile/fastlane/metadata/ios/or/description.txt
new file mode 100644
index 0000000000..a98a74300a
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/or/description.txt
@@ -0,0 +1,33 @@
+Ente is a simple app to automatically backup and organize your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
+
+Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+
+Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password and set to expire
+- Ability to free up space, by removing files that have been safely backed up
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from all major storage providers
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
+
+TERMS
+https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/or/keywords.txt b/mobile/fastlane/metadata/ios/or/keywords.txt
new file mode 100644
index 0000000000..e1462baf51
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/or/keywords.txt
@@ -0,0 +1 @@
+photos,photography,family,privacy,cloud,backup,videos,photo,encryption,storage,album,alternative
diff --git a/mobile/fastlane/metadata/ios/or/name.txt b/mobile/fastlane/metadata/ios/or/name.txt
new file mode 100644
index 0000000000..3a991c4abc
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/or/name.txt
@@ -0,0 +1 @@
+Ente Photos
diff --git a/mobile/fastlane/metadata/ios/or/subtitle.txt b/mobile/fastlane/metadata/ios/or/subtitle.txt
new file mode 100644
index 0000000000..958a35f1c9
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/or/subtitle.txt
@@ -0,0 +1 @@
+Encrypted photo storage
diff --git a/mobile/fastlane/metadata/ios/pt_BR/description.txt b/mobile/fastlane/metadata/ios/pt_BR/description.txt
new file mode 100644
index 0000000000..23ec5ffbfa
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_BR/description.txt
@@ -0,0 +1,33 @@
+Ente é um aplicativo simples para copiar com segurança automaticamente e organizar suas fotos e vídeos.
+
+Se você esteve procurando por uma alternativa amigável à privacidade para preservar suas memórias, você veio no lugar certo. Com Ente, elas são armazenadas com criptografia de ponta a ponta (e2ee). Isso significa que só você pode vê-las.
+
+Temos aplicativos de código aberto em Android, iOS, web e desktop, e suas fotos vão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee).
+
+Ente também torna simples compartilhar seus álbuns com seus entes queridos. Você pode compartilhá-los diretamente com outros usuários do Ente, criptografados de ponta a ponta; ou com links publicamente visíveis.
+
+Seus dados criptografados são replicados em locais diferentes, incluindo um abrigo avançado em Paris. Nós levamos a sério a nossa postura e fazemos que seja fácil garantir que suas memórias vivam.
+
+Estamos aqui para se tornar o aplicativo de fotos mais seguro de todos, venha e participe de nossa jornada!
+
+RECURSOS
+— Cópia de resolução original, por cada pixel ser importante
+- Planos familiares, para você poder compartilhar o armazenamento com sua família
+- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques na "Câmera"
+- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar
+- Capacidade de liberar espaço, removendo arquivos salvos com segurança
+- Editor de imagens, para adicionar últimos toques
+- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
+- Importar num clique só para todos os fornecedores principais de armazenamento
+- Tema escuro, porque suas fotos parecem bem nele
+- 2FA, 3FA, Autenticação biométrica
+- e MUITO mais!
+
+PREÇO
+Nós não oferecemos planos grátis para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com seus familiares. Você pode encontrar mais informações em ente.io.
+
+AJUDA
+Nós temos orgulho em oferecer apoio humano. Se você é um cliente pago, você pode contatar em team@ente.io e esperar uma resposta de nossa equipe dentro de 1 dia.
+
+TERMOS
+https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/pt_BR/keywords.txt b/mobile/fastlane/metadata/ios/pt_BR/keywords.txt
new file mode 100644
index 0000000000..e8081a0336
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_BR/keywords.txt
@@ -0,0 +1 @@
+fotos,fotografia,família,privacidade,nuvem,cópiadesegurança,vídeos,foto,criptografia,armazenamento,álbum,alternativa
diff --git a/mobile/fastlane/metadata/ios/pt_BR/name.txt b/mobile/fastlane/metadata/ios/pt_BR/name.txt
new file mode 100644
index 0000000000..40a1cc3114
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_BR/name.txt
@@ -0,0 +1 @@
+Ente Fotos
diff --git a/mobile/fastlane/metadata/ios/pt_BR/subtitle.txt b/mobile/fastlane/metadata/ios/pt_BR/subtitle.txt
new file mode 100644
index 0000000000..c7fc3ef6cd
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_BR/subtitle.txt
@@ -0,0 +1 @@
+Armazenamento de fotos criptografado
diff --git a/mobile/fastlane/metadata/ios/pt_PT/description.txt b/mobile/fastlane/metadata/ios/pt_PT/description.txt
new file mode 100644
index 0000000000..09e3bcf93f
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_PT/description.txt
@@ -0,0 +1,33 @@
+Ente é uma aplicação simples feita para fazer backup automaticamente e organizar as suas fotos e vídeos.
+
+Se busca por uma alternativa mais privada para preservar as suas memórias, chegaste ao lugar correto. Com Ente, eles são armazenados em encriptação de ponta a ponta (e2ee). Isto significa que só vos podeis vê-las.
+
+Já temos aplicações em todas as plataformas, e as suas fotos sincronizam perfeitamente em todos os dispositivos numa maneira de encriptação de ponta a ponta (e2ee).
+
+O Ente também simplifica a partilha de álbuns com os seus entes queridos. Também pode partilhá-los diretamente com outros utilizadores do Ente, encriptado de ponta a ponta; ou com ligações visíveis publicamente.
+
+Os seus dados encriptados são armazenados em várias localizações, incluindo um abrigo avançado em Paris. Levamos a nossa postura seriamente e facilitamos que as suas memórias vivenciem.
+
+Aqui estamos, fazendo a aplicação de fotos MAIS segura, vêm e adere a nossa jornada!
+
+FUNCIONALIDADES
+- Backups de qualidade original, por cada píxel ser importante
+- Planos familiares, para partilhar o armazenamento com a sua família
+- Pastas partilhadas, se deseja que o seu parceiro desfrute dos cliques da "Câmara"
+- Links de álbuns, para poder ser protegido por uma palavra-passe e definido para expiração
+- Capacidade de liberar espaço, eliminando ficheiros com backups já feitos
+- Editor de imagens, para dar toques finais
+- Adicione aos favoritos, oculte e reanime as suas memórias, já que elas são preciosas
+- Importação num clique de todos os principais fornecedores de armazenamento
+- Tema escuro, porque as suas fotos ficam bonitas nele
+- 2FA, 3FA, autenticação biométrica
+- e MUITO mais!
+
+PREÇOS
+Não é oferecido pacotes gratuitos para sempre, porque é importante que nos mantenha sustentável e resistentes ao teste do tempo. Ao invés, oferecemos planos acessíveis para poder partilhar livremente com a sua família. Pode achar mais informações em ente.io.
+
+SUPORTE
+Orgulhamo-nos de oferecer suporte humano. Se é um cliente pago, pode contactar ao team@ente.io e esperar uma resposta da nossa equipa dentre 1 dia.
+
+TERMOS
+https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/pt_PT/keywords.txt b/mobile/fastlane/metadata/ios/pt_PT/keywords.txt
new file mode 100644
index 0000000000..fb3ab2aa69
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_PT/keywords.txt
@@ -0,0 +1 @@
+fotos, fotografia, família, privacidade, nuvem, backup, vídeos, foto, encriptação, armazenamento, álbum, alternativa
diff --git a/mobile/fastlane/metadata/ios/pt_PT/name.txt b/mobile/fastlane/metadata/ios/pt_PT/name.txt
new file mode 100644
index 0000000000..3a991c4abc
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_PT/name.txt
@@ -0,0 +1 @@
+Ente Photos
diff --git a/mobile/fastlane/metadata/ios/pt_PT/subtitle.txt b/mobile/fastlane/metadata/ios/pt_PT/subtitle.txt
new file mode 100644
index 0000000000..568ad02358
--- /dev/null
+++ b/mobile/fastlane/metadata/ios/pt_PT/subtitle.txt
@@ -0,0 +1 @@
+Armazenamento de fotos encriptado
diff --git a/mobile/fastlane/metadata/ios/ru/description.txt b/mobile/fastlane/metadata/ios/ru/description.txt
index dc90c44334..dd01ad1300 100644
--- a/mobile/fastlane/metadata/ios/ru/description.txt
+++ b/mobile/fastlane/metadata/ios/ru/description.txt
@@ -1,33 +1,33 @@
-Ente - это простое приложение для автоматического резервного копирования и упорядочения ваших фотографий и видео.
+Ente — это простое приложение для автоматического резервного копирования и организации ваших фото и видео.
-Если вы ищете подходящую для вас альтернативу для сохранения ваших воспоминаний, вы попали в нужное место. В Ente, они хранятся в сквозном шифровании (e2ee). Это означает то, что только вы можете их просматривать.
+Если вы ищете конфиденциальную альтернативу для сохранения своих воспоминаний, то вы попали по адресу. В Ente они хранятся с использованием сквозного шифрования (E2EE). Это означает, что только вы можете их просматривать.
-У нас есть приложения на всех платформах, и ваши фотографии будут легко синхронизироваться со всеми вашими устройствами с помощью сквозного шифрования (e2ee).
+У нас есть приложения для всех платформ, и ваши фото будут синхронизироваться между всеми вашими устройствами с использованием сквозного шифрования (E2EE).
-В Ente также проще поделиться своими альбомами со своими близкими. Вы можете либо поделиться ими напрямую с другими пользователями Ente, со сквозным шифрованием; либо с помощью ссылок для публичного просмотра.
+Ente также упрощает обмен вашими альбомами с близкими. Вы можете делиться ими напрямую с другими пользователями Ente с использованием сквозного шифрования или через общедоступные ссылки.
-Ваши зашифрованные данные хранятся в нескольких локациях, включая скрытое убежище в Париже. Мы серьезно относимся к потомству и легко сделаем так, что ваши воспоминания переживут и вас.
+Ваши зашифрованные данные хранятся в нескольких локациях, включая бункер в Париже. Мы серьёзно относимся к сохранению наследия и упрощаем задачу сохранения ваших воспоминаний.
-Мы здесь, чтобы сделать самое безопасное приложение для хранения фотографий, присоединяйтесь к нашему путешествию!
+Мы существуем, чтобы создать самое безопасное приложение для фото. Присоединяйтесь к нашему путешествию!
ОСОБЕННОСТИ
-- Оригинальное качество резервных копий, потому что важен каждый пиксел
-- Семейные планы, чтобы вы могли делиться хранилищем с вашей семьей
-- Общие папки, если вы хотите, чтобы ваш партнер наслаждался кликами вашей "Камеры"
-- Ссылки для альбома, которые могут быть защищены паролем и установлены на срок действия
-- Возможность освободить место путем удаления файлов, которые были безопасно сохранены
-- Редактор изображений, для добавления финальных штрихов
-- Избранное, скрывать и доверять вашим воспоминаниям, потому что они драгоценны
-- Импорт в один клик из всех основных приложений для хранения
-- Темная тема, потому что в ней хорошо выглядят ваши фотографии
-- 2ФА, 3ФА, биометрическая аутентификация
-- и ещё МНОГОЕ другое!
+- Резервные копии в оригинальном качестве, потому что каждый пиксель важен
+- Семейные тарифы, чтобы вы могли делиться хранилищем с семьёй
+- Общие папки, если вы хотите, чтобы ваш партнёр мог наслаждаться вашими снимками
+- Ссылки на альбомы, которые можно защитить паролем и установить срок действия
+- Возможность освободить место от файлов, которые уже надёжно сохранены
+- Редактор изображений, чтобы добавить последние штрихи
+- Отмечайте избранное, скрывайте и переживайте заново свои воспоминания, ведь они бесценны
+- Импорт одним кликом из всех крупных сервисов хранения фото
+- Тёмная тема, потому что ваши фото выглядят в ней хорошо
+- двух/трёхфакторная и биометрическая аутентификации
+- и многое другое!
+
+СТОИМОСТЬ
+Мы не предлагаем вечно бесплатные тарифы, потому что для нас важно оставаться устойчивыми и выдержать испытание временем. Вместо этого мы предлагаем доступные тарифы, которыми вы можете свободно делиться с семьёй. Подробности вы можете найти на ente.io.
ПОДДЕРЖКА
-Мы не предлагаем бесконечные бесплатные планы, потому что для нас важно оставаться устойчивыми и выдерживать испытание временем. Вместо этого мы предлагаем доступные по цене планы, которыми вы можете свободно делиться с вашей семьей. Дополнительную информацию можно найти на ente.io.
+Мы гордимся тем, что предлагаем человеческую поддержку. Если вы подписаны на платный тариф, вы можете написать на team@ente.io и получить ответ от нашей команды в течение 24 часов.
УСЛОВИЯ
-Мы гордимся тем, что предлагаем поддержку с живыми людьми. Если вы являетесь нашим платным клиентом, вы можете связаться по электронному адресу team@ente.io и получить ответ от нашей команды в течение 24 часов.
-
-ЦЕНА
https://ente.io/terms
diff --git a/mobile/fastlane/metadata/ios/ru/name.txt b/mobile/fastlane/metadata/ios/ru/name.txt
index 92f417f65f..3a991c4abc 100644
--- a/mobile/fastlane/metadata/ios/ru/name.txt
+++ b/mobile/fastlane/metadata/ios/ru/name.txt
@@ -1 +1 @@
-Фотографии Ente
+Ente Photos
diff --git a/mobile/fastlane/metadata/ios/ru/subtitle.txt b/mobile/fastlane/metadata/ios/ru/subtitle.txt
index 990f6a1af7..0484aaac8d 100644
--- a/mobile/fastlane/metadata/ios/ru/subtitle.txt
+++ b/mobile/fastlane/metadata/ios/ru/subtitle.txt
@@ -1 +1 @@
-Зашифрованное хранилище фотографий
+Зашифрованное фото хранилище
diff --git a/mobile/fastlane/metadata/playstore/ar/full_description.txt b/mobile/fastlane/metadata/playstore/ar/full_description.txt
index 7f3774d3af..94cc917f5e 100644
--- a/mobile/fastlane/metadata/playstore/ar/full_description.txt
+++ b/mobile/fastlane/metadata/playstore/ar/full_description.txt
@@ -4,27 +4,27 @@ Ente هو تطبيق بسيط لنسخ الصور ومقاطع الفيديو ا
لدينا تطبيقات على أندرويد، اي او اس، ويب، وسطح المكتب، وسيتم مزامنة صورك بسلاسة بين جميع أجهزتك بطريقة مشفرة من طرف إلى طرف (e2ee).
-Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+ثم أن Ente يُسهِّل مشاركة ألبوماتك مع أحبائك. يمكنك إما مشاركتها مباشرةً مع مستخدمي Ente الآخرين مشفرةً من طرف إلى طرف، أو عبر روابط قابلة للمشاهدة العامة.
-Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+تُخزَّن بياناتك المشفرة في مواقع متعددة، بما في ذلك مَلجأ مقاوم للكوارث في باريس. نحن نأخذ الحفاظ على الإرث الرقمي على محمل الجِدّ، ونُسهِّل عليك ضمان بقاء ذكرياتك بعد رحيلك.
-We are here to make the safest photos app ever, come join our journey!
+نحن هنا لبناء أكثر تطبيق صور أمانًا على الإطلاق. انضم إلينا في رحلتنا!
-✨ FEATURES
-- Original quality backups, because every pixel is important
-- Family plans, so you can share storage with your family
-- Shared folders, in case you want your partner to enjoy your "Camera" clicks
-- Album links, that can be protected with a password and set to expire
-- Ability to free up space, by removing files that have been safely backed up
-- Image editor, to add finishing touches
-- Favorite, hide and relive your memories, for they are precious
-- One-click import from Google, Apple, your hard drive and more
-- Dark theme, because your photos look good in it
-- 2FA, 3FA, biometric auth
-- and a LOT more!
+✨ مزايا
+- جودة النسخ الاحتياطية الأصلية، لأن كل بكسل مهم
+- خطط عائلية، حتى تتمكن من مشاركة التخزين مع عائلتك
+- شارك لحظاتك العفوية مع من تُحب عبر مجلدات مشتركة
+- روابط الألبوم، يمكن تأمينها بكلمة مرور وضَبْط تاريخ انتهائها
+- القدرة على تحرير المساحة، عن طريق إزالة الملفات التي تم نسخها احتياطيًا بأمان
+- محرر الصورة، لإضافة اللمسات النهائية
+- ضَعْ ذكرياتك في المفضلة، أخفِها، وعِشها من جديد؛ فهي ثمينة
+- استيراد بنقرة واحدة من جوجل، وآبل، والقرص الصلب الخاص بك، وغيرها
+- الوضع الداكن، لأن صورك تظهر بشكلٍ أفضل فيه
+- استيراد بنقرة واحدة من جوجل، وآبل، والقرص الصلب الخاص بك، وغيرها.
+- وغير ذلك الكثير!
-💲 PRICING
-We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+💲السعر
+لا نقدِّم خططًا مجانية دائمة، لأننا نحرص على ضمان استدامة خدماتنا واستمراريتها على المدى الطويل. بدلًا من ذلك، نُقدِّم خططًا بأسعار معقولة يمكنك مشاركتها بحرية مع عائلتك. يمكنك العثور على مزيد من المعلومات على موقع ente.io.
-🙋 SUPPORT
-We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
\ No newline at end of file
+🙋 الدعم
+نحن نعتز بتقديم خدمة عملاء مباشرةً من فريق بشري متخصص. إذا كنتَ عميلاً مدفوعًا لدينا، يُمكنك التواصل مع team@ente.io وتوقع ردًا من فريقنا خلال 24 ساعة.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/eu/full_description.txt b/mobile/fastlane/metadata/playstore/eu/full_description.txt
new file mode 100644
index 0000000000..ec999a783c
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/eu/full_description.txt
@@ -0,0 +1,30 @@
+Ente is a simple app to automatically backup and organize your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have apps across Android, iOS, web and Desktop, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
+
+Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+
+Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+✨ FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password and set to expire
+- Ability to free up space, by removing files that have been safely backed up
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from Google, Apple, your hard drive and more
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+💲 PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+🙋 SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/eu/short_description.txt b/mobile/fastlane/metadata/playstore/eu/short_description.txt
new file mode 100644
index 0000000000..6c00229894
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/eu/short_description.txt
@@ -0,0 +1 @@
+Encrypted photo storage - backup, organize and share your photos and videos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/eu/title.txt b/mobile/fastlane/metadata/playstore/eu/title.txt
new file mode 100644
index 0000000000..97fdef3be7
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/eu/title.txt
@@ -0,0 +1 @@
+Ente Photos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/lt/full_description.txt b/mobile/fastlane/metadata/playstore/lt/full_description.txt
index ecf818aaa5..090a4b415a 100644
--- a/mobile/fastlane/metadata/playstore/lt/full_description.txt
+++ b/mobile/fastlane/metadata/playstore/lt/full_description.txt
@@ -12,7 +12,7 @@ Esame čia tam, kad sukurtume saugiausią nuotraukų programą, prisijunkite pri
✨ FUNKCIJOS
– Originalios kokybės atsarginės kopijos, nes kiekvienas taškelis yra svarbus
-– Šeimos planai, kad galėtumėte dalytis saugykla su šeima
+– Šeimos planai, tad galite dalytis saugykla su šeima
– Bendrinami aplankai, jei norite, kad partneris galėtų mėgautis jūsų „fotoaparato“ paspaudimais
– Albumo nuorodos, kurias galima apsaugoti slaptažodžiu ir nustatyti jų galiojimo laiką
– Galimybė atlaisvinti vietą, pašalinant saugiai atsargines kopijas sukūrusius failus
@@ -24,7 +24,7 @@ Esame čia tam, kad sukurtume saugiausią nuotraukų programą, prisijunkite pri
– ir DAR daugiau!
💲 KAINODARA
-Nesiūlome amžinai nemokamų planų, nes mums svarbu, kad išliktume tvarūs ir atlaikytume laiko išbandymą. Vietoj to siūlome nebrangius planus, kuriais galite laisvai dalytis su savo šeima. Daugiau informacijos galima rasti svetainėje ente.io.
+Nesiūlome visam laikui nemokamų planų, nes mums svarbu, kad išliktume tvarūs ir atlaikytume laiko išbandymą. Vietoj to siūlome nebrangius planus, kuriais galite laisvai dalytis su savo šeima. Daugiau informacijos galima rasti svetainėje ente.io.
-🙋 PALAIKYMAS
+🙋 PAGALBA
Didžiuojamės galėdami pasiūlyti žmogiškąją pagalbą. Jei esate mūsų mokamas klientas, galite susisiekti adresu team@ente.io ir tikėtis mūsų komandos atsakymo per 24 valandas.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/or/full_description.txt b/mobile/fastlane/metadata/playstore/or/full_description.txt
new file mode 100644
index 0000000000..ec999a783c
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/or/full_description.txt
@@ -0,0 +1,30 @@
+Ente is a simple app to automatically backup and organize your photos and videos.
+
+If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
+
+We have apps across Android, iOS, web and Desktop, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
+
+Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
+
+Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
+
+We are here to make the safest photos app ever, come join our journey!
+
+✨ FEATURES
+- Original quality backups, because every pixel is important
+- Family plans, so you can share storage with your family
+- Shared folders, in case you want your partner to enjoy your "Camera" clicks
+- Album links, that can be protected with a password and set to expire
+- Ability to free up space, by removing files that have been safely backed up
+- Image editor, to add finishing touches
+- Favorite, hide and relive your memories, for they are precious
+- One-click import from Google, Apple, your hard drive and more
+- Dark theme, because your photos look good in it
+- 2FA, 3FA, biometric auth
+- and a LOT more!
+
+💲 PRICING
+We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
+
+🙋 SUPPORT
+We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/or/short_description.txt b/mobile/fastlane/metadata/playstore/or/short_description.txt
new file mode 100644
index 0000000000..6c00229894
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/or/short_description.txt
@@ -0,0 +1 @@
+Encrypted photo storage - backup, organize and share your photos and videos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/or/title.txt b/mobile/fastlane/metadata/playstore/or/title.txt
new file mode 100644
index 0000000000..97fdef3be7
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/or/title.txt
@@ -0,0 +1 @@
+Ente Photos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_BR/full_description.txt b/mobile/fastlane/metadata/playstore/pt_BR/full_description.txt
new file mode 100644
index 0000000000..f1a705c14a
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_BR/full_description.txt
@@ -0,0 +1,30 @@
+Ente é um aplicativo básico para salvar e organizar suas fotos e vídeos com segurança.
+
+Se você esteve procurando uma alternativa de ótima privacidade para preservar suas memórias, você chegou ao lugar certo. Com Ente, suas fotos e vídeos são criptografados de ponta a ponta (e2ee). Significando que somente você pode vê-las.
+
+Temos sites/aplicativos para Android, iOS e Computador, e suas fotos serão sincronizadas sem parar em todos os dispositivos numa maneira de criptografia de ponta a ponta (e2ee).
+
+Ente facilita o compartilhamento de álbuns entre entes queridos. Você pode compartilhá-los diretamente com outros usuários Ente, criptografados de ponta a ponta; ou links disponíveis publicamente.
+
+Seus dados criptografados são armazenados em vários locais, incluindo até um refúgio avançado em Paris. Nós levamos nossa postura a sério e facilitamos que você se certifique que suas memórias vivam.
+
+Estamos aqui para tornar o Ente Photos mais seguro, venha e junte-se à nossa jornada!
+
+✨ RECURSOS
+- Cópia em qualidade original, por cada píxel ser importante
+- Planos familiares, para você poder compartilhar o armazenamento com seus familiares
+- Pastas compartilhadas, caso queira que seu parceiro aproveite os cliques da "Câmera"
+- Links de álbuns, em que podem ser protegidos com senhas e definidos aquando expirar
+- Capacidade de liberar espaço, removendo arquivos salvos com segurança
+- Editor de imagens, para adicionar últimos toques
+- Favoritar, ocultar e reviver suas memórias, por serem preciosas
+- A importação em só um clique do Google, Apple, seu disco rígido e mais
+- Tema escuro, por suas fotos parecem boas nele
+- 2FA, 3FA, Autenticação biométrica
+- e MUITO mais!
+
+💲 PREÇO
+Não oferecemos planos grátis para sempre, porque é importante para nós que nos mantenha sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com seus familiares. Você pode saber mais informações em ente.io
+
+🙋 AJUDA
+Nós temos orgulho em oferecer apoio humano. Se você é um cliente pago, você pode contatar em team@ente.io e esperar uma resposta de nossa equipe dentro de 1 dia.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_BR/short_description.txt b/mobile/fastlane/metadata/playstore/pt_BR/short_description.txt
new file mode 100644
index 0000000000..3b17638d30
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_BR/short_description.txt
@@ -0,0 +1 @@
+Armazenamento criptografado de fotos - salve com segurança, organize e compartilhe suas fotos e vídeos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_BR/title.txt b/mobile/fastlane/metadata/playstore/pt_BR/title.txt
new file mode 100644
index 0000000000..536837e6bb
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_BR/title.txt
@@ -0,0 +1 @@
+Ente Fotos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_PT/full_description.txt b/mobile/fastlane/metadata/playstore/pt_PT/full_description.txt
new file mode 100644
index 0000000000..f1757bf090
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_PT/full_description.txt
@@ -0,0 +1,30 @@
+Ente é uma aplicação simples feita para fazer backup automaticamente e organizar as suas fotos e vídeos.
+
+Se busca por uma alternativa mais privada para preservar as suas memórias, chegaste ao lugar correto. Com Ente, eles são armazenados em encriptação de ponta a ponta (e2ee). Isto significa que só vos podeis vê-las.
+
+Temos aplicações para Android, iOS, Web e ambiente de trabalho, e as suas fotografias serão perfeitamente sincronizadas entre todos os seus dispositivos de uma forma encriptada de ponta a ponta (e2ee).
+
+O Ente também simplifica a partilha dos seus álbuns com os seus entes queridos Pode partilhá-los diretamente com outros utilizadores do Ente, encriptados de ponta a ponta, ou com ligações publicamente visíveis.
+
+Os seus dados encriptados são armazenados em vários locais, incluindo um abrigo de emergência em Paris. Levamos a posteridade a sério e facilitamos a tarefa de garantir que as suas memórias perdurem para além de si.
+
+Estamos aqui para criar a aplicação de fotografias mais segura de sempre, junte-se à nossa viagem!
+
+✨ RECURSOS
+- Cópias de segurança de qualidade original, porque cada pixel é importante
+- Planos familiares, para que possa partilhar o armazenamento com a sua família
+- Pastas partilhadas, caso queira que o seu parceiro desfrute dos seus cliques na “Câmara”
+- Links para álbuns, que podem ser protegidas com uma palavra-passe e definidas para expirar
+- Capacidade de libertar espaço, removendo ficheiros dos quais foi feita uma cópia de segurança segura
+- Editor de imagens, para dar os retoques finais
+- Favoritar, ocultar e reviver suas memórias, pois elas são preciosas
+- Importação com um clique do Google, da Apple, do seu disco rígido e muito mais
+- Tema escuro, porque as suas fotografias ficam bem com ele
+- 2FA, 3FA, autenticação biométrica
+- and a LOT more!
+
+💲 PREÇOS
+Não oferecemos planos gratuitos para sempre, porque é importante para nós mantermo-nos sustentáveis e resistirmos ao teste do tempo. Em vez disso, oferecemos planos acessíveis que pode partilhar livremente com a sua família. Pode encontrar mais informações em ente.io.
+
+🙋 SUPPORT
+Orgulhamo-nos de oferecer um apoio humano. Se for nosso cliente pago, pode contactar team@ente.io e esperar uma resposta da nossa equipa no prazo de 24 horas.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_PT/short_description.txt b/mobile/fastlane/metadata/playstore/pt_PT/short_description.txt
new file mode 100644
index 0000000000..071e170ad5
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_PT/short_description.txt
@@ -0,0 +1 @@
+Armazenamento de fotos encriptado - faça backup, organize e partilhe as suas fotos e vídeos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/pt_PT/title.txt b/mobile/fastlane/metadata/playstore/pt_PT/title.txt
new file mode 100644
index 0000000000..97fdef3be7
--- /dev/null
+++ b/mobile/fastlane/metadata/playstore/pt_PT/title.txt
@@ -0,0 +1 @@
+Ente Photos
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/ru/full_description.txt b/mobile/fastlane/metadata/playstore/ru/full_description.txt
index def3ae693b..08ef1c83e3 100644
--- a/mobile/fastlane/metadata/playstore/ru/full_description.txt
+++ b/mobile/fastlane/metadata/playstore/ru/full_description.txt
@@ -1,30 +1,30 @@
-Ente - это простое приложение для автоматического резервного копирования и упорядочения ваших фотографий и видео.
+Ente — это простое приложение для автоматического резервного копирования и организации ваших фото и видео.
-Если вы ищете подходящую для вас конфиденциальную альтернативу для сохранения ваших воспоминаний, вы попали в нужное место. В Ente, они хранятся в сквозном шифровании (e2ee). Это означает то, что только вы можете их просматривать.
+Если вы ищете конфиденциальную альтернативу для сохранения ваших воспоминаний, то вы попали по адресу. В Ente они хранятся с использованием сквозного шифрования (E2EE). Это означает, что только вы можете их просматривать.
-У нас есть приложения с открытым исходным кодом на всех платформах, и ваши фотографии будут беспрепятственно синхронизироваться со всеми вашими устройствами с помощью сквозного шифрования (e2ee).
+Наши приложения доступны для Android, iOS, браузера и компьютера, и ваши фото будут синхронизироваться между всеми вашими устройствами с использованием сквозного шифрования (E2EE).
-В Ente также проще поделиться своими альбомами со своими близкими. Вы можете либо поделиться ими напрямую с другими пользователями Ente, со сквозным шифрованием; либо с помощью ссылок для публичного просмотра.
+Ente также упрощает обмен вашими альбомами с близкими. Вы можете делиться ими напрямую с другими пользователями Ente с использованием сквозного шифрования или через общедоступные ссылки.
-Ваши зашифрованные данные хранятся в нескольких локациях, включая скрытое убежище в Париже. Мы серьезно относимся к потомству и легко сделаем так, что ваши воспоминания переживут и вас.
+Ваши зашифрованные данные хранятся в нескольких локациях, включая бункер в Париже. Мы серьёзно относимся к сохранению наследия и упрощаем задачу сохранения ваших воспоминаний.
-Мы здесь, чтобы сделать самое безопасное приложение для хранения фотографий, присоединяйтесь к нашему путешествию!
+Мы существуем, чтобы создать самое безопасное приложение для фото. Присоединяйтесь к нашему путешествию!
✨ ОСОБЕННОСТИ
-- Оригинальное качество резервных копий, потому что важен каждый пиксел
-- Семейные планы, чтобы вы могли делиться хранилищем с вашей семьей
-- Общие папки, если вы хотите, чтобы ваш партнер наслаждался кликами вашей "Камеры"
-- Ссылки для альбома, которые могут быть защищены паролем и установлены на срок действия
-- Возможность освободить место путем удаления файлов, которые были безопасно сохранены
-- Редактор изображений, для добавления финальных штрихов
-- Избранное, скрывать и доверять вашим воспоминаниям, потому что они драгоценны
-- Импорт в один клик из Google, Apple, вашего жесткого диска и многого другого
-- Темная тема, потому что в ней хорошо выглядят ваши фотографии
-- 2ФА, 3ФА, биометрическая аутентификация
-- и ещё МНОГОЕ другое!
+- Резервные копии в оригинальном качестве, потому что каждый пиксель важен
+- Семейные тарифы, чтобы вы могли делиться хранилищем с семьёй
+- Общие папки, если вы хотите, чтобы ваш партнёр мог наслаждаться вашими снимками
+- Ссылки на альбомы, которые можно защитить паролем и установить срок действия
+- Возможность освободить место от файлов, которые уже надёжно сохранены
+- Редактор изображений, чтобы добавить последние штрихи
+- Отмечайте избранное, скрывайте и переживайте заново свои воспоминания, ведь они бесценны
+- Импорт одним кликом из Google, Apple, вашего жёсткого диска и не только
+- Тёмная тема, потому что ваши фото выглядят в ней хорошо
+- двух/трёхфакторная и биометрическая аутентификации
+- и многое другое!
-💲 ЦЕНА
-Мы не предлагаем бесконечные бесплатные планы, потому что для нас важно оставаться устойчивыми и выдерживать испытание временем. Вместо этого мы предлагаем доступные по цене планы, которыми вы можете свободно делиться с вашей семьей. Дополнительную информацию можно найти на сайте ente.io.
+💲 СТОИМОСТЬ
+Мы не предлагаем вечно бесплатные тарифы, потому что для нас важно оставаться устойчивыми и выдержать испытание временем. Вместо этого мы предлагаем доступные тарифы, которыми вы можете свободно делиться с семьёй. Подробности вы можете найти на ente.io.
🙋 ПОДДЕРЖКА
-Мы гордимся тем, что предлагаем поддержку с живыми людьми. Если вы являетесь нашим платным клиентом, вы можете связаться по электронному адресу team@ente.io и получить ответ от нашей команды в течение 24 часов.
\ No newline at end of file
+Мы гордимся тем, что предлагаем человеческую поддержку. Если вы подписаны на платный тариф, вы можете написать на team@ente.io и получить ответ от нашей команды в течение 24 часов.
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/ru/short_description.txt b/mobile/fastlane/metadata/playstore/ru/short_description.txt
index d64bddbec7..157e4ca81f 100644
--- a/mobile/fastlane/metadata/playstore/ru/short_description.txt
+++ b/mobile/fastlane/metadata/playstore/ru/short_description.txt
@@ -1 +1 @@
-Зашифрованное хранилище фотографий для резервного копирования и обмена
\ No newline at end of file
+Зашифрованное фото хранилище для резервного копирования и обмена
\ No newline at end of file
diff --git a/mobile/fastlane/metadata/playstore/ru/title.txt b/mobile/fastlane/metadata/playstore/ru/title.txt
index 3b1c079da3..97fdef3be7 100644
--- a/mobile/fastlane/metadata/playstore/ru/title.txt
+++ b/mobile/fastlane/metadata/playstore/ru/title.txt
@@ -1 +1 @@
-Фотографии Ente
\ No newline at end of file
+Ente Photos
\ No newline at end of file
diff --git a/mobile/ios/Podfile b/mobile/ios/Podfile
index b4e1b4fc8c..1b0ab1d4d2 100644
--- a/mobile/ios/Podfile
+++ b/mobile/ios/Podfile
@@ -1,6 +1,8 @@
# Uncomment this line to define a global platform for your project
platform :ios, '13.0'
+source 'https://github.com/ente-io/ffmpeg-kit-custom-repo-ios.git'
+source 'https://cdn.cocoapods.org/'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock
index 69f0686047..d76dd0c63d 100644
--- a/mobile/ios/Podfile.lock
+++ b/mobile/ios/Podfile.lock
@@ -1,4 +1,6 @@
PODS:
+ - app_links (0.0.2):
+ - Flutter
- background_fetch (1.3.7):
- Flutter
- battery_info (0.0.1):
@@ -12,12 +14,9 @@ PODS:
- Flutter
- device_info_plus (0.0.1):
- Flutter
- - ffmpeg-kit-ios-full-gpl (6.0)
- - ffmpeg_kit_flutter_full_gpl (6.0.3):
- - ffmpeg_kit_flutter_full_gpl/full-gpl (= 6.0.3)
- - Flutter
- - ffmpeg_kit_flutter_full_gpl/full-gpl (6.0.3):
- - ffmpeg-kit-ios-full-gpl (= 6.0)
+ - ffmpeg_kit_custom (6.0.3)
+ - ffmpeg_kit_flutter (6.0.3):
+ - ffmpeg_kit_custom
- Flutter
- file_saver (0.0.1):
- Flutter
@@ -54,8 +53,6 @@ PODS:
- GoogleUtilities/UserDefaults (~> 8.0)
- nanopb (~> 3.30910.0)
- Flutter (1.0.0)
- - flutter_app_icon_changer (0.0.1):
- - Flutter
- flutter_email_sender (0.0.1):
- Flutter
- flutter_image_compress_common (1.0.0):
@@ -111,8 +108,6 @@ PODS:
- Flutter
- image_editor_common (1.0.0):
- Flutter
- - image_picker_ios (0.0.1):
- - Flutter
- in_app_purchase_storekit (0.0.1):
- Flutter
- FlutterMacOS
@@ -195,11 +190,11 @@ PODS:
- SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
- - Sentry/HybridSDK (8.44.0)
- - sentry_flutter (8.13.2):
+ - Sentry/HybridSDK (8.46.0)
+ - sentry_flutter (8.14.1):
- Flutter
- FlutterMacOS
- - Sentry/HybridSDK (= 8.44.0)
+ - Sentry/HybridSDK (= 8.46.0)
- share_plus (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
@@ -231,8 +226,6 @@ PODS:
- Flutter
- ua_client_hints (1.4.1):
- Flutter
- - uni_links (0.0.1):
- - Flutter
- url_launcher_ios (0.0.1):
- Flutter
- video_player_avfoundation (0.0.1):
@@ -247,18 +240,18 @@ PODS:
- Flutter
DEPENDENCIES:
+ - app_links (from `.symlinks/plugins/app_links/ios`)
- background_fetch (from `.symlinks/plugins/background_fetch/ios`)
- battery_info (from `.symlinks/plugins/battery_info/ios`)
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`)
- dart_ui_isolate (from `.symlinks/plugins/dart_ui_isolate/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- - ffmpeg_kit_flutter_full_gpl (from `.symlinks/plugins/ffmpeg_kit_flutter_full_gpl/ios`)
+ - ffmpeg_kit_flutter (from `.symlinks/plugins/ffmpeg_kit_flutter/ios`)
- file_saver (from `.symlinks/plugins/file_saver/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- - flutter_app_icon_changer (from `.symlinks/plugins/flutter_app_icon_changer/ios`)
- flutter_email_sender (from `.symlinks/plugins/flutter_email_sender/ios`)
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
@@ -269,7 +262,6 @@ DEPENDENCIES:
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- home_widget (from `.symlinks/plugins/home_widget/ios`)
- image_editor_common (from `.symlinks/plugins/image_editor_common/ios`)
- - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- launcher_icon_switcher (from `.symlinks/plugins/launcher_icon_switcher/ios`)
@@ -299,7 +291,6 @@ DEPENDENCIES:
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`)
- system_info_plus (from `.symlinks/plugins/system_info_plus/ios`)
- ua_client_hints (from `.symlinks/plugins/ua_client_hints/ios`)
- - uni_links (from `.symlinks/plugins/uni_links/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
- video_thumbnail (from `.symlinks/plugins/video_thumbnail/ios`)
@@ -307,8 +298,9 @@ DEPENDENCIES:
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
SPEC REPOS:
+ https://github.com/ente-io/ffmpeg-kit-custom-repo-ios:
+ - ffmpeg_kit_custom
trunk:
- - ffmpeg-kit-ios-full-gpl
- Firebase
- FirebaseCore
- FirebaseCoreInternal
@@ -329,6 +321,8 @@ SPEC REPOS:
- sqlite3
EXTERNAL SOURCES:
+ app_links:
+ :path: ".symlinks/plugins/app_links/ios"
background_fetch:
:path: ".symlinks/plugins/background_fetch/ios"
battery_info:
@@ -341,8 +335,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/dart_ui_isolate/ios"
device_info_plus:
:path: ".symlinks/plugins/device_info_plus/ios"
- ffmpeg_kit_flutter_full_gpl:
- :path: ".symlinks/plugins/ffmpeg_kit_flutter_full_gpl/ios"
+ ffmpeg_kit_flutter:
+ :path: ".symlinks/plugins/ffmpeg_kit_flutter/ios"
file_saver:
:path: ".symlinks/plugins/file_saver/ios"
firebase_core:
@@ -351,8 +345,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_messaging/ios"
Flutter:
:path: Flutter
- flutter_app_icon_changer:
- :path: ".symlinks/plugins/flutter_app_icon_changer/ios"
flutter_email_sender:
:path: ".symlinks/plugins/flutter_email_sender/ios"
flutter_image_compress_common:
@@ -373,8 +365,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/home_widget/ios"
image_editor_common:
:path: ".symlinks/plugins/image_editor_common/ios"
- image_picker_ios:
- :path: ".symlinks/plugins/image_picker_ios/ios"
in_app_purchase_storekit:
:path: ".symlinks/plugins/in_app_purchase_storekit/darwin"
integration_test:
@@ -433,8 +423,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/system_info_plus/ios"
ua_client_hints:
:path: ".symlinks/plugins/ua_client_hints/ios"
- uni_links:
- :path: ".symlinks/plugins/uni_links/ios"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
video_player_avfoundation:
@@ -447,84 +435,82 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
- background_fetch: 39f11371c0dce04b001c4bfd5e782bcccb0a85e2
- battery_info: b6c551049266af31556b93c9d9b9452cfec0219f
- connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
- cupertino_http: 947a233f40cfea55167a49f2facc18434ea117ba
- dart_ui_isolate: d5bcda83ca4b04f129d70eb90110b7a567aece14
- device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
- ffmpeg-kit-ios-full-gpl: 80adc341962e55ef709e36baa8ed9a70cf4ea62b
- ffmpeg_kit_flutter_full_gpl: 8d15c14c0c3aba616fac04fe44b3d27d02e3c330
- file_saver: 503e386464dbe118f630e17b4c2e1190fa0cf808
+ app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
+ background_fetch: 94b36ee293e82972852dba8ede1fbcd3bd3d9d57
+ battery_info: 83f3aae7be2fccefab1d2bf06b8aa96f11c8bcdd
+ connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
+ cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c
+ dart_ui_isolate: 46f6714abe6891313267153ef6f9748d8ecfcab1
+ device_info_plus: 335f3ce08d2e174b9fdc3db3db0f4e3b1f66bd89
+ ffmpeg_kit_custom: 682b4f2f1ff1f8abae5a92f6c3540f2441d5be99
+ ffmpeg_kit_flutter: 915b345acc97d4142e8a9a8549d177ff10f043f5
+ file_saver: 6cdbcddd690cb02b0c1a0c225b37cd805c2bf8b6
Firebase: d80354ed7f6df5f9aca55e9eb47cc4b634735eaf
- firebase_core: 6e223dfa350b2edceb729cea505eaaef59330682
- firebase_messaging: 07fde77ae28c08616a1d4d870450efc2b38cf40d
+ firebase_core: 6cbed78b4f298ed103a9fd034e6dbc846320480f
+ firebase_messaging: 5e0adf2eb18b0ee59aa0c109314c091a0497ecac
FirebaseCore: 99fe0c4b44a39f37d99e6404e02009d2db5d718d
FirebaseCoreInternal: df24ce5af28864660ecbd13596fc8dd3a8c34629
FirebaseInstallations: 6c963bd2a86aca0481eef4f48f5a4df783ae5917
FirebaseMessaging: 487b634ccdf6f7b7ff180fdcb2a9935490f764e8
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
- flutter_app_icon_changer: e633ce623d36db4dd63c01e4b63fc8a5d44ed48d
- flutter_email_sender: e03bdda7637bcd3539bfe718fddd980e9508efaa
- flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
- flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
- flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
- flutter_native_splash: f71420956eb811e6d310720fee915f1d42852e7a
- flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
- flutter_sodium: a00383520fc689c688b66fd3092984174712493e
- fluttertoast: 21eecd6935e7064cc1fcb733a4c5a428f3f24f0f
+ flutter_email_sender: aa1e9772696691d02cd91fea829856c11efb8e58
+ flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
+ flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
+ flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
+ flutter_native_splash: 6cad9122ea0fad137d23137dd14b937f3e90b145
+ flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418
+ flutter_sodium: 7e4621538491834eba53bd524547854bcbbd6987
+ fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
- home_widget: 0434835a4c9a75704264feff6be17ea40e0f0d57
- image_editor_common: d6f6644ae4a6de80481e89fe6d0a8c49e30b4b43
- image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
- in_app_purchase_storekit: a1ce04056e23eecc666b086040239da7619cd783
- integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
- launcher_icon_switcher: 8e0ad2131a20c51c1dd939896ee32e70cd845b37
+ home_widget: f169fc41fd807b4d46ab6615dc44d62adbf9f64f
+ image_editor_common: 3de87e7c4804f4ae24c8f8a998362b98c105cac1
+ in_app_purchase_storekit: d1a48cb0f8b29dbf5f85f782f5dd79b21b90a5e6
+ integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
+ launcher_icon_switcher: 84c218d233505aa7d8655d8fa61a3ba802c022da
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
- local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
- local_auth_ios: 5046a18c018dd973247a0564496c8898dbb5adf9
+ local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
+ local_auth_ios: f7a1841beef3151d140a967c2e46f30637cdf451
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
- maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203
- media_extension: 6618f07abd762cdbfaadf1b0c56a287e820f0c84
- media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
- media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
- motion_sensors: 03f55b7c637a7e365a0b5f9697a449f9059d5d91
- motionphoto: 8b65ce50c7d7ff3c767534fc3768b2eed9ac24e4
- move_to_background: cd3091014529ec7829e342ad2d75c0a11f4378a5
+ maps_launcher: edf829809ba9e894d70e569bab11c16352dedb45
+ media_extension: 671e2567880d96c95c65c9a82ccceed8f2e309fd
+ media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
+ media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
+ motion_sensors: 741e702c17467b9569a92165dda8d4d88c6167f1
+ motionphoto: 23e2aeb5c6380112f69468d71f970fa7438e5ed1
+ move_to_background: 7e3467dd2a1d1013e98c9c1cb93fd53cd7ef9d84
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
- native_video_player: 5d36066807b680e181473e6890dde643ac85380d
- objective_c: 77e887b5ba1827970907e10e832eec1683f3431d
- onnxruntime: e7c2ae44385191eaad5ae64c935a72debaddc997
+ native_video_player: e363dd14f6a498ad8a8f7e6486a0db046ad19f13
+ objective_c: 89e720c30d716b036faf9c9684022048eee1eee2
+ onnxruntime: f9b296392c96c42882be020a59dbeac6310d81b2
onnxruntime-c: a909204639a1f035f575127ac406f781ac797c9c
onnxruntime-objc: b6fab0f1787aa6f7190c2013f03037df4718bd8b
- open_mail_app: 70273c53f768beefdafbe310c3d9086e4da3cb02
+ open_mail_app: 7314a609e88eed22d53671279e189af7a0ab0f11
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
- package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
- path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
- permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
- photo_manager: ff695c7a1dd5bc379974953a2b5c0a293f7c4c8a
- privacy_screen: 1a131c052ceb3c3659934b003b0d397c2381a24e
+ package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
+ path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
+ permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
+ photo_manager: d2fbcc0f2d82458700ee6256a15018210a81d413
+ privacy_screen: 3159a541f5d3a31bea916cfd4e58f9dc722b3fd4
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
- receive_sharing_intent: 79c848f5b045674ad60b9fea3bafea59962ad2c1
+ receive_sharing_intent: 222384f00ffe7e952bbfabaa9e3967cb87e5fe00
SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
- Sentry: 0f9bc9adfc0b960e7f3bb5ec67e9a3d8193f3bdb
- sentry_flutter: 64a43fb39ab4c7f67d8a4cad52b49e22439e58b7
- share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
- shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
- sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
+ Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
+ sentry_flutter: 942017adbe00f963061cb11ec260414a990b7a42
+ share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
+ shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
+ sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
- sqlite3_flutter_libs: 069c435986dd4b63461aecd68f4b30be4a9e9daa
- system_info_plus: 5393c8da281d899950d751713575fbf91c7709aa
- ua_client_hints: aeabd123262c087f0ce151ef96fa3ab77bfc8b38
- uni_links: 103d3319e3383ed8bce559b96b1e219fbf02ba96
- url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
- video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
- video_thumbnail: 94ba6705afbaa120b77287080424930f23ea0c40
- volume_controller: 2e3de73d6e7e81a0067310d17fb70f2f86d71ac7
- wakelock_plus: 373cfe59b235a6dd5837d0fb88791d2f13a90d56
+ sqlite3_flutter_libs: 3c323550ef3b928bc0aa9513c841e45a7d242832
+ system_info_plus: 555ce7047fbbf29154726db942ae785c29211740
+ ua_client_hints: 92fe0d139619b73ec9fcb46cc7e079a26178f586
+ url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
+ video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
+ video_thumbnail: 584ccfa55d8fd2f3d5507218b0a18d84c839c620
+ volume_controller: 3657a1f65bedb98fa41ff7dc5793537919f31b12
+ wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49
-PODFILE CHECKSUM: 20e086e6008977d43a3d40260f3f9bffcac748dd
+PODFILE CHECKSUM: a8ef88ad74ba499756207e7592c6071a96756d18
COCOAPODS: 1.16.2
diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj
index ee7eaf5710..678d1e3446 100644
--- a/mobile/ios/Runner.xcodeproj/project.pbxproj
+++ b/mobile/ios/Runner.xcodeproj/project.pbxproj
@@ -19,7 +19,7 @@
CEE6BE702D7AE7FD00E4048B /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DACD83C2B755B0600BA9516 /* WidgetKit.framework */; };
CEE6BE712D7AE7FD00E4048B /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DACD83E2B755B0600BA9516 /* SwiftUI.framework */; };
CEE6BE7C2D7AE7FE00E4048B /* EnteMemoryWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = CEE6BE6F2D7AE7FD00E4048B /* EnteMemoryWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
- DA6BE5E826B3BC8600656280 /* (null) in Resources */ = {isa = PBXBuildFile; };
+ DA6BE5E826B3BC8600656280 /* BuildFile in Resources */ = {isa = PBXBuildFile; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -86,7 +86,7 @@
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
- CEE6BE802D7AE7FE00E4048B /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
+ CEE6BE802D7AE7FE00E4048B /* Exceptions for "EnteMemoryWidget" folder in "EnteMemoryWidgetExtension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
@@ -96,7 +96,18 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
- CEE6BE722D7AE7FD00E4048B /* EnteMemoryWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (CEE6BE802D7AE7FE00E4048B /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EnteMemoryWidget; sourceTree = ""; };
+ CEE6BE722D7AE7FD00E4048B /* EnteMemoryWidget */ = {
+ isa = PBXFileSystemSynchronizedRootGroup;
+ exceptions = (
+ CEE6BE802D7AE7FE00E4048B /* Exceptions for "EnteMemoryWidget" folder in "EnteMemoryWidgetExtension" target */,
+ );
+ explicitFileTypes = {
+ };
+ explicitFolders = (
+ );
+ path = EnteMemoryWidget;
+ sourceTree = "";
+ };
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
@@ -246,8 +257,6 @@
CEE6BE722D7AE7FD00E4048B /* EnteMemoryWidget */,
);
name = EnteMemoryWidgetExtension;
- packageProductDependencies = (
- );
productName = EnteMemoryWidgetExtension;
productReference = CEE6BE6F2D7AE7FD00E4048B /* EnteMemoryWidgetExtension.appex */;
productType = "com.apple.product-type.app-extension";
@@ -300,7 +309,7 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
- DA6BE5E826B3BC8600656280 /* (null) in Resources */,
+ DA6BE5E826B3BC8600656280 /* BuildFile in Resources */,
277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -365,6 +374,7 @@
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
"${BUILT_PRODUCTS_DIR}/SDWebImageWebPCoder/SDWebImageWebPCoder.framework",
"${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework",
+ "${BUILT_PRODUCTS_DIR}/app_links/app_links.framework",
"${BUILT_PRODUCTS_DIR}/background_fetch/background_fetch.framework",
"${BUILT_PRODUCTS_DIR}/battery_info/battery_info.framework",
"${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework",
@@ -372,7 +382,6 @@
"${BUILT_PRODUCTS_DIR}/dart_ui_isolate/dart_ui_isolate.framework",
"${BUILT_PRODUCTS_DIR}/device_info_plus/device_info_plus.framework",
"${BUILT_PRODUCTS_DIR}/file_saver/file_saver.framework",
- "${BUILT_PRODUCTS_DIR}/flutter_app_icon_changer/flutter_app_icon_changer.framework",
"${BUILT_PRODUCTS_DIR}/flutter_email_sender/flutter_email_sender.framework",
"${BUILT_PRODUCTS_DIR}/flutter_image_compress_common/flutter_image_compress_common.framework",
"${BUILT_PRODUCTS_DIR}/flutter_inappwebview_ios/flutter_inappwebview_ios.framework",
@@ -383,7 +392,6 @@
"${BUILT_PRODUCTS_DIR}/fluttertoast/fluttertoast.framework",
"${BUILT_PRODUCTS_DIR}/home_widget/home_widget.framework",
"${BUILT_PRODUCTS_DIR}/image_editor_common/image_editor_common.framework",
- "${BUILT_PRODUCTS_DIR}/image_picker_ios/image_picker_ios.framework",
"${BUILT_PRODUCTS_DIR}/in_app_purchase_storekit/in_app_purchase_storekit.framework",
"${BUILT_PRODUCTS_DIR}/integration_test/integration_test.framework",
"${BUILT_PRODUCTS_DIR}/launcher_icon_switcher/launcher_icon_switcher.framework",
@@ -414,20 +422,19 @@
"${BUILT_PRODUCTS_DIR}/sqlite3_flutter_libs/sqlite3_flutter_libs.framework",
"${BUILT_PRODUCTS_DIR}/system_info_plus/system_info_plus.framework",
"${BUILT_PRODUCTS_DIR}/ua_client_hints/ua_client_hints.framework",
- "${BUILT_PRODUCTS_DIR}/uni_links/uni_links.framework",
"${BUILT_PRODUCTS_DIR}/url_launcher_ios/url_launcher_ios.framework",
"${BUILT_PRODUCTS_DIR}/video_player_avfoundation/video_player_avfoundation.framework",
"${BUILT_PRODUCTS_DIR}/video_thumbnail/video_thumbnail.framework",
"${BUILT_PRODUCTS_DIR}/volume_controller/volume_controller.framework",
"${BUILT_PRODUCTS_DIR}/wakelock_plus/wakelock_plus.framework",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/ffmpegkit.framework/ffmpegkit",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavcodec.framework/libavcodec",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavdevice.framework/libavdevice",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavfilter.framework/libavfilter",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavformat.framework/libavformat",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libavutil.framework/libavutil",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libswresample.framework/libswresample",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg-kit-ios-full-gpl/libswscale.framework/libswscale",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/ffmpegkit.framework/ffmpegkit",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavcodec.framework/libavcodec",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavdevice.framework/libavdevice",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavfilter.framework/libavfilter",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavformat.framework/libavformat",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libavutil.framework/libavutil",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libswresample.framework/libswresample",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ffmpeg_kit_custom/libswscale.framework/libswscale",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Ass.framework/Ass",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Avcodec.framework/Avcodec",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/media_kit_libs_ios_video/Avfilter.framework/Avfilter",
@@ -461,6 +468,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageWebPCoder.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/app_links.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/background_fetch.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/battery_info.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework",
@@ -468,7 +476,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/dart_ui_isolate.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_saver.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_app_icon_changer.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_email_sender.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_image_compress_common.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview_ios.framework",
@@ -479,7 +486,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/fluttertoast.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/home_widget.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_editor_common.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/in_app_purchase_storekit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/integration_test.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/launcher_icon_switcher.framework",
@@ -510,7 +516,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3_flutter_libs.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/system_info_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ua_client_hints.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/uni_links.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_ios.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player_avfoundation.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_thumbnail.framework",
diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift
index 3f14877d91..f1a6bbe1bf 100644
--- a/mobile/ios/Runner/AppDelegate.swift
+++ b/mobile/ios/Runner/AppDelegate.swift
@@ -1,6 +1,7 @@
+import AVFoundation
import Flutter
import UIKit
-import AVFoundation
+import app_links
@main
@objc class AppDelegate: FlutterAppDelegate {
@@ -13,34 +14,16 @@ import AVFoundation
UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}
- let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
- let audioSessionChannel = FlutterMethodChannel(name: "io.ente.frame/audio_session",
- binaryMessenger: controller.binaryMessenger)
-
- audioSessionChannel.setMethodCallHandler({
- (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
- if call.method == "setAudioSessionCategory" {
- self.setAudioSessionCategory(result: result)
- } else {
- result(FlutterMethodNotImplemented)
- }
- })
-
GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-
- private func setAudioSessionCategory(result: @escaping FlutterResult) {
- do {
- try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.mixWithOthers, .defaultToSpeaker])
- try AVAudioSession.sharedInstance().setActive(true)
- result(nil)
- } catch {
- result(FlutterError(code: "AUDIO_SESSION_ERROR",
- message: "Failed to set audio session category",
- details: error.localizedDescription))
+ // Retrieve the link from parameters
+ if let url = AppLinks.shared.getLink(launchOptions: launchOptions) {
+ // We have a link, propagate it to your Flutter app or not
+ AppLinks.shared.handleLink(url: url)
+ return true // Returning true will stop the propagation to other packages
}
+
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func applicationDidBecomeActive(_ application: UIApplication) {
diff --git a/mobile/ios/Runner/Assets.xcassets/IconDark.appiconset/IconDarkDark.png b/mobile/ios/Runner/Assets.xcassets/IconDark.appiconset/IconDarkDark.png
index 5ce8a224d7..ed48680046 100644
Binary files a/mobile/ios/Runner/Assets.xcassets/IconDark.appiconset/IconDarkDark.png and b/mobile/ios/Runner/Assets.xcassets/IconDark.appiconset/IconDarkDark.png differ
diff --git a/mobile/ios/Runner/Assets.xcassets/IconGreen.appiconset/IconGreenDark.png b/mobile/ios/Runner/Assets.xcassets/IconGreen.appiconset/IconGreenDark.png
index 5ce8a224d7..ed48680046 100644
Binary files a/mobile/ios/Runner/Assets.xcassets/IconGreen.appiconset/IconGreenDark.png and b/mobile/ios/Runner/Assets.xcassets/IconGreen.appiconset/IconGreenDark.png differ
diff --git a/mobile/ios/Runner/Assets.xcassets/IconLight.appiconset/IconLightDark.png b/mobile/ios/Runner/Assets.xcassets/IconLight.appiconset/IconLightDark.png
index 5ce8a224d7..ed48680046 100644
Binary files a/mobile/ios/Runner/Assets.xcassets/IconLight.appiconset/IconLightDark.png and b/mobile/ios/Runner/Assets.xcassets/IconLight.appiconset/IconLightDark.png differ
diff --git a/mobile/lib/audio_session_handler.dart b/mobile/lib/audio_session_handler.dart
deleted file mode 100644
index 8aede31b12..0000000000
--- a/mobile/lib/audio_session_handler.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-import "package:flutter/services.dart";
-import "package:logging/logging.dart";
-
-class AudioSessionHandler {
- static final _logger = Logger("AudioSessionHandler");
- static const MethodChannel _channel =
- MethodChannel('io.ente.frame/audio_session');
-
- static Future setAudioSessionCategory() async {
- try {
- await _channel.invokeMethod('setAudioSessionCategory');
- } on PlatformException catch (e) {
- _logger.warning("Failed to set audio session category: '${e.message}'.");
- }
- }
-}
diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart
index c110a3a100..32a9e6389e 100644
--- a/mobile/lib/core/configuration.dart
+++ b/mobile/lib/core/configuration.dart
@@ -33,7 +33,6 @@ import 'package:photos/services/sync/sync_service.dart';
import 'package:photos/utils/file_uploader.dart';
import "package:photos/utils/lock_screen_settings.dart";
import 'package:photos/utils/validator_util.dart';
-import "package:photos/utils/wakelock_util.dart";
import 'package:shared_preferences/shared_preferences.dart';
import "package:tuple/tuple.dart";
import 'package:uuid/uuid.dart';
@@ -53,10 +52,6 @@ class Configuration {
static const keyKey = "key";
static const keyShouldBackupOverMobileData = "should_backup_over_mobile_data";
static const keyShouldBackupVideos = "should_backup_videos";
-
- // keyShouldKeepDeviceAwake is used to determine whether the device screen
- // should be kept on while the app is in foreground.
- static const keyShouldKeepDeviceAwake = "should_keep_device_awake";
static const keyShowSystemLockScreen = "should_show_lock_screen";
static const keyHasSelectedAnyBackupFolder =
"has_selected_any_folder_for_backup";
@@ -84,14 +79,14 @@ class Configuration {
late String _sharedDocumentsMediaDirectory;
String? _volatilePassword;
- final _secureStorageOptionsIOS = const IOSOptions(
- accessibility: KeychainAccessibility.first_unlock_this_device,
- );
-
Future init() async {
try {
_preferences = await SharedPreferences.getInstance();
- _secureStorage = const FlutterSecureStorage();
+ _secureStorage = const FlutterSecureStorage(
+ iOptions: IOSOptions(
+ accessibility: KeychainAccessibility.first_unlock_this_device,
+ ),
+ );
_documentsDirectory = (await getApplicationDocumentsDirectory()).path;
_tempDocumentsDirPath = _documentsDirectory + "/temp/";
final tempDocumentsDir = Directory(_tempDocumentsDirPath);
@@ -104,15 +99,13 @@ class Configuration {
_documentsDirectory + "/ente-shared-media";
Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true);
if (!_preferences.containsKey(tokenKey)) {
- await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS);
+ await _secureStorage.deleteAll();
} else {
_key = await _secureStorage.read(
key: keyKey,
- iOptions: _secureStorageOptionsIOS,
);
_secretKey = await _secureStorage.read(
key: secretKeyKey,
- iOptions: _secureStorageOptionsIOS,
);
if (_key == null) {
await logout(autoLogout: true);
@@ -191,7 +184,7 @@ class Configuration {
}
}
await _preferences.clear();
- await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS);
+ await _secureStorage.deleteAll();
_key = null;
_cachedToken = null;
_secretKey = null;
@@ -428,6 +421,13 @@ class Configuration {
return _preferences.getString(endPointKey) ?? endpoint;
}
+ // isEnteProduction checks if the current endpoint is the default production
+ // endpoint. This is used to determine if the app is in production mode or
+ // not. The default production endpoint is set in the environment variable
+ bool isEnteProduction() {
+ return getHttpEndpoint() == kDefaultProductionEndpoint;
+ }
+
Future setHttpEndpoint(String endpoint) async {
await _preferences.setString(endPointKey, endpoint);
Bus.instance.fire(EndpointUpdatedEvent());
@@ -499,13 +499,11 @@ class Configuration {
// Used to clear key from secure storage
await _secureStorage.delete(
key: keyKey,
- iOptions: _secureStorageOptionsIOS,
);
} else {
await _secureStorage.write(
key: keyKey,
value: key,
- iOptions: _secureStorageOptionsIOS,
);
}
}
@@ -516,13 +514,11 @@ class Configuration {
// Used to clear secret key from secure storage
await _secureStorage.delete(
key: secretKeyKey,
- iOptions: _secureStorageOptionsIOS,
);
} else {
await _secureStorage.write(
key: secretKeyKey,
value: secretKey,
- iOptions: _secureStorageOptionsIOS,
);
}
}
@@ -584,16 +580,6 @@ class Configuration {
}
}
- bool shouldKeepDeviceAwake() {
- final keepAwake = _preferences.get(keyShouldKeepDeviceAwake);
- return keepAwake == null ? false : keepAwake as bool;
- }
-
- Future setShouldKeepDeviceAwake(bool value) async {
- await _preferences.setBool(keyShouldKeepDeviceAwake, value);
- await EnteWakeLock.toggle(enable: value);
- }
-
Future setShouldBackupVideos(bool value) async {
await _preferences.setBool(keyShouldBackupVideos, value);
if (value) {
@@ -656,12 +642,10 @@ class Configuration {
await _secureStorage.write(
key: keyKey,
value: _key,
- iOptions: _secureStorageOptionsIOS,
);
await _secureStorage.write(
key: secretKeyKey,
value: _secretKey,
- iOptions: _secureStorageOptionsIOS,
);
await _preferences.setBool(
hasMigratedSecureStorageKey,
diff --git a/mobile/lib/core/constants.dart b/mobile/lib/core/constants.dart
index 163399acb8..78f3db6bad 100644
--- a/mobile/lib/core/constants.dart
+++ b/mobile/lib/core/constants.dart
@@ -27,8 +27,8 @@ const subGalleryMultiplier = 10;
// used to identify which ente file are available in app cache
const String sharedMediaIdentifier = 'ente-shared-media://';
-const thumbnailDiskLoadDeferDuration = Duration(milliseconds: 40);
-const thumbnailServerLoadDeferDuration = Duration(milliseconds: 80);
+const galleryThumbnailDiskLoadDeferDuration = Duration(milliseconds: 500);
+const galleryThumbnailServerLoadDeferDuration = Duration(milliseconds: 80);
// 256 bit key maps to 24 words
// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#Generating_the_mnemonic
diff --git a/mobile/lib/db/files_db.dart b/mobile/lib/db/files_db.dart
index 6fb89a9d77..ae702d92b4 100644
--- a/mobile/lib/db/files_db.dart
+++ b/mobile/lib/db/files_db.dart
@@ -1588,25 +1588,6 @@ class FilesDB with SqlDbBase {
return files;
}
- Future> getGeneratedIDForFilesOlderThan(
- int cutOffTime,
- int ownerID,
- ) async {
- final db = await instance.sqliteAsyncDB;
- final rows = await db.getAll(
- '''
- SELECT DISTINCT $columnGeneratedID FROM $filesTable
- WHERE $columnCreationTime <= ? AND ($columnOwnerID IS NULL OR $columnOwnerID = ?)
- ''',
- [cutOffTime, ownerID],
- );
- final result = [];
- for (final row in rows) {
- result.add(row[columnGeneratedID].toString());
- }
- return result;
- }
-
// For givenUserID, get List of unique LocalIDs for files which are
// uploaded by the given user and location is missing
Future> getLocalIDsForFilesWithoutLocation(int ownerID) async {
@@ -1643,23 +1624,6 @@ class FilesDB with SqlDbBase {
return result;
}
- // For a given userID, return unique localID for all uploaded live photos
- Future> getLivePhotosForUser(int userId) async {
- final db = await instance.sqliteAsyncDB;
- final rows = await db.getAll(
- '''
- SELECT DISTINCT $columnLocalID FROM $filesTable
- WHERE $columnOwnerID = ? AND $columnFileType = ? AND $columnLocalID IS NOT NULL
- ''',
- [userId, getInt(FileType.livePhoto)],
- );
- final result = [];
- for (final row in rows) {
- result.add(row[columnLocalID] as String);
- }
- return result;
- }
-
Future> getLocalFilesBackedUpWithoutLocation(int userId) async {
final db = await instance.sqliteAsyncDB;
final rows = await db.getAll(
@@ -1720,6 +1684,9 @@ class FilesDB with SqlDbBase {
AND $columnCreationTime > ?
AND $columnUploadedFileID != -1
AND $columnOwnerID = $userID
+ AND $columnLocalID IS NOT NULL
+ AND ($columnFileSize IS NULL OR $columnFileSize <= 524288000)
+ AND ($columnDuration IS NULL OR $columnDuration <= 60)
ORDER BY $columnCreationTime DESC
''',
[getInt(fileType), beginDate.microsecondsSinceEpoch],
@@ -1750,25 +1717,6 @@ class FilesDB with SqlDbBase {
return deduplicatedFiles;
}
- Future