——Systems & AI Engineer Portfolio BTech CSE (Final Year)
- GitHub: Nikhil-creat
- LinkedIn: nikhil-chary-sriramoju
- Email: sriramojunikhil66@gmail.com
- Instagram: @nikhil__sriramoju
- Facebook: Profile
Production architecture for a Next.js 14 (App Router) + TypeScript + Tailwind portfolio with an agentic "Digital Twin" co-pilot, a live terminal emulator, a filterable bento project grid, and a real uptime telemetry widget.
portfolio/
├── app/
│ ├── layout.tsx # Root layout, fonts, ThemeProvider, CommandCenterProvider
│ ├── page.tsx # Composes Hero, BentoGrid, Milestones, Telemetry
│ ├── terminal/page.tsx # Full-screen /terminal route
│ ├── api/
│ │ ├── copilot/route.ts # POST — streams the agent's response (Claude API)
│ │ ├── copilot/tools.ts # Tool definitions the agent can call (filter_projects, open_scheduler, ...)
│ │ ├── status/route.ts # GET — live uptime pings for deployed services
│ │ └── schedule/route.ts # POST — writes a scheduling request (Cal.com / Resend)
│ └── globals.css
├── components/
│ ├── copilot/
│ │ ├── CommandCenter.tsx # Cmd+K modal shell, routes agent tool_use to UI actions
│ │ ├── ChatStream.tsx # Streaming message list, tool-call chips
│ │ ├── FloatingLauncher.tsx # Persistent FAB, opens CommandCenter
│ │ └── SchedulerDrawer.tsx # Recruiter-intent contact/scheduling drawer
│ ├── terminal/
│ │ ├── TerminalShell.tsx # xterm-like emulator, command registry, history
│ │ ├── commands.ts # help / cat / projects / skills / ping --distributed
│ │ └── TerminalLine.tsx
│ ├── bento/
│ │ ├── BentoGrid.tsx # Filterable/highlightable project grid
│ │ ├── ProjectCard.tsx
│ │ └── SkillMatrix.tsx # Categorized capability badges
│ ├── telemetry/
│ │ ├── UptimeWidget.tsx # Live status badges, polls /api/status
│ │ └── StatusPill.tsx
│ ├── drawer/
│ │ └── ArchitectureDrawer.tsx # Slide-over: stack, data-flow, links
│ └── ui/ # shadcn primitives (button, dialog, sheet, badge...)
├── data/
│ ├── profile.ts # Builder data (Nikhil's real info)
│ ├── projects.ts # DistWorkspace, TrustGuard AI, CircleUp, Codelint, PDF RAG
│ ├── experience.ts # Yuva Intern, Thiranex, Forage simulations
│ └── services.ts # Deployed service endpoints for telemetry
├── lib/
│ ├── agent-context.ts # System prompt + structured facts fed to the copilot
│ ├── ui-actions.ts # Typed dispatch: filterProjects(), openScheduler(), scrollTo()
│ └── copilot-client.ts # fetch wrapper + SSE parsing for /api/copilot
├── types/
│ └── index.ts # Shared TS interfaces
└── .env.local.example
Create .env.local from the example below. The copilot route calls a free
OpenAI-compatible chat-completions endpoint server-side — Groq by default,
Gemini as a one-line swap — so the key never reaches the client.
COPILOT_PROVIDER=groq # "groq" or "gemini"
GROQ_API_KEY=gsk_... # console.groq.com/keys — free tier
GROQ_MODEL=llama-3.3-70b-versatile
GEMINI_API_KEY=AIza... # aistudio.google.com/apikey — free tier
GEMINI_MODEL=gemini-2.0-flash
NEXT_PUBLIC_SITE_URL=https://nikhilsriramoju.dev
# Telemetry — real deployed endpoints this widget pings
STATUS_CIRCLEUP_URL=https://circleup-api.onrender.com/healthz
STATUS_CODELINT_URL=https://codelint.vercel.app/api/health
STATUS_TRUSTGUARD_URL=https://trustguard-ai.onrender.com/health
# Scheduling
RESEND_API_KEY=re_...
CALCOM_LINK=https://cal.com/nikhil-sriramoju/intro
# Contact
CONTACT_EMAIL=sriramojunikhil66@gmail.com
npx create-next-app@latest portfolio --typescript --tailwind --app
cd portfolio
npx shadcn@latest init
npx shadcn@latest add dialog sheet badge button command scroll-area
npm install framer-motion lucide-react zod ai- Background
#0a0a0c, surface#111114, hairline borderrgba(255,255,255,0.08) - Accent (systems/Raft)
#5B8DEF, accent (AI/ML)#7C6CF0, signal-green#34D399 - Type:
Space Groteskfor display/headlines,Interfor body/UI,JetBrains Monofor terminal + telemetry data only (not decorative labels) - One border-radius scale:
6pxcards,10pxmodals/drawers — no mixed radii - Motion: a single orchestrated hero reveal on load; everything else responds to direct interaction (open drawer, run command, agent tool call) — no per-card hover-fade defaults