The Black Cat, app per macOS. Open source.

Un gatto nero che vive sul tuo Mac.

Cammina sopra il Dock, salta sulle finestre delle altre app, si arrampica sui loro fianchi e ci si addormenta sopra. Se chiudi la finestra su cui dorme, cade.

Il gatto di questa pagina è disegnato dallo stesso codice dell'app. Scorri e lo vedrai saltare sulle finestre, tienigli sopra il puntatore e fa le fusa, cliccalo e soffia.

Fa il gatto, sul serio.

Si muove, ha fame e sonno, pensa ad alta voce, si ricorda di te. E ogni tanto qualcuno viene a trovarlo.

Posture

Seduto
Pagnotta
Dorme
Si lava
Si stira
Soffia
Pancia all'aria
Impasta

Venti posture e tutte le vie di mezzo. Salta in parabola, si appende ai bordi, si arrampica, atterra.

Bisogni

Energia
Fame
Noia
Solitudine

Pensieri

Questo desktop è mio, tu lo usi e basta.

Li scrive Apple Intelligence sul Mac. Quando non c'è, usa frasi come queste, scritte a mano.

cat.json

{ "needs": { … } }

Ospiti

Un ragnetto, una foglia, le lucciole. A volte un gatto in smoking col nasone rosso.

Sotto il pelo.

Niente immagini e niente video. Il gatto è uno scheletro disegnato da capo a ogni fotogramma.

  1. La pelliccia

    Cerchi, capsule e triangoli riempiti di nero, con un filo di luce attorno perché un gatto nero si veda anche su una finestra scura.

  2. Lo scheletro

    Bacino, torace, testa e quattro zampe a due segmenti. Si sceglie dove va il piede, e la cinematica inversa piega la zampa per arrivarci.

  3. La coda

    Undici molle smorzate in fila. Seguono il corpo in ritardo, ondeggiano, si gonfiano quando il gatto si arrabbia.

I sensi, solo se vuoi.

Nell'app, di base, il gatto conosce solo le finestre: il resto si accende uno per uno dalle impostazioni. Qui puoi provarli sul gatto della pagina.

  • Vista

    Con la fotocamera ti riconosce quando torni al Mac e risponde al saluto. Qui segue il puntatore con lo sguardo.

  • Udito

    Sente mani che battono, cani, fischi, musica, e capisce «giù», «pappa», «nanna», «bravo». Qui drizza le orecchie a ogni clic.

  • Occhi sullo schermo

    Caccia gli uccellini e i pesci che passano nei video. Qui arriva una falena.

  • Il Mac e l'ora

    Sa che ore sono, se il Mac scotta, se la batteria finisce, che tempo fa. Qui segue il ritmo del giorno.

Fotocamera e microfono non restano mai accesi: si aprono per pochi secondi quando torni al Mac o quando clicchi il gatto. Quello che vede e sente resta sul Mac.

L'unica eccezione è Agnes, un modello nel cloud che puoi scegliere al posto di Apple Intelligence: solo allora la situazione da cui nasce un pensiero esce dal Mac.

Swift, e nient'altro.

Nessuna libreria esterna. Questo è il cuore della coda, copiato da TailChain.swift: scorri e ti spiego che cosa fa ogni pezzo.

TheBlackCat Compilato

/// The tail as a chain of damped springs. Each segment chases its target angle
/// and is pushed around by the body's acceleration, so it lags, swings and settles.
final class TailChain {
    let count = 11
    let segment: CGFloat = 4.1
    private var angles: [CGFloat]
    private var speeds: [CGFloat]
    private var time: CGFloat = 0

    private func target(_ i: Int, _ s: TailStyle) -> CGFloat {
        let f = CGFloat(i + 1) / CGFloat(count)
        return s.angle + s.curl * pow(f, 1.3)
            + s.waveAmp * sin(time * s.waveFreq * 2 * .pi - CGFloat(i) * 0.55) * f
    }

    /// - Parameter accel: the body's acceleration in rig space, points/s².
    func step(_ dt: CGFloat, root: CGPoint, style s: TailStyle, accel: CGVector, groundY: CGFloat?) -> [CGPoint] {
        let dt = min(dt, 1.0 / 30)
        time += dt
        let k = s.stiffness
        let damping = 2 * k.squareRoot() * 0.6
        let sub = 2
        let h = dt / CGFloat(sub)
        for _ in 0..<sub {
            for i in 0..<count {
                let f = CGFloat(i + 1) / CGFloat(count)
                let a = angles[i]
                let push = (-accel.dy * cos(a) + accel.dx * sin(a)) * 0.012 * f
                let acc = k * (target(i, s) - a) - damping * speeds[i] + push
                speeds[i] += acc * h
                angles[i] += speeds[i] * h
            }
        }
        return points(root: root, groundY: groundY)
    }
}

Ogni segmento ha un angolo che vuole raggiungere: la posa della coda più un'onda che la percorre dalla base alla punta.

Anteprima

Muovi il puntatore qui sopra.

Il gatto cerca compagnia.

The Black Cat è open source e cerchiamo contributor. Non serve essere esperti di Swift: c'è lavoro per chi scrive codice, per chi traduce, per chi disegna e per chi ha un Mac diverso dal nostro.

  • Insegnargli l'inglese

    Oggi parla solo italiano. Servono le stringhe in un String Catalog e le frasi del gatto in inglese, con lo stesso caratteraccio.

    per iniziaretraduzioniSources/Brain/ThoughtText.swift

  • Un mantello nuovo

    Un mantello è una manciata di colori e qualche macchia. Ce ne sono nove: manca, per esempio, il tartarugato.

    per iniziaregraficaShared/Rig/CatCoat.swift

  • Un ospite nuovo

    Il ragnetto, la foglia e le lucciole hanno bisogno di compagnia. Una scenetta è un piccolo copione con un personaggio e una reazione del gatto.

    animazioneSources/Scenes

  • Una postura in più

    Sono venti, tutte nel rig. Ne mancano altre: lo sbadiglio a bocca spalancata, la ciambella perfetta, la gobba allo specchio.

    animazionerigShared/Rig/CatPose.swift

  • Provarlo su Mac diversi

    Più monitor, Stage Manager, Spaces, schermi enormi. Raccontaci dove il gatto si incastra, con un video se puoi.

    per iniziarecollaudoIssues

  • Scaricarlo senza Xcode

    Una GitHub Action che compili, firmi e notarizzi una release, così chi non programma può installarlo con un doppio clic.

    build.github/workflows

  1. Scegli un lavoro

    Uno di questi, o una tua idea: aprila come issue, così ne parliamo prima.

  2. Fai un fork e un ramo

    Il progetto si genera con XcodeGen, il resto è Xcode.

  3. Apri una pull request

    Piccola, e con un video del gatto se cambia qualcosa che si vede.

Terminale
gh repo fork andreapianidev/TheBlackCat --clone
cd TheBlackCat
git switch -c mantello-tartarugato
brew install xcodegen
xcodegen generate
open TheBlackCat.xcodeproj
AP tu?

Per ora ci lavora una persona sola. Il prossimo nome qui può essere il tuo.

Domande.

The Black Cat è gratis?

Sì. È gratuito e open source con licenza MIT: puoi usarlo, studiarlo e modificarlo.

Come posso contribuire?

Scegli un lavoro dalla lista o proponine uno aprendo una issue su GitHub, fai un fork, lavora su un ramo e apri una pull request. Servono anche traduzioni, mantelli nuovi, scenette e prove su Mac diversi.

Su quali Mac funziona?

Serve macOS 26 o successivo. I pensieri scritti da Apple Intelligence richiedono un Mac che la supporta; senza, il gatto usa frasi scritte a mano e fa tutto il resto allo stesso modo.

Devo dare dei permessi per farlo camminare sulle finestre?

No. Legge solo la posizione e la misura delle finestre aperte, cosa che macOS concede senza permessi. Fotocamera, microfono, registrazione dello schermo e accessibilità servono solo se accendi i sensi dalle impostazioni.

È sull'App Store?

Non ancora. Per ora si compila dal codice su GitHub con Xcode e XcodeGen.

In che lingua parla?

Solo in italiano, per ora: menu, impostazioni, pensieri nel fumetto e parole che riconosce. La traduzione in inglese è uno dei lavori aperti.

Il codice è tutto lì.

Clonalo, compilalo, cambiagli il carattere. Se ne esce un gatto migliore, rimandalo indietro.

andreapianidev/TheBlackCat