Каждый раз, когда нужно перекинуть файл, код или ссылку с ПК на телефон (или другу в той же 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

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

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


  1. PumPumGum
    09.06.2026 16:33

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


    1. hurtavy
      09.06.2026 16:33

      и про самбу


    1. A-Dobrii
      09.06.2026 16:33

      В чем смысл вашего комментария?


      1. BugM
        09.06.2026 16:33

        В том что задача «перекинуть файл по локальной сети» уже решена примерно 30 лет назад. И решена гораздо лучше чем сможет сделать автор.


      1. KEugene
        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 + кроссплатформенность очень радуют. Но предпросмотра нет, факт.


  1. lazarus_net
    09.06.2026 16:33

    а ещё есть такая штука как antidote - Tox клиент. https://en.wikipedia.org/wiki/Tox_(protocol)

    Прекрасно находит других клиентов в локалке и позволяет легко гонять файлы.


  1. anonym0use
    09.06.2026 16:33

    Можно было просто взять LocalSend но для профилактики деменции можно и самому поизобретать


  1. l0gan
    09.06.2026 16:33

    HFS ~ HTTP File Server
    самый топ имхо


  1. foxmen
    09.06.2026 16:33

    Звучит как придуманная проблема: хром передаёт ссылки между устройствами, куча облачных сервисов для файлов(ГД, ЯД, etc.), в экосистеме Apple вообще не задумываешься о таких вещах. Большинство современных домашних роутеров умеют WebDAV и FTP. Или вы к третьей мировой готовитесь?


    1. NutsUnderline
      09.06.2026 16:33

      да


  1. NutsUnderline
    09.06.2026 16:33

    Очень удобно для этого флешкой с type-c теперь оно уже и для яблок работает


  1. Mixael_sas
    09.06.2026 16:33

    Какой же интернет стал токсичный — "а вот это лучше", "а ещё вот это"... Проверить не смог, Windows Defender ругается.


  1. Shaman_RSHU
    09.06.2026 16:33

    Поставил Syncthing на ArchLinux, MacOS и OpenWRT и горя не знаю (и кстати DLP на рабочем ПК тоже ничего не знает :)


  1. KEugene
    09.06.2026 16:33

    Если файл exe, то винда. Просто расшарить папку в сеть религия не позволяет?