個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Mission control for your engineering team
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Mission control for your engineering team.
Houston measures engineering velocity for GitHub repositories. It syncs pull requests, reviews, CI workflow runs and deployments into a local cache, then reports how work flows from the first commit to production.
⏱️ Durations that measure people only count working time, so a pull request opened on Friday evening doesn't look two days slower than one opened on Monday.
The screenshots use the demo data that ships with Houston.
Houston uses SQLite by default. Any database Laravel supports works.
git clone https://github.com/vistik/houston.git
cd houston
composer setup
composer setup installs the dependencies, creates .env, generates the app key, migrates the database, asks whether Houston should require a login, and builds the frontend.
Houston asks for a login by default, and shows the install guide until one exists. Create it with:
php artisan houston:install
It asks whether Houston should require a login, creates the one login it has (an email and a password), and sets HOUSTON_AUTH in .env. It also sets HOUSTON_LANDING=false, so / goes straight to the dashboard. Run it again to change the password, or turn the login off on your own machine. The MCP endpoint doesn't use the login; it has its own token.
For scripts and servers without a terminal, php artisan houston:install --generate turns the login on without asking anything. It uses the email from --email, or else keeps the existing login's email (or uses [email protected]), sets a random password, and prints both.
Set GITHUB_TOKEN in .env. When it is empty, Houston uses the token of the GitHub CLI (gh auth token), which is handy on your own machine.
A fine-grained token needs read access to these repository permissions:
| Permission | Used for |
|---|---|
| Metadata | Repository details |
| Pull requests | Pull requests and reviews |
| Actions | Workflow runs |
| Deployments | Deployments |
| Contents | Releases, commit timestamps, and dependency manifests and lock files |
A classic token needs no scopes for public repositories, and the repo scope for private ones.
After each sync, Houston reads composer.json, composer.lock, package.json and package-lock.json at the root of the default branch, and asks Packagist and the npm registry for the latest release of each direct dependency. Those answers are cached for six hours and shared by every repository. Private packages, packages that track a branch, and npm packages without a package-lock.json (Yarn, pnpm) can't be compared and are counted separately.
Start everything Houston needs in development with:
composer run dev
This starts the web server at http://localhost:8000, the scheduler, a queue worker, a log tail and Vite.
On a server, check these before you let others in:
APP_ENV=production and APP_DEBUG=false in .env.HOUSTON_AUTH=true, the default) and create it with php artisan houston:install.php artisan queue:work) under a process monitor such as Supervisor.HOUSTON_MCP_TOKEN only if you want the MCP endpoint. Without it, /mcp returns 404.To let anyone look around without a login, set Houston up as usual, then turn on HOUSTON_DEMO=true. Watch the repositories, add the teams and timeline events and pick the defaults first, because the demo can't change them.
The demo is read-only. Visitors can switch layouts, views and cards, which only they see, but can't watch, remove or sync repositories, and Settings is hidden. The login and APP_DEBUG are turned off. Run the scheduler and a queue worker as usual: they keep syncing the watched repositories so the numbers stay up to date, but no visitor's request talks to GitHub. Give GITHUB_TOKEN a fine-grained token that can only read public repositories and watch only public ones, and leave HOUSTON_MCP_TOKEN empty.
Before you upgrade, read CHANGELOG.md for what changed.
owner/name, or paste the repository's GitHub URL.Houston queues a sync straight away. The first sync pulls the lookback window (180 days by default) and can take a while on busy repositories. It pauses before it runs into GitHub's rate limits, and resumes when they reset. You can follow its progress under Settings → Syncs.
You can also sync from the command line:
php artisan houston:sync # every watched repository
php artisan houston:sync laravel/framework
php artisan houston:sync --queue # dispatch to the queue instead of running inline
php artisan houston:flush # wipe the cache, keeping the watched repositories
php artisan houston:install # turn the login on or off, or change it
php artisan houston:install --generate # turn the login on with a random password, without asking anything
php artisan houston:install --generate [email protected]
To report on teams, create them under Settings → Teams and add people by their GitHub login.
Everything Houston-specific lives in config/houston.php. These can be set from .env:
| Variable | Default | Description |
|---|---|---|
GITHUB_TOKEN | gh auth token | The token used to talk to GitHub. |
HOUSTON_LOOKBACK_DAYS | 180 | Days of history a fresh sync pulls. Keep it at least twice the longest period you report on. Can be set per repository. |
HOUSTON_STALE_AFTER_MINUTES | 15 | Viewing a repository whose cache is older than this queues a refresh. |
HOUSTON_STALE_PR_DAYS | 7 | Open pull requests without activity for this long are flagged as stale. |
HOUSTON_WORKING_DAYS | 1,2,3,4,5 | Working days, as ISO day numbers (1 is Monday). |
HOUSTON_WORKDAY_START / _END | 00:00 / 24:00 | Working hours. Use all seven days and 00:00–24:00 to measure calendar time. |
HOUSTON_MCP_TOKEN | empty | Enables the MCP endpoint at /mcp for clients that send this bearer token. |
HOUSTON_AUTH | true | Requires the login created by php artisan houston:install before showing anything. |
HOUSTON_LANDING | false | Shows the Houston website at / and /install. The dashboard is at /dashboard either way. |
HOUSTON_DEMO | false | Runs a read-only public demo. See Running a public demo. |
To send errors to Sentry, set SENTRY_LARAVEL_DSN. Leave it empty to turn Sentry off. SENTRY_TRACES_SAMPLE_RATE and SENTRY_PROFILES_SAMPLE_RATE control how much is traced and profiled (profiling needs the Excimer extension), and adding sentry_logs to LOG_STACK sends logs too.
The rate limit reserve, which deployment environments count as production, and which pull requests count as remediations (reverts, hotfixes and rollbacks) are set in config/houston.php itself.
Report defaults (period, grouping and timezone) and benchmarks are set in the app under Settings. Every report is shown in that one timezone: daily charts, custom ranges and working hours all start and end the day at midnight there, and "last 30 days" means today and the 29 days before it. Each repository's lookback window is set under Settings → Syncs, and the CI workflows to leave out of its metrics on the repository's page.
Agents can read Houston over the Model Context Protocol. It offers three read-only tools: list-repositories, get-velocity-report and list-pull-requests. It also offers a give-feedback prompt that walks through a full review.
Locally, point your client at:
php artisan mcp:start houston
Over HTTP, set HOUSTON_MCP_TOKEN and send it as a bearer token to /mcp. The endpoint returns 404 while no token is set.
composer ci:check # everything CI runs: frontend lint, types and tests, Pint, PHPStan and the tests
composer test # Pint, PHPStan and the tests
composer test:coverage # the tests with the 95% line coverage gate CI uses (needs PCOV or Xdebug)
php artisan test # the tests only
npm run check:fix # format and lint the frontend
See CONTRIBUTING.md for how to contribute, and the code of conduct.
Please report vulnerabilities privately; see SECURITY.md.
Houston is open-source software licensed under the MIT license.