Releases: vyomi-cloud/appliance
Vyomi v2.0.1
Zero-config first launch. v2.0.0 shipped HTTPS via mkcert + Caddy at https://vyomi.local:9443, but a fresh laptop hit three Chrome gotchas in sequence: (1) Secure DNS bypassing /etc/hosts for .local TLDs, (2) HSTS cache locking failed early attempts into HTTPS-only, (3) HTTPS-First Mode auto-upgrading http:// requests. Users were dropped into chrome://net-internals/#hsts to debug. v2.0.1 sidesteps all three by pivoting the canonical URL to https://localhost:9443/ — a hostname Chrome universally trusts. mkcert already covered localhost in its SAN list, so the green padlock works without any browser config changes.
Added
socatlocalhost bridge —vyomi upnow forwards127.0.0.1:9000→VM_IP:9000and127.0.0.1:9443→VM_IP:9443via two host-sidesocatprocesses (PIDs tracked at~/.vyomi/run/socat-*.pid). Bridge is loopback-only (bind=127.0.0.1) — not reachable from outside the laptop. Idempotent — old PIDs killed before respawn.vyomi down/stop/killtear it down cleanly.- Auto browser open — after the health check passes, the launcher opens the working URL in the default browser (
openon macOS,xdg-openon Linux,Start-Processon Windows). HonorsVYOMI_NO_OPEN=1for CI / headless / scripted environments. - Loud mkcert failure surface — if the user dismisses the sudo prompt for
mkcert -install, the launcher now prints a clearly-visible yellow⚠warning with the exact remediation command (brew install mkcert && vyomi restart). Old behaviour was a silentverbose-mode-onlylog line that users missed.
Changed
- Default appliance URL →
https://localhost:9443/(washttps://vyomi.local:9443/). Banner probe ladder trieslocalhost:9443(TLS) →vyomi.local:9443(TLS) →localhost:9000(HTTP) →vyomi.local:9000(HTTP) → IP, and picks the first reachable one as primary. The other reachable URLs are advertised as fallbacks. Existing v2.0.0 URLs continue to work — this is purely a default-routing change. - mkcert SAN order — the leaf cert is now generated with
localhost 127.0.0.1 vyomi.local(wasvyomi.local localhost 127.0.0.1). The cert covers the exact same names — just primary subject swapped to match the new default URL. Existing certs from v2.0.0 stay valid (all SANs preserved). Force regeneration withVYOMI_REISSUE_TLS=1 vyomi up. - Brew formula adds
depends_on "socat"anddepends_on "mkcert"— both are required for the green-padlock-by-default UX. Pre-fetching them atbrew install vyomitime means the firstvyomi uphas one fewer interactive prompt. Reinstall to pick up:brew reinstall vyomi.
Notes for users on v2.0.0
- After
brew reinstall vyomi, runvyomi restartonce. The new launcher will start the socat bridge against your existing VM and your browser will land onhttps://localhost:9443/. - The
vyomi.localand192.168.x.xURLs from v2.0.0 still work — they're now listed as fallbacks rather than primary. - If your Chrome had cached HSTS / HTTPS-First Mode for
vyomi.local, the localhost pivot makes that irrelevant. You don't need to clear anything. - Windows: the localhost bridge is not yet wired (no
socatin standard tools). Windows users continue to hitvyomi.local:9443directly.netsh interface portproxy-based bridge is a v2.1.0 follow-up.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-2.0.1-1.noarch.rpm
- cloud-learn-2.0.1.tar.gz
- cloud-learn_2.0.1_all.deb
Docker image: docker pull vyomi/appliance:2.0.1
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
Vyomi v2.0.0
The vyomi-branded release. 13-phase rebrand campaign: CLI binary, brew formula, Docker Hub namespace, GitHub org, license (MIT → BSL 1.1), HTTP headers, env vars, Python modules, filesystem paths, Docker volumes, Multipass VM name, and HTTPS by default. Every layer ships with runtime back-compat so v1.x upgrades are transparent. See docs/MIGRATION-v2.md for the upgrade guide.
Changed — BREAKING
- HTTPS via mkcert + Caddy — the simulator is now reachable at
https://vyomi.local:9443with a green padlock (no 'Not Secure' browser warning). On firstvyomi up(orinstall.shcurl-bash run), the launcher detects missingmkcert, offers to install it (brew/apt/dnf/winget), runsmkcert -installonce to add a local CA to the system trust store (one sudo/UAC prompt accepted forever), then generates a cert+key forvyomi.local + localhost + 127.0.0.1at~/.vyomi/tls/. The cert is bind-mounted into a Caddy sidecar container (added to bothdocker-compose.ymlanddocker-compose.appliance.yml) that terminates TLS and reverse-proxies to the simulator on port 9000. HTTP on:9000remains reachable as a fallback for scripts that don't validate certs. SetVYOMI_NO_TLS=1to skip the whole flow.VYOMI_REISSUE_TLS=1to force regenerate.VYOMI_TLS_DIRto override the cert location. Caddyfile lives atpackaging/caddy/Caddyfile— swappable to nginx/Traefik later without touchingserver.py. - Docker volumes renamed
cloudlearn-*→vyomi-*in bothdocker-compose.yml(compose path) anddocker-compose.appliance.yml(Multipass appliance path). 9 volumes:vyomi-data,vyomi-sql-pg,vyomi-sql-mysql,vyomi-gcs,vyomi-nats,vyomi-minio,vyomi-dynamodb,vyomi-portal-keys,vyomi-portal-data(cloudsim-dataalready neutral, untouched). Fresh installs use the new names. Existing users upgrading from v1.x must runbash scripts/migrate-volumes-vyomi.shONCE betweendocker compose downanddocker compose up -d— copies all data fromcloudlearn-*volumes into the newvyomi-*equivalents. The legacy volumes are left in place after migration for safe rollback; delete them withdocker volume rm cloudlearn-*once satisfied. - Multipass VM name defaults to
vyomi-appliancefor fresh installs. Existing installs with acloudlearn-applianceVM (created pre-v2.0.0) keep using the old name — the launcher auto-detects viamultipass infoand avoids destroying state. The VM name surfaces only inmultipass info <name>; users hit the simulator atvyomi.local:9000regardless (mDNS publishing handles the brand-facing hostname). Env overrideVYOMI_APPLIANCE_NAMEadded (mirrorsCLOUD_LEARN_APPLIANCE_NAMEvia Phase 8 env aliases). - Filesystem paths renamed
~/.cloud-learn/(launcher state) and~/.cloudlearn/(compose install) →~/.vyomi/with one-time migration. On first v2.0.0 boot: if either old path exists and~/.vyomi/doesn't, the launcher atomically renames it + creates a back-compat symlink at the old path. Bothcloud-learn upand theinstall.shcurl-bash flow run the migration independently. End users with existing state (logs at~/.cloud-learn/logs/, appliance bootstrap files at~/.cloud-learn/appliance/<vm>/, compose state at~/.cloudlearn/{compose,data,deployments}/) experience zero data loss. Idempotent — does nothing once~/.vyomi/is the canonical dir. The two old launcher/compose path namespaces were inconsistent (hyphen vs no-hyphen); this rename unifies them under~/.vyomi/. Symlink retired in v3.0. NOT touched in this phase:/etc/cloudlearn/(deb/rpm system config),/var/lib/cloudlearn/(inside-VM state) — those are higher-risk and deferred to a focused later release. - Python modules renamed
core.cloudlearn_*→core.vyomi_*with full back-compat re-export shims at the old paths. Affected:core.cloudlearn_platform→core.vyomi_platform(with internal classCloudLearnPlatform→VyomiPlatformand back-compat alias inside the module), and 14packs.azure.cloudlearn_azure_*→packs.azure.vyomi_azure_*modules. Old import paths (from core.cloudlearn_platform import CloudLearnPlatform) keep working — the shim re-exports the canonical names. Pack identifier strings (e.g.cloudlearn.azure.vm.basic) are unchanged for now (catalog-internal, not user-visible). Removal slated for v3.0. - Environment variables renamed
CLOUDLEARN_*→VYOMI_*with full back-compat. A new runtime mirror (core/env_aliases.mirror_env) populates both spellings inos.environat server startup — existing deployments,.envfiles, Dockerfiles, and CI configs keep working unchanged..env.examplenow usesVYOMI_*as the documented canonical name.docker-compose.ymlinterpolations use a dual fallback${VYOMI_X:-${CLOUDLEARN_X:-default}}so users overriding via either name win. The bash launcher (scripts/cloud-learn) does the same mirror at shell level sodocker composeandmultipass execsubshells see both spellings. Conflict-safe: if both names are set with different values, neither is overwritten and a one-line stderr warning is emitted at startup. Removal slated for v3.0. - HTTP headers renamed
X-CloudLearn-*→X-Vyomi-*with full back-compat. A new ASGI middleware (core/header_aliases.HeaderAliasMiddleware) transparently bridges both names on every request and response: clients can send either spelling, the server reflects both back on responses. SPA + portal-shipped SDKs now sendX-Vyomi-*exclusively; legacyX-CloudLearn-*consumers (older SPA cached in browsers, third-party scripts) keep working. Affected headers: Tenant, Tier, Tier-Denied, Principal, Acting-As-Tenant, XTRBAC-Denied, Cedar-Denied, SSO-Denied, Admin-Key, Bridge-Token, CI-Secret, Notif-Secret, Sink-Secret, Host-OS. Removal slated for v3.0. - CLI binary renamed
cloud-learn→vyomiwith acloud-learndeprecation shim. The shim prints a one-line yellow warning to stderr on every interactive invocation (suppressible viaVYOMI_NO_DEPRECATION_WARN=1) and thenexecsvyomiwith the same args. End users on every install path see the binary rename simultaneously:- Brew:
bin/vyomi(primary) andbin/cloud-learn(shim) both shipped with the formula - DEB/RPM:
/usr/bin/vyomi(primary) and/usr/bin/cloud-learn(shim) installed by the package - Scoop:
scoop install vyomiis the new canonical;scoop install cloud-learnkeeps working via a separate deprecation manifest that prints the rename notice on install - Docker Compose: unaffected — the container runs
python server.pydirectly
- Brew:
- Bash completion now registers against both
vyomiandcloud-learnso tab-complete works on legacy invocations. - Brew formula renamed
cloud-learn.rb→vyomi.rb. New canonical install:brew install vyomi-cloud/tap/vyomi. Back-compat:Aliases/cloud-learn → Formula/vyomi.rbsymlink in the tap, sobrew install cloud-learncontinues to work indefinitely (both resolve to the same package). Formula class renamedCloudLearn → Vyomi, license metadataMIT → :cannot_represent(BSL 1.1 isn't in SPDX simple form), homepage nowhttps://vyomi.cloud. - License: MIT → Business Source License 1.1 with a Vyomi-specific Additional Use Grant. Source-available, not open-source-OSI. Change Date 4 years from release, Change License Apache 2.0. The Additional Use Grant blocks (a) hosting Vyomi as a third-party commercial multi-cloud simulator service, (b) modifying/bypassing tier-enforcement code, (c) rebranding for commercial redistribution. Non-commercial use and internal evaluation remain unrestricted. See
LICENSEfor full text. Existing forks pre-v2.0.0 retain MIT under the historical commit terms. - Shim removal slated for v3.0 — users have at least one major version cycle to migrate.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-2.0.0-1.noarch.rpm
- cloud-learn-2.0.0.tar.gz
- cloud-learn_2.0.0_all.deb
Docker image: docker pull vyomi/appliance:2.0.0
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
Vyomi v1.2.6-rc4
See CHANGELOG.md
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.6-rc4-1.noarch.rpm
- cloud-learn-1.2.6-rc4.tar.gz
- cloud-learn_1.2.6-rc4_all.deb
Docker image: docker pull vyomi/appliance:1.2.6-rc4
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
Vyomi v1.2.6-rc3
See CHANGELOG.md
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.6-rc3-1.noarch.rpm
- cloud-learn-1.2.6-rc3.tar.gz
- cloud-learn_1.2.6-rc3_all.deb
Docker image: docker pull vyomi/appliance:1.2.6-rc3
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
Vyomi v1.2.6-rc2
See CHANGELOG.md
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.6-rc2-1.noarch.rpm
- cloud-learn-1.2.6-rc2.tar.gz
- cloud-learn_1.2.6-rc2_all.deb
Docker image: docker pull vyomi/appliance:1.2.6-rc2
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
CloudLearn v1.2.6-rc1
See CHANGELOG.md
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.6-rc1-1.noarch.rpm
- cloud-learn-1.2.6-rc1.tar.gz
- cloud-learn_1.2.6-rc1_all.deb
Docker image: docker pull vyomi/appliance:1.2.6-rc1
Install: curl -fsSL https://raw.githubusercontent.com/vyomi-cloud/appliance/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
CloudLearn v1.2.5
Default-space naming convention. The three out-of-the-box spaces are now aws-default, gcp-default, and azure-default — matching how every other identifier in the appliance and SDK examples talks about per-provider defaults. Previous names (Legacy Workspace, GCP Project, Azure Subscription) were inconsistent and looked like manually-created spaces rather than defaults.
Changed
- Fresh installs now seed three spaces named
aws-default,gcp-default,azure-default(was:Legacy Workspace,GCP Project,Azure Subscription). Space IDs are unchanged (space-legacy,space-gcp-default,space-azure-default) socloudsim_runtime_id/lxd_project_namereferences in persisted state stay valid. - Existing installs get a one-shot migration on first v1.2.5 boot (
migrate_default_space_names()incore/app_context.py) — renames spaces only when the current name still matches the legacy default. Any space the user renamed themselves is untouched.
Why
The pricing/upgrade flow, the per-cloud console gates, and the docs all reference aws-default etc. as the canonical names. Having the UI show a different label was a needless source of "wait, which space am I in?" confusion for new users.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.5-1.noarch.rpm
- cloud-learn-1.2.5.tar.gz
- cloud-learn_1.2.5_all.deb
Docker image: docker pull gansudkum/cloud-learn:1.2.5
Install: curl -fsSL https://raw.githubusercontent.com/sudhirkumarganti/cloud-learn/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
CloudLearn v1.2.4
URL parity: every install path now lands on http://vyomi.local:9000. v1.2.3 made the Multipass-based paths (Brew/.deb/.rpm/Scoop) reachable via mDNS at vyomi.local. This release extends the same hostname to the Docker Compose path so users never have to remember a different URL based on which install method they picked.
Added
install.shnow adds127.0.0.1 vyomi.localto/etc/hostsat the end of the one-liner install — idempotent (only inserts if the line is absent), interactive sudo prompt, best-effort DNS-cache flush (macOSdscacheutil, Linuxsystemd-resolve). Falls back tohttp://localhost:9000cleanly if the user declines sudo or/etc/hostsisn't writable.- INSTALL.md documents the one-time hosts entry as step 5 of the quick-install flow with a "Why vyomi.local?" explainer.
- Portal
/installpage Docker Compose entry now has a "Step 3: One-time hosts entry so http://vyomi.local:9000 works" with copy-pasteable macOS / Linux / Windows-PowerShell commands. Step 4/5 commands updated to use the new URL.
Fixed
.env.exampleimage pin bumped togansudkum/cloud-learn:1.2.4(was 1.2.2).install.shday-2 hint had the samepull && up -dtypo as INSTALL.md before v1.2.2 — fixed todocker compose pull && docker compose up -d.
Why this matters
Before v1.2.3, every install path landed on a different URL (an IP for the appliance, localhost for Compose). v1.2.3 unified the Multipass paths on vyomi.local. v1.2.4 finishes the job — one URL across all 5 install methods on every supported OS.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.4-1.noarch.rpm
- cloud-learn-1.2.4.tar.gz
- cloud-learn_1.2.4_all.deb
Docker image: docker pull gansudkum/cloud-learn:1.2.4
Install: curl -fsSL https://raw.githubusercontent.com/sudhirkumarganti/cloud-learn/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
CloudLearn v1.2.3
The appliance is now reachable at http://vyomi.local:9000/ — no more pasting bridged Multipass IPs into a browser. Hostname resolution uses standard mDNS (Bonjour on macOS, avahi on Linux, native mDNS on Windows 10 1809+) so it works on any local network that doesn't actively block multicast, with zero /etc/hosts modification.
Added
- cloud-init.yaml now installs
avahi-daemon+libnss-mdns, sets the VM hostname tovyomi, patches/etc/nsswitch.confto query mDNS, and enables the avahi service. A freshcloud-learn upmakesvyomi.localresolvable from the host within seconds of boot. ensure_vyomi_mdns_active()runs on everycloud-learn upand idempotently brings legacy VMs (launched before v1.2.3) up to the same state. Fast no-op (~50 ms) when avahi is already publishing; ~30s one-time fix-up otherwise. Bounded by a 60s wall-clock cap so it can never hang the launcher.print_url_banner()probesvyomi.local:9000/healthzand prefers the hostname URL when reachable. The bridged IP is always shown as a fallback so users on multicast-blocked networks (corporate, some VPNs) still have a copy-pasteable URL.- Phase 8 status output now shows both URLs as soon as the VM IP is known, so the user can open either in a browser while the health check is still polling.
Fixed
- The portal
/installpage's hero subtitle previously claimed all paths land onhttp://localhost:9000— accurate only for Docker Compose. Now the copy distinguishes the Multipass-based paths (Brew/.deb/.rpm/Scoop →http://vyomi.local:9000) from Compose (stillhttp://localhost:9000). The "After install" block has the same fix. - Per-method comment examples in
install_catalog.pyswappedhttp://192.168.x.x:9000forhttp://vyomi.local:9000, matching what the launcher actually prints.
Operational notes
- Networks that block multicast (corporate switches with IGMP snooping misconfigured, some hotel WiFi, certain VPN clients) will fail mDNS resolution. The launcher's URL banner shows the IP fallback for exactly this case.
- Linux server installs without
libnss-mdnson the HOST won't resolvevyomi.localfrom that host either —apt install libnss-mdnsonce on the host and it works. Default on Ubuntu desktop, Fedora, Debian with the standard meta-packages. - Windows users on Windows 10 builds older than 1809 (October 2018 Update) need Apple Bonjour Print Services installed, or they should use the IP fallback.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.3-1.noarch.rpm
- cloud-learn-1.2.3.tar.gz
- cloud-learn_1.2.3_all.deb
Docker image: docker pull gansudkum/cloud-learn:1.2.3
Install: curl -fsSL https://raw.githubusercontent.com/sudhirkumarganti/cloud-learn/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.
CloudLearn v1.2.2
Distribution-parity release: every package-manager install path that ships cloud-learn now gets the same first-launch experience — cloud-learn up detects missing Multipass and installs it via the platform-native package manager. Closes the Windows (Scoop) and Linux-without-snapd gaps that v1.2.1 left open. Also fixes a docker-compose .env.example bug that made the Compose install path 404 on docker compose pull.
Added
maybe_install_multipass()now covers Windows. WhenPARENT_OS=windows(Scoop install path), the launcher detects winget on PATH, shows the same yellow notice box used on macOS/Linux, and runswinget install --id Canonical.Multipass --accept-package-agreements --accept-source-agreements. Honors-y/CLOUD_LEARN_YES=1and gracefully degrades if winget isn't on PATH (e.g. Windows Server without App Installer).- Snapd-bootstrap guidance on Linux. When
snapitself isn't on PATH (common on RHEL/Fedora/SUSE minimal images), the launcher detects which distro package manager is available (apt-get/dnf/zypper) and prints the exact 2-3 commands to install snapd + enable its socket + install Multipass. No more silent fall-through to "multipass is not installed" with no recovery path.
Fixed
.env.exampleimage pin was broken. WasCLOUDLEARN_SIMULATOR_IMAGE=cloudlearn/simulator:1.0.0— wrong namespace (cloudlearn/simulatordoes not exist on Docker Hub) AND stale version (months behind). Any user runningcp .env.example .env && docker compose pullgotpull access denied. Now pins togansudkum/cloud-learn:1.2.2(the real, current image). Comment explains how to opt into rolling:latestupdates.- INSTALL.md docker-compose upgrade step clarified.
docker compose updoes NOT auto-pull on existing images — added an explicitdocker compose pull && docker compose up -drecipe with a note about--pull alwayssemantics. The previous one-linerdocker compose pull && up -dwas a typo (missing the seconddocker compose).
Coverage matrix after this release
| Install path | OS | Auto-install command |
|---|---|---|
| Brew | macOS | brew install --cask multipass |
| DEB / RPM | Linux + snapd | sudo snap install multipass |
| DEB / RPM | Linux no-snapd | Step-by-step instructions for apt-get / dnf / zypper |
| Scoop | Windows | winget install Canonical.Multipass |
| Docker Compose | any | N/A — appliance runs inside Docker, no host Multipass needed |
Why this matters
v1.2.1 closed the macOS-via-brew gap. v1.2.2 closes the same gap on every OTHER package-manager install path users actually use. A first-time Windows user who runs scoop install cloud-learn followed by cloud-learn up now gets the same one-prompt-and-go experience their macOS counterpart does.
Artifacts
- SHA256SUMS
- cloud-learn-0.1.0.tar.gz
- cloud-learn-1.2.2-1.noarch.rpm
- cloud-learn-1.2.2.tar.gz
- cloud-learn_1.2.2_all.deb
Docker image: docker pull gansudkum/cloud-learn:1.2.2
Install: curl -fsSL https://raw.githubusercontent.com/sudhirkumarganti/cloud-learn/main/install.sh | bash
SHA256 checksums: see SHA256SUMS in attached artifacts.