diff --git a/package.json b/package.json index e29fc03..2ba2f75 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "alphaday", "private": true, - "version": "1.3.12", + "version": "1.3.13", "homepage": ".", "scripts": { "dev": "vite", @@ -10,6 +10,7 @@ "build-sitemap": "node scripts/build-sitemap.js" }, "dependencies": { + "lucide-react": "^0.400.0", "node-fetch": "2", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/src/App.jsx b/src/App.jsx index 869d63e..6c34715 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -6,6 +6,7 @@ import HomeContainer from "./containers/HomeContainer"; import { CookieProvider } from "./utils/CookieContext"; import PrivacyPolicyPage from "./pages/privacy-policy"; import MobilePage from "./pages/mobile-app"; +import ApiPage from "./pages/api"; import { useEffect } from "react"; import { navigateToHash } from "./utils/navigateToHash"; @@ -16,6 +17,7 @@ function removeTrailingBackSlash(site) { const otherPages = { [CONFIG.privacyPolicy]: , [CONFIG.mobile]: , + [CONFIG.api]: , }; function App() { diff --git a/src/assets/css/alphaday.css b/src/assets/css/alphaday.css index 3ef7dd2..1c09aa7 100644 --- a/src/assets/css/alphaday.css +++ b/src/assets/css/alphaday.css @@ -17,6 +17,54 @@ @tailwind components; @tailwind utilities; +@layer components { + .btn-primary { + background-color: #faa202; + color: #121212; + font-weight: 600; + transition: + transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94), + background-color 0.2s ease; + } + .btn-primary:hover { + transform: translateY(-1px); + background-color: #ffb84d; + } +} + +@layer utilities { + .hide-scrollbar::-webkit-scrollbar { + display: none; + } + .hide-scrollbar { + -ms-overflow-style: none; + scrollbar-width: none; + } +} + +/* ---- API landing page scoped styles ---- */ +.api-root { + position: relative; +} + +/* Noise overlay — scoped to .api-root so it doesn't affect other pages */ +.api-root::before { + content: ""; + position: fixed; + inset: 0; + z-index: 9999; + pointer-events: none; + opacity: 0.04; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); +} + +.api-root .interactive-element { + transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} +.api-root .interactive-element:hover { + transform: translateY(-1px); +} + @font-face { font-family: titling; font-weight: 400; diff --git a/src/components/navbar/Navbar.jsx b/src/components/navbar/Navbar.jsx index f1af669..bd93566 100644 --- a/src/components/navbar/Navbar.jsx +++ b/src/components/navbar/Navbar.jsx @@ -89,10 +89,10 @@ function Navbar({ isPrivacyPolicy, isMobile }) {
-
+ {/*
-
+
*/}
diff --git a/src/components/ui/CodeBlock.jsx b/src/components/ui/CodeBlock.jsx new file mode 100644 index 0000000..a890501 --- /dev/null +++ b/src/components/ui/CodeBlock.jsx @@ -0,0 +1,93 @@ +import { useState } from "react"; +import { Check, Copy } from "lucide-react"; + +export function CodeBlock({ + code, + language = "bash", + className = "", + annotated = false, +}) { + const [copied, setCopied] = useState(false); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(code); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + // no-op + } + }; + + const getHighlightedContent = () => { + if (language === "bash") { + return code.split("\n").map((line, i) => { + const parts = line.split(/(curl|https:\/\/[^\s"'<]+)/g); + return ( +
+ {line.startsWith("$") && ( + $ + )} + {parts.map((part, j) => { + if (part === "curl") + return ( + + {part} + + ); + if (part.startsWith("https://")) + return ( + + {part} + + ); + return {part.replace(/^\$ /, "")}; + })} +
+ ); + }); + } + + if (language === "json") { + const formatted = code + .replace(/"([^"]+)":/g, '"$1":') + .replace(/: ("[^"]+")/g, ': $1') + .replace(/(true|false|null)/g, '$1') + .replace(/: ([0-9]+)/g, ': $1'); + + return
; + } + + return
{code}
; + }; + + return ( +
+
+ +
+ +
+
+          {getHighlightedContent()}
+        
+
+ +
+
+ ); +} diff --git a/src/config.js b/src/config.js index 9e99a73..ebc7e4a 100644 --- a/src/config.js +++ b/src/config.js @@ -9,6 +9,7 @@ const CONFIG = { link: "https://www.youtube.com/embed/ThCd_W3rK_8", }, mobile: "/mobile", + api: "/api", appStore: { apple: "https://apps.apple.com/us/app/alphaday/id1581443943", google: "https://play.google.com/store/apps/details?id=com.alphaday", diff --git a/src/images/logo-notext.png b/src/images/logo-notext.png new file mode 100644 index 0000000..a929c8b Binary files /dev/null and b/src/images/logo-notext.png differ diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c10..0000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/pages/api.jsx b/src/pages/api.jsx new file mode 100644 index 0000000..411292f --- /dev/null +++ b/src/pages/api.jsx @@ -0,0 +1,630 @@ +import { useEffect, useState } from "react"; +import { + ArrowRight, + Terminal, + Copy, + Check, + Blocks, + Search, + Bot, +} from "lucide-react"; +import alphaday from "../images/logo-notext.png"; +import { CodeBlock } from "../components/ui/CodeBlock"; +import Seo from "../components/seo"; + +const heroCurl = "curl https://api.alphaday.com/search?project=arbitrum"; +const trendingCurl = "curl https://api.alphaday.com/news/trending?limit=3"; +const trendingJson = `{ + "trending": [ + { + "title": "Arbitrum DAO Passes $120M Incentive Proposal", + "source": "The Block", + "published_at": "2026-04-07T06:42:00Z", + "url": "https://..." + }, + { + "title": "Ethereum Pectra Upgrade Goes Live on Testnet", + "source": "CoinDesk", + "published_at": "2026-04-07T05:18:00Z", + "url": "https://..." + }, + { + "title": "Uniswap v4 Hooks Launch on Mainnet", + "source": "Decrypt", + "published_at": "2026-04-07T04:55:00Z", + "url": "https://..." + } + ] +}`; +const mcpConfig = `{ + "mcpServers": { + "alphaday": { + "url": "https://api.alphaday.com/mcp" + } + } +}`; +const restCurl = "curl https://api.alphaday.com/news?tags=arbitrum"; +const finalCurl = "curl https://api.alphaday.com/news/summary"; +const docsUrl = "https://api.alphaday.com/docs"; +const githubUrl = "https://github.com/AlphadayHQ/"; + +const tools = [ + { name: "get_news", desc: "Real-time news from 49 crypto outlets" }, + { name: "get_trending_news", desc: "What the crypto media is buzzing about" }, + { name: "get_news_summary", desc: "AI-generated daily crypto briefing" }, + { name: "get_blogs", desc: "133 project blogs, one feed" }, + { name: "get_podcasts", desc: "118 podcast feeds, latest episodes" }, + { name: "get_videos", desc: "121 YouTube channels, timestamped" }, + { name: "get_events", desc: "Conferences, meetups, side events" }, + { name: "get_dao", desc: "Live Snapshot votes across 51 DAOs" }, + { name: "get_forum_posts", desc: "59 governance forums, one endpoint" }, + { + name: "get_trending_keywords", + desc: "What crypto is talking about, right now", + }, + { name: "search_projects", desc: "Discover tags for any project" }, +]; + +const ApiPage = () => { + const [copied, setCopied] = useState(false); + const [isScrolled, setIsScrolled] = useState(false); + + useEffect(() => { + const handleScroll = () => { + setIsScrolled(window.scrollY > 50); + }; + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); + }, []); + + const handleHeroCopy = async () => { + try { + await navigator.clipboard.writeText(heroCurl); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + // no-op + } + }; + + return ( +
+ + + {/* 1. Minimal Nav */} + + +
+ {/* 2. Hero */} +
+
+ +

+ All of Crypto. +
+ + One API. + +

+ +

+ 1,000+ crypto data sources. One integration. Query news, podcasts, + videos, DAO proposals, events, and more — filtered by project + or keyword.
+ Available as an MCP server or REST API. +

+ +
+ + + Read the docs{" "} + + +
+ +
+ Returns: news, + blogs, podcasts, videos, DAO proposals, events, and forum posts + — all tagged{" "} + + Arbitrum + + , in one call. +
+
+ + {/* 3. Logo Strip */} +
+
+

+ Built by the team behind Alphaday, trusted by +

+
+ + AAVE + + + AVALANCHE + + + POLYGON + + + Sui + +
+
+
+ + {/* 4 & 5. The Problem & Solution */} +
+
+
+

+ Crypto data lives across 50 different sites. +
+ + Your agent shouldn't have to. + +

+
+ +
+

+ The Solution +

+

+ One API. Every source. Every format. +

+
+ +
+
+
+
+ +
+

+ 1,000+ curated sources +

+

+ News outlets, project blogs, podcasts, YouTube channels, + governance forums, DAO proposals, event calendars — all + aggregated, deduped, and tagged. +

+
+ +
+
+
+ +
+

+ Ask by project, not endpoint +

+

+ Want everything about Uniswap? One call. Filter across every + content type by project, keyword, or time range instantly. +

+
+ +
+
+
+ +
+

MCP out of the box

+

+ Drop our MCP server into Claude Desktop, Cursor, or your own + agent. Tools come pre-described for LLM consumption. +

+
+
+
+
+ + {/* 6. Hero Demo Section */} +
+
+
+
+

+ What's trending in crypto right now? +

+

+ One call. Real-time. Aggregated from 49 news sources. +

+
+
+ + + Agent MCP tool:{" "} + + alphaday.get_trending_news() + + +
+
+
+
+
+
+
+
+
+
+
+ $ curl + https://api.alphaday.com/news/trending?limit=3 +
+
+ + ${" "} + {trendingCurl.slice( + 0, + Math.floor(trendingCurl.length / 2) + 5, + )} + + + {trendingCurl.slice( + Math.floor(trendingCurl.length / 2) + 5, + )} + +
+
+ +
+
+
+ + {/* 7. Tools Grid */} +
+
+
+

+ 11 tools. Zero setup. +

+

+ Every endpoint is also a pre-described MCP tool. Your agent + knows exactly what to do. +

+
+ +
+ {tools.map((tool, i) => ( +
+
+ + f(x) + + {tool.name} +
+

+ {tool.desc} +

+
+ ))} +
+
+
+ + {/* 8. Stat Band */} +
+
+
+ + 1,000+ + + + Data Sources + +
+
+ + 500k+ + + + Indexed Items + +
+
+ + 11 + + + Tools at Launch + +
+
+
+ + {/* 9. MCP + REST */} +
+
+
+

+ Two ways in. Same data. +

+

+ Use our MCP server if your agent speaks MCP. Use REST if it + doesn't. Same endpoints, same data, same rate limits. +

+
+ +
+
+
+
+ 1 +
+

MCP Server

+ + claude_config.json + +
+ +
+
+
+
+ 2 +
+

REST API

+ + Terminal + +
+ +
+
+
+
+ + {/* 10. Pricing */} +
+
+
+
+

+ Free. Forever-ish. +

+
+ $0 +
+ +
    +
  • + All 1,000+ data + sources +
  • +
  • + All 11 tools +
  • +
  • + MCP and REST access +
  • +
  • + No API key required +
  • +
+ + + +

+ Fair-use rate limits apply. +
+ We'll always tell you before anything changes. +

+
+
+
+ + {/* 11. Final CTA */} +
+
+
+

+ Start building. No signup. +

+

+ Copy the command. Paste it in your terminal. That's + onboarding. +

+ +
+ +
+ + + Read the full docs + +
+
+
+ + {/* 12. Footer */} + +
+ ); +}; + +export default ApiPage; diff --git a/tailwind.config.js b/tailwind.config.js index 53adccf..57b9260 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -10,11 +10,35 @@ module.exports = { platinum: "var(--color-platinum)", aluminium: "var(--color-aluminium)", shark: "var(--color-shark)", - blue: "var(--color-palatinate-blue)", + blue: { + DEFAULT: "var(--color-palatinate-blue)", + 400: "#60a5fa", + }, eerie: "var(--color-eerie-black)", white: "var(--color-white)", black: "var(--color-black)", lightblue: "var(--color-lightblue)", + // Semantic tokens for the API landing page + background: "#121212", + surface: { + DEFAULT: "#191919", + light: "#242424", + border: "#3b3a3a", + }, + text: { + DEFAULT: "#f2f2f2", + muted: "#849399", + }, + primary: { + DEFAULT: "#faa202", + hover: "#ffb84d", + }, + success: "#6dd230", + danger: "#f45532", + warning: "#faa202", + orange: { + 400: "#fb923c", + }, }, extend: { @@ -42,6 +66,11 @@ module.exports = { titling: ["titling", defaultTheme.fontFamily.sans], sans: ["titling", defaultTheme.fontFamily.sans], montserrat: ["Montserrat", defaultTheme.fontFamily.sans], + display: ["titling", defaultTheme.fontFamily.sans], + mono: defaultTheme.fontFamily.mono, + }, + boxShadow: { + "primary-glow": "0 0 40px -10px rgba(250,162,2,0.3)", }, }, }, diff --git a/yarn.lock b/yarn.lock index d6c9bd7..af4e84f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -866,6 +866,11 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lucide-react@^0.400.0: + version "0.400.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.400.0.tgz#8dc044bc1ace05fde5bdd4a8a7ad35c9e69ca575" + integrity sha512-rpp7pFHh3Xd93KHixNgB0SqThMHpYNzsGUu69UaQbSZ75Q/J3m5t6EhKyMT3m4w2WOxmJ2mY0tD3vebnXqQryQ== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"