Download all your children's photos from Transparent Classroom to your local machine. Tracks previously downloaded photos to avoid duplicates, so you can run it repeatedly to grab only new ones.
A native desktop app — no terminal, Node.js, or setup required.
| Platform | Download |
|---|---|
| macOS (Apple Silicon) | TC.Photo.Downloader.dmg (arm64) |
| macOS (Intel) | TC.Photo.Downloader.dmg (x64) |
| Windows (exe) | TC.Photo.Downloader.exe |
| Windows (msi) | TC.Photo.Downloader.msi |
macOS builds are signed with a Developer ID certificate and notarized by Apple. The app opens without Gatekeeper warnings.
- Log in to Transparent Classroom through the in-app browser
- The app auto-detects your school and children
- Choose a download folder
- Hit "Start Download" — photos are organized by child and year
- Previously downloaded photos are skipped automatically
For automation, scheduling, or running on a server without a GUI.
git clone https://github.com/joemccann/transparent-classroom-image-downloader.git
cd transparent-classroom-image-downloader/cli
npm install
cp .env.example .envEdit .env with your school and children info (see Configuration), then:
npm run build
npm run login # opens a browser — sign in to Transparent Classroom
npm start # downloads all photosThat's it. Photos are saved to OUTPUT_DIR/<ChildName>/<year>/.
Copy .env.example to .env and fill in the required values:
# Required
SCHOOL_ID=12345
CHILDREN=Alice:123456,Bob:789012
OUTPUT_DIR=~/Downloads/Photos| Variable | Required | Description |
|---|---|---|
SCHOOL_ID |
Yes | Your school's numeric ID (visible in TC URLs) |
CHILDREN |
Yes | Name:ChildID pairs, comma-separated. Child IDs are in the TC URL when viewing a child's profile. |
OUTPUT_DIR |
Yes | Base directory for downloaded photos. A subfolder is created per child. |
EMAIL_ENABLED |
No | Set to true to receive email notifications |
EMAIL_TO |
No | Recipient email address |
EMAIL_FROM |
No | Sender Gmail address |
SMTP_HOST |
No | SMTP server (default: smtp.gmail.com) |
SMTP_PORT |
No | SMTP port (default: 587) |
SMTP_USER |
No | SMTP username |
SMTP_PASS |
No | Gmail App Password (how to generate) |
- Log in to Transparent Classroom
- School ID: Look at the URL — e.g.,
transparentclassroom.com/s/2521/...→ school ID is2521 - Child ID: Navigate to a child's profile — e.g.,
.../children/322263/...→ child ID is322263
npm run login # authenticate (opens browser)
npm start # download all photosJust npm start for subsequent runs. The tool tracks what's been downloaded in state/download-state.json and only fetches new photos.
| Command | Description |
|---|---|
npm run build |
Compile TypeScript |
npm start |
Run in headless mode |
npm run login |
Interactive login (opens browser) |
npm run dev |
Run via ts-node (no build needed) |
npm test |
Build and run regression tests |
├── cli/ # Headless Node.js scraper (for automation/scheduling)
├── tauri-app/ # Native desktop app (Tauri 2 + React + Rust)
└── .github/ # CI/CD workflows for building releases
MIT