npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

adforge

v0.3.4

Published

Brief-to-live-ad pipeline for Meta — runs inside Claude Code, Codex, or any agent. Static + motion creatives, idempotent deploy.

Readme

adforge

Brief-to-live-ad pipeline for Meta. Runs inside your agent (Claude Code, Codex, Cursor).

adforge turns a one-line brief into rendered creatives and, with approval, live Meta ads. It's an opinionated pipeline, not a framework — PIL + Remotion for rendering, a small idempotent Meta adapter for deploy, and markdown skills that orchestrate the agent you already use.

Prerequisites

adforge degrades gracefully — you can start without any keys and still render creatives locally. Here's what unlocks what:

Runtime (required):

  • Node 18+
  • Python 3 with Pillow (pip install Pillow)
  • ffmpeg (for motion renders)

Meta deploy keys (optional — unlock live ads):

| Key | What it unlocks | How to get it | |-----|-----------------|---------------| | META_ACCESS_TOKEN | Deploy to Meta, review performance, pause/scale ads | Meta Business → System User token with ads_management + pages_read_engagement scopes | | META_AD_ACCOUNT_ID | Same as above — target account | Ads Manager → Account Settings (format: act_1234...) | | META_PAGE_ID | Page to run ads from | Your FB page → About → Page ID | | META_PIXEL_ID (optional) | Conversion-optimized campaigns | Events Manager → Data Sources → Pixel ID |

Image-generation keys (optional — any one unlocks AI heroes):

adforge is provider-neutral. Drop any one of the keys below into .env and generation works end-to-end. Auto-detection order is BFL → Google → OpenAI → Replicate → Stability → fal; force a specific provider with IMAGE_PROVIDER=<name>, swap the default model per provider via <PROVIDER>_MODEL.

| Key | Provider | Default model | Get a key | |-----|----------|---------------|-----------| | BFL_API_KEY | Black Forest Labs (FLUX) | flux-2-pro | dashboard.bfl.ai/keys | | GEMINI_API_KEY | Google Gemini / Nano Banana | gemini-2.5-flash-image | aistudio.google.com/apikey | | OPENAI_API_KEY | OpenAI Images | gpt-image-1 | platform.openai.com/api-keys | | REPLICATE_API_TOKEN | Replicate | google/nano-banana-2 | replicate.com/account/api-tokens | | STABILITY_API_KEY | Stability AI | stable-image-core | platform.stability.ai/account/keys | | FAL_KEY | fal.ai | fal-ai/flux/schnell | fal.ai/dashboard/keys |

Bringing a provider not on this list (Mistral, Ideogram, Azure OpenAI, Bedrock, Cloudflare Workers AI, a self-hosted Comfy endpoint, …)? Ask the agent to run image-provider-synth — it reads the provider's official docs and writes a new adapter under engines/static/image_providers/<name>.py that the dispatcher picks up automatically.

Without any image-generation key: creatives still render — set hero_mode: "flat_brand_color" in variants. Fine for MVP.

Without any keys at all: you can still scaffold, render static + motion creatives, and iterate locally. You just can't deploy to Meta or auto-generate heroes inside the pipeline.

Install

npx adforge init my-ads
cd my-ads
cp .env.example .env        # fill in keys

Then open the project in your agent of choice:

claude                      # Claude Code → /adforge
codex                       # Codex CLI   → "start adforge"
cursor .                    # Cursor      → "start adforge"

The agent reads .claude/skills/adforge/SKILL.md (or AGENTS.md for Codex) and runs the hub.

What you get

  • 4 user modes — new-campaign, add-creative, review-performance, setup
  • Examples, not templates — static example layouts (advertorial / stat-card / quote-card) and motion example compositions (ops-console / product-mockup / walkthrough / phone-notifications) sit in engines/static/examples/ and engines/motion/src/examples/. They're reference implementations — show the agent a reference creative or describe what you want and layout-synth / motion-synth drafts a new module on the spot. Auto-registered as soon as the file lands.
  • Motion primitivesengines/motion/src/primitives/ owns the motion vocabulary (Kicker, Headline, Cursor+ClickRipple, Ticker, TypewriterField, ChromeOverlay). Compositions assemble from primitives instead of re-implementing them, so new compositions stay structurally distinct from existing ones.
  • Opt-in brand chrome — by default, every creative is a naked canvas. If you want a wordmark or logo on every ad, declare it once in brand.json → chrome.wordmark (text or image, any of 6 corner positions). Two brands running the same layout won't produce ads that look identical unless both opt in to the same chrome.
  • Bring your own creative — if you already have finished PNGs/MP4s, skip compose entirely; deploy.py takes any asset path.
  • Meta adapter — deploy, review, actions (pause / resume / scale / delete), idempotent by name via .adforge/state.json
  • Brand tokens — one brand.json drives both Python and Remotion
  • Fonts handled during setup — agent reads your website's font-family, auto-downloads matching Google Fonts into ./fonts/, or falls back to a sane default trio. TTFs feed both engines; missing files fall back to PIL default / CSS generic instead of crashing.
  • Agent-portable — plain markdown skills. No runtime you have to trust.

Try this

adforge doesn't ship a fixed catalog of ad types. The example layouts and compositions are starting points — the agent synthesizes new ones on the spot. A few things people have done that the stock examples don't cover:

  • "Turn my app screenshots into a product walkthrough." Drop a few PNGs into assets/, describe the order, get a motion ad that pans across screens with on-brand captions. No Figma, no After Effects.
  • "A founder quote with my photo, background removed, and a speech bubble saying X." Agent removes the background ad-hoc (rembg, Photoshop, whatever), drafts a new founder-quote layout, renders 4x5 + 9x16 in one pass.
  • "Match this competitor ad but in my brand." Paste a screenshot. The layout-synth skill reads the structure, writes a new layout module, and renders it against your brand.json — colors, fonts, voice, all yours.

None of these are hardcoded features. They're what falls out of: a registry that auto-discovers new example modules + motion primitives the agent assembles from + ad-hoc asset prep (rembg, Flux, Photoshop, whatever). If you can describe it, it's usually a 2-minute synth loop away.

Why it exists

Running ads manually is tedious: assembling creatives in Canva or Figma, writing copy from scratch, keeping every variant on brand, uploading to Ads Manager one by one, and then circling back every few days to read the same insights screen. Most of that is mechanical.

And every time you touch a new agent or a new ad account, you end up rebuilding the same 6 things: a brief flow, a couple of static templates, a motion template, a Meta deploy script that doesn't duplicate ads, a review loop, a state file.

adforge is that stack, extracted once, reusable. Tell an agent what you want, get rendered creatives on-brand, deploy idempotently, review in the same session.

Commands

npx adforge init <dir>            # scaffold a new project
npx adforge upgrade [--dry-run]   # pull template updates into an existing project
npx adforge doctor                # check Python, Node, ffmpeg, env vars
npx adforge --version

adforge upgrade compares every template-layer file against the recorded hash in .adforge/manifest.json. Pristine files get overwritten in place; locally-edited files get a .new sibling so you can diff at your own pace. User-owned files (brand.json, variants/, outputs/, .env) are never touched.

Everything else — rendering, deploying, reviewing — happens through the agent, or directly via the scripts in engines/ and adapters/.

Project shape (after init)

adforge.config.json                   engine + adapter registry
brand.json                            colors, fonts, voice, optional chrome
variants/                             one JSON per creative
engines/static/examples/              reference PIL layouts (advertorial, stat-card, …)
engines/static/shared.py              composer primitives + apply_chrome
engines/motion/src/primitives/        Remotion primitives (Kicker, Headline, …)
engines/motion/src/examples/          reference compositions (ops-console, walkthrough, …)
adapters/meta/                        deploy, review, actions
assets/                               brand assets (logo.png, hero images, …)
outputs/                              rendered PNGs and MP4s
.adforge/state.json                   Meta IDs keyed by name
.claude/skills/                       agent skills (hub + modes + synth + backend)
AGENTS.md                             Codex / Cursor entry

Status

Early. Works for the workflows above. No non-Meta channels yet — the adapter layer is deliberately thin so forks can add TikTok, LinkedIn, Google, etc. PRs welcome.

License

MIT