This is my personal website for my research, field work, publications, skills, and contact details.
Live site: www.akashpandey.com
This is not a vibe-coded website. I made it for myself and still change it when I learn something new. I deliberately keep the content in JSON and Markdown, store the photos and CV as normal files, and use static pages where possible. It is a little old-fashioned, but it is quick for me to edit and easy to host. I took some help from ChatGPT when I got stuck.
The photo stack on the home page is inspired by the clean stacked-card feeling on tedawf.com. Thank you for the design inspiration.
The site uses Next.js, React, Tailwind CSS, and a few small local components.
Most content lives in src/data as JSON or Markdown. Photos and documents live
in public, so I can update the site without touching too much code.
MapLibre renders the map. NASA GIBS is used for the low-zoom satellite view, Esri imagery helps at high zoom, CelesTrak supplies public orbital records, and satellite.js calculates the ground positions and tracks. KASI answers common questions from local site knowledge and can use OpenRouter when needed. The contact form sends email through Resend.
You need a recent Node.js version and npm.
git clone https://github.com/ItsAkashPandey/akashpandey.com.git
cd akashpandey.com
npm install
Copy-Item .env.example .env.local
npm run devOpen http://localhost:3000.
The normal pages work from local files. KASI, contact mail, optional chat
logging, and live satellite refresh need the matching values from .env.example.
Before pushing a change, I normally run:
npm run lint
npm run buildsrc/data/activities.jsonhas activities and links.src/data/publications.jsonhas papers, DOI links, and publication images.src/data/skills.jsonhas tools, instruments, and skill photos.src/data/career.jsonandsrc/data/education.jsonhave the timeline.src/data/profile.mdhas the facts used by KASI.src/data/privacy.mdis the privacy page text.public/resume.pdfis the CV linked from the home page.
Activity photos go in a folder under public. This command rebuilds the
resolvedImages lists from the real files:
npx ts-node scripts/resolve-activity-images.tsNew photos are large, so I shrink them before committing:
node scripts/optimize-images.mjsI keep external links in the same JSON record as the related activity or publication. I check a link before adding it instead of guessing a post URL.
The main branch is connected to Vercel. Add the required environment variables
in Vercel, push to main, and Vercel builds the site.
Admin sign-in reads ADMIN_USERNAME, ADMIN_PASSWORD and ADMIN_SESSION_SECRET
from the environment. There is no default, so if those are missing the admin page
simply refuses every login.
Saving the KASI chat messages needs a database or a Google Sheet. The setup for both is written down in docs/chat-logging.md.
Do not commit .env.local. It contains private keys.
The satellites on the map are the real NASA models from
NASA 3D Resources. The short
background clips behind each page come from the
NASA Scientific Visualization Studio. Both are
public domain. I trimmed and re-encoded the clips so they are small enough to
serve; the full list with links is in public/motion/attribution.txt.
Thanks to tedawf.com for the original inspiration, especially the way photographs and research work are presented. The open-source WorldWideView project was also useful while I was learning how orbit tracks can be presented.
The code is available under the MIT License.
