Sep
27

CleanMacOS: aplicația care găsește ce ocupă spațiu pe Mac-ul tău și mută totul în Trash

09/27/2026 12:00 AM by Admin in Web development

CleanMacOS: aplicația care găsește ce ocupă spațiu pe Mac-ul tău și mută totul în Trash

📝 Actualizat: 15 octombrie 2026 — Versiunea 2.0

CleanMacOS a primit cel mai mare update de până acum: include o secțiune completă de Setări cu temă adaptivă (Sistem / Întunecat / Luminos), fundal animat opțional, scanare automată la pornire și verificare configurabilă a actualizărilor. Modulul de diagnostică a fost extins, iar aplicația are acum și curățare pentru browsere și dezinstalare completă de aplicații. Toate detaliile mai jos.

Mac-ul meu ajunsese să aibă 622 MB de fișiere inutile pe care nu le foloseam de luni de zile. Cache-uri de la aplicații pe care le ștersesem demult. Loguri vechi pe care nu le citea nimeni. Fișiere de build Xcode pe care le regenera automat la următoarea compilare. Reziduuri de la aplicații șterse care rămăseseră ascunse în Library. Toate acestea ocupau spațiu fără să aducă vreun beneficiu.

Așa s-a născut CleanMacOS, o aplicație nativă de macOS construită în SwiftUI, care scanează sistemul, găsește fișierele inutile și le mută în Trash cu un singur click. Nimic nu se șterge definitiv — totul trece prin Trash, deci poți recupera orice până golești coșul. O poți descărca gratuit de pe seotoolpro.ro/download-apps.

De unde descarci CleanMacOS

Descărcarea se face de pe pagina oficială a aplicațiilor dezvoltate de seotoolpro.ro. Accesează direct:

https://seotoolpro.ro/download-apps

Acolo vei găsi lista completă a aplicațiilor disponibile. Pentru CleanMacOS, vei vedea toate versiunile lansate până acum, fiecare cu propriul buton de descărcare. Poți alege versiunea cea mai recentă, marcată cu badge-ul „ultima", sau o versiune anterioară dacă ai un motiv specific.

Fiecare versiune afișează dimensiunea fișierului, data lansării, numărul de descărcări și hash-ul SHA-256. După ce descarci fișierul ZIP, îl poți verifica independent rulând în Terminal:

shasum -a 256 cleanmacos.zip

Dacă hash-ul calculat se potrivește cu cel afișat pe site, fișierul este autentic și nu a fost modificat pe drum.

Ce găsește CleanMacOS

Aplicația scanează șapte categorii de fișiere, fiecare cu propriul nivel de risc și propriul scop. Nu toate sunt active implicit — cele care necesită atenție suplimentară sunt dezactivate și trebuie bifate manual.

Cache — fișiere temporare pe care aplicațiile le refac singure. Nu conțin date importante, doar copii temporare pentru viteză. Sigure de șters.

Cache-uri manageri de pachete — pachete descărcate anterior de npm, pip, yarn sau Gradle. Se re-descarcă automat la nevoie. Nu afectează proiectele sau aplicațiile instalate.

Loguri vechi — jurnale mai vechi de 7 zile, pe care nimeni nu le mai citește. Aplicația le identifică și le mută în Trash.

Descărcări incomplete — fișiere rămase neterminate în Downloads, mai vechi de o oră. De obicei sunt resturi de la descărcări întrerupte.

Instalatoare (.dmg) — fișiere DMG din Downloads, de obicei nu mai sunt necesare după instalare. Nu sunt bifate implicit, pentru că utilizatorul poate să le păstreze intenționat.

Xcode DerivedData — fișiere de build create de Xcode, se refac la următorul build. Pot ocupa sute de MB sau chiar GB la proiecte mari.

Resturi de la aplicații șterse — foldere și setări rămase în Library după ce aplicația a fost ștearsă. Nu sunt bifate implicit, pentru că necesită verificare manuală.

Cum funcționează scanarea

Prima decizie tehnică a fost să nu ating nimic până când utilizatorul nu confirmă explicit. Scanarea doar citește și măsoară — nu modifică, nu mută, nu șterge nimic. Toate operațiile de mutare în Trash se fac doar la apăsarea butonului „Mută în Trash".

Scanner-ul rulează pe un thread de fundal, astfel încât interfața să rămână responsivă. Fiecare fișier este măsurat cu totalFileAllocatedSize, care raportează spațiul real ocupat pe disc, nu dimensiunea logică a fișierului.

static func size(of url: URL) -> Int64 {
    let keys: Set<URLResourceKey> = [.totalFileAllocatedSizeKey, .isRegularFileKey]
    if let v = try? url.resourceValues(forKeys: keys), v.isRegularFile == true {
        return Int64(v.totalFileAllocatedSize ?? 0)
    }
    var total: Int64 = 0
    guard let en = fm.enumerator(at: url,
                                 includingPropertiesForKeys: Array(keys),
                                 options: [],
                                 errorHandler: { _, _ in true }) else { return 0 }
    for case let file as URL in en {
        if let v = try? file.resourceValues(forKeys: keys), v.isRegularFile == true {
            total += Int64(v.totalFileAllocatedSize ?? 0)
        }
    }
    return total
}

Această funcție măsoară atât fișiere individuale, cât și foldere întregi. Pentru foldere, parcurge recursiv toate fișierele și însumează spațiul alocat. Este o operație costisitoare pentru foldere mari, de aceea rulează pe fundal.

Ce e nou în versiunea 2.0

Versiunea 2.0 este cel mai mare update de până acum. Aplicația nu mai este doar un curățător de fișiere — este un instrument complet de întreținere a Mac-ului, cu personalizare completă și curățare extinsă.

Secțiunea Setări (nou) — o pagină dedicată, accesibilă din sidebar (secțiunea APLICAȚIE) sau cu scurtătura ⌘ ,. Include temă adaptivă (Sistem / Întunecat / Luminos) cu previzualizare vizuală, fundal animat opțional (aurora), scanare automată la pornire, verificare configurabilă a actualizărilor și un card „Despre" cu versiunea și link-uri utile. Preferințele sunt salvate automat.

Curățare browsere (nou) — un modul dedicat care detectează automat browserele instalate (Chrome, Edge, Firefox, Safari, Brave, Opera, Vivaldi) și scanează cache-urile, cookie-urile și datele conexe. Cache-urile sunt bifate implicit — cookie-urile necesită confirmare manuală.

Dezinstalare completă (nou) — găsește nu doar pachetul .app, ci și fișierele asociate (preferințe, cache, containere, LaunchAgents, saved state). Fiecare fișier poate fi bifat individual înainte de mutare.

Diagnostică extinsă — modulul de diagnostică afișează în timp real 6 tile-uri metrice: CPU, RAM ocupat (cu presiune memorie), disc ocupat, temperatură CPU (citită direct din SMC), swap folosit și baterie / uptime. Pragurile de culoare: verde (normal), portocaliu (> 65%), roșu-portocaliu (> 85%).

Interfață glassmorphism — cardurile au acum un strat subtil de material translucid, cu highlight-uri interioare și borduri duble, pentru un aspect modern și consistent cu macOS Sonoma. Animații noi: fundal aurora cu 5 blob-uri animate independent, orb de scanare pulsant cu inele rotative, tranziții fluide între pagini.

Update checker rafinat — notificarea de update apare acum într-un card animat în sidebar, cu butoanele „Descarcă" și „Mai târziu". După amânare, cardul se transformă într-unul mai discret cu numărătoare inversă și butonul „Arată acum".

Toate funcționalitățile din versiunile anterioare (Scanare inteligentă, Hartă stocare, Diagnostică, Aplicații la pornire) sunt păstrate în v2.0.

Detectarea reziduurilor de la aplicații șterse

Cea mai interesantă parte a aplicației este detectarea reziduurilor. Cum știi dacă un folder din Library aparține unei aplicații care mai există sau uneia care a fost ștearsă? Răspunsul este să compari cu lista de aplicații instalate.

Aplicația folosește mdfind, instrumentul Spotlight al macOS, pentru a găsi toate aplicațiile de pe sistem. Apoi extrage bundle identifier-ul fiecăreia și le compară cu folderele din Library.

static func installedBundleIDs() -> Set<String> {
    var paths: [String] = []

    // Spotlight: toate aplicatiile, oriunde ar fi (Desktop, discuri externe etc.)
    let p = Process()
    p.executableURL = URL(fileURLWithPath: "/usr/bin/mdfind")
    p.arguments = ["kMDItemContentType == 'com.apple.application-bundle'"]
    let pipe = Pipe()
    p.standardOutput = pipe
    p.standardError = Pipe()
    if (try? p.run()) != nil {
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        p.waitUntilExit()
        paths += (String(data: data, encoding: .utf8) ?? "")
            .split(separator: "\n")
            .map(String.init)
    }

    // plasa de siguranta: folderele standard de aplicatii
    let dirs = ["/Applications", "/Applications/Utilities", "/System/Applications",
                home.appendingPathComponent("Applications").path]
    for d in dirs {
        for u in children(of: URL(fileURLWithPath: d)) where u.pathExtension == "app" {
            paths.append(u.path)
        }
    }

    var ids = Set<String>()
    for path in paths {
        if let id = Bundle(path: path)?.bundleIdentifier {
            ids.insert(id.lowercased())
        }
    }

    // Plasa de siguranta suplimentara: orice aplicatie care ruleaza chiar acum
    // e clar instalata, indiferent daca Spotlight/mdfind a indexat-o sau nu.
    for app in NSWorkspace.shared.runningApplications {
        if let id = app.bundleIdentifier {
            ids.insert(id.lowercased())
        }
    }

    return ids
}

Trei plase de siguranță sunt incluse. Prima: Spotlight găsește aplicații oriunde ar fi, inclusiv pe Desktop sau pe discuri externe. A doua: folderele standard de aplicații sunt scanate direct, în caz că Spotlight nu a indexat ceva. A treia: orice aplicație care rulează în acest moment este considerată instalată, indiferent de ce zice Spotlight.

Această din urmă plasă de siguranță este esențială. Fără ea, o aplicație precum Docker Desktop ar putea fi marcată greșit drept reziduu dacă Spotlight nu a indexat-o din diverse motive. Cu ea, dacă aplicația rulează, este clar instalată.

De ce nimic nu se șterge definitiv

Decizia fundamentală a aplicației este că nimic nu se șterge definitiv. Totul trece prin Trash. Utilizatorul poate recupera orice fișier până golește coșul. Aceasta este o plasă de siguranță esențială pentru o aplicație care mută fișiere de sistem.

Funcția de mutare în Trash folosește FileManager.trashItem, care respectă comportamentul nativ al macOS. Fișierele ajung în Trash exact ca atunci când le tragi manual acolo.

static func trash(_ candidates: [CleanItem]) -> (freed: Int64, results: [(id: UUID, error: String?)]) {
    let home = NSHomeDirectory() + "/"
    var freed: Int64 = 0
    var results: [(id: UUID, error: String?)] = []

    for item in candidates {
        // plasa de siguranta: nu atingem nimic in afara folderului tau
        guard item.url.path.hasPrefix(home) else {
            results.append((item.id, "În afara folderului utilizatorului curent."))
            continue
        }
        do {
            try FileManager.default.trashItem(at: item.url, resultingItemURL: nil)
            freed += item.size
            results.append((item.id, nil))
        } catch {
            let nsError = error as NSError
            if nsError.code == 513 || nsError.code == 257 {
                results.append((item.id, "Blocat de macOS — activează Full Disk Access pentru această aplicație."))
            } else {
                results.append((item.id, error.localizedDescription))
            }
        }
    }
    return (freed, results)
}

Există o plasă de siguranță suplimentară: aplicația nu atinge nimic în afara folderului utilizatorului curent. Dacă un fișier este în afara ~/, mutarea este refuzată automat. Aceasta previne modificarea accidentală a fișierelor de sistem.

Erorile sunt raportate per element, nu agregate. Dacă un fișier nu poate fi mutat din cauza protecțiilor macOS, utilizatorul vede exact care fișier a eșuat și de ce. Nu un mesaj generic „5 fișiere nu au putut fi șterse", ci „acest fișier specific nu a putut fi șters din acest motiv specific".

Full Disk Access: când macOS blochează curățarea

macOS are un sistem de protecție numit TCC (Transparency, Consent, and Control) care împiedică aplicațiile să acceseze anumite foldere fără permisiune explicită. Fără Full Disk Access, aplicația nu poate muta în Trash unele reziduri protejate, precum Containers ale altor aplicații.

CleanMacOS detectează automat dacă are acest acces, încercând să citească un folder protejat de TCC. Dacă nu poate, afișează un banner cu un buton care deschide direct setările de securitate.

static func hasFullDiskAccess() -> Bool {
    let probe = home.appendingPathComponent("Library/Mail")
    guard fm.fileExists(atPath: probe.path) else {
        return true
    }
    return (try? fm.contentsOfDirectory(atPath: probe.path)) != nil
}

Dacă folderul ~/Library/Mail nu există, aplicația presupune că accesul este ok (nu putem trage o concluzie). Dacă există dar nu poate fi citit, atunci Full Disk Access lipsește și utilizatorul este informat.

Interfața: listă pe categorii, cu selecție granulară

Interfața este construită în SwiftUI și folosește aceeași identitate vizuală ca ImgConvert: gradient violet-albastru, card-uri cu material nativ macOS, tipografie curată. Fiecare categorie are propriul header cu iconiță, descriere scurtă și toggle pentru selectare în bloc.

Fiecare fișier are propriul toggle, propriul nume, propria cale (cu ~ în loc de calea completă), propria dimensiune și un buton care îl arată în Finder. Dacă un fișier a eșuat la mutare, apare o iconiță roșie cu explicația.

Lista este sortată descrescător după dimensiune, astfel încât fișierele mari să apară primele. Utilizatorul vede imediat unde se duce spațiul și poate decide ce merită păstrat.

Confirmarea înainte de mutare

Butonul „Mută în Trash" nu acționează imediat. Deschide un dialog de confirmare care arată exact câte elemente vor fi mutate și cât spațiu se va elibera. Utilizatorul poate anula sau confirma.

.alert("Muți \(model.selectedCount) elemente în Trash?", isPresented: $confirm) {
    Button("Anulează", role: .cancel) {}
    Button("Mută în Trash", role: .destructive) { model.trashSelected() }
} message: {
    Text("Se vor elibera aproximativ \(formatBytes(model.selectedSize)). Nimic nu se șterge definitiv — poți recupera totul din Trash până îl golești.")
}

Acest pas suplimentar previne mutările accidentale. Chiar dacă utilizatorul a bifat din greșeală un element, are șansa să anuleze înainte ca ceva să se întâmple.

Procesarea pe fundal pentru loturi mari

Mutarea a sute de fișiere în Trash poate dura câteva secunde, mai ales dacă fișierele sunt pe volume mai lente. De aceea, toată operația rulează pe un thread de fundal, cu actualizarea interfeței la final.

Task {
    let outcome = await Task.detached(priority: .userInitiated) {
        Cleaner.trash(toTrash)
    }.value
    // actualizare interfață pe main thread
}

Utilizatorul vede un indicator de progres și un text care spune „Se mută în Trash…". Interfața rămâne responsivă, iar la final apare un mesaj cu rezultatul: cât spațiu s-a eliberat și câte elemente au eșuat, dacă este cazul.

Ce poți face cu CleanMacOS

Aplicația este utilă pentru orice utilizator Mac care vrea să elibereze spațiu fără să șteargă lucruri importante. Este deosebit de utilă pentru dezvoltatori, care acumulează sute de MB sau chiar GB de cache-uri Xcode, npm, pip, yarn sau Gradle.

Poți rula scanarea oricând, fără să modifici nimic. Aplicația doar citește și măsoară. Când ești gata, selectezi ce vrei să muți și confirmi. Nimic nu se șterge definitiv, totul trece prin Trash.

Dacă vrei să vezi aplicația în funcțiune, o poți descărca gratuit de pe seotoolpro.ro/download-apps, împreună cu ImgConvert și alte aplicații pe care le dezvolt.

Istoric versiuni

Versiunea 2.0 — 15 octombrie 2026

  • Secțiune nouă Setări, accesibilă din sidebar (APLICAȚIE) și cu ⌘ ,
  • Temă adaptivă (Sistem / Întunecat / Luminos), cu previzualizare vizuală
  • Fundal animat opțional — aurora poate fi dezactivată pentru un aspect mai simplu
  • Scanare automată la pornire — opțiune nouă, dezactivată implicit
  • Actualizări configurabile — verificare automată activabilă/dezactivabilă, buton „Verifică acum" și card „Update amânat" cu „Arată acum"
  • Modul nou Curățare browsere — detectează 7 browsere și șterge cache-uri, cookie-uri și date conexe
  • Modul nou Dezinstalare — șterge aplicația și fișierele asociate (preferințe, cache, containere, LaunchAgents)
  • Redesign vizual cu efect glassmorphism — carduri translucide, highlight-uri interioare, borduri duble
  • Animații noi — fundal aurora cu 5 blob-uri animate independent, orb de scanare pulsant cu inele rotative, tranziții fluide între pagini
  • Secțiune nouă „APLICAȚIE" în sidebar și mențiune permanentă „100% gratuit · Fără reclame · Fără telemetrie"
  • Meniul aplicației are intrare „Setări..." cu scurtătura ⌘ , iar „About CleanMacOS" afișează versiunea 2.0

Versiunea 1.9 — 9 octombrie 2026

  • Modul extins de diagnostică (CPU, RAM, disc, temperatură SMC, swap, baterie, uptime)
  • Manager aplicații la pornire (Open at Login) cu listare, adăugare și eliminare
  • Iconiță nouă
  • Optimizări la scanarea folderelor Containers

Versiunea 1.8 — 3 octombrie 2026

  • Actualizare automată — aplicația verifică serverul la fiecare lansare
  • Notificare când apare o versiune nouă

Versiunea 1.7 — 28 septembrie 2026

  • Suport macOS Sonoma 14
  • Optimizări de viteză la scanare

Concluzie

CleanMacOS a pornit dintr-o frustrare simplă: Mac-ul meu avea 622 MB de fișiere inutile pe care nu le foloseam de luni de zile. Am construit o aplicație care găsește aceste fișiere, le măsoară, le afișează într-o interfață clară și le mută în Trash cu un singur click.

Aplicația demonstrează că instrumentele mici, bine făcute, pot rezolva probleme reale. Nu are nevoie de inteligență artificială, de cloud sau de abonamente. Are nevoie doar de o problemă clară și de dorința de a o rezolva corect.

Dacă lucrezi pe Mac și vrei să eliberezi spațiu fără să-ți faci griji că ștergi ceva important, încearcă CleanMacOS. Este gratuit, este nativ, este construit cu grijă pentru detalii.

Dacă vrei să explorezi mai multe despre dezvoltarea pentru macOS și instrumente utile, citește articolul nostru despre cum am construit ImgConvert în SwiftUI și descoperă trucuri de terminal macOS Tahoe 2026.

Surse externe:

seotoolpro.ro/download-apps — pagina oficială de descărcare

Apple Developer — documentația oficială SwiftUI

Apple Developer — documentația FileManager.trashItem

Apple Support — ghidul pentru Full Disk Access

Apple Developer — documentația totalFileAllocatedSize

 



Try Pro Calculatoare Inteligente Practice! CLICK HERE

Get MTDb.ro -Filme si Seriale, Trailere, Actori si Stiri din Cinema - CLICK HERE
leave a comment
Please post your comments here.

Comentarii 0

Lasă un comentariu

0 / 2000

Comentariile sunt moderate înainte de publicare.

Se încarcă comentariile…