惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
G
Google Developers Blog
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
U
Unit 42
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Securelist
Schneier on Security
Schneier on Security
F
Full Disclosure
P
Proofpoint News Feed
C
Cisco Blogs
J
Java Code Geeks
K
Kaspersky official blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
博客园_首页
博客园 - 聂微东
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
CXSECURITY Database RSS Feed - CXSecurity.com
Project Zero
Project Zero
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
W
WeLiveSecurity
AI
AI
V
V2EX
B
Blog RSS Feed
Google Online Security Blog
Google Online Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
腾讯CDC
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
IT之家
IT之家
Latest news
Latest news
The GitHub Blog
The GitHub Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
爱范儿
爱范儿
Y
Y Combinator Blog
TaoSecurity Blog
TaoSecurity Blog
aimingoo的专栏
aimingoo的专栏
S
Secure Thoughts

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Бесплатное lo-fi радио + живые обои на рабочий стол: собрал десктоп-приложение на Tauri 2 (форк lofi-engine)
SergDai · 2026-06-22 · via Все публикации подряд на Хабре

Средний

4 мин

96

Я хотел одну простую вещь: чтобы на втором мониторе тихо играло lo-fi, а за виджетами крутилась уютная анимированная сцена. Готового решения не нашлось — зато нашёлся чужой MIT-проект, у которого я в итоге выкинул главный модуль и собрал из остатков совсем другой продукт. Это девлог о том, что я удалил, что добавил и на каких граблях потанцевал.

Под задачу подходящих инструментов хватало, но каждый закрывал только часть. Wallpaper Engine — живые обои, но без радио. Lofi.co — музыка в браузере, но не обои рабочего стола. Noisli — эмбиент, но без всего остального. Покупать три подписки ради фона под код было жалко, поэтому я полез на GitHub смотреть, что можно собрать самому.

Нашёл meel-hd/lofi-engine под MIT — аккуратный Tauri-проект со встроенным генеративным движком, который синтезировал lo-fi прямо в браузерном рантайме. Идея красивая, но мне быстро стало понятно, что я хочу совсем другого продукта. Так появился форк, который я в итоге назвал LoFiTyan.

LoFiTyan: lo-fi радио поверх живой сцены

LoFiTyan: lo-fi радио поверх живой сцены

Главный pivot: от генерации музыки к настоящему радио

Первое же серьёзное решение оказалось самым спорным — я полностью удалил генеративный движок. Звучит как вандализм над хорошим кодом, но логика простая. Генеративный lo‑fi — это всегда вариация на тему: приятно как технодемо, но через двадцать минут ухо начинает ловить повторяющиеся паттерны, и фокус ломается. А я хотел именно фон для работы, который не отвлекает.

Поэтому вместо синтеза я подключил настоящее интернет‑радио через открытый каталог
radio-browser.info. Это критичный момент, который я специально подчёркиваю: LoFiTyan не генерирует музыку и не имеет никакого отношения к «ИИ‑музыке» — он играет реальные радиостанции, которые ведут живые люди. Я фильтрую каталог по тегам lo‑fi / chillhop / focus / sleep, отдаю пользователю список станций, избранное и медиа‑клавиши. Получилось сотни станций, нулевой вес рантайма на синтез и живой, не зацикленный контент. Бонусом ушла целая пачка кода: аудио‑генерация — сложная и хрупкая штука, а HTTP‑стрим радио надёжен до тривиальности.

Живые обои: зум и точка кадра

Вторая большая фича, которой в оригинале не было совсем, — живые видео‑обои. Технически это видео или картинка‑сцена на фоне всего UI, и тут вылез неочевидный нюанс.

Живые обои LoFiTyan — анимированная lo-fi сцена на рабочем столе

Живые обои LoFiTyan — анимированная lo-fi сцена на рабочем столе

Человек ставит своё видео — вертикальный портрет с телефона, горизонтальный пейзаж, что угодно — а окно приложения может быть любого размера и пропорций. Если просто растянуть видео, субъект (та самая lo‑fi‑тян) уезжает за край или сплющивается. Поэтому я сделал два параметра: зум и точку кадра. Точка кадра — это якорь, вокруг которого видео центрируется и обрезается, так что важная часть сцены остаётся в кадре и на широком ландшафтном окне, и на узком портретном. Реализовано через object-fit: cover плюс object-position, привязанный к выбранной точке, и масштаб через transform: scale(). Звучит просто, но именно эта пара настроек превращает «случайно обрезанное видео» в «обои, которые сидят ровно за виджетами». В комплект я положил дефолтную сцену «LoFi‑тян, осень», чтобы из коробки сразу было красиво.

Портретный режим

Портретный режим

Настройки

Настройки

Бесшовный эмбиент поверх музыки на Web Audio

Третий слой — эмбиент: дождь, гром, лес, костёр, которые накладываются поверх радио и микшируются свободно. Здесь главная боль — бесшовный цикл. Если просто поставить <audio loop>, на стыке конца и начала файла слышен щелчок или микропауза, и мозг моментально это ловит — особенно на дожде.

Решил через Web Audio API: гружу буфер, использую AudioBufferSourceNode с loop = true и выставляю loopStart / loopEnd по точкам нулевого пересечения, а каждый звук идёт через свой GainNode, так что громкости миксуются независимо от радио. Web Audio здесь не «оверинжиниринг ради хайпа», а ровно тот инструмент, который умеет в честный gapless-loop и параллельные источники без отдельного плеера на каждый звук.

Грабли: откат с Svelte 5

Не всё было гладко. Я начинал на Svelte 5 с новыми рунами ($state, $derived) — выглядело свежо и хотелось пощупать. Но на тот момент экосистема вокруг Tauri и часть зависимостей ещё не дозрели до пятёрки: всплывали странные расхождения в реактивности и проблемы сборки, на отладку которых уходило больше времени, чем на сами фичи.

Вывод сделал прагматичный: я делаю продукт, а не витрину последней версии фреймворка. Откатился на стабильную ветку Svelte, и количество необъяснимых багов резко упало. Урок банальный, но болезненный каждый раз: для пет-проекта, который хочется довести до релиза, бери стек, у которого вся цепочка зависимостей уже стабильна, а не самый свежий мажор.

Почему Tauri 2, а не Electron

Тут без интриги. Приложение, которое висит в фоне весь рабочий день, не имеет права жрать память как полноценный браузер. Tauri 2 даёт системный WebView и Rust-бэкенд, поэтому бандл и потребление памяти кратно меньше Electron-аналога. Для «всегда включённого» фонового софта это решающий аргумент. Фронт остался на привычном Svelte + TypeScript + Vite, а тяжёлое и системное ушло в Rust.

Почему open-source

LoFiTyan — MIT, и это не поза. Во-первых, я сам стою на плечах чужого MIT-кода, и закрывать форк было бы попросту некрасиво. Во-вторых, это десктоп-приложение, которое лезет в сеть и крутит фон у вас на машине — мне кажется честным, когда такой софт можно прочитать целиком. В-третьих, открытый код — лучшая защита от «а вдруг там что-то лишнее»: смотрите, собирайте сами, присылайте патчи.

Честно про статус: это публичная beta. Сборки пока без подписи — на macOS нужно один раз снять карантин (xattr -cr), на Windows поругается SmartScreen. Подпись в процессе, но держать релиз в столе до её получения я не хотел.

Итог

Получился лёгкий кроссплатформенный (Windows / macOS / Linux) десктоп: настоящее lo-fi радио, живые видео-обои с зумом и точкой кадра, эмбиент-микшер на Web Audio, авто-скрытие управления, полноэкранный режим, медиа-клавиши, избранные станции, 7 языков интерфейса. Позиционирую как бесплатную open-source альтернативу связке Wallpaper Engine + Lofi.co + Noisli.

Код, релизы под три ОС и issue-трекер: https://github.com/Victory-SergD/SergD_LoFiTyan (готовые сборки — на вкладке Releases: https://github.com/Victory-SergD/SergD_LoFiTyan/releases).

Буду рад технической критике — особенно по реализации бесшовного цикла и по UX точки кадра, тут наверняка можно сделать умнее. Если решали похожую задачу с gapless-loop или с кадрированием произвольного видео под произвольное окно — расскажите в комментариях, как у вас. Разбор архитектуры тоже приветствуется, отвечаю.