mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-10-17 13:19:18 +02:00
Adds the MeshCore web client to the Supply Depot catalog (host port 8500), alongside the existing Meshtastic apps. Uses aXistem's prebuilt image of Liam Cottle's MeshCore client (MeshCore is a sibling LoRa mesh project to Meshtastic). The image is stock nginx serving a static Flutter build over HTTP, but the client reaches radios via Web Bluetooth / Web Serial, which browsers only allow from a secure (HTTPS) context. So we serve it over HTTPS: a new preinstall hook generates a self-signed cert + a small SSL nginx config into storage/meshcore-web, both bind-mounted into the container (the config over the image's default.conf), publishing 443. Same one-time browser-warning approach as Vaultwarden, whose openssl cert generation is refactored into a shared _ensureSelfSignedCert helper. Also adds a NOMAD-specific docs section + Manage>Docs anchor, and registers the IconAntenna icon. Meshtastic Web left unchanged. Validated on NOMAD3 (v1.33.0-rc.1): the image + SSL config + self-signed cert serves the MeshCore Flutter app over HTTPS 200 with working SPA fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
140 lines
2.4 KiB
TypeScript
140 lines
2.4 KiB
TypeScript
import {
|
|
IconAntenna,
|
|
IconArrowUp,
|
|
IconBook,
|
|
IconBooks,
|
|
IconBox,
|
|
IconBrain,
|
|
IconBrandDocker,
|
|
IconBroadcast,
|
|
IconChefHat,
|
|
IconCheck,
|
|
IconChevronDown,
|
|
IconChevronLeft,
|
|
IconChevronRight,
|
|
IconCircleCheck,
|
|
IconCloudDownload,
|
|
IconCloudUpload,
|
|
IconCode,
|
|
IconCopy,
|
|
IconCpu,
|
|
IconDatabase,
|
|
IconDownload,
|
|
IconExternalLink,
|
|
IconFileDescription,
|
|
IconFolderOpen,
|
|
IconHome,
|
|
IconInfoCircle,
|
|
IconLogs,
|
|
IconMap,
|
|
IconMenu2,
|
|
IconMoon,
|
|
IconMovie,
|
|
IconNotes,
|
|
IconPencil,
|
|
IconPlant,
|
|
IconPlayerPlay,
|
|
IconPlayerStop,
|
|
IconPlus,
|
|
IconRefresh,
|
|
IconRefreshAlert,
|
|
IconRobot,
|
|
IconSchool,
|
|
IconSearch,
|
|
IconServer,
|
|
IconSettings,
|
|
IconShieldCheck,
|
|
IconShieldLock,
|
|
IconStethoscope,
|
|
IconSun,
|
|
IconTool,
|
|
IconTrash,
|
|
IconUpload,
|
|
IconWand,
|
|
IconWifi,
|
|
IconWorld,
|
|
IconX,
|
|
IconAlertTriangle,
|
|
IconXboxX,
|
|
IconBug,
|
|
IconCopy,
|
|
IconLibrary,
|
|
IconServer,
|
|
IconMenu2,
|
|
IconArrowLeft,
|
|
IconArrowRight,
|
|
} from '@tabler/icons-react'
|
|
|
|
/**
|
|
* An explicit import of used icons in the DynamicIcon component to ensure we get maximum tree-shaking
|
|
* while still providing us a nice DX with the DynamicIcon component and icon name inference.
|
|
* Only icons that are actually used by DynamicIcon should be added here. Yes, it does introduce
|
|
* some manual maintenance, but the bundle size benefits are worth it since we use a (relatively)
|
|
* very limited subset of the full Tabler Icons library.
|
|
*/
|
|
export const icons = {
|
|
IconAntenna,
|
|
IconAlertTriangle,
|
|
IconArrowLeft,
|
|
IconArrowRight,
|
|
IconArrowUp,
|
|
IconBook,
|
|
IconBooks,
|
|
IconBox,
|
|
IconBrain,
|
|
IconBrandDocker,
|
|
IconBroadcast,
|
|
IconBug,
|
|
IconChefHat,
|
|
IconCheck,
|
|
IconChevronDown,
|
|
IconChevronLeft,
|
|
IconChevronRight,
|
|
IconCircleCheck,
|
|
IconCloudDownload,
|
|
IconCloudUpload,
|
|
IconCode,
|
|
IconCopy,
|
|
IconCpu,
|
|
IconDatabase,
|
|
IconDownload,
|
|
IconExternalLink,
|
|
IconFileDescription,
|
|
IconFolderOpen,
|
|
IconHome,
|
|
IconInfoCircle,
|
|
IconLibrary,
|
|
IconLogs,
|
|
IconMap,
|
|
IconMenu2,
|
|
IconMoon,
|
|
IconMovie,
|
|
IconNotes,
|
|
IconPencil,
|
|
IconPlant,
|
|
IconPlayerPlay,
|
|
IconPlayerStop,
|
|
IconPlus,
|
|
IconRefresh,
|
|
IconRefreshAlert,
|
|
IconRobot,
|
|
IconSchool,
|
|
IconSearch,
|
|
IconServer,
|
|
IconSettings,
|
|
IconShieldCheck,
|
|
IconShieldLock,
|
|
IconStethoscope,
|
|
IconSun,
|
|
IconTool,
|
|
IconTrash,
|
|
IconUpload,
|
|
IconWand,
|
|
IconWifi,
|
|
IconWorld,
|
|
IconX,
|
|
IconXboxX
|
|
} as const
|
|
|
|
export type DynamicIconName = keyof typeof icons
|