Skip to content

docs: a 30-second README demo GIF at the top of the README — the app runs, an agent creates a record over MCP, a read-only identity is refused — rendered by a committed script; plus the GitHub topics list for the maintainer to set #22232

Closed

Description

@objectstack-fleet

立卡门类别 ③ — 维护者直派的任务 (maintainer-directed task).

Maintainer ruling (verbatim, untranslated)

为什么别人星那么多,我们这么少

创建一个issue,派发处理 README 的 GIF 和 topics

Given in session https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR on 2026-10-08. The second line directs this card. The first is the question it answers: the PM's reading, which the maintainer accepted by directing the work, was that a visitor decides in thirty seconds on the README, that the README today opens on a static cover and a text walkthrough, and that the one thing that shows the four promises at once is a short recording of the loop the talk demonstrates: the app runs, an agent creates a record over MCP, the same call under a read-only identity is refused.

Why

The README on main at 7b926f7 opens on the slogan and the chip row, then a static cover image that links to the 90-second YouTube video, then the architecture diagram, then "Try it in five minutes" in prose. Nothing moves, and nothing shows an agent doing anything. A GitHub topic page sorted by stars lists 2,779 ontology repositories; the ones that gained thousands of stars in 2026 all open on something a visitor can watch. This card gives the README a thirty-second moving demo, generated by a committed script so it can be re-rendered when the Console changes, and records the topics the repository should carry so it is found under the words people search.

Part A. The demo GIF (dev work, one draft PR)

A1. The recording, docs/screenshots/readme-demo.gif. An animated GIF, looping, 1200 px wide, 20 to 35 seconds, at most 3 MB (hard cap 4 MB; if the honest recording cannot fit, drop the frame rate or the duration, never the width below 1000 px, and report the final size). Three beats, each with a short on-frame caption in English:

  1. The app runs. A typed object definition on screen for a moment (the example's own, a few fields, no scrolling), then the dev server starting and the Console's list view of that object in the browser.
  2. An agent creates a record over MCP. A real MCP tools/call against the running app's /api/v1/mcp endpoint, shown as the request and the real response, then the Console refreshed with the new row visible (and the audit or created-by evidence if the Console shows one).
  3. A read-only identity is refused. The same call under an identity whose permissions do not allow the create, the real refusal response, the Console unchanged.

Close on one frame: the slogan "The ontology is the software." and the four chips Executable · AI-writable · Agent-operable · You own it.

Honesty rules for the recording: every browser frame is a real screenshot of the real Console against a really running app; the agent beat is a real MCP call with the real response bytes; the terminal frames may be re-rendered from captured real output for legibility (typed effect, large monospace) but must not show output that did not occur; no fabricated chat transcript of any assistant, no invented records, no model identifiers anywhere in the frames or the caption. The caption calls the caller "an agent" or "any MCP client", which is what it is.

A2. The generator, docs/screenshots/render-readme-demo.mjs, in the style of docs/screenshots/render-hero-cover.mjs: header comment with usage and the refusals, resolves Playwright's chromium and sharp from the packages that already declare them (never runs playwright install; the browser binary is the preinstalled one under PLAYWRIGHT_BROWSERS_PATH), boots the chosen example app on an ephemeral state root, logs in with the seeded dev admin, mints the API keys it needs through the documented API, captures the frames, and assembles the GIF. Re-running it from a clean checkout must reproduce a GIF with the same beats (byte-identity is not required). Document the one-line command to re-render in the header and in the PR body.

A3. The README edit, README.md. The GIF becomes the first visual: directly under the chip row, centred, with a one-line caption under it naming the three beats. The YouTube line ("Watch: ObjectStack in 90 Seconds") stays as a text link under the caption. The static cover image is no longer embedded in the README; docs/screenshots/hero-cover-dark.png stays committed and untouched (it is the docs site's og:image). The architecture diagram and everything below it stay as they are. Alt text on the GIF describes the three beats for readers who do not see it.

Part B. GitHub topics (maintainer action, outside git)

The fleet relay has no operation for repository topics (its operations are issue_create, issue_patch, labels_add, comment, comment_edit, pr_create, merge, transfer), and topics are repository settings, not files, so no PR can set them. The maintainer sets them on the repository page (About, the gear icon, Topics). Proposed list, lowercase, hyphenated, within GitHub's limit of twenty:

ontology · operational-ontology · executable-ontology · business-ontology · metadata-driven · ai-agents · agentic-ai · mcp · mcp-server · ai-native · enterprise-software · low-code · typescript · zod · palantir-alternative

palantir-alternative is optional: it is the topic the open-source Foundry look-alikes use and the one a search for alternatives lands on; drop it if the association is unwanted. While there, confirm the About description reads the descriptor sentence: One executable business ontology. AI writes it, the runtime runs it, agents operate it, you own it.

This part is not the dev's and does not block Part A. The card closes when the Part A PR lands; the landing comment repeats Part B for the maintainer.

Guardrails for the author

  • Surface: README.md (the top of the file only, nothing below the architecture diagram), docs/screenshots/readme-demo.gif (new, the one binary this card admits), docs/screenshots/render-readme-demo.mjs (new). No packages/** change: if the example app, the CLI or the MCP endpoint misbehaves in a way the recording needs fixed, stop, record the exact failure, and report it as a fork rather than patching around it. No apps/docs change, no content/** change, no CHANGELOG.md.
  • Use what the repository already holds: the example apps under examples/ (app-crm, app-showcase, app-todo), objectstack dev with its seeded admin, the API-key path documented in content/docs/ai/connect-mcp.mdx, Playwright from examples/app-showcase, sharp from the docs app. ffmpeg is present on this image at /usr/bin/ffmpeg; verify in your container before relying on it, and if it is absent say so in the report and use what is available. Adding a dependency to any package.json is a fork to report, not a decision to make.
  • No model identifiers in the frames, the script, the README, the commits or the PR body.
  • The README must keep passing its gates; derive the list with scripts/pm/dispatch-gates.mjs from the real change set and run every one, including the published-links gate on the README.
  • Changeset: nothing publishes; skip-changeset applies once packages/** is confirmed untouched.
  • Serial constraint: PR fix(cli): Console-dist warning names the remedy for where it runs; README states the Console step and command costs #22224 (draft, another seat) edits the README's contributor-path section lower in the file. Branch from main; do not touch that section; if fix(cli): Console-dist warning names the remedy for where it runs; README states the Console step and command costs #22224 lands first, merge main into the branch before the final push and confirm the top of the README still reads as this card describes.

Non-goals

  • A Chinese README, a new 90-second video, or changes to the docs site. The GIF is for the README; whether the docs home also shows it is a later decision.
  • A chat-transcript style demo of a named assistant. The agent beat is an MCP call, shown as such.
  • The GitHub About description and topics are the maintainer's clicks (Part B), not a PR.

Who acts

domain:devx lane, this seat, one os-dev dispatch at the default tier, one draft PR carrying the README edit, the script and the GIF. Base is origin/main at 7b926f7. Precedent for a committed rendered asset with its generator: docs/screenshots/render-hero-cover.mjs and hero-cover-dark.png, landed by PR #21591.

Duplicate check (2026-10-08, open and closed)


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_011hRnra93sK5Q2gTYYTbdJR
    Account: hotlong (the seat's linked user as GET /user answers it; the card's assignee; the maintainer's own session, dispatching on the maintainer's direct instruction)
    Branch: claude/issue-22232-readme-demo-gif (cut from origin/main 7b926f7600)
    Worktree: objectstack-issue-22232
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: README.md (the top of the file only: the GIF replaces the embedded cover image under the chip row, the YouTube line stays, nothing below the architecture diagram changes); docs/screenshots/readme-demo.gif (new, the one binary this card admits); docs/screenshots/render-readme-demo.mjs (new). ⛔ No packages/, no apps/docs, no content/, no CHANGELOG.md, no package.json dependency change, no other binary. Stop on a breach and explain it in the report.
    Container & model: M (one README edit, one generator script, one rendered asset, one example app booted for the recording), mode:subagent, model: opus (the default judgment tier; this card's --tier run printed no path-derived mandate, "floor sonnet · default opus · ceiling fable")
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: board read at 2026-10-08T07:44Z. Open PRs at the read: 20; the one touching README.md is #22224 (draft, another seat, the contributor-path section lower in the file), named in the card as a serial constraint: this branch starts from main, does not touch that section, and merges main before its final push if #22224 lands first. No open PR touches docs/screenshots. The precedent on the same surface, #21586 via PR #21591 (README, hero cover and its generator), is closed and landed on main.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 22232,
    "status": "done",
    "branch": "claude/issue-22232-readme-demo-gif",
    "pr": "#22241",
    "session": "session_011hRnra93sK5Q2gTYYTbdJR — this run (container CLAUDE_CODE_REMOTE_SESSION_ID cse_011hRnra93sK5Q2gTYYTbdJR; mode:subagent, the dispatching session)",
    "premise_still_valid": true,
    "summary": "Part A delivered as draft PR #22241 (head 8336490): docs/screenshots/render-readme-demo.mjs boots examples/app-showcase with pnpm dev:showcase -- --fresh -p PORT, signs in the seeded dev admin and the showcase Auditor persona, mints one key each through POST /api/v1/keys, makes a real MCP tools/call create_record on showcase_team as each, screenshots the real Console around both calls, renders the frames and assembles docs/screenshots/readme-demo.gif with ffmpeg (1200 x 675, 29.88 s, 497,614 B). README.md top: the GIF replaces the embedded cover under the chip row, a one-line three-beat caption follows, the "Watch: ObjectStack in 90 Seconds" link stays as text; hero-cover-dark.png byte-untouched, nothing below the architecture diagram touched. Part B (topics, About) not attempted: maintainer action.",
    "example_and_object": "examples/app-showcase · showcase_team (src/data/objects/team.object.ts: name, lead, capacity_hours) · Console list /_console/apps/com.example.showcase/showcase_team",
    "gif": {
    "path": "docs/screenshots/readme-demo.gif",
    "width": 1200,
    "height": 675,
    "frames": 43,
    "seconds": 29.88,
    "bytes": 497614,
    "loop": 0,
    "read_by": "sharp metadata in the script + ffprobe (width=1200 height=675 nb_frames=43 duration=29.880000 size=497614)"
    },
    "fonts": "Inter 400/500/600/700/800 + IBM Plex Mono 400/500/600 from Google Fonts (all eight faces loaded in the committed render); system fallback Liberation Sans / DejaVu Sans Mono only for --out previews; Console screenshots carry the Console's own fonts; no font file committed",
    "beats": {
    "1_app_runs": "team.object.ts excerpt (comment lines omitted, labelled) → pnpm dev:showcase -- --fresh -p 39497 with real output lines (Fresh OS_HOME..Database, ✓ Server is ready..MCP: http://localhost:39497/api/v1/mcp, Plugins: 50 loaded, Seeds: com.example.showcase 132 rows) → Console Team list, 2 rows",
    "2_agent_creates": "POST /api/v1/mcp tools/call create_record {objectName: showcase_team, data: {name: Data Guild, lead: ada@example.com, capacity_hours: 120}} with the admin@objectos.ai key → 200 application/json, record QZu-Fcgx29Po-Sfn "Data Guild", created_by = the admin user id; REST count 2 → 3; Console list shows the row, record page reads "Created by Dev Admin · just now"",
    "3_read_only_refused": "byte-identical body with the auditor.demo@example.com key → 200 {"result":{"content":[{"type":"text","text":"You do not have permission to perform this action. Contact your administrator if you need access."}],"isError":true},"jsonrpc":"2.0","id":1}; REST count stays 3; Console list unchanged (3 records)",
    "read_only_identity": "showcase Auditor persona provisioned by examples/app-showcase/src/security/seed-approval-demo.ts on dev boots; position auditor → showcase_auditor (no Team grant) + everyone baseline showcase_member_default (showcase_team allowRead only); measured: its query_records on showcase_team returned 2 rows, its create_record refused; no code changed"
    },
    "tests": "Builds (lock VERDICT lines): turbo run build --filter=@objectstack/example-showcase^... --concurrency=2 → "VERDICT command-exit 0 · held the lock 363s" (60 tasks); pnpm objectui:build (pinned objectui a58626c88dc8) → "VERDICT command-exit 0 · held the lock 374s"; turbo run build --filter=!@objectstack/docs --concurrency=2 → "VERDICT command-exit 0 · held the lock 45s" (72 tasks, 60 cached). Generator: 4 end-to-end runs (3 --out previews + the committed render), every one exit 0 with "showcase_team: 2 → 3 (create) → 3 (refused)". Gates on final head 8336490, derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (13 families), all exit 0: check-ci-filter-parity, check-closing-keyword-parity ("OK (3 parsers agree on all 9 keywords...)"), check-closing-keyword-parity --self-test ("40 assertions, 5 mutations"), check-comment-mask-corpus ("8386 files, 0 disagree"), @objectstack/lint check:doc-formula-expressions, check:cross-package-test-inputs ("All 255 self-test cases passed" + OK), check:doc-anchors ("460 internal #fragment link(s) ... all resolve"), check:doc-authoring, check:driver-memory-census (OK), check:gitlink-declared (OK), check:nul-bytes ("OK (scanned 10181 text file(s) ... no raw ASCII control bytes)"), check:refd-timer-probe (OK), check:watch-hint-literal; reconciliation --ran with exit codes: "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN" (a DERIVED zero). Named by the dispatch outside the derivation: pnpm check:published-readme-links exit 0 ("221 outbound link(s) across 101 published markdown file(s) ... 144/144 relative target(s) found"). Narrowed eslint (--no-inline-config, pnpm lint's spelling) on HEAD 8336490 over the 3 changed paths: population from eslint --print-config (a config object for render-readme-demo.mjs, undefined for README.md and the GIF); count from --format json (3 results: 1 linted 0 errors 0 warnings, 2 "File ignored because no matching configuration was supplied"); invariance: parserOptions {ecmaVersion, sourceType}, no project/projectService (type-aware linting off), nothing imports the new file. No package tests owed: packages/** untouched (0 paths). NOT MEASURED: repo-wide pnpm lint and the CI farm (CI owns them).",
    "gates": [
    "node scripts/check-ci-filter-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
    "node scripts/check-comment-mask-corpus.mjs :: exit 0",
    "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
    "pnpm check:cross-package-test-inputs :: exit 0",
    "pnpm check:doc-anchors :: exit 0",
    "pnpm check:doc-authoring :: exit 0",
    "pnpm check:driver-memory-census :: exit 0",
    "pnpm check:gitlink-declared :: exit 0",
    "pnpm check:nul-bytes :: exit 0",
    "pnpm check:refd-timer-probe :: exit 0",
    "pnpm check:watch-hint-literal :: exit 0",
    "pnpm check:published-readme-links :: exit 0"
    ],
    "files_changed": [
    "README.md (+3/-3, top block only)",
    "docs/screenshots/readme-demo.gif (new, binary, 497,614 B)",
    "docs/screenshots/render-readme-demo.mjs (new, 659 lines)"
    ],
    "deviations": [
    "Mechanism assumption falsified: Google Fonts IS reachable here through the proxy (Chromium needs ignoreHTTPSErrors, as render-hero-cover.mjs does). The GIF uses the hero pair Inter + IBM Plex Mono and refuses a committed write without them (exit 3); system fonts only for --out previews.",
    "Ephemeral switch confirmed as --fresh (packages/cli/src/commands/dev.ts, implies --seed-admin); Console served on the API port at /_console/; Console login = API sign-in + localStorage auth-session-token, the pattern of examples/app-showcase/e2e/global-setup.ts.",
    "Example chosen: app-showcase (its Auditor persona gives a real read-only refusal with no code change); app-crm not needed. Object chosen: showcase_team rather than showcase_account, so the whole typed definition fits one frame.",
    "Local prerequisites built (gitignored artifacts only): the workspace (pnpm dev refuses an unbuilt one) and the Console from the pinned objectui (no Console dist existed in this container).",
    "README: the GIF img carries no width attribute (it scales to the column); the old cover link wrapper is gone; caption is a sub line.",
    "GIF 497,614 B at 1200 px: no frame-rate or duration reduction needed.",
    "dispatch-gates printed STALE TREE at derivation (HEAD 7+ commits behind origin/main; derivation inputs that moved: scripts/check-adr-0087-registration.mjs, scripts/platform-object-tenancy-census.json, scripts/query-options-erasure-baseline.json). No merge of main: #22224 is still open (now non-draft) and origin/main 3ae5966 has no README.md or docs/screenshots change since base 7b926f7.",
    "Attribution: commits carry the dispatch's model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body the AGENTS session-URL footer, not the harness reminder's spellings (which carried a model identifier / a different footer)."
    ],
    "mcp_calls": "0 — no MCP GitHub tool was called; reads went through gh api REST GETs (issue 22232 + its comments, pulls/22224, pulls/22241 read-backs)",
    "api_writes": "3 REST writes from this seat, all POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, executed as objectstack-fleet[bot]): ① pr_create → POST /repos/objectstack-ai/objectstack/pulls (#22241, draft; 8549 bytes sent = stored); ② label-write → POST /issues/22241/labels (skip-changeset) + POST /issues/22241/assignees (hotlong), read back MATCHES; ③ this os-dev-report → POST /issues/22232/comments. Plus git pushes of the branch (not REST).",
    "cleanup": "no dev server or child left running (process table read; the script stops its own process group and the --fresh tempdirs are gone); rm -rf node_modules && git worktree remove ../objectstack-issue-22232 is the step right after this report is posted",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted in PR #22241 Acceptance notes, not filed · a fresh pnpm dev:showcase -- --fresh boot prints WARN "Insert operation failed" on sys_migration ("UNIQUE constraint failed: sys_migration.id"), plus a pre-bind settings READ warning, an analytics admitObjectRead warning and a sharing-rule "expands to NO recipients" warning; not investigated (could be a tolerated duplicate insert) · dedupe words: sys_migration UNIQUE constraint fresh boot, showcase boot diagnostics warnings",
    "carrier: 承接者:无 · noted in PR #22241 Acceptance notes, not filed · an MCP create_record refusal is an isError:true tool result with HTTP 200 and prose only, no machine-readable error code; no declared contract for MCP tool-error codes was cited, so observation only · dedupe words: MCP isError error code permission refusal"
    ]
    }


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR #22241 at head 8336490e

    Seat domain:devx#2 · session_011hRnra93sK5Q2gTYYTbdJR · reviewed against GitHub and the fetched branch at 2026-10-08T08:35Z, not against the report.

    PR shape. Draft, base main, body opens Fixes #22232, Clause-②: no at line start, session-URL footer, no model identifier in body or commits (five commits, model-free trailers). Labels documentation · size/l · skip-changeset; assignee matches the card. 3 files, +662 / −3. node scripts/pm/check-governed-merges.mjs --pr 22241: 0 of 3 paths governed, 665 changed lines, under the human-merge threshold.

    Scope and changeset. Exactly the card's three files: README.md (one hunk at the top: the GIF replaces the embedded cover under the chip row, a one-line three-beat caption, the YouTube line kept as text), docs/screenshots/readme-demo.gif (new, the one binary this card admits, 497,614 bytes), docs/screenshots/render-readme-demo.mjs (new). docs/screenshots/hero-cover-dark.png untouched; nothing below the architecture diagram changed; no packages/**, no apps/docs, no content/**, no CHANGELOG, no package.json dependency change. skip-changeset holds.

    The recording, checked frame by frame on the committed GIF (ffprobe: 1200 × 675, 43 frames, 29.88 s, loop 0). Beat 1: the Team object as examples/app-showcase/src/data/objects/team.object.ts declares it, labelled "comment lines omitted"; the real pnpm dev:showcase -- --fresh -p 39497 output lines ending on "Server is ready"; the Console's Team list. Beat 2: the tools/call create_record request to /api/v1/mcp with the dev admin's key masked after its prefix, the real 200 response carrying record QZu-Fcgx29Po-Sfn "Data Guild" with created_by highlighted; the Console list with the new row. Beat 3: the byte-identical request under the Auditor key marked read-only, the real isError: true permission refusal, the Console list "3 records" unchanged. Closing frame: the slogan and the four chips verbatim. No assistant transcript, no invented record, no model identifier; the caller is "any MCP client". Keys shown were minted on a --fresh state root that no longer exists.

    The generator. Header documents the three beats, the re-render command, the preview mode, the prerequisites and the refusals (fonts not loaded, counts not moving as the story says, GIF out of spec); resolves Chromium from examples/app-showcase and sharp from the docs app as render-hero-cover.mjs does; never runs playwright install; no new dependency. Narrowed eslint over the new file: 0 errors, 0 warnings, with population and invariance evidence in the PR body.

    Gates. 13 derived families run, --ran reconciliation "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN", plus check:published-readme-links (144/144 relative targets found). CI on 8336490e: 19 success, 11 expected skips, 3 still in progress at this review (Test Core 1/6, Lint & Repo Gates, Type Check · workspace); landing waits for them and for check-expected-skips.mjs --pr 22241.

    Mechanism assumptions, as measured. Google Fonts reachable (the GIF uses Inter + IBM Plex Mono, the hero pair); the ephemeral switch is --fresh; the read-only identity is the showcase's own Auditor persona, proven able to read (query_records returned both rows) and refused on create, with no code change. Serial constraint: #22224 still open, different README hunk; origin/main carries no README change since the base, so no merge was needed.

    Out-of-scope findings from the report.

    • Fresh showcase boot prints a sys_migration UNIQUE-constraint insert warning and three other boot diagnostics → Acceptance notes (observation only, reach not measured, no user-visible effect on the recording).
    • An MCP refusal is an isError: true tool result with HTTP 200 and prose, no machine-readable code → Acceptance notes (observation; no declared contract cited either way).

    Part B stays the maintainer's. Repository topics and the About line are settings-page clicks; the relay has no operation for them. The landing comment will repeat the proposed topic list.

    Contract review: not owed (README and a generator script under docs/screenshots/, no spec or metadata contract touched).


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #22241 merged as 31d24a52

    Seat domain:devx#2 · session_011hRnra93sK5Q2gTYYTbdJR · verified on origin/main at 2026-10-08T09:35Z.

    Part A, verified on main. docs/screenshots/readme-demo.gif and docs/screenshots/render-readme-demo.mjs are byte-identical to the reviewed head 8336490e (blob ids 2575202e and 5cd6c8ac). README.md's blob differs from the head's because main's README took other landings in between; by content the top block reads as the card describes: the GIF is the first visual under the chip row with the three-beat caption, the "Watch: ObjectStack in 90 Seconds" line stays as text, and docs/screenshots/hero-cover-dark.png is untouched since the base. The card closed on the merge; pm:dispatched leaves with this comment.

    Part B is yours: repository topics and the About line (settings-page clicks; the relay has no operation for them). Proposed topics, lowercase, hyphenated, fifteen of GitHub's twenty:

    ontology · operational-ontology · executable-ontology · business-ontology · metadata-driven · ai-agents · agentic-ai · mcp · mcp-server · ai-native · enterprise-software · low-code · typescript · zod · palantir-alternative (optional: the topic the open-source Foundry look-alikes use; drop it if the association is unwanted)

    While there, confirm the About description reads: One executable business ontology. AI writes it, the runtime runs it, agents operate it, you own it.

    Re-render when the Console changes: node docs/screenshots/render-readme-demo.mjs (prerequisites in the script header: built workspace and Console, ffmpeg, Google Fonts reachable).


    Generated by Claude Code

  5. added a commit that references this issue on Oct 9, 2026
    31d24a5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions