How martinwa/growbook works
Growbook is a private, self-hosted Django garden diary and planting planner. The main workflow is an authenticated garden member recording observations or maintaining growing-area, crop, variety, and planting records; the application validates and persists changes, then presents diary searches, registers, cycle cards, and growing-year histories. Photos are processed and stored privately. The README documents backup, restore, appearance, and release indicators as additional capabilities. Some view and operations implementations were not sampled, so those links rely on README statements rather than inspected call paths.
Main entry points: photo_storage.py Photo bundles · urls.py Django routes · views.py Diary pages · services.py Diary writes
Components 22
Application runtime
- Django routes
growbook/urls.py - Theme and release context
core/context_processors.py - Operational commands
core/management/commands/backup_garden.py
Diary
- Diary pages
diary/views.py - Diary search and filters
diary/queries.py - Diary writes
diary/services.py - Diary records
diary/models.py
Garden records
- Register pages
garden/views/registers.py - Register forms
garden/forms.py - Register writes
garden/services/registers.py - Area and history queries
garden/queries.py - Garden records
garden/models.py
Planting lifecycle
- Planting pages
garden/views/plantings.py - Planting writes
garden/services/plantings.py - Cycle operations
garden/services/cycles.py - Planting events
garden/views/events.py
Shared services
- Photo bundles
core/photo_storage.py - Private media operations
core/media.py - Photo records
core/models.py - Entry permissions
diary/permissions.py - Backup and restore
core/backups.py
Other components
- Garden member
Connections 25
- Garden member → Django routes: opens pages
- Django routes → Diary pages: routes diary
- Django routes → Register pages: routes registers
- Django routes → Planting pages: routes plantings
- Diary pages → Diary writes: saves entries
diary/services.py - Diary pages → Diary search and filters: queries diary
diary/queries.py - Diary writes → Diary records: writes entries
diary/services.py - Diary pages → Entry permissions: checks permissions
- Diary writes → Photo bundles: stages photos
diary/services.py - Register pages → Register forms: validates input
garden/views/registers.py - Register pages → Register writes: saves records
garden/views/registers.py - Register writes → Garden records: writes records
garden/services/registers.py - Register pages → Area and history queries: reads records
garden/views/registers.py - Register writes → Photo bundles: saves photos
garden/services/registers.py - Planting pages → Planting writes: saves plantings
garden/views/plantings.py - Planting pages → Area and history queries: reads histories
garden/views/plantings.py - Planting writes → Cycle operations: creates cycles
garden/services/plantings.py - Planting writes → Garden records: writes plantings
garden/services/plantings.py - Planting events → Garden records: records events
- Planting writes → Photo bundles: saves photos
garden/services/plantings.py - Photo bundles → Private media operations: resolves paths
core/photo_storage.py - Photo bundles → Photo records: checks references
core/photo_storage.py - Diary writes → Photo records: creates photos
diary/services.py - Theme and release context → Garden member: provides theme
- Operational commands → Backup and restore: runs backup