v0.0.63
Summary
This release brings major changes to the Juno Console to make the developer experience simpler, clearer, and more efficient.
Mission Control and Monitoring merged
Mission Control, the developer control center for managing Satellites and Orbiters, has been merged with Monitoring.
- A Mission Control is now created only when a developer enables Monitoring
- Monitoring is treated as a dedicated microservice
Benefits:
- For developers: simpler, more straightforward experience
- For Juno: acquisition costs for new developers are cut in half
Trade-offs:
- The Console now tracks all containers created by developers (Satellites, Orbiters, and Mission Controls)
- When Monitoring is enabled, module metadata is duplicated in Mission Control, which could lead to inconsistencies; a future Console feature will help verify this data
Deprecate ICP, use only Cycles
ICP is now deprecated in favor of using cycles only.
- Getting started is still free
- When you need more resources or want to spin up additional modules, you acquire cycles
- The primary call to action for cycles now points to cycle.express; third-party wallets like OISY remain supported as secondary options
This simplifies the developer experience and makes it easier to understand how Juno works.
Price increase
Creating new Satellites or Orbiters now costs 3 T cycles (roughly $4).
Enabling Monitoring (spinning up a Mission Control) requires the same fee.
Previously, the cost was 0.4 ICP, which effectively provided more resources than intended.
Backwards compatibility
Existing Mission Controls remain fully supported. If they hold ICP, you can still use it to create new modules at 1.5 ICP per module.
You can choose to keep ICP for Monitoring or transition fully to cycles.
A future release will update Mission Control to remove features that are no longer needed.
Fully open-source
Juno is now fully open-source.
The AGPL license has been dropped in favor of MIT — no more restrictions. 💯
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.3.0 | ️ |
| Observatory | v0.3.0 | ️ |
| Crates | Version | Breaking changes |
|---|---|---|
junobuild-auth |
v0.2.0 | |
junobuild-cdn |
v0.5.0 | |
junobuild-collections |
v0.3.0 | ️ |
junobuild-macros |
v0.2.0 | ️ |
junobuild-satellite |
v0.4.0 | ️ |
junobuild-shared |
v0.6.0 | |
junobuild-storage |
v0.5.0 | ️️ |
junobuild-utils |
v0.2.0 | ️ |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v3.3.0 | |
@junobuild/analytics |
v2.0.10 | |
@junobuild/auth |
v2.1.0 | |
@junobuild/cdn |
v2.2.0 | |
@junobuild/cli-tools |
v0.10.0 | |
@junobuild/config |
v2.9.0 | |
@junobuild/config-loader |
v0.4.7 | |
@junobuild/core |
v3.4.0 | |
@junobuild/core-standalone |
v3.4.0 | |
@junobuild/did-tools |
v0.3.8 | |
@junobuild/errors |
v0.2.0 | |
@junobuild/functions |
v0.5.4 | |
@junobuild/ic-client |
v7.1.0 | ️ |
@junobuild/storage |
v2.2.0 | |
@junobuild/utils |
v0.2.5 |
| CLI | Version | Breaking changes |
|---|---|---|
@junobuild/cli |
v0.13.9 |
| Plugins | Version | Breaking changes |
|---|---|---|
@junobuild/vite-plugin |
v4.5.1 | |
@junobuild/nextjs-plugin |
v4.6.1 |
| Docker | Version | Breaking changes |
|---|---|---|
@junobuild/skylab |
v0.4.14 | |
@junobuild/satellite |
v0.4.14 | |
@junobuild/console |
v0.4.14 |
| GitHub Action | Version | Breaking changes |
|---|---|---|
junobuild/juno-action |
v0.5.8 |
Serverless Functions
You can upgrade your Rust Serverless Functions using the following crates:
Note
This upgrade is optional, as it contains no breaking changes that would impact your projects.
The crates have been bumped to reflect the license change.
[dependencies]
candid = "0.10.20"
ic-cdk = "0.19.0"
ic-cdk-macros = "0.19.0"
serde = "1.0.225"
serde_cbor = "0.11.2"
junobuild-satellite = "0.4.0"
junobuild-macros = "0.2.0"
junobuild-utils = "0.2.0"What's Changed
- refactor(frontend): move account store to own module by @peterpeterparker in #2341
- build(frontend): downgrade svelte by @peterpeterparker in #2342
- feat(frontend): rename derived mission control modules to account by @peterpeterparker in #2343
- feat(frontend): group stores by @peterpeterparker in #2344
- feat(frontend): group derived by @peterpeterparker in #2345
- refactor(console): generic and impl for account by @peterpeterparker in #2346
- refactor(frontend): move satellites stores related to mission control by @peterpeterparker in #2349
- refactor(console): move accounts and credits in a dedicated module by @peterpeterparker in #2347
- refactor(mctrl): rename module segments into factory for consistency by @peterpeterparker in #2348
- refactor(shared): rename ledger const into icp_ledger by @peterpeterparker in #2350
- feat(console): refund canister fee not constant by @peterpeterparker in #2351
- refactor(console): extract ledger related services to create canister by @peterpeterparker in #2352
- feat(frontend): move orbiters mission control related by @peterpeterparker in #2353
- feat(console): create orbiter args by @peterpeterparker in #2354
- feat(console): create orbiter args - did declarations by @peterpeterparker in #2355
- build(frontend): bump Juno and DFINITY libs with DID namespace by @peterpeterparker in #2357
- test(frontend): migrate to PicJS v0.17.0 and PocketIC v11 by @peterpeterparker in #2356
- build(backend): Update Rust version by @github-actions[bot] in #2358
- feat(frontend): support subaccount (even if unused for now) by @peterpeterparker in #2360
- feat(frontend): support for multiple accounts in wallet workers and stores by @peterpeterparker in #2359
- feat(frontend): replace mission control by wallet ID by @peterpeterparker in #2361
- chore(toolchain): downgrade Rust v1.91.1 by @peterpeterparker in #2362
- feat(console): trap if unexpected fee request (instead of returning none) by @peterpeterparker in #2364
- feat(console): expose get_create_fee for caller by @peterpeterparker in #2365
- feat(frontend): use new endpoint get_create_fee by @peterpeterparker in #2366
- feat(console): with_fees utils by @peterpeterparker in #2367
- feat(frontend): update Svelte and ignore reference only captures the initial value by @peterpeterparker in #2368
- refactor(frontend): extract cli services by @peterpeterparker in #2369
- build(core): bump bindgen minor security patch by @peterpeterparker in #2370
- feat(console): mission control fee by @peterpeterparker in #2371
- feat(shared): icrc_transfer_token_from by @peterpeterparker in #2372
- feat(console): get_or_init_account by @peterpeterparker in #2373
- chore(core): prevents npm from executing scripts by @peterpeterparker in #2376
- chore(core): run trusted postinstall by @peterpeterparker in #2377
- feat(console): icrc transfer from by @peterpeterparker in #2375
- feat(console): name option in create orbiter and satellite by @peterpeterparker in #2378
- feat(console): segments memory and store by @peterpeterparker in #2379
- feat(console): make factory more generic to support spinning modules from mission control or user (console ui) by @peterpeterparker in #2380
- fix(console): block index payment registered as refunded by @peterpeterparker in #2382
- feat(console): use new field purchaser in payment stable map by @peterpeterparker in #2381
- chore(core): return Error::UNEXPECTED instead of new_custom(0) by @peterpeterparker in #2387
- refactor(shared): extract min and max principal constants by @peterpeterparker in #2386
- fix(console): filter list segments when type is selected by @peterpeterparker in #2385
- test(setup): use PocketIC ICP feature instead of custom ledger by @peterpeterparker in #2388
- feat(console): create satellite and orbiter with user by @peterpeterparker in #2383
- feat(console): create mission control for user by @peterpeterparker in #2389
- feat(console)!: remove init_user_mission_control_center by @peterpeterparker in #2390
- feat(console): if user has mission control, make it controller too by @peterpeterparker in #2391
- feat(frontend): certified get and init account by @peterpeterparker in #2392
- feat(frontend): merge Mission Control into Monitoring by @peterpeterparker in #2313
- feat(console): add segment to list even when created from mission control by @peterpeterparker in #2393
- feat(frontend): better types for selected wallet by @peterpeterparker in #2394
- feat(frontend): review factory wizard to handle multi wallets by @peterpeterparker in #2395
- fix(frontend): displayed incoming amount by @peterpeterparker in #2397
- feat(frontend): support dev wallet for send ICP by @peterpeterparker in #2396
- feat(frontend): display wallet total by @peterpeterparker in #2398
- feat(frontend): support for top-up with selected wallet by @peterpeterparker in #2399
- feat(frontend): close tab guard for modal wizard progress by @peterpeterparker in #2400
- feat(frontend): review factory wizard (final touch) and attach to existing mctrl by @peterpeterparker in #2401
- fix(frontend): monitoring order in create wizard should happen after attach by @peterpeterparker in #2403
- feat(frontend): always reload segments by @peterpeterparker in #2404
- chore(crates): switch license to only MIT by @peterpeterparker in #2406
- chore(core): switch license to MIT by @peterpeterparker in #2405
- build(sputnik): use rquickjs official release by @peterpeterparker in #2278
- feat(frontend): wallet store support multi ledger by @peterpeterparker in #2408
- refactor(console): split ledger services modules by @peterpeterparker in #2409
- feat(console): extract and make process payment generic by @peterpeterparker in #2410
- feat(console): support for fetch icrc ledger balance and transactions in wallet worker by @peterpeterparker in #2411
- feat(console): save corresponding ledger-id in saved payments logs by @peterpeterparker in #2412
- refactor(console): make refund payment generic as well by @peterpeterparker in #2413
- feat(console): introduce factory fees to replace fees by @peterpeterparker in #2414
- feat(console): bring fee kind to interfaces by @peterpeterparker in #2415
- feat(console): deprecate fees (replaced by factory_fees) by @peterpeterparker in #2416
- feat(frontend): icp to cycles rate worker and store by @peterpeterparker in #2418
- feat(frontend): remove icp (from cycles) info in canister cycles by @peterpeterparker in #2419
- feat(frontend): use primarly cycles balance by @peterpeterparker in #2417
- feat(frontend): use bigint for icp to cycles utils by @peterpeterparker in #2420
- feat(frontend): icp to cycles in total balance by @peterpeterparker in #2421
- feat(frontend): display cycles or icp balance by @peterpeterparker in #2422
- test(setup): support ICRC Cycles ledger approval by @peterpeterparker in #2424
- feat(console): deprecate icp payments and log into icrc payments by @peterpeterparker in #2425
- feat(console): replace icp with cycles in the factory with the dev wallet by @peterpeterparker in #2423
- chore(frontend): update lint libs and apply rules by @peterpeterparker in #2426
- build(frontend): bump AgentJS v5 and next icp-sdk/canisters and juno by @peterpeterparker in #2427
- feat(frontend): get rid of ICP and use only cycles by @peterpeterparker in #2407
- feat(frontend): enable wallet picker only if mission control by @peterpeterparker in #2428
- feat(frontend): display cycles in wallet transactions amount by @peterpeterparker in #2429
- feat(frontend): get cycles and icp for dev and update e2e by @peterpeterparker in #2430
- feat(frontend): buy cycles for wallet by @peterpeterparker in #2431
- feat(frontend): top-up and factory final tuning for cycles by @peterpeterparker in #2432
- refactor(frontend): derived $authStore.identity by @peterpeterparker in #2435
- feat(frontend): leftovers of using mission control satellites instead of global list by @peterpeterparker in #2436
- feat(console): set satellite and orbiter price to 1.5 ICP by @peterpeterparker in #2433
- feat(console): use hashmap for factory fees by @peterpeterparker in #2439
- feat(console): icp fee optional by @peterpeterparker in #2440
- feat(frontend): Update Passkey AAGUIDs by @github-actions[bot] in #2441
- feat(console): guard with account and not anonymous by @peterpeterparker in #2437
- feat(frontend): edit satellite details by @peterpeterparker in #2434
- feat(frontend): add access keys (without mission control) by @peterpeterparker in #2442
- feat(frontend): remove access keys (without mission control) by @peterpeterparker in #2443
- fix(frontend): no attach to mission control in create wizard if already itself by @peterpeterparker in #2444
- refactor(shared): group memory related utils by @peterpeterparker in #2445
- refactor(shared): group constants by @peterpeterparker in #2447
- refactor(shared): group data related utils by @peterpeterparker in #2446
- refactor(shared): group segments related utils by @peterpeterparker in #2448
- feat(sputnik): Polyfills updated by @github-actions[bot] in #2450
- feat(console): attach and detach segments by @peterpeterparker in #2449
- feat(frontend): delete segment wizard by @peterpeterparker in #2451
- feat(frontend): launchpad without cockpit by @peterpeterparker in #2452
- feat(frontend): service tab and integrate mission control tab in monitoring by @peterpeterparker in #2453
- feat(frontend)!: deprecate route /mission-control by @peterpeterparker in #2454
- feat(frontend): merge Mission Control and Monitoring wizards by @peterpeterparker in #2455
- feat(frontend)!: rename satellites layout to launchpad layout by @peterpeterparker in #2456
- feat(frontend): spin monitoring from launchpad by @peterpeterparker in #2457
- feat(frontend): review and display dollars for cycles too (when available) by @peterpeterparker in #2458
- feat(frontend): query + update for canister status by @peterpeterparker in #2460
- feat(observatory): expose endpoint to query monitoring enabled or not by @peterpeterparker in #2462
- chore(license): update year to 2026 by @peterpeterparker in #2464
- build(frontend): bump released icp-sdk/canisters and junobuild libs by @peterpeterparker in #2463
- chore(dev): redo using published junobuild/console image for the emulator by @peterpeterparker in #2466
- chore(fix): run npm prepare after install by @peterpeterparker in #2467
- test(e2e): adapt for new creation flow with cycles and updated launchpad by @peterpeterparker in #2465
- feat(console): rename SegmentType to StorableSegmentKind by @peterpeterparker in #2468
- feat(console)!: migrate rates to same pattern as factory fees by @peterpeterparker in #2470
- feat(observatory): notification url for mission control by @peterpeterparker in #2469
- feat(observatory)!: rename update_rate_config to set_rate_config by @peterpeterparker in #2471
- refactor(console): rename canister module to orchestrator by @peterpeterparker in #2472
- feat(console): rename orchestrator functions and args by @peterpeterparker in #2473
- feat(shared)!: rename and split create canister and install code with cmc and ic mgmt by @peterpeterparker in #2475
- refactor(shared): constant canister prefix by @peterpeterparker in #2476
- feat(frontend): try to improve onboarding and selection or website/application by @peterpeterparker in #2478
- feat(frontend): review launchpad first Satellite design by @peterpeterparker in #2479
- feat(frontend): simplify navbar wallet by @peterpeterparker in #2459
- fix(console): typo in ICP price (1_500_000_000 is 15 not 1.5) by @peterpeterparker in #2480
- feat(frontend): add an info link in the navbar wallet by @peterpeterparker in #2482
- refactor(frontend): rename and move link to wallet info for factory by @peterpeterparker in #2481
- feat(frontend): rename service tab to effective module name by @peterpeterparker in #2483
- feat(shared): remove unused deprecated type SegmentCanisterStatus by @peterpeterparker in #2485
- fix(frontend): loading on direct access to hosting settings by @peterpeterparker in #2486
- chore(release): crates for release v0.0.63 by @peterpeterparker in #2484
Full Changelog: v0.0.62...v0.0.63