Releases: junobuild/juno
v0.0.73
Summary
On Apr. 4, 2026, someone exploited the free tier to spin up roughly 60-70 free Satellites using the same number of fake identities. The rate limiter worked as expected, slowing them down, but not enough to prevent the abuse.
As an immediate precautionary measure, free Satellites for new users were disabled by patching the Console. This is now being formalized by introducing a config on the Console, which controls the initial credits assigned to new accounts, making it possible to toggle the free tier on or off without redeployment. This way we can also keep the same behavior as we are used to when developing locally with Skylab - i.e. the default implementation still provides a credit to spin a first Satellite.
New users will still be able to get started for free by reaching out on Discord. That's why the onboarding has also been improved to introduce this call to action on the dashboard.
Tip
This release has no functional impact on your development or projects.
What's Changed
- fix(sputnik): incorrect stub path fallback when no custom functions by @peterpeterparker in #2736
- fix(skylab): sveltekit overwriting types by @peterpeterparker in #2737
- feat(frontend): getting started banner to get credits by @peterpeterparker in #2739
- feat(frontend): split preferences into a new profile page by @peterpeterparker in #2740
- feat(frontend): simplify getting started message by @peterpeterparker in #2742
- feat(frontend): getting started banner for new user with no credits by @peterpeterparker in #2743
- feat(console): account config with initial credits by @peterpeterparker in #2741
- feat(frontend): remove create satellite description by @peterpeterparker in #2744
- chore(console,sputnik): clippy by @peterpeterparker in #2745
Full Changelog: v0.0.72...v0.0.73
v0.0.72
Summary
This release focuses on the Satellite and Sputnik.
Satellite
Two new admin endpoints handle asset certification for projects serving large numbers of assets (e.g. 25k+). Due to execution limits, certification can't happen in a single call at that scale — these endpoints make it possible to run it in chunks.
The storage now also accepts uploading assets of 0kb. This fixes an issue surfaced in the Console after upgrading to the latest JS dependencies, notably Vite v8.
The access key structs have also been renamed for consistency (existing "controller" endpoints remain unchanged for backward compatibility), and the SDK now exposes the built-in guards so developers building serverless functions in Rust can reuse them directly in their custom endpoints.
use junobuild_satellite::caller_is_admin;
fn my_function_guard() -> Result<(), String> {
caller_is_admin()
}
#[ic_cdk::query(guard = "my_function_guard")]
fn hello_world() -> String {
"Hello, admin!".to_string()
}
include_satellite!();Sputnik
A few breaking changes land in the custom functions pipeline, but these should be largely transparent — they affect the auto-generated Rust code rather than the functions you write.
More importantly, this release ships two new features.
Guards are now supported in serverless functions:
import { defineQuery } from "@junobuild/functions";
import { callerIsAdmin } from "@junobuild/functions/sdk";
export const ping = defineQuery({
guard: () => {
throw new Error("No pong today");
},
handler: () => {
console.log("Hello");
}
});
export const hello = defineQuery({
guard: callerIsAdmin,
handler: () => {
console.log("Hello, admin!");
}
});And HTTPS outcalls are now available from the functions SDK:
import { defineQuery, defineUpdate } from '@junobuild/functions';
import {
httpRequest,
HttpRequestResultSchema,
TransformArgsSchema,
type HttpRequestArgs
} from '@junobuild/functions/ic-cdk';
import { j } from '@junobuild/schema';
const DogSchema = j.strictObject({
message: j.url(),
status: j.string()
});
export const fetchRandomDog = defineUpdate({
result: DogSchema,
handler: async () => {
const args: HttpRequestArgs = {
url: 'https://dog.ceo/api/breeds/image/random',
method: 'GET',
headers: [],
isReplicated: false,
transform: 'trimHeaders'
};
const result = await httpRequest(args);
const decoder = new TextDecoder();
const body = decoder.decode(result.body);
return JSON.parse(body);
}
});
export const trimHeaders = defineQuery({
hidden: true,
args: TransformArgsSchema,
result: HttpRequestResultSchema,
handler: ({ response: { status, body } }) => ({
status,
body,
headers: []
})
});Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.4.2 | ️ ️ |
| Satellite | v0.2.1 | ️ |
| Sputnik | v0.4.0 |
| Crates | Version | Breaking changes |
|---|---|---|
junobuild-auth |
0.4.0 | |
junobuild-cdn |
0.7.0 | |
junobuild-collections |
0.5.0 | |
junobuild-macros |
0.4.0 | |
junobuild-satellite |
0.6.0 | |
junobuild-shared |
0.8.0 | |
junobuild-storage |
0.7.0 | |
junobuild-utils |
0.4.0 |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v4.3.2 | ️ |
@junobuild/analytics |
v0.2.14 | |
@junobuild/auth |
v4.1.1 | |
@junobuild/cdn |
v2.4.2 | |
@junobuild/cli-tools |
v0.13.3 | |
@junobuild/config |
v2.15.1 | |
@junobuild/config-loader |
v0.4.10 | |
@junobuild/core |
v5.3.1 | |
@junobuild/core-standalone |
v5.3.1 | |
@junobuild/errors |
v0.2.6 | |
@junobuild/functions |
v0.8.2 | |
@junobuild/functions-tools |
v0.6.2 | |
@junobuild/ic-client |
v8.1.2 | ️ |
@junobuild/schema |
v1.2.1 | |
@junobuild/storage |
v2.4.1 | |
@junobuild/utils |
v1.0.2 |
| CLI | Version | Breaking changes |
|---|---|---|
@junobuild/cli |
v0.14.4 |
| Plugins | Version | Breaking changes |
|---|---|---|
@junobuild/vite-plugin |
v4.7.1 | |
@junobuild/nextjs-plugin |
v4.7.1 |
| Docker | Version | Breaking changes |
|---|---|---|
@junobuild/skylab |
v0.6.4 | |
@junobuild/satellite |
v0.6.4 | |
@junobuild/console |
v0.6.4 |
| GitHub Action | Version | Breaking changes |
|---|---|---|
junobuild/juno-action |
v0.6.10 |
| API | Version | Breaking changes |
|---|---|---|
| Self-hostable API service | v0.1.1 |
Serverless Functions
You can upgrade your Rust Serverless Functions using the following crates:
[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.6.0"
junobuild-macros = "0.4.0"
junobuild-utils = "0.4.0"What's Changed
- build(crates): bump serde and serde_json to latest by @peterpeterparker in #2676
- feat(satellite): expose guards to SDK by @peterpeterparker in #2665
- chore(test): downgrade pic-js to v0.17.2 by @peterpeterparker in #2678
- feat(satellite): rename controllers functions and mod to access_keys by @peterpeterparker in #2666
- feat(shared): rename Controller types and utils to AccessKey by @peterpeterparker in #2679
- feat(shared): Controller DID description renamed to AccessKey by @peterpeterparker in #2681
- build(frontend): bump dependencies by @peterpeterparker in #2682
- chore(frontend): bump latest eslint rules by @peterpeterparker in #2683
- chore(test): bump pic-js v0.21 by @peterpeterparker in #2684
- feat(auth): bump jsonwebtoken-icp to v10.3.0 by @peterpeterparker in #2675
- feat(shared): rename SetController interfaces to AccessKey by @peterpeterparker in #2687
- feat(shared): rename shared assertion for access key related to caller by @peterpeterparker in #2688
- feat(sputnik): rename controller to access key in rquicks bridge by @peterpeterparker in #2690
- feat(shared): rework naming of access keys shared utils by @peterpeterparker in #2691
- feat(sputnik): review sdk access keys and integrate guards by @peterpeterparker in #2689
- feat(sputnik): support for custom functions guard by @peterpeterparker in #2692
- feat(satellite): re-export shared access keys functions by @peterpeterparker in #2693
- feat(frontend): fetch kongswap for a single token by @peterpeterparker in #2694
- feat(storage,cdn): allow 0kb chunk assets by @peterpeterparker in #2696
- fe...
v0.0.71
Summary
This release introduces support for writing custom serverless functions in TypeScript.
Developers can now define query and update functions using defineQuery and defineUpdate, with input and output shapes described via a type system built on top of Zod. The pipeline takes care of the rest - generating all the necessary types and bindings under the hood.
import { defineUpdate } from "@junobuild/functions";
import { j } from "@junobuild/schema";
const Schema = j.strictObject({
name: j.string(),
id: j.principal()
});
export const helloWorld = defineUpdate({
args: Schema,
returns: Schema,
handler: async ({ args }) => {
// Your logic here
return args;
}
});Both type-safe at build time and validated at runtime, functions support synchronous and asynchronous handlers.
A frontend API is also automatically generated, so developers can call their functions directly from the client:
import { functions } from "../declarations/satellite/satellite.api.ts";
await functions.helloWorld({ name: "World", id: Principal.anonymous() });Overview
| Module | Version | Breaking changes |
|---|---|---|
| Sputnik | v0.3.1 |
Note
Sputnik is tagged as "breaking changes" but contain no fundamental API changes. The version is primarily bumped for traceability reasons only.
| Crates | Version | Breaking changes |
|---|---|---|
junobuild-auth |
0.3.2 | |
junobuild-cdn |
0.6.1 | |
junobuild-collections |
0.4.1 | |
junobuild-macros |
0.3.1 | |
junobuild-satellite |
0.5.1 | |
junobuild-shared |
0.7.1 | |
junobuild-storage |
0.6.1 | ️️️ |
junobuild-utils |
0.3.0 | ️️️ |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v4.2.0 | ️ |
@junobuild/analytics |
v0.2.11 | |
@junobuild/auth |
v4.0.0 | |
@junobuild/cdn |
v2.3.0 | |
@junobuild/cli-tools |
v0.12.2 | |
@junobuild/config |
v2.14.1 | |
@junobuild/config-loader |
v0.4.8 | |
@junobuild/core |
v5.2.1 | |
@junobuild/core-standalone |
v5.2.1 | |
@junobuild/did-tools |
--- | @junobuild/functions-tools |
@junobuild/errors |
v0.2.3 | |
@junobuild/functions |
v0.7.1 | |
@junobuild/functions-tools |
v0.5.2 | 🆕 |
@junobuild/ic-client |
v8.0.1 | ️ |
@junobuild/storage |
v2.3.0 | |
@junobuild/utils |
v0.3.0 | |
@junobuild/schema |
v1.1.0 | 🆕 |
| CLI | Version | Breaking changes |
|---|---|---|
@junobuild/cli |
v0.14.0 |
| Plugins | Version | Breaking changes |
|---|---|---|
@junobuild/vite-plugin |
v4.7.1 | |
@junobuild/nextjs-plugin |
v4.7.1 |
| Docker | Version | Breaking changes |
|---|---|---|
@junobuild/skylab |
v0.6.3 | |
@junobuild/satellite |
v0.6.3 | |
@junobuild/console |
v0.6.3 |
| GitHub Action | Version | Breaking changes |
|---|---|---|
junobuild/juno-action |
v0.6.6 |
Serverless Functions
You can upgrade your Rust Serverless Functions using the following crates:
[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.5.1"
junobuild-macros = "0.3.1"
junobuild-utils = "0.3.0"What's Changed
- style(frontend): align first column in cards on overview by @peterpeterparker in #2633
- feat(sputnik): migrate usage of spawn_017_compat to spawn by @peterpeterparker in #2637
- feat(satellite): withs pattern for rules by @peterpeterparker in #2640
- feat(macros): migrate usage of spawn_017_compat to spawn by @peterpeterparker in #2638
- feat(satellite): keep system collection upgrades by @peterpeterparker in #2639
- feat(satellite): use an impl to init rule from setrule by @peterpeterparker in #2641
- feat(frontend): Update Passkey AAGUIDs by @github-actions[bot] in #2642
- feat(frontend): assert response ok by @peterpeterparker in #2644
- refactor(macros): move parser in a sub-module hooks by @peterpeterparker in #2646
- feat(utils): serde with serializer and deserializer by @peterpeterparker in #2645
- feat(sputnik): support for including custom endpoints rust module by @peterpeterparker in #2635
- feat(macros): derive data for custom functions in Sputnik by @peterpeterparker in #2647
- feat(utils): keep but duplicate/rename doc data to json data by @peterpeterparker in #2648
- feat(macros): rename FunctionData to JsonData by @peterpeterparker in #2650
- feat(orbiter): use rename doc data types by @peterpeterparker in #2649
- feat(utils,macros): from and to json data traits by @peterpeterparker in #2651
- refactor(sputnik): move sdk to root by @peterpeterparker in #2652
- fix(frontend): OpenChat memo leads to "Offset is outside the bounds of the DataView" by @peterpeterparker in #2656
- feat(shared): unwrap_or_trap for option by @peterpeterparker in #2655
- feat(sputnik): shorten DEV_CUSTOM_FUNCTIONS_PATH to DEV_FUNCTIONS_PATH by @peterpeterparker in #2654
- build(backend): Update Rust version by @github-actions[bot] in #2653
- feat(sputnik): support generating custom endpoints by @peterpeterparker in #2636
- feat(sputnik): use tooling to generate custom functions by @peterpeterparker in #2657
- fix(sputnik): nested structs by @peterpeterparker in #2661
- fix(macros): register json_data as a helper attribute by @peterpeterparker in #2662
- fix(sputnik): serialization with option principal, uint8array and bigint by @peterpeterparker in #2659
- feat(sputnik): support for ic_cdk::caller by @peterpeterparker in #2660
- chore(test): bump pic-js v0.19.0 by @peterpeterparker in #2663
- build(sputnik): prevent build exception if no custom endpoints by @peterpeterparker in #2664
- build(frontend): use released juno-js libs by @peterpeterparker in #2667
- feat(frontend): import junobuild/zod instead of...
v0.0.70
Summary
This release focuses on Console UX improvements. Configuration and recent deployments are now persisted in IndexedDB (cleared on logout), allowing the interface to render information faster on subsequent visits.
It also introduces a new card on the Satellite overview showing the last three deployments. If automation has not been set up yet, the card displays a call to action to get started, which could be particularly helpful for new developers on the platform.
Tip
This release has no functional impact on your development or projects.
What's Changed
- feat(frontend): add id-token permission to GitHub Actions templates by @peterpeterparker in #2624
- feat(frontend): accept undefined for certified flag by @peterpeterparker in #2627
- feat(frontend): cache config by @peterpeterparker in #2626
- feat(frontend): split satellite overview by @peterpeterparker in #2629
- feat(frontend): show last workflow in satellite overview by @peterpeterparker in #2628
- feat(frontend): use a cron worker for fetching workflows by @peterpeterparker in #2630
- feat(frontend): slice last three deployments and fix undefined GitHub data by @peterpeterparker in #2632
- fix(frontend): remove incorrect slice on workflow actor by @peterpeterparker in #2631
Full Changelog: v0.0.69...v0.0.70
v0.0.69
Summary
This release brings two major additions to the GitHub integration and a set of general improvements.
Automation
This release shifts the recommended approach for allowing GitHub Actions to deploy your frontend or publish serverless functions by removing the need to store a JUNO_TOKEN in your GitHub secrets.
The new method uses OpenID Connect (OIDC) to establish a relationship between GitHub and your Satellite, so each workflow run gets short-lived credentials (access keys) automatically.
No tokens to rotate, no secrets to manage, and therefore more secure.
In addition, a new Deployments screen in the Console UI lets you specify which repositories are authorized to deploy and provides an overview of past deployments.
The same configuration can of course also be applied using the CLI which has also been upgraded to support this new feature.
Authentication
This release also adds support for GitHub authentication, letting you add GitHub sign-in to your application.
Note that unlike other authentication methods, this requires deploying and running a self-hosted API.
Various Improvements
On top of that, several improvements come with this release. While not yet available in the Console, this includes support for access keys with expiration times (applicable to the Submitter and Editor roles, but not Admin), which was developed for the new automation flow (for security reasons).
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.4.1 | ️ |
| Observatory | v0.5.1 | ️ |
| Satellite | v0.2.0 | |
| Sputnik | v0.2.0 |
Note
Satellite and Sputnik are tagged as "breaking changes" but contain no fundamental API changes. Their versions were primarily bumped for traceability reasons only.
| Crates | Version | Breaking changes |
|---|---|---|
junobuild-auth |
0.3.1 | |
junobuild-cdn |
0.6.0 | |
junobuild-collections |
0.4.0 | |
junobuild-satellite |
0.5.0 | |
junobuild-shared |
0.7.0 | |
junobuild-storage |
0.6.0 |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v4.1.0 | |
@junobuild/analytics |
v0.2.11 | |
@junobuild/auth |
v4.0.0 | |
@junobuild/cdn |
v2.3.0 | |
@junobuild/cli-tools |
v0.10.2 | |
@junobuild/config |
v2.11.0 | |
@junobuild/config-loader |
v0.4.8 | |
@junobuild/core |
v5.2.0 | |
@junobuild/core-standalone |
v5.2.0 | |
@junobuild/did-tools |
v0.3.9 | |
@junobuild/errors |
v0.2.3 | |
@junobuild/functions |
v0.5.6 | |
@junobuild/ic-client |
v8.0.0 | ️ |
@junobuild/storage |
v2.3.0 | |
@junobuild/utils |
v0.2.6 |
| CLI | Version | Breaking changes |
|---|---|---|
@junobuild/cli |
v0.13.12 |
| Plugins | Version | Breaking changes |
|---|---|---|
@junobuild/vite-plugin |
v4.7.0 | |
@junobuild/nextjs-plugin |
v4.7.0 |
| Docker | Version | Breaking changes |
|---|---|---|
@junobuild/skylab |
v0.5.2 | |
@junobuild/satellite |
v0.5.2 | |
@junobuild/console |
v0.5.2 |
| GitHub Action | Version | Breaking changes |
|---|---|---|
junobuild/juno-action |
v0.6.3 |
Serverless Functions
You can upgrade your Rust Serverless Functions using the following crates:
[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.5.0"
junobuild-macros = "0.2.0"
junobuild-utils = "0.2.0"What's Changed
- feat(storage): support HEAD requests by @peterpeterparker in #2564
- feat(shared): optional controller kind by @peterpeterparker in #2566
- feat(frontend): access key type display and kind emulator by @peterpeterparker in #2567
- feat(shared)!: rename is_controller to is_valid_controller by @peterpeterparker in #2569
- test(shared): controllers with cargo mock by @peterpeterparker in #2570
- refactor(satellite): rename guard is_controller with valid keyword by @peterpeterparker in #2571
- feat(shared): ephemeral access keys - assertion on expires_at by @peterpeterparker in #2572
- feat(core): assert set controller expires_at by @peterpeterparker in #2573
- feat(shared)!: limit access keys submit and editors to 20 by @peterpeterparker in #2574
- feat(auth): rename assert_custom by @peterpeterparker in #2575
- refactor(auth)!: rename set_config into set_authentication_config by @peterpeterparker in #2576
- feat(frontend): remove Internet Identity for local dev by @peterpeterparker in #2577
- test(e2e): remove Internet Identity by @peterpeterparker in #2578
- feat(frontend): animated welcome test by @peterpeterparker in #2579
- feat(frontend): use user name for greetings by @peterpeterparker in #2580
- feat(frontend): derive provider data by @peterpeterparker in #2581
- feat(frontend): hide sign-in methods not dev for skylab by @peterpeterparker in #2582
- refactor(frontend): split animated text loader by @peterpeterparker in #2583
- feat(auth): delegate nonce check to openid implementation by @peterpeterparker in #2584
- feat(auth): add GitHub Actions to the OpenId provider list by @peterpeterparker in #2585
- feat(observatory): fetch github actions openid certificate by @peterpeterparker in #2586
- feat(auth,satellite): automation configuration by @peterpeterparker in #2588
- feat(auth): use a standardized trait to read nonce instead of passing function by @peterpeterparker in #2589
- feat(auth): authenticate automation by @peterpeterparker in #2539
- build(backend): Update Rust version by @github-actions[bot] in #2590
- feat(satellite): del_controller_self to remove automation key by @peterpeterparker in #2591
- feat(auth): use refs instead of branches in automation config by @peterpeterparker in #2592
- feat(satellite): more workflow metadata by @peterpeterparker in #2593
- refactor(frontend): move auth config services to satellite by @peterpeterparker in #2595
- feat(frontend): init new "Deployments" page by @peterpeterparker in https://github.com/junobuild/juno/p...
v0.0.61-patch.1
Summary
This patch release addresses an issue affecting sign-in with Internet Identity when using delegation origin with custom domains.
Important
Note: This patch addresses a specific edge case (custom domain derivation origins for Internet Identity). Since most users are unaffected, the update is not auto-propagated. If you're experiencing this issue, you can apply the patch manually using the Juno CLI.
The root cause of the issue is unclear - something has changed but no one knows what. The issue happens likely because satellites did not support HEAD requests, though it has always been like that. Support was planned but just not yet delivered. This patch allows HEAD request to satellites, basically just adding a condition to an if statement that accepted GET only.
// Was:
pub fn http_request(
HttpRequest {
method,
}: HttpRequest,
storage_state: &impl StorageStateStrategy,
certificate: &impl StorageCertificateStrategy,
) -> HttpResponse {
if method != "GET" {
return error_response(RESPONSE_STATUS_CODE_405, "Method Not Allowed.".to_string());
}
// Patch:
pub fn http_request(
HttpRequest {
method,
}: HttpRequest,
storage_state: &impl StorageStateStrategy,
certificate: &impl StorageCertificateStrategy,
) -> HttpResponse {
if method != "GET" && method != "HEAD" {
return error_response(RESPONSE_STATUS_CODE_405, "Method Not Allowed.".to_string());
}
Note
Patch was tested manually. Effective implementation and tests in #2564
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Satellite | v0.1.7 | ️ |
| Sputnik | v0.1.8 | ️ ️ |
| Crates | Version | Breaking changes |
|---|---|---|
junobuild-cdn |
0.4.1-patch.2 | |
junobuild-satellite |
0.3.1-patch.1 | ️ |
junobuild-storage |
0.4.1-patch.1 | ️️ |
v0.0.68
Summary
As I learned yesterday, using the new domain id.ai for sign-in with Internet Identity is not recommended just for cosmetic reasons, but also to prevent edge case issues. Therefore, it makes sense to use it going forward.
This release switches the Console to use this domain and set the JS library @junobuild/core to use it as new default for its related sign-in method (this is a JS API breaking change but all domains use the same UI/UX and derive the same identities).
Overview
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/core |
v5.0.0 |
What's Changed
- feat(observatory,console): remove one time upgrade for OpenIdProvider.GitHub by @peterpeterparker in #2545
- build(backend): Update Rust version by @github-actions[bot] in #2552
- refactor(auth): redo name unsafe_find_jwt_provider by @peterpeterparker in #2554
- feat(auth)!: rename get_providers to get_auth_providers by @peterpeterparker in #2555
- feat(auth): rename openid credential structs by @peterpeterparker in #2556
- feat(shared): ic api for wasm32 test by @peterpeterparker in #2558
- feat(auth): make verify_openid_jwt generic by @peterpeterparker in #2557
- feat(auth): used shared time and cargo test for openid impls by @peterpeterparker in #2560
- feat(auth): make unsafe_find_jwt_provider generic by @peterpeterparker in #2559
- feat(frontend): use id.ai instead of internetcomputer.org for identity sign-in by @peterpeterparker in #2561
- test(e2e): update internet-identity playwright plugin for new ui/ux by @peterpeterparker in #2562
Full Changelog: v0.0.67...v0.0.68
v0.0.67
Summary
This release separates OpenID provider types to support further GitHub integrations (like GitHub Actions) by renaming GitHub to GitHubAuth in the provider enum and introducing a new OpenIdDelegationProvider enum that explicitly defines which providers can authenticate users.
This is a breaking change and therefore required the Console and Observatory state to be patched. Given the support for GitHub was introduced last week (in release v66) and is not yet rolled out in the ecosystem - in the Satellites - it felt like this was the appropriate time to introduce this cleaner architetucal separation.
Note
This release has migration purposes for the Console and Observatory and does not impact your projects.
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.4.0 | ️ |
| Observatory | v0.5.0 | ️ |
What's Changed
- feat(frontend): add type safety to cmp guards by passing result by @peterpeterparker in #2541
- refactor(frontend): extract auth loaders components by @peterpeterparker in #2542
- feat(frontend): extract app loader and load idb data after sign-in by @peterpeterparker in #2543
- feat(frontend)!: rename OpenIdProvider.GitHub to OpenIdProvider.GitHubAuth by @peterpeterparker in #2544
- refactor(auth): move verify to openid/delegation module by @peterpeterparker in #2546
- refactor(auth): move openidcredentials to delegation sub-module by @peterpeterparker in #2547
- refactor(auth): use keyword Auth for OpenIdProvider struct related to authentication by @peterpeterparker in #2548
- refactor(auth): rename delegation related function and remove unused impl by @peterpeterparker in #2549
- refactor(auth): move delegation to sub-module credentials by @peterpeterparker in #2550
- refactor(auth): move OpenIdDelegationProvider back to openid root by @peterpeterparker in #2551
- chore(console,observatory): clippy suggestions by @peterpeterparker in #2553
Full Changelog: v0.0.66...v0.0.67
v0.0.66
Summary
This release introduces support for authentication with GitHub on the Juno Console.
Context
GitHub authentication in Juno uses an OpenID Connect-like flow that requires a proxy server to securely handle OAuth credentials. Unlike traditional OAuth implementations where the client secret must remain confidential, Juno's architecture necessitates a backend service to:
- Store and manage GitHub OAuth sensitive credentials (client ID and secret)
- Exchange authorization codes for access tokens without exposing secrets to the browser
- Generate JWT tokens for integration with Juno's authentication system
The Juno API serves as this proxy, providing secure OAuth token exchange and JWT generation. This new API is open-source and can be self-hosted, which you'll need if you implement the same flow in your Satellite in the future. The Juno Console uses a hosted instance at api.juno.build.
Note
Support for GitHub authentication within Satellites will follow in a future release.
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.3.2 | ️ |
| Observatory | v0.4.0 | ️ |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v4.0.1 | |
@junobuild/auth |
v3.0.1 | |
@junobuild/core |
v4.0.0 | |
@junobuild/config |
v2.10.0 | |
@junobuild/errors |
v0.2.1 |
What's Changed
- feat(frontend): display TCycles instead of T Cycles in wizard by @peterpeterparker in #2519
- test(e2e): adapt T Cycles -> TCycles by @peterpeterparker in #2517
- build(frontend): bump Svelte CVEs by @peterpeterparker in #2515
- build(core): bump ic-wasm v0.9.10 by @peterpeterparker in #2516
- style(frontend): circle background for internet computer logo by @peterpeterparker in #2520
- fix(frontend): filter documents race condition by @peterpeterparker in #2521
- feat(observatory): add open id provider as parameter to start and stop monitoring by @peterpeterparker in #2523
- build(backend): Update Rust version by @github-actions[bot] in #2363
- feat(auth): add support for preferred_username in open id data by @peterpeterparker in #2524
- feat(auth): support multi providers in authenticate / register by @peterpeterparker in #2528
- feat(auth): authenticate with GitHub by @peterpeterparker in #2527
- feat(frontend): bump Juno JS libs with authenticate breaking change in args by @peterpeterparker in #2530
- feat(core): GitHub authentication configuration by @peterpeterparker in #2531
- feat(frontend): inject env github client ID by @peterpeterparker in #2532
- feat(frontend): inject env github Juno API url by @peterpeterparker in #2533
- feat(observatory): restart github monitoring by @peterpeterparker in #2529
- feat(frontend): authenticate with GitHub by @peterpeterparker in #2518
- feat(frontend): allow api.juno.build in CSP connect-src by @peterpeterparker in #2536
- feat(frontend): allow avatars.githubusercontent.com in CSP img-src by @peterpeterparker in #2535
- feat(auth): use GitHub Apps by @peterpeterparker in #2537
Full Changelog: v0.0.65...v0.0.66
v0.0.65
Summary
Tip
This release has no functional impact on your development or projects.
This release is a follow-up to last week's release v0.0.63.
Now that we've simplified the developer experience by making the Console the hub for managing your modules (Satellites, Orbiters, Mission Control), the next step is enabling existing developers to migrate their module IDs and metadata (e.g., module names) to the Console.
That's why, when you sign in, you may notice a new warning notification prompting you to reconcile your Satellites and Orbiters. Following the process allows to synchronize information between your Mission Control and the Console automatically, ensuring both are aware of the same list of modules. This is particularly useful for developers who never used Mission Control or never activated Monitoring but, generally speaking to prevent issues in the future.
Note
The notification is displayed as an alert to catch your attention but is not a call to action that requires immediate action.
The release also patches a minor issue with the upgrade WASM process that could occur when Mission Control and your modules lived on different subnets. The issue had no functional impact, it only triggered within a pre-assertion check.
Additionally, the wallet page has been moved from the main menu to the user popover. Since the navigation bar already provides quick access to all wallet features, this reduces redundancy and improves interface readability. The popover for switching Satellites has also been deprecated—it duplicated the Spotlight search feature introduced a few months ago and contained a minor bug. No component, no bug 😄.
Overview
| Module | Version | Breaking changes |
|---|---|---|
| Console | v0.3.1 | ️ |
| Library | Version | Breaking changes |
|---|---|---|
@junobuild/admin |
v4.0.0 |
| CLI | Version | Breaking changes |
|---|---|---|
@junobuild/cli |
v0.13.10 |
| Docker | Version | Breaking changes |
|---|---|---|
@junobuild/skylab |
v0.4.16 | |
@junobuild/satellite |
v0.4.16 | |
@junobuild/console |
v0.4.16 |
What's Changed
- feat(frontend): add token toggle to OISY receive by @peterpeterparker in #2496
- feat(console): remove one time rates and fees upgrade by @peterpeterparker in #2497
- refactor(frontend): remove usage of Store keyword in derived by @peterpeterparker in #2500
- refactor(frontend): move isBusy to derived by @peterpeterparker in #2501
- fix(frontend): remove usage of Mission Control as chunk store in upgrade by @peterpeterparker in #2503
- feat(console): set and unset many segments at once by @peterpeterparker in #2504
- feat(frontend): reconcile divergent list of segments by @peterpeterparker in #2499
- feat(frontend): move wallet full page to standalone by @peterpeterparker in #2498
- feat(frontend): remove Satellites switcher by @peterpeterparker in #2507
- chore(scripts): print ledger cycles balance of the console by @peterpeterparker in #2508
- feat(frontend): modules T Cycles display consistency by @peterpeterparker in #2509
- feat(frontend): wallet TCycles display consistency by @peterpeterparker in #2510
- feat(frontend): load segments once at boot time by @peterpeterparker in #2511
- fix(frontend): loading with certified new account stuck on launchpad by @peterpeterparker in #2513
- feat(frontend): display progress on reconcile sync by @peterpeterparker in #2512
- feat(frontend): set mission control controler on out of sync attach by @peterpeterparker in #2514
Full Changelog: v0.0.64...v0.0.65