Назад в блог

~ 15 минут

Минималистичный трекер привычек на Node.js — CLI-приложение за 30 минут

10

5/11/2025

Создайте трекер привычек в терминале с помощью Node.js, inquirer и chalk. Удобное CLI-приложение с локальным хранением и цветным выводом.

Вадим Пашаев

Вадим Пашаев

Инженер, веб-разработчик, путешественник

Трекер привычек на Node.js — простое CLI-приложение за 30 минут
Установка Strapi под ключ
Регистрация товарных знаков
Craftum - создайте сайт за 15 минут
Домены, хостинг от reg.ru

Иногда хочется сделать что-то полезное и минималистичное. И вот прекрасный пример для тех кто, хочет отслеживать полезные привычки, но не хочет использовать перегруженные приложения или регистрироваться на новых платформах. В этом материале я покажу, как за полчаса или один вечер создать суперминималистичный трекер привычек прямо в терминале с помощью 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-видео.

Если вы хотите больше таких практичных проектов — подписывайтесь на канал «Электронный кочевник» и следите за обновлениями.

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Подписаться на рассылку

Получите лучшие новости по веб-разработке и AI

Оценка проекта

Готовы к реализации вашего проекта?

Vadim Pashaev - Professional Web-Developer

Заполните форму справа, и я лично помогу найти для вас оптимальное решение вашей идеи или задачи.

Есть интересная идея?

И вы очень хотите ее реализовать, пишите нам и получите подробное коммерческое предложение и быструю реализацию