Planting Optimisation Tool — v1.0.0
First stable release, delivered by the Chameleon Company T1 2026 cohort.
Live at: https://www.planting-optimisation-tool.app
Features
Authentication
- User registration with email verification
- JWT-based login, password reset, resend verification
- Role-based access control (Officer, Supervisor, Admin)
Farm Management
- Create, edit, and delete farms with spatial boundary mapping
- Riparian flag detection via GIS waterways analysis
- Farm search and filtering
Environmental Profiling
- Google Earth Engine integration for slope, rainfall, and soil data
- Automatic imputation for farms with missing GEE data
Species Recommendations
- AHP-weighted multi-criteria suitability scoring
- Ranked recommendations per farm with exclusion reasons
- PDF and DOCX export
Sapling Estimation
- Planting grid calculation with slope and rotation optimisation
- Live map view of farm boundary and planting grid overlay
Admin Panel
- Species CRUD with image support
- AHP weight matrix configuration
- Global weights management
Infrastructure
- Deployed on Render (PostgreSQL + PostGIS, Redis, Docker backend, static frontend)
- Transactional email via Brevo
- Redis result caching for recommendations, profiles, and sapling estimation
- Structured logging and Datadog monitoring
- Custom domain: planting-optimisation-tool.app
What's Changed
- Apply all changes from feature/api-structure on top of upstream/master by @leecopland in #76
- Feature/api structure by @leecopland in #77
- Update data science data by @dwstephens in #80
- feature/ds/gis by @DuyVo080303 in #75
- Feature/recommender system refactor by @dwstephens in #81
- Feature/exclusion rules by @chenmuy7 in #78
- Feature/api structure by @leecopland in #83
- Update max ph acceptable range by @dwstephens in #84
- Added OAuth2 authentication, justfile, refactoring by @leecopland in #86
- Feature/integration refactoring by @leecopland in #88
- Addition of slope_raster.py module by @FelixHendrawan in #91
- Addition of planting_points module by @FelixHendrawan in #92
- Feature/suitability scoring: trapezoid scoring by @dwstephens in #94
- Feature/integration refactoring by @leecopland in #93
- Updates to species parameters by @dwstephens in #95
- Addition of rotation module by @FelixHendrawan in #96
- Feature/remove pandas and dataframes by @dwstephens in #98
- Feature/integration refactoring by @leecopland in #102
- Feature/integration refactoring by @leecopland in #104
- Fix the extract_environmental_factor_each_farm.ipynb by @DuyVo080303 in #106
- Feature/soil compatibility scoring by @dwstephens in #103
- Feature/ds/gis integration by @JoshPDang in #107
- Feature/integration refactoring by @leecopland in #108
- Add tree survival prediction notebook by @cbasadeakin in #99
- Addition of slope rules module by @FelixHendrawan in #113
- Complete public API for suitability scoring package by @dwstephens in #115
- Addition of sapling estimation module by @FelixHendrawan in #116
- Feature/recommendations by @leecopland in #118
- Feature/exclusion rules by @chenmuy7 in #117
- Implement the validation between my farm dataset and PO dataset by @DuyVo080303 in #111
- Feature/exclusions integration by @dwstephens in #122
- Update recommendation service to store exclusions by @dwstephens in #126
- Commit Home/Landing page by @mivo1101 in #120
- Refactoring of all modules for sapling estimation feature by @FelixHendrawan in #124
- Complete documentation for suitability scoring by @dwstephens in #121
- Feature/GIS/Documentation by @DuyVo080303 in #130
- Integration of sapling estimation feature by @dwstephens in #132
- Cross platform functionality by @leecopland in #129
- Add Product Owner dataset data dictionary by @cbasadeakin in #127
- Addition of documentation for sapling estimation feature by @FelixHendrawan in #133
- Backend documentation by @leecopland in #134
- Commit Species Information page by @mivo1101 in #131
- Authentication and Access Control by @swasti-ajmera in #125
- Bump pyasn1 from 0.6.1 to 0.6.2 in /backend by @dependabot[bot] in #137
- Bump protobuf from 6.33.1 to 6.33.5 in /gis by @dependabot[bot] in #147
- Bump axios from 1.13.2 to 1.13.5 in /frontend by @dependabot[bot] in #148
- Bump qs from 6.14.1 to 6.15.0 in /frontend by @dependabot[bot] in #146
- Bump protobuf from 6.33.4 to 6.33.5 in /backend by @dependabot[bot] in #145
- Bump urllib3 from 2.5.0 to 2.6.3 in /gis by @dependabot[bot] in #135
- Bump geopandas from 1.1.1 to 1.1.2 in /gis by @dependabot[bot] in #144
- Bump pyasn1 from 0.6.1 to 0.6.2 in /gis by @dependabot[bot] in #136
- Bump python-multipart from 0.0.21 to 0.0.22 in /backend by @dependabot[bot] in #143
- Bump pillow from 12.1.0 to 12.1.1 in /backend by @dependabot[bot] in #140
- Bump pillow from 12.0.0 to 12.1.1 in /datascience by @dependabot[bot] in #141
- Adds issue templates by @dwstephens in #149
- Development/formatting enforcement by @leecopland in #347
- Workflow file for PR review template by @leecopland in #352
- Modification of suitability scoring module to accept SQLAlchemy ORM objects directly by @dwstephens in #349
- Updating review checklist CI by @leecopland in #355
- Data Science consolidate documentation and notebooks by @dwstephens in #356
- Refactor exclusion module to support ORM-based data access by @Chinthika in #353
- Repo Documentation update by @leecopland in #351
- Enforce ownership validation for farm profile endpoint (#167) by @Naresh-Barua in #369
- CI test coverage checks by @leecopland in #370
- Implement case-insensitive email normalization and duplicate prevention by @Naresh-Barua in #354
- US006/architecture refactoring by @leecopland in #371
- Enforce predefined valid roles on backend (Issue #163) by @Naresh-Barua in #367
- Implementation of AHP core and CLI by @dwstephens in #368
- Add password complexity validation with test coverage (Issue #165) by @Naresh-Barua in #357
- Feature/us 019 by @JoshPDang in #366
- US001/ Migrate frontend from TS to React by @CAHAT0002 in #376
- Removal of assets dir from gitignore by @leecopland in #387
- US007 - Rate Limiting by @leecopland in #386
- Adjust rainfall lower value in data dictionary and schema by @dwstephens in #389
- Adding pre-commit project wide by @leecopland in #391
- Hotfix for #391 that was linux specific by @leecopland in #392
- US-020: Rebuild farm dataset by @Vasmai1610 in #348
- Implementation of AHP backend infrastructure by @dwstephens in #377
- Adding testing and ratelimit workaround for backend ci pytest by @leecopland in #393
- Feature/email verification password reset #166 by @Naresh-Barua in #388
- US-020 Fix by @leecopland in #394
- Implement frontend automated testing suite by @Chinthika in #381
- US-015: DEM integration and result persistence by @Tamil5102000 in #375
- US_18: Riparian Flag by @JoshPDang in #379
- Adding port flexibility for api usage by @leecopland in #396
- Patch - Api port flexibility by @leecopland in #398
- US-042/Sapling Estimation Feature Rotation Optimization by @FelixHendrawan in #372
- Fix for Alembic wanting to drop tables by @dwstephens in #399
- added geoalchemy2 to alembic autogenerate script by @leecopland in #400
- Changes backend to allow connections from frontend by @dwstephens in #402
- Build the core dashboard shell layout for management pages #155 by @Naresh-Barua in #395
- US-032/US-033: Overhaul exclusion rules by @dwstephens in #401
- Initial redis layer scaffolding implementation with rate limiting by @leecopland in #397
- Patch for port flexibility by @leecopland in #405
- render.yaml corrections by @leecopland in #406
- Us007/infrastructure deployment by @leecopland in #407
- Feature/admin login screen & integrate backend authentication and protect admin routes (#154) by @Naresh-Barua in #403
- Us 034 ecological function by @Vasmai1610 in #409
- Fix the spelling of Ai-bubur by @dwstephens in #419
- Feature/imputation model training by @JoshPDang in #404
- feat: implement secure CRUD endpoints for species #221 by @Naresh-Barua in #416
- Feature: Recommendation UI by @dwstephens in #420
- Implement unified farm reporting service with DOCX and PDF export by @Chinthika in #408
- Feature - suitability scoring domain update by @dwstephens in #418
- US-007 Infrastructure deployment - Caching, Render targets, CI integration by @leecopland in #417
- Fixing render.yaml blueprint for reproducibility by @leecopland in #440
- Feature: generic login by @dwstephens in #441
- US-007 Load-testing #174 by @leecopland in #436
- Feature: recommendation reporting by @dwstephens in #443
- Feature: add logical validation for species input ranges (#222) by @Naresh-Barua in #422
- Feature: UI for Analytic Hierarchy Process by @dwstephens in #426
- US-059/User registration page by @leecopland in #444
- US-044: Advanced slope and spacing configuration by @Tamil5102000 in #424
- US-059/verify email fix by @leecopland in #446
- US014/Farm-environmental-profile-UI-clean by @CAHAT0002 in #448
- US-035: Survivability model data remediation and baseline retraining - Cleaning and fob id recycling #248 #249 #250 by @swasti-ajmera in #423
- US-057: enforce admin-only farm access, add validation,and update tests #413 by @Naresh-Barua in #438
- US-043: Implementation of Sapling Estimation UI by @FelixHendrawan in #449
- Pre-commit fix, frontend overriding others by @leecopland in #454
- Skip riparian tests by @leecopland in #460
- Fix #434: All-farms DOCX export times out blocking backend development by @Chinthika in #452
- Fix - reduce species image dimensions and align card grid by @leecopland in #456
- US-022: Imputation service integration and data flagging by @JoshPDang in #450
- Feature: implement species management UI with add, edit, delete, vali… by @Naresh-Barua in #457
- Growth cleaning by @dwstephens in #458
- Retire riparian flag in GIS and fix GIS test by @JoshPDang in #462
- Add scoring parameters CRUD API endpoints by @Chinthika in #461
- Add all-farms DOCX export load test to locustfile by @Chinthika in #469
- Fix/brevo smtp timeout by @leecopland in #467
- feature: improve species validation error handling and UI feedback #224 by @Naresh-Barua in #475
- Fix/increase-ingestion-timeout by @leecopland in #488
- Fix/render oom by @leecopland in #474
- Us 045 enhanced reporting by @Vasmai1610 in #463
- US 017 hybrid geospatial data by @Tamil5102000 in #464
- Fix/migrate-dem-table by @leecopland in #494
- US 040 growth model development by @JoshPDang in #489
- fix redis implementation, add cache tests by @leecopland in #497
- Addition of router-level tests for Sapling Estimation endpoint by @FelixHendrawan in #490
- Switch email service from SMTP to Brevo HTTP API by @leecopland in #499
- US-064: Add unit tests for the recommendation API router by @Chinthika in #500
- Feature: Add forgot and reset password UI flow #465 by @Naresh-Barua in #491
- US-012/Farm Management UI by @CAHAT0002 in #495
- Fix/riparian by @dwstephens in #501
- US-063: Add pytest diff coverage reporting to Data Science and GIS CI pipelines by @Chinthika in #504
- Feature: Data-driven weights by @dwstephens in #498
- Bug: Fix reset token API URL fallback #508 by @Naresh-Barua in #511
- Diff coverage CI fixes by @leecopland in #513
- US-035, US-036 and US-037 Survivability model training by @swasti-ajmera in #503
- Adding render predeploy for db migrations by @leecopland in #521
- Predeploy render - Forgot to change plan by @leecopland in #522
- Fix/fe linting by @dwstephens in #502
- US-048: Sapling Estimation batch processing endpoint by @FelixHendrawan in #518
- Bug: Fix add rate limiting to password reset endpoints #514 by @Naresh-Barua in #520
- US-053 Sapling estimation UI by @leecopland in #517
- Predeploy render db fix by @leecopland in #523
- US-D01 Bulk sapling workflow documentation by @Vasmai1610 in #515
- US-D03: Document Alembic database migration workflow by @Tamil5102000 in #516
- Remove supersceeded files by @dwstephens in #527
- Allow /users/me/items to show all farms for users by @dwstephens in #524
- Fix/fe linting warnings by @dwstephens in #526
- Fix Render preDeployCommand to use absolute path by @leecopland in #528
- Fix Add admin button to home page by @dwstephens in #529
- Fix/farm management by @dwstephens in #530
- Fix farm map test timeout by @dwstephens in #531
- Bug: Add automatic verification email resend flow #509 by @Naresh-Barua in #519
- Styling/last minute changes by @leecopland in #537
- Fix #421: Pydantic v2 validators silently dropped on Optional fields in update schemas by @Chinthika in #532
- Bug/Confirm-Delete-UI by @CAHAT0002 in #536
- Docs: Update and Clean Project Documentation by @Tamil5102000 in #534
- US-D02 Environmental Profile Dataflow Documentation by @CAHAT0002 in #535
- UI/bug fixes, cleanup. by @leecopland in #539
- Dependabot security patch by @leecopland in #540
- docs: add imputation and growth model sections to datascience README by @JoshPDang in #541
New Contributors
- @chenmuy7 made their first contribution in #78
- @FelixHendrawan made their first contribution in #91
- @cbasadeakin made their first contribution in #99
- @mivo1101 made their first contribution in #120
- @swasti-ajmera made their first contribution in #125
- @dependabot[bot] made their first contribution in #137
- @Chinthika made their first contribution in #353
- @Naresh-Barua made their first contribution in #369
- @CAHAT0002 made their first contribution in #376
- @Vasmai1610 made their first contribution in #348
- @Tamil5102000 made their first contribution in #375
Full Changelog: https://github.com/Chameleon-company/Planting-Optimisation-Tool/commits/v1.0.0