TidyQuest is a self-hosted web application that gamifies household chores using RPG mechanics. Complete tasks, earn coins, unlock achievements, and compete with your family on the leaderboard. Features: - 🎯 Health-based task tracking with visual decay over time - 💰 Coin system with customizable rewards - 🔥 Daily/weekly streak tracking - 🏆 Family leaderboard (week/month/quarter/year) - 🎖️ Automatic achievement unlocking - 📅 Calendar view for upcoming tasks - 🌍 Multilingual support (EN/FR/DE/ES) - 📱 Optional Telegram notifications - 🏖️ Vacation mode (pause task decay) - 🐳 Docker deployment (single container) Tech Stack: - Frontend: React 19 + Vite + TypeScript - Backend: Node.js + Express + TypeScript - Database: SQLite3 with WAL mode - Auth: JWT + bcrypt - Deployment: Docker Compose Includes: - 8 room types with 60+ predefined tasks - 10 preset rewards - 12 achievement types - Complete API documentation - Security best practices guide - Comprehensive README with examples License: GNU Affero General Public License v3.0 (AGPL-3.0) This ensures TidyQuest remains free and open-source forever, preventing proprietary SaaS forks. Any modified hosted version must share source code.
512 lines
19 KiB
JSON
512 lines
19 KiB
JSON
{
|
|
"tasks": {
|
|
"kitchen": {
|
|
"wash_dishes": "Wash dishes",
|
|
"clean_counters": "Clean counters",
|
|
"wipe_stovetop": "Wipe stovetop",
|
|
"empty_trash": "Empty trash",
|
|
"empty_household_waste": "Empty household waste",
|
|
"empty_compost": "Empty compost",
|
|
"empty_plastic_recycling": "Empty plastic recycling",
|
|
"empty_glass_recycling": "Empty glass recycling",
|
|
"clean_sink": "Clean sink",
|
|
"clean_sink_drain": "Clean sink drain",
|
|
"wipe_appliances": "Wipe appliances",
|
|
"mop_floor": "Mop floor",
|
|
"clean_microwave": "Clean microwave",
|
|
"wipe_cabinet_fronts": "Wipe cabinet fronts",
|
|
"clean_fridge": "Clean fridge",
|
|
"defrost_freezer": "Defrost freezer",
|
|
"descale_kettle": "Descale kettle",
|
|
"clean_dishwasher": "Clean dishwasher",
|
|
"clean_dishwasher_filter": "Clean dishwasher filter",
|
|
"check_dishwasher_salt": "Check/add dishwasher salt",
|
|
"clean_oven": "Clean oven",
|
|
"clean_range_hood": "Clean range hood",
|
|
"deep_clean_fridge": "Deep clean fridge",
|
|
"organize_pantry": "Organize pantry"
|
|
},
|
|
"bedroom": {
|
|
"make_bed": "Make bed",
|
|
"tidy_nightstand": "Tidy nightstand",
|
|
"change_sheets": "Change sheets",
|
|
"vacuum_floor": "Vacuum floor",
|
|
"dust_surfaces": "Dust surfaces",
|
|
"clean_under_bed": "Clean under bed",
|
|
"wash_pillows": "Wash pillows",
|
|
"wash_duvet": "Wash duvet",
|
|
"change_fitted_sheet": "Change fitted sheet",
|
|
"organize_closet": "Organize closet",
|
|
"flip_mattress": "Flip mattress",
|
|
"clean_windows": "Clean windows",
|
|
"wash_curtains": "Wash curtains"
|
|
},
|
|
"bathroom": {
|
|
"wipe_sink_counter": "Wipe sink & counter",
|
|
"squeegee_shower": "Squeegee shower",
|
|
"scrub_toilet": "Scrub toilet",
|
|
"clean_mirror": "Clean mirror",
|
|
"wash_towels": "Wash towels",
|
|
"clean_shower_tub": "Clean shower & tub",
|
|
"clean_sink_drain": "Clean sink drain",
|
|
"mop_floor": "Mop floor",
|
|
"clean_shower_drain": "Clean shower drain",
|
|
"wash_bath_mat": "Wash bath mat",
|
|
"wipe_switches_handles": "Wipe switches & handles",
|
|
"clean_grout": "Clean grout",
|
|
"descale_showerhead": "Descale showerhead",
|
|
"wash_shower_curtain": "Wash shower curtain",
|
|
"organize_cabinets": "Organize cabinets",
|
|
"replace_toothbrush": "Replace toothbrush"
|
|
},
|
|
"living": {
|
|
"tidy_up": "Tidy up",
|
|
"fluff_cushions": "Fluff cushions",
|
|
"vacuum_carpet": "Vacuum carpet",
|
|
"dust_surfaces_shelves": "Dust surfaces & shelves",
|
|
"wipe_tv": "Wipe TV",
|
|
"clean_remotes": "Clean remotes",
|
|
"dust_lampshades": "Dust lampshades",
|
|
"vacuum_sofa": "Vacuum sofa",
|
|
"clean_windows": "Clean windows",
|
|
"wash_curtains_blinds": "Wash curtains & blinds",
|
|
"deep_clean_carpet": "Deep clean carpet",
|
|
"clean_behind_furniture": "Clean behind furniture",
|
|
"polish_furniture": "Polish furniture"
|
|
},
|
|
"office": {
|
|
"clear_desk": "Clear desk",
|
|
"wipe_desk": "Wipe desk",
|
|
"clean_keyboard_mouse": "Clean keyboard & mouse",
|
|
"wipe_monitor": "Wipe monitor",
|
|
"empty_paper_trash": "Empty paper trash",
|
|
"vacuum_floor": "Vacuum floor",
|
|
"organize_cables": "Organize cables",
|
|
"dust_shelves": "Dust shelves",
|
|
"clean_desk_lamp": "Clean desk lamp",
|
|
"organize_drawers": "Organize drawers",
|
|
"wipe_switches": "Wipe switches",
|
|
"clean_chair": "Clean chair"
|
|
},
|
|
"garage": {
|
|
"sweep_floor": "Sweep floor",
|
|
"organize_tools": "Organize tools",
|
|
"clean_workbench": "Clean workbench",
|
|
"clear_cobwebs": "Clear cobwebs",
|
|
"organize_shelves": "Organize shelves",
|
|
"wipe_power_tools": "Wipe power tools",
|
|
"sort_recycling": "Sort recycling",
|
|
"mop_hose_floor": "Mop or hose floor",
|
|
"check_chemicals": "Check chemicals",
|
|
"clean_door_tracks": "Clean door tracks"
|
|
},
|
|
"laundry": {
|
|
"wipe_washer_seal": "Wipe washer seal",
|
|
"clean_lint_filter": "Clean lint filter",
|
|
"wipe_machine_exterior": "Wipe machine exterior",
|
|
"run_cleaning_cycle": "Run cleaning cycle",
|
|
"drain_washing_machine": "Drain washing machine",
|
|
"descale_washing_machine": "Descale washing machine",
|
|
"clean_detergent_drawer": "Clean detergent drawer",
|
|
"sweep_mop_floor": "Sweep & mop floor",
|
|
"organize_supplies": "Organize supplies",
|
|
"clean_dryer_vent": "Clean dryer vent",
|
|
"wipe_folding_surface": "Wipe folding surface",
|
|
"sort_donate_clothes": "Sort & donate clothes"
|
|
}
|
|
},
|
|
"rooms": {
|
|
"kitchen": "Kitchen",
|
|
"bedroom": "Bedroom",
|
|
"bathroom": "Bathroom",
|
|
"living": "Living Room",
|
|
"office": "Office",
|
|
"garage": "Garage",
|
|
"laundry": "Laundry Room",
|
|
"other": "Other"
|
|
},
|
|
"ui": {
|
|
"profile": {
|
|
"title": "Profile",
|
|
"displayName": "Display Name",
|
|
"avatarMode": "Avatar Mode",
|
|
"letterMode": "Letter",
|
|
"characterMode": "Character",
|
|
"photoMode": "Photo",
|
|
"uploadPhoto": "Upload Photo",
|
|
"language": "Language",
|
|
"save": "Save",
|
|
"saved": "Saved",
|
|
"logout": "Log out"
|
|
},
|
|
"settings": {
|
|
"title": "Settings",
|
|
"general": "General",
|
|
"notifications": "Notifications",
|
|
"notificationsDesc": "Daily cleaning reminders",
|
|
"theme": "Theme",
|
|
"themeDesc": "Switch the app color mood",
|
|
"themeOrange": "Warm Orange",
|
|
"themeBlue": "Light Blue",
|
|
"themeRose": "Light Rose",
|
|
"themeNight": "Night",
|
|
"vacationMode": "Vacation Mode",
|
|
"vacationDesc": "Pause all task reminders while you're away",
|
|
"adminRequired": "Parent admin required to change settings.",
|
|
"data": "Data",
|
|
"dataPrivacy": "Data & Privacy",
|
|
"export": "Export",
|
|
"exportData": "Export Data",
|
|
"exportDesc": "Download JSON backup",
|
|
"download": "Download",
|
|
"import": "Import",
|
|
"importData": "Import Data",
|
|
"importDesc": "Restore from backup",
|
|
"upload": "Upload",
|
|
"family": "Family",
|
|
"familyMembers": "Family Members",
|
|
"addMember": "Add Member",
|
|
"memberDisplayName": "Display name",
|
|
"memberUsername": "Username",
|
|
"memberPassword": "Password",
|
|
"passwordSection": "Password",
|
|
"currentPassword": "Current password",
|
|
"newPassword": "New password",
|
|
"confirmPassword": "Confirm new password",
|
|
"updatePassword": "Update password",
|
|
"resetPassword": "Reset password",
|
|
"passwordMismatch": "Passwords do not match.",
|
|
"passwordUpdated": "Password updated.",
|
|
"passwordUpdateFailed": "Failed to update password.",
|
|
"manageChild": "Manage child",
|
|
"coinsPerEffort": "Coins per effort",
|
|
"coinsPerEffortDesc": "Set how many coins are earned for effort levels 1 to 5.",
|
|
"goalsSection": "Goals by member",
|
|
"goalsSectionDesc": "Set coin targets and period for each child/member.",
|
|
"useDefaultCoins": "Use default values",
|
|
"create": "Create",
|
|
"privacy": "Privacy",
|
|
"privacyDesc": "All data stays on your server",
|
|
"docker": "Docker",
|
|
"roleAdmin": "Admin",
|
|
"roleChild": "Child",
|
|
"setAs": "Set as",
|
|
"coins": "coins",
|
|
"streak": "streak",
|
|
"roleMember": "Member",
|
|
"deleteUser": "Delete user",
|
|
"deleteUserConfirm": "Delete \"{user}\"? This cannot be undone.",
|
|
"goalCoins": "Goal coins",
|
|
"goalTitle": "Goal title",
|
|
"setGoal": "Set goal",
|
|
"addGoal": "Add goal",
|
|
"manageMember": "Manage member",
|
|
"goalStart": "Start date",
|
|
"goalEnd": "End date",
|
|
"goalDeleted": "Goal deleted.",
|
|
"goalDeleteFailed": "Failed to delete goal.",
|
|
"rewardsSection": "Rewards Catalog",
|
|
"rewardsSectionDesc": "Parents can create rewards children can buy with coins.",
|
|
"rewardTitle": "Reward title",
|
|
"rewardDesc": "Description",
|
|
"rewardCost": "Coins cost",
|
|
"addPresetRewards": "Add preset rewards",
|
|
"rewardRequests": "Reward requests",
|
|
"noRewardRequests": "No reward requests yet.",
|
|
"telegramChatId": "Telegram chat ID",
|
|
"telegramChatIdHint": "Expected: numeric chat ID (example: 123456789 or -1001234567890). Open Telegram chat with your bot first.",
|
|
"notificationTime": "Notification time",
|
|
"telegramToken": "Telegram bot token",
|
|
"telegramTokenHint": "Expected: bot token from @BotFather (format like 123456789:AA...).",
|
|
"telegramTokenConfigured": "Telegram token already configured (enter to replace)",
|
|
"telegramChatIdRequired": "Telegram chat ID is required when notifications are enabled.",
|
|
"telegramTokenRequired": "Telegram bot token is required when notifications are enabled.",
|
|
"notificationsDisabledHint": "Enable Notifications to configure Telegram and notification time.",
|
|
"notificationTypeTaskDue": "Task due reminders",
|
|
"notificationTypeRewardRequest": "Reward requests",
|
|
"notificationTypeAchievementUnlocked": "Achievement unlocked",
|
|
"sendTestNotification": "Send test notification",
|
|
"notificationsSaved": "Notifications settings saved.",
|
|
"notificationsSaveFailed": "Failed to save notifications settings.",
|
|
"notificationsTestSent": "Test notification sent.",
|
|
"notificationsTestFailed": "Failed to send test notification."
|
|
},
|
|
"nav": {
|
|
"home": "Home",
|
|
"rooms": "Rooms",
|
|
"board": "Board",
|
|
"calendar": "Calendar",
|
|
"activity": "Activity",
|
|
"rewards": "Rewards",
|
|
"settings": "Settings",
|
|
"profile": "Profile",
|
|
"tagline": "Level up your home",
|
|
"achievements": "Achievements"
|
|
},
|
|
"app": {
|
|
"roomsConfigured": "rooms configured",
|
|
"calendarSubtitle": "Track your cleaning history",
|
|
"leaderboardTitle": "Leaderboard",
|
|
"leaderboardSubtitle": "Who's keeping the house clean?",
|
|
"historyTitle": "Activity Log",
|
|
"historySubtitle": "All completed tasks",
|
|
"activitySubtitle": "Who did what, when, and for how many points",
|
|
"rewardsSubtitle": "Spend your coins on real-life rewards",
|
|
"profileSubtitle": "Customize your avatar & preferences",
|
|
"settingsSubtitle": "Configure your experience",
|
|
"achievementsSubtitle": "Turn chores into a game with badges and milestones"
|
|
},
|
|
"calendar": {
|
|
"mon": "Mon",
|
|
"tue": "Tue",
|
|
"wed": "Wed",
|
|
"thu": "Thu",
|
|
"fri": "Fri",
|
|
"sat": "Sat",
|
|
"sun": "Sun",
|
|
"choresDone": "Chores done",
|
|
"tasksDue": "Tasks due",
|
|
"today": "Today",
|
|
"upcomingDueDates": "Upcoming Due Dates",
|
|
"inDays": "in {days}d",
|
|
"allCaughtUp": "All caught up! No tasks due soon."
|
|
},
|
|
"leaderboard": {
|
|
"thisWeek": "This Week",
|
|
"thisMonth": "This Month",
|
|
"thisQuarter": "This Quarter",
|
|
"thisYear": "This Year",
|
|
"points": "points",
|
|
"streak": "streak",
|
|
"noData": "No data yet for this period."
|
|
},
|
|
"rewards": {
|
|
"catalog": "Rewards Catalog",
|
|
"balanceHint": "Complete tasks to earn coins, then redeem a reward.",
|
|
"noDescription": "No description",
|
|
"redeem": "Redeem",
|
|
"notEnough": "Not enough coins",
|
|
"myRequests": "My redemption history",
|
|
"noRequests": "No reward redeemed yet.",
|
|
"confirmTitle": "Confirm purchase",
|
|
"confirmText": "Buy \"{reward}\" for {coins} coins?",
|
|
"confirmBuy": "Confirm",
|
|
"cancelRequest": "Cancel",
|
|
"statusPending": "Pending",
|
|
"statusApproved": "Approved",
|
|
"statusRejected": "Rejected",
|
|
"statusCancelled": "Cancelled"
|
|
},
|
|
"rewardsPreset": {
|
|
"movie_night": { "title": "Movie Night Pick", "desc": "Choose tonight's family movie." },
|
|
"ice_cream": { "title": "Ice Cream Treat", "desc": "Get an ice cream or special dessert." },
|
|
"late_bedtime": { "title": "Stay Up 30 Min", "desc": "Go to bed 30 minutes later." },
|
|
"game_bonus": { "title": "Game Time Bonus", "desc": "Get 30 extra minutes of game time." },
|
|
"choose_dinner": { "title": "Choose Dinner", "desc": "Pick what the family eats tonight." },
|
|
"park_adventure": { "title": "Park Adventure", "desc": "Special family park outing." },
|
|
"chore_pass": { "title": "No-Chore Pass", "desc": "Skip one chore this week." },
|
|
"board_game": { "title": "Family Board Game", "desc": "Pick the board game for family night." }
|
|
},
|
|
"history": {
|
|
"task": "Task",
|
|
"room": "Room",
|
|
"when": "When",
|
|
"earned": "Earned",
|
|
"by": "by",
|
|
"noActivity": "No activity yet. Complete a task to get started!",
|
|
"previous": "Previous",
|
|
"next": "Next",
|
|
"of": "of"
|
|
},
|
|
"roomDetail": {
|
|
"name": "Name",
|
|
"notes": "Notes",
|
|
"optionalNotes": "Optional notes...",
|
|
"every": "Every",
|
|
"effort": "Effort",
|
|
"frequency": "Frequency",
|
|
"actions": "Actions",
|
|
"deleteTask": "Delete Task",
|
|
"done": "Done",
|
|
"seasonal": "Seasonal",
|
|
"taskName": "Task name...",
|
|
"addTask": "Add Task"
|
|
},
|
|
"avatars": {
|
|
"cat": "Cat",
|
|
"dog": "Dog",
|
|
"bunny": "Bunny",
|
|
"bear": "Bear",
|
|
"fox": "Fox",
|
|
"owl": "Owl",
|
|
"panda": "Panda",
|
|
"penguin": "Penguin",
|
|
"unicorn": "Unicorn",
|
|
"frog": "Frog",
|
|
"koala": "Koala",
|
|
"hedgehog": "Hedgehog"
|
|
},
|
|
"dashboard": {
|
|
"houseHealth": "House Health",
|
|
"todaysQuests": "Today's Quests",
|
|
"recentActivity": "Recent Activity",
|
|
"noQuests": "No quests for today",
|
|
"roomsCount": "Rooms",
|
|
"tasksCount": "Tasks",
|
|
"criticalCount": "Critical",
|
|
"pending": "pending",
|
|
"sortedUrgency": "Sorted by urgency",
|
|
"dayStreak": "Day Streak",
|
|
"keepStreak": "Complete 1 task daily to keep going!",
|
|
"streakDoneToday": "Streak completed for today!",
|
|
"more": "More",
|
|
"nextTasks": "Next tasks to come",
|
|
"healthGreat": "Looking great! Keep it up.",
|
|
"healthMedium": "Some rooms need a bit of love.",
|
|
"healthLow": "Time for a cleaning session!",
|
|
"myGoal": "My Goal",
|
|
"childrenGoals": "Children Goals",
|
|
"noGoal": "No goal",
|
|
"rewardRequestsTitle": "Reward requests",
|
|
"rewardRequestEmpty": "No pending reward requests.",
|
|
"coinsStatusTitle": "Coins status",
|
|
"approve": "Approve",
|
|
"reject": "Reject"
|
|
},
|
|
"rooms": {
|
|
"addRoom": "Add Room",
|
|
"room": "Room",
|
|
"tasks": "Tasks",
|
|
"health": "Health",
|
|
"healthHealthy": "Healthy",
|
|
"healthNeedsAttention": "Needs attention",
|
|
"healthCritical": "Critical",
|
|
"deleteRoomConfirm": "Delete \"{room}\" and all its tasks? This cannot be undone.",
|
|
"noRoomsYet": "No rooms yet",
|
|
"clickAddRoom": "Click \"Add Room\" to get started!",
|
|
"addRoomTitle": "Add a Room",
|
|
"pickRoomType": "Pick a room type, then configure its tasks.",
|
|
"customNameOptional": "Custom Name (optional)",
|
|
"nextConfigure": "Next: Configure Tasks",
|
|
"configureTasks": "Configure Tasks",
|
|
"configureTasksDesc": "Select tasks, set their current state, effort, and cleaning frequency.",
|
|
"currentState": "Current State",
|
|
"dirty": "Dirty",
|
|
"clean": "Clean",
|
|
"addCustomTask": "Add a custom task...",
|
|
"tasksSelected": "tasks selected",
|
|
"createRoom": "Create Room",
|
|
"roomNotFound": "Room not found.",
|
|
"backToRooms": "Back to Rooms",
|
|
"tasksTracked": "tasks tracked"
|
|
},
|
|
"common": {
|
|
"save": "Save",
|
|
"saved": "Saved",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"edit": "Edit",
|
|
"loading": "Loading",
|
|
"add": "Add"
|
|
},
|
|
"units": {
|
|
"hours": "hours",
|
|
"days": "days",
|
|
"weeks": "weeks",
|
|
"months": "months",
|
|
"years": "years"
|
|
},
|
|
"unitsShort": {
|
|
"hours": "h",
|
|
"days": "d",
|
|
"weeks": "w",
|
|
"months": "mo",
|
|
"years": "y"
|
|
},
|
|
"time": {
|
|
"never": "Never",
|
|
"justNow": "just now",
|
|
"minutesAgo": "{count}m ago",
|
|
"hoursAgo": "{count}h ago",
|
|
"yesterday": "yesterday",
|
|
"daysAgo": "{count}d ago",
|
|
"oneWeekAgo": "1w ago",
|
|
"weeksAgo": "{count}w ago",
|
|
"oneMonthAgo": "1mo ago",
|
|
"monthsAgo": "{count}mo ago"
|
|
},
|
|
"auth": {
|
|
"welcomeBack": "Welcome!",
|
|
"welcome": "Welcome to TidyQuest",
|
|
"createYourAccount": "Create your account",
|
|
"username": "Username",
|
|
"usernamePlaceholder": "Enter your username",
|
|
"password": "Password",
|
|
"passwordPlaceholder": "Enter your password",
|
|
"passwordMinChars": "min 4 characters",
|
|
"displayName": "Display Name",
|
|
"displayNamePlaceholder": "John",
|
|
"avatarColor": "Avatar Color",
|
|
"loggingIn": "Logging in...",
|
|
"logIn": "Log In",
|
|
"createAccount": "Create account",
|
|
"createAccountAction": "Create Account",
|
|
"creating": "Creating...",
|
|
"alreadyHaveAccount": "Already have an account? Log in",
|
|
"allFieldsRequired": "All fields are required",
|
|
"loginFailed": "Login failed",
|
|
"registrationFailed": "Registration failed"
|
|
},
|
|
"achievements": {
|
|
"familyProgress": "Family Progress",
|
|
"firstStep": "First Step",
|
|
"firstStepDesc": "Complete your first chore",
|
|
"helper": "Little Helper",
|
|
"helperDesc": "Complete 10 chores",
|
|
"busyBee": "Busy Bee",
|
|
"busyBeeDesc": "Complete 25 chores",
|
|
"cleaningHero": "Cleaning Hero",
|
|
"cleaningHeroDesc": "Complete 50 chores",
|
|
"choreChampion": "Chore Champion",
|
|
"choreChampionDesc": "Complete 100 chores",
|
|
"legend": "TidyQuest Legend",
|
|
"legendDesc": "Complete 250 chores",
|
|
"unstoppable": "Unstoppable!",
|
|
"unstoppableDesc": "Complete 500 chores",
|
|
"onFire": "On Fire",
|
|
"onFireDesc": "Reach a 3-day streak",
|
|
"streakMaster": "Streak Master",
|
|
"streakMasterDesc": "Reach a 7-day streak",
|
|
"twoWeekWarrior": "Two-Week Warrior",
|
|
"twoWeekWarriorDesc": "Reach a 14-day streak",
|
|
"monthlyMachine": "Monthly Machine",
|
|
"monthlyMachineDesc": "Reach a 30-day streak",
|
|
"centurion": "Centurion",
|
|
"centurionDesc": "Reach a 100-day streak!",
|
|
"piggyBank": "Piggy Bank",
|
|
"piggyBankDesc": "Earn 50 coins",
|
|
"saver": "Saver",
|
|
"saverDesc": "Earn 100 coins",
|
|
"treasureHunter": "Treasure Hunter",
|
|
"treasureHunterDesc": "Earn 500 coins",
|
|
"goldMaster": "Gold Master",
|
|
"goldMasterDesc": "Earn 1,000 coins",
|
|
"millionaire": "Millionaire",
|
|
"millionaireDesc": "Earn 5,000 coins",
|
|
"roomTamer": "Room Tamer",
|
|
"roomTamerDesc": "Keep 3 rooms healthy at the same time",
|
|
"housePride": "House Pride",
|
|
"housePrideDesc": "Keep 5 rooms healthy at the same time",
|
|
"weekendWarrior": "Weekend Warrior",
|
|
"weekendWarriorDesc": "Complete 5 chores in one week",
|
|
"superWeek": "Super Week",
|
|
"superWeekDesc": "Complete 15 chores in one week",
|
|
"perfectWeek": "Perfect Week",
|
|
"perfectWeekDesc": "Complete at least 1 chore every day for a full week",
|
|
"perfectMonth": "Perfect Month",
|
|
"perfectMonthDesc": "Have 4 perfect weeks",
|
|
"nightOwl": "Night Owl Planner",
|
|
"nightOwlDesc": "Reach a 60-day streak"
|
|
}
|
|
}
|
|
}
|