Latest Juno Releases

Hi :waving_hand:

A new release is out — v0.0.54 :rocket:

Here are a few highlights:

:high_voltage: Faster deploys with proposals batching
:package: Smarter precompression (optional Brotli + replace mode)
:shuffle_tracks_button: Redirects fixed
:sparkles: Shinier experience when deploying in your terminal

Checkout the release notes for details :backhand_index_pointing_right: Release v0.0.54 · junobuild/juno · GitHub

Let me know if you have any questions.


Example of the new configuration option precompress:

export default defineConfig({
  satellite: {
    ids: {
      production: 'qsgjb-riaaa-aaaaa-aaaga-cai'
    },
    source: 'dist',
    precompress: {
      algorithm: 'brotli',
      pattern: '**/*.+(css|js|mjs|html)',
      mode: 'replace'
    }
  }
});
4 Likes

Hi :waving_hand:

A new release is out — v0.0.55 :rocket:

This update introduces a new authentication method for your Satellite: Passkeys :locked_with_key:

Every Juno dev can now implement passwordless sign-in, built right into their Juno apps.


Forum bonus:

On the IC side, I wrote my own implementation of WebAuthnIdentity , which can also be used by projects outside of Juno.

Ping me if you’re interested.


Screenshots tax:

In the Console UI, users who sign up with passkeys are identified as such.

And a cool thing: the details also show, if available, which authenticator was used.

5 Likes

Hi :waving_hand:

I just upgraded all the Juno templates!

:package: Next.js, React, Vue, SvelteKit, Angular & Vanilla updated
:closed_lock_with_key: Built-in passkey authentication added
:test_tube: E2E tests extended to cover new auth method

npm create juno@latest

All systems go, happy weekend :white_check_mark::sunny:


6 Likes

Hi :waving_hand:

A new release is out — v0.0.56 :rocket:

This release focuses on frontend changes in the Console:

It introduces two new features:

  • You can now label your Satellites with environment flags and tags. These appear in the launchpad, switcher, and overview. On the launchpad, they can also be used as search filters to quickly find the right Satellite.

  • A new navigation feature - called “Spotlight” or “Quick Access” - lets you jump anywhere in the Console or run actions (such as changing the theme) in seconds. Open it with the search icon in the navbar or by pressing Ctrl/Cmd + K.

Hopefully these make building with the Console a little more fun (and faster)!


3 Likes

Hi :waving_hand:

A new release is out — v0.0.57 :rocket:

:sparkles: Host your frontend on heap or stable memory
:key: Internet Identity login with https://id.ai
:t_rex: Fixes & improvements

Release notes :backhand_index_pointing_right: https://github.com/junobuild/juno/releases/tag/v0.0.57

4 Likes

Very cool. I have not tried out Juno in a while. Need to try again.
How does it play into the Caffiene narrative?

Nowhere, I guess. However, you can find LLM.txt files on Juno’s website if you are looking for some AI assistance. Cursor supports the format natively, and tools like ChatGPT or Claude can also crawl them.

1 Like

FYI I did a bit of cleanup in the CLI commands, it was starting to feel messy :broom:

No worries, almost everything is backwards-compatible, aside from one change. I kept aliases so you don’t have to learn anything new. :backhand_index_pointing_down:

juno deployjuno hosting deploy
juno clearjuno hosting clear

and

juno configjuno config apply (:warning: this one is a breaking change)
juno initjuno config init

and

juno dev startjuno emulator start
juno dev stopjuno emulator stop
juno dev waitjuno emulator wait

It was shipped in v0.10.0 .

There’s also a new dope CLI feature coming, I’ll share that probably tomorrow :smiling_face_with_sunglasses:

1 Like

Say hello to juno run :waving_hand:

Build custom scripts that already know your env, profile & config.
Write them in JS/TS.
Run with the CLI. :high_voltage:

:cherries: on top? Works out of the box in GitHub Actions!

For example:

import { defineRun } from "@junobuild/config";

export const onRun = defineRun(({ mode, profile }) => ({
  run: async ({ satelliteId, identity }) => {
    console.log("Running task with:", {
      mode,
      profile,
      satelliteId: satelliteId.toText(),
      whoami: identity.getPrincipal().toText()
    });
  }
}));

Run it with:

juno run --src ./my-task.ts

Now, let’s suppose you want to fetch a document from your Satellite’s Datastore (“from your canister’s little DB”) and export it to a file:

import { getDoc } from "@junobuild/core";
import { defineRun } from "@junobuild/config";
import { jsonReplacer } from "@dfinity/utils";
import { writeFile } from "node:fs/promises";

export const onRun = defineRun(({ mode }) => ({
  run: async (context) => {
    const key = mode === "staging" ? "123" : "456";

    const doc = await getDoc({
      collection: "demo",
      key,
      satellite: context
    });

    await writeFile("./mydoc.json", JSON.stringify(doc, jsonReplacer, 2));
  }
}));

Fancy :sparkles:

And since it’s TS/JS, you can obviously use any libraries to perform admin tasks as well.

import { defineRun } from "@junobuild/config";
import { IcrcLedgerCanister } from "@dfinity/ledger-icrc";
import { createAgent } from "@dfinity/utils";

export const onRun = defineRun(({ mode }) => ({
  run: async ({ identity, container: host }) => {
    if (mode !== "development") {
      throw new Error("Only for fun!");
    }

    const agent = await createAgent({
      identity,
      host,
    });

    const { metadata } = IcrcLedgerCanister.create({
      agent,
      canisterId: MY_LEDGER_CANISTER_ID,
    });

    const data = await metadata({});
    
    console.log(data);
  }
}));

Coolio?

I’ll demo it next Monday in Juno Live.
:movie_camera: https://youtube.com/@junobuild

Happy week-end :sun:

7 Likes

Thanks to the remarkable work of @mraszyk on PocketIC, I’ve been able to extend the Juno emulator with a few new services:

:card_index_dividers: Registry
:diamond_with_a_dot: Cycles ledger
:ballot_box_with_ballot: SNS
:globe_with_meridians: NNS dapp

Added to what was already included:

:key: Internet Identity
:money_bag: ICP ledger
:ballot_box_with_ballot: NNS
:gear: CMC

This makes a pretty nice suite for local development :flexed_biceps:

Docs :backhand_index_pointing_right: https://juno.build/docs/guides/local-development


PS: I also started working on supporting Apple Container this weekend. Hit a few issues on their side, I’ll keep tracking it.

5 Likes

You can now download and upload snapshots offline with the Juno CLI (v0.10.2) :toolbox: :floppy_disk:

That means you can:

  • Keep a local copy of your module’s state
  • Stash it somewhere safe, just in case :sweat_smile:
  • Restore it when needed
  • Or even move it between Satellites
juno snapshot download --target satellite
juno snapshot upload --target satellite --dir .snapshots/0x00000060101

Give it a try and let me know if you hit any hiccups or if there’s an option missing.

5 Likes

New (kind of) breadcrumbs nav, who dis? :bread::sparkles:

I tagged a new release as I deployed a new version of the Console UI to mainnet.

Aside from the updated navigation, which now displays the page title within breadcrumb-style navigation (see screenshot below), and a few minor fixes, not much has changed feature-wise.

The biggest change in the frontend’s codebase, which explains why so many files were touched, is a refactor to adopt the new pattern I’ve been using for DID declarations.

Instead of relying on auto-imported separate types, I now prefer grouping factories in a single module, exporting them from there, and importing the types through a suffixed module DID alias.

You can check out the pattern in Juno’s frontend codebase or in the ic-client JS library. If you’re curious about it, let me know.

It’s a small structural shift that makes the code much cleaner and more readable.

Finally, there are a few new E2E tests added in this repo and in the CLI.

4 Likes