Назад до девблогу Інженерне оновлення

Оновлення за липень 2026: стабільніший Desk і розумніша клавіатура на підході

Цього місяця — три речі: виправна збірка SharkTTY Desk, яку можна завантажити вже сьогодні; чесний огляд того, що робиться для застосунку на iPhone та iPad (робиться — нічого з цього ще не випущено); і звіт про стан експериментального транспорту термінала. Тут — інженерна версія подій; стислі нотатки для користувачів живуть у розділі Що нового.

SharkTTY Desk 0.8.0 — збірка від 10 липня (уже доступна)

Це збірка-продовження минулотижневого випуску 0.8.0, версія та сама — 0.8.0. Завантажити тут.

Вада «Зупинити спільний доступ»

На цю ваду ми натрапили самі, у щоденній роботі. Поки ваш екран переглядають, macOS показує в рядку меню власний індикатор із власною кнопкою «Зупинити спільний доступ». Завершення сеансу звідти — а не зсередини SharkTTY — могло заклинити Desk: QR-код зникав, служба вдавала, що запускається, і кожна спроба повторного з'єднання провалювалася — аж до виходу з застосунку та повторного запуску. Вимкнути й увімкнути віддалене керування теж не допомагало. Це найгірший різновид збою: не аварія, про яку можна повідомити, а служба, що тихо перестала нею бути.

Що відбувалося насправді: після завершення сеансу агент перебудовує мережевий слухач для наступного з'єднання, і ця перебудова має отримати назад той самий локальний порт. Але звільнення порту старого слухача було лише побічним ефектом внутрішнього прибирання, час якого залежав від того, як саме завершився сеанс — і на цьому конкретному шляху прибирання могло сильно відставати від перебудови або не завершуватися взагалі. Перебудова пробувала прив'язатися, бачила, що порт досі зайнятий, здавалася після вікна повторів, яке виявилося коротшим за прибирання, і залишала агента взагалі без слухача. Зовні це виглядало як вічне «запускається».

Виправлення перетворює цю передачу з випадковості на контракт: вимкнення тепер звільняє порт явно й підтверджує звільнення, перш ніж перебудові дозволено продовжити; сама повторна прив'язка стала терплячішою і логує кожну спробу, тож майбутній звіт можна діагностувати прямо з Консолі. Урок, який ми забираємо з собою: демонтаж заслуговує на такий самий детермінізм, як і запуск. «Порт колись сам звільниться» — це не контракт.

Показ ключа з'єднання

Три менші виправлення показу ключа з'єднання на Mac — усі стосуються лише відображення: у тому, як ключ генерується й захищається, не змінилося нічого. Прихований ключ тепер показує заповнювач фіксованої довжини замість крапки на кожен символ — маска більше не натякає на довжину. Дуже довгі власні ключі зменшуються, щоб уміститися в один рядок, а не вилазити за межі картки (винним виявився міжлітерний інтервал, що не зменшувався разом зі шрифтом). А ще Desk запам'ятовує між запусками, що ви обрали приховати ключ — приховування не повинно бути ранковою рутиною. Для показу, як і раніше, потрібні Touch ID або пароль.

Сумісність без змін: ця збірка працює зі SharkTTY 1.6 або новішим на iPhone та iPad. Якщо ваш застосунок старіший, збірка SharkTTY Desk 0.5.0 досі доступна.

SharkTTY для iPhone та iPad — у розробці

Одразу чесно: ніщо з цього розділу ще не випущено. Це те, що вже працює в наших розробницьких збірках і прямує до наступного оновлення в App Store — ми воліємо розповісти, на якому все етапі, ніж мовчати до самого запуску.

Плавуча клавіатура, друга дія

Плавуча клавіатура починає другу дію. Розкладок стає шість замість однієї — US, UK ISO, японська JIS, французька AZERTY, німецька QWERTZ, іспанська ISO — і це справжні розкладки, а не переклеєні ковпачки: європейські мають повноцінний третій рівень AltGr (термінал без | { } [ ] \ — не термінал), ISO-розкладки отримують свою додаткову клавішу біля лівого Shift, а ряд fn→F1–F12 мапиться за фізичною позицією для кожної розкладки окремо. Ми написали тест, що обходить кожну розкладку й доводить досяжність кожного критичного для термінала символа — під час розробки він упіймав дві відсутні клавіші, і саме таким соромом тест і має вміти дошкуляти. Перемикання між плавучою клавіатурою, панеллю голосу та системною клавіатурою тепер живе в поповері налаштувань самої клавіатури — там, де йому й належало бути від початку.

Над клавішами з'являється нова стрічка кандидатів: доповнення береться з того, що нещодавно надрукував ваш термінал, зі слів, набраних у цьому сеансі, та з короткого списку поширених команд оболонки. Усе обчислюється на пристрої, з тексту, який ваш екран і так показує — ніщо нікуди не надсилається заради підказки. Кнопка мікрофона на клавіатурі отримує диктування «натисни й говори» з живим попереднім переглядом у тій самій стрічці, а результат вставляється лише тоді, коли ви його торкнетеся. Остання деталь — свідома: термінал не пробачає недочутих слів, тож голос ніколи не йде в оболонку напряму.

Панель голосового введення

Панель голосу переймає віконні манери, які плавуча клавіатура вже має: її можна переміщати, змінювати розмір і знижувати непрозорість, поки крізь неї не читатиметься оболонка. Один набір керувань, дві панелі, жодних сюрпризів.

Вкладки віддаленого стола, що переживають розрив

Виправлення узгодженості, яке давно напрошувалося: від'єднання сеансу віддаленого стола закривало його вкладку, тоді як від'єднання SSH-сеансу залишало вкладку з кнопкою повторного з'єднання. Один застосунок — дві філософії. Тепер вкладки Desk поводяться як вкладки SSH: від'єднання зберігає вкладку, повторне з'єднання — один дотик, а закриття вкладки відбувається лише на самій вкладці.

Надійність синхронізації

Найменш помітна робота місяця — і, мабуть, найважливіша. Ваші збережені хости, скрипти й налаштування синхронізуються між пристроями, а під час будь-якого розгортання ваші пристрої тижнями працюють на суміші версій — це не крайній випадок, це нормальний стан світу довкола кожного випуску. Ми переробили обробку формату синхронізації так, щоб дані, записані новішою версією, проходили крізь старішу неушкодженими: старий застосунок зберігає те, чого не розуміє, і записує це назад дослівно — замість давитися чи тихо сплющувати до знайомої форми. Правило, якого ми тепер тримаємося, просте: старий застосунок ніколи не повинен мати змоги знищити те, що записав новіший. Цю функцію ви ніколи не побачите — у цьому й сенс.

Експериментально: транспорт Eternal Terminal

SharkTTY розмовляє SSH і Mosh. Mosh — це те, завдяки чому термінал переживає залізничний тунель, але він працює поверх UDP, а деякі мережі UDP просто не пропускають. Eternal Terminal розв'язує ту саму задачу поверх звичайного TCP, і чимало людей уже тримають etserver на своїх машинах. Наша позиція проста: якщо ви вже адмініструєте сервер, який це розв'язує, вам не повинна бути потрібна наша інфраструктура, щоб цим скористатися — застосунок має заговорити мовою вашого сервера.

Тож ми з нуля написали Rust-клієнт відкритого протоколу ET, і тепер він проходить повний шлях проти справжнього etserver: під'єднатися, друкувати, розірвати канал посеред потоку, перепід'єднатися — і нічого не втратити. Поки що він сидить за експериментальним перемикачем, набираючи реального пробігу; щойно набере — з'явиться як третій транспорт на вибір для кожного хоста, поруч зі SSH і Mosh. Якщо ви вже сьогодні тримаєте etserver і хочете допомогти обкатати, коли перемикач відкриється — стежте за цим блогом.

Запитання чи звіти про вади щодо будь-чого з наведеного? Найшвидший шлях — дошка відгуків.