{"id":29128103,"url":"https://github.com/bcastelino/brian-portfolio","last_synced_at":"2026-04-09T20:02:35.214Z","repository":{"id":298623452,"uuid":"1000520529","full_name":"bcastelino/brian-portfolio","owner":"bcastelino","description":"A personal portfolio website built and deployed using open-source or free-tier tools and showcases my data analytics, AI, and development skills. The site includes sections like About, Projects, Resume, and Contact — with a working contact form that emails submissions directly.","archived":false,"fork":false,"pushed_at":"2025-07-15T21:32:39.000Z","size":5470,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-01T17:45:50.647Z","etag":null,"topics":["mailgun","nextjs","nodejs","render-deployment","supabase","tailwindcss","typescript","uptimerobot"],"latest_commit_sha":null,"homepage":"https://brianc.onrender.com/","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/bcastelino.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":"2025-06-11T23:18:45.000Z","updated_at":"2025-07-15T21:32:42.000Z","dependencies_parsed_at":"2025-06-12T03:31:39.209Z","dependency_job_id":"e9f9852c-ec5d-4d96-8aca-f3f68f5a032b","html_url":"https://github.com/bcastelino/brian-portfolio","commit_stats":null,"previous_names":["bcastelino/brian-portfolio"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bcastelino/brian-portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcastelino%2Fbrian-portfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcastelino%2Fbrian-portfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcastelino%2Fbrian-portfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcastelino%2Fbrian-portfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bcastelino","download_url":"https://codeload.github.com/bcastelino/brian-portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcastelino%2Fbrian-portfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279456695,"owners_count":26173309,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-18T02:00:06.492Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["mailgun","nextjs","nodejs","render-deployment","supabase","tailwindcss","typescript","uptimerobot"],"created_at":"2025-06-30T01:02:36.922Z","updated_at":"2025-10-18T02:51:08.174Z","avatar_url":"https://github.com/bcastelino.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n## Brian's Personal Portfolio 🚀\n\nA fully open-source and cost-free personal portfolio website built with Next.js, Tailwind CSS, and Supabase. Includes a real-time contact form powered by Supabase Edge Functions and Mailgun.\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n[![My Skills](https://skillicons.dev/icons?i=js,ts,vscode,css,react,nextjs,nodejs,npm,tailwind,supabase,gmail\u0026theme=light)](https://skillicons.dev)\n\n\u003c/div\u003e\n\n---\n\n## 🌐 Live URL\n*[https://brianc.onrender.com](https://brianc.onrender.com)*\n\n---\n\n## 📦 Setup Instructions\n\n### Clone the repository\n\n```bash\ngit clone https://github.com/bcastelino/brian-portfolio\ncd brian-portfolio\n```\n\n### Install dependencies\n\n```bash\nnpm install\n```\n\n### Run the project locally\n\n```bash\nnpm run dev\n```\n\n---\n\n## ✨ Features\n\n### ✅ 1. Responsive Portfolio UI\n* Clean, mobile-friendly layout using `Tailwind CSS`\n* Animated sections built with `Framer Motion`\n* `Light` and `dark` mode support\n\n### 📁 2. Project \u0026 Resume Showcase\n* Dedicated sections for highlighting projects\n* Downloadable PDF `resume` with external link support\n\n### 📬 3. Fully Functional Contact Form\n* Accepts name, email, and message from users\n* Uses `Supabase Edge Functions` to securely send messages\n* Sends emails via `Mailgun` directly to your inbox\n\n### ☁️ 4. Free \u0026 Scalable Hosting\n* Hosted on `Render` using the free tier\n* Auto-deploys on every `GitHub commit`\n\n### 🔌 5. Uptime Monitoring \u0026 Wake Prevention\n* Integrated with `UptimeRobot`\n* Keeps the Render app “awake” 24/7 by preventing spin-down\n\n### 📦 6. Optimized Production Builds\n* `sharp` installed for image optimization in production\n* `ESLint` and `Prettier` included for clean, maintainable code\n\n### 🔐 7. Environment Secrets \u0026 Secure API Handling\n* `.env` used for secure Mailgun API keys\n* Supabase secrets managed via Edge Function environment settings\n\n---\n\n## ☁️ External Services Used\n#### Render\n* Hosts the frontend web app\n* Connects directly to GitHub for automatic deploys\n* 750 free instance hours/month\n\n#### Supabase\n* Hosts the backend function (written in Deno)\n* Executes email sending logic triggered by the frontend contact form\n\n#### Mailgun (Free Tier)\n* Sends emails from the \"Contact Me\" form\n* Configured using an API key inside a Supabase Edge Function\n* Uses sandbox domain or custom domain if verified\n\n#### UptimeRobot\n* Pings the site every 10 minutes\n* Prevents Render from spinning down the free instance\n* Sends alerts if the site goes offline\n\n---\n\n## 🔄 Portfolio WorkFlow\n\n```mermaid\nflowchart TD\n    %% Frontend Layer\n    subgraph \"Frontend Layer\"\n        direction LR\n        Browser[\"User's Browser\"]:::infra\n        NextApp[\"Next.js App\"]:::frontend\n        Page[\"page.tsx\"]:::frontend\n        About[\"about/page.tsx\"]:::frontend\n        Projects[\"projects/page.tsx\"]:::frontend\n        ResumePage[\"resume/page.tsx\"]:::frontend\n        ContactPage[\"contact/page.tsx\"]:::frontend\n        Browser --\u003e|\"HTTP GET pages/assets\"| NextApp\n        %%NextApp --\u003e|\"renders pages\"| Browser\n        NextApp --\u003e|\"serves assets\"| Page\n        Page --\u003e|\"navigates to\"| About\n        Page --\u003e|\"navigates to\"| Projects\n        Page --\u003e|\"navigates to\"| ResumePage\n        Page --\u003e|\"navigates to\"| ContactPage\n    end\n\n    %% Backend Layer\n    subgraph \"Backend Layer\"\n        direction LR\n        EdgeFunc[\"Supabase Edge Function\"]:::backend\n        RouteFile[\"route.ts\"]:::backend\n        EdgeFunc --\u003e RouteFile\n    end\n\n    %% External Services\n    subgraph \"External Services\"\n        direction TB\n        Mailgun[\"Mailgun API\"]:::external\n        Inbox[\"Brian's Inbox\"]:::external\n        UptimeRobot[\"UptimeRobot\"]:::infra\n        ContactPage --\u003e|\"POST /api/contact\u003cbr\u003e(via Browser)\"| EdgeFunc\n        EdgeFunc --\u003e|\"Mailgun API call\"| Mailgun\n        Mailgun --\u003e|\"delivers email\"| Inbox\n        EdgeFunc --\u003e|\"response success\u003cbr\u003e(via Browser)\"| ContactPage\n        UptimeRobot --\u003e|\"ping every 10min\"| NextApp\n    end\n\n    %% CI/CD Infrastructure\n    subgraph \"Infrastructure\"\n        direction TB\n        GitHub[\"GitHub\"]:::infra\n        Render[\"Render (Hosting)\"]:::infra\n        GitHub --\u003e|\"push triggers CI/CD\"| Render\n        Render --\u003e|\"hosts Next.js App\"| NextApp\n        Render --\u003e|\"deploys Edge Function\"| EdgeFunc\n    end\n\n    %% Click Events\n    click Page \"https://github.com/bcastelino/brian-portfolio/blob/main/app/page.tsx\"\n    click Layout \"https://github.com/bcastelino/brian-portfolio/blob/main/app/layout.tsx\"\n    click About \"https://github.com/bcastelino/brian-portfolio/blob/main/app/about/page.tsx\"\n    click ContactPage \"https://github.com/bcastelino/brian-portfolio/blob/main/app/contact/page.tsx\"\n    click Projects \"https://github.com/bcastelino/brian-portfolio/blob/main/app/projects/page.tsx\"\n    click ResumePage \"https://github.com/bcastelino/brian-portfolio/blob/main/app/resume/page.tsx\"\n    click ThemeProvider \"https://github.com/bcastelino/brian-portfolio/blob/main/app/ThemeProvider.tsx\"\n    click ThemeToggle \"https://github.com/bcastelino/brian-portfolio/blob/main/app/ThemeToggle.tsx\"\n    click Globals \"https://github.com/bcastelino/brian-portfolio/blob/main/app/globals.css\"\n    click RouteFile \"https://github.com/bcastelino/brian-portfolio/blob/main/app/api/contact/route.ts\"\n    click StaticAssets \"https://github.com/bcastelino/brian-portfolio/tree/main/public/\"\n    click NextConfig \"https://github.com/bcastelino/brian-portfolio/blob/main/next.config.js\"\n    click TailwindConfig \"https://github.com/bcastelino/brian-portfolio/blob/main/tailwind.config.js\"\n    click PostcssConfig \"https://github.com/bcastelino/brian-portfolio/blob/main/postcss.config.js\"\n    click TsConfig \"https://github.com/bcastelino/brian-portfolio/blob/main/tsconfig.json\"\n    click PackageJSON \"https://github.com/bcastelino/brian-portfolio/blob/main/package.json\"\n    click PackageLock \"https://github.com/bcastelino/brian-portfolio/blob/main/package-lock.json\"\n    click Readme \"https://github.com/bcastelino/brian-portfolio/blob/main/README.md\"\n    click EnvExample \"https://github.com/bcastelino/brian-portfolio/blob/main/.env.example\"\n    click Gitignore \"https://github.com/bcastelino/brian-portfolio/blob/main/.gitignore\"\n\n    %% Styles\n    classDef frontend fill:#cce5ff,stroke:#0366d6,stroke-width:1px;\n    classDef backend fill:#d4edda,stroke:#28a745,stroke-width:1px;\n    classDef external fill:#fff3cd,stroke:#d39e00,stroke-width:1px;\n    classDef infra fill:#e2e3e5,stroke:#6c757d,stroke-width:1px;\n\n\n```\n\n---\n\n## ✅ Hosting Cost Summary (Free Tier)\n\n* **Render** (free for 1 app, 750 hrs/month)\n* **Supabase** (free for Edge Functions and Postgres usage)\n* **Mailgun** (free up to 100 emails/day)\n* **UptimeRobot** (free for 10-minute checks)\n\nAll services used are either open source or free-tier compatible.\n\n---\n\n## 📬 Contact\n\nBuilt and maintained by [Brian Denis Castelino](mailto:briancastelino07@gmail.com).\n\n---\n\n\u003e Want to fork this? Remove the contact email or reroute it to your own Mailgun + Supabase setup.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcastelino%2Fbrian-portfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbcastelino%2Fbrian-portfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcastelino%2Fbrian-portfolio/lists"}