Privacy Policy

Effective Date: May 16, 2026

The short version

Project Kestrel is built to work without sending your photos or your personal data anywhere. The desktop app analyzes your photos on your own computer, and unless you choose otherwise, that is where they stay.

We collect a small amount of anonymous usage data to keep the app working and to know if it's crashing. We use a randomly-generated machine identifier — not your hardware serial, not your name, not your email — so we can count active users without knowing who they are.

If you choose to use Perch (our photo-sharing site) or Cloud Compute (our optional paid GPU service), then we do collect more, because we have to: we need an account so you can sign in, and we need to receive your photos so we can host or process them. Those services are opt-in. You do not need to create an account to use the desktop app, and the desktop app will never silently upload your photos to either of them.

This document explains exactly what we collect, exactly what we don't, and exactly how long we keep it.

1. Who we are

Project Kestrel is a free, open-source desktop application licensed under AGPLv3. It is built and operated by Project Kestrel LLC ("we", "us"). The desktop app's source code is public. The cloud services (Perch and Cloud Compute) are operated by us as hosted services and are not themselves open-source at this time.

For any privacy-related question or request, contact us at support@projectkestrel.org.

2. The three components, and which one this section applies to

Project Kestrel has three parts. Each one has different privacy implications, so we describe them separately throughout this policy.

A Project Kestrel account is required to use Perch or Cloud Compute. It is not required to use the desktop app.

3. What we collect — Desktop app

The desktop app is the most privacy-sensitive component because it has direct access to your photo library. Here is everything it sends to us.

Always sent (not optional)

When the app starts up and once per day while running, the app sends a small ping to api.projectkestrel.org containing:

When an analysis run completes, the app sends:

That is the entirety of the non-optional telemetry. We do not see filenames, folder paths, image content, EXIF data, GPS coordinates, your IP-bound identity, or any species/quality results from the analysis.

Opt-in (off by default unless you explicitly turn it on)

If you turn on "detailed analytics" in settings, the app additionally sends:

Still no filenames. Still no image content.

Crash reports (default-on, but explained)

If the app crashes, by default it sends a crash report containing:

Internal log files include the filenames and folder paths you analyzed. We keep this on purpose: most crashes are file-format-specific, and the library names in the stack trace (e.g. Python\packages\tensorflow\...) are exactly what we need to identify and fix the bug.

We do redact your username from paths before transmission. A path like C:\Users\sanjaysoni\photos\trip.CR3 becomes C:\Users\<user>\photos\trip.CR3. So we can see the file structure without seeing who you are at the OS level.

You can disable crash reporting entirely in settings. You can also choose to attach the last three runtime sessions' logs when you submit feedback by ticking the "include recent analysis logs" box — that box is opt-in per-submission and is off by default.

Things the desktop app NEVER collects

4. What we collect — Project Kestrel account

You only have an account if you signed up. Sign-up happens when you choose to use Perch or Cloud Compute, never silently.

We use Clerk as our identity provider. Clerk handles sign-up, password storage, OAuth (Google, etc.), and session tokens. Information you give Clerk:

We mirror a small subset of your Clerk profile into our own database so our services can show your username and avatar without calling Clerk on every request:

This mirror is refreshed lazily, on demand. When an authenticated request arrives and the cached row is older than 7 days, we re-fetch the current values from Clerk before serving the request. If you've been inactive longer than that, the mirror can be older than 7 days — the refresh fires on your next request, not on a schedule.

We also keep a short username history (so people who shared with @you last week don't get confused), capped at 3 username changes per 30 days.

Beyond what Clerk owns, we also store your profile visibility preference — a setting you control from your account settings that determines whether other Perch users can see your profile. The default is not visible.

If you subscribe to Cloud Compute, we additionally store:

5. What we collect — Perch

Perch only stores data when you take an explicit upload action.

For each "perch" (a shared photo set) you create, we store in our database:

For each photo asset within a perch, we store:

Thumbnails are pre-resized to 1200 pixels by the desktop pipeline before upload, and EXIF metadata is stripped during that resize, so GPS coordinates and camera metadata do not travel with thumbnails. Full-resolution exports do retain their EXIF unless you've stripped it on your end.

Default visibility for a new perch is "draft" (private) — visible only to you. You have to actively change it before anyone else can see it.

Deletion: you can delete any perch at any time, which removes its database rows and the actual images from our storage. Deleting your account deletes all your perches.

6. What we collect — Cloud Compute

Cloud Compute only stores data when you explicitly submit a job.

In our database, per job, we store:

In our storage, we keep:

Modal.com is our sub-processor for the actual GPU work. When you submit a job, your images are made available to a Modal container, which runs our analysis code and returns the results. Modal sees the image contents during processing, and the container — along with all images on it — is deleted when the job is done.

7. Image lifecycle in Cloud Compute

We deliberately added 3 layers of safeguards to ensure your photos are deleted as soon as we can.

Source images are deleted as soon as the analysis pack is returned. The three layers:

  1. Primary deletion — On successful pack return, the worker hard-deletes every source image from our storage.
  2. Failure sweep — If a job fails (Modal crash, network drop, container died), an automatic cleanup cron deletes every image belonging to that job within 10 minutes.
  3. Storage-provider lifecycle fallback — We set up explicit policy controls within our storage provider, Cloudflare, so that even if these two layers fail, images expire and are deleted after 24 hours.

Result packs are kept for 30 days. A 30-day expiration policy is set on the analysis result files. This gives you time to download your results; after that you'd need to re-run the job. Database rows describing the job (image count, status, timestamps — not image content or analysis results) may persist longer for usage analytics, but the image data itself is gone.

8. Kestrel is local-first

The desktop app is fully functional with no account, no internet, and no cloud services. You can install it, analyze your entire library, and never touch Perch, Cloud Compute, or a Project Kestrel account. If that is how you want to use Kestrel, nothing on this page other than the desktop-app telemetry section above applies to you.

9. Cookies and similar technologies

The marketing site at projectkestrel.org and the apps myaccount.projectkestrel.org and perch.projectkestrel.org use:

The desktop app does not use cookies.

10. Third parties who process data on our behalf

We do not sell your data, and we do not share it with anyone other than the processors above and as required by law.

11. Your rights

You can:

If you are in the EU/UK, you have additional rights under the GDPR (access, rectification, erasure, restriction, portability, objection, and the right to lodge a complaint with your supervisory authority). Contact support@projectkestrel.org to exercise them.

12. Children

Project Kestrel is not directed at children. You must be at least 18 years old to create an account. If you believe a child has created an account, contact support@projectkestrel.org and we will remove it.

13. Changes to this policy

When we change this policy, we update the Effective Date at the top and at legal.json. If you have an account, we will require you to review and accept the new policy before you can perform a new upload to Perch or submit a new Cloud Compute job. You will not be locked out of viewing or deleting data you already have.

14. Contact

support@projectkestrel.org