{"id":47032549,"url":"https://github.com/mchestr/plefi","last_synced_at":"2026-03-12T00:09:53.089Z","repository":{"id":287645220,"uuid":"965374807","full_name":"mchestr/plefi","owner":"mchestr","description":"Plex Subscriptions Management","archived":false,"fork":false,"pushed_at":"2025-11-06T16:12:26.000Z","size":23025,"stargazers_count":5,"open_issues_count":11,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-06T18:14:05.225Z","etag":null,"topics":["docker","golang","plex","stripe"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/mchestr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"github":"mchestr"}},"created_at":"2025-04-13T02:46:27.000Z","updated_at":"2025-10-23T18:07:19.000Z","dependencies_parsed_at":"2025-06-11T21:33:10.381Z","dependency_job_id":"9bcae796-05da-4890-9b9a-95845246c7b7","html_url":"https://github.com/mchestr/plefi","commit_stats":null,"previous_names":["mchestr/striplex","mchestr/plefi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mchestr/plefi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchestr%2Fplefi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchestr%2Fplefi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchestr%2Fplefi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchestr%2Fplefi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mchestr","download_url":"https://codeload.github.com/mchestr/plefi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchestr%2Fplefi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30408017,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T22:36:59.286Z","status":"ssl_error","status_checked_at":"2026-03-11T22:36:57.544Z","response_time":84,"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":["docker","golang","plex","stripe"],"created_at":"2026-03-12T00:09:49.664Z","updated_at":"2026-03-12T00:09:53.084Z","avatar_url":"https://github.com/mchestr.png","language":"JavaScript","funding_links":["https://github.com/sponsors/mchestr"],"categories":[],"sub_categories":[],"readme":"[\u003cimg src=\"https://raw.githubusercontent.com/PKief/vscode-material-icon-theme/ec559a9f6bfd399b82bb44393651661b08aaf7ba/icons/folder-markdown-open.svg\" align=\"right\" width=\"25%\" padding-right=\"350\"\u003e]()\n\n# `PleFi`\n\n#### Integrate Stripe payments with Plex servers for subscription-based access!\n\n\u003cp align=\"left\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/license/mchestr/plefi?style=for-the-badge\u0026logo=opensourceinitiative\u0026logoColor=white\u0026color=00ADD8\" alt=\"license\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/last-commit/mchestr/plefi?style=for-the-badge\u0026logo=git\u0026logoColor=white\u0026color=00ADD8\" alt=\"last-commit\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/languages/top/mchestr/plefi?style=for-the-badge\u0026color=00ADD8\" alt=\"repo-top-language\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/languages/count/mchestr/plefi?style=for-the-badge\u0026color=00ADD8\" alt=\"repo-language-count\"\u003e\n\u003c/p\u003e\n\u003cp align=\"left\"\u003e\n\t\t\u003cem\u003e_Built with:_\u003c/em\u003e\n\u003c/p\u003e\n\u003cp align=\"left\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/Go-00ADD8.svg?style=for-the-badge\u0026logo=Go\u0026logoColor=white\" alt=\"Go\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/Stripe-008CDD.svg?style=for-the-badge\u0026logo=Stripe\u0026logoColor=white\" alt=\"Stripe\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/Plex-E5A00D.svg?style=for-the-badge\u0026logo=Plex\u0026logoColor=white\" alt=\"Plex\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/Docker-2496ED.svg?style=for-the-badge\u0026logo=Docker\u0026logoColor=white\" alt=\"Docker\"\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\n## 🔗 Table of Contents\n\nI. [📍 Overview](#-overview)\nII. [👾 Features](#-features)\nIII. [📁 Project Structure](#-project-structure)\nIV. [🚀 Getting Started](#-getting-started)\nV. [🔧 Configuration](#-configuration)\nVI. [📡 API Endpoints](#-api-endpoints)\nVII. [🔰 Contributing](#-contributing)\nVIII. [🎗 License](#-license)\n\n---\n\n## 📍 Overview\n\nPleFi is a service that integrates Stripe payment processing with Plex media server, enabling subscription-based access management for Plex servers. It provides user authentication, payment handling, and subscription management to automate Plex server access control.\n\n---\n\n## 👾 Features\n\n|      | Feature         | Summary       |\n| :--- | :---:           | :---          |\n| 🔐  | **Authentication**  | \u003cul\u003e\u003cli\u003ePlex user authentication using OAuth\u003c/li\u003e\u003cli\u003eSecure session management with encryption\u003c/li\u003e\u003c/ul\u003e |\n| 💳 | **Payments**  | \u003cul\u003e\u003cli\u003eStripe subscription management and payment processing\u003c/li\u003e\u003cli\u003eConfigurable subscription plans\u003c/li\u003e\u003c/ul\u003e |\n| 🔄 | **Webhooks** | \u003cul\u003e\u003cli\u003eWebhook support for Stripe events\u003c/li\u003e\u003cli\u003eAutomated user access management based on subscription status\u003c/li\u003e\u003c/ul\u003e |\n| 🛠️ | **Configuration**  | \u003cul\u003e\u003cli\u003eHierarchical configuration system with environment variables\u003c/li\u003e\u003cli\u003eDevelopment and production modes\u003c/li\u003e\u003c/ul\u003e |\n| 🔌 | **API**    | \u003cul\u003e\u003cli\u003eRESTful endpoints for authentication and payment flows\u003c/li\u003e\u003cli\u003eHealth check endpoints for monitoring\u003c/li\u003e\u003c/ul\u003e |\n\n---\n\n## 📁 Project Structure\n\n```sh\nplefi\n├── internal/                # Backend application code\n│   ├── config/              # Configuration files and setup\n│   │   ├── config.go\n│   │   ├── default.yaml\n│   │   └── development.yaml\n│   ├── controllers/         # Request handlers\n│   │   ├── controller.go\n│   │   ├── api/\n│   │   │   └── controller.go\n│   │   ├── plex/\n│   │   │   └── controller.go\n│   │   └── stripe/\n│   │       └── controller.go\n│   ├── model/               # Data models\n│   │   └── user_info.go\n│   ├── services/            # Service implementations\n│   │   ├── services.go\n│   │   └── plex.go\n│   ├── views/               # HTML templates\n│   │   ├── index.tmpl\n│   │   ├── stripe_success.tmpl\n│   │   └── stripe_cancel.tmpl\n│   ├── router.go            # Route definitions\n│   └── main.go              # Application entry point\n├── go.mod                   # Go module definition\n├── go.sum                   # Go dependency checksums\n├── Dockerfile               # Container definition\n├── .env                     # Environment variables (not in git)\n├── .gitignore               # Git ignore rules\n├── frontend/                # React frontend application\n│   ├── public/              # Static assets \u0026 index.html\n│   ├── src/                 # React source code (pages, components, styles)\n│   ├── webpack.config.js    # Frontend build configuration\n│   ├── package.json         # Frontend dependencies \u0026 scripts\n│   └── ...                  # other frontend files\n└── README.md                # Project documentation\n```\n\n### 📂 Project Index\n\n\u003cdetails open\u003e\n\t\u003csummary\u003e\u003cb\u003e\u003ccode\u003ePleFi/\u003c/code\u003e\u003c/b\u003e\u003c/summary\u003e\n\t\u003cdetails\u003e\n\t\t\u003csummary\u003e\u003cb\u003e__root__\u003c/b\u003e\u003c/summary\u003e\n\t\t\u003cblockquote\u003e\n\t\t\t\u003ctable\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003eserver.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eServer initialization with graceful shutdown\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003eDockerfile\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eContainer definition for building and running the PleFi application\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003ego.mod\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eGo module definition specifying dependencies\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003ego.sum\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eGo dependency checksums ensuring consistent builds\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003c/table\u003e\n\t\t\u003c/blockquote\u003e\n\t\u003c/details\u003e\n\t\u003cdetails\u003e\n\t\t\u003csummary\u003e\u003cb\u003eapi/\u003c/b\u003e\u003c/summary\u003e\n\t\t\u003cblockquote\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003econfig/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003econfig.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eConfiguration initialization and management from files and environment variables\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003edefault.yaml\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eDefault configuration values for all environments\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003edevelopment.yaml\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eDevelopment-specific configuration settings\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003econtrollers/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003econtroller.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eMain application controller handling common functionality\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\t\u003cdetails\u003e\n\t\t\t\t\t\t\u003csummary\u003e\u003cb\u003eapi/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003econtroller.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003eAPI controller implementation for general endpoints\u003c/td\u003e\n\t\t\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\t\t\u003c/details\u003e\n\t\t\t\t\t\u003cdetails\u003e\n\t\t\t\t\t\t\u003csummary\u003e\u003cb\u003eplex/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003econtroller.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003ePlex controller handling OAuth authentication\u003c/td\u003e\n\t\t\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\t\t\u003c/details\u003e\n\t\t\t\t\t\u003cdetails\u003e\n\t\t\t\t\t\t\u003csummary\u003e\u003cb\u003estripe/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003econtroller.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\t\t\u003ctd\u003eStripe controller for payment processing and webhooks\u003c/td\u003e\n\t\t\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\t\t\u003c/details\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003eservices/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003eservices.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eService container for dependency injection\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003eplex.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003ePlex service for interacting with Plex API\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003eviews/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003eindex.tmpl\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eMain landing page template\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003estripe_success.tmpl\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eSubscription success page\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003estripe_cancel.tmpl\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eSubscription cancellation page\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003emodel/\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003euser_info.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eUser information model\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003erouter.go\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003erouter.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eRoute definitions\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\t\u003cdetails\u003e\n\t\t\t\t\u003csummary\u003e\u003cb\u003emain.go\u003c/b\u003e\u003c/summary\u003e\n\t\t\t\t\u003cblockquote\u003e\n\t\t\t\t\t\u003ctable\u003e\n\t\t\t\t\t\u003ctr\u003e\n\t\t\t\t\t\t\u003ctd\u003e\u003cb\u003emain.go\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\t\t\u003ctd\u003eApplication entry point that initializes configuration, services, and the HTTP server\u003c/td\u003e\n\t\t\t\t\t\u003c/tr\u003e\n\t\t\t\t\t\u003c/table\u003e\n\t\t\t\t\u003c/blockquote\u003e\n\t\t\t\u003c/details\u003e\n\t\t\u003c/blockquote\u003e\n\t\u003c/details\u003e\n\t\u003cdetails\u003e\n\t\t\u003csummary\u003e\u003cb\u003efrontend/\u003c/b\u003e\u003c/summary\u003e\n\t\t\u003cblockquote\u003e\n\t\t\t\u003ctable\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003epublic/\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eStatic assets \u0026 index.html\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003esrc/\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eReact source code (pages, components, styles)\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003ewebpack.config.js\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eFrontend build configuration\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\u003ctd\u003e\u003cb\u003epackage.json\u003c/b\u003e\u003c/td\u003e\n\t\t\t\t\u003ctd\u003eFrontend dependencies \u0026 scripts\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003c/table\u003e\n\t\t\u003c/blockquote\u003e\n\t\u003c/details\u003e\n\u003c/details\u003e\n\n---\n\n## 🚀 Getting Started\n\n### ☑️ Prerequisites\n\nBefore getting started with PleFi, ensure your runtime environment meets the following requirements:\n\n- **Go 1.24 or higher**  \n- **Node.js 16+**  \n- **npm or Yarn**  \n- **Stripe account with webhook setup**  \n- **Plex account and server** (optional for development)\n\n### ⚙️ Installation\n\n1. Clone the repository:\n\n   ```sh\n   ❯ git clone https://github.com/mchestr/plefi.git\n   ❯ cd plefi\n   ```\n2. Install backend dependencies:\n\n   ```sh\n   ❯ go mod download\n   ```\n3. Create a `.env` file in the project root with your configuration:\n\n   ```sh\n   ❯ cat \u003e .env \u003c\u003c EOL\n   PLEFI_STRIPE__SECRET_KEY=\"sk_test_your_stripe_secret_key\"\n   PLEFI_STRIPE__WEBHOOK_SECRET=\"whsec_your_stripe_webhook_secret\"\n   PLEFI_STRIPE__DEFAULT_PRICE_ID=\"price_your_default_price_id\"\n\n   PLEFI_PLEX__CLIENT_ID=\"your_plex_client_id\"\n   PLEFI_PLEX__PRODUCT=\"Your Plex Server Name\"\n\n   PLEFI_SERVER__HOSTNAME=\"your-server-hostname.com\"\n   PLEFI_SERVER__SESSION_SECRET=\"generate_a_random_secret_key\"\n   PLEFI_SERVER__MODE=\"development\"\n   EOL\n   ```\n4. Install frontend dependencies:\n\n   ```sh\n   ❯ cd frontend\n   ❯ npm install\n   ```\n5. Return to the root:\n\n   ```sh\n   ❯ cd ..\n   ```\n\n### 🤖 Usage\n\n**Run frontend in development mode:**\n\n```sh\n❯ cd frontend\n❯ npm run start\n```\n\n**Run backend locally:**\n\n```sh\n❯ go run api/main.go\n```\n\n**Run backend in development mode:**\n\n```sh\n❯ go run api/main.go -e development\n```\n\n**Using Docker:**\n\n```sh\n❯ docker build -t plefi .\n❯ docker run -p 8080:8080 --env-file .env plefi\n```\n\n## 🔧 Configuration\n\nPleFi uses a hierarchical configuration system:\n\n1. Default values\n2. Configuration files in `api/config/` directory\n3. Environment variables (prefixed with `PLEFI_`)\n\n### Environment Variables Reference\n\n\u003cdetails open\u003e\n\u003csummary\u003e\u003cb\u003eServer Configuration\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `PLEFI_SERVER__MODE` - Server mode (debug, release)\n- `PLEFI_SERVER__ADDRESS` - Server bind address (default: `:8080`)\n- `PLEFI_SERVER__HOSTNAME` - Server hostname for callbacks\n- `PLEFI_SERVER__SESSION_SECRET` - Secret for session encryption\n- `PLEFI_SERVER__TRUSTED_PROXIES` - Comma-separated list of trusted proxy IPs\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eStripe Configuration\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `PLEFI_STRIPE__SECRET_KEY` - Stripe API secret key\n- `PLEFI_STRIPE__WEBHOOK_SECRET` - Stripe webhook signing secret\n- `PLEFI_STRIPE__DEFAULT_PRICE_ID` - Default subscription price ID\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePlex Configuration\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `PLEFI_PLEX__CLIENT_ID` - Plex client identifier\n- `PLEFI_PLEX__PRODUCT` - Plex product name\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eLogging Configuration\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `PLEFI_LOG__LEVEL` - Logging level (debug, info, warn, error)\n- `PLEFI_LOG__FORMAT` - Logging format (json, text)\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n## 📡 API Endpoints\n\n\u003cdetails open\u003e\n\u003csummary\u003e\u003cb\u003eApplication\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `GET /` - Landing page\n- `GET /health` - Health check endpoint\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePlex Authentication\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `GET /plex/auth` - Initiate Plex authentication\n- `GET /plex/callback` - Plex authentication callback\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eStripe\u003c/b\u003e\u003c/summary\u003e\n\u003cblockquote\u003e\n\n- `POST /stripe/webhook` - Stripe webhook endpoint for subscription events\n- `GET /stripe/checkout` - Create a Stripe checkout session for subscription\n- `GET /stripe/success` - Handle successful subscription checkout\n- `GET /stripe/cancel` - Handle cancelled subscription checkout\n\n\u003c/blockquote\u003e\n\u003c/details\u003e\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/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n\u003cdetails closed\u003e\n\u003csummary\u003eContributing Guidelines\u003c/summary\u003e\n\n1. **Fork the Repository**: Start by forking the project repository to your GitHub account.\n2. **Clone Locally**: Clone the forked repository to your local machine.\n   ```sh\n   git clone https://github.com/yourusername/plefi.git\n   ```\n3. **Create a New Branch**: Always work on a new branch.\n   ```sh\n   git checkout -b feature/amazing-feature\n   ```\n4. **Make Your Changes**: Develop and test your changes locally.\n5. **Commit Your Changes**: Commit with a clear message.\n   ```sh\n   git commit -m 'Add amazing feature'\n   ```\n6. **Push to GitHub**: Push the changes to your forked repository.\n   ```sh\n   git push origin feature/amazing-feature\n   ```\n7. **Submit a Pull Request**: Create a PR against the original project repository.\n\u003c/details\u003e\n\n---\n\n## 🎗 License\n\nSee the [LICENSE](LICENSE) file for details.\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmchestr%2Fplefi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmchestr%2Fplefi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmchestr%2Fplefi/lists"}