shouldivibecodeit

Submit an entry

Entries are JSON files in a public repo. Add something we missed, or argue with a verdict you think is wrong — both are pull requests, and disagreement is the point.

the rules
One entry per pull request.

Easier to argue with, easier to merge.

Only things AI can plausibly build.

If canivibecodeit rated it NOT REALLY, "should you" is not a question. Out of scope.

Score the six dimensions honestly, then pick the verdict.

Not the other way around. The validator fails the build if the verdict is more than one band away from its own numbers.

regulatoryExposure >= 5 requires sources.

Opinions with consequences attached have to show their working. The validator enforces this.

The guardrail prompt is not a build prompt.

It is what you paste BEFORE you build. Build prompts go to canivibecodeit, and every entry here links to theirs.

hotTake under 120 characters.

It goes in the OG image. Make it land.

Favicon at public/icons/<slug>.png, 64px.

Fetched, not hotlinked.

Run the validator before opening the PR.

node scripts/validate-entries.mjs

Verdicts are editorial and never sponsored.

No exceptions, no "featured" placements, no paid removals.

the schema
{
  "slug": "lowercase-hyphenated",
  "name": "Display Name",
  "domain": "example.com",
  "category": "one of the keys in data/taxonomy.json",
  "subcategory": null,
  "tagline": "One line on what it does",
  "priceMonthly": 12,
  "pricing": {
    "plan": "Growth",
    "basis": "monthly",
    "unit": "flat | per-seat | usage | one-time | custom",
    "native": "12 USD",
    "source": "https://example.com/pricing",
    "checkedOn": "YYYY-MM-DD",
    "confidence": "high | medium | low",
    "notes": null
  },
  "canIVibeCodeIt": {
    "listed": true,
    "slug": "their-slug",
    "url": "https://canivibecodeit.com/their-slug",
    "verdict": "yes | kinda",
    "diyTimeEstimate": "one sitting | multi-day",
    "checkedOn": "YYYY-MM-DD",
    "agreement": "agree | we-are-harsher | we-are-softer | different-question"
  },
  "verdict": "ship-it | demo-only | your-funeral | absolutely-not",
  "verdictConfidence": "high | medium | low",
  "verdictSummary": "The honest answer, one paragraph.",
  "hotTake": "<=120 chars. This is the tweet.",
  "buildEase": 7,
  "risk": {
    "blastRadius": 0,
    "dataSensitivity": 0,
    "securitySurface": 0,
    "regulatoryExposure": 0,
    "reversibility": 0,
    "maintenanceTax": 0
  },
  "riskTags": [
    "1 to 3, strongest first"
  ],
  "greenFlags": [],
  "whoPaysWhenItBreaks": "you | your-users | your-customers-customers | a-regulator | someones-health",
  "whatBreaks": [],
  "the3amScenario": null,
  "shipItIf": [],
  "dontShipItIf": [],
  "guardrails": [],
  "guardrailPrompt": null,
  "exitPlan": null,
  "buyInsteadIf": null,
  "cheaperThanYourWeekend": true,
  "priorArt": [],
  "relatedSlugs": [],
  "faqs": [],
  "sources": [],
  "pagePriority": 3,
  "notes": null,
  "lastReviewed": "YYYY-MM-DD"
}

Every key must be present. Use null for missing prose and [] for empty lists. The six risk dimensions are whole numbers 0–10; buildEase is 0–10 to at most one decimal. Category is a key in data/taxonomy.json. what the dimensions mean →

Submitting a tool that should be replaced, with a working prompt to replace it? That belongs at canivibecodeit, not here. They own the “can”, we own the “should”, and neither of us wants to maintain the other’s half.