Каждый раз, когда нужно перекинуть файл, код или ссылку с ПК на телефон (или другу в той же Wi‑Fi сети), начинается классическая возня. Либо гоняешь через «Избранное» в мессенджерах (где режется качество и файлы вечно висят в облаке), либо поднимаешь локальные веб‑серверы через консоль. Мне это надоело, и я решил написать свою утилиту — FlashStash.

Основная идея: софт должен запускаться в один клик, работать без интернета внутри локалки, иметь всеядный предпросмотр файлов прямо в браузере и не требовать от пользователя установки Питона или настройки окружения.

После нескольких итераций проект дорос до версии 1.6, и я хочу поделиться тем, как устроена утилита изнутри и с какими техническими проблемами пришлось столкнуться.

Что под капотом и как это работает

Бэкенд написан на Python + Flask, а фронтенд работает на чистом JS. Процесс использования максимально упрощен:

  1. Запускается один исполняемый файл FlashStash.exe.

  2. Программа сама определяет локальный IP‑адрес компьютера, поднимает сервер и автоматически открывает веб‑интерфейс в браузере хоста.

  3. Чтобы подключить смартфон или другой ПК к общему пространству, нужно просто ввести в адресную строку браузера IP‑адрес, который отображается в консоли сервера.

  4. При этом для каждого загруженного файла в интерфейсе генерируется отдельный QR‑код — это позволяет мгновенно скачивать конкретные файлы на телефон через камеру, не вбивая ссылки вручную.

Проект собран как Zero‑Dependency Portable Build. Внутри архива лежит скомпилированный .exe файл со своей иконкой и встроенное портативное ядро Python. То есть утилиту можно закинуть на абсолютно «голую» Windows (желательно прямо на Рабочий стол), кликнуть, и всё сразу заведётся.

Как развивался проект: от костылей к нормальной архитектуре

В процессе разработки вылезло несколько неочевидных проблем, которые пришлось оперативно закрывать.

1. Борьба с «одноразовой» безопасностью

Изначально я добавил функцию защиты файлов паролями при загрузке. Но в первых версиях все пароли хранились в обычном Python‑словаре в оперативной памяти. Стоило перезапустить сервер, как словарь очищался, файлы оставались в папке, но скачать их мог любой желающий без всякого пароля.

В версии 1.6 я переписал эту логику. Теперь все хэндлы, пароли файлов и история текстового буфера обмена намертво пишутся в локальные JSON‑файлы. Данные идеально выдерживают перезапуск сервера и не нагружают систему лишними тяжелыми СУБД.

2. Закрытие уязвимости Path Traversal

Когда пишешь локальный веб‑сервер для обмена файлами, легко забыть про базовую безопасность путей. В первых билдах бэкенд принимал имя файла из адресной строки практически «как есть».

Продвинутый пользователь в локальной сети мог провернуть атаку Path Traversal, отправив запрос вида ../, выйти за пределы папки обмена и стянуть системные файлы с хост‑машины. Чтобы это исправить, я внедрил жесткую фильтрацию и санитаризацию входных путей через os.path.basename. Теперь бэкенд отсекает любые попытки побега из папки shared_files.

3. Всеядный предпросмотр (All‑in‑One)

Мне не хотелось, чтобы пользователь скачивал файл только ради того, чтобы узнать, что внутри. Поэтому фронтенд получил встроенные плееры для аудио и видео, просмотрщик картинок и текстовых документов. Из интересного — добавил просмотрщик архивов: структура файлов внутри .zip и .rar отображается прямо на веб‑странице до скачивания самого архива.

Наведение порядка: Wipe_All_Data

Поскольку Питон при работе создаёт скрытый кэш (__pycache__), а папка shared_files постепенно забивается реальными файлами, перед заливкой проекта на GitHub или передачей папки другу её нужно как‑то чистить. Сам запущенный Питон свои процессы и кэш удалить не может (Windows выдаёт Access Denied).

Для этого я написал отдельный служебный батник Wipe_All_Data.bat на английском (чтобы кодовая база репозитория выглядела аккуратно). Он делает три вещи:

  1. Жестко тушит активные процессы сервера через taskkill.

  2. Под ноль вычищает папки с файлами, паролями и текстами.

  3. Сканирует дерево директорий и сносит весь кэш компилятора Питона, сжимая вес папки до исходного минимума.

Итоги

Проект получился именно таким, каким я хотел его видеть в повседневной жизни — легким, быстрым и независимым. Исходный код полностью открыт, пощупать портативный билд v1.6 и оценить реализацию можно на гитхабе.

? https://github.com/arxbyte/FlashStash/releases/tag/v1.6

Буду рад конструктивной критике в комментариях. Пишите, каких фич вам не хватает в локальных файлообменниках и как бы вы улучшили текущую архитектуру.

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


  1. PumPumGum
    09.06.2026 16:33

    Вот и выросло поколение не слышавшее про FTP сервера.


    1. hurtavy
      09.06.2026 16:33

      и про самбу


  1. EmmGold
    09.06.2026 16:33

    Кидаю тоталкоммандером по scp, sftp. Кучу плагинов поддерживает. Может сам стать файлопомойкой и принимать wifi клиентов. Удобно.


  1. K0styan
    09.06.2026 16:33

    Для подобных дел пользуюсь LocalSend. Open source + кроссплатформенность очень радуют. Но предпросмотра нет, факт.