Not in the top 1,000 by GitHub stars

JamesonZGJ/layered-holo-card-skill

Turn a photo into a layered 2.5D holographic card with original-color subjects, safe parallax, dynamic shadows and a portable Agent workflow.

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 Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → b4fdb222009d

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit b4fdb222009d0231b30e7c11cc246d2cdc1cd420

10GitHub stars
0stars in 7 days
1skill in this repository
0commits in 30 days

Heat

0.3
  • 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, 2026Oct 25, 202610

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

Individual skills in this repository

How it works

layered-holo-card

When your agent uses it

Turn an existing photo or artwork into a layered 2.5D holographic collectible card while preserving its composition and subject pixels. Use for floating subjects, layered photo cards, or 把照片做成主体浮起的全息闪卡; not for redesigning the image or flat whole-card tilt alone.

What it loads into context

Frontmatter

72 tokens

Always available to the agent

SKILL.md

1,423 tokens

When the skill is activated

Reference documents

8,718 tokens

Loaded on request

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

The playbook

  1. Capability check
  2. Fixed workflow
  3. Non-negotiable rendering boundaries
  4. Optional tuning without redesign
  5. Output files

Scripts executed separately

  • assets/react-template/HolographicCard.tsx
  • assets/runtime/card.d.ts
  • assets/runtime/card.js
  • assets/runtime/motion.js
  • assets/runtime/optics.js
  • assets/runtime/parameters.js
  • assets/runtime/preview.js
  • examples/basic/card/preview/card.d.ts
  • examples/basic/card/preview/card.js
  • examples/basic/card/preview/motion.js
  • examples/basic/card/preview/optics.js
  • examples/basic/card/preview/parameters.js
  • examples/basic/card/preview/preview.js
  • package.json
  • scripts/check_exports.py
  • scripts/core.py
  • scripts/inspect_image.py
  • scripts/install_skill.py
  • scripts/occlusion.py
  • scripts/pack_skill.py
  • scripts/parameters.py
  • scripts/prepare_layers.py
  • scripts/prepare_subject_layer.py
  • scripts/refine_boundary.py
  • scripts/release_audit.py
  • scripts/validate_layers.py
  • tests/browser.mjs
  • tests/continuous-motion.mjs
  • tests/motion.test.mjs
  • tests/occlusion-browser.mjs
  • tests/parameters-browser.mjs
  • tests/parameters.test.mjs
  • tests/test_input_formats.py
  • tests/test_occlusion.py
  • tests/test_parameters.py
  • tests/test_pipeline.py
  • tests/test_release.py

Files

  • .github/workflows/test.ymlasset595 bytes
  • .gitignoreasset334 bytes
  • CHANGELOG.mddoc1,748 bytes
  • LICENSEasset1,087 bytes
  • README.mddoc6,897 bytes
  • RELEASING.mddoc3,799 bytes
  • SKILL.mdcore7,301 bytes
  • SKILL.mdcore7,301 bytes
  • SKILL.mdcore7,301 bytes
  • THIRD_PARTY_NOTICES.mddoc3,915 bytes
  • agents/openai.yamlasset260 bytes
  • assets/demo/layered-holo-card-demo.gifasset1,826,268 bytes
  • assets/demo/layered-holo-card-occlusion-demo.gifasset7,513,552 bytes
  • assets/react-template/HolographicCard.tsxruns1,084 bytes
  • assets/runtime/card.cssasset876 bytes
  • assets/runtime/card.d.tsruns1,881 bytes
  • assets/runtime/card.jsruns12,810 bytes
  • assets/runtime/index.htmlasset1,014 bytes
  • assets/runtime/motion.jsruns2,832 bytes
  • assets/runtime/optics.jsruns4,799 bytes
  • assets/runtime/parameters.jsruns716 bytes
  • assets/runtime/parameters.jsonasset1,014 bytes
  • assets/runtime/preview.cssasset1,284 bytes
  • assets/runtime/preview.jsruns6,149 bytes
  • examples/basic/README.mddoc921 bytes
  • examples/basic/card/background.pngasset1,780,978 bytes
  • examples/basic/card/extraction.jsonasset1,832 bytes
  • examples/basic/card/final.pngasset3,079,275 bytes
  • examples/basic/card/foreground-accent.pngasset113,204 bytes
  • examples/basic/card/original.pngasset2,029,488 bytes
  • examples/basic/card/presentation.jsonasset596 bytes
  • examples/basic/card/preview/card.cssasset876 bytes
  • examples/basic/card/preview/card.d.tsruns1,881 bytes
  • examples/basic/card/preview/card.jsruns12,810 bytes
  • examples/basic/card/preview/index.htmlasset1,014 bytes
  • examples/basic/card/preview/motion.jsruns2,832 bytes
  • examples/basic/card/preview/optics.jsruns4,799 bytes
  • examples/basic/card/preview/parameters.jsruns716 bytes
  • examples/basic/card/preview/parameters.jsonasset1,014 bytes
  • examples/basic/card/preview/preview.cssasset1,284 bytes
  • examples/basic/card/preview/preview.jsruns6,149 bytes
  • examples/basic/card/prompts.jsonasset1,521 bytes
  • examples/basic/card/recomposition.pngasset2,250,958 bytes
  • examples/basic/card/subject.pngasset487,769 bytes
  • examples/basic/card/validation.jsonasset579 bytes
  • examples/basic/input.pngasset2,029,488 bytes
  • examples/basic/provenance.jsonasset1,019 bytes
  • package-lock.jsonasset2,913 bytes
  • package.jsonruns277 bytes
  • references/known-limitations.mddoc1,950 bytes
  • references/layering.mddoc2,136 bytes
  • references/materials.mddoc1,180 bytes
  • references/motion.mddoc2,907 bytes
  • references/occlusion.mddoc4,830 bytes
  • references/parameters.mddoc4,520 bytes
  • references/pipeline.mddoc5,242 bytes
  • references/validation.mddoc2,489 bytes
  • requirements.txtdoc66 bytes
  • scripts/check_exports.pyruns1,436 bytes
  • scripts/core.pyruns9,053 bytes
  • scripts/inspect_image.pyruns974 bytes
  • scripts/install_skill.pyruns1,328 bytes
  • scripts/occlusion.pyruns3,379 bytes
  • scripts/pack_skill.pyruns1,046 bytes
  • scripts/parameters.pyruns910 bytes
  • scripts/prepare_layers.pyruns9,720 bytes
  • scripts/prepare_subject_layer.pyruns937 bytes
  • scripts/refine_boundary.pyruns1,873 bytes
  • scripts/release_audit.pyruns2,488 bytes
  • scripts/validate_layers.pyruns7,947 bytes
  • tests/browser.mjsruns5,582 bytes
  • tests/continuous-motion.mjsruns4,586 bytes
  • tests/motion.test.mjsruns4,646 bytes
  • tests/occlusion-browser.mjsruns2,681 bytes
  • tests/parameters-browser.mjsruns6,390 bytes
  • tests/parameters.test.mjsruns3,092 bytes
  • tests/test_input_formats.pyruns3,563 bytes
  • tests/test_occlusion.pyruns4,912 bytes
  • tests/test_parameters.pyruns1,118 bytes
  • tests/test_pipeline.pyruns6,962 bytes
  • tests/test_release.pyruns4,199 bytes
  • tsconfig.jsonasset308 bytes
Read SKILL.md

# Layered Holo Card

Preserve the image first. Movement should reveal subtle physical depth; at rest it remains the user's picture. Use this package's pipeline and renderer, not an improvised card frame or another shader.

## Capability check

Required: local filesystem and shell, Python 3.10+ with `requirements.txt`, an image-editing tool that accepts the original image and returns usable files, and a WebGL2 browser for interactive verification. An Agent's support for SKILL.md alone does not supply these capabilities. If one is absent, name it and stop at that stage. Never silently substitute a remote provider, buy credits, or request secrets in chat. No hosted service or provider-specific MCP is required.

Read [pipeline](references/pipeline.md) and [validation](references/validation.md) before processing. Read [layering](references/layering.md) to decide whether an accent is reliable. Use [materials](references/materials.md) and [motion](references/motion.md) when assembling. Resolve all paths relative to this skill's directory, not a developer's machine.

This is v0.1.0 Beta. Read [known limitations](references/known-limitations.md): small silhouette details and translucent boundaries still require visual review. Release readiness does not guarantee successful extraction on every input.

## Fixed workflow
View the complete source on GitHub

Skills included

  • layered-holo-card

Repository facts

License
MIT
Created
Sep 10, 2026
Last pushed
Sep 12, 2026
Forks
1
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 90 signals by file

.gitignore

  • Access to secretsline 20
    [Credential-related source omitted]

README.md

  • Network accessline 55
    Open [the local example](http://127.0.0.1:4173/preview/). Move the pointer, switch materials, export PNG, or use **Inspect actual layers → Internal parallax only** to see depth without foil or whole-card tilt. Do not use `file://`.

THIRD_PARTY_NOTICES.md

  • Network accessline 5
    Conceptual references (not licensed components of this package): - https://github.com/Kutis5/create-holographic-card-skill — background reconstruction, original-RGB foreground isolation, layered-card workflow.
  • Network accessline 6
    - https://github.com/Kutis5/create-holographic-card-skill — background reconstruction, original-RGB foreground isolation, layered-card workflow.
  • Network accessline 7
    - https://github.com/BIAsia/holo-card-studio — foil interaction and collectible surface feel.
  • Network accessline 9
    Dependencies are installed separately, not vendored: - Python: PSF License, https://docs.python.org/3/license.html
  • Network accessline 10
    - Python: PSF License, https://docs.python.org/3/license.html
  • Network accessline 11
    - Pillow: MIT-CMU (see installed version's notices), https://github.com/python-pillow/Pillow/blob/main/LICENSE
  • Network accessline 12
    - NumPy: BSD-3-Clause and bundled notices, https://github.com/numpy/numpy/blob/main/LICENSE.txt
  • Network accessline 13
    - opencv-python-headless wrapper: MIT, https://github.com/opencv/opencv-python/blob/4.x/LICENSE.txt ; OpenCV 4.x: Apache-2.0, https://github.com/opencv/opencv/blob/4.x/LICENSE . Binary wheels include their own third-party notices. Used thro
  • Network accessline 14
    - Node.js (development tests only): MIT with bundled notices, https://github.com/nodejs/node/blob/main/LICENSE
  • Network accessline 15
    - React (optional adapter peer dependency): MIT, https://github.com/facebook/react/blob/main/LICENSE
  • Network accessline 16
    - Playwright (development browser tests only): Apache-2.0, https://github.com/microsoft/playwright/blob/main/LICENSE

assets/react-template/HolographicCard.tsx

  • Executable scriptline 1
    Executable file

assets/runtime/card.d.ts

  • Executable scriptline 1
    Executable file

assets/runtime/card.js

  • Executable scriptline 1
    Executable file

assets/runtime/motion.js

  • Executable scriptline 1
    Executable file

assets/runtime/optics.js

  • Executable scriptline 1
    Executable file

assets/runtime/parameters.js

  • Executable scriptline 1
    Executable file

assets/runtime/preview.js

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    const layerDetails=document.querySelector('details'); try{  const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);
  • Network accessline 5
    try{  const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);  const config=await response.json();
  • Network accessline 6
    const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);

examples/basic/README.md

  • Network accessline 11
    Open http://127.0.0.1:4173/preview/. Precomputed layers require no image provider and use the same runtime as new cards. Try internal-only motion, isolated layers, material switches and PNG export.

examples/basic/card/preview/card.d.ts

  • Executable scriptline 1
    Executable file

examples/basic/card/preview/card.js

  • Executable scriptline 1
    Executable file

examples/basic/card/preview/motion.js

  • Executable scriptline 1
    Executable file

examples/basic/card/preview/optics.js

  • Executable scriptline 1
    Executable file

examples/basic/card/preview/parameters.js

  • Executable scriptline 1
    Executable file

examples/basic/card/preview/preview.js

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    const layerDetails=document.querySelector('details'); try{  const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);
  • Network accessline 5
    try{  const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);  const config=await response.json();
  • Network accessline 6
    const response=await fetch('../presentation.json');if(!response.ok)throw new Error('Cannot load presentation.json: '+response.status);

package-lock.json

  • Network accessline 17
    "node_modules/@playwright/test": {       "version": "1.63.0",       "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz",
  • Network accessline 18
    "version": "1.63.0",       "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz",       "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==",
  • Network accessline 19
    "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz",
  • Network accessline 33
    "node_modules/@types/react": {       "version": "19.1.10",       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.10.tgz",
  • Network accessline 34
    "version": "19.1.10",       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.10.tgz",       "integrity": "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==",
  • Network accessline 35
    "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.10.tgz",
  • Network accessline 43
    "node_modules/csstype": {       "version": "3.2.3",       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
  • Network accessline 44
    "version": "3.2.3",       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",       "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
  • Network accessline 45
    "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
  • Network accessline 50
    "node_modules/playwright": {       "version": "1.63.0",       "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",
  • Network accessline 51
    "version": "1.63.0",       "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",       "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==",
  • Network accessline 52
    "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz",
  • Network accessline 66
    "node_modules/playwright-core": {       "version": "1.63.0",       "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz",
  • Network accessline 67
    "version": "1.63.0",       "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz",       "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==",
  • Network accessline 68
    "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz",
  • Network accessline 79
    "node_modules/typescript": {       "version": "5.9.3",       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
  • Network accessline 80
    "version": "5.9.3",       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",       "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
  • Network accessline 81
    "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",

package.json

  • Executable scriptline 1
    Executable file

scripts/check_exports.py

  • Executable scriptline 1
    Executable file

scripts/core.py

  • Executable scriptline 1
    Executable file

scripts/inspect_image.py

  • Executable scriptline 1
    Executable file

scripts/install_skill.py

  • Executable scriptline 1
    Executable file

scripts/occlusion.py

  • Executable scriptline 1
    Executable file

scripts/pack_skill.py

  • Executable scriptline 1
    Executable file

scripts/parameters.py

  • Executable scriptline 1
    Executable file

scripts/prepare_layers.py

  • Executable scriptline 1
    Executable file

scripts/prepare_subject_layer.py

  • Executable scriptline 1
    Executable file

scripts/refine_boundary.py

  • Executable scriptline 1
    Executable file

scripts/release_audit.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 34
    [Credential-related source omitted]

scripts/validate_layers.py

  • Executable scriptline 1
    Executable file

tests/browser.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 55
    await noGpu.goto(url);await noGpu.getByRole('alert').waitFor();assert.equal(await noGpu.locator('.lhc').count(),0);results.push('WebGL2 absence is explicit failure');  const still=await browser.newPage();  await still.route('**/presentation
  • Network accessline 56
    const still=await browser.newPage();  await still.route('**/presentation.json',async route=>{const response=await route.fetch();const config=await response.json();await route.fulfill({response,json:{...config,motion:false}});});  await stil
  • Network accessline 57
    await still.route('**/presentation.json',async route=>{const response=await route.fetch();const config=await response.json();await route.fulfill({response,json:{...config,motion:false}});});

tests/continuous-motion.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 18
    await p.goto(url);await p.waitForFunction(()=>!document.querySelector('#export').disabled,null,{polling:100});  const tracking=await p.evaluate(async()=>{   const c=await(await fetch('../presentation.json')).json();
  • Network accessline 19
    const tracking=await p.evaluate(async()=>{   const c=await(await fetch('../presentation.json')).json();   document.querySelector('#tilt').click();tick(0);
  • Network accessline 20
    const c=await(await fetch('../presentation.json')).json();

tests/motion.test.mjs

  • Executable scriptline 1
    Executable file

tests/occlusion-browser.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 11
    page.on('pageerror',e=>errors.push(e.message));  await page.goto(url);await page.waitForFunction(()=>!document.querySelector('#export').disabled);  const config=await page.evaluate(async()=>await(await fetch('../presentation.json')).json())
  • Network accessline 12
    await page.goto(url);await page.waitForFunction(()=>!document.querySelector('#export').disabled);  const config=await page.evaluate(async()=>await(await fetch('../presentation.json')).json());  const front=config.layers.find(l=>l.role==='fo
  • Network accessline 13
    const config=await page.evaluate(async()=>await(await fetch('../presentation.json')).json());

tests/parameters-browser.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 24
    const {sceneState:oldScene}=await import('/baseline/motion.js');   const {sceneState:newScene}=await import('./motion.js');   const config=await (await fetch('../presentation.json')).json();
  • Network accessline 25
    const {sceneState:newScene}=await import('./motion.js');   const config=await (await fetch('../presentation.json')).json();   const image=new Image();image.src='../'+config.background;await image.decode();
  • Network accessline 26
    const config=await (await fetch('../presentation.json')).json();

tests/parameters.test.mjs

  • Executable scriptline 1
    Executable file

tests/test_input_formats.py

  • Executable scriptline 1
    Executable file

tests/test_occlusion.py

  • Executable scriptline 1
    Executable file

tests/test_parameters.py

  • Executable scriptline 1
    Executable file

tests/test_pipeline.py

  • Executable scriptline 1
    Executable file

tests/test_release.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 64
    [Credential-related source omitted]
  • Access to secretsline 77
    [Credential-related source omitted]

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.

Some files could not be read; the facts below still hold.

Signal confidence: 71 facts

and 21 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.