Track every sip, every sunbeam, and every growth spurt with growlog β the CLI tool that turns you into a plant whisperer. Log watering, fertilizer, light, temp, and humidity so you never forget when your fiddle-leaf fig is thirsty again.
# Install globally
bun add -g growlog
# or
npm install -g growlog
# Add your first plant
growlog add --name "Monstera Deliciosa" --species "Monstera deliciosa" --location "Living room"
# Log a watering
growlog log --plant "Monstera Deliciosa" --type water --amount 250 --unit ml
# See history
growlog show --plant "Monstera Deliciosa"bun add -g growlog
# or
npm install -g growlogbun add growlog
# or
npm install growloginterface Plant {
id: string;
name: string;
species?: string;
location?: string;
plantedAt?: string; // ISO date
}
type ObservationType = 'water' | 'fertilizer' | 'light' | 'temp' | 'humidity';
interface Observation {
id: string;
plantId: string;
type: ObservationType;
value: number; // amount in unit
unit: string; // e.g., "ml", "lux", "Β°C", "%"
notes?: string;
timestamp: string; // ISO datetime
}import { createLogger, JSONStorage } from 'growlog';
const storage = new JSONStorage({ dataDir: '~/.growlog' });
const logger = createLogger({ storage });
// Add a plant
const plant = await logger.addPlant({
name: 'Aloe Vera',
species: 'Aloe barbadensis miller',
location: 'Kitchen windowsill'
});
// Log an observation
await logger.addObservation({
plantId: plant.id,
type: 'water',
value: 100,
unit: 'ml',
notes: 'Bottom watering'
});
// Query history
const history = await logger.getObservations({ plantId: plant.id });await logger.addObservation({
plantId: plant.id,
type: 'light',
value: 12,
unit: 'hours',
notes: 'Moved to brighter spot'
});import { exportToCSV } from 'growlog';
const csv = await exportToCSV(logger, { plantId: plant.id });
fs.writeFileSync('monstera-history.csv', csv);Found a bug? Want a new feature? Open an issue or PR! We love plant nerds and code nerds alike.
- Fork it
bun install- Hack away
- Test it:
bun test - Open a PR
MIT Β© AdametherzLab
Happy growing! πΏπ§βοΈ