{"id":44289533,"url":"https://github.com/denisugiarto/my-portfolio","last_synced_at":"2026-02-10T23:11:03.793Z","repository":{"id":248615401,"uuid":"506699432","full_name":"denisugiarto/my-portfolio","owner":"denisugiarto","description":"Nextjs, React Query, Typescript, Framer Motion, Tailwind CSS, Shadcn UI. Personal Portfolio website","archived":false,"fork":false,"pushed_at":"2025-10-15T20:27:58.000Z","size":6168,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-16T21:49:07.117Z","etag":null,"topics":["blog","framer","javascript","landing-page","nextjs","personal-website","portfolio","react-query","reactjs","shadcn-ui","tailwindcss","typescript","vercel","web"],"latest_commit_sha":null,"homepage":"https://www.denisugiarto.my.id/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/denisugiarto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-23T15:44:52.000Z","updated_at":"2025-10-15T20:28:02.000Z","dependencies_parsed_at":"2026-01-06T06:10:58.202Z","dependency_job_id":null,"html_url":"https://github.com/denisugiarto/my-portfolio","commit_stats":null,"previous_names":["denisugiarto/my-portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/denisugiarto/my-portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisugiarto%2Fmy-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisugiarto%2Fmy-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisugiarto%2Fmy-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisugiarto%2Fmy-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/denisugiarto","download_url":"https://codeload.github.com/denisugiarto/my-portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisugiarto%2Fmy-portfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29321280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T20:44:44.282Z","status":"ssl_error","status_checked_at":"2026-02-10T20:44:43.393Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog","framer","javascript","landing-page","nextjs","personal-website","portfolio","react-query","reactjs","shadcn-ui","tailwindcss","typescript","vercel","web"],"created_at":"2026-02-10T23:11:03.683Z","updated_at":"2026-02-10T23:11:03.782Z","avatar_url":"https://github.com/denisugiarto.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# My Portfolio Website\n\nThis is a personal portfolio website built using modern web technologies to showcase my skills and experience.\n\n## Preview\n\n![screencapture-denisugiarto-my-id-2024-12-07-20_11_41](https://github.com/user-attachments/assets/2789b29e-1c02-4d25-a7fb-bcd91d6629ff)\n\n## Tech Stack\n\n### Frontend\n- **Next.js 15**: Performant and SEO-friendly React framework with App Router\n- **TypeScript**: Enhanced type safety and code maintainability\n- **Tailwind CSS**: Rapid and responsive UI development\n- **Shadcn UI**: Pre-styled components for streamlined development\n- **Framer Motion**: Smooth and delightful animations\n\n### Content Management\n- **Sanity CMS**: Headless CMS for managing all website content\n- **Sanity Studio**: Built-in content editor accessible at `/studio`\n\n### Data Fetching \u0026 State Management\n- **TanStack React Query**: Efficient data fetching with automatic caching\n- **Axios**: HTTP requests to external APIs\n\n### UI \u0026 Utilities\n- **Lucide React**: Rich set of customizable icons\n- **dayjs**: Lightweight date and time manipulation\n- **react-time-ago**: Display relative time for blog posts\n- **react-markdown**: Markdown rendering with syntax highlighting\n\n### Analytics \u0026 SEO\n- **Google Analytics**: Website traffic tracking and insights\n- **next-sitemap**: Automatic sitemap generation\n- **next-seo**: SEO optimization utilities\n\n### Features\n- Dark/Light mode with `next-themes`\n- Responsive design with mobile-first approach\n- Blog with category filtering and pagination\n- Project showcase with detailed pages\n- Contact form with Sanity backend\n- Experience timeline\n- SEO optimized with meta tags and structured data\n\n## Getting Started\n\n### Prerequisites\n- Node.js 18+\n- pnpm (recommended) or npm\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone \u003cyour-repo-url\u003e\ncd my-portfolio\n\n# Install dependencies\npnpm install\n\n# Set up environment variables\ncp .env.example .env.local\n```\n\n### Environment Variables\n\nCreate a `.env.local` file with the following variables:\n\n```env\n# Sanity CMS\nNEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id\nNEXT_PUBLIC_SANITY_DATASET=production\nSANITY_API_TOKEN=your_token_here\n\n# Google Analytics (optional)\nNEXT_PUBLIC_GOOGLE_ANALYTICS=G-XXXXXXXXXX\n```\n\n### Development\n\n```bash\n# Start Next.js development server (port 3000)\npnpm dev\n\n# Start Sanity Studio (port 3333)\npnpm sanity\n\n# Start both Next.js and Sanity Studio concurrently\npnpm dev:all\n```\n\nVisit:\n- **Website**: http://localhost:3000\n- **Sanity Studio**: http://localhost:3000/studio\n\n### Building for Production\n\n```bash\n# Build Next.js application\npnpm build\n\n# Start production server\npnpm start\n\n# Build Sanity Studio\npnpm sanity:build\n```\n\n## Sanity CMS Commands\n\n### Authentication\n```bash\n# Login to Sanity account\npnpm sanity:login\n\n# Logout from Sanity account\npnpm sanity:logout\n\n# Check current login status\nsanity whoami\n```\n\n### Development\n```bash\n# Start Sanity Studio locally\npnpm sanity\n\n# Open Sanity project dashboard\npnpm sanity:manage\n```\n\n### Deployment\n```bash\n# Deploy Sanity Studio to cloud\npnpm sanity:deploy\n\n# Build Sanity Studio for production\npnpm sanity:build\n```\n\n### Data Management\n```bash\n# Export dataset to file\npnpm sanity:dataset:export\n\n# Import dataset from file\npnpm sanity:dataset:import \u003cfile.tar.gz\u003e\n```\n\n### Advanced Sanity Commands\n```bash\n# Authentication\nsanity login              # Login to Sanity\nsanity logout             # Logout from Sanity\nsanity whoami             # Check current user\n\n# Export specific dataset\nsanity dataset export production backup.tar.gz\n\n# Import to specific dataset\nsanity dataset import backup.tar.gz production\n\n# Create new dataset\nsanity dataset create staging\n\n# List all datasets\nsanity dataset list\n\n# Copy dataset\nsanity dataset copy production staging\n\n# Delete dataset (use with caution!)\nsanity dataset delete staging\n\n# Manage users and permissions\nsanity users list\nsanity users invite user@example.com\n\n# Check Sanity CLI version\nsanity --version\n\n# Upgrade Sanity dependencies\nsanity upgrade\n\n# View project info\nsanity projects list\n```\n\n## Project Structure\n\n```\nmy-portfolio/\n├── app/                    # Next.js App Router pages\n│   ├── blog/              # Blog pages\n│   ├── projects/          # Project pages\n│   ├── experience/        # Experience pages\n│   └── studio/            # Sanity Studio route\n├── components/            # Reusable UI components\n│   ├── Layout/           # Layout components\n│   └── ui/               # Shadcn UI components\n├── features/             # Feature-specific components\n│   ├── blog/            # Blog components\n│   ├── home/            # Home page sections\n│   └── projects/        # Project components\n├── lib/                  # Utility functions\n│   ├── sanity.ts        # Sanity client setup\n│   └── sanity-queries.ts # Sanity GROQ queries\n├── sanity/              # Sanity CMS configuration\n│   └── schemas/         # Content schemas\n├── services/            # API services\n├── types/              # TypeScript type definitions\n└── public/             # Static assets\n```\n\n## Sanity Schemas\n\nThe project includes the following Sanity schemas:\n\n### Content Types\n- **Blog Post**: Articles with categories, tags, and SEO\n- **Blog Category**: Categories for organizing blog posts\n- **Project**: Portfolio projects with galleries and tech stacks\n- **Experience**: Work experience timeline\n- **Technology**: Tech stack and skills\n- **Tag**: Tags for blog posts\n- **Contact**: Contact form submissions\n\n### Configuration\n- **Site Settings**: Global site configuration\n- **SEO Settings**: Per-page SEO configuration\n- **Hero Section**: Homepage hero content\n- **About Section**: About page content\n- **Skills Section**: Skills showcase\n- **Social Link**: Social media links\n\n## Content Management\n\n### Creating Blog Posts\n1. Open Sanity Studio at `/studio`\n2. Create a **Blog Category** first\n3. Go to **Blog Post** and click \"Create new\"\n4. Fill in:\n   - Title (required)\n   - Slug (auto-generated)\n   - Category (required)\n   - Excerpt (recommended for SEO)\n   - Content (Markdown supported)\n   - Cover Image\n   - Tags\n   - SEO metadata\n5. Toggle \"Published\" to make it visible\n\n### Managing Categories\n- Categories support custom colors and icons (Lucide icons)\n- Example icon names: `Code`, `Rocket`, `Book`, `Lightbulb`\n- Colors: blue, green, red, yellow, purple, pink, indigo, gray, or custom hex\n\n## Deployment\n\n### Vercel (Recommended)\n1. Push code to GitHub\n2. Import project in Vercel\n3. Add environment variables\n4. Deploy\n\n### Sanity Studio Deployment\n```bash\npnpm sanity:deploy\n```\n\nThis deploys Sanity Studio to `https://your-project.sanity.studio`\n\n## Scripts Reference\n\n| Command | Description |\n|---------|-------------|\n| `pnpm dev` | Start Next.js dev server |\n| `pnpm dev:all` | Start Next.js + Sanity Studio |\n| `pnpm build` | Build Next.js for production |\n| `pnpm start` | Start production server |\n| `pnpm lint` | Run ESLint |\n| `pnpm format` | Format code with Prettier |\n| `pnpm analyze` | Analyze bundle size |\n| `pnpm sanity` | Start Sanity Studio locally |\n| `pnpm sanity:login` | Login to Sanity account |\n| `pnpm sanity:logout` | Logout from Sanity account |\n| `pnpm sanity:build` | Build Sanity Studio |\n| `pnpm sanity:deploy` | Deploy Sanity Studio |\n| `pnpm sanity:manage` | Open Sanity dashboard |\n| `pnpm sanity:dataset:export` | Export Sanity data |\n| `pnpm sanity:dataset:import` | Import Sanity data |\n\n## Pages\n\n- **Landing Page**:\n  - Home: Introduction and hero section\n  - About: Personal info, skills, achievements\n  - Experience: Professional background timeline\n  - Projects: Portfolio showcase\n  - Contact: Contact form and social links\n- **Blog**: Articles with category filtering and search\n- **Project Details**: Individual project pages\n- **Sanity Studio**: Content management at `/studio`\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenisugiarto%2Fmy-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdenisugiarto%2Fmy-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenisugiarto%2Fmy-portfolio/lists"}