Каждый раз, когда я начинаю новый проект, происходит один и тот же ритуал: создать папку app, в ней api, services, utils, накидать main.py, requirements.txt, .gitignore, README... И так по кругу. Десятки раз.

В какой-то момент я понял, что трачу на это реально ощутимое время — и написал crt: консольную утилиту, которая умеет:

  • создавать файлы — любое количество, одной командой;

  • создавать папки — в том числе вложенные структуры любой глубины;

  • создавать целые проекты по шаблонам — как встроенным, так и своим;

Хочу рассказать, что получилось.

Идея простая: одна строка — целая структура

Вместо того чтобы кликать "New Folder" пятнадцать раз подряд, вы пишете что-то вроде:

crt "app<base.py:control.py>:backends<database<models.py>:base.py>"

И получаете:

your_folder/
│
├── app/
│   ├── base.py
│   └── control.py
│
└── backends/
    ├── database/
    │   └── models.py
    └── base.py

Синтаксис минималистичный:

  • : — разделитель файлов и папок в списке;

  • <> — обозначение папки, внутрь которой можно вложить что угодно, хоть ещё папки.

То есть вся файловая структура описывается одной строкой, без единого клика мышкой.

Быстрое создание файлов с расширениями

Если нужно просто накидать пачку файлов — необязательно повторять расширение для каждого:

crt main:test py
your_folder/
│
├── main.py
└── test.py

Удобно, когда создаёшь сразу несколько однотипных файлов.

А если это не разовая задача, а рутина? Шаблоны

Вот тут начинается самое интересное. crt умеет не просто создавать файлы, а разворачивать целые проекты по шаблонам — как своим, так и встроенным.

Посмотреть, что уже есть под рукой:

crt -v

--->

Available templates:
 Default:
  • postgres (12 files)
  • fastapi (24 files)
  • react (71 files)
  • tg_bot (19 files)
  • tg_bot_full (96 files)
  • gitignore (py, js, java, c, c++, go, c#)

Применить шаблон — одна команда:

crt -t fastapi -f

Флаг -f означает, что файлы будут не пустыми файлами, а сразу с заполненным базовым содержимым — рабочий скелет проекта, готовый к правке, а не куча пустых файлов, которые ещё предстоит наполнять.

результат выполнения команды
результат выполнения команды

Шаблоны можно не только использовать, но и создавать из своих же проектов. Понравилась структура вашего FastAPI или связки Telegram-бота? Превратите её в шаблон одной командой:

crt -t my_template -a -p my_project

Флаг -a означает append, что шаблон нужно добавить, а флаг -p означает path - путь где храниться проект, можно не указывать тогда crt возьмёт текущую директорию, где открыт терминал.

Дальше этот шаблон можно переименовать:

crt -t my_template -rn my_temp

Или удалить, если он больше не нужен:

crt -t my_template -rm

Игнорирование лишнего через .crtignore

Если в шаблоне есть файлы и папки, которые тащить не нужно (виртуальные окружения, кэши, логи), можно завести .crtignore в корне проекта — по аналогии с .gitignore:

__pycache__
.venv
venv
.git
.env
.DS_Store
Thumbs.db
.crtignore

.gitignore одной командой

Отдельная приятная мелочь — генерация .gitignore под конкретный стек:

crt -t gitignore py
crt -t gitignore js
crt -t gitignore go

Поддерживаются Python, JavaScript/Node.js, Java, C, C++, C# и Go. Мелочь, а неприятную рутину закрывает полностью.

Установка

Всё как обычно:

pip install crtfiles

И сразу можно пользоваться — никакой дополнительной настройки не требуется.

Ссылки на проект:

Кому это может пригодиться

  • Тем, кто часто запускает новые проекты и устал вручную копировать структуру папок и файлы.

  • Тем, у кого есть своя «коронная» архитектура, и кто хочет разворачивать её одной командой.

Что дальше

Я продолжаю дорабатывать инструмент и открыт к любым идеям и репортам о багах.

Также в планах — возможность развернуть свой сервер, куда можно будет загружать собственные шаблоны проектов и скачивать шаблоны, которые выложили другие пользователи.

Отдельно: если у вас есть качественный шаблон проекта, которым не жалко поделиться, — с радостью добавлю его в список встроенных. Просто пришлите ссылку на GitHub.

Комментарии (2)


  1. clearmodern
    05.08.2026 06:51

    Бро, а не пробовал просто агента попросить заинитить проект?


  1. danilovmy
    05.08.2026 06:51

    Эээ. Без pip: Github project Template. С pip: Django start-project - - template project