I built a Homebrew for AI skills: install flow and eval harness inside A developer built SkillForge, an open-source tool that installs AI coding skills like Homebrew packages, using two pip commands. The tool generates stack-specific skills named after their target technologies, such as 'backend-fastapi-postgres', rather than generic persona-based skills. SkillForge runs locally, binds to 127.0.0.1, ships no telemetry, and supports six LLM provider families. Last quarter I spent an afternoon writing a SKILL.md for backend FastAPI work by hand. By the time I had a usable prompt set, three templates, and a config file, I realized nobody else on the team would ever do this. Engineering skills are either too rigid, a hand-written prompt for one specific stack, or too generic, a "full-stack" skill that tells you to "use best practices." The GPT Store proved the failure mode in public: when quality is not measurable, prompt wrappers win and nobody comes back. SkillForge is my attempt at a fix. Install is two pip commands and a serve: cd apps/api && pip install -e ". dev " cd ../cli && pip install -e . skillforge serve --build-web → http://localhost:8000 The thing I kept hitting was the category axis. I wanted a skill for a specific stack, FastAPI plus Postgres plus Alembic plus pytest plus Docker, but every skill marketplace wanted me to pick a category first. Categories are the wrong axis. Skills should be named after the stack they target, the way Homebrew formulae are named after the binary they install. A skill called backend-fastapi-postgres is honest about what it does. A skill called "Senior Backend Engineer" is vibes. The GPT Store angle was the other half. When you cannot measure skill quality, the people who optimize for thumbnails win. The people who optimize for output leave. The marketplace fills with wrappers and stays that way. Flip the workflow. Describe the need in plain English. The planner picks the tools and explains each pick. The generator produces a focused skill. Skills are named for their stack, not for a persona: backend-fastapi-postgres , data-airflow-dbt-bigquery , devops-kubernetes-helm-terraform , ai-rag-langchain-pgvector , observability-opentelemetry-grafana , web-scraping-python-playwright . Local-first means local-first. SkillForge binds to 127.0.0.1 , ships no telemetry, and does not auto-execute generated scripts. The only outbound traffic is to the LLM provider you configure. Skills land on disk under ~/.skillforge/skills . The filesystem is the source of truth. Three apps, one service layer. The CLI and the API import the same Python services, so skillforge plan on the command line and POST /api/chat/plan-skill from the browser run the exact same code path. ┌──────────────────────────────────────────────────────────────────┐ │ apps/web Next.js + TS + Tailwind :3000 / :8000 bundled │ │ ChatPanel → ManifestEditor → SkillPreview → InstallButton │ └────────────────────────────┬─────────────────────────────────────┘ │ HTTP ┌────────────────────────────▼─────────────────────────────────────┐ │ apps/api FastAPI :8000 │ │ routers/ ──► services/ ──► repositories/ │ └────────────────────────────┬─────────────────────────────────────┘ │ reuses the same service layer ┌────────────────────────────▼─────────────────────────────────────┐ │ apps/cli Typer + Rich │ │ serve | plan | generate | install | list | validate | remove │ └──────────────────────────────────────────────────────────────────┘ Six provider families ship today, all swappable live from the Settings page with no restart: Mock default, offline, deterministic , OpenAI-compatible OpenAI, OpenRouter, Groq, Together, Mistral, DeepSeek, xAI, Fireworks, Z.ai , Ollama, Anthropic, Gemini, and Cohere. The Mock provider is the reason the project runs with zero configuration and the reason the test suite passes offline. A first plan: skillforge plan "I need a backend skill for FastAPI, PostgreSQL, Docker, and Pytest" The CLI surface is intentionally small: serve , plan , generate , install , list , validate , remove . The generator is pure with respect to execution. It never calls subprocess . The scripts/ directory it writes is reference text on disk, runnable when you choose to run it. A skill lands at ~/.skillforge/skills/