
Security News
Axios Maintainer Confirms Social Engineering Attack Behind npm Compromise
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.
Capture daily snapshots from UniFi Protect camera and create time-lapse videos
Automated time-lapse generator for UniFi Protect cameras
Captures daily snapshots at your chosen time and creates beautiful time-lapse videos showing changes over days, months, or years.
Watch your lawn, garden, construction project, or any outdoor space transform over time with automatically generated time-lapse videos.
▶️ Watch the demo on YouTube - 109 days of lawn evolution captured with 24fps motion interpolation
brew install ffmpeg on macOS, apt install ffmpeg on Linux)No installation needed! Just run:
npx lawn-lapse
That's it! The first time you run it, you'll be guided through an interactive setup that will:
Want to install it? You can optionally install globally:
npm install -g lawn-lapse
lawn # Now you can just type "lawn"!
For developers: Clone the repo and run npm install && npm start
lawn [command]
When run without arguments:
| Command | Description |
|---|---|
lawn | Run capture (auto-setup if first time) |
lawn status | Show configuration and statistics |
lawn cron | Set up or update automated daily captures |
lawn version | Show version number |
lawn help | Display help information |
Add -v or --verbose flag for detailed output:
lawn -v # Shows ffmpeg output and detailed logging
On first run, lawn will guide you through:
UniFi Protect Connection
Camera Selection
Snapshot Settings
./snapshots/front-yard/)Automation Setup
Settings are stored in lawn.config.json:
{
"version": 2,
"unifi": {
"host": "192.168.1.1",
"username": "admin",
"password": "your-password"
},
"schedule": {
"timezone": "America/Los_Angeles",
"mode": "fixed-time",
"fixedTimes": ["12:00"]
},
"cameras": [
{
"id": "abc123",
"name": "Front Yard",
"snapshotDir": "./snapshots/front-yard",
"timelapseDir": "./timelapses/front-yard",
"video": { "fps": 24, "quality": 1, "interpolate": true }
},
{
"id": "def456",
"name": "Back Yard",
"snapshotDir": "./snapshots/back-yard",
"timelapseDir": "./timelapses/back-yard",
"video": { "fps": 24, "quality": 1, "interpolate": true }
}
]
}
⚠️ Security Note: Keep
lawn.config.jsonsecure and never commit it to version control
[n/total] progress for each snapshotlawn-lapse/
├── snapshots/ # Per-camera snapshot directories
│ ├── front-yard/
│ │ ├── 2024-01-01_1200.jpg
│ │ ├── 2024-01-02_1200.jpg
│ │ └── ...
│ └── back-yard/
│ ├── 2024-01-01_1200.jpg
│ └── ...
├── timelapses/ # Per-camera timelapse directories
│ ├── front-yard/
│ │ └── timelapse_12h00_2024-01-01_to_2024-03-15.mp4
│ └── back-yard/
│ └── timelapse_12h00_2024-01-01_to_2024-03-15.mp4
├── lawn.config.json # Project configuration
└── logs/lawn-lapse.log # Cron job logs
lawn status
Shows:
🎥 Lawn Lapse Status Report
============================================================
📷 Cameras (2 configured):
============================================================
📹 Front Yard (abc123)
------------------------------------------------------------
Snapshots: ./snapshots/front-yard
Timelapses: ./timelapses/front-yard
📸 Snapshots: 45 at 12:00
Range: 2024-01-01 to 2024-02-14
✓ No gaps
🎬 Time-lapses: 1 video(s)
Latest: timelapse_12h00_2024-01-01_to_2024-02-14.mp4 (8.3MB)
Covers: 45 days (2024-01-01 to 2024-02-14)
📹 Back Yard (def456)
------------------------------------------------------------
Snapshots: ./snapshots/back-yard
Timelapses: ./timelapses/back-yard
📸 Snapshots: 42 at 12:00
Range: 2024-01-04 to 2024-02-14
✓ No gaps
🎬 Time-lapses: 1 video(s)
Latest: timelapse_12h00_2024-01-04_to_2024-02-14.mp4 (7.1MB)
Covers: 42 days (2024-01-04 to 2024-02-14)
⏰ Cron Job:
✓ Active: Daily at 12:00
🔐 Authentication:
✓ Credentials configured
Username: admin
============================================================
📊 Summary:
✓ System operational: 2 camera(s), 87 total snapshot(s), 2 time-lapse(s)
| Problem | Solution |
|---|---|
| "No cameras found" | Ensure UniFi Protect is accessible and user has admin privileges |
| "Authentication failed" | Check username/password, ensure 2FA is disabled for API access |
| Timeout errors | Reduce video duration or check network connectivity |
| Missing snapshots | Verify camera was online and recording at capture time |
| Cron not running | Check cron service is enabled: sudo launchctl load -w /System/Library/LaunchDaemons/com.vix.cron.plist |
Run with verbose flag for detailed debugging:
lawn -v
Force an immediate capture regardless of schedule:
npm exec lawn
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
# Clone repository
git clone https://github.com/dweekly/lawn-lapse.git
cd lawn-lapse
# Install dependencies
npm install
# Run in development
node lawn-lapse.js -v
# Format code
npm run format
# Lint code
npm run lint
The project exports several key functions for programmatic use:
import { runSetup, runCapture } from "./lawn-lapse.js";
// Run interactive setup
await runSetup();
// Capture snapshots and generate time-lapse
await runCapture();
See API.md for detailed documentation.
lawn.config.jsonlawn.config.json to version controlMIT License - see LICENSE file for details
Made with ❤️ for the UniFi Protect community
FAQs
Capture daily snapshots from UniFi Protect camera and create time-lapse videos
We found that lawn-lapse demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.