Loading...

{{ app.errorMessage }}
{{ widget.title }} {{ widget.w }}×{{ widget.h }} {{ app.getHomeWidgetPhoneSummary(widget) }}
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 }}
    {{ checklistItem.title }} {{ checklistItem.notes }} {{ checklistItem.measuredValue }} {{ app.formatEnumValue(checklistItem.unitType) }} {{ app.formatEnumValue(checklistItem.status) }}
    {{ app.eventComponentNameById(homeShipLogWidgetEntry.payload.componentId) }}
    {{ workLog.title || 'Work log' }} {{ workLog.notes }} {{ app.formatEnumValue(workLog.status) }}
    {{ app.formatEnumValue(expenseLine.costType) }} {{ expenseLine.note }} {{ expenseLine.amount }} {{ expenseLine.currency }}
All pill buttons are hidden.
Loading inventory…
Select a vessel to load inventory.
No inventory items yet.
Showing {{ app.getHomeInventoryWidgetOnVesselFilterLabel() }} locations only
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 maintenance tasks.
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 }}

Loading components...

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.

Placement
Location
Showing {{ app.getInventoryPageOnVesselFilterLabel() }} locations only
Showing {{ app.getInventoryPageActiveLocationName() }} only — other locations hidden
Name Type Unit Level Min Level Actions
{{ inventoryRow.inventoryItem.name }} {{ inventoryRow.inventoryItem.inventoryItemType }} {{ app.formatInventoryPageUnit(inventoryRow) }} {{ app.formatInventoryPageLevel(inventoryRow) }} {{ inventoryRow.hasConfiguredMinimum ? inventoryRow.minimumStockLevel : '\u2014' }}

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

Inventory Templates

{{ app.inventoryTemplates.length }}

Loading inventory templates...

📦

No inventory templates yet.

Name Type Unit Part Number Images Actions
{{ inventoryTemplate.name }} {{ inventoryTemplate.inventoryItemType }} {{ inventoryTemplate.quantityUnit }} {{ inventoryTemplate.attributes.partNumber || '\u2014' }} {{ (inventoryTemplate.attributes.images && inventoryTemplate.attributes.images.length) || 0 }}

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.getDriveStorageUsedLabel() }}
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 }} {{ app.driveThemeValidationBadgeLabel(file) }}
{{ 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 }}

{{ app.countActionableChecklistItems(checklistTemplateWithItems.items) }} items

Active Runs

Loading active runs...

{{ app.checklistActiveRunsErrorMessage }}

No active runs yet.

{{ checklistRunAggregate.run.name }}

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

{{ app.countActionableChecklistItems(checklistRunAggregate.items) }} 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) || 'Water' }}
    {{ 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.eventCompletionHeadline(entry) }}
    {{ 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 }}
    Checklist Items
    {{ checklistItem.title }} {{ checklistItem.notes }} {{ checklistItem.measuredValue }} {{ app.formatEnumValue(checklistItem.unitType) }} {{ app.formatEnumValue(checklistItem.status) }}
    Maintenance
    Component {{ app.eventComponentNameById(entry.payload.componentId) }}
    Work Performed
    {{ workLog.title || 'Work log' }} {{ workLog.notes }} {{ app.formatEnumValue(workLog.status) }}
    Expenses
    {{ app.formatEnumValue(expenseLine.costType) }} {{ expenseLine.note }} {{ expenseLine.amount }} {{ expenseLine.currency }}

Expenses

{{ app.expensesReport.total | currency:app.expensesReport.currencySymbol }}
Loading expenses…
{{ app.expensesReport.error }}
No expenses recorded for the selected range. Log a cost line from the Ship's Log to see it here.
Total spend
{{ app.expensesReport.total | currency:app.expensesReport.currencySymbol }}
By source
{{ sourceRow.label }} {{ sourceRow.amount | currency:app.expensesReport.currencySymbol }}
By cost type
{{ costTypeRow.label }} {{ costTypeRow.amount | currency:app.expensesReport.currencySymbol }}
By component group
{{ componentGroupRow.label }} {{ componentGroupRow.amount | currency:app.expensesReport.currencySymbol }}
By component
{{ componentRow.label }} {{ componentRow.amount | currency:app.expensesReport.currencySymbol }}

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' }}

Vessels

{{ app.vessels.length }}

Loading...

No vessels yet.

Name Timezone Created At Modified At
{{ vessel.name }} {{ vessel.currentTimezone }} {{ vessel.createdAt | date:'yyyy-MM-dd HH:mm' : 'UTC' }} {{ vessel.updatedAt | date:'yyyy-MM-dd HH:mm' : 'UTC' }}

Locations

{{ app.locations.length }}

Loading locations...

🚪

No locations yet.

Name Description On Vessel Images Actions
{{ location.name }} {{ location.description || '\u2014' }} {{ location.attributes.onVessel !== false ? 'Yes' : 'No' }} {{ location.attributes.images.length || 0 }}

Charters

{{ app.charters.length }}

Loading charters...

No charters yet.

Title Make / Model Length Guests Cabins Price Published Images Actions
{{ charter.attributes.title }} {{ app.charterMakeModel(charter) || '\u2014' }} {{ charter.attributes.lengthFeet ? (charter.attributes.lengthFeet + ' ft') : '\u2014' }} {{ charter.attributes.passengerLimit || '\u2014' }} {{ charter.attributes.cabins || '\u2014' }} {{ app.charterPriceLabel(charter.attributes.price) }} {{ charter.attributes.published ? 'Yes' : 'No' }} {{ charter.attributes.images.length || 0 }}

Search

Searching...

🔍

No results for “{{ app.searchPageQuery }}”.

{{ section.label }}

  • {{ hit.title }} — {{ app.searchHitDetailLabel(hit) }}