Loading...

{{ app.errorMessage }}
{{ widget.title }} {{ widget.w }}×{{ widget.h }}
This folder is empty.
Name {{ app.getHomeDriveWidgetSortIndicator('name') }} Size {{ app.getHomeDriveWidgetSortIndicator('size') }} Created {{ app.getHomeDriveWidgetSortIndicator('createdAt') }}
{{ homeDriveWidgetEntry.name }}
{{ app.formatStorageSize(homeDriveWidgetEntry.sizeBytes) }} {{ homeDriveWidgetEntry.createdAtLabel }}
Loading drive… Select a vessel to load the drive. Drive is not available.
Loading log…
Select a vessel to load the log.
  • No log entries yet. No entries match the active filter.
  • {{ homeShipLogWidgetEntry.occurredAt | date:'shortTime' }} {{ app.getHomeShipLogWidgetEntrySummary(homeShipLogWidgetEntry) }}
    Category {{ app.formatEnumValue(homeShipLogWidgetEntry.category) }}
    When {{ homeShipLogWidgetEntry.occurredAt | date:'medium' }}

    {{ homeShipLogWidgetEntry.payload.note.text }}

    {{ homeShipLogWidgetEntry.payload.text || homeShipLogWidgetEntry.payload.description || homeShipLogWidgetEntry.payload.notes }}

    {{ app.eventComponentNameById(engineRow.componentId) }} {{ engineRow.quantity.value }} {{ app.formatEnumValue(engineRow.quantity.unit) }}
    {{ app.eventComponentNameById(tankRow.componentId) }} {{ app.formatEnumValue(tankRow.measurementType) }} {{ tankRow.quantity.value }} {{ app.formatEnumValue(tankRow.quantity.unit) }}
    {{ app.eventComponentNameById(batteryRow.componentId) }} {{ batteryRow.quantity.value }} {{ app.formatEnumValue(batteryRow.quantity.unit) }}
    {{ sighting.species }} {{ app.formatEnumValue(sighting.encounterType) }} × {{ sighting.quantity || 1 }}
    Wind {{ homeShipLogWidgetEntry.payload.weather.windSpeed.value }} {{ app.formatEnumValue(homeShipLogWidgetEntry.payload.weather.windSpeed.unit) }} {{ homeShipLogWidgetEntry.payload.weather.windDirection }}
    Swell {{ homeShipLogWidgetEntry.payload.weather.swellHeight.value }} {{ app.formatEnumValue(homeShipLogWidgetEntry.payload.weather.swellHeight.unit) }}
    Temp {{ homeShipLogWidgetEntry.payload.weather.temperature.value }}° {{ app.formatEnumValue(homeShipLogWidgetEntry.payload.weather.temperature.unit) }}
    Visibility {{ homeShipLogWidgetEntry.payload.weather.visibility }}
    Sea state {{ homeShipLogWidgetEntry.payload.weather.seaState }}
    Conditions {{ homeShipLogWidgetEntry.payload.weather.conditions }}
    Location {{ homeShipLogWidgetEntry.payload.mooring.locationDescription }}
    Notes {{ homeShipLogWidgetEntry.payload.mooring.notes }}
    Lat {{ homeShipLogWidgetEntry.payload.location.latitude }}
    Lon {{ homeShipLogWidgetEntry.payload.location.longitude }}
    Description {{ homeShipLogWidgetEntry.payload.location.locationDescription }}
All pill buttons are hidden.
Loading inventory…
Select a vessel to load inventory.
No inventory items yet.
Showing {{ app.getHomeInventoryWidgetActiveLocationName() }} only — vessel-wide totals hidden

Low supply

{{ app.getHomeInventoryWidgetLowSupplyRows().length }}

Every item with a minimum stock level is at or above its minimum.

  • {{ homeInventoryLowSupplyRow.inventoryItem.name }} {{ app.formatHomeInventoryWidgetQuantity(homeInventoryLowSupplyRow) }} {{ app.formatHomeInventoryWidgetUnit(homeInventoryLowSupplyRow) }} / min {{ homeInventoryLowSupplyRow.minimumStockLevel }}

All items

{{ app.getHomeInventoryWidgetAllRows().length }}
  • {{ homeInventoryAllRow.inventoryItem.name }} {{ app.formatHomeInventoryWidgetQuantity(homeInventoryAllRow) }} {{ app.formatHomeInventoryWidgetUnit(homeInventoryAllRow) }} / min {{ homeInventoryAllRow.minimumStockLevel }}

Could not load on-hand quantities: {{ app.inventoryItemQuantityAggregatesErrorMessage }}

Loading checklists…
Select a vessel to load checklists.

Running

{{ app.getHomeChecklistWidgetRunningRows().length }}

No checklists are currently running.

Recently run

{{ app.getHomeChecklistWidgetRecentRows().length }}

No checklists have been completed yet.

  • {{ homeChecklistRecentRow.runName }} {{ homeChecklistRecentRow.totalItemCount }} {{ app.formatHomeChecklistWidgetRunCompletedAt(homeChecklistRecentRow) }}

Could not load checklists: {{ app.getHomeChecklistWidgetErrorMessage() }}

Loading maintenance tasks…
Select a vessel to load maintenance tasks.
No upcoming maintenance tasks.

Late

{{ app.getHomeMaintenanceWidgetLateRows().length }}

Due

{{ app.getHomeMaintenanceWidgetDueRows().length }}

Not yet due

{{ app.getHomeMaintenanceWidgetNotYetDueRows().length }}

No due date

{{ app.getHomeMaintenanceWidgetNoDueDateRows().length }}
Loading chat…
Select a vessel to load chat.

No chat activity yet.

Could not load chat: {{ app.getHomeChatWidgetErrorMessage() }}

Loading calendar…
Select a vessel to load the calendar.
Events
Tasks
{{ app.getHomeCalendarSelectedDateLabel() }}
  • No events or tasks for this day.
  • {{ homeCalendarSelectedItem.title }} {{ app.formatEnumValue(homeCalendarSelectedItem.category) }} {{ app.formatEnumValue(homeCalendarSelectedItem.taskKindKey) }}

{{ widget.title }} widget content coming soon.

Onboarding Assistant

{{ app.onboardingConversationActive ? 'Active' : 'Ready' }}

Start an onboarding chat to catalog your vessel systems and component hierarchy.

{{ message.role === 'user' ? 'You' : 'Azimuth Assistant' }}

{{ message.text }}

Uploading... Queued: {{ app.getImageUploadQueueCount('onboarding') }}
{{ app.onboardingImageClipboardWarningMessage }}
✓ Image uploaded successfully
✕ {{ app.onboardingImageUploadErrorMessage }}
Press and hold to record and release to stop, or click start and click stop.
Recording in progress...
Uploading recorded audio...
Audio is ready for Send.
Audio recording is not supported in this browser.
Images ready: {{ app.onboardingPendingImageUrls.length }}
Audio ready for next message.
{{ app.onboardingErrorMessage }}

Pending Component Hierarchy

Start onboarding to see detected systems and relationships.

Components

{{ app.getActiveVesselComponents().length }}

Select a vessel from your profile menu to view components.

No components yet. Add your first component to get started.

Inventory

{{ app.inventoryItems.length }}

Loading inventory items...

📦

No inventory items yet.

inventory

{{ inventoryItem.name }}

Type {{ inventoryItem.inventoryItemType }}
Quantity Unit {{ inventoryItem.quantityUnit }}
Root Component {{ app.resolveVesselName(inventoryItem.vesselId) }}
Minimum Stock {{ inventoryItem.minStockLevel }}
Part Number {{ inventoryItem.attributes.partNumber }}
Images {{ inventoryItem.attributes.images.length }}

Inventory Templates

{{ app.inventoryTemplates.length }}

Loading inventory templates...

📦

No inventory templates yet.

template

{{ inventoryTemplate.name }}

Type {{ inventoryTemplate.inventoryItemType }}
Quantity Unit {{ inventoryTemplate.quantityUnit }}
Part Number {{ inventoryTemplate.attributes.partNumber }}
Images {{ inventoryTemplate.attributes.images.length }}

drive

{{ app.driveTree.rootDirectory.files.length }}
{{ app.driveErrorMessage }}

Loading drive...

📂

Select a vessel from your profile menu to load the drive.

📁

No drive data found for this root component.

Used: {{ app.formatStorageSize((app.driveStorageUsage && app.driveStorageUsage.usedBytes) || app.driveTree.storageUsage.usedBytes) }} Quota: {{ app.formatStorageSize((app.driveStorageUsage && app.driveStorageUsage.quotaBytes) || app.driveTree.storageUsage.quotaBytes) }} Selected files: {{ app.getDriveSelectedFileIds().length }}
{{ app.getDriveSelectedFileIds().length }} selected
{{ app.driveBulkActionErrorMessage }}

Folders

Files

{{ app.driveUploadStatusMessage }}
Upload Queue
{{ app.getDriveUploadQueueProgressLabel() }}
  • {{ uploadQueueEntry.name }} {{ uploadQueueEntry.status }} {{ uploadQueueEntry.message }}
Drag and drop a file anywhere in this panel to upload into the selected folder.

No files in this folder.

No files match the current filters.

Name Size Preview Actions
{{ file.name }}
{{ driveFileInfoSegment.label }} |
{{ app.formatStorageSize(file.latestSizeBytes) }}
Preview for {{ file.name }}
Loading... Unavailable

GPX Pro Dashboard

Hover map/chart for preview. Click to lock point.
{{ app.gpxErrorMessage }}

Loading GPX data...

LOCKED Time: {{ app.formatGpxPointTime(app.gpxActivePoint) }} | Speed: {{ app.convertGpxSpeed(app.gpxActivePoint.speedKph) | number:1 }} {{ app.getGpxUnitLabel() }} | Location: {{ app.gpxActivePoint.lat | number:5 }}, {{ app.gpxActivePoint.lon | number:5 }}
Upload a GPX file and hover over the route or histogram to inspect telemetry.

Checklists

{{ app.checklistTemplates.length }} templates {{ app.checklistActiveRuns.length }} active
🚦

Select a vessel you can access to manage templates and active runs.

Templates

Loading templates...

{{ app.checklistTemplatesErrorMessage }}

No templates yet for this boat.

{{ checklistTemplateWithItems.template.name }}

{{ checklistTemplateWithItems.template.description }}

{{ checklistTemplateWithItems.items.length }} items

Active Runs

Loading active runs...

{{ app.checklistActiveRunsErrorMessage }}

No active runs yet.

{{ checklistRunAggregate.run.name }}

Updated {{ app.formatSmartLocalTimestamp(checklistRunAggregate.run.updatedAt) }}

{{ checklistRunAggregate.items.length }} items

Chat

{{ app.chatChannels.length }} channels
💬

Select a vessel to open chat.

{{ app.chatThreadTitle() }}

Loading messages...

{{ app.chatMessagesErrorMessage }}
{{ app.resolveChatMessageAuthorLabel(chatMessage) }} {{ app.formatSmartLocalTimestamp(chatMessage.updatedAt) }}

{{ app.chatLatestMessageText(chatMessage) }}

{{ app.chatTypingIndicatorText() }}
Image to send
Uploading... Queued: {{ app.getImageUploadQueueCount('chatComposer') }}
{{ app.chatComposerImageClipboardWarningMessage }}
✓ Image uploaded successfully
✕ {{ app.chatComposerImageUploadErrorMessage }}

Select a channel to view messages.

Ship's Log

{{ app.eventVisibleEntries().length }}

Loading ship's log…

No log entries match the current filter.

Tap an action above or type in the omnibox to log a moment aboard.

  • {{ entry.occurredAt | date:'shortTime' }}
    {{ app.formatEnumValue(entry.payload.tile) || 'Navigation update' }}

    {{ entry.payload.notes || entry.payload.description }}

    {{ app.formatEnumValue(entry.payload.tile) || 'Fuel' }}
    {{ entry.payload.amount }} {{ app.formatEnumValue(entry.payload.unit) }}

    {{ entry.payload.notes }}

    {{ app.formatEnumValue(entry.payload.tile) || 'Engine update' }}

    {{ entry.payload.description }}

    {{ entry.payload.species || 'Wildlife sighting' }}

    {{ entry.payload.notes }}

    {{ entry.payload.locationDescription || 'Mooring' }}

    {{ entry.payload.notes }}

    {{ entry.payload.text || entry.payload.description || entry.payload.notes }}

    {{ app.formatEnumValue(entry.payload.tile) }}

    {{ entry.payload.description || entry.payload.notes || entry.payload.text }}

    Note

    {{ entry.payload.note.text }}

    Engine Hours
    {{ app.eventComponentNameById(engineRow.componentId) }} {{ engineRow.quantity.value }} {{ app.formatEnumValue(engineRow.quantity.unit) }}
    Tanks
    {{ app.eventComponentNameById(tankRow.componentId) }} {{ app.formatEnumValue(tankRow.measurementType) }} {{ tankRow.quantity.value }} {{ app.formatEnumValue(tankRow.quantity.unit) }}
    Batteries
    {{ app.eventComponentNameById(batteryRow.componentId) }} {{ batteryRow.quantity.value }} {{ app.formatEnumValue(batteryRow.quantity.unit) }}
    Wildlife
    {{ sighting.species }} {{ app.formatEnumValue(sighting.encounterType) }} × {{ sighting.quantity || 1 }}
    Weather
    Wind {{ entry.payload.weather.windSpeed.value }} {{ app.formatEnumValue(entry.payload.weather.windSpeed.unit) }} {{ entry.payload.weather.windDirection }}
    Swell {{ entry.payload.weather.swellHeight.value }} {{ app.formatEnumValue(entry.payload.weather.swellHeight.unit) }}
    Temp {{ entry.payload.weather.temperature.value }}° {{ app.formatEnumValue(entry.payload.weather.temperature.unit) }}
    Visibility {{ entry.payload.weather.visibility }}
    Sea state {{ entry.payload.weather.seaState }}
    Conditions {{ entry.payload.weather.conditions }}
    Mooring
    Location {{ entry.payload.mooring.locationDescription }}
    Notes {{ entry.payload.mooring.notes }}
    Location
    Lat {{ entry.payload.location.latitude }}
    Lon {{ entry.payload.location.longitude }}
    Description {{ entry.payload.location.locationDescription }}

Maintenance Schedules

{{ app.filteredMaintenanceSchedules().length }}

Loading...

📅

No maintenance schedules yet. Add your first schedule to get started.

Name Component Interval Status Actions
{{ schedule.name }} {{ app.resolveComponentName(schedule.componentId) }} {{ app.buildScheduleIntervalSummary(schedule) }} Active Inactive

{{ app.selectedSchedule ? app.selectedSchedule.name + ' Tasks' : 'All Tasks' }}

{{ app.filteredMaintenanceTasks().length }}

Loading...

No tasks yet. Add your first task to get started.

Title Schedule Status Progress Due Date Due Hours Actions
{{ task.title }} {{ app.resolveScheduleName(task.maintenanceScheduleId) || '—' }} {{ app.formatEnumValue(task.status) }} {{ app.formatEnumValue(task.progress) }} {{ task.dueDate }} {{ task.dueHours }}

Invitations

{{ app.invitations.length }}

Loading...

No invitations created yet.

Code Status Expires At Created At
{{ invitation.id }} {{ app.formatEnumValue(invitation.status) }} {{ invitation.expiresAt | date:'yyyy-MM-dd HH:mm' : 'UTC' }} {{ invitation.createdAt | date:'yyyy-MM-dd HH:mm' : 'UTC' }}

Users

{{ app.users.length }}

Loading...

👥

No users found.

Name Email Roles Created At
{{ user.firstName }} {{ user.lastName }} {{ user.email }}
{{ app.formatEnumValue(role) }}
{{ user.createdAt | date:'yyyy-MM-dd HH:mm' : 'UTC' }}

Locations

{{ app.locations.length }}

Loading locations...

🚪

No locations yet.

location

{{ location.name }}

{{ location.description }}

Images {{ location.attributes.images.length }}