{{ viewMode.syncConflicts.length }} sync conflicts — server changed before your offline edit replayed
Row {{ conflict.rowId || '?' }} queued {{ conflict.createdAt | date:'short' }}
{{ conflict.summary }}
Field Your queued edit Server now
{{ change.label }} {{ change.clientDisplay }} {{ change.serverDisplay }}
← Exit Zen Zen · outline pnid {{ viewMode.zenPnid }} #{{ viewMode.zenRow.ID }} Save draft Save & close Normal view
Loading note…
{{ viewMode.zenError }}
· {{ viewMode.zenRow.pnTopicGroup }} · {{ viewMode.zenRow.pnTopicDetail }}
Local autosave: draft unsaved changes restore archived ({{ viewMode.zenRow.edit._archivedDraftCount }}) saved {{ viewMode.zenRow.edit._localDraftSavedAt | date:'short' }}
{{ viewMode.zenRow.uiMessage }}
{{ viewMode.zenRow.edit._draftPreviewTitle }} hide
{{ item.label }}
{{ item.archivedAt | date:'short' }} {{ item.reason }}
recover
searchview
insert_chartaudit more × add_location roam my_location GPS person_pinwatch position person_pin gps_off ×  
status
Server hard to reach. Using local cache. Retry
audroam.com by Colin Wirt {{viewMode.verTag}} - audit roam evolve
Bike Status Tyres
Severity
Issue Type
{{ $index + 1 }} {{ entity.EntityTag }} {{ entity.EntityStatus }} {{ entity.tyres }}
{{entity.message}}
{{ entity.issue_type }}
All Activity open_in_new reload {{ tagStatus.entity.message }}
Escalated:
{{ row.days }} days {{row.topic_group}}open_in_new {{ row.topic_detail }} {{ row.pnBody | limitTo:50 }} directions_run{{row.person}}
{{row | json}}
Tyres:
days ago
{{tagStatus.entity.EntityTag}} audroam.com by Colin Wirt {{viewMode.verTag}} - audit roam evolve
date sv status
tyres
issue parts
person
reload
{{focusPanel.editStatus.message}}

{{addEntityHistory.message}}
{{row.js_date | date:'d MMM - HH:mm'}} open_in_new {{row.severity}} {{row.EntityStatus}} {{row.issue_type}} directions_run{{row.person_fk}} {{row.parts_required}} {{row.message}}
{{ row.days }} days open_in_new {{ row.topic_detail }} {{ row.pnBody | limitTo:50 }} directions_run{{row.person}}
{{row | json}}
Quick Release:
{{ row.days }} days {{row.topic_group}}open_in_new {{ row.topic_detail }} {{ row.pnBody | limitTo:50 }} directions_run{{row.person}} Donedirections_run{{row.done_by_person}}
{{row | json}}
battery_std Battery Swaps:
{{ battery.days }} days battery_std{{ battery.tag }} {{ battery.topic_detail }} directions_run{{battery.person}}
battery_std search batteries open_in_new
Search {{ tagStatus.entity.EntityTag }}: open_in_new {{ tagStatus.entity.message }}
entity debug
tagStatus: {{ tagStatus | json }}
Focus >> <<
{{ person.CurrentAccount }}
Location clear


T - U
Focus - clear
-
@ ()
Link to: hint point scan tag person tag
{{uiPerson.uiMessage}}
my_location log
× directions_runtravel timersession infoinfo swap_horizlogistics check_boxinventory impact helmet clean seat settingsgears levers brakes test tyres << >>hide actions <<
chevron_left
center_focus_strong Focus · refresh sync
Session (S) {{ liveMetaDuration(sessionMeta) }}
Stale open S — treat as timestamp, not trusted duration. Unlink or seal short / next.
Session / {{ sessionMeta.topicGroup }} · {{ sessionMeta.topicDetail }} · id {{ sessionMeta.openId }}
Activity (T) {{ liveMetaDuration(openMeta) }}
Stale open T — duration not trusted until you seal (5m/1h/next) or unlink. pilot_note is the timestamp.
{{ openMeta.taskGroup }} / {{ openMeta.topicGroup }} / {{ openMeta.topicDetail }} — {{ openMeta.bodyPreview }} · id {{ openMeta.openId }}
No open activity (T) — start a task action
Activity (T) {{ liveMetaDuration(openMeta) }}
Stale open T — seal short / next or unlink; pilot_note stays a timestamp.
{{ openMeta.taskGroup }} / {{ openMeta.topicGroup }} / {{ openMeta.topicDetail }} · id {{ openMeta.openId }}
Idle {{ liveIdleDuration() }}
since {{ idleMeta.idleSinceUTC }} UTC — log tinker / food / work when you resume
Suggested
Recent hourglass_top refresh hourglass_top play_arrow stop Focus T #{{ openMeta.openId }} — {{ liveMetaDuration(openMeta) }} Focus S #{{ sessionMeta.openId }} — {{ liveMetaDuration(sessionMeta) }} {{ countOpenTimerOrphans() }} open not on Focus idle {{ liveIdleDuration() }} age: {{ ((nowTs - (viewMode.recentGeneratedAtMs || viewMode.recentLastAt)) > 0 ? ((nowTs - (viewMode.recentGeneratedAtMs || viewMode.recentLastAt))/1000) : 0) | number:0 }}s - 20 100 - ×
Focus T {{ liveMetaDuration(openMeta) || liveRowDuration(row) }} Focus S {{ liveMetaDuration(sessionMeta) || liveRowDuration(row) }} Open · {{ liveRowDuration(row) }}
{{row.pnTaskGroup == 'Logistics' ? 'swap_horiz' : ''}}{{row.pnTaskGroup == 'Audit' ? 'insert_chart' : ''}}{{row.pnTaskGroup}}
{{row.pnTopicGroup == 'Travel' ? 'directions_run' : ''}}{{row.pnTopicGroup == 'Start' ? 'timer' : ''}}{{row.pnTopicGroup == 'Battery' ? 'battery_std' : ''}}{{row.pnTopicGroup}}
{{row.pnTopicDetail}} {{row.pnInvoiceNote}}
S {{row.pnScheduleBacklog}} · due {{ realScheduleDue(row) | date:'yyyy-MM-dd HH:mm' }}
Done by directions_run{{row.pnCompletedPersonPK}} manageopen_in_new
@ {{row.pnUserRoamPoint}} map
{{row.pnAccount}}
{{row.pnUserRealm}}
{{row.pnAssetAccount}}
{{row.pnAssetRealm}}
{{row.pnValue == null ? '' : ' x ' + (row.pnValue | number)}} manage
people Team Recent peopleteam last 90 mins open_in_browser open_in_new 1 day open_in_browser open_in_new person_pinperson_pinnearby last 90 mins open_in_browser open_in_new person_pinperson_pinall nearby open_in_browser open_in_new people{{person.CurrentRealm}} last 90 mins last 1 day last 3 days last 90 days
Next stamp is long
{{ durationPick.summary }}
Sum: {{ durationPickSumLabel() }}
Search Results {{reportResult.length}}
{{reportSearch.s}} {{reportSearch.pnid}} {{reportSearch.tag}} {{reportSearch.task}} {{reportSearch.point}} {{reportSearch.hint}} {{reportSearch.near}} {{reportSearch.km ? reportSearch.km + 'km' : ''}} {{reportSearch.topic}} {{reportSearch.topicLike}} {{reportSearch.detail}} {{reportSearch.code}} {{reportSearch.realm}} {{(reportSearch.d1 | date: 'd MMM yyyy')}} {{(reportSearch.d2 | date: 'd MMM yyyy')}} {{(reportSearch.dr | date: 'd MMM yyyy')}} {{(reportSearch.ds > 0 ? ' +/- ' : '') + reportSearch.ds}}
hide done × hide T/S × keep recent done × search... ×
×
refresh expand_less sort date sort asset tag clear detail actions camera_alt {{viewMode.imageLimit}}chevron_right camera_altchevron_left linkshare {{viewMode.Message}}
chevron_left
{{row.pnTaskGroup == 'Activity' ? 'build' : ''}}{{row.pnTaskGroup == 'Audit' ? 'insert_chart' : ''}}{{row.pnTaskGroup == 'Logistics' ? 'swap_horiz' : ''}}{{row.pnTaskGroup == 'Escalated' ? 'assignment_late' : ''}}{{row.pnTaskGroup}}
{{row.pnTopicGroup == 'Travel' ? 'directions_run' : ''}}{{row.pnTopicGroup == 'Start' ? 'timer' : ''}}{{row.pnTopicGroup == 'Battery' ? 'battery_std' : ''}}{{row.pnTopicGroup}}
Focus T {{ liveMetaDuration(openMeta) || liveRowDuration(row) }} #{{ row.ID }}
Focus S {{ liveMetaDuration(sessionMeta) || liveRowDuration(row) }} #{{ row.ID }}
Open · {{ liveRowDuration(row) }} (Hidden)
@ map ()
{{row.pnAccount}}
{{row.pnUserRealm}}
{{row.pnAssetAccount}}
{{row.pnAssetRealm}}
Item Code
{{ row.pnItemCode }}: {{ row.ItemCodePath }} open_in_browser

{{ row.service_level_fk }}

{{ row.pnBillingStatus }}

{{ row.pnInvoiceNote }}
people_outline {{row.pnShareLevel}}
event
Date (local time): {{row.pnCustomTimeUTC | date:'HH:mm - EEE d MMM yyyy'}} - Age: -
Completed at (local time): {{row.pnCompletedUTC | date:'HH:mm - EEE d MMM yyyy'}} - Duration: -
auto end: {{ toLocal(row.pnAutoCompletedUTC) }} {{row.pnAutoCompletedReason}} v{{row.pnAutoCompletedVersion}} apply auto clear auto clear end
{{row.pnAccount}} - {{row.pnUserRealm}}
people_outline Share: {{row.pnShareLevel}}
camera_alt
view row...
hide row <<
directions_run{{row.pnUser}}
asgn to {{row.pnAssignedPersonPK}}
S {{row.pnScheduleBacklog}} · due {{ realScheduleDue(row) | date:'yyyy-MM-dd HH:mm' }}
{{ row.ChildCount }} {{ row.ChildCount == 1 ? 'child' : 'children' }} …
x {{row.pnValue | number}}
{{row.pnValueUnit}}
delete Delete: Are you sure? delete cancel
{{row.deleteMessage}} {{row.uiMessage}}
Local autosave: draft unsaved changes restore undo clear archived ({{ row.reply._archivedDraftCount }}) kept 30 days saved {{ row.reply._localDraftSavedAt | date:'short' }} ({{ row.reply._localDraftRevisionCount }} revisions)
{{ row.uiMessage }}
{{ row.reply._draftPreviewTitle }} hide diff
{{ item.label }}
Warning: restoring may clear or change risky fields.
{{ row.reply._draftRestoreWarning }} restore anyway
{{ row.reply._draftClearWarning }} clear anyway
Archived drafts ({{ row.reply._archivedDraftCount }}) — one combined body diff per entry hide
{{ item.archivedAt | date:'short' }} {{ item.reason }} {{ item.revisionCount }} rev = open form
{{ item.bodyPreviewLabel }} · − only left / + only right

                    
                    
Other fields (open form → archive)
{{ d.label }}
Save
{{row.debugMessage}}
🔐 Content Processing · encrypted · decrypted · compressed · plain text
Full passphrase: {{row.edit.passphraseBase + row.edit.passphraseSuffix}}
🔒 Content is encrypted 🔓 Content is decrypted 📦 Content is compressed 📝 Content is plain text
Local autosave: local draft unsaved changes restore undo clear archived ({{ row.edit._archivedDraftCount }}) kept 30 days saved {{ row.edit._localDraftSavedAt | date:'short' }} ({{ row.edit._localDraftRevisionCount }} revisions)
{{ row.uiMessage }}
{{ row.edit._draftPreviewTitle }} hide diff
{{ item.label }}
Warning: restoring may clear or change risky fields.
{{ row.edit._draftRestoreWarning }} restore anyway
{{ row.edit._draftClearWarning }} clear anyway
Archived drafts ({{ row.edit._archivedDraftCount }}) — one combined body diff per entry hide
{{ item.archivedAt | date:'short' }} {{ item.reason }} {{ item.revisionCount }} rev = open form
{{ item.bodyPreviewLabel }} · − only left / + only right

                    
                    
Other fields (open form → archive)
{{ d.label }}
more rows >> less rows << Save Draft Save & Close Cancel
Cancel: Are you sure? yes cancel
by:
Push “due schedule” only if Schedule is checked, incomplete, and Due is near now (UTC).
people_outline Share groupteam person_addclient public
open_in_new
[fetch list] [set]
Details >>
Save & Close
delete {{row.edit.deleteMessage}}
delete Delete: Are you sure? delete cancel
{{row.Message}} {{row.debugMessage}}
refresh expand_more expand_less
Schedule × {{viewMode.hitMessage}} expand_more expand_less
{{addSchedule.uiMessage}}
expand_more expand_less refresh cached top {{viewMode.scheduleCount || 100}}
manage manage
{{row.pnScheduleBacklog}} timer
up
done open_in_new

link Threads · {{ threadUi.activeThread.kind }} — {{ threadUi.activeThread.title }}

Open /threads

Cross-links for invoice / epic / phase work. Does not change parent hierarchy or timestream clocks. /threads

No threads yet. Use New or a row menu → New thread…
{{ threadUi.activeThread.kind }} · {{ threadUi.activeThread.title }} account {{ threadUi.activeThread.accountId }}
Viewing records this thread in History (caption: Thread · kind — title) so it appears under Add to thread as recently viewed.
person_add Add member
Recently viewed notes refresh
No note views in History yet. Open a few notes (view / search by pnid), then refresh.
No members yet. Add by ID above, pick a recent view, or use row ⋮ → Add to thread.

Set progress on each member (or use the thread pill dropdown on the row). Remove unlinks without deleting the note.


Ctrl + Enter to send view show feedback


person home home manage_accounts my account link threads vpn_key sessions & API keys person_outline logout lock update password insert_chart Reports >>

manage_accounts My account

Login
Person ID
Password
Current realm
/
Scan focus
·
Quick links
link Threads vpn_key Sessions & API keys security Security monitoring home Home
notifications Push notifications Device opt-in + server digests

Server can ping start-of-day, due schedule items, and long-open timestreams (“still working?”). Enable this device, save digest prefs, then dogfood with Send / Tick. Host cron should hit POST /api/v2/notifications/tick with X-Cron-Secret every 10–15 minutes.

Web Push likely
Permission
Opt-in
Browser sub
Probe secure= · SW= · PushManager(window)= · pushManager(proto)= · Notification= · //
Blockers:
{{n}}
inbox Notifications inbox {{ pushInbox.summary.counts.total_stack }} pending
A single push is often a digest. This list is the full stack (due schedule + long-open + start-of-day), with why each item qualifies. Local time:
Nothing pending right now (outside windows, already sent, or cleaned up).
Start of day would send skipped — {{ pushInbox.summary.start_of_day.reason }} ({{ pushInbox.summary.start_of_day.time || '08:00' }})
Due schedule ({{ pushInbox.summary.due_schedule.length }})
Long open ({{ pushInbox.summary.long_open.length }})
#{{ item.id }} ~{{ item.age_hours }}h
{{ pushInbox.showRecent ? 'Hide' : 'Show' }} recent sends
Digest preferences (server)
Edge Android: use HTTPS site, not an in-app browser. If permission is Denied, Site permissions → Notifications → Allow, then Enable again. Enable is always clickable so we actually call requestPermission() (mobile needs a tap).
save Local drafts on this device Not on server until you Save
No local working copies, drafts, typing streams, or archives found for this browser.
Note IDModeLocal dataUpdatedPreview
local draft {{ item.draftRevisionCount }} type {{ item.typingTickCount }} arch {{ item.archiveCount }}
Preview #{{ localDraftPreview.rowId }} · {{ localDraftPreview.updatedAt | date:'medium' }} {{ localDraftPreview.bodySource }}
history Recent activity Click to open in this UI
Realms
  • No recent realms yet.
Searches
Scans / tags
devices Active sessions device(s), API key(s)
Open full manager
KindName / deviceLast usedExpires
No active sessions found (or API unavailable). Use the full manager to create integration keys.

Invoice / epic / phase cross-links. Open the full page at /threads or start one from a row ⋮ menu.

open_in_browser Open threads page
No threads yet.

Update Password

{{login.passwordUpdateMessage}}