{"id":"1db42f78-ec55-4315-b3ba-caf6eded07e2","slug":"studiowright","kind":"mcp","name":"studiowright","summary":"StudioWright: Google Flow and Google Flow Music from your terminal and your AI agent, through your own signed-in Chrome. Unofficial; not affiliated with Google.","owner":"umutkocak","repoUrl":"https://github.com/umutkocak/studiowright","license":"MIT","licenseTier":"permissive","trust":"community","stars":1,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-10-11T12:12:58.000Z","addedAt":"2026-10-21T05:17:58.085Z","logoUrl":"https://avatars.githubusercontent.com/u/25377336?u=0cd9a020a9ff4972d35ee2edd7ac852a9d6d51c0&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["design-media","browser-web","developer-tools"],"tags":["ai-music","ai-video","automation","claude-code","claude-code-plugin","cli","flow-music","google-flow"],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-21T05:28:13.274Z","sample":false,"url":"https://conduits.dev/tools/studiowright","language":"Python","transports":["stdio"],"install":{"pypi":"studiowright"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<div align=\"center\">\n\n# StudioWright\n\n**Google Flow and Google Flow Music, from your terminal and your AI agent.**\n\nImages, video clips and songs made in your own signed-in Chrome, on your own subscription.<br>\nNo API keys. No cookie exports. No captcha solvers. No browser extension.\n\n![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-3776AB?logo=python&logoColor=white)\n![License: MIT](https://img.shields.io/badge/license-MIT-green)\n![MCP server](https://img.shields.io/badge/MCP-server-6E56CF)\n![Claude Code plugin](https://img.shields.io/badge/Claude%20Code-plugin-D97757)\n![Tested on Windows 11](https://img.shields.io/badge/tested%20on-Windows%2011-0078D4)\n\n</div>\n\n> [!IMPORTANT]\n> StudioWright is an independent, unofficial project. It is not affiliated with, endorsed\n> or sponsored by Google. It drives Flow's and Flow Music's web pages in **your** browser\n> and spends **your** credits. Read the [disclaimer](#disclaimer) before you use it.\n\n```bash\nsw image \"a lighthouse keeper with a teal coat, flat textured 2D\" --aspect 16:9\nsw video \"he turns towards the sea\" --start keeper.jpg --duration 4 --resolution 360p\nsw music \"moody indie folk, warm male vocal\" --lyrics-file chorus.txt --length 1:00\n```\n\n## Contents\n\n- [Showcase](#showcase)\n- [Why StudioWright](#why-studiowright)\n- [Features](#features)\n- [Install](#install)\n- [Quick start](#quick-start)\n- [Use it from AI agents](#use-it-from-ai-agents)\n- [Command reference](#command-reference)\n- [Batch files](#batch-files)\n- [Costs and safety](#costs-and-safety)\n- [How it works](#how-it-works)\n- [Troubleshooting](#troubleshooting)\n- [Configuration](#configuration)\n- [Development](#development)\n- [Disclaimer](#disclaimer)\n\n## Showcase\n\nEverything here was made with StudioWright, from one small batch file and two chat\nmessages.\n\n```json\n{\"id\": \"keeper\", \"kind\": \"image\", \"prompt\": \"a lighthouse keeper with a teal coat, standing, flat textured 2D illustration\", \"refs\": [\"style.png\"]}\n{\"id\": \"keeper-close\", \"kind\": \"image\", \"prompt\": \"close-up portrait of the same lighthouse keeper, flat textured 2D\", \"refs\": [\"keeper\"]}\n{\"id\": \"keeper-clip\", \"kind\": \"video\", \"prompt\": \"the lighthouse keeper turns his head towards the sea, gentle wind\", \"start\": \"keeper\", \"resolution\": \"360p\", \"duration\": 4}\n```\n\n<table>\n<tr>\n<td width=\"50%\"><img src=\"docs/media/keeper.jpg\" alt=\"A lighthouse keeper in a teal coat on a cliff at night\"><br><sub><b>keeper</b> · Nano Banana 2.1 · style from a reference image · 22 s</sub></td>\n<td width=\"50%\"><img src=\"docs/media/keeper-closeup.jpg\" alt=\"Close-up of the same lighthouse keeper\"><br><sub><b>keeper-close</b> · the same character, by referring to the first job · 21 s</sub></td>\n</tr>\n<tr>\n<td width=\"50%\"><img src=\"docs/media/keeper-clip.gif\" alt=\"The keeper turns towards the sea\"><br><sub><b>keeper-clip</b> · Omni Flash, 4 s, start frame from the first job · 32 s · 4 credits</sub></td>\n<td width=\"50%\"><a href=\"docs/media/beacon-in-the-dark.mp4\"><img src=\"docs/media/beacon-cover.jpg\" alt=\"Cover art of the song Beacon in the Dark: a lighthouse in a storm\"></a><br><sub><b>Beacon in the Dark</b> · written and sung by the Flow Music Producer · 37 s · 5 credits<br><a href=\"docs/media/beacon-in-the-dark.mp4\">▶ listen (MP4)</a> · <a href=\"docs/media/beacon-in-the-dark.mp3\">MP3</a></sub></td>\n</tr>\n</table>\n\nThe song took two chat turns:\n\n```bash\nsw music chat \"Write a four-line chorus about a lighthouse keeper who waits for the ships.\"\nsw music chat \"Moody indie-folk please. Make the song now, about one minute long.\" --session <id from the first reply>\n```\n\n## Why StudioWright\n\nMost ways to automate Google's media models need one of these: a paid API key, cookies\ncopied out of your browser, a captcha-solving service, an unpacked browser extension, or a\nthird-party relay that holds your session. StudioWright needs none of them.\n\n| | Paid model APIs | Cookie-based wrappers | Hosted relays | **StudioWright** |\n| --- | :---: | :---: | :---: | :---: |\n| Uses the credits of your Flow / Flow Music plan | ✗ | ✓ | ✓ | **✓** |\n| No API key or per-call billing | ✗ | ✓ | ✗ | **✓** |\n| Your session never leaves your machine | ✓ | ✗ | ✗ | **✓** |\n| No captcha solving or token forging | ✓ | ✗ | ? | **✓** |\n| Every option of the web app | partial | partial | partial | **✓** |\n| Images, video **and** music in one tool | ✗ | ✗ | partial | **✓** |\n\nWhat makes it different:\n\n- **It acts like you.** StudioWright types, clicks and chooses files in Flow's real pages,\n  in a Chrome you signed in to yourself. It only *reads* the replies those pages receive,\n  to learn ids and download links. It never forges, replays or alters a request.\n- **One package, three front doors.** The same engine is a CLI (`sw`), an MCP server\n  (`sw mcp`) and a Claude Code plugin.\n- **Built for real production.** Price checks before you spend (`--dry-run`,\n  `--max-credits`), resumable batch files that chain results, sized downloads (2K images,\n  1080p/4K clips), pacing across processes, and a cooldown when Google asks for a break.\n- **Fast on a warm tab.** About 20 s for an image, 30-60 s for a clip, 40 s for a song.\n\n## Features\n\n**Images (Google Flow)**\n- Nano Banana 2.1 (default), Nano Banana Pro and Nano Banana 2 Lite.\n- Aspect ratios 16:9, 4:3, 1:1, 3:4, 9:16; one to four images per call.\n- Reference images from files or earlier results; each file is uploaded once per project\n  and then reused by content.\n- Downloads at Flow's own sizes: 1K (original), 2K (upscaled by Flow), 4K where the plan\n  allows.\n\n**Video (Google Flow)**\n- Omni Flash (default), Veo 3.1 Lite, Fast and Quality.\n- Text only, start frame, start and end frames, or ingredients (several reference images).\n- Omni: 360p / 720p and 4, 6, 8 or 10 s. Aspect 16:9 or 9:16.\n- Downloads at 720p, 1080p or 4K (upscaled by Flow), or as a GIF.\n- `--dry-run` shows Flow's price without submitting; `--max-credits` refuses anything\n  more expensive.\n\n**Music (Google Flow Music)**\n- Songs with your lyrics (any language) or instrumentals; Lyria 3.5 or Lyria 3 Pro;\n  BPM, length (1:00-3:00), seed, title, and cover art from a file or a prompt.\n- **Edit existing songs:** extend, cover in another style, replace a section, variation,\n  trim.\n- **Stems:** drums, bass, vocals and other, each as its own file.\n- **Downloads:** WAV (48 kHz), M4A or MP3; vertical MP4 videos from Flow Music's\n  templates.\n- **The Producer agent:** chat with it to write lyrics, plan songs, remix your own audio\n  or make AI music videos; songs it makes are saved automatically.\n- **Your own audio:** upload a file and extend, cover or split it like any other song.\n\n**Automation**\n- CLI with `--json` output, an MCP server with 16 tools, and a Claude Code plugin with a\n  skill.\n- JSON Lines batch files that resume where they stopped and pass results between jobs.\n- A job history (`sw jobs`) and a screenshot of the page whenever a job fails.\n\n## Install\n\nRequirements: Python 3.12+, [uv](https://docs.astral.sh/uv/), Google Chrome, and a Google\naccount with a Flow plan (images and video) and/or a Flow Music plan (music).\n\n```bash\nuv tool install git+https://github.com/umutkocak/studiowright\nsw --version\n```\n\nThis puts two identical commands on your PATH: `studiowright` and its short form `sw`.\n\n<details>\n<summary>From a local checkout (for development)</summary>\n\n```bash\ngit clone https://github.com/umutkocak/studiowright.git\ncd studiowright\nuv sync\nuv tool install --python 3.13 -e .\n```\n\n</details>\n\n### Updating\n\n- **Plugin** (MCP server and skill): `claude plugin update studiowright@studiowright`, or in\n  Claude Code `/plugin` → Installed → studiowright → Update now; then `/reload-plugins`.\n  Each plugin version runs the StudioWright release of the same version. To update\n  automatically, turn it on once: `/plugin` → Marketplaces → studiowright → Enable\n  auto-update.\n- **Command line**: `uv tool install --force git+https://github.com/umutkocak/studiowright@vX.Y.Z`\n  with the release you want (see [Releases](https://github.com/umutkocak/studiowright/releases)).\n\n## Quick start\n\n**1. Sign in once.** Chrome opens on a profile that belongs to StudioWright only. Sign in\nto Google, open Flow once, then close the window.\n\n```bash\nsw auth login\nsw auth login --url https://www.flowmusic.app/    # only if you will make music\n```\n\nRun `sw stop` first if StudioWright's Chrome is already running.\n\n**2. Make something.**\n\n```bash\nsw image \"a red fox in the snow, flat 2D\" --aspect 1:1\nsw video \"slow push-in on a quiet harbour at dawn\" --model veo-lite --dry-run   # price only\nsw music \"calm documentary underscore, soft piano, warm strings\" --bpm 80 --length 1:30\n```\n\nFiles land in `Downloads/studiowright` (change it with `--out`), and each command prints\ntheir paths. Add `--json` for ids, sizes, timings and credits.\n\n**3. Keep Chrome in the background.** `sw window hide` moves the window off-screen. Never\nminimize it: a minimized Chrome stops rendering and Flow stalls.\n\n## Use it from AI agents\n\nEvery client below runs the same server: `sw mcp` (stdio). If a client cannot find `sw`,\ngive it the full path (`where sw` on Windows, `which sw` elsewhere).\n\nGenerating takes real time (an image ~20 s, a clip up to a few minutes), so give the\nclient a generous tool timeout where it has one.\n\n### Claude Code plugin (recommended)\n\nThe plugin adds the MCP server and a skill that teaches Claude the options, prices and\nsafe habits.\n\n```bash\nclaude plugin install studiowright --marketplace umutkocak/studiowright\n```\n\nor inside Claude Code:\n\n```text\n/plugin marketplace add umutkocak/studiowright\n/plugin install studiowright@studiowright\n```\n\nThe plugin starts its own matching StudioWright release with `uvx`, so it needs only `uv`\nand Chrome; installing `sw` separately is for the command line.\n\nThen just ask:\n\n> Make a 16:9 image of a lighthouse keeper, then a 4-second clip where he turns to the\n> sea. Check the price first.\n>\n> Write a one-minute instrumental bed for a documentary intro and give me the stems.\n\n### Claude Code (MCP server only)\n\n```bash\nclaude mcp add --scope user studiowright -- sw mcp\n```\n\nFor long video jobs, raise the tool timeout, e.g. `MCP_TOOL_TIMEOUT=900000` in your\nenvironment.\n\n<details>\n<summary><b>Claude Desktop</b></summary>\n\nSettings → Developer → Edit Config, then add the server to `claude_desktop_config.json`\n(`%APPDATA%\\Claude\\` on Windows, `~/Library/Application Support/Claude/` on macOS):\n\n```json\n{\n  \"mcpServers\": {\n    \"studiowright\": { \"command\": \"sw\", \"args\": [\"mcp\"] }\n  }\n}\n```\n\nQuit Claude Desktop completely and start it again.\n</details>\n\n<details>\n<summary><b>Cursor</b></summary>\n\n`~/.cursor/mcp.json` (all projects) or `.cursor/mcp.json` (one project):\n\n```json\n{\n  \"mcpServers\": {\n    \"studiowright\": { \"command\": \"sw\", \"args\": [\"mcp\"] }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>VS Code (GitHub Copilot)</b></summary>\n\n`.vscode/mcp.json` (note the `servers` key):\n\n```json\n{\n  \"servers\": {\n    \"studiowright\": { \"type\": \"stdio\", \"command\": \"sw\", \"args\": [\"mcp\"] }\n  }\n}\n```\n\nFor all workspaces, run **MCP: Open User Configuration** and add the same entry.\n</details>\n\n<details>\n<summary><b>Codex CLI</b></summary>\n\n```bash\ncodex mcp add studiowright -- sw mcp\n```\n\nor in `~/.codex/config.toml`:\n\n```toml\n[mcp_servers.studiowright]\ncommand = \"sw\"\nargs = [\"mcp\"]\ntool_timeout_sec = 900\n```\n</details>\n\n<details>\n<summary><b>Gemini CLI</b></summary>\n\n```bash\ngemini mcp add -s user studiowright sw mcp\n```\n\nor in `~/.gemini/settings.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"studiowright\": { \"command\": \"sw\", \"args\": [\"mcp\"], \"timeout\": 900000 }\n  }\n}\n```\n</details>\n\n### MCP tools\n\n| Tool | What it does |\n| --- | --- |\n| `flow_generate_image` | Images with any model, aspect, count, references and download size |\n| `flow_generate_video` | Clips with any model and mode, frames, references, size; `dry_run`, `max_credits` |\n| `flow_upload` / `flow_download` | Upload references once; fetch existing media again at any size |\n| `flow_create_project` / `flow_use_project` | Choose where Flow keeps the work |\n| `flow_options` / `flow_status` | Every model and option; recent jobs, pacing and cooldown |\n| `music_generate` | A song or instrumental, with lyrics, BPM, length, seed, model, title, cover art |\n| `music_edit` | Extend, cover, replace, variation or trim an existing song |\n| `music_stems` | Split a song into drums, bass, vocals and other |\n| `music_video` | A vertical MP4 of a song from Flow Music's templates |\n| `music_download` | Existing songs as WAV, M4A or MP3 |\n| `music_library` | The newest songs, the credit balance and the plan (free) |\n| `music_chat` | Talk to the Producer agent; saves any songs it makes |\n| `music_upload` | Upload your own audio as a private song |\n\n## Command reference\n\n`sw --help` and `sw <command> --help` show every option. The most used ones:\n\n### Images and video\n\n```bash\nsw image \"PROMPT\" [--model nano-banana-2.1|nano-banana-pro|nano-banana-2-lite]\n                  [--aspect 16:9|4:3|1:1|3:4|9:16] [--count 1-4] [--ref FILE_OR_ID ...]\n                  [--size 1K|2K|4K] [--project ID] [--out DIR] [--json]\n\nsw video \"PROMPT\" [--model omni-flash|veo-lite|veo-fast|veo-quality] [--mode frames|ingredients]\n                  [--start FILE_OR_ID] [--end FILE_OR_ID] [--ref FILE_OR_ID ...]\n                  [--aspect 16:9|9:16] [--resolution 360p|720p] [--duration 4|6|8|10]\n                  [--size 720p|1080p|4K|270p] [--max-credits N] [--dry-run] [--json]\n\nsw upload FILE ...                 # upload references once, print their media ids\nsw download MEDIA_ID ... [--size 2K|1080p]\nsw project create \"TITLE\" | use ID | list\nsw run BATCH.jsonl [--keep-going]\nsw credits                         # Flow (as of the last clip) and Flow Music balances\nsw jobs | sw pace | sw window show|hide | sw stop | sw mcp\n```\n\n### Music\n\n`SONG` is a song id, a unique id prefix, a flowmusic.app song URL, or `last`.\n\n```bash\nsw music \"SOUND\" [--lyrics TEXT | --lyrics-file FILE] [--bpm N] [--length 1:00-3:00] [--seed N]\n                 [--model lyria-3.5|lyria-3-pro] [--title T] [--cover IMAGE | --cover-prompt TEXT]\n                 [--format wav|m4a|mp3] [--out DIR] [--json]\n\nsw music extend SONG [--from 0:45] [--until 2:30] [--prompt TEXT] [--lyrics-file FILE]\nsw music cover SONG --prompt \"slow jazz trio, brushed drums\"\nsw music replace SONG --start 0:20 --end 0:35 [--prompt TEXT] [--lyrics-file FILE]\nsw music variation SONG\nsw music trim SONG --start 0:05 --end 0:35\nsw music stems SONG\nsw music video SONG [--template simple|modern|player]\nsw music download SONG ... [--format wav|m4a|mp3]\nsw music chat \"MESSAGE\" [--session ID] [--audio FILE] [--image FILE] [--confirm-rights]\nsw music upload FILE --confirm-rights\nsw music list | sw music credits\n```\n\n`sw music \"SOUND\"` is short for `sw music create \"SOUND\"`. Flow Music asks you to confirm\nthat you have the rights to files you upload; `--confirm-rights` is that confirmation, and\nStudioWright never gives it on its own.\n\n## Batch files\n\nA batch is JSON Lines (one job per line) or a JSON list. Jobs run in order, and a job can\nuse an earlier job's result by its `id`.\n\n```json\n{\"id\": \"keeper\", \"kind\": \"image\", \"prompt\": \"a lighthouse keeper, flat 2D\", \"refs\": [\"style.png\"]}\n{\"id\": \"clip\", \"kind\": \"video\", \"prompt\": \"he turns to the sea\", \"start\": \"keeper\", \"duration\": 6, \"max_credits\": 12}\n{\"id\": \"bed\", \"kind\": \"music\", \"sound\": \"calm piano underscore\", \"length\": \"1:30\"}\n{\"id\": \"bed-long\", \"kind\": \"music\", \"action\": \"extend\", \"song\": \"bed\", \"end\": \"2:30\"}\n{\"id\": \"bed-stems\", \"kind\": \"music\", \"action\": \"stems\", \"song\": \"bed-long\"}\n```\n\n```bash\nsw run shots.jsonl\n```\n\n- `refs`, `start` and `end` take file paths (relative to the batch file), media ids or job\n  ids. A music job's `song` takes a song id or a job id.\n- Music `action`s: `create` (default), `extend`, `cover`, `replace`, `variation`, `trim`,\n  `stems`, `video`. Extend, replace and trim take their times as `start` / `end`.\n- Results are appended to `shots.jsonl.results.jsonl`. Running the batch again skips jobs\n  that already finished; `--keep-going` continues past a failure.\n\n## Costs and safety\n\nPrices as Flow and Flow Music showed them in October 2026. Your plan may differ.\n\n| Google Flow | Credits |\n| --- | --- |\n| Image, any Nano Banana model | 0 (daily quota) |\n| Omni Flash clip, 360p, 4 s | 4 |\n| Omni Flash clip, 720p, 4 / 6 / 8 / 10 s | 7 / 10 / 12 / 15 |\n| Veo 3.1 Lite / Fast / Quality, 8 s | 10 / 20 / 100 |\n\n| Google Flow Music | Credits | Time |\n| --- | --- | --- |\n| New song, extend, cover, replace, variation | 5 | 30-50 s |\n| Trim, stems, video template, chat, upload, downloads | 0 | 10-60 s |\n| Song made by the Producer in chat | 5 | ~40 s |\n| AI music video (through chat) | expensive; check in the app | minutes |\n\nBuilt-in guards:\n\n- `--dry-run` / `dry_run` sets up a clip and reports Flow's price without submitting.\n- `--max-credits` / `max_credits` refuses a clip that costs more.\n- Submits are spaced (20 s plus jitter) per profile, across processes.\n- When Google reports unusual activity, the profile cools down for 30 minutes and every\n  call says so instead of retrying.\n- One job at a time per profile (and one Flow Music job at a time), queued by a lock.\n  Downloads run in a tab of their own beside generations, since they submit nothing.\n- Upscaled downloads (2K/4K, 1080p) are spaced a minute apart. Flow refuses bulk upscaling\n  with \"unusual activity\"; StudioWright then pauses upscales for an hour (generations go\n  on) and saves new media at their original size meanwhile.\n\n## How it works\n\n```mermaid\nflowchart LR\n    A[\"You, Claude or any MCP client\"] -->|\"sw … / MCP tools\"| B[\"StudioWright\"]\n    B -->|\"CDP on 127.0.0.1\"| C[\"Your Chrome<br/>dedicated profile, signed in by you\"]\n    C -->|\"types, clicks, chooses files\"| D[\"Google Flow\"]\n    C -->|\"types, clicks, chooses files\"| E[\"Google Flow Music\"]\n    D -. \"replies are read, never changed\" .-> B\n    E -. \"replies are read, never changed\" .-> B\n    B --> F[(\"Downloads/studiowright\")]\n```\n\n- StudioWright starts your installed Chrome on its own profile and attaches over the\n  DevTools protocol on loopback. Chrome keeps running between commands, so every call finds\n  a warm, signed-in tab.\n- Inputs are a person's actions: typing, clicking, menus and the file chooser.\n- The pages' own replies are read to learn ids, progress and download links. Requests are\n  never intercepted, replayed or rewritten, and protective tokens are never touched.\n- Nothing is sent anywhere except to Google, by Google's own pages. Your password is typed\n  by you, once, in Chrome.\n\nTechnical notes: [Flow](docs/notes/flow.md) · [Flow Music](docs/notes/flow-music.md).\n\n## Troubleshooting\n\n<details>\n<summary><b>\"not signed in\", or a sign-in page appears</b></summary>\n\nRun `sw stop`, then `sw auth login` (Flow) or `sw auth login --url https://www.flowmusic.app/`\n(Flow Music), sign in, and close the window.\n</details>\n\n<details>\n<summary><b>A job is stuck or very slow</b></summary>\n\nMake sure StudioWright's Chrome window is not minimized (`sw window hide` is the safe way\nto hide it). Run with `sw -v …` to see each step. A failed job leaves a screenshot in the\n`incidents` folder of the data directory, and `sw jobs` shows the error.\n</details>\n\n<details>\n<summary><b>A clip finished in Flow but the command timed out</b></summary>\n\n`sw download <media id>` fetches it without generating again. The timeout message prints\nthe ids.\n</details>\n\n<details>\n<summary><b>\"unusual activity\" / cooldown</b></summary>\n\nGoogle asked for a break. Wait for the cooldown (`sw pace` shows it), and spread large\nbatches out. Do not run several profiles of the same account in parallel.\n</details>\n\n<details>\n<summary><b>A large project (hundreds of media)</b></summary>\n\nFlow's grid only renders the tiles near the viewport. StudioWright finds older references\nby searching the prompt box's picker (uploads keep their `sw-<hash>` name) or by scrolling\nthe grid from where the medium should be, and downloads open each medium's own edit view,\nso position in the grid does not matter. Uploaded images download only at their own size;\nFlow upscales generated media only.\n</details>\n\n<details>\n<summary><b>2K / 1080p downloads are refused or paused</b></summary>\n\nFlow limits how many upscales an account may request in a row and answers further ones\nwith \"unusual activity\". StudioWright stops at the first refusal, pauses upscales for an\nhour (`sw pace` shows it) and keeps generating. Download the originals meanwhile, upscale\nfewer media, or upscale locally.\n</details>\n\n<details>\n<summary><b>A music video template fails</b></summary>\n\nFlow Music sometimes cannot render a template for a song. Try again or pick another\ntemplate (`--template modern|simple|player`).\n</details>\n\n<details>\n<summary><b>The MCP client cannot start the server</b></summary>\n\nGive the client the full path of `sw`. The Claude Code plugin needs `uvx` (part of uv) on\nthe PATH. `sw mcp` run in a terminal should wait silently for input.\n</details>\n\n## Configuration\n\n| Variable | Meaning | Default |\n| --- | --- | --- |\n| `STUDIOWRIGHT_PROFILE` | Chrome profile to use | `default` |\n| `STUDIOWRIGHT_HOME` | data directory: profiles, job database, incidents | `%LOCALAPPDATA%\\studiowright` on Windows |\n| `STUDIOWRIGHT_OUTPUT` | where files are saved | `Downloads/studiowright` |\n| `STUDIOWRIGHT_GAP_S`, `STUDIOWRIGHT_JITTER_S` | pacing between submits | 20 s + 0-6 s |\n| `STUDIOWRIGHT_COOLDOWN_S` | pause after an unusual-activity refusal | 1800 s |\n| `STUDIOWRIGHT_UPSCALE_GAP_S`, `STUDIOWRIGHT_UPSCALE_JITTER_S` | spacing of upscaled downloads | 60 s + 0-20 s |\n| `STUDIOWRIGHT_UPSCALE_COOLDOWN_S` | pause of upscales after a refusal | 3600 s |\n| `STUDIOWRIGHT_SOURCE` | what the Claude Code plugin runs with `uvx --from` (e.g. a local checkout) | the plugin's own release |\n\n### Several Google accounts\n\nEach profile is one signed-in Google account with its own Chrome, queue and credits.\nProfiles run in parallel; jobs on the same profile take turns.\n\n```bash\nsw --profile account-1 auth login     # name it as you like; sign in, close the window\nsw --profile account-1 image \"…\"      # or set STUDIOWRIGHT_PROFILE=account-1\nsw auth list                          # each profile and the account it is signed in to\nsw auth rename account-1 studio       # keeps the sign-in, projects and settings\nsw auth logout studio                 # removes the profile from this computer\n```\n\n`logout` deletes only the profile's Chrome data and StudioWright's records of it.\nDownloaded files stay where they are, and the projects stay in your Google account.\nBoth `rename` and `logout` wait until that profile's Chrome is closed (`sw stop`).\n\n## Development\n\n```bash\nuv sync\nuv run pytest                        # unit tests, no browser needed\nuv run ruff check src tests spikes\n```\n\n- `src/studiowright/flow/` drives Flow, `src/studiowright/music/` drives Flow Music, and\n  `studio.py` adds locking, pacing, job records and downloads on top.\n- `spikes/` holds the small scripts used to map each page. Most only open menus and read\n  replies, at no cost; their docstrings say when one spends credits.\n- Tested on Windows 11. The code also finds Chrome on macOS and Linux, but those platforms\n  have not been tested yet.\n\n## Disclaimer\n\n- StudioWright is not affiliated with, endorsed or sponsored by Google LLC. Google, Flow,\n  Flow Music, Veo, Nano Banana and Lyria are trademarks of Google LLC.\n- The MIT license covers this code only. It grants no rights to Google's services or to\n  what they generate. Your use of Flow and Flow Music, and of their output, is governed by\n  Google's terms and your plan.\n- Automated use of a web app may conflict with its terms. Use your own account, at your\n  own risk and at a human pace. StudioWright stops when Google asks it to.\n- The web apps can change at any time and break StudioWright until it is updated.\n\n## License\n\n[MIT](LICENSE) © 2026 Umut Koçak\n"}