A site that helps users choose between infrastructure and automation tools using auditable data and rules.
Which IaC helps engineering teams select infrastructure-as-code and automation tools using transparent, auditable criteria.
- Answer a short questionnaire about your targets and requirements.
- See a comparison table with neutral, sourced facts from official documentation.
- Get recommendations that first apply hard exclusions, then weighted preferences.
- Explore per-tool pages with concise summaries and primary references.
The project intentionally avoids subjective claims. All facts are based on official sources and rules are explicit and easy to audit.
- Static export ready for GitHub Pages
- Data-driven questionnaire and comparison views
- Transparent decision engine with hard exclusions and weighted rules
- Per-tool fact pages with official references
- About page that explains questions and rules
- Playwright end-to-end tests for quiz, compare, and about flows
- Minimal, accessible UI
- Prerequisites: Node.js 18+ and npm
- Install and run locally:
npm install
npm run dev
Open http://localhost:3000/.
src/data/tools.json # Tool facts and official references
src/data/questions.json # Questionnaire content
src/data/rules.json # Must-have exclusions and weighted scoring
src/lib/recommend.ts # Recommendation engine
- Array of tool objects used across compare/results/detail pages.
- Required fields:
id,name,summary,focus,primaryTargets,definitionModel,supportedLanguages,stateModel,executionModel,officialDocs. idmust be unique and URL-safe (used in/tools/[tool]/routes).officialDocsmust include primary/official sources and are shown as references in the UI.- When official sources do not explicitly state a detail (for example,
primaryTargets), use the explicit placeholder"Not stated in official docs"rather than inference. - Common
focuscategories used in this project include: "Infrastructure provisioning", "Configuration management", and "Control plane and orchestration". Example:
{
"id": "example-tool",
"name": "Example Tool",
"summary": "One-line factual summary.",
"focus": "Infrastructure provisioning",
"primaryTargets": ["AWS"],
"definitionModel": "Declarative templates",
"supportedLanguages": ["YAML", "JSON"],
"stateModel": "Service-managed",
"executionModel": "CLI applies templates",
"officialDocs": [
{ "label": "Official Docs", "url": "https://example.com/docs" }
]
}- Array of question objects that drive the quiz.
- Required fields:
id,prompt,helpText(optional),type,options. - Each
optionsentry should includevalueandlabel(label is what users see). idvalues are referenced by rules inrules.json. Example:
{
"id": "target_scope",
"prompt": "What is your primary target scope?",
"helpText": "This influences AWS-only vs multi-cloud tooling.",
"type": "single",
"options": [
{ "value": "aws_only", "label": "AWS only" },
{ "value": "multi_cloud", "label": "Multi-cloud" }
]
}mustHave: hard exclusions (applied first).weights: preference-based scoring (applied after exclusions).- Each rule must reference a valid
questionId. - Weight maps must use tool
ids fromtools.json. Example:
{
"id": "w-aws-only",
"questionId": "target_scope",
"match": { "equals": "aws_only" },
"weights": { "aws-cdk": 3, "terraform": 0 },
"message": "Primary target is AWS only."
}npm install
npm run dev
npm run test
npm run test:e2e
npx playwright install --with-deps
npm run test:e2e
The HTML report is generated in playwright-report/. Open it with:
npx playwright show-report
npm run build
PORT=3000 node scripts/serve-static.mjs
Open the URL printed by the static server.
- Production deploys are expected at
https://whichiac.com/(root domain, no base path). - Ensure a workflow exists at
.github/workflows/deploy.ymlthat builds and uploads theoutdirectory.
- Apply hard exclusions first (must-have requirements).
- Apply weighted scoring second.
- Produce explanations per tool (rules fired and why they matter).
- Show excluded tools with exact reasons.
/about/explains the question set and rule logic.- Weighted rule details are shown only on the About page.
- Add the tool facts to
src/data/tools.json, including official documentation links. - Keep facts strictly factual and sourced from primary docs.
- Ensure the tool
idis unique and URL-safe. - Update
src/app/tools/[tool]/page.tsxonly if you add new fields to the schema. - Add the tool to at least one rule (see test guard).
- Run
npm run buildto ensure the static tool page is generated.
- Add or edit questions in
src/data/questions.json. - Add or edit rules in
src/data/rules.json:- Use
mustHavefor hard exclusions. - Use
weightsfor preference scoring.
- Use
- Update tests in
src/lib/recommend.test.tsfor new rule behavior.
See CONTRIBUTING.md for fact sourcing, rule changes, language guidelines, and the PR checklist.
Some parts of this repository may have been generated with the assistance of AI. All AI-generated contributions are reviewed and verified by human maintainers to ensure accuracy, neutrality, and compliance with project guidelines.