{"id":50518808,"url":"https://github.com/nyldn/img","last_synced_at":"2026-06-03T02:04:33.577Z","repository":{"id":354951392,"uuid":"1226185595","full_name":"nyldn/img","owner":"nyldn","description":"Claude Code and Codex plugin for OpenAI GPT Image 2 and Gemini 3.1 Flash Image Preview.","archived":false,"fork":false,"pushed_at":"2026-05-01T17:29:46.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T17:29:59.699Z","etag":null,"topics":["claude-code-plugin","codex-plugin","gemini","gpt-image-2","image-generation"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nyldn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-01T04:26:14.000Z","updated_at":"2026-05-01T17:29:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nyldn/img","commit_stats":null,"previous_names":["nyldn/open-image","nyldn/img"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/nyldn/img","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyldn%2Fimg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyldn%2Fimg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyldn%2Fimg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyldn%2Fimg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nyldn","download_url":"https://codeload.github.com/nyldn/img/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nyldn%2Fimg/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33844702,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code-plugin","codex-plugin","gemini","gpt-image-2","image-generation"],"created_at":"2026-06-03T02:04:32.621Z","updated_at":"2026-06-03T02:04:33.557Z","avatar_url":"https://github.com/nyldn.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🖼️ Image Agency\n\nImage generation for Claude Code, Codex, and the terminal. Built for brand and agency teams who need on-brand assets across one or many client projects.\n\nCalls one of two providers, with **no automatic fallback**:\n\n- OpenAI `gpt-image-2`\n- Google `gemini-3.1-flash-image-preview`\n\nThe plugin also ships a small attributed prompt-recipe index generated from\ndev-only research checkouts. Claude and Codex can query it with `img recipes`\nbefore writing the final provider prompt.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/demo.gif\" alt=\"Image Agency demo showing Claude /img, Codex $img, planning, setup, and generated asset workflow\" width=\"720\"\u003e\n\u003c/p\u003e\n\n---\n\n## Contents\n\n- [Install](#install)\n- [Setup](#setup)\n- [Use cases](#use-cases)\n- [CLI reference](#cli-reference)\n- [Configuration](#configuration)\n- [Troubleshooting](#troubleshooting)\n- [Uninstall](#uninstall)\n- [Develop and contribute](#develop-and-contribute)\n- [License](#license)\n\n---\n\n## Install\n\nThe recommended install is CLI-first. It gives you a real `img` terminal command,\nthen uses that command to install the native Claude Code and Codex marketplace\nplugins when those CLIs are present.\n\n### 1. Recommended: npm CLI + agent plugins\n\n```bash\nnpx -y @nyldn.sh/install-img\n```\n\nThe installer installs the `img` CLI, opens the interactive setup control panel,\nthen registers native Claude Code and Codex plugins.\n\nIf you prefer to run the transparent npm steps yourself:\n\n```bash\nnpm install -g @nyldn.sh/img\nimg setup\nimg install\n```\n\nThe `img` package still bootstraps first-run user setup files non-interactively\nduring npm install, but it does not open the control panel inside npm because npm\npostinstall TTYs are unreliable across terminals. It also does not scan the\ncurrent project during npm install; project discovery runs only from explicit\nsetup commands.\n\nIf you skipped lifecycle scripts, `img setup` creates the same user files.\n\nIf you need to install directly from source instead of npm registry:\n\n```bash\nnpm install -g https://github.com/nyldn/img.git\n```\n\n`img install` detects Claude Code and Codex, adds the shared `nyldn-plugins`\nmarketplace, installs what each CLI can install non-interactively, removes the\nlegacy generated Claude user `/img` alias if present, and opens the interactive\nsetup panel on first install when a real terminal is available.\n\nUse explicit targets when needed:\n\n```bash\nimg install claude\nimg install codex\nimg install --no-setup\n```\n\nAfter install, run the setup panel any time:\n\n```bash\nimg setup\n```\n\n### 2. Claude Code marketplace-only\n\nRun this in your terminal, not inside a Claude Code session:\n\n```bash\nclaude plugin marketplace add https://github.com/nyldn/plugins.git\nclaude plugin install img@nyldn-plugins\n```\n\n`nyldn-plugins` is a shared marketplace catalog at\n`https://github.com/nyldn/plugins.git`, and it makes both plugins available:\n\n```bash\nclaude plugin install img@nyldn-plugins\n```\n\nMarketplace-only installs provide the bundled plugin binary and namespaced\ncommands. For the best local setup experience, use the npm flow above so `img\nsetup` is available on `$PATH`.\n\nThen start or restart Claude Code and run a normal image request:\n\n```text\n/img a clean app icon for a savings tracker\n```\n\nIf the provider key is missing, `/img` creates user setup files and tells you the\nexact terminal command to save the key in macOS Keychain before you re-run the\nsame request. The key is read by the local `img` binary, not by Claude.\n\nThe plugin calls its bundled `bin/img`; a global CLI install is not required for Claude marketplace commands.\n\n| Command | What it does |\n|---|---|\n| `/img \u003cnatural language\u003e` | Default generation. OpenAI `gpt-image-2`. |\n| `/img setup` | Pre-create or refresh setup files and health checks. |\n| `/img:setup` | Pre-create or refresh setup files and health checks. |\n| `/img:openai \u003cprompt\u003e` | Force OpenAI. |\n| `/img:gemini \u003cprompt\u003e` | Force Gemini. |\n| `/img:edit --input \u003cpath\u003e [--provider openai\\|gemini] \u003cprompt\u003e` | Edit/restyle a reference image. |\n\nClaude exposes the marketplace plugin's `/img` command directly. The namespaced\n`/img:*` forms remain available for explicit setup, provider, and edit flows.\n\n### 3. Codex marketplace-only\n\n```bash\ncodex plugin marketplace add https://github.com/nyldn/plugins.git\n```\n\n`nyldn-plugins` is the same shared catalog used by Claude. In Codex it lists\n`claude-octopus` and `img`.\n\nRestart Codex, open `/plugins`, then install or enable `img`. Use it as a natural-language skill:\n\n```text\n$img create three on-brand article header images for this project\n```\n\nIf you want to type `img ...` directly in a terminal or in Codex shell commands,\nuse the npm install from the recommended path.\n\n### 4. Local development\n\nInstall from source:\n\n```bash\ngit clone https://github.com/nyldn/img.git\ncd img\nnpm link\nnpm install\nnpm test\nclaude --plugin-dir \"$(pwd)\"\n```\n\n---\n\n## Setup\n\nFor the default path, no separate setup command is required before the first\nrequest. If an API key is missing, the first real generation creates:\n\n- `~/.config/img/.env.local`\n- `~/.config/img/config.json`\n\nThen save the reported key in macOS Keychain and re-run the same `/img` or\n`img` request:\n\n```bash\nimg key set openai\n```\n\nUse `img key set gemini` only if you want Gemini generation too. The command\nprompts securely in your terminal and does not print the key.\n\nRun setup manually when you want the interactive control panel, a preflight\ncheck, refreshed user files, or a shared project `img.config.json`:\n\n```bash\nimg activate          # prints the loader banner\nimg setup             # opens the terminal setup control panel\nimg check-health      # verifies install end-to-end\n```\n\nIn Claude Code, use `/img setup` or `/img:setup`. Claude cannot host the rich\ncontrol panel directly inside its Bash tool, so the command asks macOS Terminal\nto open `img setup`, then returns setup and health JSON for a readable Claude\nsummary.\n\nThe setup panel can manage:\n\n- OpenAI and Gemini keys through macOS Keychain.\n- Personal defaults such as provider, output directory, image count, format, and quality.\n- Project defaults such as brand pre-prompts, negative prompts, brand colors, and references.\n- Asset presets for repeatable hero, feature, social, ad, or batch image generation.\n- Prompt previews and health checks.\n\n`img setup` chooses scope based on cwd:\n\n- **Inside a git repo** -\u003e creates user files **and** project `img.config.json`\n- **Outside a git repo** -\u003e user files only\n\nWhen project setup creates a new `img.config.json`, img looks for local\nbrand/design/DLS/token docs such as `brand.md`, `design.md`, `dls.md`, and\ntheme/token CSS files. It seeds `brand.colors` from discovered `#hex` colors and\nadds those files to `brand.references`. It skips dependency and build folders\nsuch as `node_modules`, `dist`, and `.next`.\n\nForce a scope:\n\n```bash\nimg setup --user      # personal machine defaults only\nimg setup --project   # shared project config only (commit this)\nimg setup --both      # both, even outside a repo\n```\n\n### Where things live\n\n| File | Purpose | Commit? |\n|---|---|---|\n| `~/.config/img/.env.local` | API keys | **Never** |\n| `~/.config/img/config.json` | Personal defaults (provider, output dir, prompts) | No |\n| `\u003cproject\u003e/img.config.json` | Shared brand prompts, asset types, destinations, cost limits | **Yes** |\n| `\u003cproject\u003e/.env`, `.env.local` | Project-specific keys (rarely needed) | Never |\n\n### Keys\n\nPreferred on macOS:\n\n```bash\nimg key set openai   # prompts securely and stores OPENAI_API_KEY in Keychain\nimg key status       # verifies presence without printing values\n```\n\nThis lets Claude Code and Codex run `img` without receiving or storing the\nsecret themselves. The local CLI reads the key from macOS Keychain at runtime.\n\nFor CI, Linux, or machines without Keychain, add at least one key to\n`~/.config/img/.env.local`. The file is created by the first missing-key\ngeneration or by `img setup`:\n\n```bash\nOPENAI_API_KEY=sk-...\nGEMINI_API_KEY=...\n```\n\n`OPENAI_API_KEY` is required for the default `/img` path. `GEMINI_API_KEY` is only needed for `/img:gemini` and Gemini-based edits.\n\nVerify:\n\n```bash\nimg check-health\n```\n\nReports config layers, key presence (without printing values), output writability, brand reference existence, and project-config status. Run after any `setup` or config change.\n\nFull setup reference: [`docs/setup-file.md`](docs/setup-file.md).\n\n### Prompt Recipes\n\nUse `img recipes` to inspect the bundled research index before writing a\ncomplex prompt:\n\n```bash\nimg recipes \"product hero website banner\" --model-family openai --limit 4\nimg recipes \"reference image restyle diagram\" --model-family gemini --json\n```\n\nRecipes include source repository, URL, commit, license, attribution, model\nfamily, category, use case, prompt template, and variables. They are generated\nfrom local dev checkouts under `dependencies/`; those upstream repos are not\nbundled in the npm package.\n\n---\n\n## Use cases\n\n### Quick one-off (no project context)\n\nOutside a repo, run from anywhere on `$PATH`:\n\n```bash\nimg generate a photorealistic 2:1 image of a dog wearing a denim jacket\n```\n\nSaves to `./img-output/` or `IMG_OUTPUT_DIR`.\n\n### Inside a Claude Code session\n\n```text\n/img a clean, minimal app icon for a savings tracker, flat design, mint green\n```\n\nThe plugin keeps your aspect, style, and subject words in the prompt. No flag translation.\n\n### Restyle a reference image\n\n```bash\nimg --provider gemini --input ./hero-photo.jpg --prompt \"soften the lighting, make it warmer, keep the composition\"\n```\n\nOr in Claude:\n\n```text\n/img:edit --provider gemini --input ./hero-photo.jpg soften the lighting, make it warmer\n```\n\n### Brand-consistent assets across a project\n\nInside a git repo with `img.config.json` configured:\n\n1. Set brand pre-prompts, negative prompts, and colors in `img.config.json`:\n   ```json\n   {\n     \"brand\": {\n       \"prePrompts\": [\n         \"Use a restrained, premium editorial visual style.\",\n         \"Match the existing site palette.\"\n       ],\n       \"negativePrompts\": [\"No watermarks.\", \"No stock-photo cliches.\"],\n       \"colors\": {\n         \"color1\": \"#123456\",\n         \"color2\": \"#ffcc00\"\n       }\n     }\n   }\n   ```\n2. Run any generation. Brand prompts are auto-composed before the user request:\n   ```text\n   /img three feature-card illustrations for the pricing page\n   ```\n3. Teammates inherit the same brand prompts after `git pull`.\n\nUse asset type `count` defaults for repeatable batch generation:\n\n```json\n{\n  \"assetTypes\": {\n    \"hero\": {\n      \"aliases\": [\"homepage hero\"],\n      \"aspect\": \"16:9\",\n      \"count\": 3,\n      \"style\": \"Use a wide editorial website hero composition.\",\n      \"outputDir\": \"public/generated/hero\"\n    }\n  }\n}\n```\n\n### Multiple clients\n\nKeep one `img.config.json` per client repo. User-level `~/.config/img/config.json` holds personal defaults that apply across all clients.\n\n### Dry-run before spending credits\n\n```bash\nimg --dry-run --provider openai --prompt \"...\"\n```\n\nPrints provider, model, endpoint, composed prompt, output dir, and resolved config files. No API call.\n\n### Cost ceiling for a project\n\nIn `img.config.json`:\n\n```json\n{\n  \"limits\": {\n    \"maxImagesPerRun\": 6,\n    \"maxCostPerRunUsd\": 5\n  }\n}\n```\n\n`maxImagesPerRun` is enforced against `--count`. `maxCostPerRunUsd` is currently informational (cost estimation lands with the planning command).\n\n---\n\n## CLI reference\n\n```bash\nimg activate                                # print loader banner\nimg install [claude|codex|all]              # install native agent plugins\nimg install --no-setup                      # install plugins without opening setup\nimg setup [--user|--project|--both]         # open setup panel or return JSON in non-TTY\nimg setup --open-terminal                   # open the rich setup panel in macOS Terminal\nimg recipes \"product hero\"                  # search bundled attributed prompt recipes\nimg recipes \"poster\" --model-family openai --limit 4 --json\nimg key status                              # inspect key presence without values\nimg key set openai                          # save OPENAI_API_KEY in macOS Keychain\nimg key set gemini                          # save GEMINI_API_KEY in macOS Keychain\nimg key delete openai                       # remove a saved Keychain key\nimg check-health                            # diagnose install end-to-end\nimg \u003cnatural language\u003e                      # generate via OpenAI gpt-image-2\nimg --provider openai|gemini --prompt \"...\" # explicit provider\nimg --provider gemini --input REF.png --prompt \"...\"   # edit/restyle\nimg --dry-run --prompt \"...\"                # validate without API call\nimg --help                                  # full flag list\n```\n\nCommon flags:\n\n| Flag | Purpose |\n|---|---|\n| `--provider openai\\|gemini` | Pick provider (default: config or `openai`) |\n| `--asset-type VALUE` | Use a configured asset type id or alias |\n| `--prompt`, `-p` | Prompt text |\n| `--input`, `-i` | Reference image (repeat for multiple) |\n| `--mask` | OpenAI edit mask |\n| `--out`, `-o` | Output dir (default: `./img-output`) |\n| `--count`, `-n` | Number of images (1-12, capped by `limits.maxImagesPerRun`) |\n| `--size` | OpenAI: `auto\\|1024x1024\\|1536x1024\\|1024x1536` |\n| `--quality` | OpenAI: `auto\\|low\\|medium\\|high` |\n| `--format` | OpenAI: `png\\|jpeg\\|webp` |\n| `--aspect` | Gemini: `1:1\\|16:9\\|9:16\\|4:3\\|3:4\\|...` |\n| `--image-size` | Gemini: `1K\\|2K\\|4K` |\n| `--config FILE` | Explicit config file |\n| `--env-file FILE` | Explicit env file |\n| `--cwd DIR` | Resolve config/env relative to DIR |\n| `--dry-run` | Validate options, print request metadata, no API call |\n| `--open` | Open the first saved image in the OS viewer |\n\nProvider-specific notes: [`docs/providers.md`](docs/providers.md).\n\n---\n\n## Configuration\n\nLayers, highest precedence first:\n\n1. CLI flags\n2. Nearest project `img.config.json` (walked up from `cwd` to git root)\n3. User `~/.config/img/config.json`\n4. Plugin defaults\n\nEnv values already set in the shell or agent process win. Missing values are filled from:\n\n1. `--env-file FILE`\n2. Nearest project `.env.local`\n3. Nearest project `.env`\n4. User `~/.config/img/.env.local`\n\nArrays (e.g. `prompt.prePrompts`) append from low to high precedence and dedupe by string equality. Use `mergeMode: \"replace\"` on the enclosing object to override instead of append.\n\nFull config schema and field-by-field docs: [`docs/setup-file.md`](docs/setup-file.md), [`schemas/config.schema.json`](schemas/config.schema.json).\n\n---\n\n## Troubleshooting\n\n### `command not found: img`\n\nThe terminal CLI is not on `$PATH`. This affects direct shell usage and Codex shell commands. Claude Code commands use the plugin-local binary and do not need a global CLI.\n\nFix:\n```bash\nnpm install -g @nyldn.sh/img\ncommand -v img\n```\n\nFor source installs, use `npm install -g https://github.com/nyldn/img.git`; for\nlocal checkouts, run `npm link` from the repo.\n\n### Claude says `Marketplace file not found`\n\nUse the full GitHub URL from a terminal:\n\n```bash\nclaude plugin marketplace add https://github.com/nyldn/plugins.git\nclaude plugin install img@nyldn-plugins\n```\n\nThen restart Claude Code and run `/img` with a natural-language request.\n\nIf you previously tried `/plugin marketplace add nyldn/img` inside Claude Code, remove that failed marketplace entry if it appears in `claude plugin marketplace list`, then add the full URL again from the terminal.\n\n### `img` or `octo` fails after adding another nyldn marketplace\n\nClaude indexes marketplaces by manifest `name`. If your machine has an older\nstandalone `nyldn-plugins` entry, re-add the shared catalog and reinstall the\nplugins you use:\n\n```bash\nclaude plugin marketplace remove nyldn-plugins\nclaude plugin marketplace add https://github.com/nyldn/plugins.git\nclaude plugin install img@nyldn-plugins\nclaude plugin install octo@nyldn-plugins\n```\n\n### `OPENAI_API_KEY is required for --provider openai`\n\nThe key is missing from macOS Keychain, every env-file layer, and `process.env`.\nOn first real generation, img creates user setup files and reports the exact\nprovider key it needs.\n\nPreferred fix on macOS:\n\n```bash\nimg key set openai\nimg key status\n```\n\nFallback for CI or non-macOS machines:\n\n```bash\necho 'OPENAI_API_KEY=sk-...' \u003e\u003e ~/.config/img/.env.local\nchmod 600 ~/.config/img/.env.local\n```\n\nor pass an explicit env file:\n```bash\nimg --env-file ./.env.openai --prompt \"...\"\n```\n\nVerify with `img check-health`.\n\n### Slash command runs but image not saved\n\nRun with `--dry-run` to confirm config is what you expect:\n\n```bash\nimg --dry-run --prompt \"...\"\n```\n\nCheck the printed `outputDir`, `apiPrompt`, `configFile`. If `outputDir` is wrong, set `outputDir` in the closest `img.config.json` or pass `-o`.\n\n### Provider returned 4xx / 5xx\n\nErrors are reported as structured JSON with `provider`, `status`, `code`, `requestId`, and a `hint`. Read the hint first — it covers the common causes (auth, rate limit, invalid params, region restrictions). `img` never falls back to the other provider.\n\n```bash\nimg --provider gemini --prompt \"...\"   # if this fails\nimg --provider openai --prompt \"...\"   # try this manually, do not assume fallback\n```\n\n### Gemini `finishReason: SAFETY`\n\nGemini blocked the prompt or input image. Revise wording or swap the reference. Reported as `code: SAFETY_BLOCKED`.\n\n### Schema warning: \"config has unknown top-level field\"\n\nYou wrote a field name not in the allowlist. Either fix the typo or check the supported keys in `schemas/config.schema.json`. Warning only — does not block execution.\n\n### Schema warning: \"config is legacy v1 without schemaVersion\"\n\nAdd `\"schemaVersion\": 1` to your `img.config.json`. Warning only.\n\n### Plugin commands appear in Claude but do nothing\n\nRestart Claude Code. Plugin manifests are loaded on session start.\n\n### Conflicts with other plugins / aliases\n\nRun `img install claude` or `./scripts/install-claude.sh` again to remove the\ngenerated legacy user `/img` alias. The namespaced forms `/img:setup`,\n`/img:edit`, `/img:openai`, and `/img:gemini` remain available.\n\n### `img check-health` reports project root not found\n\nYou ran outside a git repo. Either `git init` the project, or pass `--cwd` to a directory that is inside one. User-level config will still apply.\n\n### Brand reference path warnings\n\n`brand.references` in your config points to files that do not exist in the project. Either remove the entry or create the file. Warning only.\n\n---\n\n## Uninstall\n\n### Claude Code plugin\n\n```text\nclaude plugin uninstall img@nyldn-plugins\n```\n\nOnly remove `nyldn-plugins` if you are not using other nyldn plugins such as\n`octo`.\n\nIf an older install created a duplicate user command:\n\n```bash\nimg install claude\n```\n\n### Codex plugin\n\nIn Codex, open `/plugins`, disable and remove `img`. Then:\n\n```bash\ncodex plugin marketplace remove nyldn-plugins\n```\n\n### CLI\n\n```bash\nnpm uninstall -g @nyldn.sh/img\n```\n\n### User config and secrets\n\n```bash\nrm -rf ~/.config/img        # personal defaults + API keys\n```\n\n### Project config\n\n`img.config.json` and any project `.env*` files live in your repo. Delete or commit-revert as you would any other tracked file.\n\n---\n\n## Develop and contribute\n\n```bash\ngit clone https://github.com/nyldn/img.git\ncd img\nnpm install\nnpm test                 # runs node --test against tests/*.test.mjs\nnpm run validate         # checks plugin structure and manifests\nnpm run smoke            # dry-run both providers (no API calls, no key needed)\n```\n\nCI runs the same three on each push. See [`.github/workflows/`](.github/workflows/).\n\nDemo GIF is generated with [VHS](https://github.com/charmbracelet/vhs):\n\n```bash\nvhs docs/demo/img-demo.tape\n```\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnyldn%2Fimg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnyldn%2Fimg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnyldn%2Fimg/lists"}