Repository navigation
docs(readme): a 30-second demo GIF opens the README, rendered from a real showcase run - #22241
Merged
Merged
Conversation
Claude-Session: https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR Co-authored-by: Claude <noreply@anthropic.com>
…sing frame Claude-Session: https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR Co-authored-by: Claude <noreply@anthropic.com>
docs/screenshots/readme-demo.gif is 1200 x 675, 29.88 s, 497,614 B, recorded by docs/screenshots/render-readme-demo.mjs: the Team object, the dev server booting it, an MCP create_record as the dev admin, the same call refused for the Auditor persona, and the Console around each. Claude-Session: https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR Co-authored-by: Claude <noreply@anthropic.com>
The cover image is no longer embedded (docs/screenshots/hero-cover-dark.png stays, untouched: it is the docs site's og:image); the 90-second video stays as a text link under the GIF's three-beat caption. Claude-Session: https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22232
Clause-②: no
Part A of the card: the README now opens on a thirty-second GIF recorded from a really running app, rendered by a committed script. Part B (repository topics and the About line) is the maintainer's click on the repository settings page and is not in this PR.
What changed
docs/screenshots/readme-demo.gifdocs/screenshots/render-readme-demo.mjsREADME.mddocs/screenshots/hero-cover-dark.pngis byte-untouched (the docs site's og:image). The architecture diagram and everything below it are unchanged.No
packages/**,apps/docs,content/**,CHANGELOG.mdorpackage.jsonchange; nothing publishes.The recording
Example and object:
examples/app-showcase, objectshowcase_team(three fields, so the whole typed definition fits one frame without scrolling).examples/app-showcase/src/data/objects/team.object.tsdeclares it (comment lines omitted; the frame says so), thenpnpm dev:showcase -- --fresh -p PORTbooting it on a throwaway database, then the Console's Team list (2 rows).tools/callofcreate_recordagainst the running app's/api/v1/mcp, sent with the dev admin's API key; the real response; then the Console list with the new "Data Guild" row (3 rows) and its record page reading "Created by Dev Admin".Closing frame: "The ontology is the software." and the four chips Executable · AI-writable · Agent-operable · You own it.
Measured in the run that rendered the committed GIF (port 39497):
showcase_teamwent 2 → 3 on the admin's call and stayed 3 on the refused call (read back over REST after each call).200, recordQZu-Fcgx29Po-Sfn"Data Guild",created_by= the admin's user id.{"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}Keys and identities
POST /api/v1/keys(content/docs/ai/connect-mcp.mdx, "Headless: API keys"), each from a session opened withPOST /api/v1/auth/sign-in/email.--freshseeds (admin@objectos.ai).auditor.demo@example.com("Ada Auditor (demo)"), whichexamples/app-showcase/src/security/seed-approval-demo.tsprovisions on every dev boot. It holds only theauditorposition, bound toshowcase_auditor(no Team grant), plus the member baselineshowcase_member_default, which grantsshowcase_teamread and no create. No code was changed to get a refusal. Before the GIF calls it "read-only", the script proves it can read: itsquery_recordsonshowcase_teamreturned both rows.Honesty rules, enforced by the script rather than trusted
result.content[0].textare drawn as the characters they encode.Re-render
Prerequisites are the ones
pnpm devchecks itself: a built workspace (pnpm build) and a built Console (pnpm objectui:build), plusffmpegon PATH. Playwright's Chromium is resolved fromexamples/app-showcase(preinstalled binary underPLAYWRIGHT_BROWSERS_PATH, neverplaywright install),sharpfrom the docs app's Next dependency (it verifies screenshot and GIF dimensions and duration), and ffmpeg assembles the GIF in two passes (palettegen, then paletteuse with bayer dithering). Four end-to-end runs in this container produced the same beats; byte-identity is not a goal (ids, timestamps, port).Fonts: the frames the script draws use Inter and IBM Plex Mono from Google Fonts, the hero cover's pair; all eight faces loaded in the committed render. Without them the script refuses to write the committed GIF (exit 3), as
render-hero-cover.mjsdoes;--outpreviews the system fallback (Liberation Sans / DejaVu Sans Mono). The Console screenshots carry the Console's own fonts. No font file is committed.Verification
Run on the final head
8336490e(change set: the three files above, 662 changed lines, the binary counted 0).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 13 families. All 13 exited 0: check-ci-filter-parity, check-closing-keyword-parity (and its--self-test), check-comment-mask-corpus,@objectstack/lintcheck:doc-formula-expressions, check:cross-package-test-inputs, check:doc-anchors, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:refd-timer-probe, check:watch-hint-literal.--ranreconciliation: "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN".pnpm check:published-readme-linksexited 0: "221 outbound link(s) across 101 published markdown file(s) ... 144/144 relative target(s) found in the tree."pnpm lintruns it (--no-inline-config), over the three changed paths:eslint --print-configanswers a config object forrender-readme-demo.mjsandundefinedforREADME.mdand the GIF;--format json: 3 results, 1 file linted with 0 errors and 0 warnings, 2 "File ignored because no matching configuration was supplied";parserOptionsis{ ecmaVersion, sourceType }with noprojectorprojectService(type-aware linting is off repo-wide), and nothing imports the new script, so this diff cannot move any untouched file's verdict.pnpm lintand the rest of CI's farm, which CI owns.Acceptance notes
origin/mainat3ae59661has no README change since this branch's base7b926f76, so no merge was needed. Both PRs edit different hunks of README.md.pnpm dev:showcase -- --freshboot whose full output was read during this work, not investigated, not filed (outside this card): the boot-diagnostics block prints asys_migration"UNIQUE constraint failed" insert warning, a pre-bind settings read warning, an analyticsadmitObjectReadwarning and a sharing-rule "expands to NO recipients" warning. The terminal frame shows none of them because it shows a pattern-picked subset of lines; nothing in the GIF depends on them.isError: truetool result carrying prose only, with HTTP 200 and no machine-readable error code; the GIF shows it as received.Generated by Claude Code