Not in the top 1,000 by GitHub stars

flowith-ai/canvas-cowork

Cowork on a spatial canvas from the CLI — create canvases, generate images/text/video/agent responses, read results, recall past work, and manage nodes

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

9b80a7fd33e0 → 9b80a7fd33e0

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 9b80a7fd33e0

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 9b80a7fd33e039aa520707887d7ca23441546568

40GitHub stars
1star in 7 days
1skill in this repository
5commits in 30 days

Heat

2.9
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Nov 3, 202640

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

canvas-cowork

When your agent uses it

Generate text, images and videos on Flowith's canvas from the CLI, headless or with a live cursor. Use for any image/video generation (Seedance, Veo, Kling, gpt-image, Gemini image), "canvas", "Flowith", "Neo", drawing/creating visual content, or past canvas work. /canvas-cowork

What it loads into context

Frontmatter

85 tokens

Always available to the agent

SKILL.md

1,175 tokens

When the skill is activated

Reference documents

7,598 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Cheat sheet (covers 95% of work — no browser needed)
  2. Three rules
  3. Seedance 2.x references
  4. Live cursor (optional, needs a Flowith tab)
  5. Where things land

Scripts executed separately

  • scripts/__tests__/canvas.test.ts
  • scripts/__tests__/ergonomics.test.ts
  • scripts/__tests__/generate.test.ts
  • scripts/__tests__/models.test.ts
  • scripts/index.ts
  • scripts/lib/canvas.ts
  • scripts/lib/download.ts
  • scripts/lib/generate.ts
  • scripts/lib/http.ts
  • scripts/lib/models.ts
  • scripts/lib/session.ts
  • scripts/lib/upload.ts

Files

  • LICENSEasset1,067 bytes
  • README.mddoc3,076 bytes
  • SKILL.mdcore4,079 bytes
  • SKILL.mdcore4,079 bytes
  • SKILL.mdcore4,079 bytes
  • references/api.mddoc8,148 bytes
  • references/cli.mddoc6,747 bytes
  • references/creative-dream.mddoc5,823 bytes
  • references/troubleshooting.mddoc3,559 bytes
  • scripts/__tests__/canvas.test.tsruns2,546 bytes
  • scripts/__tests__/ergonomics.test.tsruns5,910 bytes
  • scripts/__tests__/generate.test.tsruns7,777 bytes
  • scripts/__tests__/models.test.tsruns5,449 bytes
  • scripts/index.tsruns92,053 bytes
  • scripts/lib/canvas.tsruns9,276 bytes
  • scripts/lib/download.tsruns1,575 bytes
  • scripts/lib/generate.tsruns20,755 bytes
  • scripts/lib/http.tsruns5,960 bytes
  • scripts/lib/models.tsruns13,476 bytes
  • scripts/lib/session.tsruns3,553 bytes
  • scripts/lib/upload.tsruns4,022 bytes
Read SKILL.md

# Canvas Cowork

You are a collaborator on a shared spatial canvas. Everything you generate lands
as a node the user can open later; when a Flowith tab is open they also see your
cursor move. **Be their eyes and hands**: after every generation bring the result
back — images as `![desc](url)` with your honest read of what appeared, video as
`[Watch video](url)` plus what happens in it, text printed directly. Never say
"go look at the canvas." **Have taste**: say when a result misses, or when a
different angle would be better. `recall` is shared memory — use it.

Run from the skill directory with bun. Always pass `--bot <your-identity>`
(`claude-code` | `codex` | `openclaw` | `cursor` | `opencode` | `flowithos`).

## Cheat sheet (covers 95% of work — no browser needed)
View the complete source on GitHub

Skills included

  • canvas-cowork

Repository facts

License
MIT
Created
Mar 31, 2026
Last pushed
Oct 20, 2026
Forks
5
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 2 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 142 signals by file

README.md

  • Network accessline 3
    Generate images and videos on [Flowith](https://flowith.io)'s spatial canvas from the CLI — **headless** (plain HTTP, for agents and pipelines) or **live** (a cursor on the canvas the user watches). Create canvases, read results, recall pas
  • Network accessline 25
    bun $S --bot claude-code gen video "a red roadster on a coastal road at sunset" # → {"type":"result","data":{"status":"finished","url":"https://vg.flowith.net/....mp4", "model":"seedance-2.0-fast", ...}}
  • Network accessline 26
    # → {"type":"result","data":{"status":"finished","url":"https://vg.flowith.net/....mp4", "model":"seedance-2.0-fast", ...}}
  • Network accessline 48
    - A [Flowith](https://flowith.io) account (log in once through the browser handshake)
  • Network accessline 49
    - [Bun](https://bun.sh) — or call the HTTP API directly, see [references/api.md](./references/api.md)

SKILL.md

  • Network accessline 43
    Result: `{status:"finished", url|text, nodeId, questionNodeId, convId, model, …}`; failures exit 1 with `{type:"error", code, message}` (`NO_CREDITS` → stop and send https://flowith.io/pricing, don't retry or switch models).
  • Network accessline 45
    https://flowith.io/pricing, don't retry or switch models).

references/api.md

  • Network accessline 14
    [Credential-related source omitted]
  • Network accessline 15
    [Credential-related source omitted]
  • Network accessline 16
    [Credential-related source omitted]
  • Network accessline 22
    [Credential-related source omitted]
  • Access to secretsline 22
    [Credential-related source omitted]
  • Access to secretsline 23
    [Credential-related source omitted]
  • Access to secretsline 24
    [Credential-related source omitted]
  • Access to secretsline 25
    [Credential-related source omitted]
  • Network accessline 31
    curl -s 'https://edge.flowith.io/models?logo=1&desc=1' | jq '."seedance-2.5"'
  • Network accessline 43
    [Credential-related source omitted]
  • Network accessline 45
    # → {"url":"https://r2-bucket.flowith.net/f/.../clip.mp4"}
  • Network accessline 57
    [Credential-related source omitted]
  • Network accessline 58
    [Credential-related source omitted]
  • Access to secretsline 58
    [Credential-related source omitted]
  • Network accessline 63
    # list nodes curl -s "$SUPABASE_URL/rest/v1/flow_node?conv_id=eq.$CONV&is_delete=not.is.true&select=id,type,p_id,data,position&order=created_at.asc" \
  • Network accessline 64
    [Credential-related source omitted]
  • Access to secretsline 64
    [Credential-related source omitted]
  • Access to secretsline 65
    [Credential-related source omitted]
  • Network accessline 93
    [Credential-related source omitted]
  • Network accessline 99
    "aspect_ratio":"1:1",            // from supportedAspectRatios   "image_size":"2k",               // from supportedImageSizes (omit for gpt-image-2)   "styleUrls":["https://.../ref.png"]   // optional reference images
  • Network accessline 100
    "image_size":"2k",               // from supportedImageSizes (omit for gpt-image-2)   "styleUrls":["https://.../ref.png"]   // optional reference images }'
  • Network accessline 101
    "styleUrls":["https://.../ref.png"]   // optional reference images
  • Network accessline 123
    [Credential-related source omitted]
  • Network accessline 132
    "resolution":"720p",             // supportedResolutions   "audio":true,   "imageURL":"https://.../start.png",          // optional start frame
  • Network accessline 133
    "audio":true,   "imageURL":"https://.../start.png",          // optional start frame   "keyFrames":["https://.../start.png","https://.../end.png"],  // optional, both frames
  • Network accessline 134
    "imageURL":"https://.../start.png",          // optional start frame
  • Network accessline 135
    "keyFrames":["https://.../start.png","https://.../end.png"],  // optional, both frames
  • Network accessline 161
    [Credential-related source omitted]
  • Network accessline 183
    [Credential-related source omitted]

references/troubleshooting.md

  • Network accessline 13
    | Code | Meaning | What to do | |---|---|---| | `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing |
  • Network accessline 14
    |---|---|---| | `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing | | `MODEL_LOCKED` | Model needs a paid plan 
  • Network accessline 15
    | `NO_CREDITS` | Account has no remaining credits (HTTP 402 / node type 22) | **Stop immediately. Do NOT retry or switch models.** Send the pricing link: https://flowith.io/pricing |

scripts/__tests__/canvas.test.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 56
    test("media detection by extension / url", () => { 		expect(mediaOf("a.PNG")).toBe("image"); 		expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video");
  • Network accessline 57
    expect(mediaOf("a.PNG")).toBe("image"); 		expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video"); 		expect(mediaOf("voice.wav")).toBe("audio");
  • Network accessline 58
    expect(mediaOf("https://x/y/clip.mp4?sig=1")).toBe("video");
  • Network accessline 59
    expect(mediaOf("voice.wav")).toBe("audio"); 		expect(mediaOf("doc.pdf")).toBe("file"); 		expect(extOf("https://x/a.b/c.webp#f")).toBe("webp");
  • Network accessline 60
    expect(mediaOf("doc.pdf")).toBe("file"); 		expect(extOf("https://x/a.b/c.webp#f")).toBe("webp"); 		expect(isUrl("http://a")).toBe(true);
  • Network accessline 61
    expect(extOf("https://x/a.b/c.webp#f")).toBe("webp");
  • Network accessline 62
    expect(isUrl("http://a")).toBe(true);

scripts/__tests__/ergonomics.test.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    { id: "a1", p_id: "q1", type: NODE_TYPE.response, data: { value: "X is a thing.", isImage: false } }, 		{ id: "q2", p_id: "a1", type: NODE_TYPE.question, data: { value: "Draw it" } }, 		{ id: "a2", p_id: "q2", type: NODE_TYPE.response, data
  • Network accessline 19
    { id: "q2", p_id: "a1", type: NODE_TYPE.question, data: { value: "Draw it" } }, 		{ id: "a2", p_id: "q2", type: NODE_TYPE.response, data: { value: "https://r2/x.png", isImage: true } }, 		{ id: "q3", p_id: "a2", type: NODE_TYPE.question, da
  • Network accessline 20
    { id: "a2", p_id: "q2", type: NODE_TYPE.response, data: { value: "https://r2/x.png", isImage: true } },
  • Network accessline 21
    { id: "q3", p_id: "a2", type: NODE_TYPE.question, data: { value: "Animate it" } }, 		{ id: "v3", p_id: "q3", type: NODE_TYPE.video, data: { value: "https://vg/x.mp4" } }, 	];
  • Network accessline 22
    { id: "v3", p_id: "q3", type: NODE_TYPE.video, data: { value: "https://vg/x.mp4" } },
  • Network accessline 27
    { role: "assistant", content: "X is a thing." }, 			{ role: "user", content: "Draw it" }, 			{ role: "assistant", content: "[image: https://r2/x.png]" },
  • Network accessline 28
    { role: "user", content: "Draw it" }, 			{ role: "assistant", content: "[image: https://r2/x.png]" }, 			{ role: "user", content: "Animate it" },
  • Network accessline 29
    { role: "assistant", content: "[image: https://r2/x.png]" },
  • Network accessline 30
    { role: "user", content: "Animate it" }, 			{ role: "assistant", content: "[video: https://vg/x.mp4]" }, 		]);
  • Network accessline 31
    { role: "assistant", content: "[video: https://vg/x.mp4]" },
  • Network accessline 110
    test("single file vs batch directory naming", () => { 		expect(outputPathFor("/tmp/x/out.mp4", { nodeId: "abcdef12-x", kind: "video", batch: false })).toBe("/tmp/x/out.mp4"); 		expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: 
  • Network accessline 111
    expect(outputPathFor("/tmp/x/out.mp4", { nodeId: "abcdef12-x", kind: "video", batch: false })).toBe("/tmp/x/out.mp4"); 		expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: 0, url: "https://h/a.mp4?s=1", kind: "video", batch: tru
  • Network accessline 112
    expect(outputPathFor("/tmp/x/", { nodeId: "abcdef12-x", index: 0, url: "https://h/a.mp4?s=1", kind: "video", batch: true })).toBe("/tmp/x/01-abcdef12.mp4");

scripts/__tests__/generate.test.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 31
    const img = (n: string): UploadedMedia => ({ url: `https://r2/${n}.png`, name: `${n}.png`, type: "image/png", media: "image" });
  • Network accessline 32
    const wav = (n: string): UploadedMedia => ({ url: `https://r2/${n}.wav`, name: `${n}.wav`, type: "audio/wav", media: "audio" });
  • Network accessline 33
    const mp4 = (n: string): UploadedMedia => ({ url: `https://r2/${n}.mp4`, name: `${n}.mp4`, type: "video/mp4", media: "video" });
  • Network accessline 48
    expect(r.questionNode.position).toEqual(POS); 		expect(r.questionNode.data?.value).toBe("a cat"); 		expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png");
  • Network accessline 49
    expect(r.questionNode.data?.value).toBe("a cat"); 		expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png"); 		expect(r.responseNode.type).toBe(NODE_TYPE.response);
  • Network accessline 50
    expect(r.questionNode.data?.fileList[0].url).toBe("https://r2/ref.png");
  • Network accessline 68
    aspect_ratio: "16:9", 			image_size: "2k", 			styleUrls: ["https://r2/ref.png"],
  • Network accessline 69
    image_size: "2k", 			styleUrls: ["https://r2/ref.png"], 		});
  • Network accessline 70
    styleUrls: ["https://r2/ref.png"],
  • Network accessline 84
    test("numbers references per type and appends unmentioned tokens", () => { 		const r = applySeedanceReferences("dance to audio1", [img("a"), wav("s"), img("b")]); 		expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png
  • Network accessline 85
    const r = applySeedanceReferences("dance to audio1", [img("a"), wav("s"), img("b")]); 		expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png"], video_urls: [], audio_urls: ["https://r2/s.wav"] }); 		expect(r.tokens).t
  • Network accessline 86
    expect(r.urls).toEqual({ image_urls: ["https://r2/a.png", "https://r2/b.png"], video_urls: [], audio_urls: ["https://r2/s.wav"] });
  • Network accessline 87
    expect(r.tokens).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/s.wav", image2: "https://r2/b.png" });
  • Network accessline 90
    test("dedupes the same url", () => { 		const r = applySeedanceReferences("x", [img("a"), img("a")]); 		expect(r.urls.image_urls).toEqual(["https://r2/a.png"]);
  • Network accessline 91
    const r = applySeedanceReferences("x", [img("a"), img("a")]); 		expect(r.urls.image_urls).toEqual(["https://r2/a.png"]); 	});
  • Network accessline 92
    expect(r.urls.image_urls).toEqual(["https://r2/a.png"]);
  • Network accessline 135
    test("start/end frames → imageURL + keyFrames + typed fileList", () => { 		const r = buildVideoRequest({ prompt: "p", model: "kling", start: img("s"), end: img("e"), convId: CONV }, kling, POS); 		expect(r.body.imageURL).toBe("https://r2/s.
  • Network accessline 136
    const r = buildVideoRequest({ prompt: "p", model: "kling", start: img("s"), end: img("e"), convId: CONV }, kling, POS); 		expect(r.body.imageURL).toBe("https://r2/s.png"); 		expect(r.body.keyFrames).toEqual(["https://r2/s.png", "https://r2/
  • Network accessline 137
    expect(r.body.imageURL).toBe("https://r2/s.png");
  • Network accessline 138
    expect(r.body.keyFrames).toEqual(["https://r2/s.png", "https://r2/e.png"]);
  • Network accessline 144
    test("Seedance refs become image_urls/audio_urls with tokens; frames + refs are exclusive", () => { 		const r = buildVideoRequest({ prompt: "sing audio1", model: "seedance-2.5", refs: [img("a"), wav("v")], convId: CONV }, seedance, POS); 		
  • Network accessline 145
    const r = buildVideoRequest({ prompt: "sing audio1", model: "seedance-2.5", refs: [img("a"), wav("v")], convId: CONV }, seedance, POS); 		expect(r.body.image_urls).toEqual(["https://r2/a.png"]); 		expect(r.body.audio_urls).toEqual(["https:/
  • Network accessline 146
    expect(r.body.image_urls).toEqual(["https://r2/a.png"]);
  • Network accessline 147
    expect(r.body.audio_urls).toEqual(["https://r2/v.wav"]);
  • Network accessline 149
    expect(r.body.prompt).toBe("sing audio1 image1"); 		expect(r.body.imageURL).toBeUndefined(); 		expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" });
  • Network accessline 150
    expect(r.body.imageURL).toBeUndefined(); 		expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" }); 		expect(() => buildVideoRequest({ prompt: "p", model: "seedance-2.5", start: img("s"), refs: [img("a")], c
  • Network accessline 151
    expect(r.references).toEqual({ image1: "https://r2/a.png", audio1: "https://r2/v.wav" });
  • Network accessline 158
    test("non-Seedance models: a single image ref becomes imageURL; audio/video refs rejected", () => { 		const r = buildVideoRequest({ prompt: "p", model: "kling", refs: [img("a")], convId: CONV }, kling, POS); 		expect(r.body.imageURL).toBe("
  • Network accessline 159
    const r = buildVideoRequest({ prompt: "p", model: "kling", refs: [img("a")], convId: CONV }, kling, POS); 		expect(r.body.imageURL).toBe("https://r2/a.png"); 		expect(r.body.image_urls).toBeUndefined();
  • Network accessline 160
    expect(r.body.imageURL).toBe("https://r2/a.png");

scripts/__tests__/models.test.ts

  • Executable scriptline 1
    Executable file

scripts/index.ts

  • Executable scriptline 1
    #!/usr/bin/env bun
  • Network accessline 187
    async function detectFlowithUrl(): Promise<string> { 	if (process.env.FLOWITH_URL) return process.env.FLOWITH_URL; 	return "https://flowith.io/blank";
  • Network accessline 188
    if (process.env.FLOWITH_URL) return process.env.FLOWITH_URL; 	return "https://flowith.io/blank"; }
  • Network accessline 189
    return "https://flowith.io/blank";
  • Access to secretsline 269
    [Credential-related source omitted]
  • Network accessline 622
    async function validateToken(session: CanvasBotSession): Promise<boolean> { 	try { 		const r = await fetch(
  • Network accessline 623
    try { 		const r = await fetch( 			`${session.supabaseUrl}/rest/v1/conversation?select=id&limit=1`,
  • Network accessline 624
    const r = await fetch(
  • Network accessline 751
    // Use WebSocket server instead of HTTP for the session handshake. 		// Note: Safari blocks both fetch() and ws:// to 127.0.0.1 from HTTPS pages (mixed content).
  • Network accessline 752
    // Note: Safari blocks both fetch() and ws:// to 127.0.0.1 from HTTPS pages (mixed content).
  • Network accessline 806
    port: 0, 				hostname: "127.0.0.1", 				fetch(req: Request, srv: any) {
  • Network accessline 807
    hostname: "127.0.0.1", 				fetch(req: Request, srv: any) { 					if (srv.upgrade(req)) return undefined as any;
  • Network accessline 808
    fetch(req: Request, srv: any) {
  • Network accessline 2854
    code: "NO_CREDITS", 									message: 										"It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing",
  • Network accessline 2855
    message: 										"It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing", 									data: data.node,
  • Network accessline 2856
    "It looks like you've run out of credits. Visit /pricing to subscribe and keep creating: https://flowith.io/pricing",

scripts/lib/canvas.ts

  • Executable scriptline 1
    Executable file

scripts/lib/download.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 29
    } 	if (!content.url) throw new CliError("Nothing to save (no url or text).", "INVALID_PARAM"); 	const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) });
  • Network accessline 30
    if (!content.url) throw new CliError("Nothing to save (no url or text).", "INVALID_PARAM"); 	const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) }); 	if (!resp.ok) throw new CliError(`Download failed (HTTP ${resp.st
  • Network accessline 31
    const resp = await fetch(content.url, { signal: AbortSignal.timeout(300_000) });

scripts/lib/generate.ts

  • Executable scriptline 1
    Executable file

scripts/lib/http.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * Direct HTTP access to Flowith — the same two backends the web app talks to:  *  *   - the edge worker (`workerURL`, default https://edge.flowith.io): generation,
  • Network accessline 3
    *  *   - the edge worker (`workerURL`, default https://edge.flowith.io): generation,  *     uploads, memory, credits. Auth is the raw Supabase access token in the
  • Network accessline 4
    *   - the edge worker (`workerURL`, default https://edge.flowith.io): generation,
  • Network accessline 20
    export const DEFAULT_WORKER_URL = "https://edge.flowith.io";
  • Network accessline 78
    case 402: 			return new CliError( 				`${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`,
  • Network accessline 79
    return new CliError( 				`${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`, 				"NO_CREDITS",
  • Network accessline 80
    `${what}: no credits (${detail || "payment required"}). Top up at https://flowith.io/pricing`,
  • Network accessline 124
    ...(init.headers ?? {}), 	}; 	const resp = await fetch(`${workerUrl(s)}${path}`, {
  • Network accessline 125
    }; 	const resp = await fetch(`${workerUrl(s)}${path}`, { 		method: init.method ?? (init.json !== undefined || init.body ? "POST" : "GET"),
  • Network accessline 126
    const resp = await fetch(`${workerUrl(s)}${path}`, {
  • Network accessline 162
    ): Promise<T> { 	const method = init.method ?? (init.json !== undefined ? "POST" : "GET"); 	const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, {
  • Network accessline 163
    const method = init.method ?? (init.json !== undefined ? "POST" : "GET"); 	const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, { 		method,
  • Network accessline 164
    const resp = await fetch(`${s.supabaseUrl.replace(/\/$/, "")}/rest/v1/${query}`, {

scripts/lib/models.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 68
    } catch {} 	} 	const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, {
  • Network accessline 69
    } 	const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, { 		signal: AbortSignal.timeout(20_000),
  • Network accessline 70
    const resp = await fetch(`${workerURL.replace(/\/$/, "")}/models?logo=1&desc=1`, {

scripts/lib/session.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 80
    refreshToken: string; }): Promise<RefreshedTokens> { 	const resp = await fetch(
  • Network accessline 81
    }): Promise<RefreshedTokens> { 	const resp = await fetch( 		`${params.supabaseUrl.replace(/\/$/, "")}/auth/v1/token?grant_type=refresh_token`,
  • Network accessline 82
    const resp = await fetch(
  • Access to secretsline 108
    [Credential-related source omitted]
  • Access to secretsline 114
    [Credential-related source omitted]
  • Access to secretsline 117
    [Credential-related source omitted]
  • Access to secretsline 120
    [Credential-related source omitted]

scripts/lib/upload.ts

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Signal confidence: 142 facts

and 92 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.