Skip to content

Releases: guilhermeyo/mclovin-release

v0.1.0-alpha.27

30 May 13:59
a0479c5

Choose a tag to compare

v0.1.0-alpha.27 Pre-release
Pre-release

Startup performance — picker GUI mais rápido

Release focada em latência percebida do GUI. Três otimizações ortogonais que cortam o cold start, principalmente no macOS.

Mudanças

  1. Disk cache ~/Library/Caches/mclovin/browsers.json (TTL 1h)

    • detect_browsers() lê do disco antes de escanear /Applications ou XDG dirs.
    • Cada URL click spawnava um processo fresco que reescaneava tudo. Agora o cache cross-invocation mata a hot path. Linux: ganho marginal (CLI já era <30ms). macOS: 80-95ms economizados.
    • Force refresh: rm ~/Library/Caches/mclovin/browsers.json (ou ~/.cache/mclovin/browsers.json no Linux). 1h TTL pega novos browsers instalados.
  2. plist crate substitui plutil subprocess (macOS)

    • parse_app_bundle lia Info.plist via plutil -convert json -o - (fork por bundle). Com 10+ apps em /Applications, somava ~100ms.
    • Crate plist (1.7) parsea XML + binary plist puro Rust, zero forks. ~10x mais rápido por bundle.
  3. Skip maybe_spawn_background_check no picker path

    • Update check forkava um child em cada gui::run, incluindo o picker (hot path).
    • Movido pra StartScreen::Settings apenas. Picker invocation: 50-100ms a menos.
    • Banner de update aparece na próxima abertura de Settings.

Numbers (mac44)

alpha.26 alpha.27 cold alpha.27 warm cache
mclovin list-browsers 122ms 11ms 4ms
Speedup 11x 30x

Picker GUI cold (estimado): ~500ms → ~200ms.

Sem mudanças de feature

Mesmas features de alpha.25/26 (file handler, incognito, Safari disable). Pura perf.

Auto-update

Da alpha.25/alpha.26, mclovin update instala alpha.27 + refresh self-heal de .desktop/Info.plist mantém compatibilidade.

v0.1.0-alpha.26

27 May 23:19
a0479c5

Choose a tag to compare

v0.1.0-alpha.26 Pre-release
Pre-release

Auto-update + refresh self-heal validation

Pure version bump pra validar o ciclo completo:

  • alpha.25 binário rodando mclovin update instala alpha.26
  • install_from_release da alpha.25 chama refresh_desktop_file (Linux) / refresh_bundle_binary (macOS) ANTES de marcar done
  • Resultado: .desktop/Info.plist se mantêm consistentes com o binário em uso, sem precisar de mclovin setup manual

Nada novo em features — mesmo conjunto do alpha.25 (file handler, incognito toggle, Safari disabled, application:openURLs:, profile guards).

Caveat upgrade de alpha.24

Se você ainda está em alpha.24, o mclovin update instala alpha.26 mas NÃO atualiza .desktop/Info.plist (alpha.24 binary não tem refresh_*). Rode mclovin setup uma vez após o update pra registrar os MIMEs/UTIs novos.

v0.1.0-alpha.25

27 May 22:46
a0479c5

Choose a tag to compare

v0.1.0-alpha.25 Pre-release
Pre-release

File handler + Incognito mode

Cross-platform alpha que adiciona duas features principais:

Open local files via picker

  • Linux: mclovin.desktop declara 19 MIMEs novos (PDF, HTML, SVG, imagens, áudio, vídeo). Setup mantém flipando só http/https — user opta in por tipo via xdg-mime default mclovin.desktop application/pdf ou Properties → Open With.
  • macOS: Info.plist declara 19 UTIs equivalentes. User opta in via Finder Get Info → Open With → Change All.
  • Multi-file Open With: 3 PDFs selecionados → um picker → escolhe browser → 3 abas/janelas no browser escolhido.
  • CLI: mclovin open agora aceita URLs/paths variádicos. Paths absolutos bare (/tmp/x.pdf) viram file:// automaticamente.

Incognito mode

  • Botão clicável 🥷 Ctrl+I no canto superior direito do picker. Cor accent quando ON, dim quando OFF.
  • Atalho Ctrl+I (e Cmd+I no macOS).
  • CLI flag: mclovin open --incognito <url>.
  • Suporta Chromium-family (--incognito) e Firefox-family (--private-window).
  • Safari: linha desabilitada no picker quando toggle ON + hint "não permite abrir direto em modo anônimo" (sem flag CLI confiável).
  • Stats skip em incognito (privacidade).

Bugfixes

  • macOS: troca kAEOpenDocuments AE handler por application:openURLs: delegate. NSDocumentController interceptava o AE antes, mostrando " cannot open files in format". O delegate moderno resolve.
  • Profile flag injection no no-URL launch (resolve Chromium profile picker no cold start quando Local State tem picker_shown=true).
  • macOS-specific guard preserva "focus existing window" quando picker invocado sem URL (sem -n --args que duplicaria janela).

Auto-update

Da alpha.24, mclovin update baixa este release e:

  • Linux: refresh_desktop_file atualiza mclovin.desktop com MIMEs novos sem forçar re-run de setup.
  • macOS: refresh_bundle_binary atualiza Info.plist no .app bundle.

Invariante "zero default change"

Declarar capacidade de abrir PDF/HTML/etc NÃO flipa xdg-mime (Linux) nem LSSetDefaultRoleHandlerForContentType (macOS). Cabe ao user explicitamente opt-in por tipo.

Tests

431 unit tests (+27 desde alpha.24).

v0.1.0-alpha.24 — unified macOS .app launcher + 12 stability fixes

25 May 00:43
e7536c8

Choose a tag to compare

First combined Linux x86_64 + macOS arm64 release.

Install (same one-liner both platforms):
```
curl -fsSL https://mclovin.org/install.sh | bash
```

The install script detects your platform and does the right thing — see the manual for the per-platform details.

What's new since alpha.22

macOS support graduated from "experimental" (alpha.23 test) to first-class

  • Full `.app` bundle with native browser-detection, profile routing (Brave, Chrome, Arc, Chromium, Firefox), webapp mode (`mclovin --app=URL`).
  • Unified .app launcher — the bundle's launcher binary IS the mclovin binary now. No Swift dependency, no `xcode-select --install` required for setup, no per-user compile step. kAEGetURL Apple Events are handled natively in Rust via objc2 / NSAppleEventManager.
  • Auto-update with Gatekeeper quarantine xattr strip; the bundle (Info.plist + binary + lsregister) is refreshed in place on every update.
  • Settings window centers on `visibleFrame` (no menu-bar clipping).
  • macOS post-install hints localized to pt-BR / es-ES.

Linux gains too (all behavior-preserving)

  • 1Hz default-browser poll gated per-screen + bumped to 5s — significantly less `xdg-mime` subprocess churn while the GUI is idle.
  • `is_chromium_family` switched from substring to token-exact matching (no more false positives like `arc` hitting `monarch` / `search-archive`).
  • Profile flag (`--profile-directory=X`) skipped on no-URL picker selections so the browser is just activated instead of spawning a fresh new window.

Stability fixes (post-review hardening, no user-facing surface)

Two rounds of code review (`/simplify` × 2) addressed:

  • Atomic launcher install (copy-to-tmp + rename, with same-file guard so `mclovin update` from the bundle binary can't self-destruct).
  • AE handler covers all 3 outcomes (URL OK, spawn fails, AE malformed) with guaranteed exit — no more launcher hangs.
  • `__CFBundleIdentifier` env check replaces `isatty` heuristic for LaunchServices-vs-terminal detection (no more hangs on `nohup`, redirected stdin, cron).
  • `spawn_open_url` / `spawn_picker` return `Result` and log on failure.
  • `logging::init` failure non-fatal so the launcher still routes URLs on restricted filesystems.
  • Post-install bundle refresh now calls full `create_bundle` + `lsregister` (Info.plist version + LaunchServices cache stay in sync) and propagates errors instead of swallowing them.

Compatibility

  • macOS arm64 (Apple Silicon). Intel macs will get `mclovin-macos-x86_64` later — asset finder already supports it once CI publishes the artifact.
  • Linux x86_64, identical to alpha.22 from the user's perspective (only cfg-gated macOS code added; runtime behavior preserved + the Linux-side improvements above).
  • Auto-update: users on alpha.22 (Linux) and alpha.23 (macOS) can update directly via the in-app Updates screen or `mclovin update` from the CLI.

v0.1.0-alpha.23 — first macOS arm64 build

24 May 20:06
b42d953

Choose a tag to compare

First public macOS arm64 release.

Linux users: this release ships macOS arm64 only. Stay on v0.1.0-alpha.22 — running mclovin update will return a clear "no `mclovin-linux-x86_64` asset" message and leave your install untouched. A combined Linux + macOS release lands as alpha.24 once the macOS path is validated.

macOS users (first install):
```
curl -fsSL https://mclovin.org/install.sh | bash
```
Requires Xcode Command Line Tools (`xcode-select --install`) so `mclovin setup` can compile the .app's URL-event launcher.

What's in this release (full diff from alpha.22):

  • macOS port: browser detection via .app bundles, profile injection
    (Finicky's `-n --args --profile-directory` recipe), Swift launcher
    for kAEGetURL Apple Events, register-as-default flow via System
    Settings (macOS 26 blocks programmatic `setDefaultApplication` for
    unsigned apps), bundled webapp `--app=URL` mode, GUI keybindings
    with Cmd/, settings window centered via NSScreen visibleFrame,
    picker icons from .icns via sips.
  • Auto-update: macOS arm64 asset selector, strips
    `com.apple.quarantine` xattr post-install so Gatekeeper doesn't
    block the next launch.
  • Linux benefits too (all cfg-gated, no behavior change on Linux):
    Phase 1 `DefaultBrowserPoll` gated per-screen + interval 1Hz → 5Hz
    (less `xdg-mime` fork churn idle); `is_chromium_family` switched
    from substring to token-exact (kills false positives like `arc`
    matching `monarch`); profile flags now skipped when no URL is in
    flight (was forcing a new browser window on profile-pick from
    picker).

Known limitations:

  • Auto-update Mac depends on this release pipeline catching up — first
    install via curl works today, in-app update from a previously-installed
    alpha.23 will be validated as soon as alpha.24 ships.
  • Settings window centers on the primary display (multi-monitor centering
    on the window's actual screen is deferred).
  • Code signing / notarization not done — Gatekeeper quarantine is
    stripped at install time but signed builds (Developer ID) are the
    proper long-term fix.

v0.1.0-alpha.22

15 May 19:05
b42d953

Choose a tag to compare

v0.1.0-alpha.22 Pre-release
Pre-release

What's new

Maintenance release. Same app surface as alpha.21 — the change worth knowing about lives in the install pipeline.

Fixes

  • install.sh: resolve the latest tag via the public Atom feed instead of the rate-limited REST API. Users hitting the unauthenticated 60 req/h API limit were seeing curl: (23) Failure writing output to destination and a silent abort. The new path uses github.com/$REPO/releases.atom — no auth, no rate limit, and entries are sorted newest-first by GitHub itself, so a head -n1 trivially picks the head. As a side effect this also fixes a latent greedy-sed bug where the API returning minified JSON would resolve to the OLDEST release, not the newest.
  • CI green again after cargo fmt --check, clippy -D warnings, and the FormField cycle tests were updated to match the production Pattern → AddPattern → TestUrl ordering.

How to install

curl -fsSL https://mclovin.org/install.sh | bash

The installer registers mclovin as the default browser and drops the .desktop entry — open it from your app launcher (Walker, rofi, GNOME/KDE menu) right after.

v0.1.0-alpha.21

11 May 03:41
60c18a9

Choose a tag to compare

v0.1.0-alpha.21 Pre-release
Pre-release

What's new

Big rule-form rework + an unsaved-changes modal that no longer leaves you stuck.

Rule form (Bitwarden-style picker, multi-pattern, live test URL)

  • One picker per kind, three inline segmented buttons instead of a pop-up dropdown: URL contém / URL começa com / Regex. All three visible, Tab focuses the row, ←/→ cycles the selection.
  • Multi-pattern in any kind. Each pattern is its own row with a × to remove; + Adicionar padrão appends a new one. Regex rules accept lists too (match_regex = ["...", "..."]).
  • URL começa com is new. Internally desugared into ^https?://(www\.)?<padrão> so it matches https://github.com/foo and https://www.github.com/foo but not https://acme.com/github.com/foo.
  • Live test URL field. Type a URL into "Testar com uma URL" and the form tells you which pattern matched (✓ bate no padrão 2) or that nothing matched (✗ nenhum padrão bate). Same matching the engine uses, so the form's verdict is what mclovin open <url> will actually do.
  • Inline hints under each input replace the old top tip-card. The match-kind hint changes with the selected kind, so it reads as plain-language documentation for the choice you just made.
  • Rótulo (was Descrição) is now label-less — placeholder names the field, a dim line below explains where it shows up in the rule list.
  • Full pt-BR / en / es-ES translations.

Unsaved-changes modal (NN/g-backed cleanup)

  • (Y) letter shortcut for Discard dropped — Y means "Yes", not "destroy my edits", and the conflict was the worst offender.
  • "Deixar pra depois" → "Salvar rascunho" (says what actually happens).
  • "Descartar" → "Descartar mudanças" (explicit verb).
  • One-line body under the title explains the choice.
  • 16px visual gap between the safe options and the destructive Descartar so a reflex Tab+Enter doesn't fall into it.
  • Default focus stays on the safest option (Continuar editando).

Keyboard navigation

  • Tab now walks MatchType → Pattern(0..N) → "+ Adicionar padrão" → Testar URL → Rewrite (regex only) → Abrir com → Rótulo → loop.
  • The + Adicionar padrão button gets an accent border when focused; Enter on it appends a row and focuses the new input (and scrolls to it).
  • Enter on every other field saves the form, same contract everywhere.

Rule list

  • Draft badge rascunho não salvorascunho pendente (no longer contradicts "Salvar rascunho").

Backward compat

Every existing rules.toml keeps loading and routing identically. The new match_type = "starts_with" field is optional; absence is treated as Contains. match_regex still accepts a bare string.

358 lib tests + 6 integration tests green.

v0.1.0-alpha.20

10 May 22:41
60c18a9

Choose a tag to compare

v0.1.0-alpha.20 Pre-release
Pre-release

What's new

The install flow on the Updates screen no longer changes anything on disk until the countdown elapses, so Esc actually cancels the update.

  • Async download with progress bar. Click "Install now" no longer freezes the GUI on the HTTP fetch; a thread streams the binary into pending_update/ while the screen shows a progress bar.
  • Esc cancels the whole update. Pressing Esc during the download or the 5-4-3-2-1 countdown discards the staged binary, restores the previous state, and shows "Update cancelled — nothing was changed." (Before, the swap happened before the countdown — Esc only skipped the restart.)
  • Countdown phase is now a separate state. replace_binary runs only when the countdown actually ends; that's also when restart_self fires.

Internal: new InstallPhase enum on UpdateCheckController (Idle → Downloading → Countdown), spawn_install_download worker, mpsc receiver polled from the GUI tick. 21 lib tests green.

No CLI / config changes.

v0.1.0-alpha.19

10 May 01:30
60c18a9

Choose a tag to compare

v0.1.0-alpha.19 Pre-release
Pre-release

What's new

Documentation and dead-code scrub after the alpha.18 TUI removal:

  • Dropped the unused help_rules i18n field (the TUI-flavored help line). The GUI Rules screen continues to render via help_rules_gui.
  • Cleaned up doc-comments across src/api/rules.rs, src/rules_store.rs, src/i18n.rs, src/cmd/gui/*, etc. that still attributed CRUD or parity to the now-deleted TUI.
  • README, AGENTS.md, and the in-progress release manual no longer claim a TUI / mclovin menu frontend exists.

No behavior changes in this release — strictly hygiene over the alpha.18 surface.

v0.1.0-alpha.18

10 May 00:54
60c18a9

Choose a tag to compare

v0.1.0-alpha.18 Pre-release
Pre-release

What's new

  • Background update check now fires on GUI launch (TTL-guarded with a 60min cooldown). Replaces the periodic in-process tick that didn't survive mclovin's transient process lifetime — the loop fired exactly once at startup and then died with the window. Open the GUI, get a fresh check.
  • TUI frontend removed. The GUI is now the only frontend. mclovin menu / mclovin tui are gone, along with the ratatui/crossterm dependencies (~7400 lines + two crates trimmed from the binary).
  • Internal cleanup: extracted process_helpers::detach_session so the 5 sites that need to detach a spawned child (browser, webapp, GUI restart, picker exit, background update worker) share one unsafe block instead of five copies.

Breaking

[picker] command = "tui" no longer routes anywhere — it falls through and fails at spawn. Set to "" (default iced GUI) or remove the line.