diff --git a/apps/marketing/public/images/changelog/v1.6.0-devstack-bridge.webp b/apps/marketing/public/images/changelog/v1.6.0-devstack-bridge.webp new file mode 100644 index 0000000..768bc27 Binary files /dev/null and b/apps/marketing/public/images/changelog/v1.6.0-devstack-bridge.webp differ diff --git a/apps/marketing/src/pages/changelog.astro b/apps/marketing/src/pages/changelog.astro index 017b783..5cf37ee 100644 --- a/apps/marketing/src/pages/changelog.astro +++ b/apps/marketing/src/pages/changelog.astro @@ -72,6 +72,10 @@ const releases: Array<{ content: `The local server has no login of its own - anything that can reach it on your machine could ask it to export a key or sign a transaction. Exporting a private key, importing one, transferring, paying, and signing now require pairing: copy the token printed in the terminal where you started the server, and paste it once into the "Pair browser" control next to the theme toggle. Read-only actions - balances, dry-runs, browsing objects - are untouched.`, }, ], + improvementsImage: { + src: '/blog/images/changelog/v1.6.0-devstack-bridge.webp', + alt: 'The Devstack Bridge page: pointed at a local devstack project, showing its doctor diagnostics (Docker, sui-cli, state dir all ok), the localnet RPC endpoint, a published "counter" package address, and a funded "alice" test account, with a "Use this network" button.', + }, improvements: [ "Package Explorer: a dedicated page for browsing a deployed package's modules, functions and datatypes, out of the Objects tab strip.", 'Dashboard: the widget grid is now configurable - add, remove and rearrange the cards you actually want to see.', diff --git a/apps/server/src/services/DevstackService.ts b/apps/server/src/services/DevstackService.ts index 4070f8e..632528a 100644 --- a/apps/server/src/services/DevstackService.ts +++ b/apps/server/src/services/DevstackService.ts @@ -59,12 +59,19 @@ interface RawDeployment { faucet?: string; graphql?: string; local?: boolean; - packages?: Record; + // devstack 0.4+ emits `{ id: "0x..." }` per package instead of the bare + // id string older versions wrote; accept both so a devstack upgrade on + // the user's machine doesn't crash the bridge. + packages?: Record; } >; accounts?: Record; } +function packageId(value: string | { id: string }): string { + return typeof value === 'string' ? value : value.id; +} + interface CacheEntry { value: T; /** Wall-clock expiry for capability probes. */ @@ -242,7 +249,9 @@ export class DevstackService { faucet: net.faucet, graphql: net.graphql, local: net.local, - packages: net.packages ?? {}, + packages: Object.fromEntries( + Object.entries(net.packages ?? {}).map(([pkg, id]) => [pkg, packageId(id)]) + ), }; } diff --git a/apps/web/src/components/HomePage/TestimonialWall.tsx b/apps/web/src/components/HomePage/TestimonialWall.tsx index a699c26..9a8920c 100644 --- a/apps/web/src/components/HomePage/TestimonialWall.tsx +++ b/apps/web/src/components/HomePage/TestimonialWall.tsx @@ -27,17 +27,17 @@ export function TestimonialWall() { The gas breakdown alone paid for itself — we caught a loop that was burning 40% of our budget on a single entry function. - + I keep it open next to the explorer during reviews. Being able to split, merge and inspect coins without leaving the keyboard is the whole pitch. - + We put it in front of forty workshop attendees who'd never touched Move. Nobody got stuck on environment setup. That has never happened before. - + It runs the CLI I already trust — no hosted keys, no wrapper service, nothing leaves my machine. That's why it survived past the demo.