{"id":22410064,"url":"https://github.com/ra1nbow1/subscriptions_tracker","last_synced_at":"2026-04-08T11:31:06.840Z","repository":{"id":247568322,"uuid":"820111957","full_name":"ra1nbow1/subscriptions_tracker","owner":"ra1nbow1","description":"🧾 Fullstack app for tracking active subscriptions","archived":false,"fork":false,"pushed_at":"2025-09-02T07:44:22.000Z","size":559,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-27T04:47:16.077Z","etag":null,"topics":["aiogram","docker","eslint","expressjs","mongoose","nodejs","prettier","reactjs","redux-toolkit","tailwindcss","telegram"],"latest_commit_sha":null,"homepage":"https://subscriptions.ra1nbow.xyz","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/ra1nbow1.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":"2024-06-25T20:32:04.000Z","updated_at":"2024-07-21T20:58:40.000Z","dependencies_parsed_at":"2024-07-19T21:29:47.784Z","dependency_job_id":"d14af91a-b2b7-4113-aa8f-629629de679e","html_url":"https://github.com/ra1nbow1/subscriptions_tracker","commit_stats":null,"previous_names":["ra1nbow1/subscriptions_tracker"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/ra1nbow1/subscriptions_tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ra1nbow1%2Fsubscriptions_tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ra1nbow1%2Fsubscriptions_tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ra1nbow1%2Fsubscriptions_tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ra1nbow1%2Fsubscriptions_tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ra1nbow1","download_url":"https://codeload.github.com/ra1nbow1/subscriptions_tracker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ra1nbow1%2Fsubscriptions_tracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31553973,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["aiogram","docker","eslint","expressjs","mongoose","nodejs","prettier","reactjs","redux-toolkit","tailwindcss","telegram"],"created_at":"2024-12-05T12:11:46.350Z","updated_at":"2026-04-08T11:31:06.807Z","avatar_url":"https://github.com/ra1nbow1.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Subscription Tracker\n\n## Description\n\nSubscription Tracker is an application designed for managing user subscriptions. It allows users to add, edit, and\ndelete their subscriptions, as well as track total expenditures and monthly expenses. The application also includes a\nTelegram bot that offers the same functionality as the website.\n\n## Features\n\n- **Docker support**\n- User registration (with email confirmation) and authentication.\n- Adding new subscriptions with fields for title, description, price, renewal period, start date, website (with link validation) and payments history categories (with autocompletion).\n- Apple Calendar and Google Calendar integration\n- Viewing a list of all user subscriptions.\n- Editing existing subscriptions.\n- Deleting subscriptions.\n- Displaying total subscription expenses.\n- Showing expenses for subscriptions in the current month.\n- Telegram bot integration with the same features as the website.\n\n## Technologies Used\n\n- **Frontend**: [TypeScript](https://www.typescriptlang.org), [React](https://react.dev), [Redux Toolkit](https://redux-toolkit.js.org), [Tailwind CSS](https://tailwindcss.com).\n- **Backend**: [TypeScript](https://www.typescriptlang.org), [Node.js](https://nodejs.org/en), [Express.js](https://expressjs.com), [Mongoose](https://mongoosejs.com), [JWT](https://jwt.io)\n  for authentication.\n- **Project Structure**: Client-server application with REST API for communication between frontend and backend.\n- **Bot**: Python, [aiogram](https://docs.aiogram.dev/en/v3.1.1/index.html)\n- **Deployment Tools:** [Docker](https://www.docker.com)\n\n## Telegram Integration\n\nIf `VITE_WITH_TELEGRAM=\"true\"` a new path `/telegram` will be available in the application, which is just the\n`WEBAPP_URL` for the bot. The Telegram connection button will also be displayed in the header.\nWhen `VITE_WITH_TELEGRAM=\"false\"` all these functions are not available.\n\n## Installation and Running\n\n### Using Docker\n\n**Telegram mini app is unavailable while using Docker due to Telegram restrictions to `http`!**\n\n1. Clone the repository:\n\n```bash\ngit clone https://github.com/ra1nbow1/subscriptions_tracker.git\ncd subscription_tracker\n```\n\n2. Set up environment variable:\n\n_MongoDB is deployed locally in a separate container, so `MONGO_URI` is not needed. All ports are set._\n\n```bash\n# /server/api/.env\nTOKEN_KEY=\"your_token\"\nMAIL_SERVER=\"\" # URL for SMTP server\nMAIL_USER=\"\" # Your mail user\nMAIL_PASSWORD=\"\" # Your mail password\nBASE_URL=\"http://localhost:5555\" # Base URL that will be used in email confirmation link (localhost for development)\n\n# you can create /.env to run the bot\nVITE_WITH_TELEGRAM=\"true\"\n```\n\n2. Edit `server/api/package.json`\n\nAdd this line:\n\n```json\n{\n  \"type\": \"module\"\n}\n```\n\n3. Run Docker container:\n\n```bash\ndocker-compose up --build -d\n```\n\n### Without Docker\n\n1. Clone the repository:\n\n```bash\ngit clone https://github.com/ra1nbow1/subscriptions_tracker.git\ncd subscription_tracker\n```\n\n2. Install dependencies for both client, server, and bot:\n\n```bash\nnpm install # client\n\ncd /server/api # server\nnpm install\n\ncd ../../bot # bot\npip install -r requirements.txt\n```\n\n3. Create environment files for the bot, server, and project root:\n\n```bash\n# /bot/.env\nBOT_TOKEN=\"\" # Your Telegram bot token\nWEBAPP_URL=\".../telegram\" # URL where the frontend is hosted (I used netlify)\nVITE_WITH_TELEGRAM=\"true/false\" # Flag to show if Telegram integration should be enabled\n\n# /server/api/.env\nMONGO_URI=\"\" # Your MongoDB connection string\nTOKEN_KEY=\"\" # Key for JWT\nMAIL_SERVER=\"\" # URL for SMTP server\nMAIL_USER=\"\" # Your mail user\nMAIL_PASSWORD=\"\" # Your mail password\nBASE_URL=\"http://localhost:5555\" # Base URL that will be used in email confirmation link (localhost for development)\n\n# /.env\nBACKEND_URL=\"\" # URL where the backend is hosted (I used ngrok)\nVITE_WITH_TELEGRAM=\"true/false\" # Flag to show if Telegram integration should be enabled\n```\n\n4. Start the server and client:\n\n```bash\n# Start the server\ncd server/api\nnpm run dev\n\n# Start the client\nnpm run dev\n```\n\n5. If you want to run the bot, ensure the frontend and backend are hosted. Don't forget to edit environment variable.\n   For example, you can use ngrok for the backend:\n\n```bash\nngrok http http://localhost:5555/\n```\n\n6. Then, start the bot:\n\n```bash\npython bot/main.py\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fra1nbow1%2Fsubscriptions_tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fra1nbow1%2Fsubscriptions_tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fra1nbow1%2Fsubscriptions_tracker/lists"}