I kept watching the same failure. Someone wants to build a Next.js site, or a Python script that clicks through a browser, or an agent with Google's ADK, and they never get to the interesting part. The README says npm install and assumes Node 20. Their machine has Node 16, or Python without venv, or no GOOGLE_API_KEY. The error is real, and it is also useless if you are new.
I wrote StackSpirit for that moment. It is a small open-source CLI. You tell it what you want to build:
stackspirit check "Next.js website"
stackspirit check "AI agent with Google ADK"
stackspirit check "Python automation with Playwright"
stackspirit check "Expo mobile app"
Or you point it at a repo that will not start:
stackspirit scan .
It prints a table. Installed, missing, or wrong version. Then the exact command for the OS it detected — macOS, Linux, or Windows. If you pass --fix, it asks y/N before each command. The default is no. If the command needs sudo, the question says so. It will not invent an API key, and it will not run anything while you are reading.
The ghost bit is light on purpose. A missing dependency is "haunting your build." When the machine is fine, it says the machine is quiet. I did not want a Halloween skin on a tool that people will run when they are already stuck.
On the Linux machine I used while building this, Node 22, Python 3.12, and Go 1.22 were already there. Ollama was not.
stackspirit check "Next.js website" came back quiet and told me to run npx create-next-app@latest. It did not run that for me. create-next-app asks questions, and a tool that starts an interactive installer on its own is not helping.
stackspirit check "AI agent with Google ADK" was the interesting one. Python was new enough (ADK wants 3.11). google-adk was not installed. GOOGLE_API_KEY was not set. The fix was a virtualenv and pip install google-adk, plus a line I have to fill in myself:
export GOOGLE_API_KEY="your-key-here"
stackspirit scan examples/nextjs-site is a folder with a package.json, an .nvmrc of 20, and an empty .env.example. Node 22 was newer than the pin, which the report noted and did not treat as a failure. The real gaps were node_modules and NEXT_PUBLIC_SITE_URL. That is the report I wanted when I clone something and it will not boot.
examples/go-api was quiet. examples/docker-web was not, and the only fix was curl | sudo sh from Docker's own installer, marked as sudo, and not executed.
The part I trust is a built-in list: Node and Next.js, React with Vite, Python, Django, FastAPI, Playwright, Docker, Expo, Flutter, Go, Rust, Google ADK, LangChain, the OpenAI and Anthropic SDKs, and n8n. Versions, packages, env var names, and install commands live in that list. It works with --no-ai, and it works when no model is installed. The samples above were produced that way.
The model has two jobs.
When the sentence is not in the list — "a Hugo site", "a Godot game" — StackSpirit asks a local model to map it. If the model names a stack we already know, we use our commands, not whatever shell line it invented. If it names a new tool, the command has to be boring: one invocation, no pipes, no rm. Anything else is dropped.
When a model is up, it also writes the short "why this matters" paragraph under the table. The table itself stays deterministic. I do not want a model deciding that the install command for Node is something cute.
The default is Ollama and qwen2.5-coder, on 127.0.0.1:11434. You can point the same config at LM Studio, a llama.cpp server, or any other OpenAI-compatible endpoint, including a free model on OpenRouter if that is what you have. The prompt is the stack name, the OS, and rows like "Playwright: missing". File contents and .env values are not in it. I left a sendCode setting in the config so the policy is visible, and the CLI ignores it. There is no mode that uploads the repository.
A setup tool learns a lot about a computer. Which languages you have. Which versions. Which keys you have not set yet. That is a map of a beginner's machine, and often of a student's laptop. Sending that map to a hosted API so it can return four sentences is a bad trade.
A local open model is free. It works on a train. I can swap qwen2.5-coder for the next open model without rewriting the CLI. And because the knowledge base is there, the tool still works on a machine that is too new to have a model pulled down — which is, awkwardly, the machine this tool is for.
A closed API would also fail in the exact case I care about: the person is offline, or they have not made an account, or the key they were going to use is the thing they are trying to set up. Open and local is not a slogan here. It is the only setup that does not ask them to be finished before they can start.
Repo: https://github.com/AlizayAyesha/StackSpirit
Built by Zar Labs (zarlabs.online).