Dashboard
Good {{ dayPart }}, {{ (profile.full_name || '').split(' ')[0] || 'there' }}. Here's the estate at a glance.
Assets by status
Assets by category
Acquisitions (12 months)
Warranty expiring
View allNothing expiring in the next {{ settings.warranty_alert_days }} days.
-
{{ daysUntil(w.warranty_expiry) }}d{{ w.name }}{{ w.asset_tag }}
Overdue returns
View allNo overdue check-ins. 🎉
-
{{ -daysUntil(o.due_date) }}d late{{ o.name }}{{ o.person }} · {{ o.asset_tag }}
Upcoming maintenance
View allNo maintenance scheduled.
-
{{ date(m.scheduled_date) || '—' }}{{ m.title }}{{ m.asset_tag }}
Recent activity
Audit logNo activity yet.
-
{{ actionWord(r.action) }} {{ humanTable(r.table_name) }} {{ r.label }}{{ r.actor_email || 'system' }} · {{ ago(r.created_at) }}
Assets
{{ num(assetsTotal) }} {{ assetsTotal === 1 ? 'asset' : 'assets' }} · showing archived
| 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) }} |
|
|
Assignments
Who has what, and when it's due back.
| Asset | Person | Checked out | Due | Checked in | Condition | By | |
|---|---|---|---|---|---|---|---|
| {{ 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.
| Asset | Work | Type | Status | Scheduled | Completed | Cost | |
|---|---|---|---|---|---|---|---|
| {{ 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.
| Name | Description | Default life | Assets | Name | Address | City | Country | Assets | Name | Contact | Phone | Website | Name | Employee ID | Department | Job title | Login | Active | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nothing yet. | |||||||||||||||||||||
| {{ row.name }} | {{ row.description || '—' }} | {{ row.default_useful_life_months ? row.default_useful_life_months + ' mo' : '—' }} | {{ countBy('category_id', row.id) }} | {{ row.name }} | {{ row.address || '—' }} | {{ row.city || '—' }} | {{ row.country || '—' }} | {{ countBy('location_id', row.id) }} | {{ row.name }} | {{ row.contact_name || '—' }} | {{ row.email || '—' }} | {{ row.phone || '—' }} | {{ row.website.replace(/^https?:\/\//,'') }}— | {{ row.full_name }} | {{ row.email || '—' }} | {{ row.employee_id || '—' }} | {{ row.department || '—' }} | {{ row.job_title || '—' }} | — | {{ row.is_active ? 'Active' : 'Inactive' }} | |
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.
| When | Actor | Action | Record | Changed | |
|---|---|---|---|---|---|
| {{ auditLoading ? 'Loading…' : 'No entries.' }} | |||||
| {{ dateTime(r.created_at) }} | {{ r.actor_email || 'system' }} | {{ actionWord(r.action) }} | {{ humanTable(r.table_name) }} {{ auditLabel(r) }} | {{ (r.changed_fields || []).slice(0,5).join(', ') }} +{{ r.changed_fields.length-5 }} | |
|
{{ humanCol(d.field) }}
{{ d.before }}
{{ d.after }}
| |||||
Users
Logins and their roles. Assignees who don't need a login live under Catalog → People.
| User | Role | Department | Last seen | Status | |
|---|---|---|---|---|---|
{{ 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.
Connection
- Supabase project
- {{ cfg.SUPABASE_URL }}
- Admin API
- {{ cfg.ADMIN_API }}
- Storage bucket
- {{ cfg.STORAGE_BUCKET }}
My account
{{ profile.email }} · {{ profile.role }}