Skill: blammectrappora/floating-product-generator (version 1.0.0)

--- name: floating-product-generator description: Generate cinematic floating product shots, levitating product photography, and hovering e-commerce images with dramatic studio lighting — perfect for Shopify stores, Amazon listings, dropshipping catalogs, Instagram ads, luxury brand marketing, creator-economy content, and commercial product photography via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Floating Product Generator Generate cinematic floating product shots, levitating product photography, and hovering e-commerce images with dramatic studio lighting — perfect for Shopify stores, Amazon listings, dropshipping catalogs, Instagram ads, luxury brand marketing, creator-economy content, and commercial product photography. ## Token Requires a Neta API token (free trial at <https://www.neta.art/open/>). Pass it via the `--token` flag. ```bash node <script> "your prompt" --token YOUR_TOKEN ``` ## When to use Use when someone asks to generate or create floating product photography generator images. ## Quick start ```bash node floatingproductgenerator.js "your description here" --token YOUR_TOKEN ``` ## Options - `--size` — `portrait`, `landscape`, `square`, `tall` (default: `square`) - `--ref` — reference image UUID for style inheritance ## Install ```bash npx skills add blammectrappora/floating-product-generator ```

path: README.md
content: # Floating Product Generator

Generate cinematic floating product shots from text descriptions — levitating product photography, hovering e-commerce images, and dramatic studio-lit commercial shots, all produced from a short text prompt. Ideal for Shopify stores, Amazon listings, dropshipping catalogs, Instagram ads, luxury brand marketing, creator-economy content, and premium product advertising.

> Powered by the Neta AI image generation API (api.talesofai.com) — the same service as neta.art/open.

## Install

```bash
npx skills add blammectrappora/floating-product-generator
```

Or via ClawHub:

```bash
clawhub install floating-product-generator
```

## Usage

```bash
node floatingproductgenerator.js "luxury perfume bottle" --token YOUR_TOKEN
```

More examples:

```bash
# Portrait-orientation floating sneaker shot
node floatingproductgenerator.js "white minimalist sneaker" --size portrait --token YOUR_TOKEN

# Landscape hero image for a smartwatch
node floatingproductgenerator.js "sleek black smartwatch with metallic band" --size landscape --token YOUR_TOKEN

# Square Instagram-ready skincare bottle
node floatingproductgenerator.js "amber glass serum bottle with gold dropper" --size square --token YOUR_TOKEN

# Inherit style from a reference image
node floatingproductgenerator.js "matte black headphones" --ref 00000000-0000-0000-0000-000000000000 --token YOUR_TOKEN
```

## Options

| Flag      | Description                                                            | Default   |
| --------- | ---------------------------------------------------------------------- | --------- |
| `--token` | Neta API token (required)                                              | —         |
| `--size`  | Image size: `portrait`, `landscape`, `square`, `tall`                  | `square`  |
| `--ref`   | Reference image UUID for style inheritance                             | —         |
| `-h`      | Show help                                                              | —         |

### Sizes

| Name        | Dimensions   |
| ----------- | ------------ |
| `square`    | 1024 × 1024  |
| `portrait`  | 832 × 1216   |
| `landscape` | 1216 × 832   |
| `tall`      | 704 × 1408   |

## Token setup

This skill requires a Neta API token (free trial available at <https://www.neta.art/open/>).

Pass it via the `--token` flag:

```bash
node <script> "your prompt" --token YOUR_TOKEN
```

## Output

Returns a direct image URL.

## How it works

The skill takes your short text description, appends a curated cinematic-product-photography prompt suffix, and sends it to the Neta AI image generation API. It then polls the task endpoint until the image is ready and prints the resulting URL to stdout.



path: floatingproductgenerator.js
content: #!/usr/bin/env node
// Floating Product Generator — cinematic floating product photography via Neta AI
// Usage: node floatingproductgenerator.js "your prompt" --token YOUR_TOKEN [--size square] [--ref UUID]

const API_BASE = 'https://api.talesofai.com';

const DEFAULT_PROMPT_SUFFIX =
  'professional product photography, product floating and hovering in mid-air, dramatic cinematic lighting, studio backdrop with soft gradient, crisp shadows, commercial advertising shot, ultra detailed, high-end e-commerce photography, sharp focus, premium brand aesthetic';

const SIZES = {
  square: { width: 1024, height: 1024 },
  portrait: { width: 832, height: 1216 },
  landscape: { width: 1216, height: 832 },
  tall: { width: 704, height: 1408 },
};

function parseArgs(argv) {
  const args = { _: [] };
  for (let i = 0; i < argv.length; i++) {
    const a = argv[i];
    if (a === '--size') args.size = argv[++i];
    else if (a === '--token') args.[REDACTED_SECRET];
    else if (a === '--ref') args.ref = argv[++i];
    else if (a === '--help' || a === '-h') args.help = true;
    else args._.push(a);
  }
  return args;
}

function printHelp() {
  console.log(`Floating Product Generator

Usage:
  node floatingproductgenerator.js "your prompt" --token YOUR_TOKEN [options]

Options:
  --token <token>   Neta API token (required) — get one at https://www.neta.art/open/
  --size <size>     portrait | landscape | square | tall  (default: square)
  --ref <uuid>      Reference image UUID for style inheritance
  -h, --help        Show this help

Example:
  node floatingproductgenerator.js "luxury perfume bottle" --token "$NETA_TOKEN"
`);
}

async function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function createTask({ token, prompt, width, height, ref }) {
  const body = {
    storyId: 'DO_NOT_USE',
    jobType: 'universal',
    rawPrompt: [{ type: 'freetext', value: prompt, weight: 1 }],
    width,
    height,
    meta: { entrance: 'PICTURE,VERSE' },
    context_model_series: '8_image_edit',
  };

  if (ref) {
    body.inherit_params = {
      collection_uuid: ref,
      picture_uuid: ref,
    };
  }

  const res = await fetch(`https://api.talesofai.com/v3/make_image`, {
    method: 'POST',
    headers: {
      'x-token': token,
      'x-platform': 'nieta-app/web',
      'content-type': 'application/json',
    },
    body: JSON.stringify(body),
  });

  if (!res.ok) {
    const text = await res.text();
    throw new Error(`make_image failed: ${res.status} ${res.statusText} — ${text}`);
  }

  const text = await res.text();
  let taskUuid;
  try {
    const parsed = JSON.parse(text);
    taskUuid = typeof parsed === 'string' ? parsed : parsed.task_uuid;
  } catch {
    taskUuid = text.trim().replace(/^"|"$/g, '');
  }

  if (!taskUuid) {
    throw new Error(`No task_uuid in response: ${text}`);
  }
  return taskUuid;
}

async function pollTask({ token, taskUuid }) {
  const maxAttempts = 90;
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
    const res = await fetch(`https://api.talesofai.com/v1/artifact/task/${taskUuid}`, {
      headers: {
        'x-token': token,
        'x-platform': 'nieta-app/web',
        'content-type': 'application/json',
      },
    });

    if (!res.ok) {
      const text = await res.text();
      throw new Error(`poll failed: ${res.status} ${res.statusText} — ${text}`);
    }

    const data = await res.json();
    const status = data.task_status;

    if (status && status !== 'PENDING' && status !== 'MODERATION') {
      const url =
        (Array.isArray(data.artifacts) && data.artifacts[0] && data.artifacts[0].url) ||
        data.result_image_url;
      if (!url) {
        throw new Error(`Task finished with status ${status} but no image URL found`);
      }
      return url;
    }

    await sleep(2000);
  }
  throw new Error('Timed out waiting for image generation');
}

async function main() {
  const args = parseArgs(process.argv.slice(2));

  if (args.help) {
    printHelp();
    process.exit(0);
  }

  const tokenFlag = args.token;
  const [REDACTED_SECRET];

  if (!TOKEN) {
    console.error('\n✗ Token required. Pass via: --token YOUR_TOKEN');
    console.error('  Get yours at: https://www.neta.art/open/');
    process.exit(1);
  }

  const userPrompt = args._[0];
  if (!userPrompt) {
    console.error('\n✗ Prompt required. Usage: node floatingproductgenerator.js "your prompt" --token YOUR_TOKEN');
    process.exit(1);
  }

  const sizeKey = (args.size || 'square').toLowerCase();
  const size = SIZES[sizeKey];
  if (!size) {
    console.error(`\n✗ Invalid size: ${sizeKey}. Must be one of: ${Object.keys(SIZES).join(', ')}`);
    process.exit(1);
  }

  const fullPrompt = `${userPrompt}, ${DEFAULT_PROMPT_SUFFIX}`;

  try {
    console.error(`→ Generating floating product image (${size.width}×${size.height})...`);
    const taskUuid = await createTask({
      token: TOKEN,
      prompt: fullPrompt,
      width: size.width,
      height: size.height,
      ref: args.ref,
    });
    console.error(`→ Task created: ${taskUuid}`);
    console.error(`→ Polling for result...`);
    const imageUrl = await pollTask({ token: TOKEN, taskUuid });
    console.log(imageUrl);
    process.exit(0);
  } catch (err) {
    console.error(`\n✗ ${err.message}`);
    process.exit(1);
  }
}

main();


path: package.json
content: name: floating-product-generator
version: 1.0.0
type: module
description: Floating Product Generator — AI-powered floating product photography generator ai
license: MIT

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)