diff --git a/README.md b/README.md
index b178dbb..de2bd11 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,9 @@ Service records can also include optional used parts and labor lines. Parts supp
The **Settings** view provides complete JSON data backup and restore. **Download backup** exports all customers, employees, vehicles, appointments, service records, service-order items, invoices, and user accounts. **Choose backup file** imports a backup after confirmation; importing replaces the current database contents in one transaction, so a failed import leaves the existing data unchanged. Keep exported backup files secure because they contain all workshop data.
-The **Accounts** view supports reading, adding, editing, and deleting users with `read`, `add`, and `delete` rights. A default `admin` account is created automatically, and the last administrator cannot be deleted. These permissions are currently stored as staff access profiles; login/session enforcement can be added when authentication is required.
+The dashboard supports user sign-in and permission-based access. Without signing in, all views are read-only. Administrators can manage user accounts, add and modify workshop data, restore backups, and delete data. Technicians and service advisors can add and modify workshop data but cannot delete anything. Viewer accounts are read-only. The **Accounts** view is visible to everyone, but only administrators can manage accounts.
+
+A default `admin` account is created automatically. Its initial password is `change-me-in-production`, unless `ADMIN_PASSWORD` is set in `.env` before the web container starts. Sign in at the top of the dashboard and change the initial password by editing the administrator account. Do not use the default password outside local development.
Check that the database is ready:
diff --git a/init.sql b/init.sql
index 0f9a5ee..83a968f 100644
--- a/init.sql
+++ b/init.sql
@@ -91,6 +91,7 @@ CREATE TABLE IF NOT EXISTS app_users (
can_read BOOLEAN NOT NULL DEFAULT TRUE,
can_add BOOLEAN NOT NULL DEFAULT FALSE,
can_delete BOOLEAN NOT NULL DEFAULT FALSE,
+ password_hash TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
diff --git a/public/app.js b/public/app.js
index cc39737..dd162e8 100644
--- a/public/app.js
+++ b/public/app.js
@@ -1,4 +1,4 @@
-const state = { orders: [], users: [], vehicles: [], recordItems: [] };
+const state = { orders: [], users: [], vehicles: [], recordItems: [], user: null };
const $ = (selector) => document.querySelector(selector);
async function request(url, options) {
@@ -13,6 +13,10 @@ function formatTime(value) { return new Date(value).toLocaleTimeString([], { hou
function titleCase(value) { return value.replaceAll('_', ' '); }
function emptyMessage(message) { return `