Skip to content

Vyomi v2.0.6

Choose a tag to compare

@github-actions github-actions released this 18 Jun 22:46
· 32 commits to main since this release

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 managerpackaging/common/phone-home.{sh,ps1} fires a single anonymous POST to https://vyomi.cloud/api/install/register on brew 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_id on Windows). Wired into packaging/homebrew/Formula/vyomi.rb post_install, packaging/debian/postinst.sh, packaging/rpm/cloud-learn.spec %post, and packaging/scoop/vyomi.json post_install array. Opt-out via VYOMI_NO_TELEMETRY=1 (also honors HOMEBREW_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 via brew upgrade vyomi. Belt-and-suspenders: scripts/cloud-learn also backfills ~/.vyomi/install_id after a successful vyomi up if the file is missing.
  • VYOMI_INSTALL_ID env propagationcore/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 traverses DOWNLOADED → INSTALLED → ACTIVATED end-to-end.
  • GET /api/runtime/install-id — new read-only endpoint in routes/runtime.py returning the appliance's stable install identifier. Consumed by the upgrade-continuity probe + the CLI's post-up backfill.
  • GET /api/runtime/version + GET /api/runtime/update-check — version reporting + GitHub-tag-based update-availability check (15-min cache, opt-out via CLOUDLEARN_UPDATE_CHECK_DISABLED=1). Surfaces the v2.0.6-available banner on the SPA when a newer release is out.
  • vyomi upgrade CLIscripts/cloud-learn upgrade pulls 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 endpointportal/app/installs.py::public_install_stats() exposes {total, active, downloaded, installed, activated, by_state, by_channel, by_country} at GET /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 homeportal/app/templates/home.html gets a new section right below the Distribution stats. Stat card shows Downloaded → Installed → Activated → Countries; companion globe.gl widget (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.
  • channel attributionApplianceInstall.channel column + _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_channel for funnel reporting.
  • GitHub community CTA on launch page — new dropdown pill (Star count from /repos/vyomi-cloud/appliance live, sessionStorage-cached 10 min) → Watch releases / Discussions / Source / Issues / Contributing. POST /api/runtime/community-click tracks clicks with a 7-day sliding window for marketing visibility.
  • ASCII brand bannerprint_brand_banner() in scripts/cloud-learn prints the cyan VYOMI block on every up/down/restart/upgrade. Idempotent via _VYOMI_BANNER_PRINTED, suppressible via VYOMI_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.py got 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 in providers/gcp_routes.py (4 verbs × 2 path aliases). routes/aws_extras.py POST now write-throughs Alias→alias column, auto-generates key_id from secrets.token_hex(4), and sorts items newest-first by created.
  • 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_container in server.py was passing timeout=120 to _lxd_run_checked(["launch", "ubuntu:24.04", ...]). On a cold host that has to download the ~150 MB image from images.linuxcontainers.org, 120 s is short by 2–4 minutes. Bumped to 900 s for LXD and 1200 s for multipass, both env-tunable via CLOUDLEARN_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.html showed the list but had no upload affordance. Added a primary Upload button + secondary Refresh at the top of the tab; clicking Upload opens the native multi-select file picker, each file POSTs as multipart/form-data to /api/s3/buckets/{name}/objects (the wire-compatible endpoint that boto3 + aws s3 cp already 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 explicit display: flex; flex-direction: column on 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-all for overflow-wrap: anywhere with proper minmax(0, 1fr) grid tracks, added min-width: 0 everywhere a 1fr blowout was possible. Per-character vertical strips gone.

Changed

  • Docker Hub metadata rebranded to VyomiDockerfile OCI labels: title "Vyomi Appliance", vendor "Vyomi", authors support@vyomi.cloud, url https://vyomi.cloud, source github.com/vyomi-cloud/appliance, documentation vyomi.cloud/docs, licenses BUSL-1.1 (was incorrectly MIT). docs/DOCKERHUB.md rewritten end-to-end for the Hub repo Overview page with vyomi-cloud install paths, BSL 1.1 mentioned, support@vyomi.cloud throughout. The peter-evans/dockerhub-description@v4 step in .github/workflows/docker-publish.yml pushes the new README to Hub on the next stable tag.
  • RPM spec changelog + maintainer emailpackaging/rpm/cloud-learn.spec gets a v2.0.6 entry; historical v1.0.0 entry's CloudLearn <support@cloudlearn.io> corrected to Vyomi <support@vyomi.cloud>.
  • README.md + CHANGELOG.md GitHub URLs — install snippets and reference links migrated from cloudlearn/cloud-learn to vyomi-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-id so your funnel row stays continuous. If the appliance isn't running during the upgrade, a fresh random id is generated and the first subsequent vyomi up backfills ~/.vyomi/install_id from the simulator's STATE.
  • Existing VMs in launch_failed state: 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-learn Docker Hub repo: unchanged in v2.0.6. New images publish only to vyomi/appliance and ghcr.io/vyomi-cloud/appliance per 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.