Releases: guilhermeyo/mclovin-release
v0.1.0-alpha.27
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
-
Disk cache
~/Library/Caches/mclovin/browsers.json(TTL 1h)detect_browsers()lê do disco antes de escanear/Applicationsou 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.jsonno Linux). 1h TTL pega novos browsers instalados.
-
plistcrate substituiplutilsubprocess (macOS)parse_app_bundlelia Info.plist viaplutil -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.
-
Skip
maybe_spawn_background_checkno picker path- Update check forkava um child em cada
gui::run, incluindo o picker (hot path). - Movido pra
StartScreen::Settingsapenas. Picker invocation: 50-100ms a menos. - Banner de update aparece na próxima abertura de Settings.
- Update check forkava um child em cada
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
Auto-update + refresh self-heal validation
Pure version bump pra validar o ciclo completo:
- alpha.25 binário rodando
mclovin updateinstala alpha.26 install_from_releaseda alpha.25 chamarefresh_desktop_file(Linux) /refresh_bundle_binary(macOS) ANTES de marcar done- Resultado:
.desktop/Info.plistse mantêm consistentes com o binário em uso, sem precisar demclovin setupmanual
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
File handler + Incognito mode
Cross-platform alpha que adiciona duas features principais:
Open local files via picker
- Linux:
mclovin.desktopdeclara 19 MIMEs novos (PDF, HTML, SVG, imagens, áudio, vídeo). Setup mantém flipando só http/https — user opta in por tipo viaxdg-mime default mclovin.desktop application/pdfou Properties → Open With. - macOS:
Info.plistdeclara 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 openagora aceita URLs/paths variádicos. Paths absolutos bare (/tmp/x.pdf) viramfile://automaticamente.
Incognito mode
- Botão clicável
🥷 Ctrl+Ino canto superior direito do picker. Cor accent quando ON, dim quando OFF. - Atalho
Ctrl+I(eCmd+Ino 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
kAEOpenDocumentsAE handler porapplication: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 --argsque duplicaria janela).
Auto-update
Da alpha.24, mclovin update baixa este release e:
- Linux:
refresh_desktop_fileatualizamclovin.desktopcom MIMEs novos sem forçar re-run de setup. - macOS:
refresh_bundle_binaryatualizaInfo.plistno.appbundle.
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
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
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
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 seeingcurl: (23) Failure writing output to destinationand a silent abort. The new path usesgithub.com/$REPO/releases.atom— no auth, no rate limit, and entries are sorted newest-first by GitHub itself, so ahead -n1trivially 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 theFormFieldcycle tests were updated to match the productionPattern → AddPattern → TestUrlordering.
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
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ãoappends a new one. Regex rules accept lists too (match_regex = ["...", "..."]). URL começa comis new. Internally desugared into^https?://(www\.)?<padrão>so it matcheshttps://github.com/fooandhttps://www.github.com/foobut nothttps://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 whatmclovin 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(wasDescriçã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
Descartarso 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ãobutton 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 salvo→rascunho 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
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_binaryruns only when the countdown actually ends; that's also whenrestart_selffires.
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
What's new
Documentation and dead-code scrub after the alpha.18 TUI removal:
- Dropped the unused
help_rulesi18n field (the TUI-flavored help line). The GUI Rules screen continues to render viahelp_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 menufrontend exists.
No behavior changes in this release — strictly hygiene over the alpha.18 surface.
v0.1.0-alpha.18
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 tuiare gone, along with the ratatui/crossterm dependencies (~7400 lines + two crates trimmed from the binary). - Internal cleanup: extracted
process_helpers::detach_sessionso the 5 sites that need to detach a spawned child (browser, webapp, GUI restart, picker exit, background update worker) share oneunsafeblock 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.