Flexible Time Periods
Generate trackers for any month or multi-month spans
A practical productivity tool for building better habits - This Rust application generates printable habit tracking sheets with flexible layouts, custom time periods, and multiple output formats.
The Habit Tracker Generator creates printable worksheets to help users:
Flexible Time Periods
Generate trackers for any month or multi-month spans
Custom Habits
Add any number of personal habits and goals
Printable Format
Optimized for printing with clear, readable layouts
Multiple Outputs
Text and PDF formats for different use cases
# Generate tracker for current month + next 2 monthscargo run# Start from April 2025cargo run 2025-04# Specify your own habitscargo run 2025-04 "Running" "Reading" "Coding" "Meditation" "Hydration" "Vitamins"Generates a clean, printable text layout:
HABIT TRACKER - April 2025
Running □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □Reading □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □Coding □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □Meditation □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □Future enhancement will include PDF generation with:
[dependencies]chrono = "0.4" # Date/time handlingclap = { version = "4.0", features = ["derive"] } # CLI parsinganyhow = "1.0" # Error handlinguse chrono::{Datelike, NaiveDate, Utc};
fn generate_months(start_date: NaiveDate, months: usize) -> Vec<MonthData> { (0..months) .map(|offset| { let date = start_date + chrono::Months::new(offset as u32); MonthData { year: date.year(), month: date.month(), days_in_month: days_in_month(date.year(), date.month()), } }) .collect()}fn create_tracker(habits: &[String], months: &[MonthData]) -> String { let mut output = String::new();
for month in months { writeln!(output, "HABIT TRACKER - {} {}", month.month_name(), month.year)?;
for habit in habits { write!(output, "{:<12}", habit)?; for _ in 0..month.days_in_month { write!(output, "□ ")?; } writeln!(output)?; } writeln!(output)?; }
Ok(output)}#[derive(Parser)]#[command(name = "habit-tracker")]#[command(about = "Generate printable habit tracking sheets")]struct Args { /// Starting month in YYYY-MM format (defaults to current month) start_month: Option<String>,
/// Number of months to generate (default: 3) #[arg(short, long, default_value = "3")] months: usize,
/// List of habits to track habits: Vec<String>,}#[derive(Debug)]struct MonthData { year: i32, month: u32, days_in_month: u32,}
#[derive(Debug)]struct HabitTracker { habits: Vec<String>, months: Vec<MonthData>, output_format: OutputFormat,}The project includes comprehensive CI/CD with Woodpecker:
# Plan for Q2 2025cargo run 2025-04 --months 3 \ "Exercise" "Read 30min" "Write Code" "Meditate" \ "Drink Water" "Take Vitamins" "Learn New Skill"# Focus on weekly goalscargo run 2025-04 --months 1 \ "Monday Workout" "Tuesday Learning" "Wednesday Writing" \ "Thursday Project" "Friday Review" "Weekend Planning"# 6-month habit buildingcargo run 2025-01 --months 6 \ "Wake Early" "Healthy Breakfast" "No Phone 1hr" \ "Evening Walk" "Gratitude Journal" "Sleep by 10pm"The project welcomes contributions in: