~ 15 минут
Минималистичный трекер привычек на Node.js — CLI-приложение за 30 минут
10
5/11/2025
Создайте трекер привычек в терминале с помощью Node.js, inquirer и chalk. Удобное CLI-приложение с локальным хранением и цветным выводом.


Иногда хочется сделать что-то полезное и минималистичное. И вот прекрасный пример для тех кто, хочет отслеживать полезные привычки, но не хочет использовать перегруженные приложения или регистрироваться на новых платформах. В этом материале я покажу, как за полчаса или один вечер создать суперминималистичный трекер привычек прямо в терминале с помощью Node.js.
Зачем такой трекер?
Иногда абсолютно нужен какой-то красивый интерфейс, интеграция с календарём и облаком. Иногда хочется просто быстро открыть терминал, нажать пару клавиш и зафиксировать выполнение привычки.
Такой подход:
- Работает оффлайн
- Не требует регистрации
- Хранит данные в локальном JSON
- Позволяет сосредоточиться на привычках, а не на интерфейсе.
Какие технологии мы будем использовать:
Для создания этого CLI-приложения понадобятся:
- inquirer - позволяет создавать диалоги и выбор параметров прямо в терминале
- chalk - позволяет сделать цветной вывод в консоль
- dayjs - удобная библиотека для работы с датами
- fs - встроенный в Node.js пакет для работы с файлами
Для начала работы установите зависимости:
npm init -y npm install inquirer chalk dayjs
Как работает приложение?
Каждый раз при запуске пользователь выбирает, что он хочет сделать:
➕ Добавить новую привычку ✅ Отметить, что сегодня она выполнена 📊 Посмотреть прогресс за 7 дней 🚪 Выйти
Привычки и история хранятся в обычном .json-файле в той же директории.
Полный код tracker.js
Как написать этот код я сделал видео в Youtube. После выхода видео я немного подправил код, чтобы было приятнее с ним работать.
const fs = require('fs') const inquirer = require('inquirer') const chalk = require('chalk') const dayjs = require('dayjs') const FILE = 'habits.json' function load() { if (!fs.existsSync(FILE)) return [] return JSON.parse(fs.readFileSync(FILE, 'utf8')) } function save(data) { fs.writeFileSync(FILE, JSON.stringify(data, null, 2)) } const today = dayjs().format('YYYY-MM-DD') async function main() { let habits = load() const { action } = await inquirer.prompt({ name: 'action', type: 'list', message: 'Что делаем?', choices: ['➕ Добавить привычку', '✅ Отметить выполнение', '📊 Посмотреть прогресс', '🚪 Выход'] }) if (action === '➕ Добавить привычку') { const { name } = await inquirer.prompt({ name: 'name', message: 'Название привычки:' }) habits.push({ name, history: [] }) save(habits) console.log(chalk.green('Привычка добавлена.')) } if (action === '✅ Отметить выполнение') { if (!habits.length) return console.log(chalk.yellow('Нет привычек.')) const { name } = await inquirer.prompt({ name: 'name', type: 'list', message: 'Какая привычка?', choices: habits.map(h => h.name) }) const habit = habits.find(h => h.name === name) if (!habit.history.includes(today)) { habit.history.push(today) save(habits) console.log(chalk.green('Отмечено на сегодня.')) } else { console.log(chalk.cyan('Уже отмечено.')) } } if (action === '📊 Посмотреть прогресс') { if (!habits.length) return console.log(chalk.yellow('Нет привычек.')) console.log('\n' + chalk.bold('Прогресс за 7 дней:\n')) const now = dayjs() for (const h of habits) { const line = [chalk.bold(h.name.padEnd(12))] for (let i = 6; i >= 0; i--) { const d = now.subtract(i, 'day').format('YYYY-MM-DD') line.push(h.history.includes(d) ? chalk.green('✅') : chalk.red('—')) } console.log(line.join(' ')) } console.log() } } main()
Пример выполнения скрипта в терминале
? Что делаем? ❯ ✅ Отметить выполнение ? Какая привычка? ❯ Утренняя зарядка Отмечено на сегодня. ? Что делаем? ❯ 📊 Посмотреть прогресс Прогресс за 7 дней: Утренняя зарядка ✅ ✅ — — ✅ — ✅
Что можно улучшить
Если хочется развивать проект дальше, вот несколько идей:
- Сделайте сохранение данных в SQLite (через better-sqlite3 например)
- Добавьте поддержку нескольких пользователей
- Сделайте напоминания (например, через node-notifier)
- Интегрируйте командные флаги (node tracker.js --mark "Зарядка")
- Синхронизация с облаком через Telegram-бота.
Заключение
Такой микропроект — отличный способ прокачать навыки работы с JavaScript/Node.js и начать делать что-то практичное. Он не требует больших знаний, но даёт результат, которым можно реально пользоваться каждый день.
📺 Видео, где я пишу этот код с нуля — ссылка на YouTube-видео.
Если вы хотите больше таких практичных проектов — подписывайтесь на канал «Электронный кочевник» и следите за обновлениями.
Взгляните на наш стартап:

Выбирай экскурсии и активности по всему миру
Уже зарегистрировано 0 стран, 0 направлений, 0 экскурсий
Есть интересная идея?
И вы очень хотите ее реализовать, пишите нам и получите подробное коммерческое предложение и быструю реализацию