{"id":26430613,"url":"https://github.com/mathisto/sprout-server","last_synced_at":"2025-03-18T05:32:17.613Z","repository":{"id":282941445,"uuid":"950170814","full_name":"mathisto/sprout-server","owner":"mathisto","description":"A Rails application for managing ESP32-based plant monitoring and automation.","archived":false,"fork":false,"pushed_at":"2025-03-17T19:16:37.000Z","size":124,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"trunk","last_synced_at":"2025-03-17T19:39:42.790Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/mathisto.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2025-03-17T18:33:35.000Z","updated_at":"2025-03-17T19:16:41.000Z","dependencies_parsed_at":"2025-03-17T19:49:52.635Z","dependency_job_id":null,"html_url":"https://github.com/mathisto/sprout-server","commit_stats":null,"previous_names":["mathisto/sprout-server"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mathisto%2Fsprout-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mathisto%2Fsprout-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mathisto%2Fsprout-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mathisto%2Fsprout-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mathisto","download_url":"https://codeload.github.com/mathisto/sprout-server/tar.gz/refs/heads/trunk","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244165721,"owners_count":20409134,"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":[],"created_at":"2025-03-18T05:32:16.956Z","updated_at":"2025-03-18T05:32:17.606Z","avatar_url":"https://github.com/mathisto.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🌱 Sprout Server\n\n\u003cdiv align=\"center\"\u003e\n\n![Sprout Server](public/icon.svg)\n\n[![Rails](https://img.shields.io/badge/Rails-8.2.0-ff1744.svg?style=flat-square\u0026logo=ruby-on-rails\u0026logoColor=white\u0026labelColor=1a1b26)](https://rubyonrails.org/)\n[![Ruby](https://img.shields.io/badge/Ruby-3.3.0-bb0826.svg?style=flat-square\u0026logo=ruby\u0026logoColor=white\u0026labelColor=1a1b26)](https://www.ruby-lang.org/)\n[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-14.0+-0055FF.svg?style=flat-square\u0026logo=postgresql\u0026logoColor=white\u0026labelColor=1a1b26)](https://www.postgresql.org/)\n[![HTMX](https://img.shields.io/badge/HTMX-2.0-2D5FEB.svg?style=flat-square\u0026logo=html5\u0026logoColor=white\u0026labelColor=1a1b26)](https://htmx.org/)\n[![Hotwire](https://img.shields.io/badge/Hotwire-Turbo_\u0026_Stimulus-7e57c2.svg?style=flat-square\u0026logo=hotwire\u0026logoColor=white\u0026labelColor=1a1b26)](https://hotwired.dev/)\n[![TailwindCSS](https://img.shields.io/badge/TailwindCSS-3.4-38bdf8.svg?style=flat-square\u0026logo=tailwind-css\u0026logoColor=white\u0026labelColor=1a1b26)](https://tailwindcss.com/)\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/mathisto/sprout-server/ci.yml?branch=trunk\u0026style=flat-square\u0026labelColor=1a1b26)](https://github.com/mathisto/sprout-server/actions)\n[![License](https://img.shields.io/badge/license-MIT-7aa2f7.svg?style=flat-square\u0026labelColor=1a1b26)](LICENSE)\n[![Last Commit](https://img.shields.io/github/last-commit/mathisto/sprout-server/trunk.svg?style=flat-square\u0026labelColor=1a1b26)](https://github.com/mathisto/sprout-server/commits/trunk)\n\n*A modern, real-time plant monitoring system powered by ESP32 devices and Rails* 🪴\n\n[Features](#-features) • [Getting Started](#-getting-started) • [Development](#-development) • [Deployment](#-deployment) • [Contributing](#-contributing)\n\n\u003c/div\u003e\n\n## ✨ Features\n\n- 🌿 Real-time plant moisture monitoring\n- 📊 Beautiful, interactive charts and visualizations\n- 🔔 Instant notifications when plants need attention\n- 📱 Progressive Web App (PWA) support\n- 🤖 ESP32 device integration\n- 🔄 HTMX-powered dynamic interactions\n- ⚡️ WebSocket live updates via Hotwire\n- 🎨 Modern, responsive UI with TailwindCSS\n- 🧪 Comprehensive test suite\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- Ruby 3.3.0\n- PostgreSQL 14+\n- Node.js 18+\n- Yarn 1.x\n- Redis (optional, for ActionCable in production)\n\n### Quick Start\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/mathisto/sprout-server.git\ncd sprout-server\n```\n\n2. Install dependencies:\n```bash\nbundle install\nyarn install\n```\n\n3. Set up your environment:\n```bash\ncp .env.example .env\n# Edit .env with your configuration\n```\n\n4. Set up the database:\n```bash\nrails db:create db:migrate db:seed\n```\n\n5. Start the development server:\n```bash\nbin/dev\n```\n\nVisit http://localhost:3000 and start monitoring your plants! 🌱\n\n## 💻 Development\n\n### Running Tests\n\n```bash\nbundle exec rspec                 # Run all tests\nbundle exec rspec spec/models     # Run specific test directory\nbundle exec rspec spec/models/plant_spec.rb  # Run specific test file\n```\n\n### Code Quality\n\n```bash\nbundle exec rubocop              # Ruby style guide\nbundle exec brakeman            # Security vulnerabilities\nbundle exec bundle audit        # Gem vulnerabilities\n```\n\n### Architecture\n\n```mermaid\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'primaryColor': '#1a1b26',\n      'primaryTextColor': '#a9b1d6',\n      'primaryBorderColor': '#7aa2f7',\n      'lineColor': '#7aa2f7',\n      'secondaryColor': '#24283b',\n      'tertiaryColor': '#414868'\n    }\n  }\n}%%\ngraph TD\n    A[ESP32 Device]:::iot --\u003e|HTTP POST| B[Rails API]:::server\n    B --\u003e|ActionCable| C[Browser Client]:::client\n    B --\u003e|Store| D[(PostgreSQL)]:::db\n    \n    C --\u003e|HTMX Requests| B\n    B --\u003e|HTML Fragments| C\n    \n    C --\u003e|Turbo Streams| E[Dashboard]:::ui\n    C --\u003e|Service Worker| F[PWA Notifications]:::worker\n\n    classDef default fill:#1a1b26,stroke:#7aa2f7,color:#a9b1d6,stroke-width:2px\n    classDef iot fill:#2ac3de,stroke:#7dcfff,color:#1a1b26,stroke-width:2px\n    classDef server fill:#f7768e,stroke:#ff9e64,color:#1a1b26,stroke-width:2px\n    classDef client fill:#9ece6a,stroke:#73daca,color:#1a1b26,stroke-width:2px\n    classDef db fill:#bb9af7,stroke:#c0caf5,color:#1a1b26,stroke-width:2px\n    classDef ui fill:#e0af68,stroke:#ff9e64,color:#1a1b26,stroke-width:2px\n    classDef worker fill:#7aa2f7,stroke:#b4f9f8,color:#1a1b26,stroke-width:2px\n```\n\n## 📦 Deployment\n\nThis application uses [Kamal](https://kamal-deploy.org/) for deployment:\n\n1. Set up your deployment configuration:\n```bash\ncp config/deploy.yml.example config/deploy.yml\n# Edit deploy.yml with your server configuration\n```\n\n2. Deploy:\n```bash\nbin/kamal setup\nbin/kamal deploy\n```\n\n## 🤝 Contributing\n\nWe love contributions! Please check out our [Contributing Guide](CONTRIBUTING.md) for guidelines.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -am 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- [Ruby on Rails](https://rubyonrails.org/) - The web framework that powers everything\n- [HTMX](https://htmx.org/) - For modern HTML-driven interactivity\n- [Hotwire](https://hotwired.dev/) - For making real-time updates a breeze\n- [TailwindCSS](https://tailwindcss.com/) - For the beautiful UI components\n- [Chart.js](https://www.chartjs.org/) - For the gorgeous data visualizations\n- All our [contributors](https://github.com/mathisto/sprout-server/graphs/contributors) 💚\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nMade with 💚 by [Matt Kelly](https://github.com/mathisto)\n\n\u003csub\u003eTheme inspired by [Tokyo Night](https://github.com/enkia/tokyo-night-vscode-theme) 🌃\u003c/sub\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathisto%2Fsprout-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmathisto%2Fsprout-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathisto%2Fsprout-server/lists"}