A native macOS screen saver that recreates The Matrix "digital rain" effect using handwritten digits from the MNIST dataset.
https://github.com/user-attachments/assets/7f075083-ae36-46e4-92ab-50a61d03e622
If you're on an Apple Silicon Mac, you can simply download and unzip the pre-built screen saver that's already included in this repository (build/MNISTMatrix.saver.zip).
If you're on an Intel based Mac, or you just want to build it yourself, you can do so with the following commands:
# 1. Clone the repository
git clone https://github.com/nathanrooy/mnist-matrix.git
cd mnist-matrix
# 2. Build and Install (Auto-detects Apple Silicon or Intel)
./build.sh
# Or explicitly target architecture:
./build.sh arm64 # Apple Silicon M1 / M2 / M3 / M4
./build.sh x86_64 # Intel Macs
# 3. Test & Preview in System Settings
open "$HOME/Library/Screen Savers/MNISTMatrix.saver"
All visual parameters are defined at the top of src/MNISTMatrixSaverView.swift:
| Parameter | Type | Default | Description |
|---|---|---|---|
minFallSpeedRowsPerSecond | Double | 6.0 | Minimum fall speed for a rain stream (rows/sec) |
maxFallSpeedRowsPerSecond | Double | 12.0 | Maximum fall speed for a rain stream (rows/sec) |
minDropLengthRows | Int | 8 | Minimum digit tail length of rain streams |
maxDropLengthRows | Int | 36 | Maximum digit tail length of rain streams |
densityRatio | Double | 0.50 | Fraction of screen columns containing active streams (0.3 to 1.0) |
baseDigitSize | CGFloat | 18.0 | Grid cell & digit size in pixels |
digitSwapProbability | Double | 0.50 | Fraction of falling digits that morph/swap (0.0 to 1.0) |
minSwapDelaySeconds | Double | 0.25 | Minimum delay in seconds before a digit swaps |
maxSwapDelaySeconds | Double | 1.25 | Maximum delay in seconds before a digit swaps |
showFPSOverlay | Bool | true | Toggles yellow FPS counter overlay in top-right corner |
The pre-built resources/mnist_atlas.bin asset atlas (7.49 MB) is included in the repository. If however, you want to extract resources/mnist_atlas.bin yourself from the raw MNIST dataset (data/test-00000-of-00001.parquet):
# Requires Python 3 with pyarrow and Pillow
python3 scripts/munge.py
mnist-matrix/
├── README.md # Project documentation and guide
├── build.sh # Pure Swift build script (compiles, signs & installs)
├── data/
│ └── test-00000-of-00001.parquet# 10,000 row raw MNIST Parquet dataset
├── resources/
│ └── mnist_atlas.bin # Pre-generated binary atlas (10,000 28x28 grayscale digits)
├── scripts/
│ └── munge.py # Python script to convert Parquet -> mnist_atlas.bin
└── src/
├── Info.plist # Screen saver bundle property list
├── MNISTAtlas.swift # Memory-mapped binary atlas loader & scaled pixel cache
└── MNISTMatrixSaverView.swift # Subclass of ScreenSaverView & DirectScreenRenderer
swiftc, included with Xcode / Command Line Tools).MIT License. Feel free to use, modify, and distribute!
3 commits
Swift
85.0%
Shell
8.0%
Python
7.0%
A native macOS screen saver that recreates The Matrix "digital rain" effect using handwritten digits from the MNIST dataset.
https://github.com/user-attachments/assets/7f075083-ae36-46e4-92ab-50a61d03e622
If you're on an Apple Silicon Mac, you can simply download and unzip the pre-built screen saver that's already included in this repository (build/MNISTMatrix.saver.zip).
If you're on an Intel based Mac, or you just want to build it yourself, you can do so with the following commands:
# 1. Clone the repository
git clone https://github.com/nathanrooy/mnist-matrix.git
cd mnist-matrix
# 2. Build and Install (Auto-detects Apple Silicon or Intel)
./build.sh
# Or explicitly target architecture:
./build.sh arm64 # Apple Silicon M1 / M2 / M3 / M4
./build.sh x86_64 # Intel Macs
# 3. Test & Preview in System Settings
open "$HOME/Library/Screen Savers/MNISTMatrix.saver"
All visual parameters are defined at the top of src/MNISTMatrixSaverView.swift:
| Parameter | Type | Default | Description |
|---|---|---|---|
minFallSpeedRowsPerSecond | Double | 6.0 | Minimum fall speed for a rain stream (rows/sec) |
maxFallSpeedRowsPerSecond | Double | 12.0 | Maximum fall speed for a rain stream (rows/sec) |
minDropLengthRows | Int | 8 | Minimum digit tail length of rain streams |
maxDropLengthRows | Int | 36 | Maximum digit tail length of rain streams |
densityRatio | Double | 0.50 | Fraction of screen columns containing active streams (0.3 to 1.0) |
baseDigitSize | CGFloat | 18.0 | Grid cell & digit size in pixels |
digitSwapProbability | Double | 0.50 | Fraction of falling digits that morph/swap (0.0 to 1.0) |
minSwapDelaySeconds | Double | 0.25 | Minimum delay in seconds before a digit swaps |
maxSwapDelaySeconds | Double | 1.25 | Maximum delay in seconds before a digit swaps |
showFPSOverlay | Bool | true | Toggles yellow FPS counter overlay in top-right corner |
The pre-built resources/mnist_atlas.bin asset atlas (7.49 MB) is included in the repository. If however, you want to extract resources/mnist_atlas.bin yourself from the raw MNIST dataset (data/test-00000-of-00001.parquet):
# Requires Python 3 with pyarrow and Pillow
python3 scripts/munge.py
mnist-matrix/
├── README.md # Project documentation and guide
├── build.sh # Pure Swift build script (compiles, signs & installs)
├── data/
│ └── test-00000-of-00001.parquet# 10,000 row raw MNIST Parquet dataset
├── resources/
│ └── mnist_atlas.bin # Pre-generated binary atlas (10,000 28x28 grayscale digits)
├── scripts/
│ └── munge.py # Python script to convert Parquet -> mnist_atlas.bin
└── src/
├── Info.plist # Screen saver bundle property list
├── MNISTAtlas.swift # Memory-mapped binary atlas loader & scaled pixel cache
└── MNISTMatrixSaverView.swift # Subclass of ScreenSaverView & DirectScreenRenderer
swiftc, included with Xcode / Command Line Tools).MIT License. Feel free to use, modify, and distribute!
3 commits
Swift
85.0%
Shell
8.0%
Python
7.0%