{"id":41506290,"url":"https://github.com/stiliajohny/pasteportal","last_synced_at":"2026-01-23T19:34:19.937Z","repository":{"id":142965017,"uuid":"600545799","full_name":"stiliajohny/pasteportal","owner":"stiliajohny","description":"PastePortal is an easy-to-use VSCode extension that allows users to access and store pastes","archived":false,"fork":false,"pushed_at":"2025-11-18T13:05:17.000Z","size":9357,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-18T15:57:07.847Z","etag":null,"topics":["clipboard","developer-tools","pastebin","pastebin-service","portal-service","vscode","vscode-extension"],"latest_commit_sha":null,"homepage":"https://pasteportal.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stiliajohny.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2023-02-11T20:28:16.000Z","updated_at":"2025-11-18T13:05:21.000Z","dependencies_parsed_at":"2024-05-01T22:35:03.012Z","dependency_job_id":"0cf13a2b-d1a5-405d-bcae-ef0c3a2c1dc3","html_url":"https://github.com/stiliajohny/pasteportal","commit_stats":null,"previous_names":["stiliajohny/pasteportal"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/stiliajohny/pasteportal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stiliajohny%2Fpasteportal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stiliajohny%2Fpasteportal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stiliajohny%2Fpasteportal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stiliajohny%2Fpasteportal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stiliajohny","download_url":"https://codeload.github.com/stiliajohny/pasteportal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stiliajohny%2Fpasteportal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28698898,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T17:25:48.045Z","status":"ssl_error","status_checked_at":"2026-01-23T17:25:47.153Z","response_time":59,"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":["clipboard","developer-tools","pastebin","pastebin-service","portal-service","vscode","vscode-extension"],"created_at":"2026-01-23T19:34:19.751Z","updated_at":"2026-01-23T19:34:19.928Z","avatar_url":"https://github.com/stiliajohny.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![GPL3 License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n[![Ask Me Anything][ask-me-anything]][personal-page]\n\u003cbr\u003e\n[![DeepScan grade](https://deepscan.io/api/teams/20369/projects/23831/branches/728049/badge/grade.svg)](https://deepscan.io/dashboard#view=project\u0026tid=20369\u0026pid=23831\u0026bid=728049)\n[![DeepSource](https://deepsource.io/gh/stiliajohny/pasteportal.svg/?label=active+issues\u0026show_trend=true\u0026token=F76XWAtTJtrlBz2eJT6wo8ym)](https://deepsource.io/gh/stiliajohny/pasteportal/?ref=repository-badge)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/af53234fa6cb427cbc96a8078d8daceb)](https://www.codacy.com/gh/stiliajohny/pasteportal/dashboard?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=stiliajohny/pasteportal\u0026utm_campaign=Badge_Grade)\n\n\u003c!-- PROJECT LOGO --\u003e\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/stiliajohny/pasteportal\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/stiliajohny/pasteportal/master/.assets/icon_revised/png/__256.png\" alt=\"Main Logo\" width=\"80\" height=\"80\"\u003e\n  \u003c/a\u003e\n\n  \u003ch3 align=\"center\"\u003ePastePortal\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\nA text sharing tool for developers\n    \u003cbr /\u003e\n    \u003ca href=\"https://pasteportal.app\"\u003eFrontend\u003c/a\u003e\n    \u003c/br\u003e\n    \u003ca href=\"https://github.com/stiliajohny/pasteportal/issues/new?labels=i%3A+bug\u0026template=1-bug-report.md\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/stiliajohny/pasteportal/issues/new?labels=i%3A+enhancement\u0026template=2-feature-request.md\"\u003eRequest Feature\u003c/a\u003e\n\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\n## Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [About The Project](#about-the-project)\n  - [Built With](#built-with)\n- [Getting Started](#getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Installation](#installation)\n  - [Environment Variables](#environment-variables)\n  - [Supabase Setup](#supabase-setup)\n- [Usage](#usage)\n  - [Using the Frontend](#using-the-frontend)\n- [API Documentation](#api-documentation)\n  - [Version 1 API](#version-1-api)\n    - [POST `/api/v1/store-paste`](#post-apiv1store-paste)\n    - [GET `/api/v1/get-paste?id=\u003cpaste-id\u003e`](#get-apiv1get-pasteidpaste-id)\n- [Deployment](#deployment)\n  - [Netlify Deployment](#netlify-deployment)\n- [Security](#security)\n  - [Encryption](#encryption)\n  - [Best Practices](#best-practices)\n- [Roadmap](#roadmap)\n- [Contributing](#contributing)\n- [License](#license)\n- [Contact](#contact)\n- [Acknowledgements](#acknowledgements)\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n\n## About The Project\n\nPastePortal is a revolutionary new application that makes sharing text a breeze. Designed with developers in mind, PastePortal eliminates the need for the traditional copy-paste method, making it easy to share context without any additional complexity.\n\nWhether you're working on a large project with multiple team members or simply need to share a small snippet of code, PastePortal is the perfect solution.\nWith its user-friendly interface and powerful functionality, it's no wonder why PastePortal is quickly becoming the go-to choice for developers everywhere.\n\nTry it out today and see the difference for yourself!\n\n### Built With\n\n- [Next.js](https://nextjs.org/) - React framework for production\n- [TypeScript](https://www.typescriptlang.org/) - Type safety\n- [Supabase](https://supabase.com/) - Backend database\n- [Tailwind CSS](https://tailwindcss.com/) - Styling\n- [PWA](https://web.dev/progressive-web-apps/) - Progressive Web App support\n\n---\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18.x or higher\n- npm or yarn\n- Supabase account (SaaS)\n- Git\n\n### Installation\n\n1. Clone the repository\n\n```sh\ngit clone https://github.com/stiliajohny/pasteportal.git\ncd pasteportal\n```\n\n2. Install dependencies\n\n```sh\nnpm install\n```\n\n3. Set up environment variables (see [Environment Variables](#environment-variables))\n\n4. Run Supabase migrations (see [Supabase Setup](#supabase-setup))\n\n5. Start the development server\n\n```sh\nnpm run dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) to view the application.\n\n### Environment Variables\n\nCreate a `.env.local` file in the root directory with the following variables:\n\n```env\nNEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co\nNEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key\nENCRYPTION_KEY=your-32-byte-encryption-key-here\nNEXT_PUBLIC_ADSENSE_CLIENT_ID=ca-pub-your-adsense-client-id\nNEXT_PUBLIC_VSCODE_CALLBACK_URI=vscode://your.extension.id/auth-callback\n```\n\n**Important Notes:**\n\n- `ENCRYPTION_KEY`: Must be a secure random 32-byte key (64 hex characters) or any string that will be used to derive a 32-byte key using scrypt\n- `NEXT_PUBLIC_ADSENSE_CLIENT_ID`: Optional. Your Google AdSense client ID (format: `ca-pub-xxxxxxxxxxxxxxx`). If not set, AdSense ads will not be displayed.\n- `NEXT_PUBLIC_VSCODE_CALLBACK_URI`: Optional. Custom VS Code callback URI (e.g., `vscode://publisher.extension/auth-callback`). Defaults to `vscode://JohnStilia.pasteportal/auth-callback` when not set.\n- Keep your encryption key secure and never commit it to version control\n- For production, use a secure method to generate and store the encryption key\n\n### Supabase Setup\n\n1. **Create a Supabase project** (if you haven't already) at [supabase.com](https://supabase.com)\n\n2. **Run migrations** to set up the database schema:\n\n```sh\n# Using Supabase CLI (recommended)\nsupabase db push\n\n# Or manually run the SQL migration file:\n# supabase/migrations/001_initial_schema.sql\n```\n\n3. **Verify the table was created:**\n\nThe migration creates a `pastes` table with the following structure:\n\n- `id` (TEXT, primary key, 6-character hex)\n- `paste` (TEXT, encrypted content)\n- `recipient_gh_username` (TEXT)\n- `timestamp` (TIMESTAMP)\n- `created_at` (TIMESTAMP)\n\nThe table includes Row Level Security (RLS) policies for public read/write access.\n\n## Usage\n\n### Using the Frontend\n\nThe frontend is available at [https://pasteportal.app](https://pasteportal.app).\n\nYou can:\n\n- View pastes by visiting `https://pasteportal.app?id=\u003cpaste-id\u003e`\n- Manually retrieve pastes using the sidebar \"Get Paste\" option\n- Install as a PWA for offline access\n\n## API Documentation\n\n### Version 1 API\n\n#### POST `/api/v1/store-paste`\n\nStore a new paste.\n\n**Request Body:**\n\n```json\n{\n  \"paste\": \"Your text content here\",\n  \"recipient_gh_username\": \"recipient\"\n}\n```\n\n**Response:**\n\n```json\n{\n  \"response\": {\n    \"message\": \"The paste was successfully inserted into the database\",\n    \"id\": \"abc123\",\n    \"timestamp\": \"2024-01-01T00:00:00.000Z\",\n    \"paste\": \"Your text content here\",\n    \"joke\": \"A random programming joke\"\n  }\n}\n```\n\n#### GET `/api/v1/get-paste?id=\u003cpaste-id\u003e`\n\nRetrieve a paste by ID.\n\n**Response:**\n\n```json\n{\n  \"response\": {\n    \"message\": \"The paste was successfully retrieved from the database\",\n    \"id\": \"abc123\",\n    \"paste\": \"Your text content here\",\n    \"recipient_gh_username\": \"recipient\",\n    \"joke\": \"A random programming joke\"\n  }\n}\n```\n\n## Deployment\n\n### Netlify Deployment\n\nThe application is configured for deployment on Netlify:\n\n1. **Connect your repository** to Netlify\n\n2. **Set environment variables** in Netlify dashboard:\n   - `NEXT_PUBLIC_SUPABASE_URL`\n   - `NEXT_PUBLIC_SUPABASE_ANON_KEY`\n   - `ENCRYPTION_KEY`\n   - `NEXT_PUBLIC_ADSENSE_CLIENT_ID` (optional)\n\n3. **Configure custom domain** `pasteportal.app` in Netlify dashboard\n\n4. **Deploy** - Netlify will automatically build and deploy using the `netlify.toml` configuration\n\nThe `netlify.toml` file includes:\n\n- Build settings\n- API route redirects\n- PWA headers\n- Security headers\n\n## Security\n\n### Encryption\n\n- All paste content is encrypted using **AES-256-GCM** before storing in the database\n- Encryption key is stored in environment variables and never exposed to clients\n- Encryption/decryption happens server-side only\n\n### Best Practices\n\n- Always use a strong, randomly generated encryption key\n- Never commit `.env.local` or encryption keys to version control\n- Use environment variables for all sensitive configuration\n- Regularly rotate encryption keys in production\n\n## Roadmap\n\nSee the [open issues](https://github.com/stiliajohny/pasteportal/issues) for a list of proposed features (and known issues).\n\n---\n\n## Contributing\n\nContributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\n1. Fork the Project\n2. Create your 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\n---\n\n## License\n\nDistributed under the GPLv3 License. See `LICENSE` for more information.\n\n## Contact\n\nJohn Stilia - \u003cstilia.johny@gmail.com\u003e\n\n---\n\n## Acknowledgements\n\n- [Danut](https://github.com/DanutEne)\n- [Ahley](https://github.com/cur50r)\n- [GitHub Emoji Cheat Sheet](https://www.webpagefx.com/tools/emoji-cheat-sheet)\n- [Img Shields](https://shields.io)\n- [Choose an Open Source License](https://choosealicense.com)\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[contributors-shield]: https://img.shields.io/github/contributors/stiliajohny/pasteportal.svg\n[contributors-url]: https://github.com/stiliajohny/pasteportal/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/stiliajohny/pasteportal.svg\n[forks-url]: https://github.com/stiliajohny/pasteportal/network/members\n[stars-shield]: https://img.shields.io/github/stars/stiliajohny/pasteportal.svg\n[stars-url]: https://github.com/stiliajohny/pasteportal/stargazers\n[issues-shield]: https://img.shields.io/github/issues/stiliajohny/pasteportal.svg\n[issues-url]: https://github.com/stiliajohny/pasteportal/issues\n[license-shield]: https://img.shields.io/github/license/stiliajohny/pasteportal\n[license-url]: https://github.com/stiliajohny/pasteportal/blob/master/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg\n[linkedin-url]: https://linkedin.com/in/\n[ask-me-anything]: https://img.shields.io/badge/Ask%20me-anything-1abc9c.svg\n[personal-page]: https://github.com/stiliajohny\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstiliajohny%2Fpasteportal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstiliajohny%2Fpasteportal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstiliajohny%2Fpasteportal/lists"}