{"id":24404111,"url":"https://github.com/emilioesposito/portfolio","last_synced_at":"2025-04-23T03:28:02.446Z","repository":{"id":272932567,"uuid":"917386305","full_name":"EmilioEsposito/portfolio","owner":"EmilioEsposito","description":"An amalgamation of stuff I like to work on. ","archived":false,"fork":false,"pushed_at":"2025-04-22T02:56:31.000Z","size":1871,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-22T04:49:29.885Z","etag":null,"topics":["ai","fastapi","llm","neon-postgres","nextjs","python","typescript"],"latest_commit_sha":null,"homepage":"https://eesposito.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/EmilioEsposito.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}},"created_at":"2025-01-15T22:06:16.000Z","updated_at":"2025-04-08T04:22:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ddb70d5-6d08-4f64-9676-8890e6fd18ab","html_url":"https://github.com/EmilioEsposito/portfolio","commit_stats":null,"previous_names":["emilioesposito/portfolio"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EmilioEsposito%2Fportfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EmilioEsposito%2Fportfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EmilioEsposito%2Fportfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EmilioEsposito%2Fportfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EmilioEsposito","download_url":"https://codeload.github.com/EmilioEsposito/portfolio/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250363626,"owners_count":21418301,"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","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":["ai","fastapi","llm","neon-postgres","nextjs","python","typescript"],"created_at":"2025-01-20T03:59:30.275Z","updated_at":"2025-04-23T03:28:02.430Z","avatar_url":"https://github.com/EmilioEsposito.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio\n\nThis is my portfolio/sandbox website that I use to just play around with new technologies. \n\n\n## Tech Stack:\n* Frontend: Next.js\n    * UI: [Shadcn UI](https://ui.shadcn.com/docs) \u0026 Tailwind CSS\n* Backend: [FastAPI](https://fastapi.tiangolo.com/)\n    * Database: [Neon Postgres](https://neon.tech/)\n* Deployment: [Vercel](https://vercel.com/) (FastAPI is deployed as a Serverless Function)\n* Package Managers: pnpm and pip\n\n## Setup\n\n0. Clone the repository `git clone https://github.com/EmilioEsposito/portfolio.git`\n1. Sign up for accounts with the AI providers you want to use (e.g., OpenAI, Anthropic).\n2. Obtain API keys for each provider.\n3. Set the required environment variables as shown in the `.env.example` file, but in a new file called `.env`.\n4. `pnpm install` to install the required Node dependencies.\n5. `virtualenv venv` to create a virtual environment.\n6. `source venv/bin/activate` to activate the virtual environment.\n7. `pip install -r requirements.txt` to install the required Python dependencies.\n8. `pnpm dev` to launch the development server.\n9. Install and use Vercel CLI, which can help test Serverless functions.\n    ```bash\n    pnpm install vercel\n    pnpm vercel login\n    pnpm vercel dev\n    ```\n\n\n\n## Environments:\n\n* Localhost: \n    * NextJS: http://localhost:3000\n    * FastAPI: http://localhost:8000/api/docs (also at http://localhost:3000/api/docs)\n* Dev: \n    * NextJS: https://dev.eesposito.com\n    * FastAPI: https://dev.eesposito.com/api/docs\n* Production: \n    * NextJS: https://eesposito.com\n    * FastAPI: https://eesposito.com/api/docs\n\n[All Vercel Deployments](https://vercel.com/emilioespositos-projects/portfolio/deployments)\n\n\n## Environment Variables Management\n\nThis project uses Vercel for deployment and environment variable management.\n\nLocally, the file that takes all precedence is `.env.development.local`. \n\n### Local Development Setup\n\n```bash\nvercel env pull .env.development.local\n```\n\n### Other Vercel env management commands\n```bash\nvercel env pull .env.development.local    # Pulls Development environment vars\n```\n\n```bash\nvercel env pull .env.production.local     # Pulls Production environment vars\n```\n\n```bash\nvercel env pull .env.preview.local        # Pulls Preview environment vars\n```\n\n# Add a new environment variable\nvercel env add MY_VAR                     # Interactive prompt will ask for value and environment\n\n# List all environment variables\nvercel env ls\n\n# Remove an environment variable\nvercel env rm MY_VAR\n\n# Add with specific environment target\nvercel env add MY_VAR production         # Specifically add to production\nvercel env add MY_VAR development        # Specifically add to development\nvercel env add MY_VAR preview            # Specifically add to preview\n```\n\n## 3rd Party Dev\n\nI use a `x-vercel-protection-bypass` param in external services like OpenPhone and Google PubSub in order to allow testing on preview deployments. \nThis allows those webhooks to to my preview routes, bypassing Vercel protection (which is fine since I verify the calls anyways). \n\n[Vercel Deployment Protection](https://vercel.com/emilioespositos-projects/portfolio/settings/deployment-protection)\n\nOpenPhone has a prod and dev webhook, each with its own secret. \n\nFor now, on Google PubSub I'm using just using the dev endpoint since the product is not production ready yet. \n\n\n# Deprecation Candidates\n\n* Google PubSub (replace with Oauth)\n* app/components/google/account-switcher.tsx (replace with Clerk)\n* Native Google Oauth handling - replace with Clerk Oauth\n    * app/auth\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femilioesposito%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femilioesposito%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femilioesposito%2Fportfolio/lists"}