Posture
Venti posture e tutte le vie di mezzo. Salta in parabola, si appende ai bordi, si arrampica, atterra.
The Black Cat, app per macOS. Open source.
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.
Si muove, ha fame e sonno, pensa ad alta voce, si ricorda di te. E ogni tanto qualcuno viene a trovarlo.
Venti posture e tutte le vie di mezzo. Salta in parabola, si appende ai bordi, si arrampica, atterra.
Questo desktop è mio, tu lo usi e basta.
Li scrive Apple Intelligence sul Mac. Quando non c'è, usa frasi come queste, scritte a mano.
{ "needs": { … } }
Un ragnetto, una foglia, le lucciole. A volte un gatto in smoking col nasone rosso.
Niente immagini e niente video. Il gatto è uno scheletro disegnato da capo a ogni fotogramma.
Cerchi, capsule e triangoli riempiti di nero, con un filo di luce attorno perché un gatto nero si veda anche su una finestra scura.
Bacino, torace, testa e quattro zampe a due segmenti. Si sceglie dove va il piede, e la cinematica inversa piega la zampa per arrivarci.
Undici molle smorzate in fila. Seguono il corpo in ritardo, ondeggiano, si gonfiano quando il gatto si arrabbia.
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.
Con la fotocamera ti riconosce quando torni al Mac e risponde al saluto. Qui segue il puntatore con lo sguardo.
Sente mani che battono, cani, fischi, musica, e capisce «giù», «pappa», «nanna», «bravo». Qui drizza le orecchie a ogni clic.
Caccia gli uccellini e i pesci che passano nei video. Qui arriva una falena.
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.
Nessuna libreria esterna. Questo è il cuore della coda, copiato da TailChain.swift: scorri e ti spiego che cosa fa ogni pezzo.
/// 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.
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.
Oggi parla solo italiano. Servono le stringhe in un String Catalog e le frasi del gatto in inglese, con lo stesso caratteraccio.
Un mantello è una manciata di colori e qualche macchia. Ce ne sono nove: manca, per esempio, il tartarugato.
Il ragnetto, la foglia e le lucciole hanno bisogno di compagnia. Una scenetta è un piccolo copione con un personaggio e una reazione del gatto.
Sono venti, tutte nel rig. Ne mancano altre: lo sbadiglio a bocca spalancata, la ciambella perfetta, la gobba allo specchio.
Più monitor, Stage Manager, Spaces, schermi enormi. Raccontaci dove il gatto si incastra, con un video se puoi.
Una GitHub Action che compili, firmi e notarizzi una release, così chi non programma può installarlo con un doppio clic.
Uno di questi, o una tua idea: aprila come issue, così ne parliamo prima.
Il progetto si genera con XcodeGen, il resto è Xcode.
Piccola, e con un video del gatto se cambia qualcosa che si vede.
gh repo fork andreapianidev/TheBlackCat --clone
cd TheBlackCat
git switch -c mantello-tartarugato
brew install xcodegen
xcodegen generate
open TheBlackCat.xcodeproj
Per ora ci lavora una persona sola. Il prossimo nome qui può essere il tuo.
Sì. È gratuito e open source con licenza MIT: puoi usarlo, studiarlo e modificarlo.
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.
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.
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.
Non ancora. Per ora si compila dal codice su GitHub con Xcode e XcodeGen.
Solo in italiano, per ora: menu, impostazioni, pensieri nel fumetto e parole che riconosce. La traduzione in inglese è uno dei lavori aperti.
Clonalo, compilalo, cambiagli il carattere. Se ne esce un gatto migliore, rimandalo indietro.
andreapianidev/TheBlackCat