$ grep -r Tag: «macos»

-rw-r--r-- 7.0K May 19, 2026 · CE824A9 · ~5 min

Swift Adwaita: from 1.2.0 to 1.3.1

swift libadwaita open source swift package linux macos

After the 1.1.0 release, the swift-adwaita library has shipped seven releases in a row. As I keep working on the first real application built with this wrapper, things keep surfacing that synthetic tests never catch — and almost every fix in this cycle came from there. The headline story: swift-adwaita now builds and runs on macOS, and along the way I stepped on a beautiful set of rakes involving Swift Concurrency inside the GLib main-loop, and carefully stepped back off.

Swift Adwaita

The story of a bug: async that never runs

In 1.2.0 I collapsed all dialogs (FileDialog, ColorDialog, FontDialog) onto async throws and dropped the callback variants — felt cleaner that way. A day later it turned out that inside a running GTK application (g_application_run), code like Task { @MainActor in await dialog.open(...) } simply never executes. Swift's default main-actor executor is DispatchQueue.main, and the GLib main-loop doesn't drive it. The process looks alive, no errors surface, the button clicks — but the file dialog never appears.

1.2.1 urgently restored the callback variants for FileDialog, and 1.2.2 closed the hole completely: callback overloads were added for every async API (Clipboard, ColorDialog, FontDialog, UriLauncher, Texture.load). The async variants stay — they're useful for tests and non-GTK contexts — but inside GTK signal handlers the callback form is now the recommended default. The long-term fix (a custom SerialExecutor on top of GLib) is deferred as a separate task.

1.2.0: what landed in the API

  • Async image loading. Texture.load(from:) decodes anything GdkPixbuf supports — PNG, JPEG, GIF, WebP, TIFF, BMP — off the main actor. That's a superset of what the native gdk_texture_new_from_filename handles.
  • Animated image playback. AnimatedImagePlayer drives frames from a GdkPixbufAnimation into a Picture widget, with start / stop / advanceFrame.
  • Application.onOpen and Application.run(arguments:) — file-open activation for apps registered with the G_APPLICATION_HANDLES_OPEN flag.
  • Runtime widget type checks. Widget.gtkType, isInstance(of:), and a stricter tryCast that now actually narrows the type instead of "successfully" casting any widget to anything.
  • Isolated deinits on GObjectRef, GVariant and other wrappers — GObject release now always happens explicitly on the main actor, not on whichever random thread dropped the last reference.
  • Minimum toolchain bumped to Swift 6.2 — isolated deinit is experimental in 6.1, and the release toolchain refused to enable it.

1.2.3–1.2.5: conveniences and clipboard

Three small releases about reaching for CAdwaita less often for routine things:

  • RGBA(hex:) — CSS color parsing: #RGB, #RGBA, #RRGGBB, #RRGGBBAA.
  • IconTheme — a wrapper around gtk_icon_theme_get_for_display with addSearchPath(_:) for app-local icons.
  • ApplicationFlags as an OptionSet: Application(id: "...", flags: [.handlesOpen, .nonUnique]) instead of raw bit masks.
  • MainContext.drainPending() and pump(for:) — one-line replacements for the while g_main_context_pending { g_main_context_iteration } loop that every test suite kept reinventing.
  • Paste interception. Widget.onPasteClipboard, the synchronous Clipboard.containsImage / containsFiles probes, async readTexture / readFiles, and Texture.encodedPNGData() — you can now intercept a pasted image in your editor and pipe it through your own import path, instead of letting GTK shove it in as text.
  • Silencing GTK-CRITICAL spam from GtkScrolledWindow and misconfigured GtkDropTarget — an opt-in log filter plus the correct signatures for the ::enter / ::motion signals.

1.3.0: macOS as a development platform

The main news of the cycle. swift-adwaita now builds and runs on macOS 13+ on Apple Silicon. Linux remains the primary target platform, but you can now develop and test locally on a Mac without spinning up a VM.

  • Install via Homebrew: brew install libadwaita gtksourceview5 pkgconf adwaita-icon-theme. Without adwaita-icon-theme, HeaderBar buttons and banners render empty — Homebrew doesn't pull it in transitively.
  • Required environment variable: XDG_DATA_DIRS=/opt/homebrew/share, otherwise libadwaita can't find its GSettings schemas and aborts at startup.
  • DemoAppLib — all 78 gallery examples now live in a separate library that downstream apps can link against directly. The DemoApp executable became a three-line shim.
  • Xcode example in examples/macos/DemoApp/ — a minimal Xcode 16+ project that wraps the gallery as a regular .app bundle. Cmd+R, and it works.
  • A parallel XCTest suite for macOS. swift-testing on Apple platforms inserts autorelease-pool transitions between tests that conflict with the Cocoa CFRunLoop sources installed by gtk_init — everything aborts on the second test. XCTest doesn't do that, and the same coverage runs there. Linux keeps using swift-testing. Result: 1181 tests / 0 failures on macOS.
  • Three Apple-specific bugs that Linux/glibc happened to mask: Variant.stringValue returned nil for valid strings (a dangling pointer through g_variant_type_checked_); the localization helpers (localized, nlocalized) returned garbage when no translation was available (gettext returns the input pointer untouched, and the Swift→C bridge had already freed it); MediaStream.timestamp failed to compile because gint64 is long on Linux x86_64 but long long on Apple arm64.
  • macOS CI job on macos-26 with Xcode 26.4.1 (Swift 6.3). Build only, no test runs: GitHub-hosted runners are headless, and GTK4-Quartz crashes without a WindowServer session.
  • REUSE 3.3 license metadata — SPDX headers in every source file, reuse lint reports clean.

1.3.1: cleanup

A maintenance release with no API changes. I polished the paste-interception docs in the README, added adwaita-icon-theme to every macOS install snippet (stepped on it, wrote it down), and bumped the Xcode example's deployment target to macOS 26 so it matches what Homebrew now builds GTK4 against — otherwise the linker complains about every dylib.

What's next

The big unsolved problem is still the Swift Concurrency ↔ GLib main-loop integration. Right now you can't write Task { @MainActor in ... } from a click handler in a GTK app, and that's frustrating. The long-term plan is a custom SerialExecutor that routes work through g_idle_add_full instead of DispatchQueue.main. The callback APIs cover every practical scenario today, but a proper executor will need to be written eventually.

The project is open source under the MIT license. The source lives on GitHub, and the documentation with guides is here.

Star Fork

[↵] open page swift-adwaita-from-1-2-0-to-1-3-1.md
-rw-r--r-- 3.0K Apr 6, 2026 · B473A60 · ~2 min

HTMLEditor for SwiftUI 1.1.0

swiftui html macos open source

HTMLEditor for SwiftUI 1.1.0

This release focuses on Swift 6.3 compatibility, a substantial rewrite of the editor's highlighting pipeline, and much better responsiveness when editing very large HTML documents.

Added

  • Added the HTMLEditorBenchmarks executable target for repeatable performance measurements.
  • Added benchmark support for full-plan highlighting, overlap reuse, edit invalidation, visible-highlight remapping, and large-document local repaint paths.
  • Added focused regression tests for:
    • planner cache reuse and document-scoped invalidation
    • invalid NSRange and UTF-16 edge cases
    • quoted and unquoted attribute value highlighting
    • visible highlight state remapping
    • block-based highlight coverage
    • large-document editing and scrolling policies

Changed

  • Refactored the editor runtime into smaller focused components, including separate coordinator lifecycle, viewport, editing, policy, coverage, structural-range, and visible-highlight-state files.
  • Refactored the syntax highlighter into planner- and builder-based components for clearer separation of scanning, planning, and application.
  • Moved the editor to an adaptive runtime model that changes behavior based on document size instead of treating all HTML documents the same way.

Improved

  • Greatly improved large-document editing performance with:
    • viewport-first highlighting
    • document-scoped planner caches and targeted invalidation
    • cached visible-range plans
    • block-based highlight coverage tracking
    • structural dirty-range alignment around edits
    • two-phase large-file editing with immediate micro-pass and deferred wider repaint
    • burst-coalesced edit repainting
    • scroll-idle semantic highlighting
    • deferred binding synchronization for large documents
    • allowsNonContiguousLayout enabled automatically in large-file mode
  • Improved highlight stability while typing in the middle of very large HTML by preserving visible overlay state and reducing repaint churn around the caret.
  • Improved performance tuning and observability for large files with dedicated benchmark coverage and runtime probes.

Fixed

  • Fixed compilation and concurrency issues needed for Swift 6.3 compatibility.
  • Fixed several editor update-path issues related to coordinator state, highlighting tasks, and main-actor behavior.
  • Fixed highlight regressions and edge cases involving:
    • partial tags
    • empty input
    • large payloads
    • attribute-value coloring
    • visible highlight loss during large-file editing
    • invalid or clipped visible ranges

Notes

  • Full-document semantic highlighting is still used for smaller HTML inputs.
  • Very large HTML inputs now automatically switch to a more conservative, performance-oriented editing mode to keep scrolling and typing responsive.

Try it on GitHub: https://github.com/makoni/HTMLEditor-SwiftUI

Star Fork

[↵] open page html-editor-for-swiftui-1-1-0.md
-rw-r--r-- 1.3K Mar 12, 2026 · EEC4B31 · ~1 min

Actioneer for Linux 1.0.8

actioneer macos apps приложения open source

Actioneer for Linux 1.0.8

Actioneer 1.0.8 focuses on making live GitHub Actions monitoring more reliable while using the GitHub API more efficiently.

Highlights

  • In-progress workflow runs now keep refreshing while they are still active, so expanded jobs and steps stay current before the run finishes.
  • Expanded run details are more stable and easier to read, with clearer badges, preserved job context, and contiguous step numbering.
  • Workflow status badges are now translated more consistently across the app's supported languages.
  • Background refresh is lighter on the GitHub API, reducing duplicate requests and helping preserve rate-limit headroom.

Technical improvements

  • Fixed several live-refresh lifecycle issues in the detail pane so switching repositories or rebuilding rows no longer disables the active refresh loop.
  • Removed duplicate initial jobs fetches caused by rerender races around freshly expanded runs.
  • Reduced unnecessary polling pressure by tightening selected-repo refresh ownership and job-refresh reuse.

Get it from the Snap Store
Get it on Flathub

[↵] open page actioneer-for-linux-1-0-8.md
-rw-r--r-- 672B Mar 5, 2026 · EBF079C · ~1 min

Actineer for Linux got translations

actioneer macos apps приложения open source

Actioneer for Linux 1.0.7

Actioneer for Linux has translations available in numerous languages, including Russian, Spanish, French, Portuguese (Brazil), Hindi, Simplified Chinese, Arabic, Bengali, Urdu, German, and Dutch.

It also includes a built-in crash reporter, which you can copy and paste the report or open an issue on GitHub. Additionally, there are some tweaks and improvements made under the hood.

Get it from the Snap Store
Get it on Flathub

[↵] open page actioneer-for-linux-got-translations.md
-rw-r--r-- 1.7K Feb 13, 2026 · 2084C19 · ~1 min

Recent updates for Actioneer for Linux

actioneer macos apps приложения open source

Actioneer for Linux

There were a bunch of updates of Actioneer for Linux recently, which I forgot to post here. Here's what's new in these updates:

1.02

  • Faster and smoother UI with refreshed repo/workflow lists and improved scrolling behavior.
  • New run filtering controls with better caching, so switching filters is instant and doesn’t reload data.
  • Better workflow auto-refresh and run status updates, including fewer duplicate fetches.
  • Notifications are more reliable across Snap/Flatpak, with improved icon handling and fallbacks.
  • Improved sandboxed credential storage using the secret portal for Snap/Flatpak.
  • Offline-friendly cache persistence for workflows, runs, and jobs.
  • Packaging and CI updates across Snap, Flatpak, and AppImage for better compatibility.
  • Dependency updates and stability fixes.

1.03

  • Job logs now render ANSI colors, grouped workflow sections, and clearer command/output formatting.
  • Aligned timestamps and command prefixes improve scanability, with stronger error highlighting.
  • Packaging CI refreshed with multi-arch updates for AppImage/Snap/Flatpak builds.
  • Dependency updates and demo log refreshes for improved accuracy.

1.04

  • Handle expired job logs (HTTP 410) with clearer messaging instead of a broken view.
  • Strip BOM markers in job logs so first-line timestamps render correctly.

1.05

  • Manual workflow triggers now support workflow_dispatch inputs with dynamic parameter fields.
  • Dependency updates for ryu, unicode-ident, and zmij.

Get it from the Snap Store
Get it on Flathub

[↵] open page actioneer-1-02-1-05.md
-rw-r--r-- 1.1K Jan 21, 2026 · 8445AE8 · ~1 min

AppMetric 1.14.0

macos приложения appmetric appmetrica

AppMetric screenshot

AppMetric version 1.14.0 has been released.

New

  • Settings window with a "Launch at login" toggle.
  • Updated app icons for Liquid Glass.

Improvements

  • Faster and more stable updates: parallel requests with backoff during rate limits, while respecting the daily quota.
  • Popovers now adapt to their content.
  • Improved date formatting in charts.

Download

[↵] open page appmetric-1-14-0.md
-rw-r--r-- 664B Jan 20, 2026 · 4C1F7F4 · ~1 min

Actioneer 1.01

actioneer macos apps приложения open source

Actioneer screenshot

The first update for Actioneer has been released. Here's what's new:

  • Workflows refresh in the background so newly-dispatched runs appear automatically.
  • Reduced API usage and fewer rate-limit hits with ETag-based caching — lists load faster and your quota lasts longer.
  • The app remembers the repository you were viewing between launches.
  • Better diagnostics and reliability for smoother everyday use.

Download

Follow updates on X: https://x.com/ActioneerCI

[↵] open page actioneer-1-01.md
-rw-r--r-- 1.7K Oct 16, 2025 · 03ED173 · ~2 min

Actioneer - Command your CI

actioneer macos apps приложения

Actioneer screenshot

Actioneer — a lightweight macOS app for developers and DevOps engineers who want fast, reliable access to GitHub Actions from the desktop.

Key features

  • Browse your GitHub repositories and view Actions workflows and recent runs quickly.
  • Inspect run status (success, failure, queued, in progress) with clear badges and counts.
  • View job logs: download and preview run logs for quick troubleshooting.
  • Dispatch workflows, cancel running workflows, and re-run failed runs directly from the app.
  • Favorites and quick search let you focus on the repositories and workflows that matter most.
  • Desktop notifications for run completions and failures so you never miss important results.
  • In-memory caching and efficient refresh make the app responsive while respecting GitHub rate limits.
  • Secure authentication using OAuth (PKCE); tokens are stored securely in the macOS Keychain.

Privacy & security

We only request minimum GitHub scopes required for the features you use. Authentication uses OAuth PKCE and tokens are stored in the macOS Keychain. We do not send your logs or tokens to third-party servers without your explicit consent. See the app’s Privacy Policy for details.

Getting started

Sign in with your GitHub account (OAuth), grant the requested scopes, and the app will list your repositories and workflows. For CI/CD administrators and individual developers alike, Actioneer makes monitoring and simple management of GitHub Actions fast and convenient.

Download

Follow updates on X: https://x.com/ActioneerCI

[↵] open page actioneer-command-your-ci.md
-rw-r--r-- 772B Jul 9, 2025 · EDE172F · ~1 min

SwiftUI text editor for macOS with HTML syntax highlighting

swiftui html macos open source

SwiftUI text editor for macOS with HTML syntax highlighting

A few months ago, I wanted to add a text editor to one of my apps with HTML syntax highlighting. I tried a couple of libs that I found on GitHub, but none of them really worked for me. Mostly, they are too heavy and try to do everything. And in the end, they are glitchy and buggy.

So inspired by vibe coding, I made my own. It works fine for me and doesn't try to be an IDE or a real code editor. Just a simple SwiftUI view with a text editor with syntax highlighting. Colors are customizable with a simple struct.

Try it on GitHub: https://github.com/makoni/HTMLEditor-SwiftUI

[↵] open page swiftui-text-editor-for-macos-with-html-syntax-highlighting.md
-rw-r--r-- 480B May 19, 2025 · ED4BA57 · ~1 min

AppMetric 1.13.0

macos приложения appmetric appmetrica

AppMetric 1.13.0

AppMetric version 1.13.0 has been released. Now on Swift 6, I've slightly tweaked the UI and removed the popover opening on launch (except for the first launch) — I concluded that it was rather annoying, especially if the app launches automatically after a reboot. Also added localization for several new languages.

Download

[↵] open page appmetric-1-13-0.md
-rw-r--r-- 963B May 27, 2024 · D7B1A59 · ~1 min

AppMetric 1.12.0

macos приложения appmetric appmetrica

AppMetric 1.12.0

An update for AppMetric, version 1.12.0, has been released. I've been working on it in my spare time. What's new in recent versions:

  • Apple reviewers, for some reason, don't like OAuth authorization via Safari anymore, so I had to redo it using an embedded window with WKWebView. I hope that in the next SwiftUI, its own WebView will finally appear, so I won't have to use a wrapper anymore.
  • Added a button for quick access to app statistics on the Appmetrica website.
  • Added viewing of statistics as charts — both for each individual metric and all metrics combined. All this just 7 years after one of the users requested adding charts :)
  • Added interface translation into several languages. Fortunately, with the help of AI, it has become very easy.

Download

[↵] open page appmetric-1-12-0.md
-rw-r--r-- 506B Apr 3, 2024 · BC252B6 · ~1 min

Modulbank informer 1.3

macos приложения модульбанк open source

Modulbank Informer 1.3

Released a small update for Modulbank Informer. Updated the status bar icon (now more recognizable) and added a checkbox to hide accounts with zero balance. Plus, some minor refactoring.

Source code on GitHub: https://github.com/makoni/ModulbankInformer
You can download it here: https://github.com/makoni/ModulbankInformer/releases

[↵] open page modulbank-informer-1-3.md
-rw-r--r-- 2.4K Mar 30, 2024 · E0344BE · ~2 min

How to get selected text inside of TextEditor in SwiftUI on macOS

swiftui macos

How to get selected text inside of TextEditor in SwiftUI on macOS

TextEditor in SwiftUI still doesn’t have any API to get user selection. But since it’s using NSTextView internally we can subscribe to its notifications.

Here’s an example of getting a substring from user selection:

[↵] open page how-to-get-selected-text-inside-of-texteditor-in-swiftui-on-macos.md
-rw-r--r-- 1.2K Oct 10, 2023 · d68e288 · ~1 min

AppMetric 1.8

macos приложения appmetric appmetrica

AppMetric 1.8

I’ve updated AppMetric for macOS — a client for Yandex’s AppMetrica service. The previous version, sadly, stopped working when they changed their response format.

From what I’ve been able to figure out, I was using something undocumented in their response. And judging by the current API responses, that was the number of crashes. Unfortunately, I had to remove it and replace it with the number of devices.

Since I finally got my hands on it, I decided to bring it up to date. Reworked everything in SwiftUI, but had to wrap the popup itself in good old NSPopover, because MenuBarExtra from SwiftUI is far too limited. Maybe I’ll get around to writing a separate post about it. While I was at it, I migrated everything to Swift Concurrency and SF Symbols. The catch is that it now requires macOS 13+, but I assume the people who find it useful keep their Macs up to date too. And, of course, finally — native Apple Silicon support.

The update went through review today and is available for download. In the future I’d like to add per-day/per-week charts.

Download

[↵] open page appmetric-1-8.md
-rw-r--r-- 706B Mar 29, 2023 · 88035de · ~1 min

Modulbank Informer

macos приложения модульбанк open source

Modulbank Informer

Recently I noticed that Modulbank, the bank I use, has a public API. Since they don’t have a macOS app, and their iOS app doesn’t run on Apple Silicon (a security restriction on their side), I built a small informer that shows the list of accounts and balances in the status bar.

The app requires macOS 13+ — I wanted to squeeze the latest features out of SwiftUI and get some practice while I was at it.

Source on GitHub: https://github.com/makoni/ModulbankInformer
Download: https://github.com/makoni/ModulbankInformer/releases

[↵] open page modulbank-informer.md
-rw-r--r-- 1.4K May 21, 2018 · 831A704 · ~2 min

JPG to HEIF converter

jpg to heif converter приложения apps macos open source

JPG to HEIF converter

Today I've decided to experiment with HEIF that was introduced by Apple with macOS 10.13 and iOS 11. They said that it has the same quality with much lower file size.

It's supported in the latest versions of macOS and iOS and last models of iPhone can take pictures in that format.

I'm thinking about compressing my home archive of photos and videos. I was experimenting with HEVC (H.265) and results were great - I had reduced the size of my videos by encoding them to HEVC with an awesome util called HandBrake.

I found the only way to convert JPG to HEIF (which has HEIC extension). It's possible with the Preview app from macOS. But it would be interesting for me if I can do it by myself in Swift. So I did :)

My folder with 64 photos from my action camera was 203 mb in JPG format. And it's only 31.3 mb in HEIC.

macOS and iOS support it from the box. And what's interesting - it's easy to add pictures in this format to the Photos library and it will appear on all your devices that use iCloud. But if you want to export this picture from the Photos library - it will be converted to JPG on the fly, so it looks like you can't export the original HEIC file.

The converter is free and open source (but it's for macOS only): https://github.com/makoni/jpg-to-heif-converter

[↵] open page jpg-to-heif-converter.md
-rw-r--r-- 452B Aug 28, 2016 · FD72C26 · ~1 min

AppMetric for macOS

appmetric appmetrica macos приложения

Over a couple of evenings I made a simple macOS informer that shows app stats from Yandex AppMetrica. It lives as an icon in the status bar:

  • Shows a list of all apps from AppMetrica.
  • Displays the number of users, sessions, and crashes for today.
  • Automatically refreshes stats in the background.

Download

[↵] open page appmetric-dlya-macos.md
-rw-r--r-- 618B Jul 24, 2013 · DC4F445 · ~1 min

Creating SSH Aliases for Terminal in Mac OS X

шпаргалки ssh macos

Cheat sheet.

Everything is the same as in Linux, only on macOS there is no ssh-copy-id command. To make it available:

brew install ssh-copy-id

Further it is exactly like in Linux:

To connect to host 192.168.1.2 not via ssh root@192.168.1.2 but via ssh myhost, do the following:

Create the ~/.ssh/config file, and put this in it:

Host myhost
HostName 192.168.1.2
User root
Port 22

Next, to avoid entering the password every time, generate your keys

ssh-keygen -t rsa 

And copy the public key to the server

ssh-copy-id myhost

Update the keys:

ssh-add ~/.ssh/id_rsa
[↵] open page sozdanie-ssh-aliasov-dlya-terminala-v-mac-os-x.md
makoni@arm1:~/blog$ cd .. // ↵ back to all posts