Skip to content

Fill every sample image slot with a real photo or a labelled placeholder - #184

Merged
lucaslyl merged 9 commits into
mainfrom
sample-images-skill
Oct 8, 2026
Merged

lucaslyl merged 9 commits into
mainfrom
sample-images-skill

Conversation

@lucaslyl

@lucaslyl lucaslyl commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Linear: ECO-594

Why

This came out of the card and app creation process. When someone asks for "a cinema app" or "a bakery app", they expect the first shot to look like a finished app, and a poster or a dish with no picture makes it feel incomplete. Today those slots often come out empty, as a gradient, as a random photo, or broken.

That is mostly because the image guidance was written before the catalog had ImageSourceField, and some of the services it relied on have since shut down (source.unsplash.com, via.placeholder.com). With no way to search, it asked the model to compose stock URLs from a pattern, which tends to load an unrelated photo or nothing at all.

Two things now make a simpler, more reliable default possible:

  • One field can hold either kind of image. ImageSourceField stores a url and a realm file (an ImageDef), and sourceMode picks which one shows. A slot can start with a photo or placeholder URL and move to a downloaded file later, without changing the card's schema.
  • A URL keeps the build fast. It needs no tool call, no approval, no file write and no indexing, while each downloaded image needs all four. So sample data uses URLs, and only images that have to last (the user's own, an app going live) are downloaded.

The result: every slot gets something honest. A real photo when one can be found (a stock photo the model knows and has looked at, or a CC0 Openverse photo from a terminal), otherwise a placeholder that says what belongs there, and never a stock photo standing in for a real person, the user's own product or a real film poster.

Why a new reference file

This guidance touched several files, each covering part of it in its own words. Rather than rewrite them, the rules now live in one place, boxel-file-def/references/sample-images.md, and the existing files keep their text with a short pointer. asset-selection-guidelines stays focused on choosing assets that suit a style; only its URL-pattern and retired-service sections are removed.

What changes

  • New boxel-file-def/references/sample-images.md: every media slot in sample data gets an image, picked in this order: the user's own (downloaded and looked at before linking), an image already in the realm or catalog, a known Unsplash, Pexels or Pixabay photo once it has been looked at (load check in a terminal, view-visually of the card in the app), a CC0 Openverse photo (terminal only, load-checked), a labelled placeholder, AI images (offered once in the app).
  • Always a placeholder for real or named people, the user's own products and real copyrighted subjects.
  • Sample photos stay as URLs; only the user's own images, or an app going live, are downloaded.
  • Declares generate-thumbnail and download-file-to-realm; fixes the src example in critical-rules and the ImageDef import in attach-remote-image; removes the guessed-URL and dead-service sections from asset-selection-guidelines.

Not covered

  • The in-app assistant cannot search for photos (no declared tool; run-realm-code has no network), so it uses only photos it already knows, checked on the rendered card, and placeholders for the rest. Next: declare authed-fetch limited to Openverse, or a server-side search-images host command.
  • Downloads run in the browser, so hosts without CORS cannot be imported.
  • Openverse anonymous limits (20/min, 200/day per IP); generate-thumbnail fails from the CLI.
  • Design-review scoring of placeholders is in The design pipeline skills — interview, direct, author motion, review #151.

Tested

External URLs: 14 URLs rendered in one Boxel card, each in both an ImageSourceField and a StringField (identical results). images.unsplash.com, images.pexels.com, cdn.pixabay.com and Openverse hosts load; photo pages, made-up IDs, source.unsplash.com and via.placeholder.com do not; picsum.photos loads a random photo. Remembered IDs mostly showed the expected subject, but not always, and the old "try sequential Pexels IDs" pattern loads unrelated photos (a hiker, an office, noodles), which is why every known photo is looked at first.

"Create a recipe app" again with this rule: the terminal kept 3 remembered Unsplash photos and rejected 2 that showed the wrong dish; a simulated in-app assistant (no network, a CLI screenshot standing in for view-visually) kept 4 and replaced 2 (farfalle for spaghetti, a pineapple pizza for a margherita) after viewing the card. Both clean on scanner, lint, indexing and render.

Earlier: One prompt, "create a recipe app", run from a terminal and as the in-app assistant (real host commands, no network): both found ImageSourceField through the catalog search and wrote the image URL in its url half, never in relationships; the terminal used Openverse photos, the assistant labelled placeholders. Same cinema app built from a terminal and as the in-app assistant (real host commands), a full bakery build (scanner, lint, indexing, render clean), and an audit of every other image rule in the tree.

Edits files owned by others: asset-selection-guidelines and the boxel-file-def decision tree (Luke), container-query-fitted-layout (Burcu), host-commands-reference (Matic).

🤖 Generated with Claude Code

A first build left media slots empty or filled them with a gradient,
initials or a random Picsum photo, and older notes pointed at image
services that no longer answer. This gives the builder one place to pick
an image source and a recipe that works from a terminal.

- boxel-file-def/references/sample-images.md (new): pick a source by
  scenario (the user's own, AI-generated with generate-thumbnail, a real
  CC0 or public-domain photo from the Openverse API, a labelled
  placeholder), never guess a URL, put a URL in the URL half of the field
  and a realm file in relationships.
- asset-selection-guidelines: every media slot ships with an image; the
  source order; placeholder rules (theme colours, sized to the slot, a
  label naming the subject); named fictional people and real copyrighted
  subjects always get a placeholder; the dead services removed.
- host-commands-reference declares generate-thumbnail and
  download-file-to-realm.
- critical-rules: "Images in templates" replaces a src example that put a
  linksTo(ImageDef) value in src.
- attach-remote-image imports ImageDef from @cardstack/base/image-file-def.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Staging Workspace Sync Successful

Successfully synced changes to staging workspace
Workspace: https://realms-staging.stack.cards/skills/
Commit: 90494ed
Synced at: 2026-10-08 01:44:43 UTC

Sync Details

Starting push from . to https://realms-staging.stack.cards/skills/
Testing realm access...
Realm access verified
Found 303 files in local directory
No sync manifest found, will upload all files
Uploading 303 file(s) via /_atomic...
  Uploaded: skills/boxel/scripts/instance-correctness-scan.py
  Uploaded: index.json
  Uploaded: index.md
  Uploaded: realm.json
  Uploaded: skills/boxel/SKILL.md
  Uploaded: skills/boxel/references/base-field-catalog.md
  Uploaded: skills/boxel/references/card-references.md
  Uploaded: skills/boxel/references/command-development.md
  Uploaded: skills/boxel/references/command-invocation-modes.md
  Uploaded: skills/boxel/references/common-imports.md
  Uploaded: skills/boxel/references/container-query-fitted-layout.md
  Uploaded: skills/boxel/references/core-concept.md
  Uploaded: skills/boxel/references/core-patterns.md
  Uploaded: skills/boxel/references/data-management.md
  Uploaded: skills/boxel/references/date-math.md
  Uploaded: skills/boxel/references/default-index-card.md
  Uploaded: skills/boxel/references/defensive-link-traversal.md
  Uploaded: skills/boxel/references/defensive-programming.md
  Uploaded: skills/boxel/references/delegated-rendering.md
  Uploaded: skills/boxel/references/design-playbook.md
  Uploaded: skills/boxel/references/enumerations.md
  Uploaded: skills/boxel/references/external-libraries.md
  Uploaded: skills/boxel/references/file-editing.md
  Uploaded: skills/boxel/references/fitted-formats.md
  Uploaded: skills/boxel/references/formatters.md
  Uploaded: skills/boxel/references/icons.md
  Uploaded: skills/boxel/references/imagedef.md
  Uploaded: skills/boxel/references/lint-workflow.md
  Uploaded: skills/boxel/references/prefers-wide-format.md
  Uploaded: skills/boxel/references/query-systems.md
  Uploaded: skills/boxel/references/quick-reference.md
  Uploaded: skills/boxel/references/qunit-testing.md
  Uploaded: skills/boxel/references/relationship-loading-state.md
  Uploaded: skills/boxel/references/searchable-fields.md
  Uploaded: skills/boxel/references/spec-usage.md
  Uploaded: skills/boxel/references/styling-design.md
  Uploaded: skills/boxel/references/template-syntax.md
  Uploaded: skills/boxel/references/theme-design-system.md
  Uploaded: skills/boxel-create-edit-cards/SKILL.md
  Uploaded: skills/boxel-design/SKILL.md
  Uploaded: skills/boxel-design/references/asset-selection-guidelines.md
  Uploaded: skills/boxel-design/references/critical-rules.md
  Uploaded: skills/boxel-environment/SKILL.md
  Uploaded: skills/boxel-environment/references/assistant-persona.md
  Uploaded: skills/boxel-environment/references/calling-commands.md
  Uploaded: skills/boxel-environment/references/card-tool-selection.md
  Uploaded: skills/boxel-environment/references/common-errors.md
  Uploaded: skills/boxel-environment/references/diagnosing-broken-links.md
  Uploaded: skills/boxel-environment/references/fresh-realm-push-integrity.md
  Uploaded: skills/boxel-environment/references/host-commands-reference.md
  Uploaded: skills/boxel-environment/references/indexing-operations.md
  Uploaded: skills/boxel-environment/references/markdown-edit.md
  Uploaded: skills/boxel-environment/references/searching-and-querying.md
  Uploaded: skills/boxel-environment/references/shared-mirror-safety.md
  Uploaded: skills/boxel-environment/references/source-code-editing.md
  Uploaded: skills/boxel-environment/references/user-environment-awareness.md
  Uploaded: skills/boxel-environment/references/workflows-and-orchestration.md
  Uploaded: skills/boxel-file-def/SKILL.md
  Uploaded: skills/boxel-file-def/references/available-fields.md
  Uploaded: skills/boxel-file-def/references/filedef-first-class-file-support.md
  Uploaded: skills/boxel-file-def/references/filedef-vs-base64imagefield.md
  Uploaded: skills/boxel-file-def/references/import-paths.md
  Uploaded: skills/boxel-file-def/references/markdowndef-vs-markdownfield.md
  Uploaded: skills/boxel-file-def/references/no-inline-binary.md
  Uploaded: skills/boxel-file-def/references/rendering-file-fields-in-templates.md
  Uploaded: skills/boxel-file-def/references/sample-images.md
  Uploaded: skills/boxel-file-def/references/type-hierarchy.md
  Uploaded: skills/boxel-file-def/references/using-filedef-in-cards.md
  Uploaded: skills/boxel-flavored-markdown/SKILL.md
  Uploaded: skills/boxel-flavored-markdown/references/authoring-notes.md
  Uploaded: skills/boxel-flavored-markdown/references/base-syntax.md
  Uploaded: skills/boxel-flavored-markdown/references/bfm-extensions-beyond-commonmarkgfm.md
  Uploaded: skills/boxel-flavored-markdown/references/card-directives-the-boxel-extension.md
  Uploaded: skills/boxel-flavored-markdown/references/quick-reference.md
  Uploaded: skills/boxel-flavored-markdown/references/where-bfm-is-used.md
  Uploaded: skills/boxel-markdown-format/SKILL.md
  Uploaded: skills/boxel-markdown-format/references/delegation-composes.md
  Uploaded: skills/boxel-markdown-format/references/essential-helper-markdownescape.md
  Uploaded: skills/boxel-markdown-format/references/pitfalls.md
  Uploaded: skills/boxel-markdown-format/references/rendering-markdown-html-at-runtime.md
  Uploaded: skills/boxel-markdown-format/references/shape-of-a-static-markdown-template.md
  Uploaded: skills/boxel-markdown-format/references/the-default-usually-good-enough.md
  Uploaded: skills/boxel-markdown-format/references/the-markdown-helpers-toolkit.md
  Uploaded: skills/boxel-markdown-format/references/when-youre-done.md
  Uploaded: skills/boxel-markdown-format/references/worked-example-note-card-with-custom-markdown.md
  Uploaded: skills/boxel-patterns/SKILL.md
  Uploaded: skills/boxel-patterns/patterns/app-card-home-with-search/README.md
  Uploaded: skills/boxel-patterns/patterns/attach-remote-image/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-declared-captures/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-declared-captures/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-image-steering/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-image-steering/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-linked-to-me-lookup/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-linked-to-me-lookup/example.gts
  Uploaded: skills/boxel-patterns/patterns/automate-run-command-cli/README.md
  Uploaded: skills/boxel-patterns/patterns/automate-run-command-cli/example.gts
  Uploaded: skills/boxel-patterns/patterns/build-planning-cards-trio/README.md
  Uploaded: skills/boxel-patterns/patterns/build-site-config-with-theme/README.md
  Uploaded: skills/boxel-patterns/patterns/build-site-config-with-theme/example.gts
  Uploaded: skills/boxel-patterns/patterns/cardinfo-override-title/README.md
  Uploaded: skills/boxel-patterns/patterns/cardinfo-override-title/example.gts
  Uploaded: skills/boxel-patterns/patterns/collab-yjs-shared-document/README.md
  Uploaded: skills/boxel-patterns/patterns/command-atomic-install/README.md
  Uploaded: skills/boxel-patterns/patterns/command-atomic-install/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-data-resource/README.md
  Uploaded: skills/boxel-patterns/patterns/command-data-resource/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-optimistic-pipeline/README.md
  Uploaded: skills/boxel-patterns/patterns/command-optimistic-pipeline/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-typed-with-progress/README.md
  Uploaded: skills/boxel-patterns/patterns/command-typed-with-progress/example.gts
  Uploaded: skills/boxel-patterns/patterns/command-with-skill-card-ref/README.md
  Uploaded: skills/boxel-patterns/patterns/command-with-skill-card-ref/example.gts
  Uploaded: skills/boxel-patterns/patterns/containsmany-sorted-render/README.md
  Uploaded: skills/boxel-patterns/patterns/containsmany-sorted-render/example.gts
  Uploaded: skills/boxel-patterns/patterns/format-morph-shared-component/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-capture-card-format/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-capture-card-format/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-chess-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-filedef-generated-image/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-filedef-generated-image/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-leaflet-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-one-shot-llm/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-one-shot-llm/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-openrouter-image-generation/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-openrouter-image-generation/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-send-request-via-proxy/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-send-request-via-proxy/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-3mf-fabrication/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-three-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-thumbnail-card-ai/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-tone-js-via-cdn/example.gts
  Uploaded: skills/boxel-patterns/patterns/integrate-web-audio-synthesis/README.md
  Uploaded: skills/boxel-patterns/patterns/integrate-web-audio-synthesis/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-3d-card-carousel/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-3d-card-carousel/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-design-board/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-design-board/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-kanban-drag-drop/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-kanban-drag-drop/example.gts
  Uploaded: skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/README.md
  Uploaded: skills/boxel-patterns/patterns/layout-sectioned-record-with-nav/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-command-menu-item/README.md
  Uploaded: skills/boxel-patterns/patterns/link-command-menu-item/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-discriminated-action-resolver/README.md
  Uploaded: skills/boxel-patterns/patterns/link-discriminated-action-resolver/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-element-tag-helper/README.md
  Uploaded: skills/boxel-patterns/patterns/link-element-tag-helper/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-flip-card/README.md
  Uploaded: skills/boxel-patterns/patterns/link-flip-card/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-host-mode-paths/README.md
  Uploaded: skills/boxel-patterns/patterns/link-host-mode-paths/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-onclick-outside/README.md
  Uploaded: skills/boxel-patterns/patterns/link-onclick-outside/example.gts
  Uploaded: skills/boxel-patterns/patterns/link-view-transition/README.md
  Uploaded: skills/boxel-patterns/patterns/link-view-transition/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-atomic-field-factory/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-atomic-field-factory/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-base-class-taxonomy/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-base-class-taxonomy/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-lru-cached-parser/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-lru-cached-parser/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-recursive-fielddef/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-recursive-fielddef/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-resource-class-data-loader/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-resource-class-data-loader/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-sensitive-stub-pair/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-sensitive-stub-pair/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-typed-activity-feed/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-typed-activity-feed/example.gts
  Uploaded: skills/boxel-patterns/patterns/organize-variant-field-dispatcher/README.md
  Uploaded: skills/boxel-patterns/patterns/organize-variant-field-dispatcher/example.gts
  Uploaded: skills/boxel-patterns/patterns/pick-rating/README.md
  Uploaded: skills/boxel-patterns/patterns/pick-rating/example.gts
  Uploaded: skills/boxel-patterns/patterns/pick-typed-sort/README.md
  Uploaded: skills/boxel-patterns/patterns/pick-typed-sort/example.gts
  Uploaded: skills/boxel-patterns/patterns/polymorphic-field-subclass/README.md
  Uploaded: skills/boxel-patterns/patterns/resource-consume-from-context/README.md
  Uploaded: skills/boxel-patterns/patterns/resource-consume-from-context/example.gts
  Uploaded: skills/boxel-patterns/patterns/resource-for-state/README.md
  Uploaded: skills/boxel-patterns/patterns/show-card-list-with-views/README.md
  Uploaded: skills/boxel-patterns/patterns/show-card-list-with-views/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-count-tiles-from-query/README.md
  Uploaded: skills/boxel-patterns/patterns/show-count-tiles-from-query/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-filedef-audio-player/README.md
  Uploaded: skills/boxel-patterns/patterns/show-filedef-audio-player/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-list-prefer-prerendered/README.md
  Uploaded: skills/boxel-patterns/patterns/show-list-prefer-prerendered/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-pdf-annotations-filedef/README.md
  Uploaded: skills/boxel-patterns/patterns/show-pdf-annotations-filedef/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-runtime-markdown-html/README.md
  Uploaded: skills/boxel-patterns/patterns/show-runtime-markdown-html/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-table-from-query/README.md
  Uploaded: skills/boxel-patterns/patterns/show-table-from-query/example.gts
  Uploaded: skills/boxel-patterns/patterns/show-wiki-links/README.md
  Uploaded: skills/boxel-patterns/patterns/show-wiki-links/example.gts
  Uploaded: skills/boxel-patterns/patterns/theme-first-workflow/README.md
  Uploaded: skills/boxel-patterns/patterns/theme-first-workflow/example.gts
  Uploaded: skills/boxel-patterns/references/ai-image-models.md
  Uploaded: skills/boxel-patterns/references/integration-surfaces.md
  Uploaded: skills/boxel-patterns/references/libraries.md
  Uploaded: skills/boxel-patterns/references/pattern-authoring.md
  Uploaded: skills/boxel-patterns/references/pattern-backlog.md
  Uploaded: skills/boxel-patterns/scripts/audit-host-command-refs.mjs
  Uploaded: skills/boxel-skill-authoring/SKILL.md
  Uploaded: skills/boxel-theme-development/SKILL.md
  Uploaded: skills/boxel-theme-development/references/design-md-adapter.md
  Uploaded: skills/boxel-theme-development/references/shadcn-boxel-token-mapping.md
  Uploaded: skills/boxel-ui-component-discovery/SKILL.md
  Uploaded: skills/boxel-ui-guidelines/SKILL.md
  Uploaded: skills/boxel-ui-guidelines/references/checklist.md
  Uploaded: skills/boxel-ui-guidelines/references/delegated-render-control.md
  Uploaded: skills/boxel-ui-guidelines/references/field-rendering-fields-vs-model.md
  Uploaded: skills/boxel-ui-guidelines/references/font-loading-theme-card-owns-imports.md
  Uploaded: skills/boxel-ui-guidelines/references/prefer-component-apis-write-new-components-when-needed.md
  Uploaded: skills/boxel-ui-guidelines/references/prevent-content-overflow.md
  Uploaded: skills/boxel-ui-guidelines/references/print-and-published-output.md
  Uploaded: skills/boxel-ui-guidelines/references/style-budget.md
  Uploaded: skills/boxel-ui-guidelines/references/template-patterns.md
  Uploaded: skills/boxel-ui-guidelines/references/theme-token-contract.md
  Uploaded: skills/boxel-ui-guidelines/references/ui-review-procedure.md
  Uploaded: skills/boxel-ui-guidelines/references/use-boxel-design-tokens-for-theming.md
  Uploaded: skills/boxel-ui-guidelines/references/use-boxel-ui-components.md
  Uploaded: skills/boxel-ui-guidelines/references/use-container-queries-not-viewport-units.md
  Uploaded: skills/boxel-workspace-cardinal-rules/SKILL.md
  Uploaded: skills/bxl-authoring/SKILL.md
  Uploaded: skills/card-operations-authoring/SKILL.md
  Uploaded: skills/catalog-listing/SKILL.md
  Uploaded: skills/catalog-listing/references/submission-workflow.md
  Uploaded: skills/catalog-reuse/SKILL.md
  Uploaded: skills/domain-interview/SKILL.md
  Uploaded: skills/domain-interview/references/brief-template.md
  Uploaded: skills/ember-best-practices/README.md
  Uploaded: skills/ember-best-practices/SKILL.md
  Uploaded: skills/ember-best-practices/rules/a11y-automated-testing.md
  Uploaded: skills/ember-best-practices/rules/a11y-form-labels.md
  Uploaded: skills/ember-best-practices/rules/a11y-keyboard-navigation.md
  Uploaded: skills/ember-best-practices/rules/a11y-route-announcements.md
  Uploaded: skills/ember-best-practices/rules/a11y-semantic-html.md
  Uploaded: skills/ember-best-practices/rules/advanced-concurrency.md
  Uploaded: skills/ember-best-practices/rules/advanced-data-loading-with-ember-concurrency.md
  Uploaded: skills/ember-best-practices/rules/advanced-helpers.md
  Uploaded: skills/ember-best-practices/rules/advanced-modifiers.md
  Uploaded: skills/ember-best-practices/rules/advanced-tracked-built-ins.md
  Uploaded: skills/ember-best-practices/rules/bundle-direct-imports.md
  Uploaded: skills/ember-best-practices/rules/bundle-embroider-static.md
  Uploaded: skills/ember-best-practices/rules/bundle-lazy-dependencies.md
  Uploaded: skills/ember-best-practices/rules/component-args-validation.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-classes-in-examples.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-constructors.md
  Uploaded: skills/ember-best-practices/rules/component-avoid-lifecycle-hooks.md
  Uploaded: skills/ember-best-practices/rules/component-cached-getters.md
  Uploaded: skills/ember-best-practices/rules/component-class-fields.md
  Uploaded: skills/ember-best-practices/rules/component-composition-patterns.md
  Uploaded: skills/ember-best-practices/rules/component-controlled-forms.md
  Uploaded: skills/ember-best-practices/rules/component-file-conventions.md
  Uploaded: skills/ember-best-practices/rules/component-memory-leaks.md
  Uploaded: skills/ember-best-practices/rules/component-minimal-tracking.md
  Uploaded: skills/ember-best-practices/rules/component-on-modifier.md
  Uploaded: skills/ember-best-practices/rules/component-reactive-chains.md
  Uploaded: skills/ember-best-practices/rules/component-strict-mode.md
  Uploaded: skills/ember-best-practices/rules/component-tracked-toolbox.md
  Uploaded: skills/ember-best-practices/rules/component-use-glimmer.md
  Uploaded: skills/ember-best-practices/rules/exports-named-with-default-fallback.md
  Uploaded: skills/ember-best-practices/rules/helper-builtin-functions.md
  Uploaded: skills/ember-best-practices/rules/helper-composition.md
  Uploaded: skills/ember-best-practices/rules/helper-plain-functions.md
  Uploaded: skills/ember-best-practices/rules/performance-on-modifier-vs-handlers.md
  Uploaded: skills/ember-best-practices/rules/route-lazy-routes.md
  Uploaded: skills/ember-best-practices/rules/route-loading-substates.md
  Uploaded: skills/ember-best-practices/rules/route-model-caching.md
  Uploaded: skills/ember-best-practices/rules/route-parallel-model.md
  Uploaded: skills/ember-best-practices/rules/route-templates.md
  Uploaded: skills/ember-best-practices/rules/service-cache-responses.md
  Uploaded: skills/ember-best-practices/rules/service-data-requesting.md
  Uploaded: skills/ember-best-practices/rules/service-ember-data-optimization.md
  Uploaded: skills/ember-best-practices/rules/service-owner-linkage.md
  Uploaded: skills/ember-best-practices/rules/service-shared-state.md
  Uploaded: skills/ember-best-practices/rules/template-avoid-computation.md
  Uploaded: skills/ember-best-practices/rules/template-conditional-rendering.md
  Uploaded: skills/ember-best-practices/rules/template-each-key.md
  Uploaded: skills/ember-best-practices/rules/template-fn-helper.md
  Uploaded: skills/ember-best-practices/rules/template-helper-imports.md
  Uploaded: skills/ember-best-practices/rules/template-let-helper.md
  Uploaded: skills/ember-best-practices/rules/template-only-component-functions.md
  Uploaded: skills/ember-best-practices/rules/testing-library-dom-abstraction.md
  Uploaded: skills/ember-best-practices/rules/testing-modern-patterns.md
  Uploaded: skills/ember-best-practices/rules/testing-msw-setup.md
  Uploaded: skills/ember-best-practices/rules/testing-no-raf-for-state.md
  Uploaded: skills/ember-best-practices/rules/testing-qunit-dom-assertions.md
  Uploaded: skills/ember-best-practices/rules/testing-render-patterns.md
  Uploaded: skills/ember-best-practices/rules/testing-test-waiters.md
  Uploaded: skills/ember-best-practices/rules/vscode-setup-recommended.md
  Uploaded: skills/glossary.md
  Uploaded: skills/query-backed-relationships/SKILL.md
  Uploaded: skills/realm-policy-authoring/SKILL.md
  Uploaded: skills/rich-markdown-reports/SKILL.md
  Uploaded: skills/source-code-editing/SKILL.md
Skipping 2 realm-managed remote artifact(s): index.json, realm.json

Checkpoint created: 9022735 [MAJOR] Push: 303 files (~303)
Push completed
Push completed successfully

lucaslyl and others added 4 commits October 7, 2026 14:05
Two runs (a terminal build, and the in-app assistant simulated with the
real host commands) and an audit of every image rule in the tree found:

- Image field: say the URL/ImageDef pair (Cardinal Rule 12) or the
  catalog ImageSourceField that packages it, instead of putting
  ImageSourceField ahead of the rule; base-field-catalog no longer calls
  that field unbuilt, and its ImageDef row imports image-file-def.
- generate-thumbnail fails from `boxel run-command` ("Cannot login to realm
  server without matrix client"); it does not generate and then fail to
  save. Corrected here and in indexing-operations.
- download-file-to-realm runs in the browser: the host must allow CORS,
  and the path's extension follows the content type (a .jpg URL can
  serve WebP). The load check now sends a user agent and shows the CORS
  header; StockSnap's 403 was only curl's default agent.
- The user's own image is downloaded and looked at before it is linked.
- AI images come in the mockup pass when the user asked or the design is
  brand-heavy, as the design-playbook says; otherwise they are offered once
  after the build, and every call goes in one reply for one approval.
- Openverse: query with plain words, match on title or tags; a made-up
  film's poster can take a photo too; one label rule by display size; a
  default colour pair with no theme; a fitted tile crops the item's own
  image.
- The fitted-layout checklist accepts a verified photo or a labelled
  placeholder, never a guessed URL; host command names carry their hash
  suffix; icons point at @cardstack/boxel-icons; glossary fixes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Both re-tests passed (an Openverse photo found with plain words and
downloaded into the realm; the assistant looked at the user's image and
asked instead of linking a photo of bread as a poster). The wording they
still tripped on:

- In the app, the "unsure" question leaves out stock photos, which the
  assistant cannot look up; the AI offer leaves out placeholder-only slots
  (the example now names dishes, not real film posters); an AI portrait is
  fine for a fictional person when the user asks.
- Download paths are <slug>-<field>.<ext>; in the app the extension comes
  from the URL. A declined user image is reported as left in Images/.
- Prefer Openverse results that allow CORS; one more query with a near
  word when a query returns only a handful.
- One placeholder URL serving an avatar and a tile is labelled for the
  avatar; ImageSourceField is a default export.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A placeholder example used Picsum for a named place; it is placehold.co.
- An image already in the realm or catalog is a source, found with
  catalog-reuse's files search.
- The draft state (hotlinked photo or placeholder) is said to meet the
  playbook's realm-hosted photos through the download step, and a later AI
  pass replaces placeholders.
- attach-remote-image's "future direction" points at ImageSourceField; the
  glossary lists the two media host commands; "no declared tool" for the
  app's photo lookup; no reference to a route that is not on main.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A full "build me a bakery app" run passed every gate (scan, lint,
indexing, typed counts, render), and showed:

- Labelling one placeholder for the avatar it also serves filled large
  photo panels with initials. Label it for the panel instead.
- Placeholder colours are fixed in the URL: grey at a stage-1 mockup,
  switched to the theme's once it exists.
- Items the user calls their own ("our cakes") are real products and take
  a placeholder until their photos come; invented sample items can take an
  Openverse photo. Never change a sample item to fit a photo.
- FittedCard's :placeholder is for an image a user later cleared, not a
  first-build instance; a full-width hero is 1920x1080; the download host
  command also runs from a terminal through `boxel run-command`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lucaslyl added a commit that referenced this pull request Oct 7, 2026
Takes #184's tested image guidance (sample-images, asset-selection, host
commands, the Images-in-templates section) and keeps this branch's own
sections around it: never invent proof, main action, visible controls and
first-build size in critical-rules, and the boxel-design reference list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- A by-path table: what a terminal session and the in-app assistant each
  do for the user's own image, an existing realm or catalog image, a real
  photo, a failed lookup, AI images and the always-placeholder subjects.
- Sample photos stay as URLs, which is faster; an image is downloaded only
  when it is the user's own, or the app is published, listed or going
  live. A failed download keeps the URL and is listed in the hand-off.
- Openverse: record the source page and creator; a 429 (20 a minute, 200
  a day per IP anonymously) falls back to a placeholder with no retry.
- Marked as an interim recipe until the platform has a server-side image
  search; "every slot has an image" is a sample-data rule, and templates
  still design a no-image state.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@lucaslyl lucaslyl left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] This review went after consistency with the rest of the tree and the host facts the new text asserts (tool names and inputs, the ImageDef import, ImageSourceField field names, the Openverse parameters); it did not re-run the Openverse or placehold.co calls.

No blocking issues.

  1. Replace the hand-picked images.unsplash.com/photo-<id> URL in the attach-remote-image/README.md example instance (line 87, outside this diff) with a labelled placeholder (https://placehold.co/1600x900/e5e7eb/6b7280.png?text=27+Spruce+Lane); it is the construct-a-URL shape the new rules forbid, and a builder copying the pattern copies it.
  2. Reword the two temporal sentences in sample-images.md.

The Sync check was still running when I looked.

This rule is for sample data. A template still shows a designed state for an instance with no image,
because real records often have none.

This is an interim recipe. Openverse from a terminal and placeholders in the app stand in until the

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Non-blocking. "This is an interim recipe ... stand in until the platform has a server-side image search" is delivery-state wording that goes stale the day the search ships, and it reads as permission to treat the rules below as optional. State the contract (Openverse from a terminal, placeholders in the app) and drop the forecast.

not the image's host, and its licence is unknown;
- the placeholder patterns below, which work for any value.

Dead patterns still found in older notes, never use them: `source.unsplash.com` (shut down) and

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude Code 🤖] Non-blocking. "Dead patterns still found in older notes" is temporal and refers to text that no longer exists in the tree. List the patterns that never work (source.unsplash.com, via.placeholder.com) without the history.

A council review of the PR asked for a smaller footprint on files other
people wrote, and less repetition in the new reference.

- critical-rules keeps its original "Image URL in templates" section and
  adds three lines on linksTo(ImageDef) values; boxel-design keeps its
  description and adds one link; attach-remote-image keeps its "Future
  direction" heading with a pointer; container-query-fitted-layout keeps
  its sentences, changing only "Unsplash URLs are fine" to a verified URL.
- asset-selection-guidelines still drops only the guessed-URL and
  dead-service sections, and keeps its icons and NASA lines.
- host-commands-reference's media entries are one line each; glossary
  entries are short definitions and GenerateThumbnailCommand is restored.
- sample-images.md is 188 lines: one source table for terminal and app,
  each rule stated once, real links, Picsum removed, a slot never left
  empty, real people always a placeholder, the terminal download route.
- The design-playbook's sample-data step links to sample-images.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The decision tree sent an external image URL to contains(StringField).
An image now goes to the catalog ImageSourceField (or the URL/ImageDef
pair), whose URL half holds it and which can switch to a realm file later
with no schema change; a link to a non-image file elsewhere is
contains(UrlField), matching base-field-catalog.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@lucaslyl
lucaslyl marked this pull request as ready for review October 7, 2026 10:24
@lucaslyl
lucaslyl requested review from a team, jurgenwerk and lukemelia October 7, 2026 10:24
A remembered Unsplash, Pexels or Pixabay URL loads and often shows the
subject the model expects, but not always, so it is used only after a load
check and a look (terminal) or a view-visually of the card (app). This gives
the in-app assistant real photos instead of only placeholders. Use the
image's own address, never its page; picsum is added to the never-use list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@lucaslyl
lucaslyl merged commit 90494ed into main Oct 8, 2026
1 check passed
lucaslyl added a commit that referenced this pull request Oct 8, 2026
…and #189's interview record

Brings in main (including #184's sample images), takes #188's versions of
layout-vocabulary.md and layout-gravity.md, and #189's interview record in
domain-interview, its brief template and glossary entry, and its routing
skip sentence in index.md. Conflicts keep #151's fuller text and add the
newer lines into it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants