Help Center

Guides, camera setup, troubleshooting, and answers to common questions.

🚀

Getting Started

📷

Camera Setup

🍓

Raspberry Pi

⚙️

App Settings

FAQ

📡

Upload API

🚀 Getting started

Create your first time-lapse in under 5 minutes.

1

Sign in

Go to lapseleap.com and click Sign In / Sign Up. You can sign in with Google or create an account with your email. It's free.

2

Allow camera access

When the app opens, your browser will ask for camera permission. Click Allow. You'll see a live preview from your webcam.

3

Choose your settings

Select a camera, resolution, and capture interval. Not sure? Pick the Medium (7s) preset — it works great for sunsets and weather.

4

Start capturing

Hit the Start button. The app will capture a frame at your chosen interval. Watch the frame counter and progress bar as images accumulate.

5

Create your video

When you're done, click Stop, then Create Video or Create GIF. Your time-lapse is processed in the cloud and ready to download in seconds.


📷 Camera setup

Tips for getting the best results from different camera setups.

Built-in webcam

Works out of the box in all browsers. Just allow camera access when prompted. If you have multiple cameras, use the dropdown to select the right one.

USB webcam

Plug in and it should appear in the camera dropdown. If it doesn't appear, click the ↻ refresh button next to the dropdown. On Mac, check System Settings → Privacy & Security → Camera to ensure your browser has permission.

iPhone as remote camera (Continuity Camera)

Apple's Continuity Camera lets you use your iPhone's camera wirelessly from your Mac. Requirements:

Important: Safari is required for Continuity Camera — Chrome and Firefox cannot detect iPhone cameras on macOS.

Troubleshooting: black screen

If the camera appears but shows a black screen:

Troubleshooting: camera not listed

Which browser should I use?

Safari is required for iPhone Continuity Camera. Chrome and Firefox work well for built-in Mac cameras and USB webcams. If you want to use your iPhone as a remote camera, use Safari.


🍓 Raspberry Pi setup

Deploy a Raspberry Pi as a remote capture device — capture time-lapses 24/7 from anywhere with WiFi.

What you need

Step 1: Add a device

Go to the Devices page in the Lapseleap app. Click Add Device, give it a name, and enter your WiFi network name and password.

Step 2: Download the config and image

After creating the device, download two things:

Step 3: Flash the SD card

Use Raspberry Pi Imager or a similar tool to flash the downloaded image onto your SD card. Then copy the lapseleap.json file to the bootfs partition (the FAT32 partition that shows up when you insert the card into your computer).

Step 4: Boot and go

Plug in your USB webcam, insert the SD card, and power on the Pi. It will automatically:

The device will appear as active on the Devices page within a couple of minutes.

Alternative: install on existing Pi OS

If you already have Raspberry Pi OS running, you can install the agent with one command:

curl -sSL https://raw.githubusercontent.com/tiitpaananen/lapseleap/dev/pi-agent/install.sh | sudo bash

Then copy lapseleap.json to /boot/firmware/ and reboot.

Live preview

Click on a device on the Devices page to see a live preview stream from the Pi camera. Frames are streamed in real-time via WebSocket — no cloud storage involved. You can also start/stop capture and change settings remotely.

📡 Using an IP camera (RTSP)

Instead of plugging a camera into the Pi, you can have the Pi pull frames from any RTSP-capable IP camera on the same local network. Useful when you already own a security camera (EZVIZ, Reolink, Hikvision, Dahua, etc.) and just want it to do time-lapse too.

How to set it up:

  1. Make sure the IP camera and the Pi are on the same WiFi/LAN.
  2. Enable RTSP / Local Service in your camera's app. For EZVIZ: open the EZVIZ app → device settings → Local Service Settings → turn on Local Service. Note the verification code printed on the camera sticker.
    Older EZVIZ models (e.g. C3WN / CS-CV310 and other budget / outdoor units) don't show a Local Service toggle in the app — RTSP is always on. Skip this step and use the URL below with username admin and the 6-character verification code from the sticker. On outdoor cameras the sticker is usually on the underside of the camera body or the mounting bracket; it's also on the retail box and the quick-start guide.
  3. Find your camera's LAN IP (router admin page, or the camera's app).
  4. On the Devices page, open your Pi device and set Camera source to IP camera (RTSP). Paste the RTSP URL and click Save source. The Pi picks up the new source on its next heartbeat (~30 s).

RTSP URL examples (replace user, password, IP and path with your camera's values):

# EZVIZ (admin + verification code from sticker) rtsp://admin:VERIFICATION_CODE@192.168.1.50:554/H.264 # EZVIZ older / outdoor models (C3WN, CS-CV310, etc.) rtsp://admin:VERIFICATION_CODE@192.168.1.50:554/Streaming/Channels/101 # substream (lighter, recommended for time-lapse): rtsp://admin:VERIFICATION_CODE@192.168.1.50:554/Streaming/Channels/102 # Hikvision / Dahua main stream rtsp://user:pass@192.168.1.50:554/Streaming/Channels/101 # Reolink main stream rtsp://user:pass@192.168.1.50:554/h264Preview_01_main

The Pi uses TCP transport with a 5-second connection timeout and scales each frame to the configured resolution. Credentials in the URL are redacted from Pi logs.

☀️ Off-grid: solar-powered setup

Want to run your Pi capture station somewhere without mains power? A small solar panel + LiFePO₄ battery + charge controller is enough to keep a Pi capturing 24/7 in most climates. We've put together a complete reference build — system architecture, power budget, full bill of materials, and a wiring diagram.

Troubleshooting


⚙️ App settings guide

Everything you can configure before starting a capture.

🖥️ Resolution

Higher resolution means sharper video but larger file sizes.

OptionPixelsBest for
320×24076,800Quick tests, preview runs, low bandwidth
640×480307,200Standard quality, good balance of size and detail
1280×720 (HD)921,600High quality — the default. Recommended for most use cases
1920×1080 (Full HD)2,073,600Maximum detail. Pro only. Ideal for large-screen playback

🎬 Scene presets

Presets set the capture interval automatically. You can still adjust it manually after selecting a preset.

PresetIntervalBest for
Fast-moving2 secondsClouds, crowds, traffic, busy streets
Medium7 secondsSunsets, sunrises, weather changes
Slow60 secondsConstruction, art projects, cooking
Very slow24 hoursPlant growth, seasonal changes, long projects

⏱️ Capture interval

The time between each captured frame, in seconds. Set any value from 1 second upward. The final video plays at 30 FPS, so 300 images = 10 seconds of video, 1800 images = 1 minute of video.

🎯 Motion detection PRO

When enabled, the camera only captures frames when motion is detected in the scene.

SensitivityThresholdBest for
High1% pixel changeSubtle motion — plants, shadows, slow movement
Medium2% pixel changeGeneral use — people, traffic, weather
Low5% pixel changeLarge motion only — ignore vibrations or flicker

A 5-second cooldown continues capturing after motion stops, preventing abrupt cuts.

📥 Output formats

FormatTypeBest for
MP4 VideoH.264 video fileHigh quality playback, sharing, presentations
Animated GIFGIF image sequenceSocial media, Slack, quick previews

❓ Frequently asked questions

Free users can capture up to 1,800 images per session, producing up to 1 minute of video at 30 FPS. Pro users have unlimited images per session, so your video length is only limited by how long you capture. You can start a new session at any time.
  • MP4 (Video) — Full quality, smaller file size. Best for sharing and viewing.
  • Animated GIF — Loops automatically, works everywhere. Larger file size and lower color depth (256 colors). Best for short, sharable clips.
With a webcam, the browser tab must stay open and active during capture. Closing or navigating away will stop the capture. Keep the tab open and your device awake.

With a Raspberry Pi (Studio plan), capture runs 24/7 headless — no browser needed. Start and stop capture remotely from the web app.
Images are uploaded to a secure cloud server (AWS S3 in EU Ireland) as they're captured. Videos are generated server-side and available for download when processing is complete. Free users' data is stored for 7 days, Pro users for 30 days. You can download or delete your data anytime from the Settings page.
Motion detection is a Pro feature that makes the camera skip frames when nothing is moving. It compares consecutive frames pixel-by-pixel and only saves a frame when enough pixels have changed. A 5-second cooldown continues capturing after motion stops. Especially useful for wildlife, security, or construction captures.
Every frame captured during a session counts as one image. At 30 FPS playback, Free users can create up to 1-minute videos (1,800 images). Pro users have unlimited images per session, so your video length is only limited by how long you capture.
Yes! Pro users can drag-and-drop existing photos onto the upload zone. The chunked upload engine handles thousands of files without freezing your browser. JPEG and PNG formats are supported. Files are sorted by name to maintain order.
Go to Settings and click Manage Subscription. This opens the Paddle customer portal where you can cancel. You keep Pro access until the end of your current billing period. See our Refund Policy for details.
Studio plan users can turn a Raspberry Pi into a dedicated 24/7 time-lapse camera. Flash our Pi OS image, drop in a config file, and power on. The agent auto-detects USB webcams or CSI cameras, captures at your configured interval, and streams a live ~1 fps preview to your browser via WebSocket. Manage start, stop, and settings from the web app — no SSH needed.
Yes. If your camera supports RTSP and is on the same local network as a Lapseleap Pi device, set Camera source to IP camera (RTSP) on the Devices page and paste the camera's RTSP URL (e.g. rtsp://admin:CODE@192.168.1.50:554/H.264). The Pi will pull one frame on every interval. For EZVIZ cameras you need to enable Local Service in the EZVIZ app first; the username is admin and the password is the verification code printed on the camera.

We intentionally use individual image capture rather than continuous video recording. This approach has several advantages:

  • Much lower storage & bandwidth: A day of images at one capture per minute is ~360 MB vs ~21 GB for continuous 1080p video — roughly 60× less.
  • Works on any hardware: Periodic JPEG snapshots work with every USB webcam and CSI camera, with minimal CPU load. Continuous video encoding struggles on lower-end devices like Pi Zero.
  • Resilient to connectivity gaps: Missed frames during a WiFi outage are just a few images. The agent queues up to 1,000 frames locally and uploads them automatically when the connection returns.
  • Longer SD card life: Occasional writes are far gentler on SD cards than continuous video recording.

Tip: To find the right capture speed for your project, experiment with the capture interval during setup. Fast-moving subjects (e.g. cooking, 3D printing) benefit from a shorter interval (2–5 s), while slow changes (e.g. construction, plant growth) work well at 30–60 s or more.

Connect to your Pi via SSH (ssh pi@<IP>) and use these commands:

  • Check agent version: grep AGENT_VERSION /opt/lapseleap/agent/agent.py | head -1
  • View recent logs: tail -50 /opt/lapseleap/agent.log
  • Follow logs live: tail -f /opt/lapseleap/agent.log
  • Service status: sudo systemctl status lapseleap-agent
  • Restart agent: sudo systemctl restart lapseleap-agent
  • Active WiFi: nmcli -t -f NAME,STATE connection show --active
  • WiFi config files: ls -la /etc/NetworkManager/system-connections/lapseleap-wifi*
  • Network check: ping -c 3 google.com
  • WebSocket relay logs: grep 'relay' /opt/lapseleap/agent.log | tail -20
  • Device credentials: cat /opt/lapseleap/credentials.json | python3 -m json.tool

📡 Upload API

Programmatically upload images to Lapseleap from scripts, servers, or IoT devices. Studio plan required.

Authentication

Create an API key in Settings → API Keys. Keys start with llp_ and are shown once at creation.

Pass your key via the X-Api-Key header or Authorization: Bearer llp_... header.

Base URL

https://lapseleap.com/api/v1

Endpoints

MethodPathDescription
POST/uploadGet a presigned POST payload to upload a single image
POST/upload/batchGet presigned POST payloads for up to 100 images
GET/sessionsList your sessions

Upload a single image

Step 1: Request a presigned upload payload

curl -X POST https://lapseleap.com/api/v1/upload \
  -H "X-Api-Key: llp_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"sessionId": "my-timelapse", "contentType": "image/jpeg"}'

Response:

{
  "upload": {
    "method": "POST",
    "url": "https://images07112023.s3.amazonaws.com/",
    "fields": { "key": "users/...", "Content-Type": "image/jpeg", ... }
  },
  "key": "users/.../20260419_120000.jpg",
  "expiresIn": 3600,
  "maxUploadBytes": 10485760
}

Step 2: Upload the image with multipart/form-data POST

curl -X POST "UPLOAD_URL_FROM_STEP_1" \
  -F "key=users/.../20260419_120000.jpg" \
  -F "Content-Type=image/jpeg" \
  -F "x-amz-algorithm=..." \
  -F "x-amz-credential=..." \
  -F "x-amz-date=..." \
  -F "policy=..." \
  -F "x-amz-signature=..." \
  -F "file=@photo.jpg;type=image/jpeg"

Batch upload

Request multiple presigned URLs at once (up to 100):

curl -X POST https://lapseleap.com/api/v1/upload/batch \
  -H "X-Api-Key: llp_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"sessionId": "my-timelapse", "count": 10, "contentType": "image/jpeg"}'

Response:

{
  "uploads": [
    { "upload": { "method": "POST", "url": "https://...", "fields": {...} }, "key": "users/..." },
    ...
  ],
  "count": 10,
  "expiresIn": 3600
}

Python example

import requests

API_KEY = "llp_your_key_here"
BASE    = "https://lapseleap.com/api/v1"
HEADERS = {"X-Api-Key": API_KEY}

# 1. Get upload payload
resp = requests.post(f"{BASE}/upload", headers=HEADERS, json={
    "sessionId": "garden-cam",
    "contentType": "image/jpeg"
})
payload = resp.json()["upload"]

# 2. Upload image
with open("photo.jpg", "rb") as f:
  form = dict(payload["fields"])
  form["Content-Type"] = "image/jpeg"
  requests.post(payload["url"], data=form, files={
    "file": ("photo.jpg", f, "image/jpeg")
  })

Limits & notes

Still need help?

Can't find what you're looking for? Send us an email and we'll get back to you.

info@lapseleap.com