Personal portfolio and speaker platform for Faris Aziz - Staff Software Engineer, Conference Speaker & Workshop Instructor.
- Frontend: Astro 5.x with React islands
- CMS: Sanity v3 with custom schemas
- Styling: Tailwind CSS with custom design tokens
- Monorepo: pnpm workspaces
/
├── apps/
│ ├── web/ # Astro website
│ │ ├── src/
│ │ │ ├── components/ # Astro & React components
│ │ │ ├── layouts/ # Page layouts
│ │ │ ├── lib/sanity/ # Sanity client & queries
│ │ │ ├── pages/ # Astro pages
│ │ │ └── styles/ # Global styles
│ │ └── public/ # Static assets
│ └── studio/ # Sanity Studio
│ ├── schemas/ # Content schemas
│ └── desk/ # Desk structure
├── packages/
│ └── shared/ # Shared types & utilities
├── scripts/
│ └── migrate-content.ts # Content migration script
└── .migration-data/ # Backup of original content
- Node.js 20+
- pnpm 9+
- Sanity account (for CMS)
# Clone the repository
git clone https://github.com/farisaziz12/portfolio-website.git
cd portfolio-website
# Install dependencies
pnpm install
# Set up environment variables
cp apps/web/.env.example apps/web/.env
cp apps/studio/.env.example apps/studio/.env
# Edit .env files with your Sanity credentials# Start all apps (web + studio)
pnpm dev
# Start only the website
pnpm web
# Start only Sanity Studio
pnpm studio# Build all apps
pnpm build
# Build only the website
pnpm --filter web buildPUBLIC_SANITY_PROJECT_ID=your_project_id
PUBLIC_SANITY_DATASET=productionSANITY_STUDIO_PROJECT_ID=your_project_id
SANITY_STUDIO_DATASET=productionSANITY_PROJECT_ID=your_project_id
SANITY_DATASET=production
SANITY_API_TOKEN=your_write_tokenTo migrate content from the backup JSON files to Sanity:
# Set environment variables
export SANITY_PROJECT_ID=your_project_id
export SANITY_DATASET=production
export SANITY_API_TOKEN=your_write_token
# Run migration
pnpm migrateSee CONTENT_GUIDE.md for detailed content management instructions.
| Route | Description |
|---|---|
/ |
Home page with hero, stats, upcoming events |
/speaking |
Speaking overview with upcoming/past events |
/events |
All events archive |
/events/[slug] |
Individual event detail |
/talks |
Available talks index |
/talks/[slug] |
Talk detail with event history |
/workshops |
Workshops index |
/workshops/[slug] |
Workshop detail |
/invite |
Speaker kit for event organizers |
/about |
About page with work experience |
/projects |
Projects portfolio |
/projects/[slug] |
Project detail |
/media |
Photo/video gallery |
/blog |
External posts & podcasts |
/rss.xml |
RSS feed |
| Schema | Description |
|---|---|
talk |
Canonical talk topics |
event |
Speaking event occurrences |
workshop |
Workshop offerings |
project |
Portfolio projects |
company |
Work experience |
media |
Gallery photos/videos |
testimonial |
Social proof quotes |
externalPost |
External articles/podcasts |
page |
Editable pages |
speakerProfile |
Speaker kit singleton |
- Connect your GitHub repository to Vercel
- Set the root directory to
apps/web - Add environment variables in Vercel dashboard
- Deploy!
cd apps/studio
npx sanity deployMIT