Asset Tracker is not configured yet

Open asset-tracker/config.js and set SUPABASE_URL and SUPABASE_ANON_KEY from your Supabase project (Project Settings → API), then run supabase/schema.sql in the Supabase SQL editor.

Full instructions are in asset-tracker/README.md.

Loading…

{{ noAccess ? 'No access to the Asset Tracker' : 'Could not load your account' }}

{{ profileError }}

{{ cfg.APP_NAME }}

Sign in

Use your company account.

{{ authError }}
{{ authInfo }}
Demo mode

Sample data lives in this browser only. Pick an account to explore each role — any password works.

Reset password

We'll email you a secure link.

{{ authError }}
{{ authInfo }}

Set your password

Signed in as {{ session?.user?.email }}. Choose a password to finish.

At least 8 characters.

{{ authError }}

Account deactivated

Your access to the Asset Tracker has been disabled. Contact an administrator.

Demo mode — sample data stored in this browser. Signed in as {{ profile.role }}.
My account

Dashboard

Good {{ dayPart }}, {{ (profile.full_name || '').split(' ')[0] || 'there' }}. Here's the estate at a glance.

Assets

{{ num(assetsTotal) }} {{ assetsTotal === 1 ? 'asset' : 'assets' }} · showing archived

{{ selectedIds.length }} selected
Tag Asset Category Status Assignee Location Cost Book value Updated
No assets found
{{ hasActiveFilters ? 'Try clearing the filters.' : 'Create your first asset or import a CSV.' }}
{{ a.asset_tag }}
{{ a.name }}
{{ [a.manufacturer, a.model].filter(Boolean).join(' ') || a.serial_number || '' }}
{{ a.category_name || '—' }} {{ statusLabel(a.status) }}Archived {{ a.assignee_name || '—' }}
Due {{ date(a.due_date) }}
{{ a.location_name || '—' }} {{ money(a.purchase_cost, a.currency) }} {{ money(a.book_value, a.currency) }} {{ ago(a.updated_at) }}
Showing {{ assets.length ? (page-1)*pageSize+1 : 0 }}–{{ Math.min(page*pageSize, assetsTotal) }} of {{ num(assetsTotal) }}
Page {{ page }} / {{ totalPages }}

Assignments

Who has what, and when it's due back.

AssetPersonChecked outDueChecked inConditionBy
{{ assignLoading ? 'Loading…' : 'Nothing here.' }}
{{ r.asset?.name }}
{{ r.asset?.asset_tag }}
{{ r.person?.full_name }}
{{ r.person?.department }}
{{ dateTime(r.checked_out_at) }} {{ date(r.due_date) }} {{ r.checked_in_at ? dateTime(r.checked_in_at) : '—' }} {{ cap(r.condition_out) }} → {{ cap(r.condition_in) }} {{ r.assigned_by_profile?.full_name || r.assigned_by_profile?.email || '—' }}

Maintenance

Scheduled work, repairs and their cost.

AssetWorkTypeStatusScheduledCompletedCost
{{ maintLoading ? 'Loading…' : 'No maintenance records.' }}
{{ m.asset?.name }}
{{ m.asset?.asset_tag }}
{{ m.title }}
{{ m.description }}
{{ m.type }} {{ cap(m.status) }} {{ date(m.scheduled_date) || '—' }} {{ date(m.completed_date) || '—' }} {{ money(m.cost) }}

Catalog

Reference data used across the register.

Nothing yet.

Reports

Built from live data. Export any report as CSV.

{{ humanCol(c) }}
Building report…
No data.
{{ formatCell(c, r[c]) }}

Audit log

Every change, who made it, and what changed.

WhenActorActionRecordChanged
{{ auditLoading ? 'Loading…' : 'No entries.' }}
Page {{ auditPage }}

Users

Logins and their roles. Assignees who don't need a login live under Catalog → People.

{{ r.value }}
{{ r.desc }}
UserRoleDepartmentLast seenStatus
{{ initials(u.full_name || u.email) }}
{{ u.full_name || '—' }} (you)
{{ u.email }}
{{ u.department || '—' }} {{ u.last_seen_at ? ago(u.last_seen_at) : 'Never' }}

Settings

Organisation-wide defaults.

{{ (settingsForm.tag_prefix||'WGG').toUpperCase() }}-{{ String((settings.tag_seq||0)+1).padStart(settingsForm.tag_padding||5,'0') }}

Connection

Supabase project
{{ cfg.SUPABASE_URL }}
Admin API
{{ cfg.ADMIN_API }}
Storage bucket
{{ cfg.STORAGE_BUCKET }}

My account

{{ profile.email }} · {{ profile.role }}

Profile

Change password

You don't have access to this page.
{{ t.message }}