{"id":18287545,"url":"https://github.com/othytenk/my-portfolio","last_synced_at":"2026-04-12T10:45:59.933Z","repository":{"id":190819730,"uuid":"683413225","full_name":"OthyTenk/my-portfolio","owner":"OthyTenk","description":"The sample portfolio with Next.js and Sanity","archived":false,"fork":false,"pushed_at":"2026-03-16T08:29:10.000Z","size":2349,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-16T19:55:10.268Z","etag":null,"topics":["nextjs","sanity","tailwindcss"],"latest_commit_sha":null,"homepage":"https://ver41.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OthyTenk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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":"2023-08-26T13:51:26.000Z","updated_at":"2026-03-16T08:29:14.000Z","dependencies_parsed_at":"2025-04-09T06:41:28.252Z","dependency_job_id":"01f8f77a-4559-4208-bd33-1676b005619d","html_url":"https://github.com/OthyTenk/my-portfolio","commit_stats":null,"previous_names":["othytenk/my-portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/OthyTenk/my-portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OthyTenk%2Fmy-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OthyTenk%2Fmy-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OthyTenk%2Fmy-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OthyTenk%2Fmy-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OthyTenk","download_url":"https://codeload.github.com/OthyTenk/my-portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OthyTenk%2Fmy-portfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31712292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["nextjs","sanity","tailwindcss"],"created_at":"2024-11-05T13:28:15.390Z","updated_at":"2026-04-12T10:45:59.924Z","avatar_url":"https://github.com/OthyTenk.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e🚀 OkDo's Portfolio\u003c/h1\u003e\n  \u003cp\u003eA modern, responsive personal portfolio built with Next.js 15 and Sanity CMS\u003c/p\u003e\n  \n  [![Next.js](https://img.shields.io/badge/Next.js-15.5.7-black?style=flat-square\u0026logo=next.js)](https://nextjs.org/)\n  [![TypeScript](https://img.shields.io/badge/TypeScript-5.3.2-blue?style=flat-square\u0026logo=typescript)](https://www.typescriptlang.org/)\n  [![Tailwind CSS](https://img.shields.io/badge/Tailwind-3.3.5-38B2AC?style=flat-square\u0026logo=tailwind-css)](https://tailwindcss.com/)\n  [![Sanity](https://img.shields.io/badge/Sanity-4.6.1-F03E2F?style=flat-square\u0026logo=sanity)](https://www.sanity.io/)\n  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)\n  [![pnpm](https://img.shields.io/badge/pnpm-10.15.0-F69220?style=flat-square\u0026logo=pnpm)](https://pnpm.io/)\n\u003c/div\u003e\n\n---\n\n## 📸 Screenshot\n\n![Portfolio Preview](https://github.com/OthyTenk/my-portfolio/assets/34827155/b6da77c6-cb83-43fd-a99e-788d4e0513d6)\n\n---\n\n## ✨ Features\n\n- **🎨 Modern Design**: Clean, minimalist UI with dark mode support using `next-themes`\n- **📱 Fully Responsive**: Optimized for all devices from mobile to desktop\n- **⚡ Server-Side Rendering**: Built with Next.js 15 App Router for optimal performance\n- **🗄️ Headless CMS**: Powered by Sanity for easy content management\n- **🎯 Project Showcase**: Dynamic project portfolio with categorization\n- **👤 Profile Management**: Editable bio, social links, and professional information\n- **📊 Analytics**: Integrated with Vercel Analytics for visitor insights\n- **🎭 Rich Content**: Support for Portable Text with custom components\n- **🔍 SEO Optimized**: Meta tags and structured data for better search visibility\n- **⚙️ Type Safety**: Fully typed with TypeScript for robust development\n- **🎨 Tailwind CSS**: Utility-first styling with custom plugins for typography and forms\n\n---\n\n## 🛠️ Tech Stack\n\n### Frontend\n\n- **Framework**: [Next.js 15.5.7](https://nextjs.org/) with App Router\n- **Language**: [TypeScript 5.3.2](https://www.typescriptlang.org/)\n- **Styling**: [Tailwind CSS 3.3.5](https://tailwindcss.com/)\n- **UI Components**: [@headlessui/react 2.2.7](https://headlessui.com/)\n- **Theme**: [next-themes 0.4.6](https://github.com/pacocoursey/next-themes)\n- **Content Rendering**: [@portabletext/react 4.0.3](https://github.com/portabletext/react-portabletext)\n- **Date Formatting**: [date-fns 4.1.0](https://date-fns.org/)\n\n### Backend \u0026 CMS\n\n- **CMS**: [Sanity 4.6.1](https://www.sanity.io/)\n- **Sanity Client**: [next-sanity 10.0.16](https://github.com/sanity-io/next-sanity)\n- **Content Management**: Sanity Studio (embedded at `/studio`)\n\n### Analytics \u0026 Deployment\n\n- **Analytics**: [@vercel/analytics 1.5.0](https://vercel.com/analytics)\n- **Deployment**: Optimized for [Vercel](https://vercel.com)\n- **Package Manager**: [pnpm 10.15.0](https://pnpm.io/)\n\n---\n\n## 📁 Project Structure\n\n```\nmy-portfolio/\n├── app/\n│   ├── (site)/              # Main site routes\n│   │   ├── components/      # Reusable UI components\n│   │   ├── projects/        # Project showcase pages\n│   │   ├── admin/           # Admin dashboard\n│   │   ├── layout.tsx       # Site layout wrapper\n│   │   └── page.tsx         # Homepage\n│   ├── (studio)/            # Sanity Studio routes\n│   │   └── studio/\n│   │       └── [[...index]]/\n│   ├── schemas/             # Sanity schemas\n│   │   ├── profile.ts       # Profile content type\n│   │   ├── project.ts       # Project content type\n│   │   ├── category.ts      # Category content type\n│   │   └── index.ts         # Schema exports\n│   ├── types/               # TypeScript type definitions\n│   ├── utils/               # Utility functions\n│   │   ├── sanity.client.ts # Sanity client configuration\n│   │   └── flatListHierarchical.ts\n│   ├── layout.tsx           # Root layout\n│   ├── globals.css          # Global styles\n│   └── not-found.tsx        # 404 page\n├── public/\n│   └── images/\n│       └── socials/         # Social media icons\n├── sanity-project/          # Standalone Sanity studio\n├── .github/\n│   └── ISSUE_TEMPLATE/      # GitHub issue templates\n├── sanity.config.ts         # Sanity configuration\n├── next.config.js           # Next.js configuration\n├── tailwind.config.ts       # Tailwind CSS configuration\n├── tsconfig.json            # TypeScript configuration\n└── package.json             # Project dependencies\n```\n\n---\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- **Node.js** 20.x or higher\n- **pnpm** 10.15.0 (or npm/yarn)\n- **Sanity Account** (free at [sanity.io](https://www.sanity.io))\n\n### Installation\n\n1. **Clone the repository**\n\n   ```bash\n   git clone https://github.com/OthyTenk/my-portfolio.git\n   cd my-portfolio\n   ```\n\n2. **Install dependencies**\n\n   ```bash\n   pnpm install\n   # or\n   npm install\n   ```\n\n3. **Set up Sanity CMS**\n\n   Navigate to the sanity-project directory:\n\n   ```bash\n   cd sanity-project\n   ```\n\n   Login to Sanity and create a new project:\n\n   ```bash\n   npx sanity@latest login\n   npx sanity@latest init\n   ```\n\n   Follow the prompts to:\n   - Create a new project or select an existing one\n   - Choose the \"Clean\" template\n   - Set dataset to \"production\"\n\n4. **Configure Sanity credentials**\n\n   Update `sanity.config.ts` with your project credentials:\n\n   ```typescript\n   export default defineConfig({\n     name: \"sanity-project\",\n     title: \"Your Portfolio\",\n     projectId: \"YOUR_PROJECT_ID\", // Get from sanity.io\n     dataset: \"production\",\n     // ... rest of config\n   });\n   ```\n\n5. **Run the development server**\n\n   In the main project directory:\n\n   ```bash\n   pnpm dev\n   # or\n   npm run dev\n   ```\n\n   In a separate terminal, run Sanity Studio:\n\n   ```bash\n   cd sanity-project\n   pnpm dev\n   # or\n   npm run dev\n   ```\n\n6. **Access the application**\n   - **Portfolio Site**: [http://localhost:3000](http://localhost:3000)\n   - **Sanity Studio (embedded)**: [http://localhost:3000/studio](http://localhost:3000/studio)\n   - **Sanity Studio (standalone)**: [http://localhost:3333](http://localhost:3333)\n\n---\n\n## 📝 Content Management\n\n### Creating Content in Sanity Studio\n\n1. **Profile Information**\n   - Navigate to Studio → Profile\n   - Add your personal information, bio, profile picture\n   - Configure social media links (GitHub, LinkedIn, Twitter)\n   - Upload your resume (optional)\n\n2. **Projects**\n   - Navigate to Studio → Projects\n   - Click \"Create\" to add a new project\n   - Fill in project details:\n     - Title \u0026 Slug\n     - Overview/Description\n     - Project Image\n     - Live Link\n     - Categories\n     - Date\n\n3. **Categories**\n   - Navigate to Studio → Categories\n   - Create parent categories (e.g., \"Frontend\", \"Backend\")\n   - Create child categories for specific technologies\n   - Add category images/icons\n\n---\n\n## 🎨 Customization\n\n### Styling\n\nCustomize the theme in `tailwind.config.ts`:\n\n```typescript\nconst config: Config = {\n  theme: {\n    extend: {\n      colors: {\n        // Add your custom colors\n      },\n      // Add custom fonts, spacing, etc.\n    },\n  },\n};\n```\n\n### Dark Mode\n\nThe portfolio includes a built-in dark mode toggle. Customize dark mode colors in:\n\n- `app/layout.tsx` - Root theme setup\n- `app/globals.css` - Global dark mode styles\n- Component-level Tailwind classes using `dark:` prefix\n\n---\n\n## 🚢 Deployment\n\n### Deploy to Vercel (Recommended)\n\n1. **Push your code to GitHub**\n\n   ```bash\n   git add .\n   git commit -m \"Initial commit\"\n   git push origin main\n   ```\n\n2. **Import to Vercel**\n   - Visit [vercel.com](https://vercel.com)\n   - Import your GitHub repository\n   - Vercel will auto-detect Next.js settings\n   - Add environment variables if needed\n   - Deploy!\n\n3. **Deploy Sanity Studio**\n   ```bash\n   cd sanity-project\n   pnpm run deploy\n   # or\n   npm run deploy\n   ```\n\n### Environment Variables\n\nIf using external APIs or services, create a `.env.local` file:\n\n```env\nNEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id\nNEXT_PUBLIC_SANITY_DATASET=production\nSANITY_API_TOKEN=your_api_token (for mutations)\n```\n\n---\n\n## 📊 Analytics\n\nThis portfolio includes Vercel Analytics for tracking visitor metrics. To enable:\n\n1. **Enable in Vercel Dashboard**\n   - Navigate to your project in Vercel\n   - Go to Analytics tab\n   - Enable Analytics\n\n2. **Already integrated** via `@vercel/analytics/react` in `app/layout.tsx`\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please follow these steps:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct and development process.\n\n---\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 👨‍💻 Author\n\n**OkDo**\n\n- GitHub: [@OthyTenk](https://github.com/OthyTenk)\n- Portfolio: [Live Demo](https://your-portfolio-url.vercel.app)\n\n---\n\n## 🙏 Acknowledgments\n\n- [Next.js](https://nextjs.org/) for the amazing React framework\n- [Sanity.io](https://www.sanity.io/) for the flexible headless CMS\n- [Tailwind CSS](https://tailwindcss.com/) for the utility-first CSS framework\n- [Vercel](https://vercel.com/) for seamless deployment and hosting\n\n---\n\n## 📞 Support\n\nIf you have any questions or run into issues, please:\n\n- Open an [Issue](https://github.com/OthyTenk/my-portfolio/issues)\n- Check existing [Discussions](https://github.com/OthyTenk/my-portfolio/discussions)\n- Review the [Security Policy](SECURITY.md)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003eMade with ❤️ by OkDo\u003c/p\u003e\n  \u003cp\u003e⭐ Star this repo if you found it helpful!\u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fothytenk%2Fmy-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fothytenk%2Fmy-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fothytenk%2Fmy-portfolio/lists"}