diff --git a/app/page.tsx b/app/page.tsx
index 77df1d2..94eb372 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -3,6 +3,14 @@
import { FormEvent, useState } from "react";
import Image from "next/image";
import Link from "next/link";
+import {
+ WrenchScrewdriverIcon,
+ ShieldExclamationIcon,
+ CurrencyDollarIcon,
+ BookmarkSquareIcon,
+ BuildingStorefrontIcon,
+ ChatBubbleLeftRightIcon,
+} from "@heroicons/react/20/solid";
export default function HomePage() {
const [email, setEmail] = useState("");
@@ -39,7 +47,12 @@ export default function HomePage() {
const res = await fetch("/api/beta-signup", {
method: "POST",
headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ email, useCase, acceptedTos: accepted, tosVersion: TOS_VERSION }),
+ body: JSON.stringify({
+ email,
+ useCase,
+ acceptedTos: accepted,
+ tosVersion: TOS_VERSION,
+ }),
});
if (!res.ok) {
@@ -60,6 +73,43 @@ export default function HomePage() {
}
}
+ const features = [
+ {
+ name: "Guided part roles",
+ description: "Pick parts by role so you’re not guessing what fits where.",
+ icon: WrenchScrewdriverIcon,
+ },
+ {
+ name: "Basic compatibility warnings",
+ description:
+ "Early guardrails to catch obvious mismatches before you buy.",
+ icon: ShieldExclamationIcon,
+ },
+ {
+ name: "Live pricing totals",
+ description:
+ "See the running total as you build, with real retailer listings.",
+ icon: CurrencyDollarIcon,
+ },
+ {
+ name: "Save builds",
+ description: "Save a build to your account so you can finish it later.",
+ icon: BookmarkSquareIcon,
+ },
+ {
+ name: "Limited retailers (for now)",
+ description:
+ "We’re starting small with a couple merchants and expanding fast.",
+ icon: BuildingStorefrontIcon,
+ },
+ {
+ name: "Feedback-driven roadmap",
+ description:
+ "Tell us what’s confusing, wrong, or missing — we’ll fix that first.",
+ icon: ChatBubbleLeftRightIcon,
+ },
+ ];
+
return (
{/* Abstract Brand Background */}
@@ -112,48 +162,71 @@ export default function HomePage() {
{/* Top Bar / Logo */}
{/* Hero */}
-
+
-
+
+
+ Private Beta
+ •
+ AR-15 focus
+
+
+
Stop Guessing.
-
- Start Building.
-
+ Start Building.
+
- From part comparisons to full-build matchups, Battl Builders helps
- you find the right components, catch compatibility issues, and
- score the best deals — all without juggling tabs or spreadsheets.
+ Battl Builders helps you plan an AR-15 build faster: choose parts
+ by role, get basic compatibility guidance, and compare real
+ listings—without juggling tabs or spreadsheets.
- • Side-by-side part & build comparisons
- • Smart compatibility checks
- • Live pricing from vetted merchants
- • Save & share builds with your crew
- • Vote on the cleanest, meanest setups
+ • Guided part roles (no “where does this go?”)
+ • Basic compatibility warnings
+ • Live pricing from current retailers
+ • Save builds to your account
+
+
+ Early access beta. Data, pricing, and available parts are still
+ evolving.
+
{/* Beta Form */}
-
+
Join the Beta List
@@ -177,7 +250,7 @@ export default function HomePage() {
onChange={(e) => setEmail(e.target.value)}
placeholder="you@gearjunkie.com"
disabled={status === "loading" || status === "success"}
- className="mt-1 w-full rounded-md border border-zinc-800 bg-zinc-950 px-3 py-2 text-sm text-zinc-50 outline-none ring-amber-500/30 placeholder:text-zinc-600 focus:border-amber-400/80 focus:ring-2 disabled:opacity-60 disabled:cursor-not-allowed"
+ className="mt-1 w-full rounded-md border border-zinc-800 bg-zinc-950 px-3 py-2 text-sm text-zinc-50 outline-none ring-amber-500/30 placeholder:text-zinc-600 focus:border-amber-400/80 focus:ring-2 disabled:cursor-not-allowed disabled:opacity-60"
required
/>
@@ -196,8 +269,8 @@ export default function HomePage() {
onChange={(e) => setUseCase(e.target.value)}
rows={3}
disabled={status === "loading" || status === "success"}
- placeholder="E.g. Comparing build costs, finding the best deals, sharing my builds, weird influencer shit..."
- className="mt-1 w-full rounded-md border border-zinc-800 bg-zinc-950 px-3 py-2 text-xs text-zinc-50 outline-none ring-amber-500/30 placeholder:text-zinc-600 focus:border-amber-400/80 focus:ring-2 disabled:opacity-60 disabled:cursor-not-allowed"
+ placeholder="E.g. Planning a build, comparing costs, sanity-checking compatibility..."
+ className="mt-1 w-full rounded-md border border-zinc-800 bg-zinc-950 px-3 py-2 text-xs text-zinc-50 outline-none ring-amber-500/30 placeholder:text-zinc-600 focus:border-amber-400/80 focus:ring-2 disabled:cursor-not-allowed disabled:opacity-60"
/>
@@ -215,14 +288,14 @@ export default function HomePage() {
I agree to the{" "}
Terms of Service
{" "}
and{" "}
Privacy Policy
@@ -261,19 +334,6 @@ export default function HomePage() {
)}
- {status === "success" && (
- {
- setStatus("idle");
- setMessage(null);
- }}
- className="w-full rounded-md border border-zinc-800 bg-zinc-950 px-3 py-2 text-xs text-zinc-200 hover:bg-zinc-900"
- >
- Submit another email
-
- )}
-
+ {/* Screenshot Section */}
+
+
+
+ {/* Screenshot */}
+
+
+ {/* Bottom fade */}
+
+
+
+
+
+ {/* Info Section */}
+
+
+
+ Everything you need to test the core
+
+
+ Build smarter rifles — without the spreadsheet lifestyle.
+
+
+ This private beta is focused on one thing: helping you plan an
+ AR-15 build faster and with fewer mistakes. It’s early, it’s
+ evolving, and your feedback will decide what we build next.
+
+
+
+
+ {features.map((feature) => (
+
+
+
+ {feature.name}
+
+
+ {feature.description}
+
+
+ ))}
+
+
+
+
+ What feedback we want
+
+
+ • Where you got confused or stuck
+ • Warnings that felt wrong (or missing)
+ • Parts you expected to find but couldn’t
+ • If this beats your current build-planning process
+
+
+ By joining the private beta, you agree features, data, and pricing
+ may change.
+
+
+
+
{/* Footer strip */}
diff --git a/package-lock.json b/package-lock.json
index b9a4ede..9d88e99 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
"name": "gunbuilder-prototype",
"version": "0.1.0",
"dependencies": {
+ "@heroicons/react": "^2.2.0",
"clsx": "^2.1.1",
"lucide-react": "^0.555.0",
"next": "14.2.3",
@@ -139,6 +140,15 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
+ "node_modules/@heroicons/react": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
+ "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">= 16 || ^19.0.0-rc"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
@@ -1012,6 +1022,7 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -1452,6 +1463,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.25",
"caniuse-lite": "^1.0.30001754",
@@ -2134,6 +2146,7 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -2302,6 +2315,7 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -4531,6 +4545,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
@@ -4780,6 +4795,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -4792,6 +4808,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.2"
@@ -5796,6 +5813,7 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=12"
},
@@ -5965,6 +5983,7 @@
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
diff --git a/package.json b/package.json
index 130fb54..05e03e8 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"lint": "next lint"
},
"dependencies": {
+ "@heroicons/react": "^2.2.0",
"clsx": "^2.1.1",
"lucide-react": "^0.555.0",
"next": "14.2.3",
diff --git a/public/builder-preview.png b/public/builder-preview.png
new file mode 100644
index 0000000..7cb9c7c
Binary files /dev/null and b/public/builder-preview.png differ