---
title: "Change Look"
method: PUT
path: "/v1/ops/announcements/{announcement_id}/look"
tags: ["announcements"]
---

# Change Look

`PUT /v1/ops/announcements/{announcement_id}/look`

## Request

- Base URL: `https://api.stormy.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stormy.ai/v1/ops/announcements/{announcement_id}/look`
- Auth: none declared

How the note stands in the app — mark, media, presses or a whole JSX face. Every owner
who has not seen it yet gets this look on his next open; the desks' words are untouched.

## Path parameters

- `announcement_id` string, uuid, required

## Headers

- `authorization` string, nullable
- `x-darwin-token` string, nullable

## Request body

- NewsLook: How a note is drawn. Every field is optional; an empty look is the house's default.
  - `mark` string: 'stormy', an app's slug ('slack') or an image URL; empty = read from the note's link.
  - `media` NewsMedia: A picture or a video above the title.
    - `src` string, required: A /path on stormy.ai or a full https URL.
    - `kind` 'image' | 'video'
    - `poster` string: A video's still before it plays.
  - `actions` NewsAction[]: Empty = the house's presses: Add <app> / Take a look / Got it, and Close.
    - `label` string, required
    - `href` string: A /app path (this workspace's copy) or a full https link.
    - `connect` string: An app's slug: opens its connect door.
    - `ask` string: Words handed to Stormy in the chat, as the owner's own.
    - `primary` boolean: The one black press; the LAST action when none says so (the right-hand pill).
  - `face` string: A `function Screen()` of JSX, mounted inside the house's frame with the renderer every page uses. In scope: note (title, body, url, look); the presses as verbs act(action), open(href), connect(app), ask(words), close(); and the house's parts <Mark/>, <Media/>, <Presses/>, <Default/>. The frame is narrow (a 420px window, a phone sheet): the house reflows grid-cols-N to fewer columns there unless the grid carries data-hold-columns. One that does not compile or throws falls back to the house's sheet.

## Response `200`

Successful Response

- NewsLook: How a note is drawn. Every field is optional; an empty look is the house's default.
  - `mark` string: 'stormy', an app's slug ('slack') or an image URL; empty = read from the note's link.
  - `media` NewsMedia: A picture or a video above the title.
    - `src` string, required: A /path on stormy.ai or a full https URL.
    - `kind` 'image' | 'video'
    - `poster` string: A video's still before it plays.
  - `actions` NewsAction[]: Empty = the house's presses: Add <app> / Take a look / Got it, and Close.
    - `label` string, required
    - `href` string: A /app path (this workspace's copy) or a full https link.
    - `connect` string: An app's slug: opens its connect door.
    - `ask` string: Words handed to Stormy in the chat, as the owner's own.
    - `primary` boolean: The one black press; the LAST action when none says so (the right-hand pill).
  - `face` string: A `function Screen()` of JSX, mounted inside the house's frame with the renderer every page uses. In scope: note (title, body, url, look); the presses as verbs act(action), open(href), connect(app), ask(words), close(); and the house's parts <Mark/>, <Media/>, <Presses/>, <Default/>. The frame is narrow (a 420px window, a phone sheet): the house reflows grid-cols-N to fewer columns there unless the grid carries data-hold-columns. One that does not compile or throws falls back to the house's sheet.

## Other responses

- `422`: Validation Error

## Changes

> 68 revisions in range; 1 not diffed.

- **2026-10-05** `64dcb155acd1`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/stormy/apis/stormy-control-plane/changes/v1/ops/announcements/:announcement_id/look/put.md)

---

[API](https://skmtc.dev/stormy/apis/stormy-control-plane.md) · [All operations](https://skmtc.dev/stormy/apis/stormy-control-plane/llms.txt) · [OpenAPI document](https://skmtc.dev/stormy/apis/stormy-control-plane/revisions/a40e83844eaa?raw)
