{
  "schema_version": "1.0.0",
  "scanner": {
    "name": "global-capability-catalog",
    "version": "0.1.0"
  },
  "repo": {
    "id": "github-recent__mbarbine__two-doller-web",
    "name": "mbarbine__two-doller-web",
    "path": "/Users/bwm.barbinewarnermichael/Documents/github/repositories/github-recent/mbarbine__two-doller-web",
    "relative_path": "github-recent/mbarbine__two-doller-web",
    "remote_url": "git@github.com:mbarbine/two-doller-web.git",
    "default_branch": "main",
    "current_commit": "5af19c3835522541ce930870c351a62f06a71fa5"
  },
  "languages": [
    {
      "language": "YAML",
      "files": 2,
      "bytes": 172270
    },
    {
      "language": "TypeScript",
      "files": 42,
      "bytes": 153810
    },
    {
      "language": "JSON",
      "files": 15,
      "bytes": 23118
    },
    {
      "language": "Markdown",
      "files": 4,
      "bytes": 19087
    },
    {
      "language": "CSS",
      "files": 2,
      "bytes": 8884
    },
    {
      "language": "XML",
      "files": 1,
      "bytes": 6120
    },
    {
      "language": "JavaScript",
      "files": 2,
      "bytes": 2964
    }
  ],
  "frameworks": [
    {
      "name": "Next.js",
      "confidence": "high",
      "evidence_paths": [
        "package.json"
      ]
    },
    {
      "name": "React",
      "confidence": "high",
      "evidence_paths": [
        "package.json"
      ]
    },
    {
      "name": "Tailwind CSS",
      "confidence": "high",
      "evidence_paths": [
        "package.json"
      ]
    },
    {
      "name": "Vitest",
      "confidence": "high",
      "evidence_paths": [
        "package.json"
      ]
    }
  ],
  "packages": {
    "package_manager": "pnpm",
    "manifests": [
      {
        "path": "package.json",
        "name": "two-platphormnews",
        "version": "1.0.0",
        "scripts": {
          "build": "next build",
          "dev": "next dev",
          "lint": "eslint .",
          "start": "next start",
          "test": "vitest run"
        },
        "dependencies": {
          "@hookform/resolvers": "^3.10.0",
          "@radix-ui/react-accordion": "1.2.2",
          "@radix-ui/react-alert-dialog": "1.1.4",
          "@radix-ui/react-aspect-ratio": "1.1.1",
          "@radix-ui/react-avatar": "1.1.2",
          "@radix-ui/react-checkbox": "1.1.3",
          "@radix-ui/react-collapsible": "1.1.2",
          "@radix-ui/react-context-menu": "2.2.4",
          "@radix-ui/react-dialog": "1.1.4",
          "@radix-ui/react-dropdown-menu": "2.1.4",
          "@radix-ui/react-hover-card": "1.1.4",
          "@radix-ui/react-label": "2.1.1",
          "@radix-ui/react-menubar": "1.1.4",
          "@radix-ui/react-navigation-menu": "1.2.3",
          "@radix-ui/react-popover": "1.1.4",
          "@radix-ui/react-progress": "1.1.1",
          "@radix-ui/react-radio-group": "1.2.2",
          "@radix-ui/react-scroll-area": "1.2.2",
          "@radix-ui/react-select": "2.1.4",
          "@radix-ui/react-separator": "1.1.1",
          "@radix-ui/react-slider": "1.2.2",
          "@radix-ui/react-slot": "1.1.1",
          "@radix-ui/react-switch": "1.1.2",
          "@radix-ui/react-tabs": "1.1.2",
          "@radix-ui/react-toast": "1.2.4",
          "@radix-ui/react-toggle": "1.1.1",
          "@radix-ui/react-toggle-group": "1.1.1",
          "@radix-ui/react-tooltip": "1.1.6",
          "@vercel/analytics": "1.3.1",
          "@vercel/speed-insights": "^1.3.1",
          "autoprefixer": "^10.4.24",
          "botid": "^1.5.10",
          "class-variance-authority": "^0.7.1",
          "clsx": "^2.1.1",
          "cmdk": "1.0.4",
          "date-fns": "4.1.0",
          "embla-carousel-react": "8.5.1",
          "input-otp": "1.4.1",
          "lucide-react": "^0.454.0",
          "next": "16.0.10",
          "next-intl": "^4.8.3",
          "next-themes": "^0.4.6",
          "react": "19.2.0",
          "react-day-picker": "9.8.0",
          "react-dom": "19.2.0",
          "react-hook-form": "^7.71.1",
          "react-resizable-panels": "^2.1.9",
          "recharts": "2.15.4",
          "sonner": "^1.7.4",
          "tailwind-merge": "^3.5.0",
          "tailwindcss-animate": "^1.0.7",
          "vaul": "^1.1.2",
          "zod": "3.25.76"
        },
        "dev_dependencies": {
          "@tailwindcss/postcss": "^4.2.0",
          "@types/node": "^22.19.11",
          "@types/react": "^19.2.14",
          "@types/react-dom": "^19.2.3",
          "baseline-browser-mapping": "^2.10.0",
          "postcss": "^8.5.6",
          "tailwindcss": "^4.2.0",
          "tw-animate-css": "1.3.3",
          "typescript": "^5.9.3",
          "vitest": "^4.1.2"
        }
      }
    ]
  },
  "routes": {
    "api_routes": [
      {
        "route": "/docs",
        "source_path": "app/api/docs/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET"
        ]
      },
      {
        "route": "/facts",
        "source_path": "app/api/facts/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "OPTIONS"
        ]
      },
      {
        "route": "/gallery",
        "source_path": "app/api/gallery/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "OPTIONS"
        ]
      },
      {
        "route": "/info",
        "source_path": "app/api/info/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "OPTIONS"
        ]
      },
      {
        "route": "/mcp",
        "source_path": "app/api/mcp/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "POST"
        ]
      },
      {
        "route": "/openapi",
        "source_path": "app/api/openapi/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET"
        ]
      },
      {
        "route": "/rss",
        "source_path": "app/api/rss/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET"
        ]
      },
      {
        "route": "/value",
        "source_path": "app/api/value/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "OPTIONS"
        ]
      },
      {
        "route": "/webhooks/n8n",
        "source_path": "app/api/webhooks/n8n/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "POST"
        ]
      },
      {
        "route": "/webhooks/subscribe",
        "source_path": "app/api/webhooks/subscribe/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "POST"
        ]
      },
      {
        "route": "/webhooks/zapier",
        "source_path": "app/api/webhooks/zapier/route.ts",
        "kind": "next-app-api-route",
        "methods": [
          "GET",
          "POST"
        ]
      }
    ],
    "app_routes": [
      {
        "route": "/[locale]",
        "source_path": "app/[locale]/page.tsx",
        "kind": "next-app-page",
        "methods": [
          "GET"
        ]
      }
    ]
  },
  "components": [
    {
      "name": "facts-section",
      "kind": "ui-component",
      "source_path": "components/facts-section.tsx"
    },
    {
      "name": "footer",
      "kind": "ui-component",
      "source_path": "components/footer.tsx"
    },
    {
      "name": "future-section",
      "kind": "ui-component",
      "source_path": "components/future-section.tsx"
    },
    {
      "name": "gallery-section",
      "kind": "ui-component",
      "source_path": "components/gallery-section.tsx"
    },
    {
      "name": "header",
      "kind": "ui-component",
      "source_path": "components/header.tsx"
    },
    {
      "name": "hero-section",
      "kind": "ui-component",
      "source_path": "components/hero-section.tsx"
    },
    {
      "name": "history-section",
      "kind": "ui-component",
      "source_path": "components/history-section.tsx"
    },
    {
      "name": "life-hacks-section",
      "kind": "ui-component",
      "source_path": "components/life-hacks-section.tsx"
    },
    {
      "name": "marketplace-section",
      "kind": "ui-component",
      "source_path": "components/marketplace-section.tsx"
    },
    {
      "name": "news-section",
      "kind": "ui-component",
      "source_path": "components/news-section.tsx"
    },
    {
      "name": "share-section",
      "kind": "ui-component",
      "source_path": "components/share-section.tsx"
    },
    {
      "name": "theme-provider",
      "kind": "ui-component",
      "source_path": "components/theme-provider.tsx"
    },
    {
      "name": "badge",
      "kind": "ui-component",
      "source_path": "components/ui/badge.tsx"
    },
    {
      "name": "button",
      "kind": "ui-component",
      "source_path": "components/ui/button.tsx"
    },
    {
      "name": "card",
      "kind": "ui-component",
      "source_path": "components/ui/card.tsx"
    },
    {
      "name": "value-section",
      "kind": "ui-component",
      "source_path": "components/value-section.tsx"
    }
  ],
  "data_models": [],
  "database": {
    "databases": [],
    "schemas": [],
    "migrations": []
  },
  "tests": [
    {
      "name": "route.test.ts",
      "kind": "unit-or-integration",
      "source_path": "app/api/webhooks/subscribe/route.test.ts"
    }
  ],
  "ci": {
    "workflows": []
  },
  "containers": {
    "dockerfiles": [],
    "compose_files": []
  },
  "env": {
    "example_files": [],
    "variables": [
      {
        "name": "NODE_ENV",
        "source_paths": [
          "app/api/webhooks/subscribe/route.ts"
        ],
        "likely_secret": false
      }
    ]
  },
  "configs": [
    {
      "path": "next.config.mjs"
    },
    {
      "path": "package.json"
    },
    {
      "path": "pnpm-workspace.yaml"
    },
    {
      "path": "postcss.config.mjs"
    },
    {
      "path": "tsconfig.json"
    },
    {
      "path": "tsconfig.tsbuildinfo"
    }
  ],
  "docs": {
    "readme_paths": [
      {
        "path": "README.md"
      }
    ],
    "doc_paths": [],
    "llms_context_paths": [
      {
        "path": "public/llms-full.txt"
      },
      {
        "path": "public/llms-index.json"
      },
      {
        "path": "public/llms.txt"
      }
    ]
  },
  "discovery_files": {
    "openapi": [
      {
        "path": "public/.well-known/openapi.json"
      }
    ],
    "mcp": [
      {
        "path": "app/api/mcp/route.ts"
      }
    ],
    "llms": [
      {
        "path": "public/llms-full.txt"
      },
      {
        "path": "public/llms-index.json"
      },
      {
        "path": "public/llms.txt"
      }
    ],
    "sitemaps": [
      {
        "path": "public/sitemap.xml"
      }
    ],
    "feeds": [],
    "well_known": [
      {
        "path": "public/.well-known/ai-plugin.json"
      },
      {
        "path": "public/.well-known/openapi.json"
      },
      {
        "path": "public/.well-known/security.txt"
      }
    ],
    "robots": [
      {
        "path": "public/robots.txt"
      }
    ],
    "manifests": []
  },
  "integrations": [
    {
      "name": "Vercel",
      "confidence": "medium",
      "evidence_paths": [
        "app/layout.tsx",
        "package.json",
        "pnpm-lock.yaml"
      ]
    }
  ],
  "license": {
    "spdx": null,
    "paths": []
  },
  "comments": [
    {
      "kind": "unsafe",
      "source_path": "app/api/rss/route.ts",
      "line": 35,
      "text": "\"Many slot machines and vending machines reject $2 bills entirely — handing it back, uncounted. This creates a quirky life hack: you can literally not lose your $2 at certain slots.\","
    },
    {
      "kind": "unsafe",
      "source_path": "app/api/rss/route.ts",
      "line": 38,
      "text": "guid: `${SITE_CONFIG.url}/news/slot-machine-hack`,"
    },
    {
      "kind": "security",
      "source_path": "app/api/webhooks/subscribe/route.ts",
      "line": 161,
      "text": "security: \"Only http/https allowed. Local and private IP ranges are blocked.\","
    },
    {
      "kind": "unsafe",
      "source_path": "app/layout.tsx",
      "line": 34,
      "text": "\"slot machine hack\","
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 97,
      "text": "{featuredHacks.map((hack, index) => {"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 98,
      "text": "const Icon = hack.icon"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 110,
      "text": "<h3 className=\"text-xl font-serif font-bold text-foreground mb-3\">{hack.title}</h3>"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 111,
      "text": "<p className=\"text-muted-foreground mb-4\">{hack.description}</p>"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 112,
      "text": "{hack.disclaimer && ("
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 115,
      "text": "<p className=\"text-xs text-destructive\">{hack.disclaimer}</p>"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 126,
      "text": "{otherHacks.map((hack, index) => {"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 127,
      "text": "const Icon = hack.icon"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 132,
      "text": "hack.fun ? \"border-2 border-accent bg-accent/10\" : \"bg-card\""
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 138,
      "text": "hack.fun ? \"bg-accent\" : \"bg-primary\""
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 141,
      "text": "<Icon className={`w-6 h-6 ${hack.fun ? \"text-accent-foreground\" : \"text-primary-foreground\"}`} />"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 143,
      "text": "<h3 className=\"text-lg font-serif font-bold text-card-foreground mb-2\">{hack.title}</h3>"
    },
    {
      "kind": "unsafe",
      "source_path": "components/life-hacks-section.tsx",
      "line": 144,
      "text": "<p className=\"text-muted-foreground text-sm\">{hack.description}</p>"
    },
    {
      "kind": "security",
      "source_path": "public/.well-known/security.txt",
      "line": 7,
      "text": "Canonical: https://two.platphormnews.com/.well-known/security.txt"
    },
    {
      "kind": "security",
      "source_path": "public/.well-known/security.txt",
      "line": 8,
      "text": "Policy: https://platphormnews.com/security-policy"
    },
    {
      "kind": "security",
      "source_path": "public/.well-known/security.txt",
      "line": 12,
      "text": "# This security.txt file covers: two.platphormnews.com"
    },
    {
      "kind": "unsafe",
      "source_path": "public/blog-post-ph3ar.md",
      "line": 90,
      "text": "4. **The vending machine curiosity.** Some older vending machines reject $2 bills but accept the cash credit anyway. Again: not a hack to exploit, but worth knowing when you need quarters."
    },
    {
      "kind": "security",
      "source_path": "README.md",
      "line": 156,
      "text": "| `security.txt` | [/.well-known/security.txt](https://two.platphormnews.com/.well-known/security.txt) | Security contact |"
    },
    {
      "kind": "security",
      "source_path": "README.md",
      "line": 218,
      "text": "│   ├── .well-known/      # ai-plugin.json, openapi.json, security.txt"
    },
    {
      "kind": "security",
      "source_path": "README.md",
      "line": 230,
      "text": "## 🔐 Security"
    },
    {
      "kind": "security",
      "source_path": "README.md",
      "line": 238,
      "text": "- Security contact: [/.well-known/security.txt](https://two.platphormnews.com/.well-known/security.txt)"
    }
  ],
  "security": {
    "secret_risks": [],
    "unsafe_patterns": [
      {
        "name": "dangerously-set-html",
        "confidence": "medium",
        "evidence_paths": [
          "app/layout.tsx"
        ]
      }
    ],
    "sensitive_data_indicators": [
      {
        "name": "card",
        "confidence": "medium",
        "evidence_paths": [
          "app/globals.css",
          "app/layout.tsx",
          "components/facts-section.tsx",
          "components/future-section.tsx",
          "components/gallery-section.tsx",
          "components/hero-section.tsx",
          "components/history-section.tsx",
          "components/life-hacks-section.tsx",
          "components/marketplace-section.tsx",
          "components/news-section.tsx",
          "components/share-section.tsx",
          "components/ui/card.tsx",
          "components/value-section.tsx",
          "package.json",
          "pnpm-lock.yaml",
          "README.md",
          "styles/globals.css"
        ]
      },
      {
        "name": "email",
        "confidence": "medium",
        "evidence_paths": [
          "app/api/mcp/route.ts",
          "app/api/openapi/route.ts",
          "app/layout.tsx",
          "lib/constants.ts",
          "messages/de.json",
          "messages/en.json",
          "messages/es.json",
          "messages/fr.json",
          "messages/ja.json",
          "messages/ko.json",
          "messages/pt.json",
          "messages/zh.json",
          "package.json",
          "public/.well-known/ai-plugin.json",
          "public/.well-known/openapi.json",
          "public/llms-full.txt",
          "public/llms-index.json"
        ]
      },
      {
        "name": "financial",
        "confidence": "medium",
        "evidence_paths": [
          "public/blog-post-ph3ar.md"
        ]
      },
      {
        "name": "ip address",
        "confidence": "medium",
        "evidence_paths": [
          ".jules/sentinel.md",
          "app/api/webhooks/subscribe/route.test.ts",
          "app/api/webhooks/subscribe/route.ts"
        ]
      },
      {
        "name": "location",
        "confidence": "medium",
        "evidence_paths": [
          "components/header.tsx",
          "components/share-section.tsx",
          "next.config.mjs",
          "README.md"
        ]
      },
      {
        "name": "payment",
        "confidence": "medium",
        "evidence_paths": [
          "components/future-section.tsx",
          "public/blog-post-ph3ar.md"
        ]
      },
      {
        "name": "pii",
        "confidence": "medium",
        "evidence_paths": [
          "pnpm-lock.yaml"
        ]
      },
      {
        "name": "token",
        "confidence": "medium",
        "evidence_paths": [
          "pnpm-lock.yaml"
        ]
      }
    ]
  },
  "generated_at": "2026-05-16T16:44:27.225Z"
}
