From ba1af08051aa74cdd75a425218200befc20b424b Mon Sep 17 00:00:00 2001
From: Leendert de Borst <6917405+lanedirt@users.noreply.github.com>
Date: Sun, 21 Jun 2026 13:45:24 +0200
Subject: [PATCH] Update aliasvault.net to aliasvault.com in all apps as
default URL (#2199)
---
.env.example | 2 +-
.github/ISSUE_TEMPLATE/config.yml | 2 +-
.github/workflows/release.yml | 18 +++++-----
ARCHITECTURE.md | 4 +--
CONTRIBUTING.md | 4 +--
README.md | 10 +++---
.../src/entrypoints/background.ts | 11 ++++++
.../popup/pages/auth/AuthSettings.tsx | 4 +--
.../entrypoints/popup/utils/ApiUrlUtility.ts | 2 +-
.../0.29.7-LegacyApiUrlMigration.ts | 34 +++++++++++++++++++
.../browser-extension/src/migrations/index.ts | 14 ++++++++
apps/browser-extension/src/utils/AppInfo.ts | 4 +--
.../EncryptionUtility.crypto.test.ts | 3 +-
.../aliasvault/app/webapi/WebApiService.kt | 2 +-
.../app/(tabs)/settings/android-autofill.tsx | 2 +-
apps/mobile-app/app/_layout.tsx | 4 ++-
apps/mobile-app/app/login-settings.tsx | 2 +-
apps/mobile-app/app/login.tsx | 2 +-
apps/mobile-app/i18n/locales/en.json | 1 -
.../AliasVaultUITests/AliasVaultUITests.swift | 2 +-
.../Services/WebApiService.swift | 2 +-
.../0.29.7-LegacyApiUrlMigration.ts | 28 +++++++++++++++
apps/mobile-app/migrations/index.ts | 14 ++++++++
apps/mobile-app/utils/ApiUrlUtility.ts | 2 +-
apps/mobile-app/utils/AppInfo.ts | 4 +--
apps/server/AliasVault.Admin/Dockerfile | 2 +-
apps/server/AliasVault.Api/Dockerfile | 2 +-
apps/server/AliasVault.Client/Dockerfile | 2 +-
.../Main/Pages/Settings/General.razor | 2 +-
.../server/Databases/AliasServerDb/Dockerfile | 2 +-
apps/server/Dockerfile | 2 +-
.../AliasVault.SmtpService/Dockerfile | 2 +-
.../Services/AliasVault.TaskRunner/Dockerfile | 2 +-
.../TestData/TestImportBitwarden.csv | 2 +-
.../Tests/Client/Shard3/ImportTests.cs | 4 +--
.../TestData/Exports/bitwarden.csv | 2 +-
.../Utilities/ImportExportTests.cs | 4 +--
dockerfiles/all-in-one/Dockerfile | 2 +-
docs/docs/contributing/ui-translations.md | 2 +-
39 files changed, 156 insertions(+), 53 deletions(-)
create mode 100644 apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts
create mode 100644 apps/browser-extension/src/migrations/index.ts
create mode 100644 apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts
create mode 100644 apps/mobile-app/migrations/index.ts
diff --git a/.env.example b/.env.example
index ee53e2914..5046594a1 100644
--- a/.env.example
+++ b/.env.example
@@ -35,7 +35,7 @@ FORCE_HTTPS_REDIRECT=true
# In order to use AliasVault's private email domains feature, you need to configure
# your DNS. Please refer to the full documentation for more instructions on DNS:
-# https://docs.aliasvault.net/installation/install.html#3-email-server-setup
+# https://docs.aliasvault.com/installation/script/#3-email-server-setup
#
# Set the private email domains below that the server should accept incoming mail for (comma separated values).
# Example: PRIVATE_EMAIL_DOMAINS=example.com,example2.org
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 30b3a52ff..bc8c5f48f 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -4,5 +4,5 @@ contact_links:
url: https://discord.gg/DsaXMTEtpF
about: Ask questions and discuss ideas with the community on Discord
- name: 📖 Documentation
- url: https://docs.aliasvault.net
+ url: https://docs.aliasvault.com
about: Check out the official (self-host) documentation
\ No newline at end of file
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6613ba063..3a5805028 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -375,31 +375,31 @@ jobs:
- image: client
dockerfile: apps/server/AliasVault.Client/Dockerfile
title: AliasVault Client
- description: Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: postgres
dockerfile: apps/server/Databases/AliasServerDb/Dockerfile
title: AliasVault PostgreSQL
- description: PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: api
dockerfile: apps/server/AliasVault.Api/Dockerfile
title: AliasVault API
- description: REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: admin
dockerfile: apps/server/AliasVault.Admin/Dockerfile
title: AliasVault Admin
- description: Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: reverse-proxy
dockerfile: apps/server/Dockerfile
title: AliasVault Reverse Proxy
- description: Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: smtp
dockerfile: apps/server/Services/AliasVault.SmtpService/Dockerfile
title: AliasVault SMTP Service
- description: SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: task-runner
dockerfile: apps/server/Services/AliasVault.TaskRunner/Dockerfile
title: AliasVault TaskRunner
- description: Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)
+ description: Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)
- image: installcli
dockerfile: apps/server/Utilities/AliasVault.InstallCli/Dockerfile
title: AliasVault Install CLI
@@ -499,9 +499,9 @@ jobs:
type=raw,value={{branch}}-{{sha}},enable=${{ needs.detect-version.outputs.version == '' }}
labels: |
org.opencontainers.image.title=AliasVault All-in-One
- org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net).
+ org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com).
annotations: |
- org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net).
+ org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com).
- name: Build and push all-in-one image
uses: docker/build-push-action@v7
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 9cede33eb..7e35acaec 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -27,7 +27,7 @@ The following encryption algorithms and standards are used by AliasVault:
Below is a detailed explanation of each encryption algorithm and standard.
-For more information about how these algorithms are specifically used in AliasVault, see the [Architecture Documentation](https://docs.aliasvault.net/architecture) section on the documentation site.
+For more information about how these algorithms are specifically used in AliasVault, see the [Architecture Documentation](https://docs.aliasvault.com/architecture) section on the documentation site.
### Argon2id
To derive a key from the master password, AliasVault uses the Argon2id key derivation function. Argon2id is a memory-hard
@@ -164,4 +164,4 @@ The mobile login system combines RSA-2048 asymmetric encryption with AES-256-GCM
- **MITM Protection**: Only the client with the RSA private key can decrypt the response
- **Limited Attack Surface**: Short timeout window minimizes QR code interception risks
-More information about the mobile login flow can be found in the [Architecture Documentation](https://docs.aliasvault.net/architecture/#6-login-with-mobile).
+More information about the mobile login flow can be found in the [Architecture Documentation](https://docs.aliasvault.com/architecture/#6-login-with-mobile).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 75efccfd0..cc17a7a51 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -44,7 +44,7 @@ In AliasVault, when creating a new credential AliasVault automatically generates
- Create a list of common last names (surnames)
- Optionally: Decade-specific names for more authentic generations
-Read the specific instructions on how to contribute here: [Identity Generator Translations](https://docs.aliasvault.net/contributing/identity-generator.html).
+Read the specific instructions on how to contribute here: [Identity Generator Translations](https://docs.aliasvault.com/contributing/identity-generator.html).
## 3. Contributing to the Documentation
@@ -77,7 +77,7 @@ That said, we genuinely appreciate your ideas and proposals for UI/UX improvemen
### 4.2 Set up your local development environment
You can find instructions on how to get your local development environment setup for the different parts of the AliasVault codebase here:
-https://docs.aliasvault.net/misc/dev/
+https://docs.aliasvault.com/misc/dev/
> Tip: if the URL above is not available, the raw doc pages can also be found in the `docs` folder in this repository.
diff --git a/README.md b/README.md
index a8c0fda48..3a139db3c 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ AliasVault is a privacy-first password and email alias manager. Create unique id
[
](https://discord.gg/DsaXMTEtpF)
[
](https://opencollective.com/aliasvault)
-Try the cloud version 🔥 | Website | Documentation | Self-host instructions
+Try the cloud version 🔥 | Website | Documentation | Self-host instructions
**⭐ Star us on GitHub, it motivates us a lot!**
@@ -49,10 +49,10 @@ Built on 15 years of experience, AliasVault is independent, open-source, self-ho
## Cloud-hosted
-Use the official cloud version of AliasVault at [app.aliasvault.net](https://app.aliasvault.net). This fully supported platform is always up to date with our latest release.
+Use the official cloud version of AliasVault at [app.aliasvault.com](https://app.aliasvault.com). This fully supported platform is always up to date with our latest release.
AliasVault is available on:
-- [Web (universal)](https://app.aliasvault.net)
+- [Web (universal)](https://app.aliasvault.com)
- [Chrome](https://chromewebstore.google.com/detail/aliasvault/bmoggiinmnodjphdjnmpcnlleamkfedj)
- [Firefox](https://addons.mozilla.org/en-US/firefox/addon/aliasvault/)
- [Edge](https://microsoftedge.microsoft.com/addons/detail/aliasvault/kabaanafahnjkfkplbnllebdmppdemfo)
@@ -65,7 +65,7 @@ AliasVault is available on:
-[
](https://app.aliasvault.net)
+[
](https://app.aliasvault.com)
## Self-hosting
> [!NOTE]
@@ -96,7 +96,7 @@ For more information about the installation process, manual setup instructions a
- [Documentation website (docs.aliasvault.com) 📚](https://docs.aliasvault.com)
## Security Architecture
-
+
AliasVault takes security seriously and implements various measures to protect your data:
diff --git a/apps/browser-extension/src/entrypoints/background.ts b/apps/browser-extension/src/entrypoints/background.ts
index 488cd9836..a74aeaa1e 100644
--- a/apps/browser-extension/src/entrypoints/background.ts
+++ b/apps/browser-extension/src/entrypoints/background.ts
@@ -17,6 +17,8 @@ import type { MatchingPasskeysResponse, WebAuthnAssertionResponse, WebAuthnPubli
import { isRpIdAllowedForHost, validateWebAuthnRequest } from '@/utils/passkey/WebAuthnRequestValidation';
import type { WebAuthnBridgeRequest } from '@/utils/passkey/WebAuthnRequestValidation';
+import { runStartupMigrations } from '@/migrations';
+
import { defineBackground, browser } from '#imports';
type WebAuthnMessageSender = {
@@ -329,6 +331,15 @@ export default defineBackground({
* already synchronous and complete before this runs.
*/
(async () : Promise => {
+ try {
+ /*
+ * Run one-time startup migrations.
+ */
+ await runStartupMigrations();
+ } catch (error) {
+ console.error('Error running startup migrations:', error);
+ }
+
try {
const isContextMenuEnabled = await LocalPreferencesService.getGlobalContextMenuEnabled();
if (isContextMenuEnabled) {
diff --git a/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx b/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx
index 2518a2bfa..f85abfc6c 100644
--- a/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx
+++ b/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx
@@ -16,7 +16,7 @@ type ApiOption = {
};
const DEFAULT_OPTIONS: ApiOption[] = [
- { label: 'Aliasvault.net', value: AppInfo.DEFAULT_API_URL },
+ { label: 'AliasVault.com', value: AppInfo.DEFAULT_API_URL },
{ label: 'Self-hosted', value: 'custom' }
];
@@ -165,7 +165,7 @@ const AuthSettings: React.FC = () => {
} catch (error: unknown) {
if (error instanceof Yup.ValidationError) {
setErrors(prev => ({ ...prev, apiUrl: error.message }));
- // On error we revert back to the aliasvault.net official hosted instance.
+ // On error we revert back to the aliasvault.com official hosted instance.
await storage.setItem('local:apiUrl', AppInfo.DEFAULT_API_URL);
await storage.setItem('local:clientUrl', AppInfo.DEFAULT_CLIENT_URL);
pendingApiUrlRef.current = null;
diff --git a/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts b/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts
index 80894b3ab..126852f38 100644
--- a/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts
+++ b/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts
@@ -34,7 +34,7 @@ export const useApiUrl = (): {
*/
const getDisplayUrl = (): string => {
const cleanUrl = apiUrl.replace('https://', '').replace('http://', '').replace(':443', '').replace('/api', '');
- return cleanUrl === 'app.aliasvault.net' ? 'aliasvault.net' : cleanUrl;
+ return cleanUrl === 'app.aliasvault.com' ? 'aliasvault.com' : cleanUrl;
};
return {
diff --git a/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts b/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts
new file mode 100644
index 000000000..14fccd054
--- /dev/null
+++ b/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts
@@ -0,0 +1,34 @@
+import { AppInfo } from '@/utils/AppInfo';
+
+import { storage } from '#imports';
+
+/**
+ * Legacy official hosted URLs from before the aliasvault.net -> aliasvault.com domain move.
+ * Existing installs may still have these persisted from when they were the defaults.
+ */
+const LEGACY_API_URL = 'https://app.aliasvault.net/api';
+const LEGACY_CLIENT_URL = 'https://app.aliasvault.net';
+
+/**
+ * One-time, idempotent migration that rewrites a persisted legacy aliasvault.net official URL to
+ * the current aliasvault.com default. Only the exact old official defaults are migrated; custom
+ * self-hosted URLs are left untouched. Safe to run on every startup (no-op once migrated or when
+ * the official instance is used, which is stored as an empty string).
+ *
+ * Added in the 0.29.7 release. Can be removed once installs from before 0.29.7 are no longer in use.
+ */
+export async function migrateLegacyApiUrl(): Promise {
+ try {
+ const apiUrl = await storage.getItem('local:apiUrl') as string | null;
+ if (apiUrl === LEGACY_API_URL) {
+ await storage.setItem('local:apiUrl', AppInfo.DEFAULT_API_URL);
+ }
+
+ const clientUrl = await storage.getItem('local:clientUrl') as string | null;
+ if (clientUrl === LEGACY_CLIENT_URL) {
+ await storage.setItem('local:clientUrl', AppInfo.DEFAULT_CLIENT_URL);
+ }
+ } catch (error) {
+ console.error('Failed to migrate legacy API URL:', error);
+ }
+}
diff --git a/apps/browser-extension/src/migrations/index.ts b/apps/browser-extension/src/migrations/index.ts
new file mode 100644
index 000000000..c70cf7444
--- /dev/null
+++ b/apps/browser-extension/src/migrations/index.ts
@@ -0,0 +1,14 @@
+import { migrateLegacyApiUrl } from '@/migrations/0.29.7-LegacyApiUrlMigration';
+
+/**
+ * Generic entry point for one-time startup migrations. Called once during background startup;
+ * add any future migration as another awaited call below. Each migration must be idempotent and
+ * swallow its own errors so a single failure cannot block startup.
+ *
+ * Keeping every migration behind this single function means callers never touch app internals,
+ * and retiring a migration later is just deleting its file and removing its line here.
+ */
+export async function runStartupMigrations(): Promise {
+ // 0.29.7: Migrate legacy aliasvault.net URLs to aliasvault.com defaults.
+ await migrateLegacyApiUrl();
+}
diff --git a/apps/browser-extension/src/utils/AppInfo.ts b/apps/browser-extension/src/utils/AppInfo.ts
index 41922cff3..d090059ff 100644
--- a/apps/browser-extension/src/utils/AppInfo.ts
+++ b/apps/browser-extension/src/utils/AppInfo.ts
@@ -52,12 +52,12 @@ export class AppInfo {
/**
* The default AliasVault client URL.
*/
- public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.net';
+ public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.com';
/**
* The default AliasVault web API URL.
*/
- public static readonly DEFAULT_API_URL = 'https://app.aliasvault.net/api';
+ public static readonly DEFAULT_API_URL = 'https://app.aliasvault.com/api';
/**
* Prevent instantiation of this utility class
diff --git a/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts b/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts
index 9ae486918..a3f608839 100644
--- a/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts
+++ b/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts
@@ -47,6 +47,7 @@ async function createEmail(
return {
messageHtml: '',
messagePlain: '',
+ messageSource: '',
id: 1,
subject: '',
fromDisplay: '',
@@ -78,7 +79,7 @@ async function encryptAttachmentBytes(plaintext: Uint8Array, rawSymmetricKey: st
['encrypt']
);
const iv = crypto.getRandomValues(new Uint8Array(12));
- const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext);
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, new Uint8Array(plaintext));
const encryptedBytes = new Uint8Array(iv.length + ciphertext.byteLength);
encryptedBytes.set(iv, 0);
encryptedBytes.set(new Uint8Array(ciphertext), iv.length);
diff --git a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt
index c836a565f..38ae5a6d2 100644
--- a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt
+++ b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt
@@ -37,7 +37,7 @@ class WebApiService(private val context: Context) {
private const val REFRESH_TOKEN_KEY = "refreshToken"
private const val APP_INSTANCE_ID_KEY = "appInstanceId"
private const val CUSTOM_PROXY_HEADERS_KEY = "customProxyHeaders"
- private const val DEFAULT_API_URL = "https://app.aliasvault.net/api"
+ private const val DEFAULT_API_URL = "https://app.aliasvault.com/api"
private const val SHARED_PREFS_NAME = "aliasvault"
}
diff --git a/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx b/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx
index adaf5faf9..88481bc13 100644
--- a/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx
+++ b/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx
@@ -68,7 +68,7 @@ export default function AndroidAutofillScreen() : React.ReactNode {
* Handle opening the documentation link.
*/
const handleOpenDocs = () : void => {
- Linking.openURL('https://docs.aliasvault.net/mobile-apps/android/autofill.html');
+ Linking.openURL('https://docs.aliasvault.com/installation/mobile-apps/android/autofill/');
};
/**
diff --git a/apps/mobile-app/app/_layout.tsx b/apps/mobile-app/app/_layout.tsx
index fde011902..3c28ae7ad 100644
--- a/apps/mobile-app/app/_layout.tsx
+++ b/apps/mobile-app/app/_layout.tsx
@@ -22,6 +22,7 @@ import { DialogProvider } from '@/context/DialogContext';
import { NavigationProvider, useNavigation } from '@/context/NavigationContext';
import { WebApiProvider } from '@/context/WebApiContext';
import { initI18n } from '@/i18n';
+import { runStartupMigrations } from '@/migrations';
SplashScreen.preventAutoHideAsync();
@@ -52,11 +53,12 @@ function RootLayoutNav() : React.ReactNode {
/**
* Initialize i18n and inspect the cold-start deep link in parallel.
+ * One-time startup migrations run here too.
* If a deep link is detected, set the return URL so after succesful
* initialization, the app will navigate to the deep link target.
*/
(async (): Promise => {
- const [, initialUrl] = await Promise.all([initI18n(), Linking.getInitialURL()]);
+ const [, initialUrl] = await Promise.all([initI18n(), Linking.getInitialURL(), runStartupMigrations()]);
const resolved = await resolveDeepLink(initialUrl);
if (resolved) {
diff --git a/apps/mobile-app/app/login-settings.tsx b/apps/mobile-app/app/login-settings.tsx
index f4f1092e1..40a449130 100644
--- a/apps/mobile-app/app/login-settings.tsx
+++ b/apps/mobile-app/app/login-settings.tsx
@@ -49,7 +49,7 @@ export default function SettingsScreen() : React.ReactNode {
const [isLoading, setIsLoading] = useState(true);
const DEFAULT_OPTIONS: ApiOption[] = useMemo(() => [
- { label: t('app.loginSettings.aliasvaultNet'), value: AppInfo.DEFAULT_API_URL },
+ { label: 'AliasVault.com', value: AppInfo.DEFAULT_API_URL },
{ label: t('app.loginSettings.selfHosted'), value: 'custom' },
], [t]);
diff --git a/apps/mobile-app/app/login.tsx b/apps/mobile-app/app/login.tsx
index 2ee01ac8c..9e19e8043 100644
--- a/apps/mobile-app/app/login.tsx
+++ b/apps/mobile-app/app/login.tsx
@@ -814,7 +814,7 @@ export default function LoginScreen() : React.ReactNode {
{t('auth.noAccountYet')}
diff --git a/apps/mobile-app/i18n/locales/en.json b/apps/mobile-app/i18n/locales/en.json
index 7eb81d32f..8d5249daf 100644
--- a/apps/mobile-app/i18n/locales/en.json
+++ b/apps/mobile-app/i18n/locales/en.json
@@ -655,7 +655,6 @@
},
"loginSettings": {
"title": "API Connection",
- "aliasvaultNet": "Aliasvault.net",
"selfHosted": "Self-hosted",
"customApiUrl": "Custom API URL",
"customApiUrlPlaceholder": "https://my-aliasvault-instance.com/api",
diff --git a/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift b/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift
index 68022c7bb..225012bdd 100644
--- a/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift
+++ b/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift
@@ -861,7 +861,7 @@ final class AliasVaultUITests: XCTestCase {
@MainActor
private func performLogin(with testUser: TestUser) {
// Check if API URL is already configured to localhost by looking at the displayed URL
- // The login screen shows the URL via server-url-link, containing text like "localhost:5100" or "aliasvault.net"
+ // The login screen shows the URL via server-url-link, containing text like "localhost:5100" or "aliasvault.com"
let serverUrlLink = app.findElement(testID: "server-url-link")
var needsApiConfig = true
diff --git a/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift b/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift
index a7b7d4030..356c4d393 100644
--- a/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift
+++ b/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift
@@ -15,7 +15,7 @@ public class WebApiService {
private let customProxyHeadersKey = "customProxyHeaders"
// Default API URL
- private let defaultApiUrl = "https://app.aliasvault.net/api"
+ private let defaultApiUrl = "https://app.aliasvault.com/api"
/// Shared UserDefaults for communication between main app and extension
private let userDefaults = UserDefaults(suiteName: VaultConstants.userDefaultsSuite)!
diff --git a/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts b/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts
new file mode 100644
index 000000000..d628169df
--- /dev/null
+++ b/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts
@@ -0,0 +1,28 @@
+import { AppInfo } from '@/utils/AppInfo';
+
+import NativeVaultManager from '@/specs/NativeVaultManager';
+
+/**
+ * Legacy official hosted API URL from before the aliasvault.net -> aliasvault.com domain move.
+ * Existing installs that were set up while this was the default still have it persisted natively.
+ */
+const LEGACY_API_URL = 'https://app.aliasvault.net/api';
+
+/**
+ * One-time, idempotent migration that rewrites a persisted legacy aliasvault.net official API URL
+ * to the current aliasvault.com default. Only the exact old official default is migrated; custom
+ * self-hosted URLs are left untouched. Safe to run on every cold start (no-op once migrated or when
+ * no URL is stored).
+ *
+ * Added in the 0.29.7 release. Can be removed once installs from before 0.29.7 are no longer in use.
+ */
+export async function migrateLegacyApiUrl(): Promise {
+ try {
+ const apiUrl = await NativeVaultManager.getApiUrl();
+ if (apiUrl === LEGACY_API_URL) {
+ await NativeVaultManager.setApiUrl(AppInfo.DEFAULT_API_URL);
+ }
+ } catch (error) {
+ console.warn('Failed to migrate legacy API URL:', error);
+ }
+}
diff --git a/apps/mobile-app/migrations/index.ts b/apps/mobile-app/migrations/index.ts
new file mode 100644
index 000000000..375b4e06f
--- /dev/null
+++ b/apps/mobile-app/migrations/index.ts
@@ -0,0 +1,14 @@
+import { migrateLegacyApiUrl } from '@/migrations/0.29.7-LegacyApiUrlMigration';
+
+/**
+ * Generic entry point for one-time startup migrations. Called once during cold-start boot;
+ * add any future migration as another awaited call below. Each migration must be idempotent and
+ * swallow its own errors so a single failure cannot block startup.
+ *
+ * Keeping every migration behind this single function means callers never touch app internals,
+ * and retiring a migration later is just deleting its file and removing its line here.
+ */
+export async function runStartupMigrations(): Promise {
+ // 0.29.7: Migrate legacy aliasvault.net URLs to aliasvault.com defaults.
+ await migrateLegacyApiUrl();
+}
diff --git a/apps/mobile-app/utils/ApiUrlUtility.ts b/apps/mobile-app/utils/ApiUrlUtility.ts
index b783c4e39..f316e6a4c 100644
--- a/apps/mobile-app/utils/ApiUrlUtility.ts
+++ b/apps/mobile-app/utils/ApiUrlUtility.ts
@@ -37,7 +37,7 @@ export const useApiUrl = (): {
*/
const getDisplayUrl = (): string => {
const cleanUrl = apiUrl.replace('https://', '').replace('http://', '').replace(':443', '').replace('/api', '');
- return cleanUrl === 'app.aliasvault.net' ? 'aliasvault.net' : cleanUrl;
+ return cleanUrl === 'app.aliasvault.com' ? 'aliasvault.com' : cleanUrl;
};
return {
diff --git a/apps/mobile-app/utils/AppInfo.ts b/apps/mobile-app/utils/AppInfo.ts
index daaa4aee7..43aceff48 100644
--- a/apps/mobile-app/utils/AppInfo.ts
+++ b/apps/mobile-app/utils/AppInfo.ts
@@ -39,12 +39,12 @@ export class AppInfo {
/**
* The default AliasVault client URL.
*/
- public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.net';
+ public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.com';
/**
* The default AliasVault web API URL.
*/
- public static readonly DEFAULT_API_URL = 'https://app.aliasvault.net/api';
+ public static readonly DEFAULT_API_URL = 'https://app.aliasvault.com/api';
/**
* Prevent instantiation of this utility class
diff --git a/apps/server/AliasVault.Admin/Dockerfile b/apps/server/AliasVault.Admin/Dockerfile
index e38a5ecb0..f4c231bed 100644
--- a/apps/server/AliasVault.Admin/Dockerfile
+++ b/apps/server/AliasVault.Admin/Dockerfile
@@ -25,7 +25,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault Admin"
-LABEL org.opencontainers.image.description="Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install Kerberos libraries to prevent .NET 10 GSSAPI warnings
RUN apk add --no-cache krb5-libs
diff --git a/apps/server/AliasVault.Api/Dockerfile b/apps/server/AliasVault.Api/Dockerfile
index 90755a285..407a53da5 100644
--- a/apps/server/AliasVault.Api/Dockerfile
+++ b/apps/server/AliasVault.Api/Dockerfile
@@ -22,7 +22,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault API"
-LABEL org.opencontainers.image.description="REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install Kerberos libraries to prevent .NET 10 GSSAPI warnings
RUN apk add --no-cache krb5-libs
diff --git a/apps/server/AliasVault.Client/Dockerfile b/apps/server/AliasVault.Client/Dockerfile
index b6dec15c2..4b34675ee 100644
--- a/apps/server/AliasVault.Client/Dockerfile
+++ b/apps/server/AliasVault.Client/Dockerfile
@@ -100,7 +100,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault Client"
-LABEL org.opencontainers.image.description="Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
WORKDIR /usr/share/nginx/html
COPY --from=publish /app/publish/wwwroot .
diff --git a/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor b/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor
index 897bed872..571775777 100644
--- a/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor
+++ b/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor
@@ -59,7 +59,7 @@
- @Localizer["DefaultEmailDomainDescription"] @Localizer["DefaultEmailDomainDescriptionNote"] @Localizer["DefaultEmailDomainLearnMore"].
+ @Localizer["DefaultEmailDomainDescription"] @Localizer["DefaultEmailDomainDescriptionNote"] @Localizer["DefaultEmailDomainLearnMore"].
diff --git a/apps/server/Databases/AliasServerDb/Dockerfile b/apps/server/Databases/AliasServerDb/Dockerfile
index bdf247914..7b695550b 100644
--- a/apps/server/Databases/AliasServerDb/Dockerfile
+++ b/apps/server/Databases/AliasServerDb/Dockerfile
@@ -5,7 +5,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault PostgreSQL"
-LABEL org.opencontainers.image.description="PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install pigz for parallel compression during database exports
RUN apk add --no-cache pigz
diff --git a/apps/server/Dockerfile b/apps/server/Dockerfile
index 877572723..742a53a83 100644
--- a/apps/server/Dockerfile
+++ b/apps/server/Dockerfile
@@ -5,7 +5,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault Reverse Proxy"
-LABEL org.opencontainers.image.description="Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install OpenSSL and inotify-tools for certificate watching
RUN apk add --no-cache openssl inotify-tools
diff --git a/apps/server/Services/AliasVault.SmtpService/Dockerfile b/apps/server/Services/AliasVault.SmtpService/Dockerfile
index f5a10acb5..7da8378f2 100644
--- a/apps/server/Services/AliasVault.SmtpService/Dockerfile
+++ b/apps/server/Services/AliasVault.SmtpService/Dockerfile
@@ -23,7 +23,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault SMTP Service"
-LABEL org.opencontainers.image.description="SMTP service for email alias functionality in AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="SMTP service for email alias functionality in AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install Kerberos libraries to prevent .NET 10 GSSAPI warnings
RUN apk add --no-cache krb5-libs
diff --git a/apps/server/Services/AliasVault.TaskRunner/Dockerfile b/apps/server/Services/AliasVault.TaskRunner/Dockerfile
index 6a3a2e9e0..9f9359e91 100644
--- a/apps/server/Services/AliasVault.TaskRunner/Dockerfile
+++ b/apps/server/Services/AliasVault.TaskRunner/Dockerfile
@@ -21,7 +21,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault TaskRunner"
-LABEL org.opencontainers.image.description="Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)"
+LABEL org.opencontainers.image.description="Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)"
# Install Kerberos libraries to prevent .NET 10 GSSAPI warnings
RUN apk add --no-cache krb5-libs
diff --git a/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv b/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv
index ae8a22598..7d3636684 100644
--- a/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv
+++ b/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv
@@ -3,6 +3,6 @@ Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A,
,,login,Test,,,0,,,,
,,login,Test,,,0,,test2,asdasd,
Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30
-Business,,login,Aliasvault.net,,,0,https://www.aliasvault.com,root,toor,
+Business,,login,Aliasvault.com,,,0,https://www.aliasvault.com,root,toor,
Work/Projects,,login,WorkItem,,,0,https://work.example.com,workuser,workpass,
Work/Projects/Active,,login,ActiveItem,,,0,https://active.example.com,activeuser,activepass,
diff --git a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs
index 854aeab9e..025910425 100644
--- a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs
+++ b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs
@@ -65,7 +65,7 @@ public class ImportTests : ClientPlaywrightTest
{
Assert.That(pageContent, Does.Contain("Test"), "Test item not imported at root level");
Assert.That(pageContent, Does.Not.Contain("TutaNota"), "TutaNota should be in Business folder, not at root");
- Assert.That(pageContent, Does.Not.Contain("Aliasvault.net"), "Aliasvault.net should be in Business folder, not at root");
+ Assert.That(pageContent, Does.Not.Contain("Aliasvault.com"), "Aliasvault.com should be in Business folder, not at root");
});
// Verify the Business folder was created.
@@ -84,7 +84,7 @@ public class ImportTests : ClientPlaywrightTest
{
Assert.That(folderPageContent, Does.Contain("Item for business folder"), "Item for business folder not imported");
Assert.That(folderPageContent, Does.Contain("TutaNota"), "TutaNota item not imported in Business folder");
- Assert.That(folderPageContent, Does.Contain("Aliasvault.net"), "Aliasvault.net item not imported in Business folder");
+ Assert.That(folderPageContent, Does.Contain("Aliasvault.com"), "Aliasvault.com item not imported in Business folder");
});
// Navigate back to root and test hierarchical folders.
diff --git a/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv b/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv
index a4767f2a0..516d81254 100644
--- a/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv
+++ b/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv
@@ -3,7 +3,7 @@ Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A,
,,login,Test,,,0,,,,
,,login,Test,,,0,,test2,asdasd,
Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30
-Business,,login,Aliasvault.net,,,0,https://www.aliasvault.com,root,toor,
+Business,,login,Aliasvault.com,,,0,https://www.aliasvault.com,root,toor,
Business,,login,TutaNota3,,,0,"https://www.aliasvault.com,https://app.aliasvault.com,https://downloads.aliasvault.com",avtest3@tutamail.com,blabla,otpauth://totp/Test%20name%3Atest%40test.org?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&issuer=Alias%20Vault
Business,,login,TutaNota4,,,0,,avtest4@tutamail.com,blabla,otpauth://totp/my.email@gmail.com?secret=TEST!INVALID&issuer=Alias%20Vault&algorithm=SHA1&digits=6&period=30
Business,,login,TutaNota5,,,0,,avtest5@tutamail.com,blabla,incorrectstring
diff --git a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs
index 624ab2dbf..6412a583e 100644
--- a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs
+++ b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs
@@ -218,10 +218,10 @@ public class ImportExportTests
Assert.That(tutaNotaCredential.TwoFactorSecret, Is.EqualTo("otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30"));
});
- var aliasVaultCredential = importedCredentials.First(c => c.ServiceName == "Aliasvault.net");
+ var aliasVaultCredential = importedCredentials.First(c => c.ServiceName == "Aliasvault.com");
Assert.Multiple(() =>
{
- Assert.That(aliasVaultCredential.ServiceName, Is.EqualTo("Aliasvault.net"));
+ Assert.That(aliasVaultCredential.ServiceName, Is.EqualTo("Aliasvault.com"));
Assert.That(aliasVaultCredential.ServiceUrls?.FirstOrDefault(), Is.EqualTo("https://www.aliasvault.com"));
Assert.That(aliasVaultCredential.Username, Is.EqualTo("root"));
Assert.That(aliasVaultCredential.Password, Is.EqualTo("toor"));
diff --git a/dockerfiles/all-in-one/Dockerfile b/dockerfiles/all-in-one/Dockerfile
index ee350ce4b..89473d416 100644
--- a/dockerfiles/all-in-one/Dockerfile
+++ b/dockerfiles/all-in-one/Dockerfile
@@ -126,7 +126,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault"
LABEL org.opencontainers.image.vendor="AliasVault"
LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="AliasVault All-in-One"
-LABEL org.opencontainers.image.description="Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net)."
+LABEL org.opencontainers.image.description="Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com)."
# Copy s6-overlay from downloader stage
COPY --from=s6-downloader /*.tar.xz /tmp/
diff --git a/docs/docs/contributing/ui-translations.md b/docs/docs/contributing/ui-translations.md
index 59b7712d9..308659c46 100644
--- a/docs/docs/contributing/ui-translations.md
+++ b/docs/docs/contributing/ui-translations.md
@@ -59,7 +59,7 @@ Other contributors may review and approve your translations. This helps ensure q
## What Gets Translated?
The Crowdin project covers translations for all client apps in one place:
-- Web app (https://app.aliasvault.net)
+- Web app (https://app.aliasvault.com)
- Browser extension
- Mobile App (iOS and Android)