The gap between "good idea" and "open editor"
hackspot is good at the first ten minutes of a hackathon. Give it a theme, a stack, and a time budget, and it hands you a shortlist of buildable ideas, each with a pitch, a reason it wins, and a scoped MVP. What it couldn't do, until now, is the next ten minutes: turning that idea into an actual project on disk with an AI agent already briefed on what to build.
That's what @hackspot/cli
is for.
What it does
The CLI is deliberately small. It doesn't run an LLM of its own; instead it drives the agent you already use (Claude Code, Codex, or opencode) by handing it the context hackspot already generated.
npx @hackspot/cli login
npx @hackspot/cli list
npx @hackspot/cli build 42
-
login: a device-code flow. The CLI shows a 6-digit code, you enter it athackspot.dev/app/cliwhile signed in, and the CLI saves a token to~/.hackspot/config.json. -
list: shows your saved ideas, newest first, with the idbuildtakes. Add--jsonif you want to script against it. -
build <id>: scaffolds a new directory and writes three files:File Purpose AGENTS.mdThe playbook as a cross-tool context file agents auto-read PROMPT.mdThe bootstrap instruction, ready to paste into any agent hackspot.jsonThe structured idea: pitch, MVP, demo script, event brief Then it picks an agent and launches it in that directory, inheriting your terminal.
Why a CLI, and why now
The web app is where you decide what to build. Once you've decided, every extra step between that decision and a coding agent actually working is time you don't have at a hackathon. The CLI collapses "I picked idea #42" into a running agent session in one command. It reuses the exact same pitch and MVP scope you saw on the site, so there's no re-explaining the idea in your own words and no losing the parts that made it a good pitch in the first place.
Getting started
npx @hackspot/cli login
npx @hackspot/cli list
npx @hackspot/cli build <id> ./my-project
Full install and flag reference is in the
docs. If you hit something
that doesn't work the way this post describes, that's a bug. The package is
still early (0.1.x), and we'd rather hear about it than have you work
around it.