{"id":23572092,"url":"https://github.com/womb0comb0/portfolio","last_synced_at":"2026-04-10T21:22:14.184Z","repository":{"id":174273251,"uuid":"651360385","full_name":"WomB0ComB0/portfolio","owner":"WomB0ComB0","description":"2025 - present portfolio ✨","archived":false,"fork":false,"pushed_at":"2026-03-31T08:12:24.000Z","size":22842,"stargazers_count":11,"open_issues_count":13,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-03-31T10:15:04.057Z","etag":null,"topics":["bun","css3","docker","elysiajs","google-search-console","nextjs","portfolio","pwa","react","sanity-cms","scss","tailwindcss","typescript","ui-components"],"latest_commit_sha":null,"homepage":"https://mikeodnis.dev","language":"TypeScript","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/WomB0ComB0.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":"audit-ci.jsonc","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},"funding":{"github":"WomB0ComB0","open_collective":"mike-odnis","ko_fi":"Y8Y77AJEA","buy_me_a_coffee":"mikeodnis"}},"created_at":"2023-06-09T04:32:57.000Z","updated_at":"2026-03-31T08:12:01.000Z","dependencies_parsed_at":"2025-11-22T13:04:46.427Z","dependency_job_id":"9ef890fd-a164-4a14-9f36-7f8d8681a08f","html_url":"https://github.com/WomB0ComB0/portfolio","commit_stats":{"total_commits":66,"total_committers":2,"mean_commits":33.0,"dds":"0.19696969696969702","last_synced_commit":"34f43b53687006d531019b2c5f584ae3a9f152ec"},"previous_names":["womb0comb0/portfolio"],"tags_count":163,"template":true,"template_full_name":null,"purl":"pkg:github/WomB0ComB0/portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WomB0ComB0%2Fportfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WomB0ComB0%2Fportfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WomB0ComB0%2Fportfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WomB0ComB0%2Fportfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WomB0ComB0","download_url":"https://codeload.github.com/WomB0ComB0/portfolio/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WomB0ComB0%2Fportfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292684,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: 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":["bun","css3","docker","elysiajs","google-search-console","nextjs","portfolio","pwa","react","sanity-cms","scss","tailwindcss","typescript","ui-components"],"created_at":"2024-12-26T20:29:03.153Z","updated_at":"2026-04-01T22:38:51.695Z","avatar_url":"https://github.com/WomB0ComB0.png","language":"TypeScript","funding_links":["https://github.com/sponsors/WomB0ComB0","https://opencollective.com/mike-odnis","https://ko-fi.com/Y8Y77AJEA","https://buymeacoffee.com/mikeodnis"],"categories":[],"sub_categories":[],"readme":"\u003c!--\n  Copyright (c) 2026 Mike Odnis\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n--\u003e\n\n\u003c!--\n  Generated by AI-Powered README Generator\n  Repository: https://github.com/WomB0ComB0/portfolio\n  Generated: 2026-01-07T07:08:26.051Z\n  Format: md\n  Style: comprehensive\n--\u003e\n\n# 🚀 WomB0ComB0 Portfolio\n\n### A high-performance, real-time digital canvas showcasing technical mastery and developer identity.\n\n![Build Status](https://img.shields.io/github/actions/workflow/status/WomB0ComB0/portfolio/lint.yml?branch=main\u0026label=build)\n![License](https://img.shields.io/github/license/WomB0ComB0/portfolio?color=blue)\n![Version](https://img.shields.io/badge/version-1.0.0-emerald)\n![Next.js](https://img.shields.io/badge/Next.js-15-black?logo=next.js)\n![Bun](https://img.shields.io/badge/Runtime-Bun-f9f9f9?logo=bun)\n![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue?logo=typescript)\n\n## 🗺️ Table of Contents\n\n- [Overview](#-overview)\n- [Features](#-features)\n- [Architecture](#-architecture)\n- [Quick Start](#-quick-start)\n- [Usage \u0026 Examples](#-usage--examples)\n- [Configuration](#-configuration)\n- [API Reference](#-api-reference)\n- [Development](#-development)\n- [Contributing](#-contributing)\n- [Roadmap \u0026 Known Issues](#-roadmap--known-issues)\n- [License \u0026 Credits](#-license--credits)\n\n## 3. Overview\n\nThe WomB0ComB0 Portfolio is not just a static resume; it is a **Modular Monolith** designed for\nreal-time data orchestration and visual excellence. Built with **Next.js 15** and **Elysia.js**, it\naggregates a developer's digital footprint—from live coding sessions on Wakatime to real-time\nSpotify playback—into a single, cohesive experience.\n\nMost portfolios suffer from \"stale data syndrome.\" This project solves that by implementing a hybrid\narchitecture: **Sanity.io** handles structured professional content (projects, experience) with\nlive-preview capabilities, while a dedicated **Elysia.js** API engine manages high-frequency\nexternal data (GitHub, Discord, Spotify) via an intelligent **Redis** caching layer.\n\n**Who is this for?**\n\n- **Engineers** wanting a high-end boilerplate featuring the latest Next.js 15 patterns.\n- **Hiring Managers** looking for verifiable, real-time evidence of a candidate's activity.\n- **Open Source Contributors** interested in Type-safe API orchestration with Bun and Elysia.\n\n## 4. Features\n\n### 🎨 Frontend \u0026 Experience\n\n- ✨ **Next.js 15 App Router:** Leveraging React Server Components (RSC) for zero-bundle-size logic.\n- ⚡ **Command Palette (KBar):** Global navigation and quick actions via `Cmd+K`.\n- 🌈 **Visual Mastery:** Integrated **MagicUI** components (BlurFade, BorderBeam) and custom\n  shaders.\n- 📱 **PWA Support:** Fully offline-capable with custom service workers and manifest.\n- 🌓 **Adaptive Theming:** Deeply integrated dark/light modes with `next-themes`.\n\n### ⚙️ Backend \u0026 API\n\n- 🚀 **Elysia.js Engine:** Blazing fast API routes running alongside Next.js using Bun.\n- 🧠 **Smart Caching:** Custom SWR (Stale-While-Revalidate) logic backed by Redis.\n- 🛡️ **Security First:** Built-in rate limiting, CIDR-based banlists, and CSRF protection.\n- 🤖 **n8n Automation:** Pre-configured workflows for content synchronization bots.\n\n### 📊 Integrations\n\n- 🎵 **Spotify:** Real-time \"Now Playing\" status and top track aggregation.\n- 💬 **Lanyard:** Live Discord presence, activities, and status tracking.\n- 🐙 **GitHub:** Dynamic repository pinning and contribution graphing via GraphQL.\n- ✍️ **Guestbook:** Real-time messaging powered by Firebase and authenticated sessions.\n\n## 5. Architecture\n\nThe system splits responsibilities between UI rendering (Next.js) and data orchestration (Elysia).\n\n### System Architecture\n\n```mermaid\ngraph TD\n    subgraph \"Client Layer\"\n        Browser[User Browser]\n        PWA[Service Worker / Cache]\n    end\n\n    subgraph \"Application Layer (Next.js 15)\"\n        RSC[Server Components]\n        Actions[Server Actions]\n        Store[Jotai State]\n    end\n\n    subgraph \"API Orchestration (Elysia.js)\"\n        V1[/api/v1/*/]\n        Auth[Auth Middleware]\n        RateLimit[Rate Limiter]\n    end\n\n    subgraph \"Data Persistence\"\n        Redis[(Redis Cache)]\n        Sanity[(Sanity CMS)]\n        Firebase[(Firebase DB)]\n    end\n\n    subgraph \"External Providers\"\n        Spotify{{Spotify API}}\n        GitHub{{GitHub GraphQL}}\n        Lanyard{{Discord/Lanyard}}\n    end\n\n    Browser --\u003e RSC\n    RSC --\u003e V1\n    V1 --\u003e Auth\n    Auth --\u003e RateLimit\n    RateLimit --\u003e Redis\n    Redis --\u003e Spotify\n    Redis --\u003e GitHub\n    V1 --\u003e Lanyard\n    RSC --\u003e Sanity\n    Actions --\u003e Firebase\n```\n\n### Data Flow (External API Aggregation)\n\n```mermaid\nflowchart LR\n    Request[/\"Client Request\"/] --\u003e Cache{Check Redis}\n    Cache -- \"Hit\" --\u003e Return[\"Return Cached Data\"]\n    Cache -- \"Miss / Stale\" --\u003e Fetch[\"Fetch from Provider\"]\n    Fetch --\u003e Transform[\"Transform \u0026 Normalize\"]\n    Transform --\u003e Update[\"Update Redis (Async)\"]\n    Update --\u003e Return\n\n    subgraph \"Providers\"\n        direction TB\n        P1[Spotify]\n        P2[Wakatime]\n        P3[GitHub]\n    end\n    Fetch --- Providers\n```\n\n### Tech Stack Table\n\n| Layer         | Technology | Purpose                                           |\n| :------------ | :--------- | :------------------------------------------------ |\n| **Runtime**   | Bun        | High-speed execution and package management.      |\n| **Framework** | Next.js 15 | UI, SSR, and React Server Components.             |\n| **API**       | Elysia.js  | Type-safe, high-performance API endpoints.        |\n| **CMS**       | Sanity.io  | Headless content management for projects/resume.  |\n| **Cache**     | Redis      | Stale-while-revalidate storage for external APIs. |\n| **State**     | Jotai      | Atomic client-side state management.              |\n\n## 6. Quick Start\n\n### Prerequisites\n\n- **Bun:** ^1.1.0\n- **Node.js:** ^20.0.0 (as fallback)\n- **Docker:** (Optional, for Redis/Containerization)\n\n### Installation\n\n1. **Clone \u0026 Install**\n\n   ```bash\n   git clone https://github.com/WomB0ComB0/portfolio.git\n   cd portfolio\n   bun install\n   ```\n\n2. **Environment Configuration**\n\n   ```bash\n   cp .env.example .env.local\n   ```\n\n   _Edit `.env.local` and add your Sanity, GitHub, and Spotify credentials._\n\n3. **Development Server**\n   ```bash\n   bun dev\n   ```\n\n**Expected Output:**\n\n- Frontend: `http://localhost:3000`\n- API (Elysia): `http://localhost:3000/api/v1`\n- Sanity Studio: `http://localhost:3000/studio` (if configured)\n\n## 7. Usage \u0026 Examples\n\n### Managing Content (Sanity)\n\nContent like **Experience**, **Projects**, and **Certifications** is managed via the Sanity Studio.\nThis allows for live updates without triggering a redeploy.\n\n```typescript\n// Example: Fetching Projects with Sanity Live Content\nimport { sanityFetch } from '@/lib/sanity/live';\nimport { PROJECTS_QUERY } from '@/lib/sanity/queries';\n\nconst projects = await sanityFetch({ query: PROJECTS_QUERY });\n```\n\n### Real-time Status (Spotify)\n\nThe portfolio uses a custom hook to fetch the current track, which leverages the Elysia API\ninternally.\n\n```tsx\nimport { useNowPlaying } from '@/hooks/use-spotify';\n\nexport function MusicStatus() {\n  const { data, isLoading } = useNowPlaying();\n\n  if (isLoading || !data?.isPlaying) return \u003cdiv\u003eShhh... Silence is golden.\u003c/div\u003e;\n\n  return (\n    \u003cdiv\u003e\n      🎵 Now Playing: {data.title} by {data.artist}\n    \u003c/div\u003e\n  );\n}\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAdvanced: Adding a New Elysia Route\u003c/b\u003e\u003c/summary\u003e\n\nRoutes are defined in `src/app/api/[[...route]]`. To add a new endpoint:\n\n1. Create a directory under `v1/`.\n2. Define a handler and a schema using `elysia`.\n3. Export the module and register it in `elysia.ts`.\n\n\u003c/details\u003e\n\n## 8. Configuration\n\n### Environment Variables\n\n| Variable                        | Required | Default | Description                                   |\n| :------------------------------ | :------- | :------ | :-------------------------------------------- |\n| `NEXT_PUBLIC_SANITY_PROJECT_ID` | Yes      | -       | Your Sanity.io project identifier.            |\n| `GITHUB_TOKEN`                  | Yes      | -       | Personal Access Token for GitHub GraphQL API. |\n| `REDIS_URL`                     | No       | -       | Redis connection string (for caching).        |\n| `SPOTIFY_CLIENT_ID`             | No       | -       | Spotify Developer Application ID.             |\n| `WAKATIME_API_KEY`              | No       | -       | Key to fetch coding activity stats.           |\n\n### Configuration Files\n\n- `next.config.ts`: Next.js optimization and header settings.\n- `sanity.config.ts`: Schema definitions and Studio plugins.\n- `biome.json`: Linting and formatting rules (replaces ESLint/Prettier).\n\n## 9. API Reference\n\nAll endpoints are prefixed with `/api/v1/`.\n\n### Endpoints\n\n| Method | Path               | Description                      | Params            |\n| :----- | :----------------- | :------------------------------- | :---------------- |\n| `GET`  | `/status/health`   | Check API health and uptime.     | None              |\n| `GET`  | `/v1/now-playing`  | Get real-time Spotify status.    | None              |\n| `GET`  | `/v1/github-stats` | Aggregated GitHub contributions. | `username`        |\n| `POST` | `/v1/messages`     | Submit a Guestbook entry.        | `message`, `user` |\n| `GET`  | `/v1/lanyard`      | Fetch Discord presence info.     | `id`              |\n\n**Example Response (`GET /v1/now-playing`):**\n\n```json\n{\n  \"isPlaying\": true,\n  \"title\": \"Starboy\",\n  \"artist\": \"The Weeknd\",\n  \"albumImageUrl\": \"https://i.scdn.co/...\",\n  \"songUrl\": \"https://open.spotify.com/track/...\"\n}\n```\n\n## 10. Development\n\n### Project Structure\n\n```text\nsrc/\n├── app/             # Next.js App Router (Pages \u0026 API)\n│   └── api/         # Elysia.js Route Handlers\n├── components/      # Shared UI Components (Shadcn + Custom)\n├── hooks/           # Data fetching and UI hooks\n├── lib/             # API Integrations (Spotify, GitHub, Sanity)\n├── core/            # Firebase \u0026 Global Store configuration\n└── utils/           # Formatting, Security, and Logging\n```\n\n### Tooling Commands\n\n- **Linting:** `bun run lint`\n- **Testing:** `bun run test` (Vitest)\n- **E2E Testing:** `bun run test:e2e` (Playwright)\n- **Type Check:** `bun run type-check`\n\n## 11. Contributing\n\n1. **Fork** the repository.\n2. **Create a Feature Branch** (`git checkout -b feat/amazing-feature`).\n3. **Commit Your Changes** (`git commit -m 'feat: add amazing feature'`).\n4. **Push to the Branch** (`git push origin feat/amazing-feature`).\n5. **Open a Pull Request**.\n\nPlease ensure your code follows the `biome.json` configuration and passes all tests.\n\n## 12. Roadmap \u0026 Known Issues\n\n### Planned Features\n\n- [ ] **Blog Engine:** Fully integrated MDX/Sanity-based blog.\n- [ ] **Sponsorship Page:** Direct integration with GitHub Sponsors.\n- [ ] **Interactive 3D Stats:** Using Three.js/React Three Fiber for data visualization.\n- [ ] **Internationalization:** Multi-language support (i18n).\n\n### Known Limitations\n\n- ⚠️ **Rate Limits:** Without a `REDIS_URL`, external API calls are made on every request, which may\n  lead to 429 errors from GitHub/Spotify.\n- ⚠️ **Cold Starts:** First-time Sanity fetches may experience slight latency in development\n  environments.\n\n## 13. License \u0026 Credits\n\n- **License:** MIT License. See `LICENSE` for details.\n- **Maintainer:** [WomB0ComB0](https://github.com/WomB0ComB0)\n- **Special Thanks:**\n  - [Next.js](https://nextjs.org/) for the incredible framework.\n  - [Elysia.js](https://elysiajs.com/) for the high-performance API.\n  - [Magic UI](https://magicui.design/) for the stunning components. \u003cctrl63\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwomb0comb0%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwomb0comb0%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwomb0comb0%2Fportfolio/lists"}