diff --git a/backend/atlas_portal/routes/access_requests.py b/backend/atlas_portal/routes/access_requests.py
index 4fe8ebb..f79c7c1 100644
--- a/backend/atlas_portal/routes/access_requests.py
+++ b/backend/atlas_portal/routes/access_requests.py
@@ -858,12 +858,14 @@ def register(app) -> None:
response["tasks"] = tasks
response["automation_complete"] = provision_tasks_complete(conn, code)
response["blocked"] = blocked
- if status in {"awaiting_onboarding", "ready"} and reveal_initial_password:
- password = row.get("initial_password")
+ if status in {"awaiting_onboarding", "ready"}:
revealed_at = row.get("initial_password_revealed_at")
- if isinstance(password, str) and password:
- response["initial_password"] = password
- if revealed_at is None:
+ if isinstance(revealed_at, datetime):
+ response["initial_password_revealed_at"] = revealed_at.astimezone(timezone.utc).isoformat()
+ if reveal_initial_password:
+ password = row.get("initial_password")
+ if isinstance(password, str) and password and revealed_at is None:
+ response["initial_password"] = password
conn.execute(
"UPDATE access_requests SET initial_password_revealed_at = NOW() WHERE request_code = %s AND initial_password_revealed_at IS NULL",
(code,),
diff --git a/frontend/scripts/build_media_manifest.mjs b/frontend/scripts/build_media_manifest.mjs
index 8994835..36d7cb4 100644
--- a/frontend/scripts/build_media_manifest.mjs
+++ b/frontend/scripts/build_media_manifest.mjs
@@ -1,6 +1,7 @@
import { promises as fs } from "fs";
import path from "path";
+const SOURCE = path.resolve("..", "media", "onboarding");
const ROOT = path.resolve("public", "media", "onboarding");
const MANIFEST = path.join(ROOT, "manifest.json");
const EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".webp"]);
@@ -27,7 +28,13 @@ async function ensureDir(dir) {
async function main() {
try {
await ensureDir(ROOT);
- const files = await walk(ROOT).catch(() => []);
+ const files = await walk(SOURCE).catch(() => []);
+ for (const file of files) {
+ const src = path.join(SOURCE, file);
+ const dest = path.join(ROOT, file);
+ await ensureDir(path.dirname(dest));
+ await fs.copyFile(src, dest);
+ }
const payload = {
generated_at: new Date().toISOString(),
files: files.sort(),
diff --git a/frontend/src/views/OnboardingView.vue b/frontend/src/views/OnboardingView.vue
index b04ec9c..55331c6 100644
--- a/frontend/src/views/OnboardingView.vue
+++ b/frontend/src/views/OnboardingView.vue
@@ -125,22 +125,25 @@
-
+
Temporary password
-
+
+ This password was already revealed and cannot be shown again. Ask an admin to reset it if you missed it.
+
@@ -204,6 +207,12 @@
+
+
+ Recheck status
+
+
+
{{ group.title }}
-
-
-
- {{ shot.label }}
+
+
+
+ {{ guideShot(step, group).label }}
+
+
+ Prev
+
+
+
+ {{ index + 1 }}
+
+
+
+ Next
+
+
@@ -300,6 +339,7 @@ const loading = ref(false);
const error = ref("");
const onboarding = ref({ required_steps: [], optional_steps: [], completed_steps: [] });
const initialPassword = ref("");
+const initialPasswordRevealedAt = ref("");
const revealPassword = ref(false);
const passwordCopied = ref(false);
const usernameCopied = ref(false);
@@ -309,6 +349,10 @@ const elementRecoveryKey = ref("");
const keycloakPasswordRotationRequested = ref(false);
const activeSectionId = ref("vaultwarden");
const guideShots = ref({});
+const guidePage = ref({});
+
+const showPasswordCard = computed(() => Boolean(initialPassword.value || initialPasswordRevealedAt.value));
+const passwordRevealLocked = computed(() => Boolean(!initialPassword.value && initialPasswordRevealedAt.value));
const STEP_PREREQS = {
vaultwarden_master_password: [],
@@ -738,6 +782,37 @@ function guideGroups(step) {
return Object.values(stepShots);
}
+function guideKey(step, group) {
+ const service = step.guide?.service || "unknown";
+ const stepKey = step.guide?.step || "unknown";
+ return `${service}:${stepKey}:${group.id}`;
+}
+
+function guideIndex(step, group) {
+ const key = guideKey(step, group);
+ const index = guidePage.value[key] ?? 0;
+ const maxIndex = Math.max(group.shots.length - 1, 0);
+ return Math.min(Math.max(index, 0), maxIndex);
+}
+
+function guideSet(step, group, index) {
+ const key = guideKey(step, group);
+ const next = Math.min(Math.max(index, 0), group.shots.length - 1);
+ guidePage.value = { ...guidePage.value, [key]: next };
+}
+
+function guidePrev(step, group) {
+ guideSet(step, group, guideIndex(step, group) - 1);
+}
+
+function guideNext(step, group) {
+ guideSet(step, group, guideIndex(step, group) + 1);
+}
+
+function guideShot(step, group) {
+ return group.shots[guideIndex(step, group)] || {};
+}
+
function taskPillClass(value) {
const key = (value || "").trim();
if (key === "ok") return "pill-ok";
@@ -773,6 +848,7 @@ async function check() {
tasks.value = Array.isArray(data.tasks) ? data.tasks : [];
blocked.value = Boolean(data.blocked);
initialPassword.value = data.initial_password || "";
+ initialPasswordRevealedAt.value = data.initial_password_revealed_at || "";
if (showOnboarding.value) {
selectDefaultSection();
}
@@ -1370,7 +1446,6 @@ button.secondary {
.guide-images {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 10px;
}
@@ -1387,6 +1462,35 @@ button.secondary {
border-radius: 8px;
}
+.guide-pagination {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.guide-dots {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+}
+
+.guide-dot {
+ border: 1px solid rgba(255, 255, 255, 0.18);
+ background: rgba(0, 0, 0, 0.3);
+ color: var(--text-muted);
+ border-radius: 999px;
+ padding: 4px 8px;
+ cursor: pointer;
+ font-size: 12px;
+}
+
+.guide-dot.active {
+ border-color: rgba(120, 180, 255, 0.5);
+ color: var(--text-strong);
+}
+
.ready-box {
margin-top: 18px;
padding: 14px;
diff --git a/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png b/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png
new file mode 100644
index 0000000..4be7969
Binary files /dev/null and b/media/onboarding/budget/step1_encrypt_data/1_Encrypt your financial data - storre your key in VaultWarden.png differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg
new file mode 100644
index 0000000..6541587
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/!0_You may get this or not - if you do choose Enter Recover Key.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg
new file mode 100644
index 0000000..99b56f8
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/11_Again you may have skipped this for your first time but if not enter the recovery key you saved into VaultWarden.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg
new file mode 100644
index 0000000..611dda4
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/12_Just hit continue here.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg
new file mode 100644
index 0000000..7ec1e2f
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/13_Just hit Not now here.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg
new file mode 100644
index 0000000..936e47d
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/14_You are in - come say hi in Othrys.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg
new file mode 100644
index 0000000..2d1bfe1
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/1_If you have a QR code from the website - use that, if not Signin manually.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg
new file mode 100644
index 0000000..0af0447
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/2_Just hit continue here.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg
new file mode 100644
index 0000000..57ca8e4
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/3_Choose other.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg
new file mode 100644
index 0000000..5aef15e
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/4_Search for live.bstein.dev.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg
new file mode 100644
index 0000000..9529edf
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/5_Select live.bstein.dev when it comes up below the search field.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg
new file mode 100644
index 0000000..839bed0
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/6_Just hit continue here.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg
new file mode 100644
index 0000000..76fe7d8
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/7_Hit Continue with Keycloak.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg
new file mode 100644
index 0000000..49bacf6
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/8_Login with your keycloak account.jpg differ
diff --git a/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg b/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg
new file mode 100644
index 0000000..25bca86
Binary files /dev/null and b/media/onboarding/element/step3_mobile_app_and_qr_code_login/9_Just hit continue here.jpg differ
diff --git a/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png b/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png
new file mode 100644
index 0000000..72fe5f3
Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/1_Accept the VaultWarden email invite.png differ
diff --git a/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png b/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png
new file mode 100644
index 0000000..b6cd911
Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/2_Create a VaultWarden master password.png differ
diff --git a/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png b/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png
new file mode 100644
index 0000000..80b8b3e
Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/3_Login to VaultWarden.png differ
diff --git a/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png b/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png
new file mode 100644
index 0000000..fa60c4b
Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/4_Use your new master password.png differ
diff --git a/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png b/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png
new file mode 100644
index 0000000..6ac4c99
Binary files /dev/null and b/media/onboarding/vaultwarden/step1_website/6_Store your temporary keycloak password - TEMPORARY - you WILL change this.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png b/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png
new file mode 100644
index 0000000..c3c722e
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/1_Go to your browsers store page and install the BITWARDEN addon or extension.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png b/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png
new file mode 100644
index 0000000..c058cad
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/2_Open the addon and go to the server configuration - note the addon may initially be inside your addon folder.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png b/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png
new file mode 100644
index 0000000..4e01b45
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/3_Select the self-hosted option.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png b/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png
new file mode 100644
index 0000000..1f27083
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/4_Enter the server address - vault.bstein.dev and save settings.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png b/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png
new file mode 100644
index 0000000..835dca8
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/5_Enter your account email.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png b/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png
new file mode 100644
index 0000000..ec20e94
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/6_Enter your master password.png differ
diff --git a/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png b/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png
new file mode 100644
index 0000000..2f2b3d3
Binary files /dev/null and b/media/onboarding/vaultwarden/step2_browser_extension/7_You now have auto complete in the browser for your passwords - Do Not use the password manager of your browswer.png differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg b/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg
new file mode 100644
index 0000000..b7f77c2
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/1_Download BITWARDEN mobile app and change server settings.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg b/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg
new file mode 100644
index 0000000..3459e59
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/2_Choose the self-hosted server option.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg b/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg
new file mode 100644
index 0000000..efc0a9b
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/3_Change the server url to vault.bstein.dev and hit continue.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg b/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg
new file mode 100644
index 0000000..4f37112
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/4_Enter you account email address.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg
new file mode 100644
index 0000000..53106a0
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter settings.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg
new file mode 100644
index 0000000..b7a4c52
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/5_Enter your master password.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg b/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg
new file mode 100644
index 0000000..b604110
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/6_Enter Account Security.jpg differ
diff --git a/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg b/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg
new file mode 100644
index 0000000..9f6e04a
Binary files /dev/null and b/media/onboarding/vaultwarden/step3_mobile_app/7_Turn on biometric unlock to make your life easier.jpg differ
diff --git a/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg b/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg
new file mode 100644
index 0000000..c19165a
Binary files /dev/null and b/media/onboarding/wger/step2_mobile_app/1_Select custom server.jpg differ
diff --git a/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg b/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg
new file mode 100644
index 0000000..a51612b
Binary files /dev/null and b/media/onboarding/wger/step2_mobile_app/2_Search for live.bstein.dev and connect with your username and password.jpg differ