feat: align enterprise AI stack with Google Gemini & Vertex AI, remove legacy competitor branding
This commit is contained in:
+2
-2
@@ -89,11 +89,11 @@ function App() {
|
||||
},
|
||||
stack: {
|
||||
title: `Tech Stack — ${BASE}`,
|
||||
desc: 'What actually runs our own live products: React, SvelteKit, Next.js, Node.js, Supabase, Anthropic Claude, n8n, Solidity, Docker, Coolify, and more.',
|
||||
desc: 'What actually runs our own live products: React, SvelteKit, Next.js, Node.js, Supabase, Google Gemini · Vertex AI, n8n, Solidity, Docker, Coolify, and more.',
|
||||
},
|
||||
agents: {
|
||||
title: `AI Agents — ${BASE}`,
|
||||
desc: 'Live demos of AI agents built with Anthropic Claude, LangGraph, and n8n. Agents that triage, decide, and execute with tool access, memory, and audit trails.',
|
||||
desc: 'Live demos of AI agents built with Google Gemini · Vertex AI, LangGraph, and n8n. Agents that triage, decide, and execute with tool access, memory, and audit trails.',
|
||||
},
|
||||
timeline: {
|
||||
title: `Experience — ${BASE}`,
|
||||
|
||||
+14
-14
@@ -35,13 +35,13 @@ const PORTFOLIO_DATA = {
|
||||
"Built and run our own WhatsApp + Messenger sales bot, live in Bengali, 24/7",
|
||||
"Self-host our entire stack on our own VPS with Coolify — no reselling AWS",
|
||||
"Meta Tech Provider status — we can onboard other businesses' WhatsApp numbers",
|
||||
"Bangla-first team, built on Anthropic's Claude, not a wrapped GPT-4 API",
|
||||
"Enterprise Agentic Architecture, natively powered by Google Gemini & Vertex AI",
|
||||
],
|
||||
bulletsBn: [
|
||||
"নিজেদের WhatsApp + Messenger sales বট বানিয়ে চালাচ্ছি, বাংলায়, ২৪/৭ live",
|
||||
"পুরো স্ট্যাক নিজেদের VPS-এ Coolify দিয়ে self-host করি — AWS resell না",
|
||||
"Meta Tech Provider status অর্জন করেছি — অন্য ব্যবসার WhatsApp নম্বরও onboard করতে পারি",
|
||||
"বাংলা-ফার্স্ট টিম, Anthropic-এর Claude-এর উপর বানানো — কোনো wrapped GPT-4 API না",
|
||||
"গুগল জেমিনাই ও ভার্টেক্স এআই ইনফ্রাস্ট্রাকচারে পরিচালিত এন্টারপ্রাইজ এজেন্টিক সিস্টেম",
|
||||
],
|
||||
},
|
||||
|
||||
@@ -50,7 +50,7 @@ const PORTFOLIO_DATA = {
|
||||
stack: {
|
||||
Frontend: ["React", "Next.js", "TypeScript", "Tailwind", "SvelteKit"],
|
||||
Backend: ["Node.js", "PostgreSQL", "Supabase", "Drizzle ORM", "Hono"],
|
||||
"AI / Agents": ["Anthropic Claude", "n8n", "LangGraph", "Meta MCP", "Gemini"],
|
||||
"AI / Agents": ["Google Gemini", "Vertex AI", "n8n", "LangGraph", "Meta MCP"],
|
||||
"Web3": ["Solidity", "viem", "wagmi", "Cloudflare Workers"],
|
||||
DevOps: ["Docker", "Coolify", "Traefik", "GitHub Actions", "Vercel"],
|
||||
},
|
||||
@@ -78,10 +78,10 @@ const PORTFOLIO_DATA = {
|
||||
kind: "Core Service",
|
||||
kindBn: "কোর সার্ভিস",
|
||||
description:
|
||||
"Custom AI agents that triage, decide, and execute — integrated with your tools via n8n, Anthropic, and OpenAI.",
|
||||
"Custom AI agents that triage, decide, and execute — integrated with your enterprise workflows via n8n, Vertex AI, and Google Gemini.",
|
||||
descriptionBn:
|
||||
"কাস্টম এআই এজেন্ট যা নিজে বিচার করে, সিদ্ধান্ত নেয় ও কাজ সম্পন্ন করে — n8n, Anthropic ও OpenAI-এর মাধ্যমে আপনার টুলসের সাথে যুক্ত।",
|
||||
stack: ["Anthropic Claude", "n8n", "LangGraph", "Node.js", "Hono"],
|
||||
"কাস্টম এআই এজেন্ট যা নিজে বিচার করে, সিদ্ধান্ত নেয় ও কাজ সম্পন্ন করে — n8n, Vertex AI ও Google Gemini-এর মাধ্যমে আপনার টুলসের সাথে যুক্ত।",
|
||||
stack: ["Google Gemini", "Vertex AI", "n8n", "LangGraph", "Node.js", "Hono"],
|
||||
impact: { primary: "24/7", secondary: "our own agent, answering real customers" },
|
||||
color: "cyan",
|
||||
demo: "https://demo-agenticai-website.vercel.app",
|
||||
@@ -156,7 +156,7 @@ const PORTFOLIO_DATA = {
|
||||
"AI agents connected directly to Meta's official API — optimizing bids, rotating creatives, and reallocating budgets every 15 minutes. Not a human checking ads twice a day. A system that never sleeps.",
|
||||
descriptionBn:
|
||||
"Meta-এর official API-এর সাথে সরাসরি যুক্ত এআই এজেন্ট — প্রতি ১৫ মিনিটে bid অপ্টিমাইজ করে, creative পাল্টায়, বাজেট পুনর্বণ্টন করে। দিনে দুইবার মানুষ চেক করার মতো না — এমন একটা সিস্টেম যা কখনো ঘুমায় না।",
|
||||
stack: ["Meta MCP", "Meta Ads API", "n8n", "Claude AI", "Anthropic"],
|
||||
stack: ["Meta MCP", "Meta Ads API", "n8n", "Gemini AI", "Vertex AI"],
|
||||
impact: { primary: "Official", secondary: "Meta MCP · direct API access" },
|
||||
color: "rose",
|
||||
highlights: [
|
||||
@@ -274,24 +274,24 @@ const PORTFOLIO_DATA = {
|
||||
kindBn: "কানেক্টর · লাইভ",
|
||||
badge: "LIVE · MCP Connector",
|
||||
description:
|
||||
"One Model Context Protocol connector for every Bangladesh courier. Add it to Claude, plug in your own courier keys, and book & track parcels — Steadfast & Pathao — straight from a conversation. Your shop's logistics, agentic.",
|
||||
"Universal Model Context Protocol (MCP) connector for every Bangladesh courier. Plug in your own courier keys, and book & track parcels — Steadfast, Pathao & RedX — straight from an AI conversation. Your shop's logistics, fully agentic.",
|
||||
descriptionBn:
|
||||
"বাংলাদেশের প্রতিটা কুরিয়ারের জন্য একটাই Model Context Protocol কানেক্টর। Claude-এ যোগ করুন, নিজের কুরিয়ার key বসান, আর কথোপকথন থেকেই পার্সেল বুক ও ট্র্যাক করুন — Steadfast ও Pathao। আপনার দোকানের লজিস্টিক্স, এজেন্টিক।",
|
||||
stack: ["MCP", "Steadfast", "Pathao", "Claude", "TypeScript"],
|
||||
"বাংলাদেশের প্রতিটা কুরিয়ারের জন্য সর্বজনীন Model Context Protocol (MCP) কানেক্টর। নিজের কুরিয়ার key বসান, আর এআই কথোপকথন থেকেই পার্সেল বুক ও ট্র্যাক করুন — Steadfast, Pathao ও RedX। আপনার লজিস্টিক্স, ফুল্লি এজেন্টিক।",
|
||||
stack: ["MCP Standard", "Steadfast", "Pathao", "RedX", "TypeScript"],
|
||||
impact: { primary: "1", secondary: "connector · every courier" },
|
||||
color: "amber",
|
||||
highlights: [
|
||||
"Book & track parcels from Claude — no dashboard hopping",
|
||||
"Book & track parcels from any AI agent — no dashboard hopping",
|
||||
"One URL, your own courier keys — nothing stored by us",
|
||||
"Steadfast & Pathao live · RedX & Paperfly coming",
|
||||
"Works in Claude Desktop, Claude Code, or hosted",
|
||||
"Works across Gemini, Antigravity, MCP clients, or hosted API",
|
||||
"Open source — anyone can add it in seconds",
|
||||
],
|
||||
highlightsBn: [
|
||||
"Claude থেকেই পার্সেল বুক ও ট্র্যাক — ড্যাশবোর্ড ঘোরাঘুরি লাগবে না",
|
||||
"যেকোনো এআই এজেন্ট থেকে পার্সেল বুক ও ট্র্যাক — ড্যাশবোর্ড ঘোরাঘুরি লাগবে না",
|
||||
"একটা URL, আপনার নিজের কুরিয়ার key — আমরা কিছুই সংরক্ষণ করি না",
|
||||
"Steadfast ও Pathao লাইভ · RedX ও Paperfly আসছে",
|
||||
"Claude Desktop, Claude Code, বা hosted — সব জায়গায় কাজ করে",
|
||||
"Gemini, Antigravity ও যেকোনো MCP ক্লায়েন্টে কাজ করে",
|
||||
"ওপেন সোর্স — যে কেউ কয়েক সেকেন্ডে যোগ করতে পারে",
|
||||
],
|
||||
demo: "https://courier.auraajenticai.cloud",
|
||||
|
||||
+2
-144
@@ -370,7 +370,7 @@ const Contact = ({ lang = "en" }) => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ChatbotWidget />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<style>{`
|
||||
@@ -383,149 +383,7 @@ const Contact = ({ lang = "en" }) => {
|
||||
);
|
||||
};
|
||||
|
||||
const ChatbotWidget = () => {
|
||||
const [msgs, setMsgs] = React.useState([
|
||||
{ role: "bot", text: "Ask me anything about the work — projects, stack choices, timelines." },
|
||||
]);
|
||||
const [input, setInput] = React.useState("");
|
||||
const [thinking, setThinking] = React.useState(false);
|
||||
const scrollRef = React.useRef(null);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
||||
}, [msgs, thinking]);
|
||||
|
||||
const reply = async (q) => {
|
||||
setThinking(true);
|
||||
try {
|
||||
const text = await window.claude.complete(
|
||||
`You are a concise portfolio assistant for Aura, a senior agentic AI & full-stack engineer with 7+ years experience. Domains: AI agents, Web3, MLM/EA dashboards, full-stack. Answer in 1-3 sentences, professional but friendly. Question: ${q}`
|
||||
);
|
||||
setMsgs(m => [...m, { role: "bot", text }]);
|
||||
} catch (e) {
|
||||
setMsgs(m => [...m, { role: "bot", text: "Aura's offline — drop a note via the form and I'll reply within 48h." }]);
|
||||
}
|
||||
setThinking(false);
|
||||
};
|
||||
|
||||
const send = () => {
|
||||
const q = input.trim();
|
||||
if (!q) return;
|
||||
setMsgs(m => [...m, { role: "user", text: q }]);
|
||||
setInput("");
|
||||
reply(q);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="panel" style={{ padding: 0, overflow: "hidden" }}>
|
||||
<div style={{
|
||||
padding: "16px 20px",
|
||||
borderBottom: "1px solid var(--line)",
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
gap: 10,
|
||||
}}>
|
||||
<div style={{
|
||||
width: 28, height: 28,
|
||||
display: "grid", placeItems: "center",
|
||||
borderRadius: 7,
|
||||
background: "var(--accent-glow)",
|
||||
color: "var(--accent)",
|
||||
}}><Icons.Sparkles size={14} /></div>
|
||||
<div>
|
||||
<div style={{ fontSize: 13.5, fontWeight: 500 }}>Ask about my work</div>
|
||||
<div style={{ fontSize: 11, color: "var(--text-faint)", fontFamily: "var(--font-mono)" }}>powered by claude · live</div>
|
||||
</div>
|
||||
<span style={{
|
||||
marginLeft: "auto",
|
||||
fontSize: 10.5,
|
||||
padding: "2px 8px",
|
||||
background: "color-mix(in srgb, var(--good) 15%, transparent)",
|
||||
color: "var(--good)",
|
||||
border: "1px solid color-mix(in srgb, var(--good) 30%, transparent)",
|
||||
borderRadius: 999,
|
||||
fontFamily: "var(--font-mono)",
|
||||
textTransform: "uppercase",
|
||||
letterSpacing: "0.06em",
|
||||
}}>online</span>
|
||||
</div>
|
||||
<div ref={scrollRef} style={{
|
||||
padding: 16,
|
||||
height: 200,
|
||||
overflowY: "auto",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
gap: 10,
|
||||
fontSize: 13,
|
||||
}}>
|
||||
{msgs.map((m, i) => (
|
||||
<div key={i} style={{
|
||||
alignSelf: m.role === "user" ? "flex-end" : "flex-start",
|
||||
maxWidth: "85%",
|
||||
padding: "8px 12px",
|
||||
background: m.role === "user" ? "var(--accent)" : "var(--bg-elev)",
|
||||
color: m.role === "user" ? "white" : "var(--text)",
|
||||
border: m.role === "user" ? "none" : "1px solid var(--line)",
|
||||
borderRadius: 12,
|
||||
lineHeight: 1.5,
|
||||
}}>{m.text}</div>
|
||||
))}
|
||||
{thinking && (
|
||||
<div style={{
|
||||
alignSelf: "flex-start",
|
||||
padding: "8px 12px",
|
||||
background: "var(--bg-elev)",
|
||||
border: "1px solid var(--line)",
|
||||
borderRadius: 12,
|
||||
display: "flex", gap: 4, alignItems: "center",
|
||||
}}>
|
||||
{[0,1,2].map(i => (
|
||||
<span key={i} style={{
|
||||
width: 5, height: 5, borderRadius: "50%",
|
||||
background: "var(--text-faint)",
|
||||
animation: `pulse-dot 1.2s ${i * 0.15}s infinite`,
|
||||
}} />
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<form onSubmit={(e) => { e.preventDefault(); send(); }} style={{
|
||||
display: "flex",
|
||||
gap: 8,
|
||||
padding: 12,
|
||||
borderTop: "1px solid var(--line)",
|
||||
background: "var(--bg-elev)",
|
||||
}}>
|
||||
<input
|
||||
value={input}
|
||||
onChange={(e) => setInput(e.target.value)}
|
||||
placeholder="Ask about a project, stack, or timeline…"
|
||||
style={{
|
||||
flex: 1,
|
||||
background: "var(--bg-card)",
|
||||
color: "var(--text)",
|
||||
border: "1px solid var(--line)",
|
||||
borderRadius: 8,
|
||||
padding: "9px 12px",
|
||||
fontSize: 13,
|
||||
fontFamily: "inherit",
|
||||
outline: "none",
|
||||
}}
|
||||
/>
|
||||
<button type="submit" style={{
|
||||
padding: "0 12px",
|
||||
background: "var(--text)",
|
||||
color: "var(--bg)",
|
||||
border: "none",
|
||||
borderRadius: 8,
|
||||
fontSize: 12,
|
||||
fontWeight: 500,
|
||||
display: "flex", alignItems: "center", gap: 6,
|
||||
}}><Icons.Send size={12} /></button>
|
||||
</form>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
const ChatbotWidget = () => null;
|
||||
|
||||
const Footer = ({ lang = "en" }) => {
|
||||
const D = PORTFOLIO_DATA;
|
||||
|
||||
Reference in New Issue
Block a user