Skip to content

Releases: junobuild/juno

v0.0.73

05 Apr 08:49

Choose a tag to compare

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

Full Changelog: v0.0.72...v0.0.73

v0.0.72

03 Apr 15:16
5c6e174

Choose a tag to compare

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

Read more

v0.0.71

14 Mar 16:02
7c42891

Choose a tag to compare

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 --- ⚠️ Deprecated by @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

Read more

v0.0.70

22 Feb 15:26
ab22f6f

Choose a tag to compare

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.

with without

What's Changed

Full Changelog: v0.0.69...v0.0.70

v0.0.69

19 Feb 12:53

Choose a tag to compare

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.

👉 Documentation

Google Chrome 2026-02-19 17:21:04 - Frame 92

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.

👉 Documentation

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

Read more

v0.0.61-patch.1

02 Feb 19:55

Choose a tag to compare

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

31 Jan 09:59

Choose a tag to compare

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

Full Changelog: v0.0.67...v0.0.68

v0.0.67

29 Jan 07:18
afee34d

Choose a tag to compare

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

Full Changelog: v0.0.66...v0.0.67

v0.0.66

23 Jan 15:58
45aaa45

Choose a tag to compare

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.

screenshot

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

Full Changelog: v0.0.65...v0.0.66

v0.0.65

15 Jan 14:36

Choose a tag to compare

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 😄.

Capture d’écran 2026-01-15 à 15 04 38 Capture d’écran 2026-01-15 à 15 04 17 Capture d’écran 2026-01-15 à 15 37 29

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

Full Changelog: v0.0.64...v0.0.65