Skill: omactiengartelle/concert-poster-generator (version 1.0.0)

--- name: concert-poster-generator description: Generate bold concert posters, gig flyers, music event banners, band promo art, festival posters, club night flyers, and live show announcement designs. Perfect for indie musicians, DJs, venue promoters, Bandcamp artists, and tour managers who need eye-catching cinematic poster artwork in seconds via the Neta AI image generation API (free trial at neta.art/open). tools: Bash --- # Concert Poster Generator Generate bold concert posters, gig flyers, music event banners, band promo art, festival posters, club night flyers, and live show announcement designs. Perfect for indie musicians, DJs, venue promoters, Bandcamp artists, and tour managers who need eye-catching cinematic poster artwork in seconds. ## 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 concert poster generator images. ## Quick start ```bash node concertpostergenerator.js "your description here" --token YOUR_TOKEN ``` ## Options - `--size` — `portrait`, `landscape`, `square`, `tall` (default: `portrait`) - `--ref` — reference image UUID for style inheritance ## Install ```bash npx skills add omactiengartelle/concert-poster-generator ```

path: README.md
content: # Concert Poster Generator

Generate bold, cinematic concert poster artwork from a text description in seconds. Designed for indie musicians, DJs, venue promoters, Bandcamp artists, and tour managers who need eye-catching gig flyers, festival posters, club night banners, and live show announcement designs — all from a short prompt.

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

## Install

Via the ClawHub CLI:

```bash
npx skills add omactiengartelle/concert-poster-generator
```

Or with the ClawHub installer:

```bash
clawhub install concert-poster-generator
```

## Usage

```bash
node concertpostergenerator.js "your prompt here" --token YOUR_TOKEN
```

### Examples

Generate a portrait gig poster:

```bash
node concertpostergenerator.js "midnight synthwave concert poster, neon skyline, cinematic" --token YOUR_TOKEN
```

Generate a landscape festival banner:

```bash
node concertpostergenerator.js "summer indie rock festival poster, sunset crowd, bold typography" \
  --size landscape --token YOUR_TOKEN
```

Inherit style from a reference image:

```bash
node concertpostergenerator.js "underground techno club night flyer" \
  --ref 1234abcd-5678-90ef-uuid --token YOUR_TOKEN
```

Returns a direct image URL.

## Options

| Flag      | Values                                       | Default    | Description                                   |
| --------- | -------------------------------------------- | ---------- | --------------------------------------------- |
| `--size`  | `portrait`, `landscape`, `square`, `tall`    | `portrait` | Output canvas size                            |
| `--token` | string                                       | —          | Your Neta API token (required)                |
| `--ref`   | UUID                                         | —          | Reference image UUID for style inheritance    |

Size dimensions:

- `portrait` — 832 × 1216
- `landscape` — 1216 × 832
- `square` — 1024 × 1024
- `tall` — 704 × 1408

## Token setup

You need a Neta API token to use this skill. Grab a free trial token at <https://www.neta.art/open/>.

Pass the token to the script using the `--token` flag:

```bash
node concertpostergenerator.js "neon punk show poster" --token YOUR_TOKEN
```

You can also expand it from your shell:

```bash
node concertpostergenerator.js "neon punk show poster" --token "$NETA_TOKEN"
```

The `--token` flag is the only way the script accepts your token.

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


path: concertpostergenerator.js
content: #!/usr/bin/env node
import process from 'node:process';

const DEFAULT_PROMPT = 'bold concert poster design, dramatic stage lighting, vibrant typography composition, high contrast cinematic mood, music event flyer aesthetic, eye-catching gig poster art';

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 = argv.slice(2);
  let prompt = null;
  let size = 'portrait';
  let tokenFlag = null;
  let ref = null;

  for (let i = 0; i < args.length; i++) {
    const a = args[i];
    if (a === '--size') {
      size = args[++i];
    } else if (a === '--token') {
      tokenFlag = args[++i];
    } else if (a === '--ref') {
      ref = args[++i];
    } else if (!a.startsWith('--') && prompt === null) {
      prompt = a;
    }
  }

  return { prompt, size, tokenFlag, ref };
}

async function main() {
  const { prompt, size, tokenFlag, ref } = parseArgs(process.argv);

  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 PROMPT = prompt || DEFAULT_PROMPT;

  const dims = SIZES[size];
  if (!dims) {
    console.error(`\n✗ Invalid size: ${size}. Use one of: ${Object.keys(SIZES).join(', ')}`);
    process.exit(1);
  }

  const headers = {
    'x-token': TOKEN,
    'x-platform': 'nieta-app/web',
    'content-type': 'application/json',
  };

  const body = {
    storyId: 'DO_NOT_USE',
    jobType: 'universal',
    rawPrompt: [{ type: 'freetext', value: PROMPT, weight: 1 }],
    width: dims.width,
    height: dims.height,
    meta: { entrance: 'PICTURE,VERSE' },
    context_model_series: '8_image_edit',
  };

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

  console.error(`→ Generating: "${PROMPT}"`);
  console.error(`  Size: ${size} (${dims.width}×${dims.height})`);

  let createRes;
  try {
    createRes = await fetch('https://api.talesofai.com/v3/make_image', {
      method: 'POST',
      headers,
      body: JSON.stringify(body),
    });
  } catch (err) {
    console.error(`\n✗ Network error: ${err.message}`);
    process.exit(1);
  }

  if (!createRes.ok) {
    const text = await createRes.text();
    console.error(`\n✗ make_image failed (${createRes.status}): ${text}`);
    process.exit(1);
  }

  const rawText = await createRes.text();
  let taskUuid;
  try {
    const parsed = JSON.parse(rawText);
    if (typeof parsed === 'string') {
      taskUuid = parsed;
    } else if (parsed && parsed.task_uuid) {
      taskUuid = parsed.task_uuid;
    } else {
      taskUuid = rawText.replace(/^"|"$/g, '');
    }
  } catch {
    taskUuid = rawText.replace(/^"|"$/g, '').trim();
  }

  if (!taskUuid) {
    console.error(`\n✗ No task_uuid in response: ${rawText}`);
    process.exit(1);
  }

  console.error(`  Task: ${taskUuid}`);
  console.error('→ Polling for result...');

  for (let attempt = 0; attempt < 90; attempt++) {
    await new Promise((r) => setTimeout(r, 2000));

    let pollRes;
    try {
      pollRes = await fetch(`https://api.talesofai.com/v1/artifact/task/${taskUuid}`, {
        method: 'GET',
        headers,
      });
    } catch (err) {
      console.error(`  poll error: ${err.message}`);
      continue;
    }

    if (!pollRes.ok) {
      console.error(`  poll failed (${pollRes.status})`);
      continue;
    }

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

    if (status === 'PENDING' || status === 'MODERATION') {
      continue;
    }

    let url = null;
    if (Array.isArray(data.artifacts) && data.artifacts.length > 0) {
      url = data.artifacts[0].url;
    }
    if (!url && data.result_image_url) {
      url = data.result_image_url;
    }

    if (url) {
      console.log(url);
      process.exit(0);
    }

    console.error(`\n✗ Task finished (status=${status}) but no image URL found.`);
    console.error(JSON.stringify(data, null, 2));
    process.exit(1);
  }

  console.error('\n✗ Timed out after 90 attempts (180s).');
  process.exit(1);
}

main().catch((err) => {
  console.error(`\n✗ Unexpected error: ${err.message}`);
  process.exit(1);
});


path: package.json
content: name: concert-poster-generator
version: 1.0.0
type: module
description: Concert Poster Generator — AI-powered concert poster generator ai
license: MIT

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