Каждый раз, когда нужно перекинуть файл, код или ссылку с ПК на телефон (или другу в той же Wi‑Fi сети), начинается классическая возня. Либо гоняешь через «Избранное» в мессенджерах (где режется качество и файлы вечно висят в облаке), либо поднимаешь локальные веб‑серверы через консоль. Мне это надоело, и я решил написать свою утилиту — FlashStash.
Основная идея: софт должен запускаться в один клик, работать без интернета внутри локалки, иметь всеядный предпросмотр файлов прямо в браузере и не требовать от пользователя установки Питона или настройки окружения.
После нескольких итераций проект дорос до версии 1.6, и я хочу поделиться тем, как устроена утилита изнутри и с какими техническими проблемами пришлось столкнуться.
Что под капотом и как это работает
Бэкенд написан на Python + Flask, а фронтенд работает на чистом JS. Процесс использования максимально упрощен:
Запускается один исполняемый файл
FlashStash.exe.Программа сама определяет локальный IP‑адрес компьютера, поднимает сервер и автоматически открывает веб‑интерфейс в браузере хоста.
Чтобы подключить смартфон или другой ПК к общему пространству, нужно просто ввести в адресную строку браузера IP‑адрес, который отображается в консоли сервера.
При этом для каждого загруженного файла в интерфейсе генерируется отдельный 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 на английском (чтобы кодовая база репозитория выглядела аккуратно). Он делает три вещи:
Жестко тушит активные процессы сервера через
taskkill.Под ноль вычищает папки с файлами, паролями и текстами.
Сканирует дерево директорий и сносит весь кэш компилятора Питона, сжимая вес папки до исходного минимума.
Итоги
Проект получился именно таким, каким я хотел его видеть в повседневной жизни — легким, быстрым и независимым. Исходный код полностью открыт, пощупать портативный билд v1.6 и оценить реализацию можно на гитхабе.
? https://github.com/arxbyte/FlashStash/releases/tag/v1.6
Буду рад конструктивной критике в комментариях. Пишите, каких фич вам не хватает в локальных файлообменниках и как бы вы улучшили текущую архитектуру.
Комментарии (16)

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

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

lazarus_net
09.06.2026 16:33а ещё есть такая штука как antidote - Tox клиент. https://en.wikipedia.org/wiki/Tox_(protocol)
Прекрасно находит других клиентов в локалке и позволяет легко гонять файлы.

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

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

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

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

Shaman_RSHU
09.06.2026 16:33Поставил Syncthing на ArchLinux, MacOS и OpenWRT и горя не знаю (и кстати DLP на рабочем ПК тоже ничего не знает :)
PumPumGum
Вот и выросло поколение не слышавшее про FTP сервера.
hurtavy
и про самбу
A-Dobrii
В чем смысл вашего комментария?
BugM
В том что задача «перекинуть файл по локальной сети» уже решена примерно 30 лет назад. И решена гораздо лучше чем сможет сделать автор.
KEugene
В велосипедостроении.