Crie com ChatGPT, Claude ou outra IA

Copie o prompt abaixo, troque a linha DESCRIÇÃO pelo que você imagina e cole no chat. A IA devolve os arquivos; você salva nas pastas indicadas, roda python3 pack.py <pasta> e importa pelo + na aba Instalados.

Dica: se a IA puder ler links, mande também https://engine.oprimo.dev/docs/llms-full.txt, que traz a especificação completa num arquivo só.

Prompt: shader Metal (grátis, leve na bateria)

Você vai criar um wallpaper animado para o PrimoEngine (macOS) do tipo "metal".
DESCRIÇÃO: <descreva aqui, ex.: "aurora boreal suave em tons de verde e roxo sobre um céu estrelado">

Entregue EXATAMENTE dois blocos de código, nada mais:
1) manifest.json  (salvo em <pasta>/manifest.json)
2) shader.metal   (salvo em <pasta>/content/shader.metal)

Regras do manifest.json:
- {"schemaVersion": 1, "id": "com.user.<slug>", "version": "1.0.0", "title": "<título curto>",
   "type": "metal", "entry": "content/shader.metal", "minMacOS": "26.0",
   "config": [
     {"key":"speed","type":"float","min":0.1,"max":3.0,"default":1.0,"label":"Speed"},
     {"key":"tint","type":"color","default":"#FFFFFF","label":"Tint"}],
   "capabilities": {"network": []}}
- Não inclua "checksum" (o pack.py calcula). Não adicione outros itens em config (o shader só recebe speed e tint).

Regras do shader.metal (Metal Shading Language, compilado em runtime no macOS 26):
- Comece com: #include <metal_stdlib> e using namespace metal;
- Declare exatamente:
  struct Uniforms { float2 resolution; float time; float speed; float4 tint; };
  struct VOut { float4 position [[position]]; };
  vertex VOut v_main(uint vid [[vertex_id]]) {
      float2 p = float2((vid << 1) & 2, vid & 2);
      VOut o; o.position = float4(p * 2.0 - 1.0, 0.0, 1.0); return o; }
- Fragmento: fragment float4 f_main(float4 fragCoord [[position]], constant Uniforms& u [[buffer(0)]])
- fragCoord.xy está em pixels, origem no canto superior esquerdo (y cresce para baixo).
  uv = fragCoord.xy / u.resolution. Anime com u.time * u.speed. Multiplique a cor final por u.tint.rgb.
  Retorne alfa 1.0.
- PROIBIDO em qualquer lugar do código (inclusive em nomes): "kernel ", "[[kernel", "device ",
  "threadgroup ", "atomic_", "#include \"". Sem texturas, sem samplers, sem buffers além do Uniforms,
  sem iMouse.
- É MSL, não GLSL: use float2/float3/float4, fmod em vez de mod, fract, mix, smoothstep;
  literais float com ponto (1.0); funções auxiliares antes de f_main; sem recursão.
- Deve ser bonito em tela cheia, animação suave e em loop contínuo, e barato para a GPU
  (no máximo ~64 iterações por pixel).

Prompt: web / Canvas / WebGL (grátis)

Você vai criar um wallpaper animado para o PrimoEngine (macOS) do tipo "web".
DESCRIÇÃO: <descreva aqui>

Entregue EXATAMENTE dois blocos de código:
1) manifest.json  (salvo em <pasta>/manifest.json)
2) index.html     (salvo em <pasta>/content/web/index.html), um único arquivo, CSS e JS embutidos.

manifest.json:
- {"schemaVersion": 1, "id": "com.user.<slug>", "version": "1.0.0", "title": "<título>",
   "type": "web", "entry": "content/web/index.html", "minMacOS": "26.0",
   "config": [ ...2 a 5 ajustes úteis... ], "capabilities": {"network": []}}
- Tipos de ajuste permitidos: "float" e "int" (com min, max, default), "bool" (default true/false),
  "color" (default "#RRGGBB"). Cada um com "key" e "label". Nada de "enum". Sem "checksum".

index.html:
- Roda num WKWebView (Safari/WebKit) em tela cheia, atrás dos ícones da mesa. SEM INTERNET:
  nada de CDN, fetch, fontes externas ou imagens remotas. Sem mouse/teclado. Sem localStorage.
- Leia os ajustes assim, com padrões iguais aos do manifest:
    const cfg = { /* padrões */ };
    window.LiveWallpaper = window.LiveWallpaper || {};
    function readConfig(c) { Object.assign(cfg, c || {}); /* reaplicar */ }
    window.LiveWallpaper.onConfig = readConfig;
    readConfig(window.LiveWallpaper.config);
  Ajustes "int" chegam como decimal: use Math.round. "color" chega como "#RRGGBB".
- Anime com requestAnimationFrame; trate resize e devicePixelRatio; html/body sem margem,
  overflow hidden, fundo escuro.
- Canvas 2D ou WebGL puro (sem bibliotecas externas). Leve para a bateria.

Se der erro

Cole a mensagem de erro do app (ou do pack.py) de volta na conversa, junto com a tabela de erros, e peça a correção.