-
Notifications
You must be signed in to change notification settings - Fork 18
Description
This project is tracked on Notion at https://www.notion.so/First-Time-FRAME-Customer-Onboarding-UX-iter-1-2774e612c78a8086a5b6ff70cf8bfff9?source=copy_link
Together with @ethanjli and @gokugiant we have been discussing the best strategy on how to interact with the microscope the first time. Based on valuable feedback from @Mikrodoktor we have probably identified a rough first milestone for our project: See an image through the webinterface and change necessary configurations on the way
Below I formulate the issue and/or necessary steps to reach this goal. It's all very vaguely formulated. The Drawio file for the graph can be found here.
The documentation could/should live here? https://github.com/openUC2/openUC2.github.io/blob/master/docs/05_ImSwitch/01_Quickstart.mdx
So, we want tomplement the end-to-end onboarding for new customers unpacking a FRAME microscope. Users should reach a landing page via LAN or Wi-Fi, configure networking, Tailscale, ImSwitch, updates, and file presets with safe rollback.
Diagram
Scope & Owners
- Frontend/Backend (ImSwitch UI + API, config wizard, update UI, presets, firmware trigger) => I guess @gokugiant
- OS image, networking stack, captive portal, DHCP/DNS, Tailscale, services, persistence, security => I guess @ethanjli
- Testing and complaining: @Mikrodoktor
...but we will learn on the way ;-)
I think the Configuration is shared: @gokugiant you probably provide the schema/UI + API from the ImSwitch/React side and @ethanjli provides storage location, defaults, docker integration, updates through forklift and systemd services.. ?
User flow
I can imagine to have the following pathways:
- LAN => discover device => open IP => Landing Page (discovery either our installer imswitchinstaller/main.js at main · openUC2/ImSwitchInstaller or something like angryipscanner?)
- Wi-Fi => see SSID => connect with PW (youseetoo) => captive portal opens automatically (?) (fallback to IP) => Landing Page
Landing Page cards: Open ImSwitch, Network, Computer, Updates, Files, Tailscale. (@ethanjli you have started that already in the pallet repo https://github.com/openUC2/pallet/
Deliverables
These are some random points that we should discuss! Please complain/change anything :)
App (ImSwitch) @gokugiant
- Config Wizard (first-run + re-run)
- Connect to nearby Wi-Fi (via API to OS) (=> WifiController.py)
- Restore config from file / Fallback
- Show current config + validation in the GUI maybe through the ConfigWizard
- “Safe apply” with auto-rollback on failure - maybe check config for validity/integrity?
- ImSwitch settings pages for:
- API/backend settings (host, ports, HTTPS off/on, tokens)
- Camera, stage, modules; persist via common config store => I think this would be a dreamm..have a page of any of the components in the microscope and have a dropdown to customize the settings - maybeintegrated via the youseetoo.gihtub.io/configurator at one point :) Some inspriation here https://www.nature.com/articles/s41592-021-01315-z (Actually REACT based)
- Files UI (already existing - mostly for images/videos captured with microscope, no OS stuff - has to be served through docker mounts)
- ImSwitchConfig rework
- “Single source of truth” indicator (which node stores master config); how is it loaded, CLI vs python main.py vs. Docker - where do we store it?
- Sideload config via USB drive?
- Error handling: toast + details, retry, copy diagnostics.
- Telemetry/logging: structured logs for onboarding steps.
- Docs: short first-run guide with screenshots.
OS/Networking @ethanjli
- Landing Page (web) with cards linking to modules below.
- Base image with services (systemd) and health-checks via forklift
- Networking modes
- Wi-Fi STA connect (from API)
- AP fallback with captive portal + local DNS (opens landing page)
- LAN discovery (mDNS/LLMNR + DHCP reservation hints)
- Optional tethering (USB↔Ethernet) and LAN↔Wi-Fi bridge mode
- USB to LAN compatibility?
- Captive portal: intercept + redirect to landing; HTTPS-blocking bypass note.
- Device discovery: mDNS
inswitch.local(and variant) with proper firewall settings - Config store
- Location + format (e.g.,
/etc/inswitch/config.yaml+/data/…) - Transactional write with rollback on network loss
- Location + format (e.g.,
- Tailscale
- Preinstalled client; first-run auth flow (QR + URL shown in portal)
- Status JSON for UI; persistent state; ACL docs
- Security
- Firewall defaults (allow LAN portal/API; block WAN where needed)
- Updates UI (maybe through landing page instead?)
- Read versions and display in landing page for OS/app/docker/forklift
- Trigger app/container updates; progress + logs via landing page?
- Firmware updater hook (OS hook?)
...there is probably a lot missing ;)
Acceptance criteria
@Mikrodoktor please add your expectation here :)
- From factory reset, user reaches landing page via either LAN or Wi-Fi in ≤2 min.
- Wizard connects the device to a protected Wi-Fi and keeps access (no lock-out).
- AP fallback works if STA fails; portal opens automatically.
- Tailscale shows “connected” after auth; status visible in UI.
- Config changes are atomic; rollback works on failure.
- Updates show progress and final status; device remains reachable.
- Support bundle downloadable from UI.
- Can connect to nearby Wifi
- Need to be able to update the device in offline-only mode somehow
