Open source · MIT · Python + ffmpeg

Your Tapo camera, recorded on motion, kept in your own storage.

tapo-uploader is a self-hosted web app that records a TP-Link Tapo camera only when it detects motion and keeps the footage wherever you choose: YouTube, OneDrive, Nextcloud, any rclone cloud or the disk. One page to watch everything, whichever storage it lives in. No cloud subscription, no firmware hacking.

Read the guide View on GitHub

Tested on the Tapo C200 · Guida in italiano

How it works

The camera can't upload by itself, so a small always-on program does it from outside. The camera is never modified.

Camera

Streams over RTSP and announces motion through ONVIF events.

Motion

Keeps a short ring buffer: 30 s before the trigger, 5 min after.

Store

Once a day, the clips become one video in the storage you chose.

Playlist

One playlist or folder per day, event times as chapters. Files are deleted.

Everything you need, nothing you don't

Motion-triggered

Pre-roll and post-roll are configurable. Late motion extends the window. Person detection counts too.

Private by default

Videos stay in storage you own: private on YouTube, in your OneDrive or Nextcloud, or on your own disk. Nothing is public.

No re-encoding

ffmpeg -c copy keeps the CPU near zero, so a Raspberry Pi is plenty.

Frees the disk

Each file is deleted right after a successful upload. A few GB of space are enough.

Resilient

Restarts ffmpeg when the stream drops, retries uploads, respects storage limits such as the YouTube quota, and never logs your camera password.

Two modes

Motion mode uploads one video a day. Continuous mode records 6-hour segments.

Watch before it is uploaded

Clips still waiting for the daily upload show on your page, marked Not uploaded yet, and play right there.

Change storage, lose nothing

Switch from YouTube to OneDrive and the old videos stay on your page. Every video is marked with where it lives.

Ready-made image

A Docker image is published for you on every release (amd64 and arm64): pull it, no build on your server.

New · optional

One server, a few friends

Turn on multi-account mode and several trusted people share the same server. Everyone links their own camera, chooses their own storage, and sees only their own videos. Leave it off and nothing changes.

Everyone gets a page

Camera status, last motion, last upload and and their videos from every storage they use, each marked with where it lives, in one place.

Their own storage

Each person picks their own YouTube channel (private videos), their own OneDrive or their own WebDAV, unless you choose a storage you run for everyone.

Sign in your way

Local accounts, or Nextcloud: its groups become roles, so administrators and users come from the groups you already have.

A guide for the router

Each friend gets step-by-step instructions, or a ready-made prompt for an AI assistant. Ports are opened only for the server's IP.

An admin page

Users, camera status and the day's YouTube quota at a glance. Deactivate someone and their recorder stops at once.

Encrypted and isolated

Passwords and tokens are stored encrypted. Camera addresses are checked so nobody can use the server to reach its own network.

If you use YouTube, one Google project's YouTube quota serves about 5 or 6 people at one upload a day; the guide explains how to go beyond that. Read the multi-account guide.

Your choice

Choose where the recordings go

Pick where the recordings live: YouTube, your own OneDrive, Nextcloud, any cloud or the disk. Use one, or change your mind whenever you like. Step-by-step guide to set each one up.

YouTube

Private videos on your own channel, one playlist per day.

OneDrive

Each person connects their own with their own free Microsoft app. It only sees its own folder, never the rest of your files.

WebDAV

Nextcloud, ownCloud, Synology and anything else that speaks WebDAV.

rclone

Mega, S3-compatible storage, Dropbox, Google Drive and dozens more, set by the server administrator (Mega not tested by the author).

The server's disk

Keep the videos on the machine that runs it, no cloud needed, with optional rotation: delete after N days, a space limit per person and a warning when the disk runs low. Clouds are never touched.

Switch any time

Earlier destinations stay in your list and their videos stay on your page, each marked with where it is. Removing one from the list deletes nothing.

With several accounts the server picks the default and each person may use their own YouTube, OneDrive or WebDAV where you allow it. Every video has two buttons: Watch here plays it on the page (not for private YouTube videos, which YouTube refuses to embed), Open the video goes to where it lives. How to set up each storage · Read how it works.

Run it where you like

The program must stay on 24/7 and reach the camera. The README compares the options honestly, including what was and wasn't tested.

Your own PC

Windows, macOS or Linux, if it stays on. Same network as the camera, nothing exposed. Install guide.

Raspberry Pi / mini PC

At home, on the LAN. Nothing exposed. Recommended.

A VPS

A few dollars a month. The setup used and tested by the author.

Docker

A ready-made image on GitHub Container Registry (amd64 and arm64), or build the included Dockerfile.

Render free tier

Possible, with limits (ephemeral disk, shared IPs). Tested up to startup only.

Quick start

You need Python 3.10+, ffmpeg, the camera account from the Tapo app and a place for the videos: a YouTube channel (it needs a free Google Cloud project), a OneDrive, a Nextcloud, or just your disk. The full guide covers every step, including the router.

$ git clone https://github.com/LuigiElleBalotta/tapo-uploader.git
$ cd tapo-uploader && python -m venv .venv && . .venv/bin/activate
$ pip install -r requirements.txt
$ cp .env.example .env              # camera user, password, address
$ python tapo_uploader.py check       # does the camera answer?
$ python tapo_uploader.py auth        # Google login, once
$ python tapo_motion.py run           # record on motion, upload once a day

Open the full guide

Questions

Can a Tapo C200 send its videos to my own storage?

Not by itself. This project adds it from outside: it reads the camera's RTSP stream, records around motion and saves the result where you choose (YouTube through its official API, OneDrive, Nextcloud, any rclone cloud or a disk).

Do I need to root or flash the camera?

No. The stock firmware already offers RTSP and ONVIF once you create the Camera Account in the Tapo app.

Will the videos be public?

No. On YouTube they are uploaded as private and only your Google account can see them; on WebDAV, rclone or a folder they sit where only you (and the server's administrator) can read them.

Where can the videos go?

Yes (setup guide): your own OneDrive, WebDAV (Nextcloud and similar), a local folder, or anything rclone supports, such as Mega or S3 storage.

If I change where videos go, do I lose the old ones?

No. The earlier destination stays in your list and its videos stay on your page, each marked with its source. They are never moved or deleted.

Can several people share one server?

Yes, with the optional multi-account mode: each person links their own camera, chooses their own storage and sees only their own videos.

Can I use my own computer?

Yes, as long as it stays on, awake and on the same network as the camera. Windows, macOS and Linux all work. Step-by-step install guide.

Is it a replacement for a cloud plan?

It replaces the storage part with storage you own. It does not replace the Tapo app's cloud timeline.

Videos go only where the person who signs in chose: their own YouTube channel by default, or their own OneDrive or cloud. The software is self-hosted and sends nothing to the author. Read the privacy policy.