Arya Setia Pratama

🌌 Personal Web Portfolio β€” Next.js & Sanity

Next.js TypeScript Sanity Tailwind CSS Framer Motion Vercel

A premium, high-performance personal portfolio built with the modern Jamstack architecture.
Decoupled presentation layer from content management β€” fast, scalable, and always in sync.


✨ Features


πŸ› οΈ Tech Stack

Layer Technology Purpose
Framework Next.js (App Router) Routing, SSG, ISR, API Routes
Language TypeScript Static typing, compile-time safety
Styling Tailwind CSS Dark mode, glassmorphism, bento grid
Animations Framer Motion Micro-interactions, page transitions
CMS Sanity.io Headless content management
Deployment Vercel CI/CD, auto-deploy on push

πŸ—οΈ Architecture & Data Flow

The system uses a modern decoupled (Jamstack) architecture with three main layers:

  1. Sanity Studio (CMS): A React-based workspace where the admin manages project entries, author profile, and articles. Data is stored on Sanity’s cloud.
  2. GROQ Query Layer: Next.js fetches structured JSON data from Sanity using GROQ (Graph-Relational Object Queries).
  3. Next.js Frontend: Renders data into optimized static HTML at build time (SSG), or updates pages on-demand via ISR when a Sanity Webhook fires on content publish.

πŸ“‚ Project Structure

src/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ layout.tsx          # Root layout (Navbar, Footer, Dark Mode init)
β”‚   β”œβ”€β”€ page.tsx            # Homepage (Hero, Skills, Project Highlights)
β”‚   β”œβ”€β”€ projects/
β”‚   β”‚   β”œβ”€β”€ page.tsx        # All Projects page (Bento grid layout)
β”‚   β”‚   └── [slug]/
β”‚   β”‚       └── page.tsx    # Dynamic Project Detail page
β”‚   β”œβ”€β”€ about/
β”‚   β”‚   └── page.tsx        # About page (Full profile + CV download)
β”‚   └── api/
β”‚       └── revalidate/     # ISR Webhook handler from Sanity
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ ui/                 # Buttons, Cards, Inputs (glassmorphism styles)
β”‚   └── sanity/             # Portable Text renderer for Sanity content
└── sanity/
    β”œβ”€β”€ schemas/            # Data model definitions (project.ts, author.ts)
    └── lib/                # Sanity client, GROQ query configs

πŸ—„οΈ Content Model (Sanity Schema)

project β€” Portfolio Projects

| Field | Type | Description | |β€”|β€”|β€”| | title | String | Project or research name | | slug | Slug | Unique URL identifier (e.g. sistem-pakar-diagnosa) | | summary | Text | Short project summary | | coverImage | Image | Main screenshot / banner | | techStack | String[] | Technologies used (e.g. "Python", "React") | | repositoryUrl | URL | GitHub repository link | | content | Portable Text | Deep-dive: background, methodology, test results |

author β€” Owner Profile

| Field | Type | Description | |β€”|β€”|β€”| | name | String | Full name | | bio | Block Content | Education background and expertise (AI & SE) | | resume | File | PDF Curriculum Vitae | | socialLinks | Object[] | LinkedIn, GitHub, Email links |


πŸš€ Getting Started

Prerequisites

Installation

  1. Clone the repository:
    git clone https://github.com/aryasetiap/aryasetiap.github.io.git
    cd aryasetiap.github.io
    
  2. Install dependencies:
    npm install
    
  3. Environment Setup: Create a .env.local file at the root:
    NEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id
    NEXT_PUBLIC_SANITY_DATASET=production
    SANITY_API_TOKEN=your_api_token
    
  4. Run the development server:
    npm run dev
    

    Open http://localhost:3000.


🚒 Deployment (CI/CD)

This project uses a zero-downtime, fully automated deployment pipeline:

  1. GitHub holds the main branch as source of truth.
  2. Vercel listens on main β€” every git push triggers an automatic build.
  3. Sanity Webhook fires a POST to /api/revalidate every time a project or author document is published, triggering ISR to refresh only the affected pages β€” keeping the site fast and data always in sync.

🌐 Connect with Me

LinkedIn GitHub Email

Made with ❀️ by Arya Setia Pratama