Vyomi v2.0.6
Real-SPA conformance 35/35, install-funnel phone-home from every install path, Docker Hub metadata rebranded to Vyomi, Azure detail blade gets a wide-view modal, and a 7.5× longer launch timeout that finally lets cold-host LXD spawns complete. v2.0.6 is the polish-and-instrumentation release before we open the gates on the Founding 1000 promo: we can now actually see who installs, from which channel, in which country, and watch them traverse DOWNLOADED → INSTALLED → ACTIVATED on a globe. Plus a stack of UX fixes (S3 Upload button, Azure Connect modal, blade-expand toggle) and a buried 120-second timeout that was silently demoting every cold-host VM to metadata-only.
Added
- Install-funnel phone-home from every package manager —
packaging/common/phone-home.{sh,ps1}fires a single anonymous POST tohttps://vyomi.cloud/api/install/registeronbrew install/apt install/dnf install/scoop install. Payload is{install_id, version, host_os, channel, state: "DOWNLOADED"}; install_id is a 16-char random hex persisted at$HOME/.vyomi/install_id(or%LOCALAPPDATA%\Vyomi\install_idon Windows). Wired intopackaging/homebrew/Formula/vyomi.rbpost_install,packaging/debian/postinst.sh,packaging/rpm/cloud-learn.spec %post, andpackaging/scoop/vyomi.jsonpost_install array. Opt-out viaVYOMI_NO_TELEMETRY=1(also honorsHOMEBREW_NO_ANALYTICS). Closes the funnel that previously only started at "user booted the appliance". - Upgrade-continuity probe — before generating a fresh random id, the phone-home script probes
http://vyomi.local:9000/api/runtime/install-id(new endpoint) and adopts the existing appliance's install_id. This keeps the portal's funnel row continuous when a v2.0.5 user upgrades viabrew upgrade vyomi. Belt-and-suspenders:scripts/cloud-learnalso backfills~/.vyomi/install_idafter a successfulvyomi upif the file is missing. VYOMI_INSTALL_IDenv propagation —core/license_remote.get_or_create_install_id()now adopts a pre-issued install_id from the env (forwarded by the CLI launcher from the host marker file) before falling back to the existing SHA-256-of-hostname derivation. Means the same row in the portal funnel traversesDOWNLOADED → INSTALLED → ACTIVATEDend-to-end.GET /api/runtime/install-id— new read-only endpoint inroutes/runtime.pyreturning the appliance's stable install identifier. Consumed by the upgrade-continuity probe + the CLI's post-upbackfill.GET /api/runtime/version+GET /api/runtime/update-check— version reporting + GitHub-tag-based update-availability check (15-min cache, opt-out viaCLOUDLEARN_UPDATE_CHECK_DISABLED=1). Surfaces the v2.0.6-available banner on the SPA when a newer release is out.vyomi upgradeCLI —scripts/cloud-learn upgradepulls the new image, recreates the simulator container, and waits for healthz. Designed to be safe to run from inside the running appliance.- Public install stats endpoint —
portal/app/installs.py::public_install_stats()exposes{total, active, downloaded, installed, activated, by_state, by_channel, by_country}atGET /api/stats/installs. Country aggregation uses_COUNTRY_META(60 country centroids baked in-module). Powers the marketing globe. - Animated install globe + 4-row funnel stat card on portal home —
portal/app/templates/home.htmlgets a new section right below the Distribution stats. Stat card showsDownloaded → Installed → Activated → Countries; companionglobe.glwidget (lazy-loaded ~250 KB from unpkg) renders pulsing green dots sized by per-country install count, slow auto-rotate, atmospheric glow. Refreshes every 60 s. Fail-soft: country pills below still tell the story if the globe lib doesn't load. channelattribution —ApplianceInstall.channelcolumn +_VALID_CHANNELS = {brew, deb, rpm, scoop, docker, tarball}. First-time channel wins (channel-lock) so a user who deb-installed then later docker-pull'd keeps the original deb attribution. Surfaces in/api/stats/installs by_channelfor funnel reporting.- GitHub community CTA on launch page — new dropdown pill (Star count from
/repos/vyomi-cloud/appliancelive, sessionStorage-cached 10 min) → Watch releases / Discussions / Source / Issues / Contributing.POST /api/runtime/community-clicktracks clicks with a 7-day sliding window for marketing visibility. - ASCII brand banner —
print_brand_banner()inscripts/cloud-learnprints the cyan VYOMI block on everyup/down/restart/upgrade. Idempotent via_VYOMI_BANNER_PRINTED, suppressible viaVYOMI_NO_BANNER=1. - Azure VM Connect "Expand" toggle — detail blade now opens at 880 px (was 560), and the new top-right pill toggles to a centered 92 vw × 92 vh modal dialog with rounded corners and a darker scrim for inspecting long Resource IDs / property bags. Preference persisted via
localStorage["vyomi.azure.subnav.collapsed"].
Fixed
- 35/35 (100%) real-SPA Playwright conformance — closed the 2 remaining gaps from v2.0.5:
providers/gcp_services.pygot 4 firestore database CRUD handlers (api_gcp_firestore_list_databases, create, get, delete) returning the Google-shape{name, uid, createTime, locationId, type, ...}envelope, with 8 new route tuples inproviders/gcp_routes.py(4 verbs × 2 path aliases).routes/aws_extras.pyPOST now write-throughs Alias→alias column, auto-generateskey_idfromsecrets.token_hex(4), and sorts items newest-first bycreated. - LXD launch timeout silently demoting cold-host VMs to metadata-only — root cause of the long-standing "no runtime container backing" error on EC2 / GCE / Azure VMs after a fresh appliance install.
_ensure_containerinserver.pywas passingtimeout=120to_lxd_run_checked(["launch", "ubuntu:24.04", ...]). On a cold host that has to download the ~150 MB image fromimages.linuxcontainers.org, 120 s is short by 2–4 minutes. Bumped to 900 s for LXD and 1200 s for multipass, both env-tunable viaCLOUDLEARN_LXD_LAUNCH_TIMEOUT/CLOUDLEARN_MULTIPASS_LAUNCH_TIMEOUT. Subsequent launches still finish in <10 s because the image is cached locally. Existing failed-state VMs get healed by clicking Restart in the action toolbar. - AWS S3 Upload button was missing entirely — the Objects tab in
static/aws-console.htmlshowed the list but had no upload affordance. Added a primaryUploadbutton + secondaryRefreshat the top of the tab; clicking Upload opens the native multi-select file picker, each file POSTs asmultipart/form-datato/api/s3/buckets/{name}/objects(the wire-compatible endpoint that boto3 +aws s3 cpalready hit), per-file progress in the status text, auto-refresh on completion. Empty buckets now show "Click Upload above" hint instead of just "This bucket is empty". - Azure VM Connect modal showed bare red error for the common metadata-only case — when LXD/multipass isn't reachable, the modal used to dump "This VM has no runtime container backing (metadata-only). To get an SSH/shell target, run the simulator with LXD or multipass on the host and the runtime bridge active." Replaced with a 4-section info layout: amber status banner, VM details as wrap-friendly chips (
Status: Running,Size: Standard_B1s, etc), SSH command preview, and a blue upgrade-path tip linking to docs. New CSS classes.cnx-banner / .cnx-card / .cnx-chip / .cnx-action / .cnx-tip. Modal widened 560 → 760 px with explicitdisplay: flex; flex-direction: columnon the body to prevent layout regressions. - Azure detail blade was wrapping property values mid-character — root cause was the blade itself being only 560 px wide; sub-nav (230 px) + Essentials key column (200 px) left only ~110 px for values like Resource IDs. Bumped default blade width to 880 (matches real Azure portal proportions), reduced essentials key column 200 → 140 px and prop-kv key column 280 → 200, swapped
word-break: break-allforoverflow-wrap: anywherewith properminmax(0, 1fr)grid tracks, addedmin-width: 0everywhere a 1fr blowout was possible. Per-character vertical strips gone.
Changed
- Docker Hub metadata rebranded to Vyomi —
DockerfileOCI labels: title "Vyomi Appliance", vendor "Vyomi", authorssupport@vyomi.cloud, urlhttps://vyomi.cloud, sourcegithub.com/vyomi-cloud/appliance, documentationvyomi.cloud/docs, licensesBUSL-1.1(was incorrectlyMIT).docs/DOCKERHUB.mdrewritten end-to-end for the Hub repo Overview page with vyomi-cloud install paths, BSL 1.1 mentioned, support@vyomi.cloud throughout. Thepeter-evans/dockerhub-description@v4step in.github/workflows/docker-publish.ymlpushes the new README to Hub on the next stable tag. - RPM spec changelog + maintainer email —
packaging/rpm/cloud-learn.specgets a v2.0.6 entry; historical v1.0.0 entry'sCloudLearn <support@cloudlearn.io>corrected toVyomi <support@vyomi.cloud>. - README.md + CHANGELOG.md GitHub URLs — install snippets and reference links migrated from
cloudlearn/cloud-learntovyomi-cloud/appliance. Historical v1.0 release notes left as-is. - License JWT sidecar persists across
docker compose down/up—/data/license-backup.{jwt,json}survives container restarts; FastAPI startup hook restores tier from sidecar. License-activation path also POSTs an ACTIVATED phone-home update bypassing the 24 h throttle.
Notes
- Existing v2.0.5 users upgrading via
brew upgrade vyomi: the phone-home probe automatically picks up your existing appliance's install_id from/api/runtime/install-idso your funnel row stays continuous. If the appliance isn't running during the upgrade, a fresh random id is generated and the first subsequentvyomi upbackfills~/.vyomi/install_idfrom the simulator's STATE. - Existing VMs in
launch_failedstate: click Restart in the action toolbar after upgrading to v2.0.6. The bumped timeout will let the previously-aborted image fetch complete. gansudkum/cloud-learnDocker Hub repo: unchanged in v2.0.6. New images publish only tovyomi/applianceandghcr.io/vyomi-cloud/applianceper the docker-publish workflow.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-2.0.6-1.noarch.rpm
- cloud-learn-2.0.6.tar.gz
- cloud-learn_2.0.6_all.deb
Docker image: docker pull vyomi/appliance:2.0.6
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.