ponzu 1.70.0 → 1.71.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,7 +34,7 @@ This clones the repo into `~/Ponzu/north-brook/ponzu` (or reuses the clone there
34
34
 
35
35
  Or [download the Mac app](https://ponzu.design/download) (Apple silicon, signed and notarized; it updates itself). Windows (x64) and Linux (x64, an AppImage or a `.deb`) builds are in beta, on the [releases page](https://github.com/north-brook/ponzu/releases/latest); they update themselves too, and the Windows one isn't signed yet, so SmartScreen asks before its first launch. It opens `.design` folders like documents, and on first launch it sets up Claude Code, Codex and Cursor for you. There's nothing else to install or keep running.
36
36
 
37
- Its home screen's **Suggested** tab proposes designs for the projects your agents worked in lately. When you open it (at most every ten minutes, and only to top it up to eight), Ponzu runs your own Claude Code (or Codex, without Claude Code) headless and read-only, on your agent's account, in two steps: a glance at each project's file list and readme, with no tools, names a few designs, then one run for each reads the code it starts from and writes its prompt. Claude Code gets only Read, Glob and Grep, Codex its read-only sandbox, and neither gets any MCP servers. You copy the prompt you like into your agent. The ideas are kept in `~/.ponzu/suggestions.json`.
37
+ Its home screen's **Suggested** tab proposes designs for the projects your agents worked in lately. When you open it (at most every ten minutes, and only to top it up to eight), Ponzu runs your own Claude Code (or Codex, without Claude Code) headless and read-only, on your agent's account, in two steps: a glance at each project's file list and readme, with no tools, names a few designs, then one run for each reads the code it starts from and writes its prompt. Claude Code gets only Read, Glob and Grep, Codex its read-only sandbox, and neither gets any MCP servers. You copy the prompt you like into your agent. The ideas are kept in `~/.ponzu/suggestions.json`. Your other Macs' Ponzu show theirs too, for their own projects, over your tailnet, and opening the tab asks each to look again.
38
38
 
39
39
  The app also puts `ponzu` in your terminal, running from inside the app so it updates with it. It links the command into a folder your shell already searches that you can write to (`~/.local/bin`, `~/bin` or `/usr/local/bin`), never over another `ponzu`. If there's no such folder, choose **Ponzu › Install Terminal Command…**, which asks for your password to add it to `/usr/local/bin`.
40
40
 
package/dist/index.js CHANGED
@@ -33422,6 +33422,7 @@ See it
33422
33422
 
33423
33423
  What the person sees
33424
33424
  - On their canvas, the load plays once when the artboard appears: when they open its page, and each time you edit it. Then a finite animation holds its end. Hovering or clicking the artboard doesn't replay it, so never tell them it will.
33425
+ - Their canvas plays what record shows. It holds motion still on purpose: while its window is in the background on battery, while they pan across a crowded page, for parts too small to see at their zoom, and for loops longer than 20 s on an artboard zoomed far out. If record shows the motion working and they say it doesn't play, tell the Ponzu team with send_feedback instead of reworking the design.
33425
33426
  - A hint that fades out ends hidden, so the canvas shows nothing once it has played.
33426
33427
  - When they need to watch the motion (an entrance to review, a hint that leaves), put a looping copy on an artboard beside the real one: animation-iteration-count: infinite, with a beat of about a second held at the end of the keyframes so each cycle reads as one play. Keep the real one finite, and say which is which in a note.
33427
33428
  - If the motion answers something the person does, put it on :hover or :focus, so they can set it off themselves.
@@ -47009,7 +47010,7 @@ function serve(ws, opts = {}) {
47009
47010
  return Response.json({ ok: true });
47010
47011
  }
47011
47012
  if (path === "/api/suggestions" || path === "/api/suggestions/refresh") {
47012
- if (caller !== "local" || !sameHostOk(req, url))
47013
+ if (caller === "local" && !sameHostOk(req, url))
47013
47014
  return new Response("Forbidden", { status: 403 });
47014
47015
  const refresh = path === "/api/suggestions/refresh";
47015
47016
  if (refresh && req.method !== "POST")
@@ -47449,7 +47450,7 @@ function serve(ws, opts = {}) {
47449
47450
  function peerAllowed(req, pathname) {
47450
47451
  if (isPage(req))
47451
47452
  return false;
47452
- if (pathname === "/api/shelf" || pathname === "/api/update/install")
47453
+ if (pathname === "/api/shelf" || pathname === "/api/update/install" || pathname === "/api/suggestions/refresh")
47453
47454
  return req.method === "POST";
47454
47455
  if (req.method !== "GET")
47455
47456
  return false;
@@ -47461,6 +47462,7 @@ function peerAllowed(req, pathname) {
47461
47462
  "/api/thumb",
47462
47463
  "/api/info",
47463
47464
  "/api/macs",
47465
+ "/api/suggestions",
47464
47466
  "/ws"
47465
47467
  ].includes(pathname) || /^\/files\/[^/]+\/assets\/.+$/.test(pathname);
47466
47468
  }
@@ -47487,13 +47489,13 @@ function isPage(req) {
47487
47489
  }
47488
47490
  var SHELF_ACTIONS = ["archive", "restore", "scratch", "recent"];
47489
47491
  async function relay(req, target) {
47490
- const shelf = req.method === "POST" && new URL(target).pathname === "/api/shelf";
47491
- if (req.method !== "GET" && !shelf)
47492
+ const post = req.method === "POST" && ["/api/shelf", "/api/suggestions/refresh"].includes(new URL(target).pathname);
47493
+ if (req.method !== "GET" && !post)
47492
47494
  return new Response("Method not allowed", { status: 405 });
47493
47495
  try {
47494
47496
  const res = await fetch(target, {
47495
- signal: AbortSignal.timeout(shelf ? 5000 : 30000),
47496
- ...shelf ? {
47497
+ signal: AbortSignal.timeout(post ? 5000 : 30000),
47498
+ ...post ? {
47497
47499
  method: "POST",
47498
47500
  headers: { "content-type": "application/json" },
47499
47501
  body: await req.text()
@@ -47638,7 +47640,7 @@ function remoteUpdater(endpoint, token) {
47638
47640
  // apps/cli/package.json
47639
47641
  var package_default = {
47640
47642
  name: "ponzu",
47641
- version: "1.70.0",
47643
+ version: "1.71.1",
47642
47644
  description: "The open source canvas your agent draws on in HTML and CSS.",
47643
47645
  type: "module",
47644
47646
  license: "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ponzu",
3
- "version": "1.70.0",
3
+ "version": "1.71.1",
4
4
  "description": "The open source canvas your agent draws on in HTML and CSS.",
5
5
  "license": "MIT",
6
6
  "type": "module",